Conflito Excel

Discussão em 'Progress 4GL' iniciado por rbaselio, Dezembro 16, 2010.

  1. rbaselio

    rbaselio Membro Participativo

    Amigos, tenho um problema.

    Quando gero um relatório em excel, se o usuário abrir um outra janela do Excel, o progress se confunde e passa a escrever na nova janela.
    Existe alguma forma de garantir que o progress sempre irá escrever na aplicação que ele mesmo criou???
  2. Rodrigo Rossetto

    Rodrigo Rossetto Membro Participativo

    Poste o programa para vemos que lógicas você utiliza.
    Particularmente não tive esse problema, vamos ver em que podemos ajudar.
  3. rbaselio

    rbaselio Membro Participativo

    Na verdade eu uso uma include que eu mesmo criei
    Código:
    /****************FUNÇÕES PARA EXCEL**********************/
    /*variaveis excel*/
    DEFINE VARIABLE chExcelApplication  as COM-HANDLE.
    DEFINE VARIABLE arquivo             AS COM-HANDLE.
    DEFINE VARIABLE aba                 AS COM-HANDLE.
    DEFINE VARIABLE lin                 AS INTEGER INIT 1    NO-UNDO.
    
    /*inicia aplicação*/
    FUNCTION ini-excel RETURNS LOGICAL (INPUT dt AS char ):
        CREATE 'Excel.Application' chExcelApplication.
        ASSIGN
            chExcelApplication:VISIBLE = FALSE.
            arquivo = chExcelApplication:Workbooks:add(dt).
        IF dt = "" THEN DO:
            DO WHILE arquivo:sheets:COUNT > 1:
                arquivo:sheets:item(arquivo:sheets:COUNT):DELETE.
            END.
        END.
        aba = arquivo:sheets:ITEM(1).
        aba:activate.
        aba:Range("a1"):SELECT.
        RETURN TRUE.
    END FUNCTION.
                                                           
    FUNCTION congelar RETURNS LOGICAL (INPUT linha AS int):
        aba:Range("a" + STRING(linha + 1)):SELECT.
        ASSIGN
            chExcelApplication:ActiveWindow:FreezePanes = TRUE.
        aba:Range("a1"):SELECT.
    END FUNCTION.
                                                           
    /*função para converter colunas em letras para o excel*/
    FUNCTION coluna RETURNS CHAR (INPUT coluna AS INT):
        DEFINE VARIABLE letra AS CHARACTER   NO-UNDO.
        DEFINE VARIABLE resto AS INTEGER   NO-UNDO.
        DO WHILE coluna > 0:
            resto = coluna MOD 26.
            IF resto = 0 THEN do:
                resto = 26.
                coluna = coluna - 1.
            END.
            letra = CHR(resto + 64) + letra.
            coluna = TRUNCATE((coluna / 26), 0).
        END.
        RETURN letra.
    END FUNCTION.
                                                           
    FUNCTION celula RETURNS CHAR (INPUT coluna AS INT, INPUT linha AS INT):
        RETURN coluna(coluna) + STRING(linha).
    END FUNCTION.
    
    FUNCTION range RETURNS CHAR (INPUT colunaini AS INT, INPUT linhaini AS INT, INPUT colunafim AS INT, INPUT linhafim AS INT):
        RETURN celula(colunaini, linhaini) + ":" + celula(colunafim, linhafim).
    END FUNCTION.
    
    FUNCTION alinhar RETURNS LOGICAL (INPUT lin-ini AS INT, INPUT colu AS INT, INPUT lin-fim AS INT):
       DEFINE VARIABLE cor AS LOGICAL  INIT yes   NO-UNDO.
       DEFINE VARIABLE i AS INTEGER     NO-UNDO.
       IF lin-fim > 0 THEN DO:
           aba:range(range(1, 1, colu, lin-fim)):EntireColumn:AutoFit.
           aba:ROWs("1:" + STRING(lin-fim)):EntireRow:AutoFit.
           aba:range(range(1, 1, colu, lin-fim)):VerticalAlignment = 2.
           DO i = lin-ini TO lin-fim:
               cor = NOT cor.
               aba:range(range(1, i, colu, i)):interior:colorindex = INT(cor) * 20.
               aba:range(range(1, i, colu, i)):Borders(8):LineStyle = 1.                  
               aba:range(range(1, i, colu, i)):Borders(2):LineStyle = 1.                  
               aba:range(range(1, i, colu, i)):Borders(4):LineStyle = 1.                  
               aba:range(range(1, i, colu, i)):Borders(1):LineStyle = 1.
           END.
       END.
    END FUNCTION.
                                                           
    FUNCTION muda-aba RETURNS LOGICAL (INPUT pasta AS INT):
        ASSIGN
            aba = arquivo:sheets:ITEM(pasta).
        aba:activate.
        aba:Range("a1"):SELECT.
        ASSIGN
            lin = 1.                                       
    END FUNCTION.
    
    FUNCTION copy-aba RETURNS LOGICAL (INPUT nome-origem AS CHAR, INPUT nome-dest AS CHAR):
        DEFINE VARIABLE after  AS COM-HANDLE.
        ASSIGN
            lin = 1
            aba = arquivo:sheets:ITEM(nome-origem)
            after = arquivo:sheets:item(arquivo:sheets:COUNT).
        aba:activate.
        aba:Copy( , after).
        ASSIGN
            aba = arquivo:sheets:ITEM(arquivo:sheets:COUNT)
            aba:NAME = nome-dest.
        aba:Range("a1"):SELECT.
    END.
    
    FUNCTION add-aba RETURNS LOGICAL (INPUT nome AS CHAR):
        DEFINE VARIABLE after  AS COM-HANDLE.
        ASSIGN
            lin = 1
            aba = arquivo:sheets:ADD
            after = arquivo:sheets:item(arquivo:sheets:COUNT)
            aba:NAME = nome.
        aba:MOVE( , after).
        aba:activate.
        aba:Range("a1"):SELECT.                                          
    END FUNCTION.
    
    /*finaliza aplicação*/
    FUNCTION fim-excel RETURNS LOGICAL ():
        aba = arquivo:sheets:ITEM(1).
        aba:activate.
        aba:Range("a1"):SELECT. 
        ASSIGN
            chExcelApplication:VISIBLE = TRUE.
        RELEASE OBJECT arquivo.
        RELEASE OBJECT aba.
        RELEASE OBJECT chExcelApplication.
        RETURN TRUE.
    END FUNCTION.
    
  4. Rodrigo Rossetto

    Rodrigo Rossetto Membro Participativo

    Aparentemente está certo, não testei todas funções.
    Estranho ele perder o apontamento de memória, já tentou usar o DEBUG pra ver em que ponto está se perdendo?
  5. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Caro colega, tente colocar os comandos abaixo depois do visible:

    Código:
    
        ASSIGN
            chExcelApplication:visible        = false /*** Nao mostrar a planilha na tela ***/
            chExcelApplication:DisplayAlerts  = false /*** Nao mostrar mensagens de error ***/
            chExcelApplication:ScreenUpdating = false /*** Nao efetuar display na tela    ***/.
    
    
  6. rbaselio

    rbaselio Membro Participativo

    Resolvido com a sugestão acima, muito obrigado.

Compartilhe esta Página