PDA

Ver la Versión Completa : Eficiencia en Tabla


davchi
18-09-2012, 05:43:16
Hola a todos, se que no es un foro de visual basic 6, pero como uso FIREBIRD tal ves me puedan ayudar

Resulta que tengo la siguiente consulta:

Select c.id_contratos, c.fecha, c.paciente, c.obra_social_paciente, c.edad, c.feriado, c.nocturno, c.fin_semana, c.urgencia_diurna, c.edad_extrema, c.operacion_suspendida,
n.codigo AS cod1, n.descripcion AS descripcion1, n.complejidad AS comp1, c.bilateral1, c.multiple1, c.via1, n2.codigo AS cod2, n2.descripcion AS descripcion2, n2.complejidad AS comp2, c.bilateral2, c.multiple2, c.via2, n3.codigo AS cod3, n3.descripcion AS descripcion3, n3.complejidad AS comp3, c.bilateral3, c.multiple3, c.via3, n4.codigo AS cod4, n4.descripcion AS descripcion4, n4.complejidad AS comp4, c.bilateral4, c.multiple4, c.via4, n5.codigo AS cod5, n5.descripcion AS descripcion5, n.complejidad AS comp5, c.bilateral5, c.multiple5, c.via5,
c.total_intervencion, c.anestesiologo1, c.cirujano1, c.cirujano2, c.paso,
p.nombre AS paciNombre, p.apellido AS paciApellido, p.fecha_nacimiento AS paciFechaNac, p.dni,
a.nombre AS anesteNombre, a.apellido AS anesteApellido, rel.numero_afiliado,
ci.nombre AS ciruNombre, ci.apellido AS ciruApellido, ci2.nombre AS ciruNombre2, ci2.apellido AS ciruApellido2, fa.porcentaje AS porcen, o.descripcion_complejidad
FROM contratos c
INNER JOIN pacientes p ON (c.paciente = p.id_paciente)
INNER JOIN rel_paciente rel ON (c.paciente = rel.id_paciente AND rel.id_obra_social = c.obra_social_paciente)
INNER JOIN nomenclador n ON (c.intervencion1 = n.id_nomenclador)
LEFT JOIN nomenclador n2 ON (c.intervencion2 = n2.id_nomenclador)
LEFT JOIN nomenclador n3 ON (c.intervencion3 = n3.id_nomenclador)
LEFT JOIN nomenclador n4 ON (c.intervencion4 = n4.id_nomenclador)
LEFT JOIN nomenclador n5 ON (c.intervencion5 = n5.id_nomenclador)
INNER JOIN anestesiologo a ON (c.anestesiologo1 = a.id_anestesiologo)
LEFT JOIN cirujano ci ON (c.cirujano1 = ci.id_cirujano)
LEFT JOIN cirujano ci2 ON (c.cirujano2 = ci2.id_cirujano)
INNER JOIN facturado fa ON (c.id_contratos = fa.id_contrato)
INNER JOIN obra_social o ON (c.obra_social_paciente = o.id_obra_social)
WHERE c.id_contratos <> 1 AND c.paso = 3 Order By fecha, id_contratos ASC

y luego los cargo en una tabla:
cnn.Execute "INSERT INTO HISTORIAL_CRYSTAL " & "(FECHA,OBRA_SOCIAL,DNI,PACIENTE,EDAD,CODIGO,PROCEDIMIENTO,COMPLEJIDAD,OBSERVACIONES,ID_CIRUJANO,CIRU JANO,IMPORTE,ID_ANESTESIOLOGO,ANESTESIOLOGO) VALUES('" & _
Format$(!fecha, "yyyy/mm/dd") & "','" & !obra_social_paciente & "','" & _
ob & "','" & !paciApellido & " " & !paciNombre & "','" & _
edad & "','" & codigos & "','" & descripciones & "','" & _
complejidad & "','" & observaciones & "','" & !cirujano1 & "','" & _
cirujanos & "','" & Str$(CDbl(!total_intervencion * !porcen / 100)) & "','" & !anestesiologo1 & "','" & _
!anesteApellido & " " & !anesteNombre & "')"

Es media larga, y me han comentado que para que no sea tan lerda a la hora de pasar los datos a crystal reports podria hacer un Stored Procedure en FIREBIRD, pero estoy bastante perdido.

Me podrian echar una manito de como crear el PROCEDURE

Muchas Gracias

