Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-11-2005
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
Exclamation 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
Responder Con Cita
  #2  
Antiguo 02-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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 -
__________________
No todo es como parece ser...
Responder Con Cita
  #3  
Antiguo 03-11-2005
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
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.

Última edición por jachguate fecha: 03-11-2005 a las 18:05:58. Razón: Quitar las líneas kilometricas de la etiqueta code, para evitar el scroll horizontal
Responder Con Cita
  #4  
Antiguo 03-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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 -
__________________
No todo es como parece ser...
Responder Con Cita
  #5  
Antiguo 03-11-2005
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 03-11-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
  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
  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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 03-11-2005
altp altp is offline
Miembro
 
Registrado: sep 2003
Posts: 131
Poder: 21
altp Va por buen camino
Gracias por responder.

Seguiré mirandolo y ya os contaré.

Mil gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:28:30.


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
Copyright 1996-2007 Club Delphi