BAPI / RFC mit Delphi


  Beispiele
  Beschreibung Verwendete Komponenten
Beispiel 1 Anmeldung an das R3-System TSAPLogOnControl
Beispiel 2 Anmeldung an das R3-System im SilentLogOn TSAPLogOnControl
Beispiel 3 Auslesen aller Kostenstellen mit der Funktion RFC_READ_TABLE TSAPFunctions
Beispiel 4 Auslesen aller Kostenstellen mit der Funktion RFC_READ_TABLE und Anmeldung mit SilentLogOn TSAPLogOnControl
TSAPFunctions
Beispiel 5 Anzeigen der Materialstammdaten mit dem BAPI BAPI_MATERIAL_GET_DETAIL TSAPFunctions
Beispiel 6 Bestellung anlegen mit dem BAPI BAPI_PO_CREATE TSAPFunctions
Beispiel 7 Materialstammdaten anzeigen mit dem BusinessObject BUS1001 TSAPBapiControl
Beispiel 8 Bestellung anlegen mit dem BusinessObject BUS2012 und SilentLogOn TSAPLogOnControl
TSAPBapiControl

 

Seitenende

 

 

 

 

 

ubuch.gif (1048 Byte) Beispiel 1:

Anmeldung an das R3-System mit der Komponente TSAPLogOnControl

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente Funktion
SAPLogOnControl1 SAP ActiveX-Komponente zur Anmeldung an das System
Button1 Button zum Starten der Procedure

unit s_logon;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, OleCtrls, SAPLogonCtrl_TLB, StdCtrls,Grids ;

type
  TForm1 = class(TForm)
  SAPLogonControl1: TSAPLogonControl;
  Panel1: TPanel;
  StaticText1: TStaticText;
  Button1: TButton;
  procedure SAPLogonControl1Click(Sender: TObject);
  procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Connection :variant;

implementation

{$R *.DFM}

procedure TForm1.SAPLogonControl1Click(Sender: TObject);
begin

  (* Verbindung definieren *)
  Connection:= SAPLogOnControl1.NewConnection;

  (*LogOn durchführen *)
  if Connection.LogOn(0,false) = true then

  begin
    showmessage('Anmeldung wurde erfolgreich durchgeführt.');
    Button1.Enabled:= true;
  end
  else
  begin
    ShowMessage('Anmeldung wurde nicht durchgeführt :-(((');
    SAPLogonControl1.Enabled:=true;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  (* Verbindung trennen *)
  Connection.LogOff;

  ShowMessage('System LogOff...');
  SAPLogonControl1.Enabled:=true;
  Button1.enabled :=false;
end;
end.

Seitenanfang

ubuch.gif (1048 Byte) Beispiel 2:

Anmeldung an das R3-System mit der Komponente TSAPLogOnControl im SilentLogOn

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente Funktion
SAPLogOnControl1 SAP ActiveX-Komponente zur Anmeldung an das System
Button1 Button zum trennen der Verbindung

unit s_logon;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, OleCtrls, SAPLogonCtrl_TLB, StdCtrls,Grids ;

type
  TForm1 = class(TForm)
  SAPLogonControl1: TSAPLogonControl;
  Panel1: TPanel;
  Edit1: TEdit;
  Edit2: TEdit;
  Label1: TLabel;
  Label2: TLabel;
  StaticText1: TStaticText;
  Button1: TButton;
  procedure SAPLogonControl1Click(Sender: TObject);
  procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Connection :variant;

implementation

{$R *.DFM}

procedure TForm1.SAPLogonControl1Click(Sender: TObject);
begin

  (* Verbindung und deren Parameter definieren *)
  Connection := SAPLogoncontrol1.newConnection;

  (* Bei einigen GUI-Versionen muß der UserName in *)
  (* Großbuchstaben übergeben werden!!!!            *)

  Connection.User := AnsiUpperCase(Edit1.text);

  Connection.System            := 'IDS';
  Connection.Client            := '800';
  Connection.ApplicationServer := 'SAPIDES';
  Connection.SystemNumber      := '00';
  Connection.Password          := Edit2.text;
  Connection.Language          := 'DE' ;
  SAPLogonControl1.Enabled     := false;

  if Connection.LogOn(0,true) = true then
  (* Parameter "true" : SilentLogOn *)

  begin
    ShowMessage('Anmeldung wurde erfolgreich durchgeführt.');
    Button1.Enabled:= true;
  end
  else
  begin
    ShowMessage('Anmeldung wurde nicht durchgeführt :-(((');
    SAPLogonControl1.Enabled:=true;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  (* Verbindung trennen *)
  Connection.LogOff;

  ShowMessage('System LogOff...');
  SAPLogonControl1.Enabled:=true;
  Button1.Enabled :=false;