Casimiro Notevi
18-09-2012, 10:16:07
Hola, no se entiende nada en ese "galimatías" :)
De todas formas, si quieres/necesitas un stored procedure, deberías de describirnos las tablas involucradas y lo que quieres que haga, exactamente. No somos adivinos ;)

davchi
18-09-2012, 23:14:54
Perdon por la pregunta que fue bastante confusa, paso a describir lo que necesito

TABLA -> CONTRATOS:
fecha, paciente, obra_social_paciente, edad, feriado, nocturno, fin_semana, urgencia_diurna, edad_extrema,
operacion_suspendida, bilateral1, multiple1, via1, bilateral2, multiple2, via2, bilateral13, multiple3, via3,
bilateral4, multiple4, via4, bilateral5, multiple5, via5, total_intervencion, anestesiologo1, cirujano1, cirujano2, paso

TABLA -> PACIENTES:
nombre, apellido, fecha_nacimiento, dni

TABLA -> REL_PACIENTE:
rel.numero_afiliado

TABLA -> OBRA_SOCIAL:
descripcion_complejidad

TABLA -> NOMENCLADOR:
codigo, descripcion, complejidad

TABLA -> ANESTESIOLOGO:
nombre, apellido

TABLA -> CIRUJANO:
nombre, apellido

TABLA -> FACTURADO:
porcentaje

Y lo que necesito que salga es

ID_CONTRATOS -> viene de CONTRATOS | id_contratos * campo INTEGER
FECHA_CONTRATO -> viene de la tabla CONTRATOS | fecha *campo DATE
ID_OBRA_SOCIAL -> viene desde CONTRATOS | obra_social_paciente * campo INTEGER
NUMERO_AFILIADO -> viene desde REL_PACIENTE y PACIENTE | INNER JOIN rel_paciente rel ON (c.paciente = rel.id_paciente AND rel.id_obra_social = c.obra_social_paciente) * campo BLOB
NOMBRE y APELLIDO -> viene desde PACIENTES | INNER JOIN pacientes p ON (c.paciente = p.id_paciente) * campo VARCHAR(50)
EDAD -> viene desde CONTRATOS | edad * campo CHAR(5)
CODIGO -> viene desde CONTRATOS y NOMENCLADOR | INNER JOIN nomenclador n ON (c.intervencion1 = n.id_nomenclador) * CAMPO BLOB y son 5 codigos uno bajo el otro
PROCEDIMIENTO -> viene desde CONTRATOS y NOMENCLADOR | INNER JOIN nomenclador n ON (c.intervencion1 = n.id_nomenclador) * CAMPO BLOB y son 5 codigos uno bajo el otro
COMPLEJIDAD -> viene desde CONTRATOS y NOMENCLADOR | INNER JOIN nomenclador n ON (c.intervencion1 = n.id_nomenclador) * CAMPO BLOB y son 5 codigos uno bajo el otro
OBSERVACIONES -> viene desde CONTRATOS feriado, nocturno, fin_semana, urgencia_diurna, edad_extrema, bilateral1, multiple1, via1, bilateral2, multiple2, via2, bilateral13, multiple3, via3, bilateral4, multiple4, via4, bilateral5, multiple5, via5 * CAMPO BLOB bajo el otro
ID_CIRUJANO -> viene desde CONTRATOS | cirujano1 * campo INTEGER
CIRUJANO -> viene de CONTRATOS y CIRUJANO | LEFT JOIN cirujano ci ON (c.cirujano1 = ci.id_cirujano) y LEFT JOIN cirujano ci2 ON (c.cirujano2 = ci2.id_cirujano) | campo BLOB
IMPORTE -> viene desde CONTRATOS | total_intervencion * campo DOUBLE PRECISION
ID_ANESTESIOLOGO -> viene desde CONTRATOS | anestesiologo1 * campo BLOB
ANESTESIOLOGO -> viene de CONTRATOS y ANESTESIOLOGO | LEFT JOIN cirujano ci ON (c.cirujano1 = ci.id_cirujano) * campo BLOB
PORCENTAJE -> viene desde FACTURADO | INNER JOIN facturado fa ON (c.id_contratos = fa.id_contrato) * campo INTEGER
DESCRIPCION_COMPLEJIDAD -> viene desde OBRA_SOCIAL | INNER JOIN obra_social o ON (c.obra_social_paciente = o.id_obra_social) * campo VARCHAR(10)

Espero no haber confundido mas las cosas

Casimiro Notevi
18-09-2012, 23:34:55
O sea, ¿quieres un select para extraer esos datos, no un stored procedure?
¿O acaso lo que quieres es una vista?

