El otro día viendo el programa de Walter vi un campo que es
CURRENT_TRANSACTION que no sabia bien para que era utilizado.
Pues bien se puede usar para resolver este tema del ID asignado.
Una opción sería la siguiente:
***********************************
* abro la conexion en el cliente
m.cStr =
"User=SYSDBA;Password=masterkey;Database=MyDB;DataSource=localhost;
Port=3050;Dialect=3; Charset=NONE;Role=;Connection
lifetime=15;Pooling=true; MinPoolSize=0;MaxPoolSize=50;Packet
Size=8192;ServerType=0;"
m.nCon = SQLSTRINGCONNECT(m.cStr)
SQLSETPROP(m.nCon,"Transactions",2) && pongo la transaction en modo
explicito...
* obtengo el número de transaction de Firebird
SQLExec(m.nCon,"select CURRENT_TRANSACTION from rdb$database",'_aux")
m.CT = _aux.CURRENT_TRANSACTION
USE IN _aux
IF 1=SQLExec(m.nCon,"INSERT INTO MiTabla (Nombre,Saldo,current_trn)
Values (?m.cNombre,?m.nSaldo,CURRENT_TRANSACTION)") .... && hago el
INSERT...
* suponiendo que el ID no lo paso por que se asigna en forma
automática via un TRIGGER con un Generator
* en la tabla debo tener un campo que sea current_trn integer (debe
estar indexado por perfomance) y le grabo el valor CURRENT_TRANSACTION
* luego desde el cliente sabemos la conexión "viva" que se está
utilizando hacemos:
IF 1=SQLCOMMITI(m.nCon)
SQLExec(m.nCon,"select max(id) as id from MiTabla where
current_trn = ?m.CT","_aux")
MESSAGEBOX("El ID es "+TRANSFORM(_
aux.id))
USE IN _aux
ENDIF
ELSE
SQLROLLBACK(m.nCon)
ENDIF
ENDIF
* Cierro la conexion
SQLDISCONNECT(m.nCon)
***********************************
saludos