Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

[SOLUCIONADO] Reporte de descansos medicos

Estas en el tema de Reporte de descansos medicos en el foro de Oracle en Foros del Web. Hola amigos. Tengo un problema, necesito corregir un reporte que se genera en Oracle; se trata de mostrar los dias de descanso medico que tienen ...
  #1 (permalink)  
Antiguo 06/05/2015, 08:36
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Reporte de descansos medicos

Hola amigos. Tengo un problema, necesito corregir un reporte que se genera en Oracle; se trata de mostrar los dias de descanso medico que tienen los trabajadores pero, es por mes por ejemplo: un trabajador descanzo del 27/12/2013 al 10/01/2014 en total 15 dias, ahora quiero ver cuantos dias descanso en diciembre y deberia mostrar 5, y si consulto por enero del 2014 debe mostrar 10 dias. El reporte que existe ahora muestra el total de dias descansados si consulto para diciembre pero si consulto enero no muestra nada. El problema es que hay descansos que van mas de 3, 4, 5 o 6 meses. Alguan idea?
  #2 (permalink)  
Antiguo 06/05/2015, 09:55
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Reporte de descansos medicos

Sin un query y una explicación explicita de las tablas que intervienen no podemos ayudarte mucho.

Postea el query y exactamente donde tienes problemas

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 06/05/2015, 10:52
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Reporte de descansos medicos

La tabla(resumida) es esta:
Código SQL:
Ver original
  1. ASISTENCIA_OCURRENCIA
  2. ( c_c_empresa                  CHAR(2) NOT NULL,
  3.   c_c_codigo                   CHAR(15) NOT NULL,
  4.   c_n_secuencia                VARCHAR2(6) NOT NULL,
  5.   c_c_ocurrencia               VARCHAR2(2),
  6.   d_inicio                     DATE,
  7.   d_fin                        DATE,
  8.   c_h_inicio                   VARCHAR2(4),
  9.   c_h_fin                      VARCHAR2(4),
  10.   c_st_dia_hora                CHAR(1),
  11.   c_st_situacion               CHAR(1),
  12.   n_n_dias_ocurrencia          NUMBER(4),
  13.   n_n_dias_procesados          NUMBER(4),
  14.    d_modifica                   DATE)

