Página 1 de 1

Firebird com ADO (xHarbour)

Enviado: 13 Jan 2022 11:15
por Adson
Olá, senhores(as):

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 ?

Código: Selecionar todos

      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:

Código: Selecionar todos

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:

Código: Selecionar todos

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

Firebird com ADO (xHarbour)

Enviado: 13 Jan 2022 11:52
por alxsts
Olá!

Nunca mexi com Firebird. Tente retornar o valor convertido para um tipo de dados "mais padrão":

Código: Selecionar todos

EXECUTE BLOCK RETURNS (xID NUMERIC(5,0)) 
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 Cast( ID AS NUMERIC(5,0) ) Into :xID; 
         Suspend; 
   End
Pode tentar também com DECIMAL(5,0)

Firebird com ADO (xHarbour)

Enviado: 13 Jan 2022 12:04
por Adson
alxsts escreveu:Olá!

Nunca mexi com Firebird. Tente retornar o valor convertido para um tipo de dados "mais padrão":

Código: Selecionar todos

EXECUTE BLOCK RETURNS (xID NUMERIC(5,0)) 
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 Cast( ID AS NUMERIC(5,0) ) Into :xID; 
         Suspend; 
   End
Pode tentar também com DECIMAL(5,0)
Muito obrigado. Deu certo com a sua sugestão!!!!!