end;
end.

Seitenanfang

 

ubuch.gif (1048 Byte) Beispiel 3:
Auslesen aller Kostenstellen mit der Funktion RFC_READ_TABLE

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente Funktion
SAPFunctions1 SAP ActiveX-Komponente zum Ansprechen von RFC/BAPI
Grid Stringgrid zum Anzeigen der Daten im Formular
Button1 Button zum Starten der Procedure

unit logon1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls, OleCtrls, StdCtrls, SAPFunctionsOCX_TLB, Grids;

type
TForm1 = class(TForm)
  SAPFunctions1: TSAPFunctions;
  Button1: TButton;
  Grid: TStringGrid;
  procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1 : TForm1 ;
Table,Funct : VARIANT ;

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var txt : string  ;
    r   : integer ;
begin

  (* Funktion definieren *)
  Funct := SAPFunctions1.add('RFC_READ_TABLE');

  (* Der Funktion übergeben, welche Tabelle gelesen werden soll *)
  Funct.exports('QUERY_TABLE').value := 'CSKT';

  (* Funktion ausführen *)
  if not Funct.call then

    (* Bei Fehler Message anzeigen *)
    showMessage(Funct.exception)

  else begin

    (* Tabelle mit den Daten selektieren *)
    Table := Funct.tables.item('DATA');

    (* Anzeige im StringGrid anpassen *)
    grid.rowCount   := Table.rowcount + 1;
    grid.cells[0,0] := 'Client';
    grid.cells[1,0] := 'Kostenstelle';
    grid.cells[2,0] := 'Bezeichnung';
    for r := 1 to grid.rowCount -1 do begin

      (* Aktuellen Datensatz selektieren *)
      txt := Table.value(r,1);

      (* Da die Function nur einen String übergibt  *)
      (* der alle Daten beinhaltet, muß dieser in   *)
      (* die einzelnen Abschnitte unterteilt werden *)

      grid.cells[0,r] := copy(txt,0,3);   (* Client   *)
      grid.cells[1,r] := copy(txt,9,10);  (* KoSt-Nr. *)
      grid.cells[2,r] := copy(txt,27,20); (* KoSt-Bez.*)
    end;
    grid.visible := True;
  end;
end;
end.

 

Seitenanfang

 

ubuch.gif (1048 Byte) Beispiel 4:
Auslesen aller Kostenstellen mit der Funktion RFC_READ_TABLE und Anmeldung mit SilentLogOn

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente Funktion
SAPFunctions1 SAP ActiveX-Komponente zum Ansprechen von RFC/BAPI
SAPLogoncontrol1 SAP ActiveX-Komponente zur Anmeldung an das R3-System
Grid Stringgrid zum Anzeigen der Daten im Formular
Button1 Button zum Starten der Procedure

unit logon1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, OleCtrls, StdCtrls, SAPFunctionsOCX_TLB,
Grids, SAPLogonCtrl_TLB;

type
  TForm1 = class(TForm)
  SAPFunctions1: TSAPFunctions;
  Button2: TButton;
  Grid: TStringGrid;
  Edit1: TEdit;
  Edit2: TEdit;
  Label1: TLabel;
  Label2: TLabel;
  SAPLogonControl1: TSAPLogonControl;
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1 : TForm1 ;
Table,Funct, Connection : VARIANT ;

implementation

{$R *.DFM}


procedure TForm1.Button2Click(Sender: TObject);
var txt : string ;
r : integer ;

begin
  Connection                  := SAPLogoncontrol1.newConnection;
  Connection.User             := AnsiUpperCase(Edit1.text);
  Connection.System           := 'IDS';
  Connection.Client           := '800';
  Connection.ApplicationServer:= 'SAPIDES';
  Connection.SystemNumber     := '00';
  Connection.Password         := Edit2.text;
  Connection.Language         := 'DE' ;

  if Connection.LogOn(0,true) = true then
  (* Parameter "true" = SilentLogOn *)

  begin

    (* Der Komponente SAPFunctions1 die bestehende *)
    (* Verbindung zuweisen *)

    SAPFunctions1.Connection := Connection;

    Funct := SAPFunctions1.add('RFC_READ_TABLE');
    Funct.exports('QUERY_TABLE').value := 'CSKT';
    if not Funct.call then
      showMessage(Funct.exception)
    else begin
      Table := Funct.tables.item('DATA');
      grid.rowCount := Table.rowcount + 1;
      grid.cells[0,0] := 'Client';
      grid.cells[1,0] := 'Kostenstelle';
      grid.cells[2,0] := 'Bezeichnung';
      for r := 1 to grid.rowCount -1 do begin
        txt := Table.value(r,1);
        grid.cells[0,r] := copy(txt,0,3);
        grid.cells[1,r] := copy(txt,9,10);
        grid.cells[2,r] := copy(txt,27,20);
      end;
      grid.visible := True;
    end;
  end;
