Urgente Progress com ADO

Discussão em 'Progress 4GL' iniciado por eder.luca2012, Agosto 26, 2015.

  1. eder.luca2012

    eder.luca2012 Membro Participativo

    Pessoal alguem teria como me passar um exemplo simples de um programa progress que se conecta à outro banco via ADO ODBC? sei fazer via Dataserver ODBC mas não esta muito legal gostaria de experimentar via ado alguem poderia me ajudar?
  2. rhemati

    rhemati Membro Participativo

    @eder.luca2012 , bom dia. blz.

    Seria mais ou menos assim... eu estou procurando outro código que eu tenho aqui para lhe mostrar como modelo.

    Código:
    Def Var v_cod_dominio     As Char       Format "x(24)" No-undo.
    Def Var cCancelou         As Log        Initial No     No-undo.
    Def Var v_cod_dns_inter   As Char                      No-undo.
    Def Var cDC               As Char       Format 'x(25)' No-undo.
    Def Var iCont             As Int                       No-undo.
    Def Var chConn            As Com-handle                No-undo.
    Def Var chRS              As Com-handle                No-undo.
    Def Var cQuery            As Char                      No-undo.
    Def Var iRecordsAffected  As Int                       No-undo.
    Def Var iOptions          As Int                       No-undo.
    def var c_usuario         as char.
    
        Assign  v_cod_dns_inter = Os-getenv('USERDNSDOMAIN':U)
                cDC = ''.
    
        Do iCont = 1 To Num-entries(v_cod_dns_inter,'.'):
           If cDC = ''
              Then Assign cDC = 'dc=' + Entry(iCont,v_cod_dns_inter,'.').
              Else Assign cDC = cDC + ',dc=' + Entry(iCont,v_cod_dns_inter,'.').
        End.
    
        /* --- Autenticação no SO - */
        Create 'ADODB.Connection':U chConn No-error.
        chConn:Provider = 'ADsDSOObject':U.
        chConn:Open ('ADs Providers':U, 'rhema.go' + '~\':U + 'cristiano.amaral' , 'Passwd123' , -1).
    
        Create 'ADODB.Recordset':U chRS No-error.
        cQuery = "SELECT * FROM 'LDAP://":U + cDC + "'":U.
        chRS = chConn:Execute(cQuery,Output iRecordsAffected,iOptions) No-error.
        If  Not Valid-handle(chRS) Then Do:
            Message 'Não foi possível efetuar Autenticação do seu Usuário na rede.'
                    skip
                    'Favor verificar a causa nos possíveis erros listados abaixo:'
                    SKIP(2)
                    '1.) O Usuário informado está incorreto.'
                    SKIP
                    '2.) A Senha informada para o Usuário está incorreta.'
                    SKIP
                    '3.) A opção "CAPs LOCK" está selecionada no teclado.'
                    SKIP
                    '4.) O Usuário está bloqueado no Sistema Operacional por excesso de tentativas incorretas de Login.'
                    SKIP(2)
                    'Tente efetuar o Login novamente e caso os erros persistam, entre em contato com o Administrador do seu ambiente.'
                    View-as Alert-box Error Buttons Ok Title 'A T E N Ç Ã O'.
           
            return no-apply.
        End.
    
    lhp.s curtiu isso.
  3. rhemati

    rhemati Membro Participativo

    Achei este aqui.
    Dá uma olhada também. Um dos dois vai resolver o seu problema.

    Código:
    /* Variaveis para uso do ODBC */
    Def var ObjRecordSet    as com-handle  no-undo.
    Def var ObjConnection   as com-handle  no-undo.
    Def var ObjCommand      as com-handle  no-undo.
    Def var ODBC-DSN        as character   no-undo.
    Def var ODBC-SERVER     as character   no-undo.
    Def var ODBC-USERID     as character   no-undo.
    Def var ODBC-PASSWD     as character   no-undo.
    Def var ODBC-QUERY      as character   format '300' no-undo.
    Def var ODBC-STATUS     as character   no-undo.
    Def var ODBC-RECCOUNT   as integer     no-undo.
    Def var ODBC-NULL       as character   no-undo.
    Def var ODBC-CURSOR     as integer     no-undo.
    
    def var l-ok-conecta    as log initial no.
    def var l-ok-atualiza   as log initial no.
    def var c-observacao                as char no-undo.
    def var i-codigo-empresa            as int no-undo.
    def var c-codigo-estabelecimento    as char no-undo.
    
    def temp-table tt-dados
        field codigo-empresa            as int
        field codigo-estabelecimento    as char
        field observacao                as char
        .
       
        l-ok-conecta = FALSE.
        RUN pi-conecta-odbc (INPUT-OUTPUT l-ok-conecta).
       
        IF l-ok-conecta <> TRUE THEN DO:
            output to 'c:\erros-conexao.txt' convert target 'iso8859-1' append.
                put 'Não foi possível fazer a conexão com o SQL Server' + string( today, '99-99-9999' ) + '-' + replace( string( time, 'HH:MM:SS' ), ':', '-' ) format 'x(250)' skip.
            output close.
              
           MESSAGE "Não foi possível fazer a conexão com o SQL Server!" SKIP
                   "Favor tentar saindo do programa e entrando novamente."
                   VIEW-AS ALERT-BOX WARNING TITLE " ATENÇÃO".
           RETURN NO-APPLY.
       
        END.
    
    
    PROCEDURE pi-conecta-odbc:
        DEF INPUT-OUTPUT PARAMETER p-ok  AS LOG.
    
        empty temp-table tt-dados.
      
        /* Create the connection object for the link to SQL */
        Create "ADODB.Connection" ObjConnection.
      
        /* Create a recordset object ready to return the data */
        Create "ADODB.RecordSet" ObjRecordSet.
      
        /* Create a command object for sending the SQL statement */
        Create "ADODB.Command" ObjCommand.
      
        /* Change the below values as necessary */
        /* mm/dd/yyyy */
           
        Assign  ODBC-DSN    =   'SRVALPHA'        /* The ODBC DSN */
                ODBC-SERVER =   '192.168.1.1'     /* The name of the server hosting the SQL DB and DSN  DW1 10.1.0.95*/
                ODBC-USERID =   'usuario'   /* The user id for access to the SQL Database */
                ODBC-PASSWD =   'senha'  /* Password required by above user-id */
                ODBC-QUERY  =   'SELECT codigo-empresa, codigo-estabelecimento'
                ODBC-QUERY  =   ODBC-QUERY + 'observacao'
                ODBC-QUERY  =   ODBC-QUERY + 'FROM         tabela '
                ODBC-QUERY  =   ODBC-QUERY + 'WHERE     (codigo-empresa = 5) '
                ODBC-QUERY  =   ODBC-QUERY + ' order by codigo-empresa'.
      
        /* Open up the connecti.on to the ODBC Layer */
        ObjConnection:Open ( "data source=" + ODBC-DSN + ";server=" + ODBC-SERVER, ODBC-USERID, ODBC-PASSWD, 0 ) no-error.
    
        output to 'c:\temp\odbc-query-conexao.txt' convert target 'iso8859-1' append.
            put ODBC-QUERY format 'x(800)' skip.
        output close.
    
        /* Inicializando o arquivo */
    
        /* Check for connection errors */
        If ( error-status:num-messages > 0 ) then DO:
            output to 'c:\temp\erros-conexao.txt' convert target 'iso8859-1' append.
                put 'Favor configurar corretamente o Drive ODBC' + string( today, '99-99-9999' ) + '-' + replace( string( time, 'HH:MM:SS' ), ':', '-' ) format 'x(250)' skip.
            output close.
    
          /*MESSAGE "Falha na conexão!" SKIP
                  "Favor configurar corretamente o Drive ODBC."
                  VIEW-AS ALERT-BOX ERROR TITLE " ERRO".*/
         
          ODBC-STATUS = "Error: Could not establish connection.".
       END.
       Else DO:
          Assign ObjCommand:ActiveConnection  =   ObjConnection
                 ObjCommand:CommandText       =   ODBC-QUERY
                 ObjCommand:CommandType       =   1 /* adCmdText */
                 ObjConnection:CursorLocation =   3 /* adUseClient */
                 ObjRecordSet:CursorType      =   3 /* adOpenStatic */
                 ObjRecordSet                 =   ObjCommand:Execute ( output ODBC-NULL, "", 32 )
                 ODBC-RECCOUNT                =   ObjRecordSet:RecordCount.
         
          /* Have we returned any rows ? */
          If ( ODBC-RECCOUNT > 0 ) and not ( ODBC-RECCOUNT = ? ) then Do:
             ObjRecordSet:MoveFirst no-error.
         
            Do while ODBC-CURSOR < ODBC-RECCOUNT:
            /* Display the data from the query (or create a Progress temp-table for future use) */
            /* Display ObjRecordSet:Fields ("name"):Value format "x(20)". */
    
                assign  c-observacao    =   ObjRecordSet:Fields ("observacao"):value
                        c-observacao    =   replace( c-observacao, chr(09), '' )
                        c-observacao    =   replace( c-observacao, chr(10), '' )
                        c-observacao    =   replace( c-observacao, chr(13), '' ).
    
                assign  i-codigo-empresa            =   ObjRecordSet:Fields ("codigo-empresa"):value
                        c-codigo-estabelecimento    =   ObjRecordSet:Fields ("codigo-estabelecimento"):value
                        .
    
                /*
               
                Faça aqui o seu find, for each, seu create dos registros para a tabela.
               
                */
    
                Assign ODBC-CURSOR = ODBC-CURSOR + 1.
                ObjRecordSet:MoveNext no-error.
                p-ok = TRUE.
             End. /* retrieved a single data row */
          End. /* retrieved all data rows */
          ELSE DO:
             Assign ODBC-STATUS = "No records found.".
    
            output to 'c:\temp\erros-conexao.txt' convert target 'iso8859-1' append.
                put 'Nenhum registro encontrado' + string( today, '99-99-9999' ) + '-' + replace( string( time, 'HH:MM:SS' ), ':', '-' ) format 'x(120)' skip.
            output close.
    
             /*MESSAGE "Nenhum registro encontrado!"
                     VIEW-AS ALERT-BOX WARNING TITLE "Atenção ()".*/
          END.
         
          /* Close the ADO connection */
          ObjConnection:Close no-error.
      
       End. /* The connection opened correctly */
      
       /* Don't forget to release the memory!! */
       Release object ObjConnection no-error.
       Release object ObjCommand no-error.
       Release object ObjRecordSet no-error.
      
       Assign ObjConnection   =   ?
              ObjCommand      =   ?
              ObjRecordSet    =   ?.
    
    END PROCEDURE.
    
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

Compartilhe esta Página