colunas dinamicas ao exportar arquivo para o excel

Discussão em 'Progress 4GL' iniciado por ueluis, Junho 6, 2012.

  1. ueluis

    ueluis Membro Participativo

    Galera,

    alguém já criou alguma rotina que exporte dados para o excel, onde a coluna é gerada dinamicamente?

    por exemplo:

    eu tenho 4 colunas a serem utilizadas pelo arquivo:
    ex:
    codigo|item|data|valor

    ao invés de :
    Código:
    assign
    excelappl:range("A" + STRING(i-linha, "999999")):VALUE = codigo
    excelappl:range("B" + STRING(i-linha, "999999")):VALUE = item
    excelappl:range("C" + STRING(i-linha, "999999")):VALUE = data
    excelappl:range("D" + STRING(i-linha, "999999")):VALUE = valor.
    
    
    implementar:

    Código:
    assign
    excelappl:range(string(col-linha + 1) + STRING(i-linha, "999999")):VALUE = codigo
    excelappl:range(string(col-linha + 1) + STRING(i-linha, "999999")):VALUE = item
    excelappl:range(string(col-linha + 1) + STRING(i-linha, "999999")):VALUE = data
    excelappl:rangestring(col-linha + 1) + STRING(i-linha, "999999")):VALUE = valor.
    
    
    dai quando eu precisasse inserir qualquer coluna, simplismente acrescentaria a nova linha e a rotina ia definir a ordem conforme disposição da sequencia das colunas.

    abç
  2. eriutoncharles

    eriutoncharles Membro Participativo

    Olá bom dia !


    Meu caro você vai inserir dentro do seu código uma procedure para descobrir a coluna e inserir os dados dentro dela.
    Código:
    
    DEF VAR vFirstColuna AS CHAR.
    DEF VAR vMaiorZ AS LOG.
    
    /* Aqui está o que lhe interessa */
    
    PROCEDURE Descobre-Coluna :
    /*------------------------------------------------------------------------------
      Purpose:     
      Parameters:  <none>
      Notes:       
    ------------------------------------------------------------------------------*/
    DEFINE INPUT PARAMETER vpExColuna AS CHAR.
    DEFINE OUTPUT PARAMETER vsExColuna AS CHAR.
    
    
    IF vpExColuna = "Z" OR SUBSTRING(vpExColuna,2,1) = "Z" THEN DO.
      IF vFirstColuna = "" THEN vFirstColuna = "A".
      ELSE IF vFirstColuna = "A" THEN vFirstColuna = "B".
      ELSE IF vFirstColuna = "B" THEN vFirstColuna = "C".
      ELSE IF vFirstColuna = "C" THEN vFirstColuna = "D".
      ELSE IF vFirstColuna = "D" THEN vFirstColuna = "E".
      ELSE IF vFirstColuna = "E" THEN vFirstColuna = "F".
      ELSE IF vFirstColuna = "F" THEN vFirstColuna = "G".
      ELSE IF vFirstColuna = "G" THEN vFirstColuna = "H".
      ELSE IF vFirstColuna = "H" THEN vFirstColuna = "I".
      ELSE IF vFirstColuna = "I" THEN vFirstColuna = "J".
      ELSE IF vFirstColuna = "J" THEN vFirstColuna = "K".
      ELSE IF vFirstColuna = "K" THEN vFirstColuna = "L".
      
      ASSIGN vMaiorZ = YES
             vsExColuna = TRIM(vFirstColuna) + "A".
      
      RETURN.
    END. 
    
    IF vMaiorZ THEN vsExColuna = TRIM(vFirstColuna) + CHR(ASC(SUBSTRING(vpExcoluna,2,1)) + 1).  
    ELSE            vsExColuna = CHR(ASC(vpExcoluna) + 1).
       
    END PROCEDURE.
    
    Em um exmplo prático:

    Código:
     
    /*definição de variáveis*/
    DEF VAR vFirstColuna AS CHAR.
    DEF VAR vMaiorZ AS LOG.
    DEF VAR vExColuna AS CHAR.
    DEF VAR vLinha AS INT.
    DEF VAR i              AS INT.
    define variable chExcelApplication as com-handle.
    define variable chWorkBook         as com-handle.
    define variable chWorkSheet        as com-handle.
    
    /*Cria a planilha*/
    create "Excel.Application" chExcelApplication.
    chWorkbook = chExcelApplication:Workbooks:add().
    chWorkSheet = chExcelApplication:Sheets:item(1).
    
    
    /* Crinando colunas dinâmicas  */
    
    ASSIGN vLinha = 3.
    
    DO i = 1 TO 10.
    
       IF i = 1 THEN ASSIGN vExColuna = "A".
       ELSE  
       RUN Descobre-Coluna(INPUT vExColuna, OUTPUT vExColuna).
       
       chWorkSheet:Range(vExColuna + STRING(vLinha)):Value =  "TESTE".
     
    END.
    
    /* Finalizando a planilha */
    
    chExcelApplication:visible = true.
    release object chExcelApplication.      
    release object chWorkbook.
    release object chWorksheet.
    
    
    
    /* Aqui está o que lhe interessa */
    
    PROCEDURE Descobre-Coluna :
    /*------------------------------------------------------------------------------
      Purpose:     
      Parameters:  <none>
      Notes:       
    ------------------------------------------------------------------------------*/
    DEFINE INPUT PARAMETER vpExColuna AS CHAR.
    DEFINE OUTPUT PARAMETER vsExColuna AS CHAR.
    
    
    IF vpExColuna = "Z" OR SUBSTRING(vpExColuna,2,1) = "Z" THEN DO.
      IF vFirstColuna = "" THEN vFirstColuna = "A".
      ELSE IF vFirstColuna = "A" THEN vFirstColuna = "B".
      ELSE IF vFirstColuna = "B" THEN vFirstColuna = "C".
      ELSE IF vFirstColuna = "C" THEN vFirstColuna = "D".
      ELSE IF vFirstColuna = "D" THEN vFirstColuna = "E".
      ELSE IF vFirstColuna = "E" THEN vFirstColuna = "F".
      ELSE IF vFirstColuna = "F" THEN vFirstColuna = "G".
      ELSE IF vFirstColuna = "G" THEN vFirstColuna = "H".
      ELSE IF vFirstColuna = "H" THEN vFirstColuna = "I".
      ELSE IF vFirstColuna = "I" THEN vFirstColuna = "J".
      ELSE IF vFirstColuna = "J" THEN vFirstColuna = "K".
      ELSE IF vFirstColuna = "K" THEN vFirstColuna = "L".
      
      ASSIGN vMaiorZ = YES
             vsExColuna = TRIM(vFirstColuna) + "A".
      
      RETURN.
    END. 
    
    IF vMaiorZ THEN vsExColuna = TRIM(vFirstColuna) + CHR(ASC(SUBSTRING(vpExcoluna,2,1)) + 1).  
    ELSE            vsExColuna = CHR(ASC(vpExcoluna) + 1).
       
    END PROCEDURE.
    


    Agora você vai precisar ajustar isso com a lógica do seu programa. O que geralmente eu faço é o seguinte....: Crio uma temp-table como tt-Coluna
    e digamos que terá uma coluna para cada código de uma tabela, então nos for each eu trato e crio a tt-Coluna pra cada código.


    Digamos
    Código:
     DEF TEMP-TABLE tt-Coluna 
                                  FIELD Codigo AS INT  FIELD Coluna AS CHAR.
    
    /* Nos for each vc cria sua tt */ 
    
    FIND tt-Coluna WHERE tt-Coluna.Codigo = Tabelax.Codigo NO-ERROR.
    IF NOT AVAIL tt-Coluna THEN DO:
       CREATE tt-Coluna. 
      ASSIGN tt-Coluna.Codigo = TabelaX.Codigo.
    END.
    
    /* Então quando tiver sua tt pronta vc dá um for each nela e manda descobrir as colunas */
    
    
    FOR EACH tt-Coluna BREAK BY tt-Coluna.Codigo.
    
    IF FIRST-OF(tt-Coluna.Codigo) THEN ASSIGN vExColuna = "A".
    ELSE  RUN Descobre-Coluna(INPUT vExColuna, OUTPUT vExColuna).
        
    ASSIGn tt-Coluna.Coluna = vExColuna.
    
    /* Aqui você fixou a Coluna a sua tabela */
    
    
    uma vez fixada na tt-Coluna você poderá dentro do for each que será exibido... dá um Find na tt-Coluna...
    Código:
    FIND tt-Coluna WHERE tt-Coluna.Codigo = XXX.Codigo NO-ERROR. 
    IF AVAIL tt-Coluna THEN DO:
        chWorkSheet:Range(tt-Coluna.Coluna + STRING(vLinha)):Value =  "Dados...".
    END.
    
    Não sei deu pra entender... meio confuso neh?
    Mas qq coisa diz ai!

    Eriuton Charles
  3. LeandroSantos

    LeandroSantos Membro Participativo

    Veja se é isto que você precisa:
    Código:
    def var iCol as int init 0.
    
    function StrCol return char.
       iCol = iCol + 1.
       if iCol < 27 then
          return chr( asc("A") + iCol - 1 ).
       else do:
          return chr( asc("A") + round(iCol / 26,0) - 1 ) +   
                 chr( asc("A") + (iCol  mod 26 ) - 1 ).
       end.
    end.
    
    assign
       excelappl:range( StrCol() + STRING(i-linha, "999999")):VALUE = codigo
       excelappl:range( StrCol() + STRING(i-linha, "999999")):VALUE = item
       excelappl:range( StrCol() + STRING(i-linha, "999999")):VALUE = data
       excelappl:range( StrCol() + STRING(i-linha, "999999")):VALUE = valor.
    
    Abç.
  4. ueluis

    ueluis Membro Participativo

    Galera,

    obrigado pelas soluções apresentadas.

    a primeira que eu testei resolveu meus problemas!!

    eriutoncharles,
    vlw pela procedure.
    agora toda vez que eu tiver de exportar uma tabela basta eu seguir este padrão:

    Código:
       DEF VAR vFirstColuna AS CHAR.
        DEF VAR vMaiorZ AS LOG.
    
        /* Aqui está o que lhe interessa */
    
        PROCEDURE Descobre-Coluna :
        /*------------------------------------------------------------------------------
          
          Purpose:     
          Parameters:  <none>
          Notes:       
        ------------------------------------------------------------------------------*/
        DEFINE INPUT PARAMETER vpExColuna AS CHAR.
        DEFINE OUTPUT PARAMETER vsExColuna AS CHAR.
    
    
        IF vpExColuna = "Z" OR SUBSTRING(vpExColuna,2,1) = "Z" THEN DO.
          IF vFirstColuna = "" THEN vFirstColuna = "A".
          ELSE IF vFirstColuna = "A" THEN vFirstColuna = "B".
          ELSE IF vFirstColuna = "B" THEN vFirstColuna = "C".
          ELSE IF vFirstColuna = "C" THEN vFirstColuna = "D".
          ELSE IF vFirstColuna = "D" THEN vFirstColuna = "E".
          ELSE IF vFirstColuna = "E" THEN vFirstColuna = "F".
          ELSE IF vFirstColuna = "F" THEN vFirstColuna = "G".
          ELSE IF vFirstColuna = "G" THEN vFirstColuna = "H".
          ELSE IF vFirstColuna = "H" THEN vFirstColuna = "I".
          ELSE IF vFirstColuna = "I" THEN vFirstColuna = "J".
          ELSE IF vFirstColuna = "J" THEN vFirstColuna = "K".
          ELSE IF vFirstColuna = "K" THEN vFirstColuna = "L".
         
          ASSIGN vMaiorZ = YES
                 vsExColuna = TRIM(vFirstColuna) + "A".
         
          RETURN.
        END.
    
        IF vMaiorZ THEN vsExColuna = TRIM(vFirstColuna) + CHR(ASC(SUBSTRING(vpExcoluna,2,1)) + 1). 
        ELSE            vsExColuna = CHR(ASC(vpExcoluna) + 1).
           
        END PROCEDURE.
    
    
        
        /*definição de variáveis*/
       
        
        DEF VAR vExColuna AS CHAR.
        DEF VAR vLinha AS INT.
        DEF VAR i              AS INT.
        define variable chExcelApplication as com-handle.
        define variable chWorkBook         as com-handle.
        define variable chWorkSheet        as com-handle.
    
        /*Cria a planilha*/
        create "Excel.Application" chExcelApplication.
        chWorkbook = chExcelApplication:Workbooks:add().
        chWorkSheet = chExcelApplication:Sheets:item(1).
    
    
        /* Crinando colunas dinâmicas  */
    
        ASSIGN vLinha = 1.
        ASSIGN vExColuna = "A".
    
    
        FOR EACH "MINHA TABELA"  NO-LOCK:
    
            chWorkSheet:Range(vExColuna + STRING(vLinha)):Value =  "CAMPO1 DA MINHA TABELA".
             RUN Descobre-Coluna(INPUT vExColuna, OUTPUT vExColuna).
            chWorkSheet:Range(vExColuna + STRING(vLinha)):Value =  "CAMPO N... DA MINHA TABELA".
    
            VLINHA = VLINHA + 1.
            ASSIGN vExColuna = "A".
        END.
        
        /* Finalizando a planilha */
    
        chExcelApplication:visible = true.
        release object chExcelApplication.     
        release object chWorkbook.
        release object chWorksheet.
    
    abç a todos!!!

  5. eriutoncharles

    eriutoncharles Membro Participativo

    Ok meu nobre! ainda bem que deu certo!
    A Solução do Leandro é uma lógica mais aprimorada...
  6. ueluis

    ueluis Membro Participativo

    realmente,

    acabei de testar.

    créditos também para o Leandro.

    Leandro,
    sua lógica também ajudou muito, vlw pela dica!!!

    tá ai o resultado através da lógica que você postou:

    Código:
    
    
        /*definição de variáveis*/
       
        def var iCol as int init 0.
        DEF VAR vLinha AS INT.
        define variable chExcelApplication as com-handle.
        define variable chWorkBook         as com-handle.
        define variable chWorkSheet        as com-handle.
    
    
        function StrCol return char.
           iCol = iCol + 1.
           if iCol < 27 then
              return chr( asc("A") + iCol - 1 ).
           else do:
              return chr( asc("A") + round(iCol / 26,0) - 1 ) +   
                     chr( asc("A") + (iCol  mod 26 ) - 1 ).
           end.
        end.
    
        /*Cria a planilha*/
        create "Excel.Application" chExcelApplication.
        chWorkbook = chExcelApplication:Workbooks:add().
        chWorkSheet = chExcelApplication:Sheets:item(1).
    
    
        /* Crinando colunas dinâmicas  */
    
        ASSIGN vLinha = 1.
        
    
        FOR EACH "MINHA TABELA"  NO-LOCK:
    
            iCol = 0.
    
            chWorkSheet:Range(StrCol() + STRING(vLinha)):Value = "CAMPO1 DA MINHA TABELA".
            chWorkSheet:Range(StrCol() + STRING(vLinha)):Value = "CAMPO N... DA MINHA TABELA".
    
            VLINHA = VLINHA + 1.
            
        END.
        
        /* Finalizando a planilha */
    
        chExcelApplication:visible = true.
        release object chExcelApplication.     
        release object chWorkbook.
        release object chWorksheet.
    
    

Compartilhe esta Página