After running the examples from BAPI / RFC with Delphi, I run into the following problem: Each time the Button2Click function was called the grid would show the results already displayed plus any data returned from SAP after the current call. A little bit of debugging showed that the table returned from the SAPFunctions object in statement Table := Funct.tables.item('DATA'), was the one that would not get initialized prior to Funct.call(). Aa I have no clues regarding the available methods of the table or the SAPFunctions object that would allow me to clear the table data before each call, I ended up rewriting the example performing the following changes.
- Create one connection object and retain it throughout the entire program session during FormCreate.
- Create and destroy a SAPFunctions object at each invocation of the ExecuteButtonClick() function. The way the table returned always has new data returned from SAP. This has been the only way I could avoid the problem of not initializing the returned table. Since I use similar code to perform data transfers between SAP and an other Oracle database at user defined intervals , this optin was more or less a one way.
unit MainUni;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SAPLogonCtrl_TLB, Grids,
StdCtrls, ComCtrls, ExtCtrls, Buttons;
type
TFormMain = class(TForm)
PanelLogin: TPanel;
StatusBar: TStatusBar;
ButtonExec: TButton;
Grid: TStringGrid;
SAPLogonControl: TSAPLogonControl;
BitBtnClose: TBitBtn;
procedure ButtonExecClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Table, Funct, Connection : VARIANT ;
public
{ Public declarations }
end;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
Uses
SAPFunctionsOCX_TLB;
procedure TFormMain.FormCreate(Sender: TObject);
begin
(* create a new connection object to be used
* for all sessions
*)
Connection := SAPLogonControl.newConnection;
Connection.System := 'R3Q';
Connection.Client := '100';
Connection.ApplicationServer:= 'sapqa_prd.shelman.int';
Connection.SystemNumber := '00';
Connection.Language := 'EN' ;
end;
procedure TFormMain.ButtonExecClick(Sender: TObject);
var
txt : String;
r : integer;
SAPFunctions: TSAPFunctions;
begin
SAPFunctions := nil;
// parameter "true" = SilentLogOn
if Connection.LogOn(0, false) = true then
try
(* Create a new SAPFunctions obejct and
* assign the existing connection to it
*)
SAPFunctions := TSAPFunctions.Create(Self);
SAPFunctions.Connection := Connection;
Funct := SAPFunctions.add('RFC_READ_TABLE');
Funct.exports('QUERY_TABLE').value := 'CSKT';
// attempt to call
if not Funct.call then
// called failed display the error in the statusbar
StatusBar.SimpleText := Funct.Exception
else begin
// Call is successfull display returned data
Table := Funct.tables.item('DATA');
grid.rowCount := Table.rowcount + 1;
grid.cells[0,0] := 'RecNo';
grid.cells[1,0] := 'Client';
grid.cells[2,0] := 'CostCent-No';
grid.cells[3,0] := 'CostCent-Des.';
for r := 1 to grid.rowCount -1 do begin
txt := Table.value(r,1);
grid.cells[0,r] := IntToStr(r);
grid.cells[1,r] := copy(txt,0,3);
grid.cells[2,r] := copy(txt,9,10);
grid.cells[3,r] := copy(txt,27,20);
end;
end;
finally
// close connection
Connection.LogOff;
// get rid of the SAPFunctions Object
SAPFunctions.Free;
end
else
StatusBar.SimpleText := 'Unable to login';
end;
end.
No comments :
Post a Comment