Ir al contenido


Foto

Sentencia de Oracle a Firebird


  • Por favor identifícate para responder
1 respuesta en este tema

#1 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 08 diciembre 2010 - 03:29

Saludos.

Tengo la siguiente sentencia en ORACLE


sql
  1. SELECT A.NOMBRE NOMINA_ACTUAL,
  2.       B.NOMBRE NOMINA_ANTERIOR,
  3.       A.TIPO,
  4.       NVL(A.NOMBRE_COMPLETO, B.NOMBRE_COMPLETO) NOMBRE_COMPLETO,
  5.       NVL(A.TRANSACCION, B.TRANSACCION) TRANSACCION,
  6.       NVL(A.MONTO, 0) MONTO_ACTUAL,
  7.       NVL(B.MONTO, 0) MONTO_ANTERIOR,
  8.       NVL(A.MONTO, 0) - NVL(B.MONTO, 0) DIFERENCIA,
  9.       CASE
  10.       WHEN NVL(A.MONTO, 0) - NVL(B.MONTO, 0) > 0 THEN 'Aumento'
  11.       WHEN NVL(A.MONTO, 0) - NVL(B.MONTO, 0) < 0 THEN 'Disminución'
  12.       ELSE 'N/A' END EFECTO,
  13.       CASE
  14.       WHEN ((A.ID_TRANSACCION = :TRXSALARIO) OR (B.ID_TRANSACCION = :TRXSALARIO)) AND (NVL(A.MONTO, 0) - NVL(B.MONTO, 0) > 0) AND (NVL(B.MONTO, 0) = 0)  THEN 'Contratación'
  15.       WHEN ((A.ID_TRANSACCION = :TRXSALARIO) OR (B.ID_TRANSACCION = :TRXSALARIO)) AND (NVL(A.MONTO, 0) - NVL(B.MONTO, 0) > 0) AND (NVL(B.MONTO, 0) > 0)  THEN 'Aumento'
  16.       WHEN ((A.ID_TRANSACCION = :TRXSALARIO) OR (B.ID_TRANSACCION = :TRXSALARIO)) AND (NVL(A.MONTO, 0) - NVL(B.MONTO, 0) < 0) AND (NVL(A.MONTO, 0) = 0)  THEN 'Salida'
  17.       WHEN ((A.ID_TRANSACCION = :TRXSALARIO) OR (B.ID_TRANSACCION = :TRXSALARIO)) AND (NVL(A.MONTO, 0) - NVL(B.MONTO, 0) < 0) AND (NVL(A.MONTO, 0) > 0 AND NVL(B.MONTO, 0) > 0)  THEN 'Disminución'
  18.       ELSE '' END CAUSA
  19. FROM
  20. (
  21. SELECT A.NOMBRE, B.NOMBRE TIPO, D.NOMBRE_COMPLETO, E.NOMBRE TRANSACCION, A.TIPO_DE_NOMINA, C.ID_TRANSACCION,
  22. SUM(ABS(C.MONTO)) MONTO
  23. FROM MAESTRO_DE_NOMINAS A
  24. JOIN TIPOS_DE_NOMINAS B ON A.COMPANIA = B.COMPANIA AND A.TIPO_DE_NOMINA = B.TIPO_DE_NOMINA
  25. JOIN SUBDETALLE_DE_NOMINAS C ON A.ID_NOMINA = C.ID_NOMINA
  26. JOIN EMPLEADOS D ON C.ID_EMPLEADO = D.ID_EMPLEADO
  27. JOIN TRANSACCIONES_DE_NOMINAS E ON C.ID_TRANSACCION = E.ID_TRANSACCION
  28. WHERE A.COMPANIA = :COMPANIA
  29. AND A.TIPO_DE_NOMINA = :TIPO_DE_NOMINA
  30. AND A.ID_NOMINA = :ID_NOMINA
  31. AND INSTR(','|| :ID_TRANSACCION ||',' , ','|| C.ID_TRANSACCION ||',') > 0
  32. GROUP BY A.NOMBRE, B.NOMBRE, D.NOMBRE_COMPLETO, E.NOMBRE, A.TIPO_DE_NOMINA, C.ID_TRANSACCION ) A FULL JOIN
  33.  
  34. (
  35. SELECT A.NOMBRE, B.NOMBRE TIPO, D.NOMBRE_COMPLETO, E.NOMBRE TRANSACCION, A.TIPO_DE_NOMINA, C.ID_TRANSACCION,
  36. SUM(ABS(C.MONTO)) MONTO
  37. FROM MAESTRO_DE_NOMINAS A
  38. JOIN TIPOS_DE_NOMINAS B ON A.COMPANIA = B.COMPANIA AND A.TIPO_DE_NOMINA = B.TIPO_DE_NOMINA
  39. JOIN SUBDETALLE_DE_NOMINAS C ON A.ID_NOMINA = C.ID_NOMINA
  40. JOIN EMPLEADOS D ON C.ID_EMPLEADO = D.ID_EMPLEADO
  41. JOIN TRANSACCIONES_DE_NOMINAS E ON C.ID_TRANSACCION = E.ID_TRANSACCION
  42. WHERE A.COMPANIA = :COMPANIA
  43. AND A.TIPO_DE_NOMINA = :TIPO_DE_NOMINA
  44. AND A.ID_NOMINA = :ID_NOMINA -1
  45. AND INSTR(','|| :ID_TRANSACCION ||',' , ','|| C.ID_TRANSACCION ||',') > 0
  46. GROUP BY A.NOMBRE, B.NOMBRE, D.NOMBRE_COMPLETO, E.NOMBRE, A.TIPO_DE_NOMINA, C.ID_TRANSACCION) B
  47. ON A.TIPO = B.TIPO
  48. AND A.NOMBRE_COMPLETO = B.NOMBRE_COMPLETO
  49. --AND A.TRANSACCION = B.TRANSACCION
  50. AND A.TIPO_DE_NOMINA = B.TIPO_DE_NOMINA
  51. AND A.ID_TRANSACCION = B.ID_TRANSACCION
  52. WHERE (NVL(A.MONTO, 0) - NVL(B.MONTO, 0)) <> 0
  53. ORDER BY A.TIPO, NVL(A.TRANSACCION, B.TRANSACCION), NVL(A.NOMBRE_COMPLETO, B.NOMBRE_COMPLETO)



Necesito llevarla a Firebird 1.5.3.
¿Cuál sería el camino mas corto?
P.D. Migrar a Firebird 2.x no es una opción.

Gracias anticipadas!
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 09 diciembre 2010 - 03:35

Hola Rolphy.

Como bien dices, el camino más corto es pasar a Firebird 2.1, ya que Firebird 1.5 no soporta consultas de consultas [select *** from (select ***)].

Aparte de eso no veo ningún problema. Puesto que la función NVL ya la tenemos como UDF, y si no queremos usar UDF's, basta con cambiarla por COALESCE.

Pero como dices que esta opción no es viable, entonces no veo otra opción que crear un procedimiento almacenado y hacer la consulta sobre ese sp : select * from consulta_oracle

En un procedimiento almacenado no habrá problemas para emular el comportamiento de un select *** from (select ***). Puesto que simplemente hay que hacer un bucle for select, y para cada registro, hacemos el correspondiente tratamiento de sus campos.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.