end;
end.

Seitenanfang

 

ubuch.gif (1048 Byte) Beispiel 5:

Anzeigen der Materialstammdaten mit dem BAPI BAPI_MATERIAL_GET_DETAIL

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente

Funktion
SAPFunctions1 SAP ActiveX-Komponente zum Ansprechen von RFC/BAPI
Panel1/Panel2 Elemente zum Anzeigen der Daten
Button1 Button zum Starten der Procedure

unit material;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ExtCtrls, OleCtrls, SAPFunctionsOCX_TLB;

type
  TForm1 = class(TForm)
    SAPFunctions1: TSAPFunctions;
    Panel1: TPanel;
    Panel2: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
funct, tab, connection: variant;

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin

  (* Funktion definieren *)
  funct := sapFunctions1.add('BAPI_MATERIAL_GET_DETAIL');

  (* Materialnummer übergeben                                *)
  (* Bei num. Werten die führenden Nullen nicht vergessen! *)
  funct.exports('MATERIAL').value := '000000000000017550';

  (* Funktion ausführen *)
  if not funct.call then

    (* Bei Fehler Message anzeigen *)
    showMessage(funct.exception)

  else
  begin

    (* Tabelle mit den ausgelesenen Daten selektieren *)
    tab := funct.imports.item('MATERIAL_GENERAL_DATA');

    (* In der Variablen TAB sind jetzt die gelesenen Daten enthalten. *)
    (* Die Struktur der Variablen TAB entspricht der Struktur         *)
    (* BAPIMATDOA aus dem Dictionary                                  *)
    (* Aus dieser Struktur werden der 1. und 3. Wert angezeigt        *)

    Panel1.caption := tab.value(1);
    Panel2.caption := tab.value(3);
  end;
end;
end.

 

 

Seitenanfang

 

ubuch.gif (1048 Byte) Beispiel 6:

Bestellung anlegen mit dem BAPI BAPI_PO_CREATE

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente Funktion
SAPFunctions1 SAP ActiveX-Komponente zum Ansprechen von RFC/BAPI
Button1 Button zum Starten der Procedure
Panel1 nicht relevant!

unit PO_Create;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, OleCtrls, SAPFunctionsOCX_TLB, ExtCtrls;

type
  TForm1 = class(TForm)
  SAPFunctions1: TSAPFunctions;
  Button1: TButton;
  Panel1: TPanel;
  procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Funct,
Header,
POItems,
Schedules,
ItemsRow,
SchedulesRow: Variant;

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var MLDText : String;
begin
  Button1.Enabled:=false;
  Panel1.Caption := 'RFC wurde gestartet, bitte warten.....';

  (* Function definieren *)
  Funct := sapFunctions1.add('BAPI_PO_CREATE');

(*** Tabellen definieren, Strukturen aus Dictionary benutzen ***)

  (* Bestellkopfdaten *)
  Header := funct.exports('PO_HEADER');

  (* Tabelle der Bestellpositionen *)
  POItems := funct.tables.item('PO_ITEMS');

  (* Tabelle der Einteilungen *)
  Schedules := funct.tables.item('PO_ITEM_SCHEDULES');

(*** PO_Header-Tabelle füllen ***)

  (* Einkaufsbelegart *)
  Header.Value[2] := 'NB ' ;

  (* Typ des Einkaufsbelegs *)
  Header.Value[3] := 'F' ;

  (* Einkaufsorganisation *)
  Header.Value[5] := '600' ;

  (* Einkäufergruppe *)
  Header.Value[6] := '610' ;

  (* Kontonummer des Lieferanten, führende Nullen beachten!!! *)
  Header.Value[8] := '0099000123';

(*** PO_Items-Tabelle füllen ***)

  (* Neue Zeile in die Tabelle einfügen *)
  ItemsRow := POItems.rows.add;

  (* Positionsnummer des Einkaufsbelegs *)
  ItemsRow.Value[2]:='00010';

  (* Materialnummer, bei num. Werten die führenden Nullen beachten !!! *)
  ItemsRow.Value[5]:='000000000000001161';

  (* Lagerort *)
  ItemsRow.Value[11]:='100';

  (* Werk *)
  ItemsRow.Value[17]:='0001';

  (* Nettopreis im Einkaufsbeleg in Belegwährung *)
  ItemsRow.Value[21]:='10,00';

