Estou tentando atualizar um banco de dados FIREBIRD versão 3.0, e quando o registro for inserido/atualizado eu preciso obter o valor da PK para gravar em meu DBF.
No entanto, quando eu tento atribuir o valor retornado no objeto a um campo local, o sistema trava.
Alguém sabe me dizer o que pode estar errado ?
vSQL := 'EXECUTE BLOCK RETURNS (xID Integer) ' +LF+;
'AS ' +LF+;
' Begin ' +LF+;
' Update OR Insert InTo Produto (CD_PRODUTO , ' +LF+;
' DS_PRODUTO , ' +LF+;
' CD_BARRAS , ' +LF+;
' CD_NCM , ' +LF+;
' DS_APRESENTACAO , ' +LF+;
' QT_ESTOQUE , ' +LF+;
' VR_VENDANORMAL , ' +LF+;
' VR_VENDAPROMOCIONAL ) ' +LF+;
' Values (' + ALLTRIM(STR(VAL(PRODUTO->PRCODI))) + ', '+LF+;
AspaSimples(PRODUTO->PRDESC) + ', '+LF+;
AspaSimples(PRODUTO->CODBARRA) + ', '+LF+;
AspaSimples(PRODUTO->NCMSH) + ', '+LF+;
AspaSimples(PRODUTO->DS_APRESEN) + ', '+LF+;
ALLTRIM(STR(PRODUTO->PRESTQ)) + ', '+LF+;
ALLTRIM(STR(PRODUTO->PRCONS,12,2)) + ', '+LF+;
ALLTRIM(STR(PRODUTO->PRLIQ,12,2)) + ') '+LF+;
' Matching (CD_PRODUTO) ' +LF+;
' Returning ID Into :xID; ' +LF+;
' Suspend; ' +LF+;
' End'
TRY
oCursor := oConnectFB:Execute(vSQL)
id_produto := oCursor:Fields['xID']:Value // o travamento ocorre nesse momento <<<<<<<<<<
oCursor:Close()
If id_produto # NIL .AND. PRODUTO->ID_BANCOFB # id_produto
WHILE PRODUTO->( !BloqReg(0) ) ; END
PRODUTO->ID_BANCOFB := id_produto
PRODUTO->( dbCommit() )
PRODUTO->( dbUnLock() )
EndIf
CATCH oError
NAPP_GravarLog( ">>> 3 - ERRO AO ATUALIZAR O BANCO. TABELA: PRODUTO " + PROCNAME() + " ERRO: "+oError:Description + LF + vSQL + LF )
END
Obs:
- Não há erro no script (vSQL), pois quando executo-o no Flamerobin, dá certo. O travamento ocorre quando vou fazer a seguinte atribuição: id_produto := oCursor:Fields['xID']:Value
- O campo ID é um campo auto-incremento da tabela PRODUTO
Exemplo:
EXECUTE BLOCK RETURNS (xID Integer)
AS
Begin
Update OR Insert InTo Produto (CD_PRODUTO ,
DS_PRODUTO ,
CD_BARRAS ,
CD_NCM ,
DS_APRESENTACAO ,
QT_ESTOQUE ,
VR_VENDANORMAL ,
VR_VENDAPROMOCIONAL )
Values (1341,
'METIOTRAT 30ML',
'7898133137419',
'30049047',
'TESTE',
1.000,
10.00,
8.59)
Matching (CD_PRODUTO)
Returning ID Into :xID;
Suspend;
End
Script de criação da tabela PRODUTO:
CREATE TABLE PRODUTO (
ID INTEGER GENERATED BY DEFAULT AS IDENTITY,
CD_PRODUTO INTEGER NOT NULL,
DS_PRODUTO VARCHAR(60) NOT NULL,
CD_BARRAS VARCHAR(14),
CD_NCM VARCHAR(8),
DS_APRESENTACAO VARCHAR(60),
QT_ESTOQUE NUMERIC(15,3) NOT NULL,
VR_VENDANORMAL NUMERIC(15,2) NOT NULL,
VR_VENDAPROMOCIONAL NUMERIC(15,2) NOT NULL
);
ALTER TABLE PRODUTO ADD PRIMARY KEY (ID);
CREATE UNIQUE INDEX IDX_PRODUTO_1 ON PRODUTO (CD_PRODUTO);
GRANT SELECT ON MON$ATTACHMENTS TO PUBLIC;
GRANT SELECT ON MON$CALL_STACK TO PUBLIC;
GRANT SELECT ON MON$CONTEXT_VARIABLES TO PUBLIC;
GRANT SELECT ON MON$DATABASE TO PUBLIC;
GRANT SELECT ON MON$IO_STATS TO PUBLIC;
GRANT SELECT ON MON$MEMORY_USAGE TO PUBLIC;
GRANT SELECT ON MON$RECORD_STATS TO PUBLIC;
GRANT SELECT ON MON$STATEMENTS TO PUBLIC;
GRANT SELECT ON MON$TABLE_STATS TO PUBLIC;
GRANT SELECT ON MON$TRANSACTIONS TO PUBLIC;
Uso: xHarbour 1.2.3 + HWGUI