Firebird com ADO (xHarbour)

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
Adson
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 05 Mar 2019 10:36
Localização: GOIANIA/GO

Firebird com ADO (xHarbour)

Mensagem 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
Editado pela última vez por Itamar M. Lins Jr. em 16 Jan 2022 16:28, em um total de 1 vez.
Razão: O presente tópico foi movido da seção HwGui, uma vez que seu conteúdo não tem relação com os objetivos daquela seção, onde só podem constar dúvidas técnicas de programação diretamente relacionadas com a HwGui.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Firebird com ADO (xHarbour)

Mensagem 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)
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Adson
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 05 Mar 2019 10:36
Localização: GOIANIA/GO

Firebird com ADO (xHarbour)

Mensagem 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!!!!!
Responder