Forms closes when called DLL (Toledo)

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Post Reply
Trevisolli
Moderador
Moderador
Posts: 2016
Joined: Wed, 12 Jan 2005 3:25 pm
Location: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Good morning guys,

We have a serious problem here in the company and, I would like to know if anyone has gone through it.

Environment:
- Microsoft Windows XP + SP2;
- Forms [32 bit] Version 6.0.8.27.0 (Production);
- DLL Toledo (PCLINK6.DLL);

Problem:
The forms has a button, which calls the DLL through a PLL.
Until the library reading part, okay (LoadLibrary).
However, when I try to make the call, for one of the DLL functions, more specifically the arrow_ip, passing as parameter the IP where the scales is located, the forms closes, without causing exception.

I put below, one of the dumps generated after n call attempts:

Select all

 
[06/13/08 18:11:04 Hora oficial do Brasil]::Client Status [ConnId=0, PID=1776] 
	>> ERROR: Abnormal termination, Error Code: C0000005 ACCESS_VIOLATION 
 
======================= STACK DUMP ======================= 
 
Fault address:  0229487F 01:0000387F 
Module: c:\windows\system32\pclink6.dll 
 
System Information: 
Operating System: Windows NT Version 5.1 Build 2600 Service Pack 2 
Command line: IFDBG60 -SsL09@ 
FORM/BLOCK/FIELD: GVOC0009:EV_CONTR_ITEM_PESAGEM.BT_RECUPERA_TARA 
Last Trigger: WHEN-BUTTON-PRESSED - (In Progress) 
Msg: <NULL> 
Last Builtin: PAUSE - (Successfully Completed) 
 
Registers: 
EAX:0012C718 
EBX:017C7AD0 
ECX:00000000 
EDX:00000031 
ESI:00000000 
EDI:0012C9DC 
CS:EIP:001B:0229487F 
SS:ESP:0023:0012C6FC  EBP:0012C754 
DS:0023  ES:0023  FS:003B  GS:0000 
Flags:00010202 
------------------- Call Stack Trace --------------------- 
 
Frameptr   RetAddr  Param#1  Param#2  Param#3  Param#4  Function Name        
 
0x0012c754 004f2ed3 00000031 00000000 00000000 00000000 0x0229487f           
 
0x0012c868 00430e4e 017be4a8 0231c634 0012c8ec 00000001 0x004f2ed3           
 
0x0012ca90 00491630 017c7ad0 00000003 01ecc648 00002c01 0x00430e4e           
 
0x0012dba8 6646452a 017c7ad0 017a5e40 01f036cc 00000008 0x00491630           
 
0x0012dc10 0049febc 017a5e40 017c7ad0 017be4a8 0173e76c 0x6646452a           
 
0x017a3edc 0173e76c 00461c70 00461cb0 0066c0e0 00000000 0x0049febc           
 
0x017be4a8 00000001 0000000a 017be7c8 67fbcf2f 00615492 0x0173e76c           
 
------------------- End of Stack Trace ------------------- 
if anyone has passed through This, or, have any idea how to solve, I am grateful.
User avatar
dr_gori
Moderador
Moderador
Posts: 5024
Joined: Mon, 03 May 2004 3:08 pm
Location: Portland, OR USA
Contact:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eae Broder

How are you doing the DLL call?
Did you use Ora_FFI?
without being for the forms works the DLL perfectly?
If you have the code you used, send us to see !! :-D
User avatar
alef
Rank: Analista Pleno
Rank: Analista Pleno
Posts: 119
Joined: Tue, 06 Nov 2007 2:45 pm
Location: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

Trevis, I make lepeso.exe run and record a txt with weight. I do not know if it will solve your case, but at least it solved, the only problem is that the code can only be run on the PC that the scale is connected. That is another computer can not read the weight from the scale.
Trevisolli
Moderador
Moderador
Posts: 2016
Joined: Wed, 12 Jan 2005 3:25 pm
Location: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Friends,
.
My big problem is when calling by Forms.

Alef , could you send me an example of this program?
If this is the case, I can make a form to get this txt.

Thank you all.
User avatar
alef
Rank: Analista Pleno
Rank: Analista Pleno
Posts: 119
Joined: Tue, 06 Nov 2007 2:45 pm
Location: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

I can send yes,
but it will have to be by msn, because there are other details that I have to pass from then we set up a material and put it here in the forum.

beleza?
Trevisolli
Moderador
Moderador
Posts: 2016
Joined: Wed, 12 Jan 2005 3:25 pm
Location: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, I sent you an email, here by the forum, containing my contact details.
Can you confirm if you received?
Thank you very much,
Bel-Kyor
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Posts: 3
Joined: Wed, 16 Jul 2008 4:52 pm
Location: são Paulo - SP
Contact:

Gentlemen, good morning
here in the company where I work, we use Oracle Applications and today to read the weight of the balance is used to Toledo, Guardian.

appeared a need to integrate weight reading into the ERP system.
But the forms in this case runs by the server, there is no client installed on the scale computer.

Someone already had this kind of situation?

I would also like to ask for a help to transform pclink6.dll into PLL
if someone already has this library and can be able to provide me.

Thank you very much
Belks
Trevisolli
Moderador
Moderador
Posts: 2016
Joined: Wed, 12 Jan 2005 3:25 pm
Location: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

after help from friends here from the forum and, from some other friends, I was able to read the weight via system, through the IP of the balance, because it is not directly connected to the micro.

I will look for the order of the DLL call, which is fundamental to the process, and, here for you.

Do you have that version of the scale? It is that I did this work in version 6 (a new version of Toledo).
User avatar
dr_gori
Moderador
Moderador
Posts: 5024
Joined: Mon, 03 May 2004 3:08 pm
Location: Portland, OR USA
Contact:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

I once had incompatibility with DLL calls made in Delphi. Hence, the idea that solved the case was to create a C DLL that calls the DLL function in Delphi:?

hence it worked ... but it was another environment, it was forms 10g running Jacob.jar and Webutil ...
Trevisolli
Moderador
Moderador
Posts: 2016
Joined: Wed, 12 Jan 2005 3:25 pm
Location: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Personnel follows a solution found below:

spec

Select all

 
PACKAGE BL_TOLEDO IS  
 
-- IP_SETADO    BINARY_INTEGER; 
FFI_Error     	BOOLEAN; 
FFI_Error_Text	VARCHAR2(2000); 
FFI_Error_Code	NUMBER; 
 
FUNCTION Seta_Ip(IPStr IN VARCHAR2) RETURN BINARY_INTEGER; 
 
FUNCTION W9091(IP_SETADO IN BINARY_INTEGER, Canal IN VARCHAR2) RETURN BINARY_INTEGER; 
 
FUNCTION Select_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER; 
 
PROCEDURE Close_Canal(CANAL_SETADO IN BINARY_INTEGER); 
 
FUNCTION Update_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER; 
 
FUNCTION Gross_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION Net_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION Tare_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER) RETURN PLS_INTEGER; 
 
FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR) RETURN BINARY_INTEGER; 
 
FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER, TEMPO IN BINARY_INTEGER) RETURN BINARY_INTEGER; 
 
-- Procedimento Padrão para leitura de peso 
PROCEDURE PR_LER_PESO (peso_bruto   IN OUT BINARY_INTEGER 
                     , peso_liquido IN OUT BINARY_INTEGER 
                     , peso_tara    IN OUT BINARY_INTEGER 
                     , IPStr        IN VARCHAR2 
                     , Canal        IN VARCHAR2 
                     , p_open       IN VARCHAR2); 
                      
PROCEDURE ABREDLL (p_open  VARCHAR2);                      
 
 
END BL_TOLEDO; 
 
Body

Select all

 
-- Conexão por IP  
-- Favor não alterar as informações, nem a ORDEM das chamadas, sem consultar manual ou, o  
-- fornecedor da Balança ( Toledo ) 
-- Qualquer alteração na ordem das chamadas da DLL, pode acarretar erros e, não trazer o peso da balança. 
/* PACKAGE BODY RESPONSÁVEL POR TRABALHAR COM NOVA VERSÃO DA BALANÇA TOLEDO, MODELO 6, FIREX */ 
 
PACKAGE BODY BL_TOLEDO IS 
   
  retorno1   ora_ffi.libhandletype;   -- Variável utilizada no corpo do pacote 
  retorno2   ora_ffi.funchandletype;  -- Seta_Ip 
  retorno3   ora_ffi.funchandletype;  -- W9091 
  retorno4   ora_ffi.funchandletype;  -- Select_Canal 
  retorno5   ora_ffi.funchandletype;  -- Close_Canal 
  retorno6   ora_ffi.funchandletype;  -- Update_Canal       
  retorno7   ora_ffi.funchandletype;  -- Gross_Canal 
  retorno8   ora_ffi.funchandletype;  -- Net_Canal 
  retorno9   ora_ffi.funchandletype;  -- Tare_Canal 
   
  retorno10  ora_ffi.funchandletype;  -- DIO_InBit 
  retorno11  ora_ffi.funchandletype;  -- Update_NoMotion 
  retorno12  ora_ffi.funchandletype;  -- DIO_InPortStr 
  retorno13  ora_ffi.funchandletype;  -- DIO_OutPortStr 
  retorno14  ora_ffi.funchandletype;  -- Estado_EmMovimento 
   
  erro_nulo  EXCEPTION; 
   
-- *********************************************************************************  	 
  
FUNCTION S_Seta_Ip (TESTE_HANDLE Ora_Ffi.Funchandletype, 
                    IPStr IN VARCHAR2) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Seta_Ip, 11265); 
 
FUNCTION Seta_Ip (IPStr IN VARCHAR2) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    NUMBER; 
   	  erro               EXCEPTION; 
       
   BEGIN 
       
      v_identificador := S_Seta_Ip(retorno2, IPStr); 
    
      IF v_identificador = -1 THEN 
      	 
      	 Message( 'Impossivel setar o IP do Módulo Firex' ); 
      	 RAISE erro; 
   	 
      END IF; 
       
      RETURN (v_identificador); 
    
   EXCEPTION 
      	 
      WHEN erro THEN 
         RAISE erro_nulo; 
       
      WHEN OTHERS THEN 
         message( 'BL.PLL BALANCA.Seta_Ip: ' || SQLERRM ); 
         RAISE FORM_TRIGGER_FAILURE; 
          
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_W9091 (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                          IP_SETADO   IN BINARY_INTEGER, 
                          Canal       IN VARCHAR2) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_W9091, 11265); 
 
FUNCTION W9091 (IP_SETADO IN BINARY_INTEGER, 
                Canal     IN VARCHAR2) 
  RETURN BINARY_INTEGER 
  IS 
 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_W9091(retorno3, IP_SETADO, Canal); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Select_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Select_Canal, 11265); 
 
FUNCTION Select_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
   	 
      v_identificador := S_Select_Canal(retorno4, CANAL_SETADO); 
          
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
PROCEDURE S_Close_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER); 
PRAGMA interface(C, S_Close_Canal, 11265); 
 
PROCEDURE Close_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  IS 
   BEGIN 
      S_Close_Canal(retorno5, CANAL_SETADO); 
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Update_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Update_Canal, 11265); 
 
FUNCTION Update_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
       
      v_identificador := S_Update_Canal(retorno6, CANAL_SETADO); 
         
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_Gross_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_Gross_Canal, 11265); 
 
FUNCTION Gross_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_bruto VARCHAR2(20); 
 
   BEGIN 
 
      v_bruto := S_Gross_Canal(retorno7, CANAL_SETADO); 
    
      RETURN (v_bruto); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Net_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_Net_Canal, 11265); 
 
FUNCTION Net_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_liquido VARCHAR2(20); 
 
   BEGIN 
 
      v_liquido := S_Net_Canal(retorno8, CANAL_SETADO); 
    
      RETURN (v_liquido); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Tare_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_Tare_Canal, 11265); 
 
FUNCTION Tare_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_tara VARCHAR2(20); 
 
   BEGIN 
 
      v_tara := S_Tare_Canal(retorno9, CANAL_SETADO); 
    
      RETURN (v_tara); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_DIO_InPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                          IP_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_DIO_InPortStr, 11265); 
 
FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_identificador VARCHAR2(32000); 
 
   BEGIN 
 
      v_identificador := S_DIO_InPortStr(retorno12, IP_SETADO); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_DIO_InBit (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                      IP_SETADO   IN BINARY_INTEGER, 
                      ID_ENTRADA  IN BINARY_INTEGER) 
       RETURN PLS_INTEGER; 
PRAGMA interface(C, S_DIO_InBit, 11265); 
 
FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER) 
  RETURN PLS_INTEGER 
  IS 
 
   	  v_identificador    PLS_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_DIO_InBit(retorno10, IP_SETADO, ID_ENTRADA); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_DIO_OutPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                           IP_SETADO IN BINARY_INTEGER, 
                           PALAVRA   IN CHAR) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_DIO_OutPortStr, 11265); 
 
FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_DIO_OutPortStr(retorno13, IP_SETADO, PALAVRA); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_Update_NoMotion (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                            CANAL_SETADO IN BINARY_INTEGER, 
                            TEMPO        IN BINARY_INTEGER) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Update_NoMotion, 11265); 
 
FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER 
                         ,TEMPO        IN BINARY_INTEGER) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_Update_NoMotion(retorno11, CANAL_SETADO, 0); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION Estado_EmMovimento (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                             CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, Estado_EmMovimento, 11265); 
 
FUNCTION Estado_EmMovimento (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := Estado_EmMovimento(retorno14, CANAL_SETADO); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************   
 
 
-- *********************************************************************************  
-- Procedimento Padrão para leitura de peso 
PROCEDURE PR_LER_PESO (peso_bruto    IN OUT BINARY_INTEGER 
                      ,peso_liquido  IN OUT BINARY_INTEGER 
                      ,peso_tara     IN OUT BINARY_INTEGER 
                      ,IPStr         IN VARCHAR2 
                      ,Canal         IN VARCHAR2 
                      ,p_open        IN VARCHAR2) 
IS 
 
  IP_SETADO     BINARY_INTEGER; 
  CANAL_SETADO  BINARY_INTEGER; 
  v_result      BINARY_INTEGER; 
  v_estado_mov  VARCHAR2(01); 
  v_bruto       VARCHAR2(20); 
  v_liquido     VARCHAR2(20); 
  v_tara        VARCHAR2(20); 
  v_conta       NUMBER := 0; 
   
  V_CONTA1 number := 0; 
   
  -- 
  v_sensor_ativo  VARCHAR2(01); 
  v_porta_entrada NUMBER; 
  VALIDA_SENSOR   VARCHAR2(32000) := NULL; 
  ativa_saida_0   BINARY_INTEGER; 
  -- 
  msg_erro        VARCHAR2(1000); 
  erro_conexao    EXCEPTION;   
  erro_sensor     EXCEPTION;   
  erro_estado_mov EXCEPTION; 
  v_flg_obstaculo VARCHAR2(01); 
  -- 
  v_erro       VARCHAR2(1000); 
  erro         EXCEPTION;   
   
BEGIN 
   
  ABREDLL(P_OPEN); 
   
  -- Executar a conexão 
  IP_SETADO := Seta_Ip(IPStr); 
   
  IF IP_SETADO >= 0 THEN 
  		 
  		CANAL_SETADO := W9091(IP_SETADO, Canal); 
 
  		IF CANAL_SETADO < 0 THEN 
  			   
  			  CLEAR_MESSAGE; 
  			  MESSAGE('ERRO NO MOMENTO DE SETAR O CANAL (W9091)!') ; 
  			   
  			  WHILE CANAL_SETADO < 0 AND V_CONTA <= 100 LOOP 
  			     CANAL_SETADO := W9091(IP_SETADO, Canal); 
  			     v_conta := v_conta + 1; 
  			  END LOOP; 
  			   
  			  IF CANAL_SETADO < 0 THEN 
  			     msg_erro := 'ERRO NO MOMENTO DE SETAR O CANAL (W9091)!: '||CANAL_SETADO; 
  	  	     RAISE erro_conexao; 
  	  	  END IF; 
  	  	   
  	  END IF;  	   
 
 
  ELSE 
  		 msg_erro := 'ERRO NO MOMENTO DE SETAR O IP (Seta_Ip)!: '||IP_SETADO; 
       RAISE erro_conexao; 
  END IF; 
 
  -- Limpa campos do peso 
  v_bruto   := 0;  
  v_liquido := 0;  
  v_tara    := 0;  
   
  v_result := Select_Canal(CANAL_SETADO); 
 
  IF v_result < 0 THEN 
  		msg_erro := 'ERRO NO MOMENTO DE SELECIONAR O CANAL (Select_Canal)!'; 
    	RAISE erro_conexao; 
  END IF; 
 
  V_CONTA1 := 0; 
 
  -- 
  IF v_erro IS NOT NULL THEN 
     RAISE erro; 
  END IF; 
 
  -- Se o veículo estiver posicionado corretamente na balança 
  IF msg_erro IS NULL THEN 
 
     v_result := Update_Canal(CANAL_SETADO); 
     IF v_result < 0 THEN 
        msg_erro := 'ERRO NO MOMENTO DE ATUALIZAR O CANAL (Update_Canal)!'; 
        RAISE erro_conexao; 
     END IF; 
  
       
  
       v_bruto   := Gross_Canal(CANAL_SETADO);                 
 
       v_tara    := Tare_Canal(CANAL_SETADO);      
 
     	 v_liquido := 0; 
 
      
	   peso_bruto   := TO_NUMBER(NVL(v_bruto,0)); 
	   peso_tara    := TO_NUMBER(NVL(v_tara,0)); 
	   peso_liquido := TO_NUMBER(NVL(v_liquido,0)); 
      
  END IF; 
   
  -- Libera Conexão 
  Close_Canal(CANAL_SETADO); 
   
EXCEPTION   	  
  WHEN erro_conexao THEN 
		MESSAGE('Erro na conexão da Balança: '||msg_erro); 
		MESSAGE('Erro na conexão da Balança: '||msg_erro); 
		-- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
		RAISE FORM_TRIGGER_FAILURE; 
  WHEN erro_sensor THEN 
    MESSAGE(msg_erro); 
    MESSAGE(msg_erro); 
    -- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
    RAISE FORM_TRIGGER_FAILURE; 
  WHEN erro THEN 
    MESSAGE(v_erro); 
    MESSAGE(v_erro); 
    -- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
    RAISE FORM_TRIGGER_FAILURE; 
  WHEN erro_estado_mov THEN 
    MESSAGE(msg_erro); 
    MESSAGE(msg_erro); 
    RAISE FORM_TRIGGER_FAILURE; 
  WHEN OTHERS THEN 
    MESSAGE('PR_LER_PESO : ' || SQLERRM);  	    
    MESSAGE('PR_LER_PESO : ' || SQLERRM); 
    -- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
    RAISE FORM_TRIGGER_FAILURE; 
END PR_LER_PESO;     
 
PROCEDURE ABREDLL (P_OPEN VARCHAR2)  
IS 
 
  vout   VARCHAR2(01); 
   
  BEGIN 
  	  
  	 ------------------------------------------------------------------------------------------------------------------------------- 
     /* CONSIDERAÇÕES IMPORTANTÍSSIMAS SOBRE A DLL */                                                                               
     ------------------------------------------------------------------------------------------------------------------------------- 
     -- DLL À SER UTILIZADA! 
     ------------------------------------------------------------------------------------------------------------------------------- 
     -- UTILIZAR A QUE O PROGRAMA DE INSTALAÇÃO FORNECE. JOGAR EM C:\WINDOWS\SYSTEM32 (PCLINK6.DLL). 
     -- 
     -- **************************************************************************************************************************** 
     -- *** NÃO ALTERAR A ORDEM DAS PROCEDURES E FUNÇÕES ABAIXO (PRINCIPALMENTE DAS CHAMADAS) !!!! *** 
     -- **************************************************************************************************************************** 
     --- Área Global  	 
     IF P_OPEN = 'não' THEN 
     	 
     	  BEGIN   
           retorno1 := Ora_Ffi.Load_Library(:PARAMETER.P_DIRETORIO_padrão_DLL, :PARAMETER.P_NOME_padrão_DLL); 
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it. 
     	  EXCEPTION 
     	  	WHEN OTHERS THEN   
					  FFI_ERROR	:= TRUE; 
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE; 
					  FFI_Error_Code	:= TOOL_ERR.CODE; 
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP 
					  	  Message('1-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)|| 
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)|| 
					  	          'Erro:'||chr(13)||chr(10)|| 
					  	          TOOL_ERR.MESSAGE); 
					  	          TOOL_ERR.POP; 
					  END LOOP; 
			 		  TOOL_ERR.CLEAR;            
     	  END; 
     	   
     ELSE     	 
     	   
     	  BEGIN       	   
           retorno1 := ora_ffi.find_library(:PARAMETER.P_NOME_padrão_DLL); 
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it. 
     	  EXCEPTION 
     	  	WHEN OTHERS THEN   
					  FFI_ERROR	:= TRUE; 
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE; 
					  FFI_Error_Code	:= TOOL_ERR.CODE; 
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP 
					  	  Message('2-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)|| 
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)|| 
					  	          'Erro:'||chr(13)||chr(10)|| 
					  	          TOOL_ERR.MESSAGE); 
					  	          TOOL_ERR.POP; 
					  END LOOP; 
			 		  TOOL_ERR.CLEAR;            
     	  END;  
     	   
     END IF;      
 
		      
		  -- *********************************************************************************  	 
		  -- Utilizado para função Seta_Ip 
		  /* Registra a função da DLL. */ 
		  retorno2 := Ora_Ffi.Register_Function(retorno1, 'Seta_Ip', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno2, Ora_Ffi.C_CHAR_PTR); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno2, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função W9091  	 
		  /* Registra a função da DLL. */ 
		  retorno3 := Ora_Ffi.Register_Function(retorno1, 'W9091', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_INT); 
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_CHAR_PTR); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno3, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Select_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno4 := Ora_Ffi.Register_Function(retorno1, 'Select_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno4, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno4, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Close_Canal 
		  /* Registra a função da DLL. */ 
		  retorno5 := Ora_Ffi.Register_Function(retorno1, 'Close_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno5, Ora_Ffi.C_INT); 
		  -- ********************************************************************************* 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Update_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno6 := Ora_Ffi.Register_Function(retorno1, 'Update_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno6, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno6, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Gross_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno7 := Ora_Ffi.Register_Function(retorno1, 'Gross_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno7, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno7, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		 
			-- *********************************************************************************  	 
		  -- Utilizado para função Net_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno8 := Ora_Ffi.Register_Function(retorno1, 'Net_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno8, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno8, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		 
			-- *********************************************************************************  	 
		  -- Utilizado para função Tare_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno9 := Ora_Ffi.Register_Function(retorno1, 'Tare_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno9, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno9, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		    
		  -- *********************************************************************************  	 
		  -- Utilizado para função DIO_InBit	 
		  /* Registra a função da DLL. */ 
		  retorno10 := Ora_Ffi.Register_Function(retorno1, 'DIO_InBit', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno10, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno10, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função Update_NoMotion 
		  /* Registra a função da DLL. */ 
		  retorno11 := Ora_Ffi.Register_Function(retorno1, 'Update_NoMotion', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno11, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno11, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função DIO_InPortStr 
		  /* Registra a função da DLL. */ 
		  retorno12 := Ora_Ffi.Register_Function(retorno1, 'DIO_InPortStr', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno12, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno12, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função DIO_OutPortStr 
		  /* Registra a função da DLL. */ 
		  retorno13 := Ora_Ffi.Register_Function(retorno1, 'DIO_OutPortStr', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_INT); 
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_CHAR_PTR); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno13, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função Estado_EmMovimento 
		  /* Registra a função da DLL. */ 
		  retorno14 := Ora_Ffi.Register_Function(retorno1, 'Estado_EmMovimento', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno14, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno14, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
 
  exception 
      	 
      when erro_nulo then 
      	 raise form_trigger_failure; 
 
  END; 
 
END BL_TOLEDO; 
Call

Select all

 
------------------------------------------------------------------------------------ 
-- FUN_LER_BALANCA_NOVA: Função que busca o peso (tara ou bruto) da balança nova. 
------------------------------------------------------------------------------------ 
/* PTIPO_LEITURA: (B)ruto, (L)iquido ou  (T)ara */ 
------------------------------------------------------------------------------------ 
FUNCTION FUN_LER_BALANCA_NOVA  
RETURN NUMBER  
IS 
 
  v_peso_bruto      NUMBER; 
  v_peso_liquido    NUMBER; 
  v_peso_tara       NUMBER; 
   
  v_nome_computador varchar2(80); 
  v_tip_proc    VARCHAR2(20); 
  v_end_maquina VARCHAR2(20); 
  v_canal       VARCHAR2(20); 
  v_erro        VARCHAR2(4000); 
   
  erro_balancav2 EXCEPTION; 
   
BEGIN 
      
     -- Não retirar. 
     DEFAULT_VALUE('não','GLOBAL.CHAMOU_PCLINK');      
      
     BL_TOLEDO.PR_LER_PESO (PESO_BRUTO    => v_peso_bruto,   
                            PESO_LIQUIDO  => v_peso_liquido,  
                            PESO_TARA     => v_peso_tara,  
                            IPSTR         => :PARAMETER.P_IP_BALANCA_TOLEDO,  
                            CANAL         => :PARAMETER.P_CANAL_BALANCA /*v_canal*/,  
                            P_OPEN        => :GLOBAL.CHAMOU_PCLINK);	 
 
     :GLOBAL.CHAMOU_PCLINK := 'SIM'; 
 
     RETURN (NVL(v_peso_bruto,0));	  
  
EXCEPTION 
 
  WHEN OTHERS THEN 
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM); 
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM); 
     RAISE FORM_TRIGGER_FAILURE; 
   
END; 
esaito
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Posts: 8
Joined: Wed, 06 Apr 2011 3:56 pm
Location: Lins-sp

Good afternoon,

I have a problem in a DLL return, I'm using Oracle 10G, Jacob.Back Webutil.
and when I use Function Invoke_int, the Forms closes and the browser closes together.
The DLL receives the commands, but when I try to get the return of the DLL, it happens to "Crashar" the application.
Someone already passed this?
DLL is Darumaframework, writing in C.
I am using the Webutil_c_api.invoke_int (FUNCTIONHANDLE, paramaterlist) function;
User avatar
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Posts: 342
Joined: Mon, 29 Jan 2007 7:36 am
Location: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

Trevisolli wrote: Personal, follows a solution found below:

spec

Select all

 
PACKAGE BL_TOLEDO IS  
 
-- IP_SETADO    BINARY_INTEGER; 
FFI_Error     	BOOLEAN; 
FFI_Error_Text	VARCHAR2(2000); 
FFI_Error_Code	NUMBER; 
 
FUNCTION Seta_Ip(IPStr IN VARCHAR2) RETURN BINARY_INTEGER; 
 
FUNCTION W9091(IP_SETADO IN BINARY_INTEGER, Canal IN VARCHAR2) RETURN BINARY_INTEGER; 
 
FUNCTION Select_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER; 
 
PROCEDURE Close_Canal(CANAL_SETADO IN BINARY_INTEGER); 
 
FUNCTION Update_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN BINARY_INTEGER; 
 
FUNCTION Gross_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION Net_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION Tare_Canal(CANAL_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER) RETURN VARCHAR2; 
 
FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER) RETURN PLS_INTEGER; 
 
FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR) RETURN BINARY_INTEGER; 
 
FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER, TEMPO IN BINARY_INTEGER) RETURN BINARY_INTEGER; 
 
-- Procedimento Padrão para leitura de peso 
PROCEDURE PR_LER_PESO (peso_bruto   IN OUT BINARY_INTEGER 
                     , peso_liquido IN OUT BINARY_INTEGER 
                     , peso_tara    IN OUT BINARY_INTEGER 
                     , IPStr        IN VARCHAR2 
                     , Canal        IN VARCHAR2 
                     , p_open       IN VARCHAR2); 
                      
PROCEDURE ABREDLL (p_open  VARCHAR2);                      
 
 
END BL_TOLEDO; 
 
B] Body [/b]

Select all

 
-- Conexão por IP  
-- Favor não alterar as informações, nem a ORDEM das chamadas, sem consultar manual ou, o  
-- fornecedor da Balança ( Toledo ) 
-- Qualquer alteração na ordem das chamadas da DLL, pode acarretar erros e, não trazer o peso da balança. 
/* PACKAGE BODY RESPONSÁVEL POR TRABALHAR COM NOVA VERSÃO DA BALANÇA TOLEDO, MODELO 6, FIREX */ 
 
PACKAGE BODY BL_TOLEDO IS 
   
  retorno1   ora_ffi.libhandletype;   -- Variável utilizada no corpo do pacote 
  retorno2   ora_ffi.funchandletype;  -- Seta_Ip 
  retorno3   ora_ffi.funchandletype;  -- W9091 
  retorno4   ora_ffi.funchandletype;  -- Select_Canal 
  retorno5   ora_ffi.funchandletype;  -- Close_Canal 
  retorno6   ora_ffi.funchandletype;  -- Update_Canal       
  retorno7   ora_ffi.funchandletype;  -- Gross_Canal 
  retorno8   ora_ffi.funchandletype;  -- Net_Canal 
  retorno9   ora_ffi.funchandletype;  -- Tare_Canal 
   
  retorno10  ora_ffi.funchandletype;  -- DIO_InBit 
  retorno11  ora_ffi.funchandletype;  -- Update_NoMotion 
  retorno12  ora_ffi.funchandletype;  -- DIO_InPortStr 
  retorno13  ora_ffi.funchandletype;  -- DIO_OutPortStr 
  retorno14  ora_ffi.funchandletype;  -- Estado_EmMovimento 
   
  erro_nulo  EXCEPTION; 
   
-- *********************************************************************************  	 
  
FUNCTION S_Seta_Ip (TESTE_HANDLE Ora_Ffi.Funchandletype, 
                    IPStr IN VARCHAR2) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Seta_Ip, 11265); 
 
FUNCTION Seta_Ip (IPStr IN VARCHAR2) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    NUMBER; 
   	  erro               EXCEPTION; 
       
   BEGIN 
       
      v_identificador := S_Seta_Ip(retorno2, IPStr); 
    
      IF v_identificador = -1 THEN 
      	 
      	 Message( 'Impossivel setar o IP do Módulo Firex' ); 
      	 RAISE erro; 
   	 
      END IF; 
       
      RETURN (v_identificador); 
    
   EXCEPTION 
      	 
      WHEN erro THEN 
         RAISE erro_nulo; 
       
      WHEN OTHERS THEN 
         message( 'BL.PLL BALANCA.Seta_Ip: ' || SQLERRM ); 
         RAISE FORM_TRIGGER_FAILURE; 
          
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_W9091 (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                          IP_SETADO   IN BINARY_INTEGER, 
                          Canal       IN VARCHAR2) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_W9091, 11265); 
 