mightydragonlor
19-09-2012, 04:05:07
Casimiro, lo que creo que quiere hacer es un select en el store procedure, para este ejemplo, paso a dar un ejemplo de mis procedimientos de consultas en firebird, espero te ayude en algo.


SET TERM ^ ;
CREATE PROCEDURE SP_LISTAR_INDICADORES (
FECHA_INICIAL TYPE OF FECHA,
FECHA_FINAL TYPE OF FECHA,
USU_UUID_IN TYPE OF UUID_CHAR )
RETURNS (
FECHA TYPE OF DESCRIPCION,
USUARIO TYPE OF DESCRIPCION,
CENTRO_OPERATIVO TYPE OF DESCRIPCION,
TIPO_USUARIO TYPE OF DESCRIPCION,
MAQUINA TYPE OF DESCRIPCION,
TIPO_MAQUINA TYPE OF DESCRIPCION,
DELGADOS TYPE OF CANTIDAD,
CRUDOS TYPE OF CANTIDAD,
MELAMINA TYPE OF CANTIDAD,
DELGADO TYPE OF CANTIDAD,
RIGIDO TYPE OF CANTIDAD,
COMENTARIO TYPE OF "PASSWORD" )
AS
BEGIN
FOR SELECT
CASE (EXTRACT(MONTH FROM I.IND_FECHA))
WHEN 1 THEN 'ENERO'
WHEN 2 THEN 'FEBRERO'
WHEN 3 THEN 'MARZO'
WHEN 4 THEN 'ABRIL'
WHEN 5 THEN 'MAYO'
WHEN 6 THEN 'JUNIO'
WHEN 7 THEN 'JULIO'
WHEN 8 THEN 'AGOSTO'
WHEN 9 THEN 'SEPTIEMBRE'
WHEN 10 THEN 'OCTUBRE'
WHEN 11 THEN 'NOVIEMBRE'
WHEN 12 THEN 'DICIEMBRE'
END,
U.USU_NOMBRE,
'#'||U.USU_CENTRO_OPERATIVO,
TU.TIPO_USU_NOMBRE,
M.MAQ_NOMBRE,
TM.TIPO_MAQ_NOMBRE,
SUM(COALESCE(I.IND_DELGADOS,0)),
SUM(COALESCE(I.IND_CRUDOS,0)),
SUM(COALESCE(I.IND_LAMINA,0)),
SUM(COALESCE(I.IND_DELGADO,0)),
SUM(COALESCE(I.IND_RIGIDO,0)),
'LOS VALORES SON LA SUMATORIA DE LOS MOVIMIENTOS DEL MES.'
FROM
TBLINDICADORES I
INNER JOIN TBLUSUARIOS U ON I.USU_UUID = U.USU_UUID
INNER JOIN TBLTIPOUSUARIO TU ON U.TIPO_USU = TU.TIPO_USU_UUID
INNER JOIN TBLMAQUINAS M ON I.MAQ_UUID = M.MAQ_UUID
INNER JOIN TBLTIPOMAQUINA TM ON M.TIPO_MAQ_UUID = TM.TIPO_MAQ_UUID
WHERE
I.IND_FECHA BETWEEN :FECHA_INICIAL AND :FECHA_FINAL
AND I.USU_UUID = COALESCE(CHAR_TO_UUID(:USU_UUID_IN), I.USU_UUID)
GROUP BY
EXTRACT(MONTH FROM I.IND_FECHA),
U.USU_NOMBRE, U.USU_CENTRO_OPERATIVO, TU.TIPO_USU_NOMBRE,
M.MAQ_NOMBRE, TM.TIPO_MAQ_NOMBRE
INTO
:FECHA,
:USUARIO,
:CENTRO_OPERATIVO,
:TIPO_USUARIO,
:MAQUINA,
:TIPO_MAQUINA,
:DELGADOS,
:CRUDOS,
:MELAMINA,
:DELGADO,
:RIGIDO,
:COMENTARIO
DO
BEGIN
SUSPEND;
END
END^
SET TERM ; ^

GRANT EXECUTE
ON PROCEDURE SP_LISTAR_INDICADORES TO SYSDBA;



Los parámetros de entrada son:
FECHA_INICIAL
FECHA_FINAL
USU_UUID_IN
Los que se encuentran dentro de RETURNS (...), son los parámetros de salida, es decir, un select en un sp en Firebird, requiere que las columnas sean entregadas a parámetros de salida.

Saludos.