quarta-feira, 16 de dezembro de 2015

Exemplo: SAP - RFC (Remote Function Call) com Delphi

Este é um pequeno exemplo em Delphi de como chamar no SAP uma RFC (Remote Function Call).

  • Preparação Delphi

Para este exemplo será necessário importar no Delphi os ActiveX Controls SAP Logon Control e SAP Remote Function Call Control, conforme as imagens abaixo:




  • Informações necessárias

Para chamar no SAP a RFC será necessário alguns parâmetros, que podem ser obtidos conforme as telas das imagens abaixo:

    • Servidor de aplicação
    • Nº da instância
    • ID sist.

    • Mandante
    • Usuário
    • Senha
    • Idioma de logon



  • Exemplo

Para o download do projeto de exemplo clique aqui.

Form de exemplo:



Código fonte de exemplo:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    grid: TStringGrid;
    grid2: TStringGrid;
    SAPLogonControl1: TSAPLogonControl;
    SAPFunctions1: TSAPFunctions;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    procedure AutoSizeGrid(Grid: TStringGrid);
  public
    { Public declarations }
  end;

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

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  (* define connection and it's parameters *)
  Connection := SAPLogoncontrol1.newConnection;

  Connection.ApplicationServer := '127.0.0.1'; //Servidor de aplicação
  Connection.SystemNumber := '00'; //Nº da instância
  Connection.System := 'ECP'; //ID sist.

  (* In some GUI-versions the username *)
  (* must be written in uppercase !!!  *)

  Connection.Client := '000'; //Mandante
  Connection.User := AnsiUpperCase(Edit1.text); //Usuário
  Connection.Password := Edit2.text; //Senha
  Connection.Language := 'PT' ; //Idioma de logon

  Button1.Enabled := False;

  if Connection.LogOn(0, True) = true then
  (* parameter "true" : SilentLogOn *)
  begin
    ShowMessage('Logon O.K.');
    Button2.Enabled := True;
    Button3.Enabled := True;
  end
  else
  begin
    ShowMessage('Error on logon :-(((');
    Button1.Enabled := True;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  (* cut connection *)
  Connection.LogOff;

  ShowMessage('System LogOff...');
  Button1.Enabled := True;
  Button2.Enabled := False;
  Button3.Enabled := False;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  txt: string;
  r, c: integer;
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.ColCount := 3;
    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;
    AutoSizeGrid(grid);

    grid2.rowCount := Table.rowcount + 1;
    grid2.ColCount := Table.columncount;
    for r := 1 to grid2.RowCount -1 do begin
      for c := 1 to grid2.ColCount do begin
        grid2.cells[c - 1,r] := Table.value(r, c);
      end;
    end;
    AutoSizeGrid(grid2);
  end;
end;

procedure TForm1.AutoSizeGrid(Grid: TStringGrid);
const
  ColWidthMin = 10;
var
  C, R, W, ColWidthMax: integer;
begin
  for C := 0 to Grid.ColCount - 1 do begin
    ColWidthMax := ColWidthMin;
    for R := 0 to (Grid.RowCount - 1) do begin
      W := Grid.Canvas.TextWidth(Grid.Cells[C, R]);
      if W > ColWidthMax then
        ColWidthMax := W;
    end;
    Grid.ColWidths[C] := ColWidthMax + 5;
  end;
end;

end.



  • Considerações


Este exemplo foi baseado nas informações contidas nas páginas:
    • http://www.joachim-lentz.homepage.t-online.de/intro.htm
    • http://www.joachim-lentz.homepage.t-online.de/examples.htm

2 comentários:

  1. Olá!
    Utilizo SAP.Functions para fazer chamadas no SAP em Delphi, porém preciso conectar com SNC. Teria alguma experiência em relação a isso para compartilhar?
    Desde já muito obrigada!

    ResponderExcluir
  2. Olá,

    Infelizmente não tive nenhuma experiência.

    ResponderExcluir