FUNCTION W9091 (IP_SETADO IN BINARY_INTEGER, 
                Canal     IN VARCHAR2) 
  RETURN BINARY_INTEGER 
  IS 
 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_W9091(retorno3, IP_SETADO, Canal); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Select_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Select_Canal, 11265); 
 
FUNCTION Select_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
   	 
      v_identificador := S_Select_Canal(retorno4, CANAL_SETADO); 
          
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
PROCEDURE S_Close_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER); 
PRAGMA interface(C, S_Close_Canal, 11265); 
 
PROCEDURE Close_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  IS 
   BEGIN 
      S_Close_Canal(retorno5, CANAL_SETADO); 
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Update_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Update_Canal, 11265); 
 
FUNCTION Update_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
       
      v_identificador := S_Update_Canal(retorno6, CANAL_SETADO); 
         
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_Gross_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_Gross_Canal, 11265); 
 
FUNCTION Gross_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_bruto VARCHAR2(20); 
 
   BEGIN 
 
      v_bruto := S_Gross_Canal(retorno7, CANAL_SETADO); 
    
      RETURN (v_bruto); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Net_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_Net_Canal, 11265); 
 
FUNCTION Net_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_liquido VARCHAR2(20); 
 
   BEGIN 
 
      v_liquido := S_Net_Canal(retorno8, CANAL_SETADO); 
    
      RETURN (v_liquido); 
    
   END; 
