Problema:
Aquest canvis son necesaris degut a que utilitzem els controladors ODBC de firebird v 2.0.0.148, aquesta versio i les posteriors tenen un bug que fa que no es produiexi el commit despres d'executar un stored procedure. Fins ara per evitar aquest problema cridavem el procediments amb un select * from nomdelprocediement, pero tot i aixi no acababa de funcionar al 100%.
Exemple:
lcsql = [select * from procediment(?param1,?param2)]
x=sqlexec(Thisform.nconexio, lcsql, "tmpcurs")
If x<1
Thisform.errodbc(Message(),"UPD")
Return 0
Endif
* Tambe es aplicable a la utilitzacio del metode alternatiu de crida del procediment:
lcsql = [execute procedure procediment(?param1,?param2)]
Si executem aquest codi i el procediement efectua canvis a la base de dades (inserts,deletes,updates), aquest canvis no serán grabats (COMMIT) fins que ho fem explicitament nosaltes. Aquest comportament provoca que es produeixin deadlocks als altres terminals que volen llegir/actualitzar les dadades que encara no han set grabades.
nota: El procediments que es criden dintre d'una transacció manual no es veuen afectats per aquest problema ja que nosaltres efectuem el commit o rollbak al final de proces.
aux = SQLSETPROP(ThisForm.nConexio,'Transactions',2)
lcsql = [select * from procediment(?param1,?param2]
x=sqlexec(Thisform.nconexio, lcsql, "tmpcurs")
If x<1
aux = SQLROLLBACK(ThisForm.nConexio)
Thisform.errodbc(Message(),"UPD")
ELSE
aux = SQLCOMMIT(ThisForm.nConexio)
Endif
aux = SQLSETPROP(ThisForm.nConexio,'Transactions',1)
Solució:
Per evitar aquest problema haurem d'afegir la instruccio commit al final de la crida del procediment, exemple:
lcsql = [select * from procediment(?param1,?param2)]
x=sqlexec(Thisform.nconexio, lcsql, "tmpcurs")
If x<1
Thisform.errodbc(Message(),"UPD")
Return 0
Else
x=sqlexec(Thisform.nconexio, "COMMIT")
Endif