none
Llamar a un stored procedure desde otro RRS feed

  • Pregunta

  • Buenos días a todos

    tengo un storedprocedure donde haré unos reportes de ventas x producto en tal año específico o mes

    lo que quiero es reutilizar un stored procedure que tenía antes que buscaba por filtro los productos

    lo estoy implementando así:

    create procedure pruebadereporteventas
    @proddesc varchar(200),
    @numcantidad decimal,
    @numimport decimal
    as
    select PROD_DESC, NUMCANTIDAD,NUMIMPORTE from VENTAS_DETALLE 
    vd inner join PRODUCTO p on vd.ID_PRODUCTO = p.ID_PRODUCTO
    where PROD_DESC( acá quiero el stored procedure )

    será posible esto? o algo parecido?

    saludos

    jueves, 2 de agosto de 2012 15:47

Respuestas

  • Hola.

    Yo, por el contrario, no te recomiendo reutilizar el mismo procedimiento, que ya es bastante precario para el rendimiento (todos estos buscadores genéricos, con decenas de parámetros opcionales lo son, y más aún implementados así). La alternativa de recuperar más datos (a una tabla temporal encima) para luego tomar unos pocos puede resultar sencillo de implementar, pero recuperas más datos de los que necesitas, los tienes que escribir para luego quedarte con unos pocos. En resumen, si necesitas un campo de una tabla, recuperar 15 pasando por numerosas tablas no tiene sentido. 

    Crea un nuevo procedimiento que se ajuste a tus necesidades, que use las tablas que requieras (no parece que sean todas, sólo una de ellas), filtradas como requieras, agrupadas como requieras en tu caso actual. Si tienes dificultades para hacerlo, puedes consultarnos, seguramente podamos ayudarte.

    Desconozco qué ventaja te aporta reutilizar el código de ese procedimiento.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 3 de agosto de 2012 7:21
    Moderador