Para el reporte actual se usan los campos d_inicio, d_fin y n_n_dias_ocurrencia. Lo que hace el query es verificar si campo d_inicio esta dentro del rango de fecha que se ingresa ejemplo(del 01/12/2013 al 31/12/2013) y si esta muestra el campo n_n_dias_ocurrencia. El problema es que si el descanso es desde el 27/12/2013 al 10/01/2014 la totalidad de dias(15) lo muestra en el rango de diciembre y si consulto enero muestra cero(0). El query(resumido) es el siguiente:
Código SQL:
Ver original
  1. SELECT   "ASISTENCIA_OCURRENCIA"."C_C_EMPRESA",
  2.                "ASISTENCIA_OCURRENCIA"."C_C_CODIGO",  
  3.                UF_DESC_TRABAJADOR_CODIGO("ASISTENCIA_OCURRENCIA"."C_C_EMPRESA",
  4.                "ASISTENCIA_OCURRENCIA"."D_INICIO",  
  5.                "ASISTENCIA_OCURRENCIA"."D_FIN",  
  6.                "ASISTENCIA_OCURRENCIA"."N_N_DIAS_PROCESADOS",  
  7.                "ASISTENCIA_OCURRENCIA"."C_FL_VISACION",  
  8. FROM "ASISTENCIA_OCURRENCIA","ASISTENCIA_MOTIVO_OCURRENCIA","SMF_CLINICA"
  9. WHERE ("ASISTENCIA_OCURRENCIA"."C_C_OCURRENCIA" = "ASISTENCIA_MOTIVO_OCURRENCIA"."C_C_OCURRENCIA")
  10. AND ("ASISTENCIA_OCURRENCIA"."C_C_CENTRO_MEDICO" = "SMF_CLINICA"."C_C_CLINICA")
  11. AND     ( ( "ASISTENCIA_OCURRENCIA"."C_C_EMPRESA" = :as_c_empresa)
  12.           AND ( "ASISTENCIA_OCURRENCIA"."C_C_AUXILIAR"= 'T')
  13.           AND ( "ASISTENCIA_OCURRENCIA"."C_C_CODIGO" BETWEEN :as_cod_ini AND
  14.                   :as_cod_fin )
  15.           AND ("ASISTENCIA_OCURRENCIA"."D_INICIO" BETWEEN to_date(:as_fecha_ini,'dd/mm/yyyy')
  16.            AND  to_date(:as_fecha_fin, 'dd/mm/yyyy'))
  17.            AND ( "ASISTENCIA_OCURRENCIA"."C_C_TIPO_OCURRENCIA" = '02')
  18.          AND ( "ASISTENCIA_OCURRENCIA"."C_ST_SITUACION" <> '2'))
Ahora tengo que modificar o rehacer el query para que el reporte muestra 5 dias en diciembre(si consulto para diciembre) y 10 dias(si consulto para enero). Revisando los datos veo que hay renovacion de descansos medicos, por ejemplo: un descanso que empieza el 10/12/2013 hasta el 13/12/2013 pero sigue mal y le renuevan del 14/12/2013 al 23/12/2013 y asi hasta el 24/02/2014. Gracias por su ayuda. Espero que se vea bien este post.
PD: Porque esta en un subforo de Programación para mayores de 30?

Última edición por gnzsoloyo; 06/05/2015 a las 11:17
  #4 (permalink)  
Antiguo 11/05/2015, 07:45
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Reporte de descansos medicos

Hola muchachos. Resolví en parte el problema que tengo con el siguiente query:
Código SQL:
Ver original
  1. SELECT c_c_codigo,c_n_secuencia,d_inicio,d_fin,n_n_dias_procesados,c_c_mes_anho_ini,c_c_mes_anho_fin, n_n_dia_ini,n_n_dia_fin,
  2.     CASE WHEN (substr(d_fin,4,2) <> substr(d_inicio,4,2)) AND (d_inicio BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) THEN (CASE substr(d_inicio,4,2) WHEN '12' THEN to_date('31/12/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  3.         WHEN '11' THEN to_date('30/11/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  4.         WHEN '10' THEN to_date('31/10/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  5.         WHEN '09' THEN to_date('30/09/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  6.         WHEN '08' THEN to_date('31/08/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  7.         WHEN '07' THEN to_date('31/07/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  8.         WHEN '06' THEN to_date('30/06/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  9.         WHEN '05' THEN to_date('31/05/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  10.         WHEN '04' THEN to_date('30/04/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  11.         WHEN '03' THEN to_date('31/03/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  12.         WHEN '02' THEN CASE sigarp.uf_anho_bisiesto(to_number(substr(to_char(d_inicio,'dd/mm/yyyy'),7,4)))
  13.         WHEN 1 THEN to_date('29/02/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  14.         WHEN 0 THEN to_date('28/02/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  15.         END
  16.         WHEN '01' THEN to_date('31/01/'||substr(to_char(d_inicio,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') - d_inicio + 1
  17.       END)
  18.       WHEN (substr(d_fin,4,2) <> substr(d_inicio,4,2)) AND (d_fin BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) THEN (CASE substr(d_fin,4,2) WHEN '12' THEN d_fin - to_date('01/12/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  19.       WHEN '11' THEN d_fin - to_date('01/11/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  20.       WHEN '10' THEN d_fin - to_date('01/10/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  21.       WHEN '09' THEN d_fin - to_date('01/09/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  22.       WHEN '08' THEN d_fin - to_date('01/08/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  23.       WHEN '07' THEN d_fin - to_date('01/07/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  24.       WHEN '06' THEN d_fin - to_date('01/06/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  25.       WHEN '05' THEN d_fin - to_date('01/05/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  26.       WHEN '04' THEN d_fin - to_date('01/04/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  27.       WHEN '03' THEN d_fin - to_date('01/03/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  28.       WHEN '02' THEN d_fin - to_date('01/02/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  29.       WHEN '01' THEN d_fin - to_date('01/01/'||substr(to_char(d_fin,'dd/mm/yyyy'),7,4),'dd/mm/yyyy') + 1
  30.       END)                        
  31.       WHEN substr(d_fin,4,2) = substr(d_inicio,4,2) THEN d_fin - d_inicio + 1
  32.      
  33.     END Dias
  34. FROM sigarp.asistencia_ocurrencia
  35. WHERE c_c_codigo BETWEEN '000000000000000' AND '999999999999999'
  36. AND (d_inicio BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy') OR d_fin BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy'));

Y muestra lo siguiente:

c_c_codigo c_n_secuencia d_inicio d_fin dias
28014 140352 23/01/2014 24/01/2014 2
06787 140353 21/01/2014 23/01/2014 3
27034 140354 22/01/2014 24/01/2014 3
13832 140355 24/01/2014 25/01/2014 2
23010 132516 05/10/2013 02/01/2014 2
95184 140204 15/01/2014 16/01/2014 2
24044 140205 16/01/2014 17/01/2014 2
11053 140206 16/01/2014 16/01/2014 1
95324 140207 15/01/2014 16/01/2014 2
95176 140208 16/01/2014 16/01/2014 1
96118 140209 16/01/2014 16/01/2014 1
99148 140210 14/01/2014 15/01/2014 2
32025 140212 13/01/2014 13/01/2014 1
32025 140213 14/01/2014 14/01/2014 1

El query muestra el resultado mensual, pero quisiera que lo haga para 2, 3 o mas meses. Agradeceré su ayuda.

Última edición por gnzsoloyo; 11/05/2015 a las 08:14
  #5 (permalink)  
Antiguo 11/05/2015, 08:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Reporte de descansos medicos

Por favor, usa el HIGHLIGH "SQL", el código que posteas es ilegible.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 11/05/2015, 08:22
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Reporte de descansos medicos

Hola no se que es eso de HIGHLIGH(revisare para la siguiente) pero, ahora que entro al foro ya se puede ver el código sql que puse.
  #7 (permalink)  
Antiguo 11/05/2015, 08:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Reporte de descansos medicos

Cita:
Iniciado por Doglas Ver Mensaje
Hola no se que es eso de HIGHLIGH(revisare para la siguiente) pero, ahora que entro al foro ya se puede ver el código sql que puse.
Puedes verlo porque si miras al pie de tu post, verás que lo edité yo.

Los highlights aparecen en un combo en arriba del area de texto para edición de los posts...
Como minimo podrías MIRAR lo que tienes alli...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 14/05/2015, 08:54
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Reporte de descansos medicos

Bueno muchachos ya termine y me resulto un query mucho mas pequeño que el inicial.
Código SQL:
Ver original
  1. SELECT c_c_codigo,c_n_secuencia,d_inicio,d_fin,n_n_dias_procesados,c_c_mes_anho_ini,c_c_mes_anho_fin, n_n_dia_ini,n_n_dia_fin,
  2.        CASE WHEN (d_inicio BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) AND (d_fin BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) THEN d_fin - d_inicio + 1
  3.             WHEN (d_inicio NOT BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) AND (d_fin BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) THEN d_fin - to_date('&fecha_ini','dd/mm/yyyy') + 1
  4.             WHEN (d_inicio BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) AND (d_fin NOT BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) THEN to_date('&fecha_fin','dd/mm/yyyy') - d_inicio + 1
  5.        END dias
  6. FROM sigarp.asistencia_ocurrencia
  7. WHERE c_c_codigo BETWEEN '000000000000000' AND '999999999999999'
  8. AND ((d_inicio BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')) OR (d_fin BETWEEN to_date('&fecha_ini','dd/mm/yyyy') AND to_date('&fecha_fin','dd/mm/yyyy')));
Código excel:
Ver original
  1. c_c_codigo c_n_secuencia d_inicio d_fin dias
  2. 28014  140352   23/01/2014  24/01/2014  2
  3. 06787  140353   21/01/2014  23/01/2014  3
  4. 27034  140354   22/01/2014  24/01/2014  3
  5. 13832  140355   24/01/2014  25/01/2014  2
  6. 23010  132516   05/10/2013  02/01/2014  2
  7. 95184  140204   15/01/2014  16/01/2014  2
  8. 24044  140205   16/01/2014  17/01/2014  2
  9. 11053  140206   16/01/2014  16/01/2014  1
  10. 95324  140207   15/01/2014  16/01/2014  2
  11. 95176  140208   16/01/2014  16/01/2014  1
  12. 96118  140209   16/01/2014  16/01/2014  1
  13. 99148  140210   14/01/2014  15/01/2014  2
  14. 32025  140212   13/01/2014  13/01/2014  1
  15. 32025  140213   14/01/2014  14/01/2014  1
La ultima columna es el resultado, las fechas son los valores con los que trabaja el query y si colocan el mismo código en el where solo botara de ese trabajador.
PD: hasta ahora no se porque esta dentro de

Etiquetas: reporte
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:54.