-- *********************************************************************************  	 
 
-- *********************************************************************************  	 
   
FUNCTION S_Tare_Canal (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                         CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_Tare_Canal, 11265); 
 
FUNCTION Tare_Canal (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_tara VARCHAR2(20); 
 
   BEGIN 
 
      v_tara := S_Tare_Canal(retorno9, CANAL_SETADO); 
    
      RETURN (v_tara); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_DIO_InPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                          IP_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, S_DIO_InPortStr, 11265); 
 
FUNCTION DIO_InPortStr (IP_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_identificador VARCHAR2(32000); 
 
   BEGIN 
 
      v_identificador := S_DIO_InPortStr(retorno12, IP_SETADO); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_DIO_InBit (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                      IP_SETADO   IN BINARY_INTEGER, 
                      ID_ENTRADA  IN BINARY_INTEGER) 
       RETURN PLS_INTEGER; 
PRAGMA interface(C, S_DIO_InBit, 11265); 
 
FUNCTION DIO_InBit (IP_SETADO IN BINARY_INTEGER, ID_ENTRADA IN BINARY_INTEGER) 
  RETURN PLS_INTEGER 
  IS 
 
   	  v_identificador    PLS_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_DIO_InBit(retorno10, IP_SETADO, ID_ENTRADA); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_DIO_OutPortStr (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                           IP_SETADO IN BINARY_INTEGER, 
                           PALAVRA   IN CHAR) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_DIO_OutPortStr, 11265); 
 