(*** PO_Items_Schedules-Tabelle füllen ***)

  (* Neue Zeile in die Tabelle einfügen *)
  SchedulesRow := Schedules.rows.add;

  (* Positionsnummer des Einkaufsbelegs *)
  SchedulesRow.Value[1]:='00010';

  (* Datumstyp des Lieferdatums *)
  SchedulesRow.Value[3]:='1';

  (* Lieferdatum der Position *)
  SchedulesRow.Value[4]:='30.05.2000';

  (* Einteilungsmenge *)
  SchedulesRow.Value[6]:='10';

(*** Function ausführen ***)

  if not funct.call then

    (* Bei Fehler Message anzeigen *)
    showMessage(funct.exception)

  else
  begin

    (* Belegnummer des Einkaufsbelegs ausgeben *)
    MLDText:= funct.imports('PURCHASEORDER');
    MessageDlg('Bestellung wurde mit der Nummer '+MLDText+' angelegt.',
    MTInformation,[mbOK],0);
  end;
end;

end.

 

Seitenanfang 

 

ubuch.gif (1048 Byte) Beispiel 7:

Materialstammdaten anzeigen mit dem BusinessObject BUS1001

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente Funktion
SAPBAPIControl1 SAP ActiveX-Komponente zum Anmelden an das R3-System
Button1 Button zum Starten der Procedure
Panel1 Element zum ausgeben des Materialkurztextes

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, SAPBAPIControlLib_TLB, ExtCtrls;

type
  TForm1 = class(TForm)
  SAPBAPIControl1: TSAPBAPIControl;
  Button1: TButton;
  Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Connection,MAT : Variant;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Connection:= SAPBapiControl1.Connection;
  if Connection.Logon then
  begin
    ShowMessage('LogOn');

    (* Das BusinessObjekt mit den nötigen *)
    (* Parametern aufrufen *)

    MAT:= sapbapicontrol1.GetSAPObject('BUS1001','000000000000017550');

    (* Ausgabe des Materialkurztextes *)
    Panel1.Caption:=MAT.MATERIALDESCRIPTION;
  end;
end;

end.

Seitenanfang 

 

ubuch.gif (1048 Byte) Beispiel 8:

Bestellung anlegen mit dem BusinessObject BUS2012 und SilentLogOn

In diesem Beispiel enthält das Fenster TForm1 folgende Komponenten:

Komponente Funktion
SAPBAPIControl1 SAP ActiveX-Komponente zum Anmelden an das R3-System
SAPBAPIControl1 SAP ActiveX-Komponente zur Anmeldung an das R3-System
Button1 Button zum Starten der Procedure
Button2 Button zum anmelden an das System
Panel1-3 Elemente zum ausgeben der Meldungen

unit best;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, SAPBAPIControlLib_TLB, ExtCtrls, Grids,
SAPLogonCtrl_TLB;

type
TForm1 = class(TForm)
  SAPBAPIControl1: TSAPBAPIControl;
  Button1: TButton;
  Panel1: TPanel;
  Panel2: TPanel;
  Panel3: TPanel;
  Button2: TButton;
  SAPLogonControl1: TSAPLogonControl;
  Edit1: TEdit;
  Edit2: TEdit;
  Label1: TLabel;
  Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Connection,Mat,Header,Ret,Schedul,Item : Variant;

implementation

{$R *.DFM}

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;

procedure TForm1.Button2Click(Sender: TObject);
begin

  (* Anmeldung an das System *)
  Connection                    := SAPLogoncontrol1.newConnection;
  Connection.User               := Ansiuppercase(Edit1.text);
  Connection.System             := 'IDS';
  Connection.Client             := '800';
  Connection.ApplicationServer := 'SAPIDES';
  Connection.SystemNumber      := '00';
  Connection.Password          := Edit2.text;
  Connection.Language          := 'DE' ;
  SAPLogonControl1.Enabled     := false;

  if Connection.LogOn(0,true) = True then
  begin
    ShowMessage('Anmeldung wurde erfolgreich durchgeführt.');
    Button1.Enabled:= true;

    (* Der Komponente SAPBapiControl die bestenende *)
    (* Verbindung zuordnen *)

    SapBapiControl1.Connection:=Connection;
  end
  else
  begin
    ShowMessage('Anmeldung wurde nicht durchgeführt :-(((');
  end;
end;
end.

Seitenanfang