Dica para trabalhar com BrOffice em Progress

Discussão em 'Sugestões e Diversos' iniciado por Ivone, Março 12, 2013.

  1. Ivone

    Ivone Membro Participativo

    DEF VAR LIST-PLAN AS C INIT "PLAN1,PLAN2".

    DEF VAR OBJ-SERVICE AS COM-HANDLE.
    DEF VAR OBJ-DESKTOP AS COM-HANDLE.
    DEF VAR OBJ-WORK AS COM-HANDLE.
    DEF VAR OBJ-PLAN AS COM-HANDLE EXTENT 40.
    DEF VAR OBJ-WORKCOL AS COM-HANDLE.
    DEF VAR OBJ-COL AS COM-HANDLE.
    DEF VAR CC AS RAW.
    DEF VAR OLINBORDA AS COM-HANDLE.

    def var loop as int.
    def var iLinha as int.
    def var iCol as int.

    CREATE "com.sun.star.ServiceManager" OBJ-SERVICE.
    OBJ-DESKTOP = OBJ-SERVICE:createinstance("com.sun.star.frame.Desktop").
    OBJ-WORK = OBJ-DESKTOP:loadComponentFromURL("file:///c:/teste.ots","_blank",0,cc).

    def temp-table tt-relatorio
    field codigo as int
    field nome as char format "X(30)"
    field data as date.


    do loop = 1 to 10.
    create tt-relatorio.
    assign
    tt-relatorio.codigo = loop
    tt-relatorio.nome = "Fulano-" + string(loop)
    tt-relatorio.data = today + loop.
    end.
  2. fdantas

    fdantas Administrator Moderador

    Automação BrOffice via COM — dica de robustez pro seu código

    Ivone, não ficou claro no post qual erro específico você está enfrentando com esse trecho — se puder complementar com a mensagem de erro exata, a galera consegue apontar direto a causa.

    Enquanto isso, esse é o mesmo tipo de automação COM discutido neste outro tópico aqui do fórum (BrOffice/LibreOffice via `com.sun.star.ServiceManager`), que cobre as causas mais comuns de falha: sessão sem desktop interativo, LibreOffice não registrado pro usuário do Windows que roda o processo, e bitness 32/64 diferente entre Progress e LibreOffice. Vale conferir se o seu sintoma bate com algum desses.

    Um ponto adicional específico do seu código: os objetos COM criados (`OBJ-SERVICE`, `OBJ-DESKTOP`, `OBJ-WORK`, e o array `OBJ-PLAN`) não estão sendo liberados com `RELEASE OBJECT` no final — em rotina que roda repetidamente (ex.: dentro de um loop de geração de relatório), isso tende a vazar handle COM e degradar a estação com o tempo. Vale sempre fechar com `RELEASE OBJECT nome NO-ERROR.` pra cada `com-handle` criado, mesmo em caminho de erro.

Compartilhe esta Página