![]() |
Transacción no activa
Buenas tardes. A ver si me explico: Tengo dos tablas (Facturas Y Detfactura) en una base de datos FB; en la primera guardo los datos de cabecera de las facturas y en la segunda las líneas de detalle de cada una de ellas.
Para grabar en la primera tengo este query: En la misma tabla guardo albaranes y facturas por comodidad. Una vez que he guardado estos datos hago esto con otro query antes de grabar el detalle del documento: Lo curioso es que el primer query, el de grabación, se ejecuta sin problema pero al tratar de ejecutar el segundo para sacar el número de documento que se ha generado me da un error: me dice que la transacción asociada al query no está activa. El primer query tiene asociada una transacción que he llamado tTpv y el segundo otra distinta que he llamado tAuxiliar y que en ningún momento desactivo ni detengo ni nada. Llevo todo el día dándome de tortas con estas líneas de código y no sé por qué se produce ese error. En el formulario donde tengo declarada la BB.DD. y demás hay esto: ![]() Ejecutando con el depurador, antes de ejecutar el primer query puedo ver esto: ![]() Después del ExecSQL() queda así: ![]() La segunda transacción, que está activa, es la que está asociada al segundo query, pero me da ese error que indico. |
Al hacer Transaction->Commit / Rollback se cierra la transacción.
Luego de esto hay que hacer un Transaction->StartTransaction. Supongo que tienes una sola transacción asociada a la base de datos. En ese caso, suelo poner antes de hacer e Query código que inicia la transacción si está cerrada. Código:
if (not Auxiliar->Transaction.InTransaction) then |
También puedes ejecutar cada sql en una transacción distinta.
Yo lo hago así en Delphi:
|
Una solución ¿temporal? un poco chapucera, pero que funcionará:
Cambia esto: Query->Transaction->Commit(); Por Query->Transaction->CommitRetaining(); Y cuando salgas de la pantalla de ventas haces un commit para asegurarte de que se cierran todas las transacciones. |
Gracias por vuestras respuestas.
Cita:
![]() La otra sugerencia (StartTransaction) la había probado pero poniendo el código después del Close(); probaré como indicas. Cita:
No obstante, en el caso de querys sólo de consulta ¿es necesaria la transacción? Es una duda que siempre he tenido ya que estaba convencido que eran necesarias únicamente en caso de actualizar la BB.DD. Sé que tengo muchas carencias en estos temas y tiene que ver en al forma que he aprendido a programar, a puñetazos. :rolleyes: |
Cita:
Y funciona perfectamente. Se ve que fFacturas->Tag == 1 ?..., que siempre me ha funcionado bien, ha decidido que a partir de ahora ya no vale. |
Cita:
Un saludo. |
Tienes razón @olbeup. El campo debe devolverse como entero mediante .AsInteger. He adaptado a mano un código similar que tengo para obtener descripciones de cosas dado un código.
Lo de capturar la excepción depende del contexto. En este caso en particular yo prefiero dejar que la excepción llegue a evitar que se ejecute lo que venga dentrás. Es más fácil que hacer if resultado <> -1 then ... para cada petición.
|
| La franja horaria es GMT +2. Ahora son las 06:42:22. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi