Clipper On Line • Ver Tópico - Firebird com ADO (xHarbour)

Firebird com ADO (xHarbour)

Discussão sobre SQL

Moderador: Moderadores

 

Firebird com ADO (xHarbour)

Mensagempor Adson » 13 Jan 2022 11:15

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 ?

      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
Nota de Moderação:
Itamar M. Lins Jr.: 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.
Avatar de usuário

Adson
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 33
Data de registro: 05 Mar 2019 10:36
Cidade/Estado: GOIANIA/GO
Curtiu: 38 vezes
Mens.Curtidas: 4 vezes

Firebird com ADO (xHarbour)

Mensagempor alxsts » 13 Jan 2022 11:52

Olá!

Nunca mexi com Firebird. Tente retornar o valor convertido para um tipo de dados "mais padrão":
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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Firebird com ADO (xHarbour)

Mensagempor Adson » 13 Jan 2022 12:04

alxsts escreveu:Olá!

Nunca mexi com Firebird. Tente retornar o valor convertido para um tipo de dados "mais padrão":
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!!!!!
Avatar de usuário

Adson
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 33
Data de registro: 05 Mar 2019 10:36
Cidade/Estado: GOIANIA/GO
Curtiu: 38 vezes
Mens.Curtidas: 4 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro