• Viernes 8 de Noviembre de 2024, 20:50

Autor Tema:  Decisiones Tipo If Else Resultado  (Leído 3679 veces)

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Decisiones Tipo If Else Resultado
« en: Viernes 18 de Mayo de 2007, 01:17 »
0
Hola

Tengo unas dudas sobre una SQL que debe hacer algo en un pequeño programa que lleva un control de horario laboral, en esto tengo algo que se llama "Clausula 26" lo cual establece como máximo de horas laboradas de un empleado a la semana, de 44 horas, por ejemplo, una idea de esa supuesta clausula la explico con un codigo:

Citar
If TotalLb > 44 Then
    R = TotalLb - 44
Else
    R = 0
End If

Pero ¿cómo se hace esto en una sentencia SQL?

Este es la SQL con la que estoy trabajando:
Citar
Select Sum(AM_lb) AS AM1, Sum(PM_lb) AS PM1, Sum(Total_lb) As Total1, Sum(Clausula) As Clau26,
Sum(AM_ext_d) As AM2, Sum(PM_ext_d) As PM2, Sum(Total_ext_d) As Total2,
Sum(AM_ext_n) As AM3, Sum(PM_ext_n) As PM3, Sum(Total_ext_n) As Total3
From chl_tb
Where NumEmp=30915
 And Fecha Between #08/05/2007# And #20/05/2007#

Pero Sum(Clausula) As Clau26 no me sirve así, la puse de relleno (mientras tanto de esa forma), ese campo es en este caso R.

He probado algo como:
Citar
Select Sum(AM_lb) AS AM1, Sum(PM_lb) AS PM1, Sum(Total_lb) As Total1,
(Select (Sum(Total_lb)-44) As TotalLb From chl_tb Where TotalLb > 44) As Clau26,
Sum(AM_ext_d) As AM2, Sum(PM_ext_d) As PM2, Sum(Total_ext_d) As Total2,
Sum(AM_ext_n) As AM3, Sum(PM_ext_n) As PM3, Sum(Total_ext_n) As Total3
From chl_tb
Where NumEmp=30915
And Fecha Between #08/05/2007# And #20/05/2007#

Pero eso no funciona, en resumen de todo esto, la idea que me da vueltas es la cuestion de que esta SQL (que es para un MSFlexGrid2) tenga dentro otra SQL como la que está entre ( ). Pero me ha costado ver como formarla para que con respecto a ese campo, haga lo del codigo VB pero en SQL.

Alguien sabe?  :unsure:
Si esto es Leído por accidente, induzca al vomito

ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #1 en: Viernes 18 de Mayo de 2007, 17:03 »
0
Y si utilizas un CASE ? no sera mas facil o en este caso no te serviria ?

 :rolleyes:
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #2 en: Viernes 18 de Mayo de 2007, 18:40 »
0
Es que la BD está en Access, eso podría servirme en SQL Server por ejemplo, esto parece que se unirá luego a otro programa que trabaja con archivos planos, yo lo hice así con esta Bd y pues como que me parece que voy a tener que recurrir a unas marañas y actos de magia que ya estoy determinando para salir de este muerto  :lol:
Si esto es Leído por accidente, induzca al vomito

ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #3 en: Viernes 18 de Mayo de 2007, 18:59 »
0
<_<  pero si en los ejemplo que pusiste estas utilizando clausulas SQL ?

Citar
Select Sum(AM_lb) AS AM1, Sum(PM_lb) AS PM1, Sum(Total_lb) As Total1, Sum(Clausula) As Clau26,
Sum(AM_ext_d) As AM2, Sum(PM_ext_d) As PM2, Sum(Total_ext_d) As Total2,
Sum(AM_ext_n) As AM3, Sum(PM_ext_n) As PM3, Sum(Total_ext_n) As Total3
From chl_tb
Where NumEmp=30915
And Fecha Between #08/05/2007# And #20/05/2007#

