SAP soll JavaMethode aufrufen

Rund um Java und SAP®.
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

SAP soll JavaMethode aufrufen

Beitrag von steffi_ma (ForumUser / 55 / 0 / 0 ) »
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: Alles auswählen.

srv[0] = new Server("IP","3302","JAVARFC",repository);
...

protected void handleRequest(JCO.Function function)
{
      JCO.ParameterList input  = function.getImportParameterList();
      JCO.ParameterList output = function.getExportParameterList();
      JCO.ParameterList tables = function.getTableParameterList();

      System.out.println("handleRequest(" + function.getName() + ")");

      if (function.getName().equals("FUNCTION_SM")) {
      	writeFile("Hallo Test" + cal.getTime());
      }
...
}

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: Alles auswählen.

*"  EXPORTING
*"     VALUE(E_TEXT) TYPE  STRING
*"     VALUE(E_FUNCTION) TYPE  STRING
*"  EXCEPTIONS
*"      SYSTEM_FAILURE
*"----------------------------------------------------------------------
DATA: wert TYPE string VALUE 'WERT'.
MOVE wert TO e_text.
MOVE i_function TO e_function.
ENDFUNCTION.
Ausserdem habe ich ein Programm geschrieben, der auf den Fktbaustein zugreifen und die Funktion übergeben soll

Code: Alles auswählen.

REPORT  zsm_0001 MESSAGE-ID at.

text_ausgabe = ''.
function_ausgabe = ''.
function = 'FUNCTION_SM'.
text = 'Daten gefunden'

CALL FUNCTION 'ZSM_JAVARFC' DESTINATION 'JAVARFC'
  EXPORTING
    i_text         = text
    i_function     = function
  IMPORTING
    e_text         = text_ausgabe
    e_function     = function_ausgabe
  EXCEPTIONS
    system_failure = 1
    OTHERS         = 2.
IF sy-subrc <> 0.
  WRITE: 'Fehler beim Funktionsaufruf'.
ENDIF.
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

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Jens (Specialist / 106 / 0 / 0 ) »
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

hilft leider nicht

Beitrag von steffi_ma (ForumUser / 55 / 0 / 0 ) »
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

Beitrag von Azreal (Specialist / 182 / 1 / 0 ) »
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

Beitrag von steffi_ma (ForumUser / 55 / 0 / 0 ) »
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

Beitrag von Azreal (Specialist / 182 / 1 / 0 ) »
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

Beitrag von steffi_ma (ForumUser / 55 / 0 / 0 ) »
Du hast recht. den Fkt-baustein benötige ich nicht.

Also habe ich jetzt folgendes:

Code: Alles auswählen.

CALL FUNCTION 'FUNCTION_SM'
                         DESTINATION 'JAVARFC'
  EXCEPTIONS
    communication_failure = 1  MESSAGE mess
    system_failure        = 2  MESSAGE mess
    OTHERS                = 3.
als Fehler bekomme ich nun:

Code: Alles auswählen.

JCO.Server could not find server function 'FUNCTION_SM'
Hm, soll da nicht eigentlich der Handler anspringen? Hier ist doch definiert, was passieren soll.

Code: Alles auswählen.

if (function.getName().equals("FUNCTION_SM")) { 
         writeFile("Hallo Test" + cal.getTime()); 
      } 
steffi

Beitrag von Azreal (Specialist / 182 / 1 / 0 ) »
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/c ... erver.html

Wo bekommst du denn den fehler? R/3 (SM59) oder java...

Beitrag von steffi_ma (ForumUser / 55 / 0 / 0 ) »
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

Beitrag von Azreal (Specialist / 182 / 1 / 0 ) »
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: Alles auswählen.

JCO.Server(java.lang.String gwhost, java.lang.String gwserv, java.lang.String progid, IRepository repository) 
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 ;)

Beitrag von Jens (Specialist / 106 / 0 / 0 ) »
Hi Steffi,

offensichtlich läuft im Server etwas falsch, da die Methode 'serverExceptionOccurred' aufgerufen wird, die dann eine Exception wirft. Was sagt den der stackTrace? Den kannst Du in der Methode ja ausgeben oder ggf. in ein File schreiben (z.B.: FileWriter). Wenn Du den hier postest, kommt man evtl. der Sache auf die Schliche.

