Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Frage zu SAP-iDoc (https://www.delphipraxis.net/160368-frage-zu-sap-idoc.html)

SarDGer 10. Mai 2011 07:59

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

Coffeecoder 10. Mai 2011 08:04

AW: Frage zu SAP-iDoc
 
Hi,

Ich habe mal bisschen gesucht und habe das hier gefunden.
Vielleicht hilft dir das bisschen weiter.

Mfg Coffeecoder

SarDGer 10. Mai 2011 08:14

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

SarDGer 10. Mai 2011 08:36

AW: Frage zu SAP-iDoc
 
Hätte ich ja fast vergessen:

Folgendes Beispiel hatte ich uA gefunden:
Delphi-Quellcode:
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;
Quelle: zur Quelle

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

BlackbirdBerlin 10. Mai 2011 11:54

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

SarDGer 10. Mai 2011 12:36

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:
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 da was als C# Source gefunden (Quelle: Hier)
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

BlackbirdBerlin 10. Mai 2011 13:47

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:
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
Grüße, Tim

SarDGer 10. Mai 2011 14:24

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

BlackbirdBerlin 10. Mai 2011 14:37

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

SarDGer 10. Mai 2011 15:03

AW: Frage zu SAP-iDoc
 
Zitat:

Zitat von BlackbirdBerlin
Ist die Übergabe nach SAP denn schon definiert?
Wie sind die Partnervereinbarungen? tRFC oder Dateiport?

Ich weiß leider nicht was Du meinst :(

Ich hab ein Programm geschrieben das die untenstehenden Felder füllt und sich dann verbindet.

Delphi-Quellcode:
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;
Und jetzt würde ich gerne
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

BlackbirdBerlin 10. Mai 2011 15:20

AW: Frage zu SAP-iDoc
 
Zitat:

Zitat von SarDGer (Beitrag 1099983)
...
Ich weiß leider nicht was Du meinst :(

...iDoc := Connection.CreateEmptyIdoc('ORDERS01','');
ausführen um dann die Segmente zu füllen.

...
Gruß,
Sar D'Ger

Hi Sar D'Ger,

erstmal ist ORDERS01 der falsche IDoc-Typ.
Den richtigen sollte Dir die SAP-Truppe nennen.

Dann muss eine Partnervereinbarung (SAP-Terminus. Beschreibt, für welchen Kommunikationspartner, welche Datenpakete ein- und ausgehend definiert sind...) bestehen, um mit einem eingehenden IDoc überhaupt was passieren zu lassen.
Das sollte Dir die SAP-Truppe nennen.

Wenn Du hier mit Details aufschlägst, kann ich Dir ggf. weiterhelfen.

Grüße,
Tim

SarDGer 10. Mai 2011 16:21

AW: Frage zu SAP-iDoc
 
Schonmal Danke für die Hilfe.

Also anstelle von ORDERS01 muss ich wohl Z1ZCONFPROD setzten.
Aber wofür die Partnervereinbarung (Partneragreement??) gut
ist, ist mir nicht ganz klar. Bin davon ausgegangen das ich
ja eine Verbindung habe, die funktioniert ja. Und wenn ich es
dann mal hinbekomme üner "Connection" eine iDoc zu kreiren
das ich die dann mit iDoc.Send() lospeitsche.

Schätze da muss ich noch ein paar Details erfragen, da die Jungs
kaum englisch sprechen wird das mal so richttig Spass machen... ;)

Gruß,
Sar D'Ger

BlackbirdBerlin 10. Mai 2011 16:50

AW: Frage zu SAP-iDoc
 
Hi nochmal.

Ein IDoc kannst Du ohne Probleme in ein SAP-System reindängeln.
Nur, wenn Du keine Partnervereinbarung hast, die da sagt:
SendePartner, Empfangender Partner, Welches IDOC, ( weitere Details) -> was damit machen!

Dann wird dieses IDoc dort rumliegen und nicht weiter beachtet werden.

Transaktionen WE21 und WE20 sind hier gefragt.

Grüße,
Tim

SarDGer 10. Mai 2011 17:38

AW: Frage zu SAP-iDoc
 
Na Hauptsache ich hab sie gesendet :P

Also das ist so ziemlich alles was ich habe:
Client 500
System R3Q
Release 700
Lang. E
Transaction WE60

Transaction WE60 hat mit nichts gesagt.
Muss mal schauen wo ich die dann noch mit reinflansche.

Zitat:

Zitat von BlackbirdBerlin
Ein IDoc kannst Du ohne Probleme in ein SAP-System reindängeln.

Echt jetzt? Wie??
Für den ersten Step würde mir ein "totes" iDoc völlig reichen.

Gruß,
Sar D'Ger

BlackbirdBerlin 10. Mai 2011 20:20

AW: Frage zu SAP-iDoc
 
Hi nochmal.

WE60 ist zur IDoc-Dokumentation. D.h. Du kannst Dir damit die Struktur, des zu erzeugenden IDocs ansehen, wobei Dir nicht nur die Struktur sondern auch die Felder und ggf. mögliche Festwerte angezeigt werden.

Die Transaktion kannst Du nicht an die Daten ( das IDoc ) mit dranflanschen.

Du solltest schon ein ganz kleines bisschen wissen, was Du da tust bzw. tun sollst.

Ein totes IDoc gibt's nicht. Es wird auf jeden Fall eine Syntaxprüfung durchgeführt, wo z.B. überprüft wird, ob alle Muss-Segmente vorhanden sind und keine weiteren Restriktionen verletzt werden.
Das passiert noch, bevor das IDoc einem "Verarbeiter" übergeben wird.
Und dieser "Verarbeiter", der wird durch die Partnervereinbarung bestimmt.

D.h. Du hast Beratungsbedarf!

Alles Weitere zu Konditionen und Time-Line per PN :-D

Viele Grüße,
Tim

SarDGer 12. Jun 2011 12:43

AW: Frage zu SAP-iDoc
 
So hab jetzt einiges zusammen gebastelt.

Leider bin ich für SAP anwendungen offenbar zu dämlich...

Ich ein "iDoc Simulat" im xml format zusammen getippselt.

Code:
<ZCONFPROD01>
  <IDOC>
    <EDI_DC40>
      <TABNAM>"EDI_DC40"</TABNAM>
      <MANDT>"500"</MANDT>
      <DOCNUM>"0000000005632233"</DOCNUM>
      <DOCREL>"700"</DOCREL>
      <STATUS>"53"</STATUS>
      <DIRECT>"2"</DIRECT>
      <OUTMOD>"</OUTMOD>
      <IDOCTYP>"ZCONFPROD01"</IDOCTYP>
      <MESTYP>"ZCONFPROD"</MESTYP>
      <SNDPOR>"SAPWMP"</SNDPOR>
      <SNDPRT>"LS"</SNDPRT>
      <SNDPRN>"WMSWMP"</SNDPRN>
      <RCVPOR>"SAPR3P"</RCVPOR>
      <RCVPRT>"LS"</RCVPRT>
      <RCVPRN>"QASCLNT210"</RCVPRN>
      <CREDAT>"20100101"</CREDAT>
      <CRETIM>"033604"</CRETIM>
      <SERIAL>"20100101033325"</SERIAL>
    </EDI_DC40>
  <Z1ZCONFPROD>
    <POST_WRONG_ENTRIES>"2"</POST_WRONG_ENTRIES>
    <Z1BP_PP_HDRLEVEL>
      <ORDERID>"000001109701"</ORDERID>
      <POSTG_DATE>"20100101"</POSTG_DATE>
      <EX_CREATED_DATE>"00000000"</EX_CREATED_DATE>
      <EX_CREATED_TIME>"000000"</EX_CREATED_TIME>
      <CONF_QUAN_UNIT>"CS"</CONF_QUAN_UNIT>
      <YIELD>"144.000"</YIELD>
      <SCRAP>"0.000"</SCRAP>
      <REWORK>"0.000"</REWORK>
      <EXEC_START_DATE>"00000000"</EXEC_START_DATE>
      <EXEC_START_TIME>"000000"</EXEC_START_TIME>
      <EXEC_FIN_DATE>"00000000"</EXEC_FIN_DATE>
      <EXEC_FIN_TIME>"000000"</EXEC_FIN_TIME>
      <PERS_NO>"00000000"</PERS_NO>
    </Z1BP_PP_HDRLEVEL>
  </Z1ZCONFPROD>
  <EDI_DS40>
    <MANDT>"500"</MANDT>
.
.
.
Sind ja soweit alle verbindungsinformationen, so wie ich
das so verstanden hab, vorhanden.

Ich hab in meinem test projekt die units:
SAPLogonCtrl_TLB, SAPFunctionsOCX_TLB, SAPBAPIControlLib_TLB

eingebunden und kann hiermit eine verbindung zu SAP aufbauen:

Delphi-Quellcode:
  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 *)
    ShowMessage('Logon successfull.');
  else
    ShowMessage('Logon did not work :-(((');
* Danke an dieser Stelle Joachim Lentz Quelle

Soweit so gut, jetzt hab ich zig Seiten durchforstet und kenne die offiziellen
SAP-pdfs fast auswendig (kleiner Scherz - wacka wacka). Aber an dieser Stelle
hege ich den Verdacht das ich schlichweg zu doof bin.
Ich finde einfach keine Möglichkeit an SAP was zu senden.
Sondern nur die BAPIs aufzurufen.

Hier die Frage:
Wie bekomme ich meine Infos rüber?

Danke schonmal,
Sar D'Ger

sx2008 12. Jun 2011 16:48

AW: Frage zu SAP-iDoc
 
Zitat:

Zitat von SarDGer (Beitrag 1105923)
Aber an dieser Stelle hege ich den Verdacht das ich schlichweg zu doof bin.
Ich finde einfach keine Möglichkeit an SAP was zu senden.

Mit SAP kommunizieren zu können ist eine Lizenz zum Geld drucken!
Selbst einfache Aufgaben kosten einen SAP-System-Besitzer viele tausend Euro.
Ein "normaler" Programmierer kann viele Dinge für ein Zehntel der Kosten auf einem normalen PC lösen.
Das Problem ist nur, wie man mit SAP spricht.

Und hier kommen die SAP-Berater ins Spiel.
Ohne SAP Berater hat man fast keine Chancen an Wissen zu kommen.
Diese Leute vermitteln Wissen nur gegen Geld.
Ich habe über ein Jahr gebraucht, bis ich mir das Know How erarbeitet habe auf SAP beliebige RFC-Bausteine aufzurufen.
Du bist also nicht zu doof, sondern du kämpfst gegen ein System das Methode hat.:zwinker:

Neumann 12. Jun 2011 17:20

AW: Frage zu SAP-iDoc
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mal ein Schnittstelle zu SAP gebastelt - richtiger Ausdruck, da der Kunde mich nur tröpfchenweise mit Infos versorgt hat. Die Aufgabe war, Rechnungsdaten in das SAP-System zu bringen.

Aus unseren Buchungsdaten musste eine grauenhafte Textdatei erzeugt werden (hab mal ein Beispiel angehängt) die das SAP dann als Massendatenimport einliest. Nennt sich REL 620. Hier ein Auszug aus der Beschreibung:

"Schnittstellenbeschreibung:


Zum Einspielen der Buchungssätzen von extern Systemen ins SAP-System wird die Standard-Batch-Input-Schnittstelle von SAP, der Report RFBIBL00 verwendet.

Die Buchungssatz-Schnittstellen-Datei wird vom Subsystem im Textformat bereitgestellt. Die Schnittstellen-Datei besteht aus 3 verschiedenen Satzarten BGR00 (Mappenvorsatz), BBKPF (Buchungskopf) und BBSEG (Buchungsposition), die den SAP Tabellen für die Batch-Input Schnittstelle entsprechen.


Aufbau der Schnittstellen-Datei
Die Schnittstellen-Datei beginnt mit der Satzart BGR00 beginnen. Danach folgt ein Buchungssatz bestehend aus der Satzart BBKPF und danach mindestens 2 Sätze (Soll und Haben) der Satzart BBSEG:

BGR00
BBKPF
BBSEG
BBSEG
...
BBSEG


Struktur der Satzart
Jede Satzart beginnt mit einem eindeutigen Satztyp und endet mit dem ASCII-Zeichen 13 („Carriage Return“). Der Feldaufbau der Satzarten ist aus den folgenden Tabellenbeschreibungen zu entnehmen. Die Felder haben eine feste Länge und sind stets mit Leerzeichen aufzufüllen.
Wird das Feld nicht belegt (NULL-Wert), ist das No-Data-Zeichen „/“ an die erste Stelle zu setzen. Der Rest der Feldlänge ist wieder mit Leerzeichen aufzufüllen."


Die angehägte Datei enthält einen Kassenbon mit drei Artikeln. Jeder Artikel muss als Soll und Haben kommen, deshalb scheinbar doppelt.

Bei Interesse kann ich noch weitere Infos liefern.

SarDGer 13. Jun 2011 08:42

AW: Frage zu SAP-iDoc
 
Hallo,

danke schonmal :)

Worum es mir an erster Stelle mal geht ist folgendes:

Irgendwo muss ich sowas wie "Connection.Send(myStuff)" haben.
Oder "MyHeader := ...GetHeader(HeaderInfos)" oder irgendwas.
Zur Zeit habe ich nur:
Delphi-Quellcode:
  SAPFunctions1.Connection := Connection;
  Funct := SAPFunctions1.add('RFC_READ_TABLE');
  Funct.exports('QUERY_TABLE').value := Edt_Tabelle.text;
  if not Funct.call then
    showMessage(Funct.exception)
Um Daten zu ziehen aber eben nicht um was zu senden.
Die Struktur von dem was ich zu senden habe ist da ja
wieder was anderes.

Gruß,
Sar D'Ger


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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