FUNCTION DIO_OutPortStr (IP_SETADO IN BINARY_INTEGER, PALAVRA IN CHAR) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_DIO_OutPortStr(retorno13, IP_SETADO, PALAVRA); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION S_Update_NoMotion (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                            CANAL_SETADO IN BINARY_INTEGER, 
                            TEMPO        IN BINARY_INTEGER) 
       RETURN BINARY_INTEGER; 
PRAGMA interface(C, S_Update_NoMotion, 11265); 
 
FUNCTION Update_NoMotion (CANAL_SETADO IN BINARY_INTEGER 
                         ,TEMPO        IN BINARY_INTEGER) 
  RETURN BINARY_INTEGER 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := S_Update_NoMotion(retorno11, CANAL_SETADO, 0); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************  	 
 
 
-- *********************************************************************************  	 
   
FUNCTION Estado_EmMovimento (TESTE_HANDLE  Ora_Ffi.Funchandletype, 
                             CANAL_SETADO IN BINARY_INTEGER) 
       RETURN VARCHAR2; 
PRAGMA interface(C, Estado_EmMovimento, 11265); 
 
FUNCTION Estado_EmMovimento (CANAL_SETADO IN BINARY_INTEGER) 
  RETURN VARCHAR2 
  IS 
   	  v_identificador    BINARY_INTEGER; 
 
   BEGIN 
 
      v_identificador := Estado_EmMovimento(retorno14, CANAL_SETADO); 
    
      RETURN (v_identificador); 
    
   END; 
-- *********************************************************************************   
 
 
-- *********************************************************************************  
-- Procedimento Padrão para leitura de peso 
PROCEDURE PR_LER_PESO (peso_bruto    IN OUT BINARY_INTEGER 
                      ,peso_liquido  IN OUT BINARY_INTEGER 
                      ,peso_tara     IN OUT BINARY_INTEGER 
                      ,IPStr         IN VARCHAR2 
                      ,Canal         IN VARCHAR2 
                      ,p_open        IN VARCHAR2) 
IS 
 
  IP_SETADO     BINARY_INTEGER; 
  CANAL_SETADO  BINARY_INTEGER; 
  v_result      BINARY_INTEGER; 
  v_estado_mov  VARCHAR2(01); 
  v_bruto       VARCHAR2(20); 
  v_liquido     VARCHAR2(20); 
  v_tara        VARCHAR2(20); 
  v_conta       NUMBER := 0; 
   
  V_CONTA1 number := 0; 
   
  -- 
  v_sensor_ativo  VARCHAR2(01); 
  v_porta_entrada NUMBER; 
  VALIDA_SENSOR   VARCHAR2(32000) := NULL; 
  ativa_saida_0   BINARY_INTEGER; 
  -- 
  msg_erro        VARCHAR2(1000); 
  erro_conexao    EXCEPTION;   
  erro_sensor     EXCEPTION;   
  erro_estado_mov EXCEPTION; 
  v_flg_obstaculo VARCHAR2(01); 
  -- 
  v_erro       VARCHAR2(1000); 
  erro         EXCEPTION;   
   
BEGIN 
   
  ABREDLL(P_OPEN); 
   
  -- Executar a conexão 
  IP_SETADO := Seta_Ip(IPStr); 
   
  IF IP_SETADO >= 0 THEN 
  		 
  		CANAL_SETADO := W9091(IP_SETADO, Canal); 
 
  		IF CANAL_SETADO < 0 THEN 
  			   
  			  CLEAR_MESSAGE; 
  			  MESSAGE('ERRO NO MOMENTO DE SETAR O CANAL (W9091)!') ; 
  			   
  			  WHILE CANAL_SETADO < 0 AND V_CONTA <= 100 LOOP 
  			     CANAL_SETADO := W9091(IP_SETADO, Canal); 
  			     v_conta := v_conta + 1; 
  			  END LOOP; 
  			   
  			  IF CANAL_SETADO < 0 THEN 
  			     msg_erro := 'ERRO NO MOMENTO DE SETAR O CANAL (W9091)!: '||CANAL_SETADO; 
  	  	     RAISE erro_conexao; 
  	  	  END IF; 
  	  	   
  	  END IF;  	   
 
 
  ELSE 
  		 msg_erro := 'ERRO NO MOMENTO DE SETAR O IP (Seta_Ip)!: '||IP_SETADO; 
       RAISE erro_conexao; 
  END IF; 
 
  -- Limpa campos do peso 
  v_bruto   := 0;  
  v_liquido := 0;  
  v_tara    := 0;  
   
  v_result := Select_Canal(CANAL_SETADO); 
 
  IF v_result < 0 THEN 
  		msg_erro := 'ERRO NO MOMENTO DE SELECIONAR O CANAL (Select_Canal)!'; 
    	RAISE erro_conexao; 
  END IF; 
 
  V_CONTA1 := 0; 
 
  -- 
  IF v_erro IS NOT NULL THEN 
     RAISE erro; 
  END IF; 
 
  -- Se o veículo estiver posicionado corretamente na balança 
  IF msg_erro IS NULL THEN 
 
     v_result := Update_Canal(CANAL_SETADO); 
     IF v_result < 0 THEN 
        msg_erro := 'ERRO NO MOMENTO DE ATUALIZAR O CANAL (Update_Canal)!'; 
        RAISE erro_conexao; 
     END IF; 
  
       
  
       v_bruto   := Gross_Canal(CANAL_SETADO);                 
 
       v_tara    := Tare_Canal(CANAL_SETADO);      
 
     	 v_liquido := 0; 
 
      
	   peso_bruto   := TO_NUMBER(NVL(v_bruto,0)); 
	   peso_tara    := TO_NUMBER(NVL(v_tara,0)); 
	   peso_liquido := TO_NUMBER(NVL(v_liquido,0)); 
      
  END IF; 
   
  -- Libera Conexão 
  Close_Canal(CANAL_SETADO); 
   
EXCEPTION   	  
  WHEN erro_conexao THEN 
		MESSAGE('Erro na conexão da Balança: '||msg_erro); 
		MESSAGE('Erro na conexão da Balança: '||msg_erro); 
		-- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
		RAISE FORM_TRIGGER_FAILURE; 
  WHEN erro_sensor THEN 
    MESSAGE(msg_erro); 
    MESSAGE(msg_erro); 
    -- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
    RAISE FORM_TRIGGER_FAILURE; 
  WHEN erro THEN 
    MESSAGE(v_erro); 
    MESSAGE(v_erro); 
    -- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
    RAISE FORM_TRIGGER_FAILURE; 
  WHEN erro_estado_mov THEN 
    MESSAGE(msg_erro); 
    MESSAGE(msg_erro); 
    RAISE FORM_TRIGGER_FAILURE; 
  WHEN OTHERS THEN 
    MESSAGE('PR_LER_PESO : ' || SQLERRM);  	    
    MESSAGE('PR_LER_PESO : ' || SQLERRM); 
    -- Libera Conexão 
	  Close_Canal(CANAL_SETADO); 
    RAISE FORM_TRIGGER_FAILURE; 
END PR_LER_PESO;     
 
PROCEDURE ABREDLL (P_OPEN VARCHAR2)  
IS 
 
  vout   VARCHAR2(01); 
   
  BEGIN 
  	  
  	 ------------------------------------------------------------------------------------------------------------------------------- 
     /* CONSIDERAÇÕES IMPORTANTÍSSIMAS SOBRE A DLL */                                                                               
     ------------------------------------------------------------------------------------------------------------------------------- 
     -- DLL À SER UTILIZADA! 
     ------------------------------------------------------------------------------------------------------------------------------- 
     -- UTILIZAR A QUE O PROGRAMA DE INSTALAÇÃO FORNECE. JOGAR EM C:\WINDOWS\SYSTEM32 (PCLINK6.DLL). 
     -- 
     -- **************************************************************************************************************************** 
     -- *** NÃO ALTERAR A ORDEM DAS PROCEDURES E FUNÇÕES ABAIXO (PRINCIPALMENTE DAS CHAMADAS) !!!! *** 
     -- **************************************************************************************************************************** 
     --- Área Global  	 
     IF P_OPEN = 'não' THEN 
     	 
     	  BEGIN   
           retorno1 := Ora_Ffi.Load_Library(:PARAMETER.P_DIRETORIO_padrão_DLL, :PARAMETER.P_NOME_padrão_DLL); 
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it. 
     	  EXCEPTION 
     	  	WHEN OTHERS THEN   
					  FFI_ERROR	:= TRUE; 
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE; 
					  FFI_Error_Code	:= TOOL_ERR.CODE; 
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP 
					  	  Message('1-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)|| 
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)|| 
					  	          'Erro:'||chr(13)||chr(10)|| 
					  	          TOOL_ERR.MESSAGE); 
					  	          TOOL_ERR.POP; 
					  END LOOP; 
			 		  TOOL_ERR.CLEAR;            
     	  END; 
     	   
     ELSE     	 
     	   
     	  BEGIN       	   
           retorno1 := ora_ffi.find_library(:PARAMETER.P_NOME_padrão_DLL); 
			  -- Place the first error on the TOOL_ERR stack into the package header variables available for it. 
     	  EXCEPTION 
     	  	WHEN OTHERS THEN   
					  FFI_ERROR	:= TRUE; 
					  FFI_Error_Text	:= TOOL_ERR.MESSAGE; 
					  FFI_Error_Code	:= TOOL_ERR.CODE; 
					  FOR iErrors IN 1..TOOL_ERR.NERRORS LOOP 
					  	  Message('2-Erro ao localizar e abrir a DLL('||:PARAMETER.P_NOME_padrão_DLL||'): '||chr(10)|| 
					  	          'Verifique o caminho informado na FUNÇÃO e, se o arquivo encontra-se no diretório. '||chr(10)|| 
					  	          'Erro:'||chr(13)||chr(10)|| 
					  	          TOOL_ERR.MESSAGE); 
					  	          TOOL_ERR.POP; 
					  END LOOP; 
			 		  TOOL_ERR.CLEAR;            
     	  END;  
     	   
     END IF;      
 
		      
		  -- *********************************************************************************  	 
		  -- Utilizado para função Seta_Ip 
		  /* Registra a função da DLL. */ 
		  retorno2 := Ora_Ffi.Register_Function(retorno1, 'Seta_Ip', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno2, Ora_Ffi.C_CHAR_PTR); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno2, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função W9091  	 
		  /* Registra a função da DLL. */ 
		  retorno3 := Ora_Ffi.Register_Function(retorno1, 'W9091', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_INT); 
		  Ora_Ffi.Register_Parameter (retorno3, Ora_Ffi.C_CHAR_PTR); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno3, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Select_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno4 := Ora_Ffi.Register_Function(retorno1, 'Select_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno4, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno4, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Close_Canal 
		  /* Registra a função da DLL. */ 
		  retorno5 := Ora_Ffi.Register_Function(retorno1, 'Close_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno5, Ora_Ffi.C_INT); 
		  -- ********************************************************************************* 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Update_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno6 := Ora_Ffi.Register_Function(retorno1, 'Update_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno6, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno6, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		 
		  -- *********************************************************************************  	 
		  -- Utilizado para função Gross_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno7 := Ora_Ffi.Register_Function(retorno1, 'Gross_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno7, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno7, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		 
			-- *********************************************************************************  	 
		  -- Utilizado para função Net_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno8 := Ora_Ffi.Register_Function(retorno1, 'Net_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno8, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno8, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		 
			-- *********************************************************************************  	 
		  -- Utilizado para função Tare_Canal  	 
		  /* Registra a função da DLL. */ 
		  retorno9 := Ora_Ffi.Register_Function(retorno1, 'Tare_Canal', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno9, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno9, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		    
		  -- *********************************************************************************  	 
		  -- Utilizado para função DIO_InBit	 
		  /* Registra a função da DLL. */ 
		  retorno10 := Ora_Ffi.Register_Function(retorno1, 'DIO_InBit', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno10, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno10, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função Update_NoMotion 
		  /* Registra a função da DLL. */ 
		  retorno11 := Ora_Ffi.Register_Function(retorno1, 'Update_NoMotion', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno11, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno11, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função DIO_InPortStr 
		  /* Registra a função da DLL. */ 
		  retorno12 := Ora_Ffi.Register_Function(retorno1, 'DIO_InPortStr', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno12, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno12, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função DIO_OutPortStr 
		  /* Registra a função da DLL. */ 
		  retorno13 := Ora_Ffi.Register_Function(retorno1, 'DIO_OutPortStr', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_INT); 
		  Ora_Ffi.Register_Parameter (retorno13, Ora_Ffi.C_CHAR_PTR); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno13, Ora_Ffi.C_INT);  	 
		  -- ********************************************************************************* 
		   
		  -- *********************************************************************************  	 
		  -- Utilizado para função Estado_EmMovimento 
		  /* Registra a função da DLL. */ 
		  retorno14 := Ora_Ffi.Register_Function(retorno1, 'Estado_EmMovimento', Ora_Ffi.C_Std); 
		 
		  /* Registra a variável da função e da DLL. */ 
		  Ora_Ffi.Register_Parameter (retorno14, Ora_Ffi.C_INT); 
		 
		  /* Registra o Tipo de Retorno da DLL. */ 
		  Ora_Ffi.Register_Return (retorno14, Ora_Ffi.C_CHAR_PTR);  	 
		  -- ********************************************************************************* 
 
  exception 
      	 
      when erro_nulo then 
      	 raise form_trigger_failure; 
 
  END; 
 
END BL_TOLEDO; 
Call

Select all

 
------------------------------------------------------------------------------------ 
-- FUN_LER_BALANCA_NOVA: Função que busca o peso (tara ou bruto) da balança nova. 
------------------------------------------------------------------------------------ 
/* PTIPO_LEITURA: (B)ruto, (L)iquido ou  (T)ara */ 
------------------------------------------------------------------------------------ 
FUNCTION FUN_LER_BALANCA_NOVA  
RETURN NUMBER  
IS 
 
  v_peso_bruto      NUMBER; 
  v_peso_liquido    NUMBER; 
  v_peso_tara       NUMBER; 
   
  v_nome_computador varchar2(80); 
  v_tip_proc    VARCHAR2(20); 
  v_end_maquina VARCHAR2(20); 
  v_canal       VARCHAR2(20); 
  v_erro        VARCHAR2(4000); 
   
  erro_balancav2 EXCEPTION; 
   
BEGIN 
      
     -- Não retirar. 
     DEFAULT_VALUE('não','GLOBAL.CHAMOU_PCLINK');      
      
     BL_TOLEDO.PR_LER_PESO (PESO_BRUTO    => v_peso_bruto,   
                            PESO_LIQUIDO  => v_peso_liquido,  
                            PESO_TARA     => v_peso_tara,  
                            IPSTR         => :PARAMETER.P_IP_BALANCA_TOLEDO,  
                            CANAL         => :PARAMETER.P_CANAL_BALANCA /*v_canal*/,  
                            P_OPEN        => :GLOBAL.CHAMOU_PCLINK);	 
 
     :GLOBAL.CHAMOU_PCLINK := 'SIM'; 
 
     RETURN (NVL(v_peso_bruto,0));	  
  
EXCEPTION 
 
  WHEN OTHERS THEN 
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM); 
     MESSAGE('Erro fun_ler_balanca : '||SQLERRM); 
     RAISE FORM_TRIGGER_FAILURE; 
   
END; 
/ quote]
99]]
Trevis, beleza?

Is this PL / SQL solution provided by the manufacturer?

I even posted in another topic http://en.glufke.net/oracle/viewtopic.php?f=4&t=2374 mentioning that I need to capture the balance Toledo ind 780 from inside the Oracle EBS R11, by chance you have an idea of ??how Can I proceed or have any practical example?

Doubts of how for example the application would look at the DLL installed on the machine where the scales is, since Form in EBS is running on the server and not locally, etc.

I am somewhat confused as to this subject.
User avatar
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Posts: 342
Joined: Mon, 29 Jan 2007 7:36 am
Location: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

somebody?
Post Reply
  • Information
  • Who is online

    Users browsing this forum: No registered users and 11 guests