![]() |
Datenbank: SAP • Version: R3Q • Zugriff über: bAPI
Frage zu SAP-iDoc
Moin,
ich hab da mal 'ne (vermutlich) dämliche Frage. Vorneweg, ich bin SAP-mäßig ein newbie. Ich soll aus einem (eigenen) Programm Daten via iDoc ein SAP R3Q System senden. Ziel des Ganzen soll dann mal sein das ich Daten von denen bekomme (sinnentleerterweise als csv) diese werden verändert und zurückgeschickt (via iDoc). Bitte nicht fragen was das Konzept bitte sein soll, das weiß eigentlich keiner, aber der Kunde weint sonst ganz dolle... Also hab dann ersteinmal ein kleines Programm geschrieben um mich mit dem SAP System zu verbinden. Soweit so gut das klappt auch. Allerdings hab ich nach Stunden des googelns nichts konkretes gefunden wie ich das iDoc erstellen soll. Im ersten step will ich eigentlich nur eine Datei erzeugen wo ich sowas wie ein SQL update Befehl aus führen kann. Einen Benutzernamen und PWD das ich an dem SAP System hab ich natürlich, wie gesagt die Verbindung steht. Hab also keine "Spielchen" vor. Was mir fehlt ist ein Faden zum aufgreifen. Ich hab die SAP Seiten durch wo aber eigentlich immer nur das Konzept erklärt wird. Also: - Meta-IDoc-Struktur - IDoc-Typ - IDoc Leider nichts konkretes wie zB eine "Meta-IDoc-Struktur" aussehen sollte. Oder packe ich das Problem von der falschen Seite aus an? Grüße, Sar D'Ger |
AW: Frage zu SAP-iDoc
Hi,
Ich habe mal bisschen gesucht und habe das ![]() Vielleicht hilft dir das bisschen weiter. Mfg Coffeecoder |
AW: Frage zu SAP-iDoc
Danke erst einmal für die schnelles Antwort.
Aber hier auf DP hab ich logischerweise schon alles durchforstet. Die links verweisen auch nur auf recht "konzeptionelle" Infos. Gruß, Sar D'Ger |
AW: Frage zu SAP-iDoc
Hätte ich ja fast vergessen:
Folgendes Beispiel hatte ich uA gefunden:
Delphi-Quellcode:
Quelle:
procedure TForm1.Button1Click(Sender: TObject);
begin (* BusinessObject auswählen *) Mat:= SAPBapiControl1.GetSAPObject('BUS2012'); (* Strukturen definieren *) Header := SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','PoHeader'); Schedul:= SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','PoItemSchedules'); Item := SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','PoItems'); Ret := SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','Return'); (* Bestellkopfdaten *) Header.value ('DOC_TYPE') := 'NB'; Header.value ('DOC_CAT') := 'F'; Header.value ('PURCH_ORG'):= '10'; Header.value ('PUR_GROUP'):= '10'; Header.value ('VENDOR') := '0010000999'; (* Positionsdaten Position 00010 *) Item.Rows.Add; Item.Value (1,'PO_ITEM') := '00010'; Item.Value (1,'PUR_MAT') := '000000000000000017'; Item.Value (1,'STORE_LOC') := '100'; Item.Value (1,'PLANT') := '1000'; Item.Value (1,'NET_PRICE') := '10,00'; (* Einteilungsdaten Position 00010 *) Schedul.Rows.Add; Schedul.Value (1,'PO_ITEM') := '00010'; Schedul.Value (1,'DEL_DATCAT') := '1'; Schedul.Value (1,'DELIV_DATE') := '20.09.2000'; Schedul.Value (1,'QUANTITY') := '10'; (* Positionsdaten Position 00020 *) Item.Rows.Add; Item.value (2,'PO_ITEM') := '00020'; Item.value (2,'PUR_MAT') := '000000000000001161'; Item.value (2,'STORE_LOC') := '100'; Item.value (2,'PLANT') := '1000'; Item.value (2,'NET_PRICE') := '10,00'; (* Einteilungsdaten Position 00020 *) Schedul.Rows.Add; Schedul.Value (2,'PO_ITEM') := '00020'; Schedul.Value (2,'DEL_DATCAT') := '1'; Schedul.Value (2,'DELIV_DATE') := '20.09.2000'; Schedul.Value (2,'QUANTITY') := '10'; (* Methode CreateFromData ausführen *) Mat.CreateFromData (PoHeader := Header, SkipItemsWithError:= ' ', PoItems := Item, PoItemSchedules := Schedul, Return := Ret); (* Fehler werden in der Struktur Ret abgelegt *) if Ret.RowCount > 0 then begin Panel1.Caption:= Ret.Value (1,'TYPE'); Panel2.Caption:= Ret.Value (1,'MESSAGE'); end (* Wurde die Methode fehlerfrei ausgeführt, *) (* Belegnummer ausgeben *) else Panel2.Caption:= Mat.PurchaseOrder; end; ![]() Allerdings ist mir nicht ganz klar was Buisness-Object 'BUS2012' oder der Richtige 'DOC_TYPE' usw. ist. Aussdem soll ich ja einen bestehenden Datensatz updaten. Gruß, Sar D'Ger |
AW: Frage zu SAP-iDoc
Hi SarDGer,
ein IDoc ist eigentlich nur eine Datei (z.B.) die eine bestimmte generelle Struktur hat (jedes IDoc) und dann je IDoc-Typ definierte Datenteile. Also ein IDoc kann ein Flat-File sein, oder auch auf anderen Wegen in ein R/3-System kommen bzw. daraus kommen. Der erste Schritt, wäre erstmal zu klären, was Du denn im R/3 machen sollst... Es könnte z.B. ein MATMAS-IDoc sein, mit dem ein Materialstamm (Artikeldatensatz) angelegt oder geändert wird, oder auch ein ORDERS-IDoc, für eine Bestellung / Auftrag. Das Business-Object 2012 ist der direkte Draht zur Bestellung, mit dem Du direkt im System an Bestelldaten kommst, bzw. ändern kannst. Einen (beliebigen) SQL-Befehl direkt im System auszuführen ist an sich nicht der Plan. Also erzähl erstmal, was Du konkret machen willst / sollst. Dann kann ich Dir evtl. auch konkretere Tipps geben. Grüße, TaBiGer |
AW: Frage zu SAP-iDoc
Danke für die schnelle Reaktion.
Es geht um Einbuchungen die in unserem Programm getätigt werden, aufgrund von Bestellungen. Beispiel 10000 Bestellt, 100 angekommen - Buchung 1 (Barcode = 4711) 300 angekommen - Buchung 2 (Barcode = 4712) 100 angekommen - Buchung 3 (Barcode = 4713) usw. Bei jeder buchung hängen wir einen schwung Infos mit an die ich jetzt an das SAP System zurück geben soll, damit die in dem System "OnTime" sehen können was schon verbucht wurde, wohin, wieviel usw. Leider sind die Jungs ein wenig Triefnasig, ich hab jetzt erstmal erfragt in welche Tabelle-(Struktur) die welche Felder gefüllt haben wollen. Schätze So muss ich mich voran humpeln... Ich forsche gerade in Richtung: Connection.CreateEmptyIdoc('ORDERS01',''); Da ich von der Function aber Variant zurückbekomme ist die Analyse nicht gerade leichter geworden... Ich versuche noch weiter Details rauszufingen. Update:
Delphi-Quellcode:
Hab da was als C# Source gefunden (Quelle:
procedure TForm1.Button1Click(Sender: TObject);
var iDoc : Variant; IDocHeaderSegment : Variant; IDocItemSegment : Variant; IDocIdentSegmnet : Variant; begin iDoc := Connection.CreateEmptyIdoc('ORDERS01',''); idoc.MESTYP := 'ORDERS'; // iDoc Sender infos idoc.SNDPRN := '1172'; // Partner number idoc.SNDPRT := 'KU'; // Partner type // Create document header segment IdocHeaderSegment := idoc.CreateSegment('E1EDK01'); idoc.Segments.Add(IdocHeaderSegment); // Create item segment IdocItemSegment := idoc.CreateSegment('E1EDP01'); IdocItemSegment.Fields['MENGE'].FieldValue := '7'; idoc.Segments.Add(IdocItemSegment); // Create Object identification (material number in this case) IDocIdentSegmnet := idoc.CreateSegment('E1EDP19'); IDocIdentSegmnet.Fields['QUALF'].FieldValue := '002'; // 002 for material number IDocIdentSegmnet.Fields['IDTNR'].FieldValue := 'Artikel 001'; // material number IDocIdentSegmnet.ChildSegments.Add(IDocIdentSegmnet); idoc.Send(); end; ![]() Hab's in Delphi-source umgebastelt und natürtlich keine Ahnung was wohl passiert wenn ich wirklich mit dem System verbunden bin und auf den Knopp drücke. Aber es lässt sich kompilieren... Kann der Segmentname (idoc.CreateSegment('E1EDP01')) hier 'E1EDP01' beliebig sein Sprich ist das eine Variable die ich vergebe oder wie finde ich raus was da einzutragen ist? Noch wichtiger: iDoc : Variant; ist natürlich nicht richtig. Sollte wohl iDoc : iDoc; sein. Aberwelche Unit muss ich einbinden um den Typ iDoc zu kennen? Also weiter forschen... Gruß, Sar D'Ger |
AW: Frage zu SAP-iDoc
Hi Sardger,
dann geht es wohl um Wareneingänge... Wir kommen der Sache näher. Die zu benutzenden IDOC-Typen wären z.B. MBGMCR03 oder WMMBID02 Aber solche Sachen sollte dir die SAP-Truppe vorgeben! So eine IDOC-Struktur (MBGMCR03, Auszug) sieht z.B. so aus:
Code:
Grüße, Tim
MBGMCR03 Warenbewegungen mit MB_CREATE_GOODS_MOVEMENT buchen
E1MBGMCR Kopfsegment E1BP2017_GM_HEAD_01 Materialbeleg Kopfdaten BAPI2017_GM_HEAD_01 E1BP2017_GM_CODE Umschlüsselung GM_CODE auf Transaktion der BestFührung BAPI2017_GM_CODE E1BP2017_GM_ITEM_CREATE Materialbelegposition anlegen BAPI2017_GM_ITEM_CREATE E1BP2017_GM_ITEM_CREATE1 Materialbelegposition anlegen BAPI2017_GM_ITEM_CREATE E1BP2017_GM_SERIALNUMBER Materialbeleg anlegen Serialnr. BAPI2017_GM_SERIALNUMBER E1BPPAREX Bezugsstruktur für BAPI-Parameter ExtensionIn / ExtensionOut BAPIPAREX |
AW: Frage zu SAP-iDoc
Hi Tim,
also die Struktur hab ich mittlererweile. Was ich noch nicht raus habe ist wie ich das iDoc erzeugen soll. In meinem Beispiel source ist ja folgende Zeile: iDoc := Connection.CreateEmptyIdoc('ORDERS01',''); Aber was für ein Typ ist die Variable "iDoc". Ich such hier schon die ganze Zeit das Internet leer aber dazu finde ich irgendwie nichts. Bastel ich mir da selbst nen Record oder wie läuft das? Ich hab hier als Info vorliegen zB: Z1ZCONFPROD : Header seg. Status: Optional , min. number : 1 , max. number : 1 Structure : Segment definition Z2ZCONFPROD000 Released since Release 46C , Segment length: 0002 POST_WRONG_ENTRIES : Key: Insert incorrect confirmation internal data type : CHAR Internal length : 000001 characters Position in segment : 001, Offset : 0063. external length : 000001 TESTRUN : Checkbox internal data type : CHAR Internal length : 000001 characters Position in segment : 002, Offset : 0064. external length : 000001 Aber was ich mit den Infos anfangen kann ist mir noch immer etwas schleierhaft. Gruß, Sar D'Ger |
AW: Frage zu SAP-iDoc
Hi Sar D'Ger.
Ist die Übergabe nach SAP denn schon definiert? Wie sind die Partnervereinbarungen? tRFC oder Dateiport? Am einfachsten ist es, wie schon erwähnt, die Dateistruktur selbst zu erzeugen, wenn Du weißt, wie das IDoc aussieht. Grüße, Tim |
AW: Frage zu SAP-iDoc
Zitat:
Ich hab ein Programm geschrieben das die untenstehenden Felder füllt und sich dann verbindet.
Delphi-Quellcode:
Und jetzt würde ich gerne
procedure TForm3.btn_1Click(Sender: TObject);
begin (* Verbindung und deren Parameter definieren *) Connection := SAPLogoncontrol.NewConnection; Connection.System := edt_System.Text; Connection.Client := edt_Client.Text; Connection.ApplicationServer := edt_AppServer.Text; Connection.SystemNumber := edt_SystemNumber.Text; Connection.User := edt_Username.text; Connection.Password := edt_Password.Text; Connection.Language := edt_Language.Text; if Connection.LogOn(0,chk_1.Checked) = true then (* Parameter "true" : SilentLogOn *) begin ShowMessage('Logon successfull.'); btn_1.Enabled:= true; end else begin ShowMessage('Logon did not work :-((('); SAPLogonControl.Enabled:=true; end; end; iDoc := Connection.CreateEmptyIdoc('ORDERS01',''); ausführen um dann die Segmente zu füllen. Wenn ich ein Record zB TiDoc definiere klappts natürlich nicht. Inkompatible Typen TiDoc und Variant. Wenn ich iDoc : Variant oder OLEVariant lasse kommt "... 'Die Methode 'CreateEmptyIdoc' wird vom AutomatisierungsObject nicht unterstützt..." Gruß, Sar D'Ger |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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 by Thomas Breitkreuz