1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Urgente Conexão ODBC estabelecida mas só consigo ler tabela

Discussão em 'Progress 4GL' iniciado por Felipe Amaral de Souza, Março 2, 2017.

  1. Felipe Amaral de Souza

    Felipe Amaral de Souza Membro Participativo

    Pessoal, boa tarde!

    Estabeleci uma conexão ODBC com um banco SQL de teste com sucesso e já estou acessando as tabelas via progress. Porém só consigo realizar buscas via select e não consigo escrever na tabela com mesmo tendo acesso de owner na tabela.

    Nenhum erro é apresentado, apenas o registro não é inserido/atualizado como deveria.

    Segue anexo o baca utilizado, alguém pode me dizer se temos que trocar algum parâmetro na execução da query quando for de update?

    Obrigado!

    Arquivos Anexados:

  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

  3. Felipe Amaral de Souza

    Felipe Amaral de Souza Membro Participativo

    Pessoal, consegui aqui. Era aspas em um campo.
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Ajudei em alguma coisa? rsrsrs
  5. Felipe Amaral de Souza

    Felipe Amaral de Souza Membro Participativo

    Ainda não mas pode agora. Estou montando uma api para conexão com um banco SQL e ler/atualizar tabelas de integração entre dois sistemas. Já estou realizando testes e até agora consegui realizar todas as operações CRUD. Estou testando o retorno para tratar no programa e me deparei com a seguinte situação:

    Quando eu crio um registro válido ele retorna ok, mas se logo depois tentar inserir o mesmo registro ele não cria fisicamente no banco mas retorna ok em vez de nok por chave duplicada. Se eu der um select qualquer e depois tentar criar esse mesmo registro daí ele retorna nok por chave duplicada. Não entendi o motivo deste funcionamento, poderia me ajudar? Provisoriamente eu estou realizando um pequeno select após o insert mas isso é cambiarra e pretendo contornar esta falha.

    Segue abaixo o código.

    Código:
    define variable chConnection  as com-handle no-undo.
    define variable chCommand     as com-handle no-undo.
    define variable ObjRecordSet  as com-handle no-undo.
    define variable ODBC-RecCount as inte       no-undo.
    define variable ODBC-Null     as char       no-undo.
    define variable ODBC-Cursor   as inte       no-undo.
    
    def var i-opcao as integer no-undo.
    def var c-sql as character no-undo.
    
    repeat:
       update i-opcao column-label '1-Create | 2-Read | 3-Update | 4-Delete | 5-Sair' with frame f1.
       if i-opcao = 5 then leave.
      
       case i-opcao:
          when 1 then assign c-sql = "insert into cliente(cod_cliente,nome_cliente,sigla_cliente) values(4,'Teste','TST')".
          when 2 then assign c-sql = "select * from cliente".
          when 3 then assign c-sql = "update cliente set nome_cliente = 'teste alterado', sigla_cliente = 'tsa' where cod_cliente = 4".
          when 4 then assign c-sql = "Delete from cliente where cod_cliente = 4".
       end case.
      
       /* conexão com o banco SQL via ODBC */
       create 'ADODB.Connection' chConnection.
       create 'ADODB.Command'    chCommand.
      
       chConnection:Open( 'data source=Teste_Felipe1', 'usuario', 'senha', 0 ) no-error.
       chCommand:ActiveConnection = chConnection no-error.
      
       if error-status:error then do:
          MESSAGE 'Ocorreram problemas na conexão com o banco de dados.'
             VIEW-AS ALERT-BOX ERROR BUTTONS OK TITLE 'Conexão'.
          return.
       end.
      
       /* execução da query solicitada */
       chCommand:CommandText = c-sql.
       chConnection:CursorLocation = 3.
       ObjRecordSet = chCommand:execute(output ODBC-Null, '', 32 ) no-error.
    
       case i-opcao:
          when 1 then do:
    
             if ODBC-Null = '1' then
                MESSAGE 'Registro criado com sucesso'
                   VIEW-AS ALERT-BOX INFO BUTTONS OK.
             else
                MESSAGE 'Registro não pode ser criado.'
                   VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
             chCommand:CommandText = "select * from cliente where cod_cliente = 5".
             chConnection:CursorLocation = 3.
             ObjRecordSet = chCommand:execute(output ODBC-Null, '', 32 ) no-error.
          end.
          when 2 then do:
             if ODBC-Null = '-1' then do:
                if ObjRecordSet:RecordCount > 0 then do:
               
                   ODBC-RecCount = ObjRecordSet:RecordCount.
                   ODBC-Cursor = 0.
                   ObjRecordSet:MoveFirst no-error.
                   do while ODBC-Cursor < ODBC-RecCount:
               
                      MESSAGE ObjRecordSet:fields('cod_cliente'):value   skip
                              ObjRecordSet:fields('nome_cliente'):value  skip
                              ObjRecordSet:fields('sigla_cliente'):value
                         VIEW-AS ALERT-BOX INFO BUTTONS OK.
               
                      ODBC-Cursor = ODBC-Cursor + 1.
                      ObjRecordSet:MoveNext no-error.
                   end.
                end.
             end.
             else do:
                MESSAGE 'Não há registros para listar.'
                   VIEW-AS ALERT-BOX INFO BUTTONS OK.
             end.
          end.
          when 3 then do:
             if ODBC-Null = '1' then
                MESSAGE 'Registro alterado com sucesso'
                   VIEW-AS ALERT-BOX INFO BUTTONS OK.
             else
                MESSAGE 'Registro não pode ser alterado.'
                   VIEW-AS ALERT-BOX INFO BUTTONS OK.
          end.
          when 4 then do:
             if ODBC-Null = '1' then
                MESSAGE 'Registro apagado com sucesso'
                   VIEW-AS ALERT-BOX INFO BUTTONS OK.
             else
                MESSAGE 'Registro não pode ser apagado.'
                   VIEW-AS ALERT-BOX INFO BUTTONS OK.
          end.
       end case.
      
       chConnection:Close no-error.        
       release object chConnection no-error.
       release object chCommand    no-error.
    end.
    Muito Obrigado!
    reissobr curtiu isso.
  6. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    É esse NO-ERROR que não exibe a mensagem:
    ObjRecordSet = chCommand:execute(output ODBC-Null, '', 32 ) no-error.

    Ou seja, você precisa exibir as mensagens de erros antes de verificar a "quantidade de registros afetados" que você chama de ODBC-Null.

    Código:
    DEF VAR xi AS INTEGER.
    IF ERROR-STATUS:ERROR THEN DO:
       DO xi = 1 TO ERROR-STATUS:NUM-MESSAGES.
          MESSAGE "Número: " + STRING(ERROR-STATUS:GET-NUMBER(xi)) SKIP
                  "Mensagem: " + ERROR-STATUS:GET-MESSAGE(xi)
                  VIEW-AS ALERT-BOX INFO BUTTONS OK.
       END.
    END.
    
    Felipe Amaral de Souza curtiu isso.

Compartilhe esta Página