Solução para o Reports Graphs

Dicas e truques sobre Oracle Reports Builder - modo gráfico ou modo caractere, ascii, arquivo .PRT, etc
Responder
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Boa noite pessoal,

Todos que usam o Oracle Forms 6i já devem ter batido com o problema do Graphs não rodar em máquinas 64 bits. Não é que "não roda", na verdade o problema está na procedure RUN_PRODUCT. Se o relatório for executado "por fora", através do runtime, o Graphs executará sem problemas.

Então a solução é: não usar a procedure RUN_PRODUCT. Mas então, como fazer?

Para resolver isso, estou mapeando a função ShellExecute() da API do Windows, para invocar o Reports diretamente. A função ficou até simples, mas estou com alguns bugs que não consigo resolver. Agora preciso da ajuda de vocês. =)

Segue o código que fiz. A função executa corretamente na primeira vez, mas não funciona em uma segunda execução (ORA-304500).

PACKAGE SPEC:

Selecionar tudo

PACKAGE RUNREPORTS IS
  PROCEDURE RUN_REPORTS (XREP_NOME VARCHAR2, 
  							  XREP_PARAMS VARCHAR2);
END;
PACKAGE BODY:

Selecionar tudo

PACKAGE BODY RUNREPORTS IS
/*
HINSTANCE ShellExecute(
  __in_opt  HWND hwnd,
  __in_opt  LPCTSTR lpOperation,
  __in      LPCTSTR lpFile,
  __in_opt  LPCTSTR lpParameters,
  __in_opt  LPCTSTR lpDirectory,
  __in      INT nShowCmd
);
*/
   LH_SHELL32        ORA_FFI.LIBHANDLETYPE;
   FH_SHELLEXECUTE   ORA_FFI.FUNCHANDLETYPE;

   PROCEDURE LOAD IS
   BEGIN
      LH_SHELL32 := ORA_FFI.LOAD_LIBRARY ('C:\WINDOWS\SYSTEM32\', 'shell32.dll');
      FH_SHELLEXECUTE := ORA_FFI.REGISTER_FUNCTION (LH_SHELL32,
                                    			'ShellExecuteA',
                                    			ORA_FFI.C_STD);
      ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_INT);
      ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
      ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
      ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
      ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
      ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_INT);
      ORA_FFI.REGISTER_RETURN (FH_SHELLEXECUTE, ORA_FFI.C_INT);
   END LOAD;

   PROCEDURE UNLOAD IS
   BEGIN
      ORA_FFI.UNLOAD_LIBRARY (LH_SHELL32);
   END UNLOAD;

   FUNCTION I_SHELLEXECUTE (
      FUNCHANDLE     ORA_FFI.FUNCHANDLETYPE,
      HWND           PLS_INTEGER,
      LPOPERATOR     VARCHAR2,
      LPFILE         VARCHAR2,
      LPPARAMETERS   VARCHAR2,
      LPDIRECTORY    VARCHAR2,
      NSHOWCMD       PLS_INTEGER)
      RETURN PLS_INTEGER;

   PRAGMA INTERFACE (C, I_SHELLEXECUTE, 11265);

   FUNCTION API_SHELLEXECUTE (
      HWND           PLS_INTEGER,
      LPOPERATOR     VARCHAR2,
      LPFILE         VARCHAR2,
      LPPARAMETERS   VARCHAR2,
      LPDIRECTORY    VARCHAR2,
      NSHOWCMD       PLS_INTEGER)
      RETURN PLS_INTEGER IS
      RC   PLS_INTEGER;
   BEGIN
      LOAD;
      RC :=
         I_SHELLEXECUTE (FH_SHELLEXECUTE,
                         HWND,
                         LPOPERATOR,
                         LPFILE,
                         LPPARAMETERS,
                         LPDIRECTORY,
                         NSHOWCMD);
      UNLOAD;
      RETURN RC;
   END API_SHELLEXECUTE;

   -- FUNÇÃO EXPORTADA
   PROCEDURE RUN_REPORTS (
      XREP_NOME       VARCHAR2,
      XREP_PARAMS     VARCHAR2) IS
   BEGIN
      RETURN API_SHELLEXECUTE (0,
                               'OPEN',
                               'RWRUN60.EXE',
                               'MODULE=' || XREP_NOME || ' ' || XEXE_PARAMS,
                               '',
                               /*SW_SHOWNORMAL*/ 1) > 32;
   END;
END;
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Teria sido melhor ter aberto esse tópico no fórum do Forms... Foi mal...
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

corrigindo a última função (que transformei em procedure enquanto digitava aqui):

Selecionar tudo

   -- FUNÇÃO EXPORTADA
   PROCEDURE RUN_REPORTS (
      XREP_NOME       VARCHAR2,
      XREP_PARAMS     VARCHAR2) IS
      RET PLS_INTEGER;
   BEGIN
      RET := API_SHELLEXECUTE (0,
                               'OPEN',
                               'RWRUN60.EXE',
                               'MODULE=' || XREP_NOME || ' ' || XEXE_PARAMS,
                               '',
                               /*SW_SHOWNORMAL*/ 1);
   END;
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Ops, descobri que a biblioteca d2kwutil possui a chamada para a função WinExec. Então é só usá-la ao invés da RUN_PRODUCT. Não testei ainda, mas provavelmente irá funcionar.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes