Funcao Excel

Discussão em 'Problemas com Respostas' iniciado por alexandretm, Março 12, 2025.

  1. alexandretm

    alexandretm Membro Participativo

    Boa tarde Amigos, estou com um caso que nao consegui resolver, estou criando um recibo, para um programa customizado de Venda Balcao, ja fiz quase todas rotinas , porem no recibo preciso preencher no nome do usuario do sistema, faco em excel e converto em pdf para usuario, imprimir, porem quando utilizo a formula =pri.maiuscula() do excel conforme abaixo, o progress manda para excel com um @ entre =@pri.maiuscula() ocorrendo erro.
    Alguem sabe como solucionar este problema segue abaixo codigo que desenvolvi.

    {div/excel.i}
    {cep/esce002.i}
    {div/esGlob.i}

    DEFINE VARIABLE pCodigo LIKE BalcaoFechamento.Codigo INITIAL 7.

    DEF VAR excelappl AS COM-HANDLE NO-UNDO.
    DEF VAR ChWorkSheet AS COM-HANDLE NO-UNDO.
    DEF VAR i-linha AS INTE NO-UNDO.
    DEF VAR c-modelo AS CHAR NO-UNDO.
    DEF VAR l-imprime AS LOGICAL INIT NO NO-UNDO.
    DEF VAR cFileName AS CHARACTER EXTENT 2 INITIAL "" NO-UNDO.


    run utp/ut-acomp.p persistent set h-acomp.
    {utp/ut-liter.i Gerando_Recibo *}
    /* processando Movimentos */
    run pi-inicializar in h-acomp (input RETURN-VALUE).
    run pi-acompanhar in h-acomp (input "Inicializando" ).


    run pi-acompanhar in h-acomp (input "Gerando Recibo " + STRING(pCodigo) + " , Aguarde...." ).

    FIND FIRST estabelec NO-LOCK WHERE estabelec.cod-estabel = "101" NO-ERROR.

    assign c-modelo = "\\192.168.0.8\Erp-12\Desenvolvimento\modelos\F-021.xlsm"
    cFileName[1] = SESSION:TEMP-DIRECTORY + "Recibo_" + string(pcodigo) + ".xlsx"
    cFileName[2] = SESSION:TEMP-DIRECTORY + "Recibo_" + string(pcodigo) + ".PDF" .

    IF SEARCH(cFileNAme[1]) <> ? THEN DOS SILENT DEL VALUE(cFileNAme[1]).
    IF SEARCH(cFileNAme[2]) <> ? THEN DOS SILENT DEL VALUE(cFileNAme[2]).

    CREATE "excel.application" excelappl.
    excelappl:workbooks:ADD(c-modelo).
    excelappl:VISIBLE = FALSE. /* Pode ser true, o excel será aberto durante a montagem. Cuidado para nao clicar em nenhuma célula ate o final do processamento, pois o ponteiro se perde */
    /**Inicio Comandos*/
    ExcelAppl:worksheets:ITEM(1):SELECT.
    ExcelAppl:worksheets:ITEM(1):NAME = "Cupom" .
    ExcelAppl:sheets:item("Cupom"):activate.


    ASSIGN i-linha = 12 .
    FOR EACH BalcaoFechamento NO-LOCK
    WHERE BalcaoFechamento.codigo = pCodigo :
    RUN pi-acompanhar in h-acomp (input "Recibo Retirada Nr : " + string(BalcaoFechamento.codigo)).

    FIND FIRST usuar_mestre NO-LOCK
    WHERE usuar_mestre.cod_usuario = balcaofechamento.cod-usuario NO-ERROR.


    excelappl:range("E02"):VALUE = BalcaoFechamento.codigo.
    excelappl:range("I02"):VALUE = BalcaoFechamento.vl-total.
    excelappl:range("D04"):VALUE = "Trailer 001".
    excelappl:range("G19"):VALUE = IF AVAIL usuar_mestre THEN "Emitido por " ELSE "".

    /* excelappl:range("I19"):FORM = IF AVAIL usuar_mestre THEN "=pri.maiúsculo(" + usuar_mestre.nom_usuario + ")" ELSE "". */

    excelappl:range("I19"):VALUE = trim("=pri.maiúsculo(" + usuar_mestre.nom_usuario + ")").

    excelappl:range("B08"):VALUE = "Correspondente ao Fechamento de Caixa de " + string(BalcaoFechamento.dt-trans,"99/99/9999") + " ref " + BalcaoFechamento.observ .
    excelappl:range("B11"):VALUE = "( Dinheiro: " + string(balcaoFechamento.vl-dinheiro,">>>,>>9.99")
    + " | Debito: " + string(balcaoFechamento.vl-debito,">>>,>>9.99")
    + " | Credito: " + string(balcaoFechamento.vl-credito,">>>,>>9.99")
    + " | Pix: " + string(balcaoFechamento.vl-pix,">>>,>>9.99") + " )".



    END.

    excelappl:worksheets:ITEM(1):SELECT.
    excelappl:range("A4"):SELECT.

    IF l-imprime = YES THEN DO:
    excelappl:VISIBLE = FALSE.
    excelappl:ActiveWindow:SelectedSheets:printout.
    excelappl:APPLICATION:DISPLAYALERTS = FALSE.
    END.
    ELSE DO:
    excelappl:Workbooks:Item(1):SaveAs(cFileName[1],,,,,,).
    /* IF v_cod_usuar_corren <> "super" AND v_cod_usuar_corren <> "a.martins" THEN excelappl:ActiveWindow:SelectedSheets:printout. */
    excelappl:ActiveWorkBook:ExportAsFixedFormat(0,replace(cFileName[1],'xlsx','pdf'),0,,,,,,) no-error.
    excelappl:VISIBLE = NO.
    IF SEARCH(cFileNAme[2]) <> ? THEN OS-COMMAND NO-WAIT VALUE(cFileNAme[2]).
    END.
    excelappl:QUIT().
    RELEASE OBJECT excelappl NO-ERROR.
    RELEASE OBJECT chWorksheet NO-ERROR.

    /* IF SEARCH(cFileNAme[1]) <> ? THEN DOS SILENT DEL VALUE(cFileNAme[1]). */


    run pi-finalizar in h-acomp .
  2. fdantas

    fdantas Administrator Moderador

    Excel via COM Automation transformando "=" em "=@" — causa e solução

    alexandretm, esse é um comportamento clássico do Excel, não bug do Progress: quando você escreve um texto começando com "=" na propriedade :VALUE de uma célula via automação COM, e o Excel está com a opção de compatibilidade Lotus 1-2-3 ativa (`TransitionFormEntry`), ele trata "=" como possível fórmula e escapa automaticamente com "@" pra evitar execução acidental — é uma proteção antiga do Excel, não relacionada ao Progress.

    Duas soluções, escolha uma:

    1. Desliga a compatibilidade Lotus antes de escrever na planilha:
      Código:
      excelappl:Application:TransitionFormEntry = FALSE.
      
    2. Ou escreve na propriedade certa — se o conteúdo é de fato uma fórmula, use `:FORMULA` (ou `:FORMULALOCAL`, que respeita idioma/separador regional) em vez de `:VALUE`:
      Código:
      excelappl:range("I19"):FORMULA = '=PROPER(' + usuar_mestre.nom_usuario + ')'.
      

    Repara que no seu código o texto já é literalmente a string `"=pri.maiúsculo(...)"`, que não é nem uma fórmula válida do Excel (é sintaxe do Progress/BrOffice) — se a intenção é só mostrar o nome em maiúsculo, o mais simples é resolver isso antes de mandar pro Excel, com `CAPS(usuar_mestre.nom_usuario)` no ABL, e escrever o resultado puro em `:VALUE`, sem fórmula nenhuma:

    Código:
    excelappl:range("I19"):VALUE = CAPS(usuar_mestre.nom_usuario).
    
    Isso elimina o problema na raiz — sem depender de configuração regional do Excel de quem for rodar o programa.

Compartilhe esta Página