Gruss,

Jens

Beitrag von steffi_ma (ForumUser / 55 / 0 / 0 ) »
hi,
ich bin dem Fehler ein stück näher gekommen.

in meiner "function" ist null drin!

Code: Alles auswählen.

protected JCO.Function getFunction(String function_name)
    {
      JCO.Function function = super.getFunction(function_name);
      System.out.println("getFunction: " + function );
      return function;
    }
function_name hat den Wert: FUNCTION_SM

Die Umsetzung klappt also nicht!
steffi

Beitrag von Gast ( / / 0 / 3 ) »
Hi Steffi,

die Methode:

Code: Alles auswählen.

protected JCO.Function getFunction(String function_name) 
    { 
      JCO.Function function = super.getFunction(function_name); 
      System.out.println("getFunction: " + function ); 
      return function; 
    } 
musst Du nicht überschreiben, das ist nicht notwendig.

Was Du allerdings machen musst, ist ein Repository zu erzeugen und dort die Funktion entsprechend zu definieren (siehe auch Beispiel 5 aus dem Tutorial).

Code: Alles auswählen.

    repository = new Repository("TestRepository");

    // non-unicode definition of functions. The server with this repository can
    // dispatch calls only from non-unicode systems

    //------------------------------------------------------------------------------
    //  Add function 'STFC_CONNECTION'
    //------------------------------------------------------------------------------
    JCO.MetaData fmeta = new JCO.MetaData("STFC_CONNECTION");
    fmeta.addInfo("REQUTEXT", JCO.TYPE_CHAR, 255,   0,  0, JCO.IMPORT_PARAMETER, null);
    fmeta.addInfo("ECHOTEXT", JCO.TYPE_CHAR, 255,   0,  0, JCO.EXPORT_PARAMETER, null);
    fmeta.addInfo("RESPTEXT", JCO.TYPE_CHAR, 255,   0,  0, JCO.EXPORT_PARAMETER, null);
    repository.addFunctionInterfaceToCache(fmeta);

Ich vermute mal, dass in der Definition des Repository etwas nicht stimmt, da bei Dir function 'null' ist.

Gruss,

Jens

*FREU*

Beitrag von steffi_ma (ForumUser / 55 / 0 / 0 ) »
Ja!!! Das war es!!!
Endlich funkitoniert alles so, wie es soll :lol: :lol:
Danke an alle

Beitrag von Jens (Specialist / 106 / 0 / 0 ) »
Hi Steffi,

na also, geht doch ;-)
Kannst Du mal Dein Coding hier posten?
Danke.

Gruss,

Jens

Vergleichbare Themen

10
Antw.
8249
Views
BAPI_USER_GET_DETAIL aufrufen
von bohne » 28.10.2006 17:02 • Verfasst in ABAP® für Anfänger
0
Antw.
2023
Views
Webservice aufrufen aus 4.6C?
von Janosch2 » 21.06.2005 11:16 • Verfasst in Web Application Server
5
Antw.
3652
Views
Transaktion aufrufen
von phil1982 » 13.09.2007 14:12 • Verfasst in ABAP® für Anfänger
1
Antw.
3424
Views
BSP Eventhandler aufrufen
von Tommy Nightmare » 13.03.2018 08:48 • Verfasst in Web-Dynpro, BSP + BHTML
1
Antw.
1612
Views
Methoden aufrufen
von chyth » 30.07.2007 15:06 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 58 Minuten von DeathAndPain 14 / 10741
Dialog-Container mit Toolbar/Status
vor einer Stunde von DeathAndPain gelöst 24 / 3876
User Exit EXIT_RQCPRM10_001
vor 20 Stunden von a-dead-trousers 2 / 345
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1396

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 58 Minuten von DeathAndPain 14 / 10741
Dialog-Container mit Toolbar/Status
vor einer Stunde von DeathAndPain gelöst 24 / 3876
User Exit EXIT_RQCPRM10_001
vor 20 Stunden von a-dead-trousers 2 / 345
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1396

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2928
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9521