Todas las respuestas

  • Buenos días a todos

    tengo un storedprocedure donde haré unos reportes de ventas x producto en tal año específico o mes

    lo que quiero es reutilizar un stored procedure que tenía antes que buscaba por filtro los productos

    lo estoy implementando así:

    create procedure pruebadereporteventas
    @proddesc varchar(200),
    @numcantidad decimal,
    @numimport decimal
    as
    select PROD_DESC, NUMCANTIDAD,NUMIMPORTE from VENTAS_DETALLE 
    vd inner join PRODUCTO p on vd.ID_PRODUCTO = p.ID_PRODUCTO
    where PROD_DESC( acá quiero el stored procedure )

    será posible esto? o algo parecido?

    saludos

    jueves, 2 de agosto de 2012 15:48
  • where PROD_DESC( acá quiero el stored procedure )

    el tema es que no creo que puedas poner un procesure en el where del otro

    si puedes usar el EXEC

    para ejecutar, pero necesitas asignar el resultado en algun medio

    quizas

    DECLARA param As int

    EXEC NombreProce param

    indicando que el parametreo es de salida

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 2 de agosto de 2012 15:54
  • Hola JouseHunker,

    Lo que puede usar ahi son funciones de SQL Server.

    sdls.


    Juan Carlos Cardona, Santa Cruz-Bolivia

    jueves, 2 de agosto de 2012 16:02
  • Hola

    No te entendí acerca de parámetro de salida, te refieres a output? con tu consejo lo tengo implementado así:

    create procedure pruebadereporteventas
    @proddesc varchar(200),
    @numcantidad decimal,
    @numimport decimal,
    @y datetime
    as
    declare @param as int
    exec usp_buscarPresentacionxFiltro @param
    select PROD_DESC = @proddesc ,ANO, NUMCANTIDAD = @numcantidad,
    NUMIMPORTE = @numimport from VENTAS_DETALLE 
    vd inner join PRODUCTO p on vd.ID_PRODUCTO = p.ID_PRODUCTO
    where CODPRODUCTO = @param and ANO = @y


    saludos

    jueves, 2 de agosto de 2012 16:06
  • te refieres a output?

    exacto

    con tu consejo lo tengo implementado así:

    si viene por ese lado lo que planteo, aunque valida en la doc del EXEC como defines el param pero que recibe el valor de salida

    asi despues usas esa variable en el select

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 2 de agosto de 2012 16:18
  • Hola

    a qué te refieres con doc? es documentación? he escuchado sobre los parámetros de salida pero no sé para qué se usan. cuando ejecuto ese procedure me bota esto: 

    y está bien complicado, quieren que utilize mi procedure de búsqueda de productos por filtros para hacer un reporte de ventas por año y mes. Este procedure guarda como 20 datos 

    Saludos

    jueves, 2 de agosto de 2012 16:44
  • a qué te refieres con doc? es documentación?

    si doc = documentacion

    he escuchado sobre los parámetros de salida pero no sé para qué se usan.

    como el nombre lo indica para poder recibir informacion de respuesta de un proceso, o procedure en este caso

    y está bien complicado, quieren que utilize mi procedure de búsqueda de productos por filtros para hacer un reporte de ventas por año y mes. Este procedure guarda como 20 datos

    ojo que el parametro retornaria un dato simple, si hay vas quizas debas usar cursores


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 2 de agosto de 2012 16:54
  • A ver retomemos,

    el output siempre me retornará un datasimple, por ejemplo tengo un procedure que me guarda 3 datos, el output solo me devolvería 1, pero cómo identifico ese dato simple?

    alter procedure pruebadereporteventas
    @y datetime,
    @param varchar(50) output
    as
    exec usp_buscarProductoxFiltros @param
    select P.ID_PRODUCTO,CODPRODUCTO = @param ,PROD_DESC,ANO, NUMCANTIDAD ,
    NUMIMPORTE  from VENTAS_DETALLE 
    vd inner join PRODUCTO p on vd.ID_PRODUCTO = p.ID_PRODUCTO
    where ANO = @y

    Cuando ejecuto esto solo se ejecuta el procedure pero no el select, ni siquiera los campos, es como si lo estuviera obviando

    saludos

    jueves, 2 de agosto de 2012 16:59
  • Como sugiere Grillingo, alli puedes usar una funcion. Pero te sugeriria que empezaras por analizar que es lo que necesitas hacer. El codigo del stored procedure que quieres usar es tan complejo que justifica una solucion asi o se trata de una consulta lo suficientemente simple para optimizar el rendimiento?

    Saludos,

    Monica


    This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" and "Vote as Helpful" on posts that help you. This can be beneficial to other community members reading the thread.

    jueves, 2 de agosto de 2012 17:19
  • Hola mónica, la consulta es muy complicada, es una búsqueda de productos por filtros y almacena como 20 datos, acá en mi trabajo quieren que haga un reporte de ventas por productos usando ese mismo store, haré una búsqueda de tal descripción o peso de producto y le mando un año y me genera el reporte, en otras conversaciones estuve implementando esto: 

    ya se desde un principio que está mal hecho pero lo primero que hace es ejecutar el stored proceduro y no hace caso al select que he puesto allí

    saludos

    jueves, 2 de agosto de 2012 17:22
  • Que te devuelve el stored procedure que quieres usar y como usarias ese resultado dentro de tu nueva consulta?

    This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" and "Vote as Helpful" on posts that help you. This can be beneficial to other community members reading the thread.

    jueves, 2 de agosto de 2012 17:29
  • El stored proceduro que quiero usar está debajo, en la imagen lo puedes ver, el id, la descripción, el año, la cantidad y el importe

    pero para ver la descripcion necesito hacer un inner join de ventas a producto

    lo que me piden es usar este stored procedure:

    ALTER procedure [dbo].[usp_buscarProductoxFiltros] 
    @cod varchar(20) = '',
    @desc varchar(50) = '',
    @idcat int = '-1',
    @idlinea int = '-1',
    @idmarca int = '-1',
    @idsabor int = '-1',
    @idrend int = '-1',
    @idemb int = '-1',
    @idpre int = '-1',
    @unidad int = '-1',
    @dietetico int = '',
    @granel int = '',
    @tipoaporte int = '-1',
    @codigosap varchar(50) = ''
    as
    select ID_PRODUCTO ,CODPRODUCTO,PROD_DESC ,
    ID_ESTADO,FLG_DIETETICO,FLG_FUNCIONAL,FLG_GRANEL,UNIDAD_EMPAQUE,
    PESO,ID_GRUPO,c.DESCATEGORIA,c.ID_CATEGORIA,
     l.DESLINEA, l.ID_LINEA  ,
     m.DESMARCA, m.ID_MARCA ,
     s.DESSABOR,s.ID_SABOR,
    r.DESRENDIMIENTO ,r.ID_RENDIMIENTO,
    ID_APORTE_FUNC 'Aporte',
    e.DESEMBALAJE ,e.ID_EMBALAJE,
    pr.DESPRESENTACION,pr.ID_PRESENTACION ,
    convert(char(10),FECCREA,103) 'Fecha',
    um.ID_UNIDAD_MEDIDA, um.DESUNIDAD, Volumen_mts3,CodigoSap,DescripcionIngles
    from PRODUCTO p inner join CATEGORIA c on p.ID_CATEGORIA = c.ID_CATEGORIA inner join LINEA l
    on p.ID_LINEA = l.ID_LINEA inner join MARCA m on p.ID_MARCA = m.ID_MARCA inner join SABOR s
    on p.ID_SABOR = s.ID_SABOR inner join RENDIMIENTO r on p.ID_RENDIMIENTO = r.ID_RENDIMIENTO 
    inner join EMBALAJE e on p.ID_EMBALAJE = e.ID_EMBALAJE inner join PRESENTACION pr
    on p.ID_PRESENTACION = pr.ID_PRESENTACION inner join UNIDAD_MEDIDA um
    on p.ID_UNIDAD_MEDIDA = um.ID_UNIDAD_MEDIDA 
    where ((@cod = '') or(CODPRODUCTO like '%' + @cod + '%')) and
    ((@desc = '') or (PROD_DESC like '%' + @desc + '%')) and
    ((@idcat = '-1') or (p.ID_CATEGORIA = @idcat)) and 
    ((@idlinea = '-1') or (p.ID_LINEA = @idlinea))  and
    ((@idmarca = '-1') or (p.ID_MARCA = @idmarca)) and
    ((@idsabor = '-1') or (p.ID_SABOR = @idsabor)) and
    ((@idrend = '-1') or (p.ID_RENDIMIENTO = @idrend)) and
    ((@idemb = '-1') or (p.ID_EMBALAJE = @idemb)) and
    ((@idpre = '-1') or (p.ID_PRESENTACION = @idpre)) and
    ((@unidad = '-1') or (p.ID_UNIDAD_MEDIDA = @unidad )) and
    ((@dietetico = '') or (p.FLG_DIETETICO = @dietetico)) and
    ((@granel = '') or (p.FLG_GRANEL = @granel)) and
    ((@tipoaporte = '-1') or (p.ID_APORTE_FUNC = @tipoaporte)) and
    ((@codigosap = '') or (p.CodigoSap like '%' + @codigosap + '%'))

     y que genere un reporte de ventas por año o mes, por ejemplo selecciona la marca y le doy un año y me genera el reporte en tal año saludos

    jueves, 2 de agosto de 2012 17:35
  • Una posible solucion es que crees una tabla temporal o una variable de tipo tabla e insertes la parte del resultado del procedure que necesitas alli para luego usar la tabla en tu reporte.

    Algo asi:

    declare @miTabla table (ID_Producto int, codProducto int, prod_desc varchar()...)
    
    insert into @miTable 
    exec tuProcedure <params...>
    
    select ... etc.

    No tengo informacion suficiente para darte una idea mas detallada, pero creo que con eso puedes empezar.

    Saludos,

    Monica


    This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" and "Vote as Helpful" on posts that help you. This can be beneficial to other community members reading the thread.

    jueves, 2 de agosto de 2012 17:44
  • Hola.

    Yo, por el contrario, no te recomiendo reutilizar el mismo procedimiento, que ya es bastante precario para el rendimiento (todos estos buscadores genéricos, con decenas de parámetros opcionales lo son, y más aún implementados así). La alternativa de recuperar más datos (a una tabla temporal encima) para luego tomar unos pocos puede resultar sencillo de implementar, pero recuperas más datos de los que necesitas, los tienes que escribir para luego quedarte con unos pocos. En resumen, si necesitas un campo de una tabla, recuperar 15 pasando por numerosas tablas no tiene sentido. 

    Crea un nuevo procedimiento que se ajuste a tus necesidades, que use las tablas que requieras (no parece que sean todas, sólo una de ellas), filtradas como requieras, agrupadas como requieras en tu caso actual. Si tienes dificultades para hacerlo, puedes consultarnos, seguramente podamos ayudarte.

    Desconozco qué ventaja te aporta reutilizar el código de ese procedimiento.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 3 de agosto de 2012 7:21
    Moderador
  • Hola JosueHunker!

    Tu post se moverán al Foro correcto, SQL.

    Saludos.


    Eder Costa
    LATAM Forum Support Engineer
    Microsoft Corporation
    forumguys

    lunes, 6 de agosto de 2012 17:12
  • pareciera que necesitas una funcion escalar, a lo sumo una funcion de tabla para colocarlo como join..
    • Propuesto como respuesta RogerJH007 jueves, 9 de agosto de 2012 20:13
    jueves, 9 de agosto de 2012 1:32