none
Me pueden ayudar con un Procedimiento Alamacenado RRS feed

  • Pregunta

  • Hola a todos primero que todo os dejaré el código del procedimiento almacenado en el cual estoy trabajando

    ALTER PROCEDURE [dbo].[OBTIENE_INFORME_GESTION] @FDESDE VARCHAR(10), @FHASTA VARCHAR(10) AS SELECT DISTINCT E.ID_ENVIO,CL.CLIENTE,

    TI.vc1Valor AS TIPO,


    E.MODO,

    E.VOLUMEN, E.PESO, E.ALTO, E.LARGO, E.CONTENIDO, E.OBSERVACIONES, E.ESTADO, E.COD_INTERNO, E.NOMBRE_1 AS "NOMBRE ORIGEN", E.EMPRESA_1 AS "EMPRESA ORIGEN", E.NOMBRE_2 AS "NOMBRE DESTINO", S.SUCURSAL, S.DIRECCION, C.COMUNA AS "COMUNA DESTINO", E.REGION_2, E.ADMISION, E.FECHA_ADM, E.DESPACHO

    FROM SOLICITUD AS SC, CLIENTE AS CL, ENVIO AS E, TABLAS AS TI, SUCURSALES AS S, COMUNA AS C

    WHERE E.ID_ENVIO = SC.ENVIO AND E.ID_CLIENTE = CL.COD_CLIENTE AND E.TIPO = TI.codigo AND TI.codTabla = 4 AND E.LOCALIDAD_2 = S.ID_SUCURSAL AND E.ID_CLIENTE = S.ID_CLIENTE AND E.COMUNA_2 = C.ID_COMUNA AND E.FECHA_ADM >= @FDESDE AND E.FECHA_ADM <= @FHASTA ORDER BY ID_ENVIO, CLIENTE

    Bueno resulta que este procedimiento almacenado hace un llamado a ciertos datos de las siguientes tablas.

    1. ENVIO
    2. SUCURSALES
    3. CLIENTE
    4. TABLAS
    5. SOLICITUD
    6. COMUNA

    Pero el dato que por el momento me interesa mostrar bien es el MODO de la tabla 'ENVIO' el cual al ejecutar la consulta el campo MODO me muestra con números los datos, y la idea es que lo muestre de manera escrito en palabras, es decir, dependiendo del valor que tome el campo MODO, es:

    Si MODO = 1 entonces dice 'AEREO'

    SI MODO = 2 entonces dice 'TERRESTRE'

    SI MODO = 3 entonces dice 'MARITIMO'

    Eso no lo debo hacer con un CASE ya que mi supervisora me ordenó que usara los datos de la tabla 'TABLAS' (OJO, es así como se llama esa tabla), siendo los siguientes sus datos:


    El 'codTabla' cuando su valor es 10 corresponde al MODO, luego el campo 'codigo' corresponde al valor del MODO (1, 2 o 3) y por ultimo el campo 'vc1Valor' es el que contiene su respectivo valor dependiendo del campo 'codigo'.

    Lo que quiero hacer es con alguna condición, puede ser IF-ELSE, WHERE o alguna otra, que como mencione antes no debo usar CASE, que cuando en la consulta el valor de MODO sea por ejemplo, 2 diga en palabras TERRESTRE y no que muestre el 2. Espero que se entienda muchas gracias, estaré atento a sus recomendaciones, sugerencias y/o comentarios.

    jueves, 22 de marzo de 2018 18:09

Respuestas

  • Lo que quiero hacer es con alguna condición, puede ser IF-ELSE, WHERE o alguna otra, que como mencione antes no debo usar CASE, que cuando en la consulta el valor de MODO sea por ejemplo, 2 diga en palabras TERRESTRE y no que muestre el 2.

    Recupera el valor mediante la columna de referencia, esa es la razón por la que implementas combinación de filas en tu consulta aunque te sugiero utilices la forma explicita. Escribe de manera correcta la expresión de unión y en la lista de selección escribe la columna que contiene el valor descriptivo, por ejemplo:

    ALTER PROCEDURE dbo.ObtenerInformeGestion
    	@FDESDE date,
    	@FHASTA date
    AS
    BEGIN
    	SET NOCOUNT ON;
    
    	SELECT DISTINCT 
    		E.ID_ENVIO, CL.CLIENTE, TI.vc1Valor AS TIPO, 
    		E.MODO, TI.vc1Valor,
    		E.VOLUMEN, E.PESO, E.ALTO, E.LARGO, E.CONTENIDO, E.OBSERVACIONES, E.ESTADO, 
    		E.COD_INTERNO, E.NOMBRE_1 AS [NOMBRE ORIGEN], E.EMPRESA_1 AS [EMPRESA ORIGEN], 
    		E.NOMBRE_2 AS [NOMBRE DESTINO], S.SUCURSAL, S.DIRECCION, 
    		C.COMUNA AS [COMUNA DESTINO], E.REGION_2, E.ADMISION, E.FECHA_ADM, E.DESPACHO
    	FROM 
    		SOLICITUD SC
    		INNER JOIN ENVIO E ON SC.ENVIO = E.ID_ENVIO
    			AND E.FECHA_ADM >= @FDESDE AND E.FECHA_ADM <= @FHASTA
    		INNER JOIN CLIENTE CL ON E.ID_CLIENTE = CL.COD_CLIENTE
    		INNER JOIN TABLAS TI ON TI.codTabla = 10 AND E.MODO = TI.codigo
    		INNER JOIN SUCURSALES S ON E.LOCALIDAD_2 = S.ID_SUCURSAL 
    			AND E.ID_CLIENTE = S.ID_CLIENTE
    		INNER JOIN COMUNA C ON E.COMUNA_2 = C.ID_COMUNA
    	ORDER BY ID_ENVIO, CLIENTE
    END
    GO

    jueves, 22 de marzo de 2018 18:32
  • Son dos relaciones, por tanto dos combinaciones:

    INNER JOIN TABLAS TI_1 ON TI_1.codTabla = 10 AND E.MODO = TI_1.codigo
    INNER JOIN TABLAS TI_2 ON TI_2.codTabla = 4 AND E.TIPO = TI_2.codigo

    Lógicamente debes escribir, en la consulta de selección, la columna según el alias correspondiente:

    ..., TI_2.vc1Valor AS TIPO, TI_1.vc1Valor, ...

    • Marcado como respuesta M4uriXD jueves, 22 de marzo de 2018 19:58
    jueves, 22 de marzo de 2018 19:46

Todas las respuestas

  • Lo que quiero hacer es con alguna condición, puede ser IF-ELSE, WHERE o alguna otra, que como mencione antes no debo usar CASE, que cuando en la consulta el valor de MODO sea por ejemplo, 2 diga en palabras TERRESTRE y no que muestre el 2.

    Recupera el valor mediante la columna de referencia, esa es la razón por la que implementas combinación de filas en tu consulta aunque te sugiero utilices la forma explicita. Escribe de manera correcta la expresión de unión y en la lista de selección escribe la columna que contiene el valor descriptivo, por ejemplo:

    ALTER PROCEDURE dbo.ObtenerInformeGestion
    	@FDESDE date,
    	@FHASTA date
    AS
    BEGIN
    	SET NOCOUNT ON;
    
    	SELECT DISTINCT 
    		E.ID_ENVIO, CL.CLIENTE, TI.vc1Valor AS TIPO, 
    		E.MODO, TI.vc1Valor,
    		E.VOLUMEN, E.PESO, E.ALTO, E.LARGO, E.CONTENIDO, E.OBSERVACIONES, E.ESTADO, 
    		E.COD_INTERNO, E.NOMBRE_1 AS [NOMBRE ORIGEN], E.EMPRESA_1 AS [EMPRESA ORIGEN], 
    		E.NOMBRE_2 AS [NOMBRE DESTINO], S.SUCURSAL, S.DIRECCION, 
    		C.COMUNA AS [COMUNA DESTINO], E.REGION_2, E.ADMISION, E.FECHA_ADM, E.DESPACHO
    	FROM 
    		SOLICITUD SC
    		INNER JOIN ENVIO E ON SC.ENVIO = E.ID_ENVIO
    			AND E.FECHA_ADM >= @FDESDE AND E.FECHA_ADM <= @FHASTA
    		INNER JOIN CLIENTE CL ON E.ID_CLIENTE = CL.COD_CLIENTE
    		INNER JOIN TABLAS TI ON TI.codTabla = 10 AND E.MODO = TI.codigo
    		INNER JOIN SUCURSALES S ON E.LOCALIDAD_2 = S.ID_SUCURSAL 
    			AND E.ID_CLIENTE = S.ID_CLIENTE
    		INNER JOIN COMUNA C ON E.COMUNA_2 = C.ID_COMUNA
    	ORDER BY ID_ENVIO, CLIENTE
    END
    GO

    jueves, 22 de marzo de 2018 18:32
  • GRACIAS lo probé para ver que tal y funciona bien, ahora una última pregunta, que fue algo que me olvidé incorporar en la pregunta, para combinar 2 valores haciendo el llamado a 'TABLAS' quedaría algo así:

    INNER JOIN TABLAS TI ON TI.codTabla = 10 AND E.MODO = TI.codigo AND TI.codTabla = 4 AND E.TIPO = TI.codigo

    O eso está malo?

    Lo que busco es como resultado final en la columna 'TIPO', que viene de la tabla 'ENVIO', tampoco me muestre su valor en numero, y su valor de la tabla 'TABLAS' del campo 'codTabla' es 4, es decir que cuando ese campo 'TIPO' tome el valor 1, por ejemplo, debe decir 'DOCUMENTO', si toma 2 sería 'CARTA' y así hasta 12, me explique bien no? Si no es mucha la molestia me podría ayudar, gracias.

    TI.vc1Valor AS TIPO

    Ese era el campo de la tabla 'TABLAS' que llamaba desde el SELECT, pero me muestra tanto en el campo MODO, como en el TIPO lo mismo, usando ese ejemplo.

    jueves, 22 de marzo de 2018 19:33
  • Son dos relaciones, por tanto dos combinaciones:

    INNER JOIN TABLAS TI_1 ON TI_1.codTabla = 10 AND E.MODO = TI_1.codigo
    INNER JOIN TABLAS TI_2 ON TI_2.codTabla = 4 AND E.TIPO = TI_2.codigo

    Lógicamente debes escribir, en la consulta de selección, la columna según el alias correspondiente:

    ..., TI_2.vc1Valor AS TIPO, TI_1.vc1Valor, ...

    • Marcado como respuesta M4uriXD jueves, 22 de marzo de 2018 19:58
    jueves, 22 de marzo de 2018 19:46
  • Gracias te pasaste, de veras muchas gracias
    jueves, 22 de marzo de 2018 20:04