Citar
Select Sum(AM_lb) AS AM1, Sum(PM_lb) AS PM1, Sum(Total_lb) As Total1,
(Select (Sum(Total_lb)-44) As TotalLb From chl_tb Where TotalLb > 44) As Clau26,
Sum(AM_ext_d) As AM2, Sum(PM_ext_d) As PM2, Sum(Total_ext_d) As Total2,
Sum(AM_ext_n) As AM3, Sum(PM_ext_n) As PM3, Sum(Total_ext_n) As Total3
From chl_tb
Where NumEmp=30915
And Fecha Between #08/05/2007# And #20/05/2007#

 <_<
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #4 en: Viernes 18 de Mayo de 2007, 19:43 »
0
Yo decia con el Case lo llegue a poner y ZAS! error, el resto del Query si rula bien en Access, cualquier cosa rara en las SQLs puede ser debido a posibles desesperos por el tiempo en que le he estado dando vueltas a esto, lo cual ha sido un par de días  :comp:
Si esto es Leído por accidente, induzca al vomito

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #5 en: Viernes 18 de Mayo de 2007, 20:52 »
0
Cita de: "usercode"

He probado algo como:
Citar

Select Sum(AM_lb) AS AM1, Sum(PM_lb) AS PM1, Sum(Total_lb) As Total1,
(Select (Sum(Total_lb)-44) As TotalLb From chl_tb Where TotalLb > 44) As Clau26,
Sum(AM_ext_d) As AM2, Sum(PM_ext_d) As PM2, Sum(Total_ext_d) As Total2,
Sum(AM_ext_n) As AM3, Sum(PM_ext_n) As PM3, Sum(Total_ext_n) As Total3
From chl_tb
Where NumEmp=30915
And Fecha Between #08/05/2007# And #20/05/2007#


En access puedes utilizar funciones en las consultas si quieres utilizar un if puede ser asi

Código: Text
  1. select numcuenta,mes,IIf([Saldo]<0,0,[Saldo]) as SaldoF from cuentas
  2.  

y si quieres hacer referencia aun campo calculado, no puedes hacerlo con un where
tienes que usar Having y es posible que sea necesario agrupar por algun campo


Código: Text
  1. SELECT(Sum(Total_lb)-44) As TotalLb From chl_tb
  2. GROUP BY <campo>
  3. HAVING (Sum(Total_lb)-44) > 44
  4.  


esa la resuelves como subconsulta en otra consulta para que puedas utilizarla, espero te sirva almenos de orientacion ya que no tengo de momento manera de probarlo en una bd


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #6 en: Sábado 19 de Mayo de 2007, 04:51 »
0
Epale F_Tanori que tal como va todo, y la familia bien? a que bueno me alegro, que siga asi entonces  ^_^

Con eso que expones ya tengo plan B  :lol:

El plan A al cual había recurrido es el siguiente, con esta SQL de siempre:
Código: Text
  1.  
  2.         SQL2 = "Select Sum(AM_lb) AS AM1, Sum(PM_lb) AS PM1, Sum(Total_lb) As Total1, "
  3.         SQL2 = SQL2 & "Sum(AM_ext_d) As AM2, Sum(PM_ext_d) As PM2, Sum(Total_ext_d) As Total2, "
  4.         SQL2 = SQL2 & "Sum(AM_ext_n) As AM3, Sum(PM_ext_n) As PM3, Sum(Total_ext_n) As Total3 "
  5.         SQL2 = SQL2 & "From chl_tb "
  6.         SQL2 = SQL2 & "Where NumEmp=" & TxtNEmp.Text & " And "
  7.         SQL2 = SQL2 & "Fecha Between #" & Format(DTPFecha1.Value, "yyyy-mm-dd") & "# And #" & Format(DTPFecha2.Value, "yyyy-mm-dd") & "# "
  8.  
  9. Data2.RecordSource = SQL2
  10. Data2.Refresh
  11.  
  12.  

