![]() |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi
Das mit den einfachen Datentypen für die Import und Exportparameter funktioniert auch schon ganz gut. Mein Problem ist, dass unsere SAP Jungs da keine einfachen Datentypen, sondern Strukturen dafür verwendet haben. Folgende Importparameter werden verwendet:
Delphi-Quellcode:
Das Problem sind die IT_Req* Strukturen. Ich kann da eine beliebige Anzahl an Strukturen anhängen.TTFieldName = record Field: array[1..30] of Char; end; TInputParam = record I_FabNr: array[1..6] of Char; // Fabrication Number I_PAufN: array[1..8] of Char; // Order Number I_VBELN: array[1..10] of Char; // SD-Number I_OPSDokNr: array[1..25] of Char; // Job-Number IT_Req_Act_Fields: TTFieldName; IT_Req_Txt_Fields: TTFieldName; end; Das mit den Strukturen haben unsere SAP Leute auch bei den Changing und Output Parametern gemacht. mfg Roli |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Zitat:
Delphi-Quellcode:
z.B. in testRFC8.dpr
procedure setRFCTable(tableName: string; rowsize: integer);
erzeugen. Zitat:
Im Trace-FIle stehen dann so Sachen wie:
Delphi-Quellcode:
und was dann so zurück kam
>>> Logon check: calling RFCPING
>>> RfcCall [1] ... *> RfcCall FUNCTION RFCPING handle = 1 parameter = <NULL> tables = <NULL> UUID: RfcCallNew send the uuid to the partner {5AA1EECC-AFD7-4FD2-8D3A-14D5FE7E3A62} >>>> [1] <unknown> : EXT <ac: 3> L 172.16.2.220 >>> WRITE (73504050) -{5AA1EECC-AFD7-4FD2-8D3A-14D5FE7E3A62} 000000 | D9C6C3F0 F0F0F0F0 F0F0F0E3 01010008 |................| 000010 | 01010101 01010000 01010103 00040000 |................|
Delphi-Quellcode:
Nicht besonders erbaulich, aber teilweise sehr hilfreich beim debuggen.
Listen/WaitForRequest (counter = 3)
>>>> [1] <unknown> : EXT <ac: 6> L 172.16.2.220 >>> LISTEN (73504050) -{5AA1EECC-AFD7-4FD2-8D3A-14D5FE7E3A62} 000000 | 01010008 01020101 01010000 01010103 |................| 000010 | 00040000 020B0103 0106000B 01010000 |................| Zumindest sieht man, wer der Depp ist :wink: Sprich, ob was Falsches zurück kommt, oder ob man selbst zu blöd ist, es richtig zu "verwurschten". Zitat:
Klingt abenteuerlich, aber mit anderen Konstrukten bin ich mehrfach auf die Nase gefallen. Wichtig ist nur das vorherige Befüllen mit #0 |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
hmmm... würd dir da gerne helfen, aber ich glaube das ich nicht dahintersteige was genau dein Problem ist.
Ich versuche es mal zu interpretieren. Du hast einfache Importparameter mit nur EINEM Feld. Nun hast du das Problem, dass du viele Felder in einem Importparameter vorhanden sind richtig? Und hier die Lösung: Eine Struktur in RFC ist nix weiteres als ein laaaanger String. Hier eine kleine Grafik dazu FELD 1 | FELD 2 | FELD 3| ich.bin.das.erste.FeldTest......test3... in der Tabelle oder Struktur wird es so aussehen: Feld 1 | ich bin das erste Feld Feld 2 | Test Feld 3 | test3 das ganze ist in wirklichkeit nicht gesplittet. Die Importparams sind nur durch offsets, also die länge der einzelnen Felder, gekennzeichnet. Also gilt
Delphi-Quellcode:
Struktur sieht dann wie folgt aus:
TMusterStruct = record
name : array[1..10] of char; vorname : array[1..20] of char; end; procedure schiessmichtot(); var komplizierteStruktur : TMusterStruct; begin komplizierteStruktur.name := 'meinName'; komplizierteStruktur.vorname := 'meinVorname'; RFC.HochladenUndExecute( komplizierteStruktur ); end; komplizierteStruktur = |meinName..meinVorname.........| |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi
Habe natürlich was vergessen. Neben den beschriebenen Strukturen habe ich auch noch folgende Struktur zu befüllen:
Delphi-Quellcode:
Die Import und Exportparameter benötigen nur eine einfache Struktur. Der ChangingTReqFields = record FName: array[1..30] of Char; Value: array[1..132] of Char; end; TChangingParam = record CT_Order_Fields: array of TReqFields; end; Parameter benötigt jedoch eine Struktur, bei der FName der Eingangsparameter und Value der Rückgabeparameter von SAP sind. Und da streikt das RFC. |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Ach ja. Danke für deinen Tipp mit dem Trace. Bekomme folgenden Rückgabewert:
>>> RfcReceiveEx [1] ... >>>> [1] <unknown> : EXT <ac: 10> 128.47.15.231 >>> FLUSH(WRITE) (79696407) -{3F826D77-F3DD-47C2-84F3-12DF672E9638} >>>> [1] <unknown> : EXT <ac: 11> 128.47.15.231 >>> READ (79696407) -{3F826D77-F3DD-47C2-84F3-12DF672E9638} 000000 | 05000000 05000403 001E4341 4C4C5F46 |..........CALL_F| 000010 | 554E4354 494F4E5F 494C4C45 47414C5F |UNCTION_ILLEGAL_| 000020 | 44415441 5F545950 04030402 00454461 |DATA_TYP.....EDa| 000030 | 74656E66 65686C65 72202875 6E67FC6C |tenfehler (ung.l| 000040 | 74696765 72204461 74656E74 79702030 |tiger Datentyp 0| 000050 | 29206265 69206569 6E656D20 2752656D |) bei einem 'Rem| 000060 | 6F746520 46756E63 74696F6E 2043616C |ote Function Cal| 000070 | 6C272E04 02FFFF00 00FFFF00 00000000 |l'..............| >TS> Tue Feb 20 10:49:23 2007 ======> Datenfehler (ungültiger Datentyp 0) bei einem 'Remote Function Call'. >>>> [1] <unknown> : EXT <ac: 12> 128.47.15.231 >>> CLOSE abrfcrcv.c 400 (79696407) -{3F826D77-F3DD-47C2-84F3-12DF672E9638} *> RfcReceiveEx ... handle = 1 Data conversion On <* RfcReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION <* RfcCallReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION *> RfcClose ... handle = 1 >>>> [1] <unknown> : EXT <ac: 13> 128.47.15.231 >>> FREE abrfc.c 522 (79696407) -{3F826D77-F3DD-47C2-84F3-12DF672E9638} **** Trace file opened at 20070220 104923 Westeuropäische, SAP-REL 620,0,1929 RFC-VER 3 755830 MT-SL <* RfcClose Habe ich da den Typ falsch angegeben ?? |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
im zweifel immer nur strings übergeben... die werden immer angenommen ;)
Die Import und Exportparameter benötigen nur eine einfache Struktur. Der Changing Parameter benötigt jedoch eine Struktur, bei der FName der Eingangsparameter und Value der Rückgabeparameter von SAP sind. Dann mach es doch einfach.... baue noch eine struktur mit jeweis nur einem Feld |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi
Habe es nochmal ausprobiert, die Struktur folgendermaßen zu übergeben:
Delphi-Quellcode:
Dabei bekomme ich folgende Meldung:
if (StrLen(@InputParam.IT_Req_Txt_Fields.Field) <> 0) then
SetInputParam('IT_REQ_TXT_FIELDS', 30, @InputParam.IT_Req_Txt_Fields.Field, 0); procedure TSAPRFC.SetInputParam(const aParamName: string; aParamLength: Integer; aParamValue: Pointer; aParamType: Integer); // Setzt Eingabeparameter für den RFC var i: integer; begin i := 0; while (i < SAPRFC_MaxParameters) and (FExporting[i].Name <> nil) do inc(i); if i = SAPRFC_MaxParameters then raise Exception.Create('Max params exeeded!'); FExporting[i].Name := PChar(aParamName); FExporting[i].nLen := Length(aParamName); FExporting[i].aType := aParamType; FExporting[i].Leng := aParamLength; FExporting[i].Addr := aParamValue; end; T:3256 ======> Datenfehler (ungültiger Datentyp 0) bei einem 'Remote Function Call'. T:3256 <* RfcReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION T:3256 <* RfcCallReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION Schätze den Datentyp so zu übergeben funktioniert nicht. Habe in der Transaktion se37 nachgeguckt und zu dem Datentyp TTFIELDNAME folgende Informationen gefunden: Initialisierung und Zugriff: Standardtabelle Zeilentyp: Datentyp = CHAR Zahl der Stellen = 30 Wie kann ich nun einen Tabellentyp als Importparameter übergeben ?? |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
was hast du denn jetzt zum übergeben, ein Parameter oder eine Tabelle? Das ganze Teil funktioniert bei mir. Und ich habe NUR Char's benutzt. Anders lässt sich das nicht lösen.
Also ParamType immer auf "0" lassen !!! Es handelt sich hierbei nur um einen Typen... egal ob er als parameter oder als feld in der tabelle auftaucht |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi
Das ist genau die Frage, die ich nicht beantwortet bekomme. Laut SAP ist der Datentyp TTFieldName eine Standardtabelle, die als Importparameter übergeben wird. Muss ich nun mit SetRFCTable das als Tabelle anhängen (dachte immer dafür wäre der Tables Reiter), oder als normlen Importparameter übergeben (wo ja SAP motzt wegen dem DatenTyp) ?? |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Also doch eine Tabelle ;)
Ja du musst diese Struktur im System einbinden, dann abschicken. Das hatte ich aber schon mal beschrieben wie das geht. |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Zitat:
Gruß, Christoph |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi Leute
Ich habe nun die Daten als Tabelle übergeben. Folgendes Ergebnis >TS> Wed Feb 21 15:38:34 2007 ======> Error CALL_FUNCTION_ILLEGAL_P_TYPE occured. P1=2 >>>> [1] <unknown> : EXT <ac: 12> 128.47.15.231 >>> CLOSE abrfcrcv.c 400 (82738583) -{3E122FCD-0854-4550-8D9F-7907597B18D1} ==== Delta 1 detaching (head) hRfc 1 ID 1 *> RfcReceiveEx ... handle = 1 tables[0].name = IT_REQ_TXT_FIELDS tables[0].nlen = 17 tables[0].leng = 30 tables[0].type = 00000021 tables[0].newitab = 0 tables[0].itmode = RFC_ITMODE_BYREFERENCE ItFill(tables[0].ithandle) = 1 ItLeng(tables[0].ithandle) = 30 Data conversion On <* RfcReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION <* RfcCallReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION Im letzte Thread hat pertzschc geschrieben, dass es nicht möglich ist, Tabellen über RFC als Importparameter zu übergeben. Tja, wie gehts denn dann ?? |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Zitat:
Es gibt zwei Möglichkeiten: - Man benutzt einen anderen Funktionsbaustein - Man kümmert sich darum, dass im SAP System ein weitere Baustein den eigentlichen Baustein kapselt und dann den Parameter richtig als Tabellen-Parameter deklariert und intern den Aufruf auf den eigentlichen Baustein durchreicht und Ergebnisse wieder herausgibt. Gruß, Christoph |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi
Ein guter Einwand. Laut der SAP Dok (noch ne größere Katastrophe als die Hilfe in D2006) sollte aber das Handle nach einem RPCInstallStructure auch einem Parameter angehängt werden. Wie sicher ist das, das man solche Strukturen (bißchen komisch ist das schon, dass man einen Tabellentyp einem Parameter übergibt) nicht den Import/Export Parametern anhängen kann ?? |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Moin moin Roland,
Zitat:
Was ich aber mit Gewissheit sagen kann, ist: pack alles in Strings und übergib diese, das funktioniert. Alle anderen Versuche mit anderen Daten-Typen und -Strukturen haben (zumindest bei uns) nur viel Ärger und viel Arbeit bei geringem Erfolg gebracht. Ich lasse mich aber gern vom Gegenteil überzeugen !!! |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Liste der Anhänge anzeigen (Anzahl: 1)
hatte mir "bapi is here" sicherheitshalber mal auf meinen lokalen rechner gelegt
vielleicht kann ich so etwas kleines beisteuern |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Liste der Anhänge anzeigen (Anzahl: 1)
und habe gerade noch eine - vielleicht veraltetet - beschreibung vom SAP .NET Connector Version 1.0 (vom Nov 2002) gefunden
leg auch diese mal bei |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Ist das nicht der .NET Connector mit den ActiveX Komponenten? Ich schaue mal später rein...
|
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
apropos.... schlechte Dokus etc.
Hab da so ein Buch das nennt sich "SAP - Schnittstellen - Programmierung". Es ist eigentlich ganz ok. C++ Code für RFC. Da wird aber auch viel vergessen, quasi muss man selber einige Sachen rausfinden. schaut es euch aber mal an: 3-89842-445-6 es ist auf jeden Wert das mal gesehen zu haben. |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi,
zumindest "BAPI-is-here" setzt auf ActiveX auf und ist damit von der Version der jeweiligen librfc32.dll abhängig. |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
hmmm.... na dann.
Ich werde weiterhin mich an den Kompos dran setzen... die werden um einiges schneller sein als ActiveX. Gerade für Migrationstools von sehr großen Vorteil. Aber das ist dann jedem seine Sache, wer auf was setzt. |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
hi
Zitat:
Ich halte nichts von den ActiveX-Sachen. Zu umständlich und man weis nicht, was passiert. |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi Misek
Hast du eigentlich die Email Adresse oder Telefonnummer vom Michael Schumann ?? Wollte mal ein bißchen mit ihm plauschen. |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Moin moin,
wie ist eigentlich der Stand der Dinge, bei diesem Projekt ? Bei einer aktuellen Aufgabenstellung, ergab sich mir die Frage: wie transferiere ich TABELLEN gleichzeitig hin/zurück ? Bei Exporting/Importing/Changing ist die Datenrichtung beim RFC-Aufruf ja recht eindeutig. Bei Tabellen (Mehrzahl !) scheint mir das aber nicht so zu sein. Was, wenn ich 0 Tabellen exportiere, aber 5 importiere; oder umgekehrt. Oder, wenn 2 nach SAP müssen und 3 wieder zurück zu mir ? Hat da jemand Erfahrungen mit ? |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Zitat:
Dann bestückst Du die "Import"-Tabellen mit den notwendigen Werten und machst Deinen RFC-Aufruf. Anschließend nimmst Du Dir die "Export"-Tabellen und liest wenn Werte vorhanden diese aus. Gruß, Christoph |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
hi Christoph
Zitat:
Soweit, so gut. Bei der Gelegenheit dachte ich mir, machste doch gleich ne Klasse draus. Um die Strukturen dynamisch halten zu können, hab ich mir Array's als Container angelegt, welche die Initialisierungparameter in Records beinhalten. Meine Überlegung ging dahin, die für den RFC-Call benötigten Strukturen erst kurz vor dem Call zu realisieren, um bei der Parameteranzahl flexibel zu bleiben.
Delphi-Quellcode:
Seltsamer weise funktioniert obiges.
function TSAP.CallRFC(Name : string) : boolean;
var tmpImport, tmpExport, tmpChange : array [0..10] of TRfcParam; // array of TRfcParam; tmpTables : array [0..10] of TRfcTable; // array of TRfcTable; tmpTableRow : TTableRow; TableNames : string; pException, iTab : pointer; FuncRes : integer; i, j : integer; begin // SetLength(tmpImport, Length(FImport) + 1); for i := 0 to Length(FImport) - 1 do begin tmpImport[i].name := PChar(FImport[i].Name); tmpImport[i].nlen := Length(FImport[i].Name); tmpImport[i].atype := FImport[i].Typ; tmpImport[i].leng := Length(FImport[i].Wert); tmpImport[i].addr := PChar(FImport[i].Wert); end; tmpImport[Length(FImport)].name := nil;
Delphi-Quellcode:
lege ich die Array's dynamisch an und setze die Länge mit
tmpChange : array of TRfcParam;
tmpTables : array of TRfcTable;
Delphi-Quellcode:
kommt nur Mist bei rum. :gruebel:
SetLength(tmpImport, Length(FImport) + 1);
|
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
so,... ich hatte ein sehr viel stress gehabt. Muss ja meine Bewerbungen losschicken und schön für Prüfung vorbereiten :((
also ne Nummer habe ich leider nicht, mein Projektleiter hat mich zu ihm weitergeleitet :( ist jetzt natürlich n bissl dumm. Ich habe auch bei xing nachgeschaut, ob er dort irgendwie eingetragen ist. Ich würde eher die "entwickler" fragen, ob sie nicht eine Mail weiterleiten könnten. hmm... also ich habe auch sehr lange geschraubt, damit das teil 100%ig funktioniert. Hatte am Anfang auch nur Müll |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Zitat:
Hallo Misek, hast du dieses Beispiel noch? - ich habe schon einige Zeit mit den Klassen von Herrn Schuhmann experimentiert und es hat soweit ganz gut funktioniert, jedoch beim Aufruf eines RFCs mit einer Struktur als Import-Parameter erhalte ich Fehler. hier der Code meines Aufrufs funcRes := connection.FRfcCallReceiveEx( connection.fconnHandle, pchar(RfcName), @FExporting, @FImporting, @FChanging, @FTables , @pException); if funcres <> 0 then begin OK := false; result := pchar(pException); // Wenn wir keinen Klartext-Fehler bekommen, geben wir den Fehlercode aus if result = '' then result := 'Error ' + IntToStr(funcres); exit; end; funkres ist 3 = 'SSYSTEM FAILURE' ich wäre dir sehr dankbar, wenn du mir hier einen Schritt weiterhelfen könntest |
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Hi Mandi,
das ist kein großes Problem. Du kannst die Datensätze in eine Excel Tabelle speichern. Dein Kunde kann diese von SAP aus mittels CATT öffnen und in R/3 einlesen. Ob Du mit ADO an SAP (DB2, ORACLE, ..) kommst, wage ich zu bezweifeln. Dein Kunde kann aber, wenn Du ihm eine Datenbank bereit stellst mittels eines ABAP Programmes auf diese zugreifen. Unter ABAP gibt es 2 Möglichkeiten um Dateien zu öffnen. Erste Möglichkeit ist die ganz normale für die SAP eigene Datenbank und die zweite ist der "Native" Zugriff. Ein ABAP Programmierer sollte sich damit auskennen. Gruss Heike Zitat:
|
Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
Zitat:
Die Lösung mit der Excel-Tabelle scheint unter SAP-Beratern aber sehr beliebt zu sein :roll: Zitat:
Im Prinzip baut man für jedes Prob einen eigenen Wrapper um die RFC-DLL. Wesentlich eleganter geht es aber mit ![]() Kostet rund 700€, was für Tools im SAP-Umfeld ein wahres Schnäppchen ist ! Dank des SAP-Explorers kann man SAP-RFCstrukturen analysieren, ohne auf irgendwelche SAP-Spezies angewiesen zu sein. Und nicht zu verachten, der SAPx-Server. Also, wer im SAP-Umfeld tätig ist, für den sind 700€ noch nicht einmal "Portokasse" ! Mich hat ein Kollege angesichts des Preises jedenfalls gefragt: "Taugt das was ???" [Werbung off] Ich habe viel Zeit vertan, um mich mit der Connectivität von SAP-RFC-DLL und Delphi auseinander zu setzen und das ganze auch noch hübsch in Klassen zu packen. "Entwickler" und "BAPI-is-here" waren dabei hilfreich und mein ![]() Aber, um alles in ein schönes Gewand zu packen, lohnt sich, angesichts des Preises für SAPx, der Aufwand wirklich nicht mehr. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz