BAPI / RFC with Delphi


  Examples
  Description Used components
Example 1 Logon to the R3-system TSAPLogOnControl
Example 2 Logon to the R3-system with SilentLogon TSAPLogOnControl
Example 3 Read all costcenters with the function RFC_READ_TABLE TSAPFunctions
Example 4 Read all costcenters with the function RFC_READ_TABLE and logon with SilentLogon TSAPLogOnControl
TSAPFunctions
Example 5 Show the details of material the BAPI BAPI_MATERIAL_GET_DETAIL TSAPFunctions
Example 6 Create an purchaseorder with the BAPI BAPI_PO_CREATE TSAPFunctions
Example 7 Show the details of material with the BusinessObject BUS1001 TSAPBapiControl
Example 8 Create an purchaseorder with the BusinessObject BUS2012 TSAPLogOnControl
TSAPBapiControl

 

top of page

 

 

 

 

 

ubuch.gif (1048 Byte) Example 1:

Logon to the R3-system with the componente TSAPLogOnControl

In this example the form TForm1 contains the following components:

Component Function
SAPLogOnControl1 SAP ActiveX-Component to logon to the system
Button1 Button to start the 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

  (* define connection *)
  Connection:= SAPLogOnControl1.NewConnection;

  (* start LogOn *)
  if Connection.LogOn(0,false) = true then

  begin
    showmessage('Logon O.K.');
    Button1.Enabled:= true;
  end
  else
  begin
    ShowMessage('Error on Logon :-(((');
    SAPLogonControl1.Enabled:=true;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  (* cut connection *)
  Connection.LogOff;

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

top of page

ubuch.gif (1048 Byte) Example 2:

Logon to the R3-system with the Component TSAPLogOnControl and SilentLogOn

In this example the form TForm1 contains the following components:

Component Function
SAPLogOnControl1 SAP ActiveX-Component to logon to the system
Button1 Button to cut the connection

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

  (* define connection and it's parameters *)
  Connection := SAPLogoncontrol1.newConnection;

  (* In some GUI-versions the username *)
  (* must be written in uppercase !!!  *)
 
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('Logon O.K.');
    Button1.Enabled:= true;
  end
  else
  begin
    ShowMessage('Error on logon :-(((');
    SAPLogonControl1.Enabled:=true;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  (* cut connection *)
  Connection.LogOff;

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

top of page

 

ubuch.gif (1048 Byte) Example 3:
Read all costcenters with the function RFC_READ_TABLE

In this example the form TForm1 contains the following components:

Component function
SAPFunctions1 SAP ActiveX-component to connect RFC/BAPI
Grid Stringgrid to show the data's in the form
Button1 Button to start the 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

  (* define function *)
  Funct := SAPFunctions1.add('RFC_READ_TABLE');

  (* tell the function what table should be read *)
  Funct.exports('QUERY_TABLE').value := 'CSKT';

  (* call the function *)
  if not Funct.call then

    (* on error show message *)
    showMessage(Funct.exception)

  else begin

    (* select table with the data's *)
    Table := Funct.tables.item('DATA');

    (* addjust the StringGrid *)
    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

      (* select first dataset *)
      txt := Table.value(r,1);

      (* Because the RCF-function returns only one    *)
      (* string whitch contains all data's, the       *)
      (* string must be cut to different parts        *)

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

 

top of page

 

ubuch.gif (1048 Byte) Example 4:
Read all costcenters with the function RFC_READ_TABLE and logon with SilentLogOn

In this example the form TForm1 contains the following components:

Component Function
SAPFunctions1 SAP ActiveX-component to connect RFC/BAPI
SAPLogoncontrol1 SAP ActiveX-Component to logon to the system
Grid Stringgrid to show the data's in the form
Button1 Button to start the 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

    (* assign the existing connection to the *)
    (* component SAPFunctions1                *)

    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] := 'CostCent-No';
      grid.cells[2,0] := 'CostCent-Des.';
      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.

top of page

 

ubuch.gif (1048 Byte) Example 5:

Show detail of a material with the BAPI BAPI_MATERIAL_GET_DETAIL

 

In this example the form TForm1 contains the following components:

 

Component

Function

SAPFunctions1 SAP ActiveX-component to connect RFC/BAPI
Panel1/Panel2 Elements to show the data's
Button1 Button to start the 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

  (* define function *)
  funct := sapFunctions1.add('BAPI_MATERIAL_GET_DETAIL');

  (* hand over material-number                              *)
  (* On numeric values don't forget the leading zeros!!!    *)
  funct.exports('MATERIAL').value := '000000000000017550';

  (* call the function *)
  if not funct.call then

    (* on error show message *)
    showMessage(funct.exception)

  else
  begin

    (* select table with the returned data's *)
    tab := funct.imports.item('MATERIAL_GENERAL_DATA');

    (* The variable TAB now contains the returned data's. The    *)
    (* structure is like the structure BAPIMATDOA in the        *)
    (* dictionary. We will show the 1. and 3. value of this     *)
    (* structure                                                *)

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

 

 

top of page

 

ubuch.gif (1048 Byte) Example 6:

Create a purcaseorder with the BAPI BAPI_PO_CREATE

 

In this example the form TForm1 contains the following components:

 

Component

Function

SAPFunctions1 SAP ActiveX-component to connect RFC/BAPI
Button1 Button to start the procedure
Panel1 not 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 ist running, please wait.....';

  (* define function *)
  Funct := sapFunctions1.add('BAPI_PO_CREATE');

(*** define tables, use structures of the dictionary ***)

  (* table for the purcaseorder header *)
  Header := funct.exports('PO_HEADER');

  (* table of the purcaseorder items *)
  POItems := funct.tables.item('PO_ITEMS');

  (* table of the schedules *)
  Schedules := funct.tables.item('PO_ITEM_SCHEDULES');

(*** filling the PO_Header-table ***)

  (* purcasing document type *)
  Header.Value[2] := 'NB ' ;

  (* purcasing document category *)
  Header.Value[3] := 'F' ;

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

  (* purcasing group *)
  Header.Value[6] := '610' ;

  (* vendor account number, on numeric values don't *)
  (* forget the leading zeroes!!!                     *)
  Header.Value[8] := '0099000123';

(*** filling the PO_Items-table ***)

  (* add new row to the table *)
  ItemsRow := POItems.rows.add;

  (* item number of purcasing document *)
  ItemsRow.Value[2]:='00010';

  (* material-number, on numeric values don't forget *)
  (* the leading zeros !!!                            *)
  ItemsRow.Value[5]:='000000000000001161';

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

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

  (* netprice in purcasing document, *)
  (* in document currency              *)
  ItemsRow.Value[21]:='10,00';

(*** filling the PO_Items_Schedules-table ***)

  (* add new row to the table *)
  SchedulesRow := Schedules.rows.add;

  (* item number of purcasing document *)
  SchedulesRow.Value[1]:='00010';

  (* category of delivery date *)
  SchedulesRow.Value[3]:='1';

  (* item delivery date *)
  SchedulesRow.Value[4]:='30.05.2000';

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

(*** call function ***)

  if not funct.call then

    (* on error show message *)
    showMessage(funct.exception)

  else
  begin

    (* show number of the purcaseorder *)
    MLDText:= funct.imports('PURCHASEORDER');
    MessageDlg('purcaseorder '+MLDText+' created.',
    MTInformation,[mbOK],0);
  end;
end;

end.

 

top of page 

 

ubuch.gif (1048 Byte) Example 7:

Show the details of material with the BusinessObject BUS1001

In this example the form TForm1 contains the following components:

Component Function
SAPBAPIControl1 SAP ActiveX-Component to connect to BAPI
Button1 Button to start the procedure
Panel1 Element to display the material-description

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');

    (* Call the object with the needed parameters *)
   
MAT:= sapbapicontrol1.GetSAPObject('BUS1001','000000000000017550');

    (* Display material-description *)
    Panel1.Caption:=MAT.MATERIALDESCRIPTION;
  end;
end;

end.

top of page 

 

ubuch.gif (1048 Byte) Example 8:

Create an purchaseorder with the BusinessObject BUS2012

In this example the form TForm1 contains the following components:

Component Function
SAPLogonControl1 SAP ActiveX-Component to logon to the system
SAPBAPIControl1 SAP ActiveX-Component to connect to BAPI
Button1 Button to start the procedure
Button2 Button to logon
Panel1-3 Elements to display messages

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

  (* select BusinessObject *)
  Mat:= SAPBapiControl1.GetSAPObject('BUS2012');

  (* define structures *)
  Header := SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','PoHeader');
  Schedul:= SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','PoItemSchedules');
  Item   := SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','PoItems');
  Ret    := SAPBapiCcontrol1.dimAs (Mat,'CreateFromData','Return');

  (* purchaseorder header data's *)
  Header.value ('DOC_TYPE') := 'NB';
  Header.value ('DOC_CAT')  := 'F';
  Header.value ('PURCH_ORG'):= '10';
  Header.value ('PUR_GROUP'):= '10';
  Header.value ('VENDOR')   := '0010000999';

  (* data for 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';

  (* schedules for 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';

  (* data for 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';

  (* schedules for 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';

  (* call the method CreateFromData *)
  Mat.CreateFromData (PoHeader           := Header,
                      SkipItemsWithError := ' ',
                      PoItems            := Item,
                      PoItemSchedules    := Schedul,
                      Return             := Ret);

  (* Errors are saved in the structure Ret *)
  if Ret.RowCount > 0 then
  begin
    Panel1.Caption:= Ret.Value (1,'TYPE');
    Panel2.Caption:= Ret.Value (1,'MESSAGE');
  end

  (* If the method was calles without errors, *)
  (* display the number of the purchaseorder  *)

  else Panel2.Caption:= Mat.PurchaseOrder;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin

  (* Logon to the 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('Logon O.K.');
    Button1.Enabled:= true;

    (* assign the existing connection to the *)
    (* component SAPBapiControl1              *)

    SapBapiControl1.Connection:=Connection;
  end
  else
  begin
    ShowMessage('Error on logon :-(((');
  end;
end;
end.

top of page