Y de esa SQL meti sus Alias en unos Labels así:
Citar
        Dim AMLb As Double
        Dim PMLb As Double
        Dim TotalLb As Double
        Dim Clausula26 As Double
        Dim AMextD As Double
        Dim PMextD As Double
        Dim TotalextD As Double
        Dim AMextN As Double
        Dim PMextN As Double
        Dim TotalextN As Double
       
        With Data2.Recordset
            While Not .EOF
                '.......................................
                'AM: (Horario Laboral Normal)
                If IsNumeric(![AM1]) = False Then
                    Exit Sub
                Else
                    AMLb = Val(AMLb) + Val(![AM1])
                End If
                '.......................................
                'PM: (Horario Laboral Normal)
                If IsNumeric(![PM1]) = False Then
                    Exit Sub
                Else
                    PMLb = Val(PMLb) + Val(![PM1])
                End If
                '.......................................
                'Total1: (Total Horas Laboradas)
                If IsNumeric(![Total1]) = False Then
                    Exit Sub
                Else
                    TotalLb = TotalLb + Val(![Total1])
                End If
                '.......................................
                'Clausula 26:
                If IsNumeric(![Total1]) = False Then
                    Exit Sub
                End If
               
                If Val(![Total1]) > 44 Then
                    Clausula26 = Clausula26 + Val(![Total1]) - 44
                Else
                    Clausula26 = 0
                End If
               

                '.......................................
                'AM Extra Diurna:
                If IsNumeric(![AM2]) = False Then
                    Exit Sub
                Else
                    AMextD = AMextD + Val(![AM2])
                End If
                '.......................................
                'PM Extra Diurna:
                If IsNumeric(![PM2]) = False Then
                    Exit Sub
                Else
                    PMextD = PMextD + Val(![PM2])
                End If
                '.......................................
                'Total Extra Diurnas:
                If IsNumeric(![Total2]) = False Then
                    Exit Sub
                Else
                    TotalextD = TotalextD + Val(![Total2])
                End If
                '.......................................
                'AM Extra Nocturna:
                If IsNumeric(![AM3]) = False Then
                    Exit Sub
                Else
                    AMextN = AMextN + Val(![AM3])
                End If
                '.......................................
                'PM Extra Nocturna:
                If IsNumeric(![PM3]) = False Then
                    Exit Sub
                Else
                    PMextN = PMextN + Val(![PM3])
                End If
                '.......................................
                'Total Extra Nocturna:
                If IsNumeric(![Total3]) = False Then
                    Exit Sub
                Else
                    TotalextN = TotalextN + Val(![Total3])
                End If
                '.......................................
                .MoveNext
            Wend
        End With
        LbAM1.Caption = AMLb
        LbPM1.Caption = PMLb
        LbTotal1.Caption = TotalLb
    LbClau26.Caption = Clausula26
        LbAM2.Caption = AMextD
        LbPM2.Caption = PMextD
        LbTotal2.Caption = TotalextD
        LbAM3.Caption = AMextN
        LbPM3.Caption = PMextN
        LbTotal3.Caption = TotalextN

Los Exit Sub entre ellas es porque cuando la SQL2 no encuentra nada en el rango de fechas, entonces daba error de Null. Estos Labels están abajo de un MSFlexGrid el cual es el que muestra la consulta de la tabla, generado por una SQL1. Estos Labels son Totales de columna del MSFlexGrid pero exactamente de la Tabla de la BD, la grilla solo se lo trae.

Pero con esto ultimo he visto que los Totales no sirven para decimales ya que esos Labels de Totales hacen esto: 1 + 1.5 = 2  

Yo creo que pondre en comentarios el Plan A y pasare a tu Plan B de "rompa el vidrio en caso de emergencia" y que quede lo que por fin sirva al 100% sin fallos :unsure:

PD: Estos totales solo salen en la ventana (Form) no se guardan en la BD, se generan en base a los datos de la BD pero no se guardan. Si salen en un reporte. Gracias a las funciones de Crystal eso del TotalLB>44 si se hace bien en el reporte, me costó pero ya se guardan decimales en la BD antes tambien caían redondeados como enteros, ya había provado con CDec(), CDbl(), CCur(), si salian los decimales pero se guardaban en la BD valores enteros, pero ya, ahora si se guardan decimales.  Todo estos datos son de Horas, al hablar de decimales es por lo que trabajar 1 y 1/2 siendo asi 1.5 (una hora y media)  En pocas palabras mi problme es realmente dos, decimales (2 digitos) sin redondeo y ese susodicho dato de Clausula26 y es todo y lo único que me falta para cerrar ese capitulo <_< jum!
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #7 en: Sábado 19 de Mayo de 2007, 23:07 »
0
Parece que ya esta resuelto  B)

Queria seguir probando con lo que ya tenia armado, me daba cosa probar de 0 con otra cosa distinta desde el comienzo, asi que ahí dandole a ver que podía arreglar de lo montado.

Cambie el:
AMLb = Val(AMLb) + Val(![AM1])

Por un leve ajuste:
AMLb = Format(CCur(AMLb) + CCur(![AM1]), standard)

E igual con los demás, y ya muestra decimales.

Todo listo, muchas gracias muchachos  :comp:

Ahora solo me queda resolver el redondeo de decimales en Crystal.
Aun indicando a cada campo del reporte, el Formato de decimal y aun trayendose los datos (que si estan en decimal) de la Tabla de la BD, Crystal los muestra como enteros y las Formulas de Sumatoria de Crystal me redondean esos datos, parece la historia sin fin  <_<
Pero al menos ya el programa se liberó del problema  :kicking:
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #8 en: Domingo 20 de Mayo de 2007, 20:08 »
0
Lo siento pero lo expuesto aquí anteriormente no dio resultado, se perdia la conexión (link) con los campos de la tabla, quedando de esa forma, un reporte en blanco, seguire intentando con la esperanza de por fin encontrar la solucion de esto.  :(
Si esto es Leído por accidente, induzca al vomito

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #9 en: Lunes 21 de Mayo de 2007, 06:46 »
0
Hola UserCode


haz probado hacer algo como


<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]SELECT[/color] Sum(AM_lb) AS AM1, Sum(PM_lb) AS PM1, Sum(Total_lb) AS Total1, IIf(Sum([Clausula])>44,Sum([Clausula])-44,0) AS Clau26, Sum(AM_ext_d) AS AM2, Sum(PM_ext_d) AS PM2, Sum(Total_ext_d) AS Total2, Sum(AM_ext_n) AS AM3, Sum(PM_ext_n) AS PM3, Sum(Total_ext_n) AS Total3
FROM chl_tb; <!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->


prueba lo a ver si te sirve  :)

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Decisiones Tipo If Else Resultado
« Respuesta #10 en: Lunes 21 de Mayo de 2007, 06:59 »
0
Si, si funciona  :)

Bueno yo ya le había dado la vuelta por otra vía pero ya copie el Query, veo que te sentaste al pc  :comp: y le diste al asunto, Thank's man  B)

Por cierto, lo de Crystal que me dio y luego parecia que no, pues volvio a dar  :lol:
Decimales redondeados, todo con formula para evitar ese redondeo

El campo lo meti en formula, esta:
ToText(tabla.campo)

Y su suma pues en otra formula:
Sum(tabla.campo)

Lo que si es extraño y me ha pasado es que al indicar Sumatoria de un campo desde Crystal (menú de botones o boton derecho sobre el campo; no por formula) me lo redondea, pero el indicado por Formula no me lo redondea  :blink:

Pero el Crystal me sacaba luego un error, pero era por link entre las tablas del reporte., siempre el Crystal ha dado su lata en eso de los links entre tablas del reporte haciendo que el reprote no trabaje, pero las tablas estan bien como estan, no puedo complacer al Crystal en eso, cambie los links entre tablas y... pues, ya sale otra vez, espero que se quede asi. Los datos presentes y decimalmente  :P

Bueno ya es Lunes, así que me furulo -_-
Nuevamente gracias, ese Query está tremendo  :good:
Si esto es Leído por accidente, induzca al vomito