Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como hacer un commit dentro de un procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=26759)

altp 02-11-2005 20:29:17

Como hacer un commit dentro de un procedimiento almacenado
 
Ante todo buenas tardes.

Mi problema es el siguiente:

Tengo un procedimiento almacenado en el cual creo una Factura, el identificador de factura se lo paso a otro procedimiento almacenado para que me cree el recibo correspondiente, pero en éste procedimiento cuando hago un Select con el identificador pasado a la tabla de facturas no me encuentra nada porque aún la factura no existe.

¿Como puedo hacer para pegar la factura antes de intentar crear los recibos?

No sé si mi habré explicado bien (espero que sí)

Gracias

lucasarts_18 02-11-2005 20:58:22

Hola:

Antes de pasar ese valor, haces un insert con todos los datos de la factura y luego pasas ese parámetro al otro procedimiento, los commit conviene controlarlos desde la aplicación.

Hasta Luego -

altp 03-11-2005 09:53:24

Gracias Lucas por responder.

Eso es exactamente lo que hago, primero el insert de la factura y después llamo al otro procedimiento.

Todo lo hago en un procedimiento almacenado para no hacer tantas llamadas a la base de datos.

Te voy a poner un trozo de código para que lo veas:

Código:

        Insert into FAC_CLI (ID_FAC_CLI, NFACTURA, FECHA, ID_CLI,
CODIGO_FOR_PAG, ID_ALM, IMPORTE, DESCUENTO, ID_EJE)

Código:

        execute procedure PasarRecibos :sId, :eEmpresa;
Y luego en el otro procedimiento:

Código:

  Select FAC_CLI.IMPORTE, FAC_CLI.FECHA, REC_CLI.DIA_PAGO_MES,
REC_CLI.ID_BAN_CLI, REC_CLI.CODIGO_PRE_REC, REC_CLI.CODIGO_ORD_REC,
FOR_PAG.PRIVENCIMIENTO, FOR_PAG.NVENCIMIENTO, FOR_PAG.INTERVALO,
FOR_PAG.RECIBO from FAC_CLI

Código:

  inner join FOR_PAG on
FOR_PAG.CODIGO = FAC_CLI.CODIGO_FOR_PAG

Código:

  inner join
REC_CLI on REC_CLI.ID_CLI = FAC_CLI.ID_CLI

Código:

  where
FAC_CLI.ID_FAC_CLI = :sId

Código:

  into :vIMPORTE, :vFECHA, :vDIA_PAGO_MES, :vID_BAN_CLI,
:vCODIGO_PRE_REC, :vCODIGO_ORD_REC, :vPRIVENCIMIENTO,
:vNVENCIMIENTO, :vINTERVALO, :vRECIBO;

Código:

If (NRECIBO = 1) then begin
Aquí es donde empieza los errores, pues están todos los valores devueltos a Null.

Si me pueden ayudar, gracias.

lucasarts_18 03-11-2005 14:35:50

Cita:

Empezado por altp
Aquí es donde empieza los errores, pues están todos los valores
devueltos a Null.

Seguro que la consulta está mala :)

Código SQL [-]
 
 Select FAC_CLI.IMPORTE, FAC_CLI.FECHA,
   REC_CLI.DIA_PAGO_MES, REC_CLI.ID_BAN_CLI,
   REC_CLI.CODIGO_PRE_REC, REC_CLI.CODIGO_ORD_REC, FOR_PAG.PRIVENCIMIENTO, FOR_PAG.NVENCIMIENTO,
   FOR_PAG.INTERVALO, FOR_PAG.RECIBO 
   from FAC_CLI, FOR_PAG
    where FAC_CLI.ID_FAC_CLI = :sId 
     and FOR_PAG.CODIGO = FAC_CLI.CODIGO_FOR_PAG 
     and REC_CLI.ID_CLI = FAC_CLI.ID_CLI
  into :vIMPORTE, :vFECHA, :vDIA_PAGO_MES, :vID_BAN_CLI,     :vCODIGO_PRE_REC,:vCODIGO_ORD_REC, :vPRIVENCIMIENTO,
   :vNVENCIMIENTO, :vINTERVALO, :vRECIBO;

Revisa bien la consulta.
Te recomiendo que llenes algunos datos en las tablas y
juegues con los SQL, en defitiva debes armar bien la consulta

Hasta Luego -

altp 03-11-2005 16:14:18

Gracias por responder.

La consulta está bien, porque está probada y demás.

Intentaré explicarme un poco mejor.

Creo que cuando hago esa consulta no está pegado todavía el insert que se hizo anteriormente, o se hace automáticamente cuando están en procedimientos almacenados? Por eso la pregunta de como hacer un commit dentro de un procedimiento almacenado (pegarlo físicamente para que la consulta me encuentre algo).

No sé si me explico, espero que sí y también espero que me echeis un cable, plis.

Gracias

jachguate 03-11-2005 18:03:16

  1. En tu caso el insert y el select se ejecutan en el contexto de la misma transacción, por lo que no es necesario un commit para que el select encuentre los datos insertados en la tabla. Podes comprobarlo haciendo, en isql o cualquier otro utilitario (sin auto commit), simulando el insert y luego el select sobre la tabla). De alli que te digan que el select está malo. Si el select está bien, lo que está mal es el insert :D
  2. No es recomendable (y en muchos motores no es posible) hacer un commit desde dentro de un procedimiento almacenado. Como ya alguien ha dicho también, el control de transacciones debiera llevarse desde fuera.

Hasta luego.

;)

altp 03-11-2005 18:21:32

Gracias por responder.

Seguiré mirandolo y ya os contaré.

Mil gracias.


La franja horaria es GMT +2. Ahora son las 00:54:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi