SAP soll JavaMethode aufrufen

Rund um Java und SAP®.

SAP soll JavaMethode aufrufen

Postby William4545 » Tue Jul 13, 2004 11:40 am

Hi,
ich versuche von SAP auf Methoden einer JavaKlasse zuzugreifen. Leider ist mir das noch nicht gelungen. Dokumentationen finde ich immer nur für die Richtung Java -> SAP.

Was habe ich bisher gemacht:

Auf dem SAP-System:
SM59 --> TCP/IP Verbindungen
JAVARFC
Type: T
Aktivierungsart: Registriertes Serverprogramm
ProgrammID: JAVARFC

Auf dem JAVA-System:
Serverdatei angepasst (Example5 aus der ARASoft-Doku):
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. srv[0] = new Server("IP","3302","JAVARFC",repository);
  2. ...
  3.  
  4. protected void handleRequest(JCO.Function function)
  5. {
  6.       JCO.ParameterList input  = function.getImportParameterList();
  7.       JCO.ParameterList output = function.getExportParameterList();
  8.       JCO.ParameterList tables = function.getTableParameterList();
  9.  
  10.       System.out.println("handleRequest(" + function.getName() + ")");
  11.  
  12.       if (function.getName().equals("FUNCTION_SM")) {
  13.          writeFile("Hallo Test" + cal.getTime());
  14.       }
  15. ...
  16. }
  17.  
  18.  
GeSHi ©

Verbindung klappt auch.

Nun versuche ich aus dem SAP eine Methode aufzurufen.
Dazu habe ich einen Fktbaustein ZSM_JAVARFC als remotefähig erstellt.
Quelltext:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *"  EXPORTING
  2. *"     VALUE(E_TEXT) TYPE  STRING
  3. *"     VALUE(E_FUNCTION) TYPE  STRING
  4. *"  EXCEPTIONS
  5. *"      SYSTEM_FAILURE
  6. *"----------------------------------------------------------------------
  7. DATA: wert TYPE string VALUE 'WERT'.
  8. MOVE wert TO e_text.
  9. MOVE i_function TO e_function.
  10.  
GeSHi ©

Ausserdem habe ich ein Programm geschrieben, der auf den Fktbaustein zugreifen und die Funktion übergeben soll
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. REPORT  zsm_0001 MESSAGE-ID at.
  2.  
  3. text_ausgabe = ''.
  4. function_ausgabe = ''.
  5. function = 'FUNCTION_SM'.
  6. text = 'Daten gefunden'
  7.  
  8. CALL FUNCTION 'ZSM_JAVARFC' DESTINATION 'JAVARFC'
  9.   EXPORTING
  10.     i_text         = text
  11.     i_function     = function
  12.   IMPORTING
  13.     e_text         = text_ausgabe
  14.     e_function     = function_ausgabe
  15.   EXCEPTIONS
  16.     system_failure = 1
  17.     OTHERS         = 2.
  18. IF sy-subrc <> 0.
  19.   WRITE: 'Fehler beim Funktionsaufruf'.
  20.  
GeSHi ©


Aber ich bekomme hier den system-failure.

Gibt es irgentwo eine Doku, wo beschrieben ist, wie ich aus SAP JAVAMethoden aufrufen kann??? Wie übergebe ich die "function" an den "handleRequest"??

Vielen Dank
Steffi
William4545
..
..
 
Posts: 55
Joined: Tue Jul 13, 2004 11:40 am

Postby Jolin2218 » Tue Jul 13, 2004 5:57 pm

Hi Steffi,

im grossen und ganzen sieht das eigentlich gut aus, was Du beschrieben hast. Das Thema wurde hier schon einmal 'angerissen', nämlich in diesem Thread:

http://www.abapforum.com/forum/viewtopic.php?t=683

Hilft Dir das weiter?

Gruss,
Jens
Jolin2218
...
...
 
Posts: 105
Joined: Mon Dec 02, 2002 2:28 pm

hilft leider nicht

Postby William4545 » Wed Jul 14, 2004 10:38 am

Moin,
diesen Threat hatte ich schon gefunden. Leider hilft er mir nicht weiter, da ich nicht weiss, wo ich der JavaKLasse die Funktion übergebe. Nach dieser wird ja im handleRequest nachgefragt. Wo muss ich die eintragen? In der TCP/IP-Verbindung, oder im Funktionsbaustein, oder ... ???

steffi
William4545
..
..
 
Posts: 55
Joined: Tue Jul 13, 2004 11:40 am

Postby Emre397 » Wed Jul 14, 2004 11:48 am

Hi Steffi,

muß ehrlich gestehen, daß ich diese seite von ABAP -> Java noch nie ausprobiert habe. Interessiert mich aber sehr!
Ich hab aber schon mit RFC Bausteinen und aufrufen gearbeitet.

Und was mir aber bei deinem beispiel auffällt ist, daß du einen RFC fähigen baustein angelegt hast. Ich vermute, daß genau dies nicht notwendig ist. Denn die RFC Eigenschaft ermöglicht es anderen Systemen auf den Baustein zugreifen zu lassen. Nicht aber daß dieser baustein dann über rfc auf irgend ein zielsystem zugreift.

So wie ich das verstanden habe gibt man durch die destination den Javaserver an. (Port usw. in der SM59 pflegen) Und die Funktion die Ausgeführt wird ist der name der nach CALL FUNCTION angegeben wird. Welche frage sich mir stellt ist: In welchem zusammenhand steht das hinter dem CALL FUNCTION mit dem JAVA bereich. Ist es eine Klasse, die dann ausgeführt wird (als initialmethdode do_handle_request ... die dann direkt gestartet wird wie z.b. bei JSP's) oder kann man da differenzieren und ggf. methodennamen aufrufen.

Wo hast du denn eigentlich die Beispiele her?

Gruß Azreal
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Postby William4545 » Wed Jul 14, 2004 12:10 pm

Moin Azreal,
tja, das ist ja das Problem, dass man zu dieser Richtung (ABAP->Java) keine Dokus findet. Die andere Richtung ist ausreichend dokumentiert :-(

Die Beispiele stammen aus der Doku zu JCO, was in der zip mit vorhanden ist.

steffi
William4545
..
..
 
Posts: 55
Joined: Tue Jul 13, 2004 11:40 am

Postby Emre397 » Wed Jul 14, 2004 12:19 pm

Tja... wäre auch zu einfach von ABAP direkt auf Java zu switchen...
Aber ich denke, daß nicht so schwer sein kann.

Ich glaube ich habe es einigermaßen verstanden:

Als RFC gibst du doch einen Port auf einer Kiste an, auf der deine Java Klasse läuft und auf genau diesem Port hört (wie ein Webserver).

D.h. du kannst nicht irgendwie differenzieren, und beim CALL FUNCTION schon einen Klassennamen oder gar Methodennamen angeben.

Was du in deiner Klasse aber hast ist das objekt function vom type JCO.Function. Dies hat die Methode getName. Und genau das gibt dir den Namen zurück den du in Call Funtion angegeben hast. Dadurch kannst du natürlich unterschiedliche aktionen ausführen. BZW. unterscheiden, welche function aufgerufen wurde.

Das bedeutet, du brauchst definitiv den Baustein ZSM_JAVARFC nicht.
Stell nochmal sicher, daß du die destionation richtig geplfegt hast, und daß diese auch funktioniert.

bin mir zu 80% sicher, daß es derzeit daran liegt.

Gruß Azreal
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Postby William4545 » Wed Jul 14, 2004 1:03 pm

Du hast recht. den Fkt-baustein benötige ich nicht.

Also habe ich jetzt folgendes:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. CALL FUNCTION 'FUNCTION_SM'
  2.                          DESTINATION 'JAVARFC'
  3.   EXCEPTIONS
  4.     communication_failure = 1  MESSAGE mess
  5.     system_failure        = 2  MESSAGE mess
  6.     OTHERS                = 3.
  7.  
GeSHi ©


als Fehler bekomme ich nun:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. JCO.Server could not find server function 'FUNCTION_SM'
  2.  
GeSHi ©


Hm, soll da nicht eigentlich der Handler anspringen? Hier ist doch definiert, was passieren soll.

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. if &#40;function.getName&#40;&#41;.equals&#40;"FUNCTION_SM"&#41;&#41; &#123;
  2.          writeFile&#40;"Hallo Test" + cal.getTime&#40;&#41;&#41;;
  3.       &#125;
  4.  
GeSHi ©


steffi
William4545
..
..
 
Posts: 55
Joined: Tue Jul 13, 2004 11:40 am

Postby Emre397 » Wed Jul 14, 2004 1:14 pm

Hast du auch einen server laufen?

wovon erbt denn deine klasse mit der handle Request Methode? Von der Klasse JCO.Server?

schau mal, was ich hier gefunden habe:
http://www.huihoo.org/openweb/jco_api/com/sap/mw/jco/JCO.Server.html

Wo bekommst du denn den fehler? R/3 (SM59) oder java...
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Postby William4545 » Wed Jul 14, 2004 1:22 pm

ja, den Server hab ich laufen.

Der Fehler erscheint sowohl im Java als auch in SAP.

in dem Link steht ja auch:
// Process incoming requests
public void handleRequest(JCO.Function fct) {
}

tja, aber da komme ich gar nicht hin! Ich werde sofort über die serverExceptionOccured(JCO.Server server, Exception ex)
rausgeschmissen.

steffi
William4545
..
..
 
Posts: 55
Joined: Tue Jul 13, 2004 11:40 am

Postby Emre397 » Wed Jul 14, 2004 1:38 pm

Echt ein interessantes thema...!

Du sagst also, daß du die server.start() methode ausführst...
komisch. ich vermute, daß die fehlermeldung etwas mit dem konstruktoraufruf auf sich hat, den du da benutzt.
Das ist doch dieser hier:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. JCO.Server&#40;java.lang.String gwhost, java.lang.String gwserv, java.lang.String progid, IRepository repository&#41;
GeSHi ©


kann das sein, daß du irgendwie mehrere serverinstancen aufmachen kannst. abhängig von den Konstruktorparametern?
und dir somit das mapping der im CALL FUNCTION übergebenen parameter schon vom JCO Framework abgenommen wird?!?...

somit müsstest du bei call function den progid von deinem konstruktor mitgeben... (oder im konstruktor als progid das angeben, was du im call function mitgegeben hast)...

jedenfalls ist es schon mal erfreulich zu hören, daß die fehlermeldung vom JCO.Server ins R/3 reinkommt.
schon mal ein fortschritt ;)
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Next

Return to Java & SAP®

Who is online

Users browsing this forum: No registered users and 7 guests