Q&A

  • -(급)SAP R3 와의 Interface 문의사항- 부탁드립니다.[
델파이6.0으로 만들어진 시스템에서 sap r/3 의 RFC Call 하여  데이타를 보여주는
화면을 델파이로 만들려고 합니다.  

Sap GUI 6.2  설치하고 wtdlog.ocx , wtdfuncs.ocx 파일을 activex 컴포넌트에 생성하여
테스트해보기 위해서 아래와 같이 만들었습니다. RFC Call 하는 부분부터 모르겠습니다.


unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    SAPFunctions1: TSAPFunctions;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  Comobj;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var VCon , VFunc : Variant;
begin
  // parametry logowania SAPGUI
  VCon  := SAPFunctions1.Connection;
  VCon.User              := aaaaa;
  VCon.SystemNumber      :=  00 ;
  VCon.Client            := '100';
  VCon.ApplicationServer := 'XXX.XXX.XXX.XXX';
  VCon.Password          := 1234;
  VCon.Language          := 'KO';


  if VCon.logon(0,true) then begin
     ShowMessage('접속 성공');
  end;

  VFun := SAPFunctions1.add('Z_SD_GWIF_F4MATERIAL');

  / *****************************************
     exports, import  하고 table 내용 받아서 보여주는 것을 어떻게 해야 할지
   ????????????????????????????????
   *****************************************/

end;

end.
  

혹시 예제될만한 소스를 보내주신다면 정말 감사하겠습니다.  부탁드립니다
6  COMMENTS
  • Profile
    정동욱 2006.11.17 01:34


    [답변]
    SAP 의 RFC를 이용 하기위한 입맛에 꼭 맞는 예제는 실제 개발의 상당한 부분을
    알지못하고는 제공이 불가능 합니다.
    계략 어떻게 콜 하는지는  다음 예제로 알수 있을겁니다.
    BAPI를 불러  material 재고 을 이동 하는 예제입니다.

            Connection := Sap.SAPLogon.NewConnection;
            Connection.ApplicationServer :=  _sap_app_server;
            Connection.SystemNumber      :=  _sap_system_no;
            Connection.System            :=  _sap_system;
            Connection.Client            :=  _sap_client;
            Connection.User              :=  _sap_user;
            Connection.Password          :=  _sap_password;
            Connection.Language          :=  _sap_language;

            if Connection.LogOn(Sap.Handle,True) then
            begin
                Sap.SAPFunctions.Connection := Connection;
                Func := Sap.SAPFunctions.Add('BAPI_GOODSMVT_CREATE');
                Head := Func.Exports('goodsmvt_header');
                Code := Func.Exports('goodsmvt_code');
                Item := Func.Tables.Item('goodsmvt_item');
                Ret  := Func.Tables.Item('return');

                Head.value('pstng_date') := FormatDateTime('yyyymmdd',Now());
                Code.Value('gm_code')    := _sap_gm_code;

                Row := Item.Rows.Add;
                Row.Value('plant')         := _sap_plant        ;//'P001';
                Row.Value('stge_loc')      := _sap_stge_loc     ;//'C004';
                Row.Value('move_type')     := _sap_move_type    ;//'311';
                Row.Value('move_stloc')    := _sap_move_stloc   ;//'L401';
                Row.Value('entry_uom_iso') := _sap_entry_uom_iso;//'EA';
                Row.Value('material')      := _part_no;
                Row.Value('entry_qnt')     := _qty;
                
                if not Func.Call then
                begin
                   // Eror -> Func.Exception;
                end else
                begin
                        if Ret.RowCount > 0 then
                        begin
                           if Ret.Value (1,'TYPE') = 'E' then
                           begin
                              Result := 'E:(RET)' + Ret.Value(1,'MESSAGE');
                              FuncBack := Sap.SAPFunctions.Add('BAPI_TRANSACTION_ROLLBACK');
                              FuncBack.Call;
                           end;
                        end else
                        begin
                           Result := Func.Imports('MaterialDocument').Value;
                           FuncCommit := Sap.SAPFunctions.Add('BAPI_TRANSACTION_COMMIT');
                           FuncCommit.Call;
                        end;
                end;


  • Profile
    정연수 2006.11.17 19:25


    이렇게 답변을 해주셔서 정말 감사합니다. ^^

    몇가지 더 궁금한것이 있어 글을 올립니다.

    1. import ActiveX Contol.... 에서 wtdlog.ocx , wtdfuncs.ocx 파일을 인스톨을 하여
    쓰는것이 맞는지요?  아니면 SAP DCOM Connector 를 이용해야 하는건지 알고싶습니다.


    2. IDispatch 타입을 Variant 타입으로 할당 받는건가요?   위에 변수들의 타입이 궁금합니다.

    3. RFC Function -> Z_SD_GWIF_F4MATERIAL    일경우
        Func := SAPFunctions1.Add('Z_SD_GWIF_F4MATERIAL');
        Func.Exports('Export parameter 명') :=    value;
        
        이렇게 입력하는 것이 맞는지 궁금합니다.  ocx 파일 인스톨하고 생성되는 TLB interface 들을
        어떤식으로 사용해야할지 모르겠습니다.

    수고스럽겠지만 한번더 부탁드립니다.
    정말 감사합니다.

        
        





  • Profile
    정동욱 2006.11.18 01:50


    1. import ActiveX 하면 Component 로 등록 됩니다.
       여느 Component 사용 하듯이
       아이콘 TSAPFunctions,TSAPLogonControl 을 Form 위에 끌어다 놓고
       사용 하면 됩니다  

    2. 변수는 전부 Variant 입니다.

    3. 그렇게 하면 됩니다.

  • Profile
    정연수 2006.11.18 09:04


    제가 잘 몰라서 자꾸 귀찮게 해드리는것같습니다.  마지막으로 도움을 청합니다.
    이번에도 안되면 포기하고 다른 방식으로 처리해야 할것같습니다. ㅠ.ㅠ

    위에 내용대로 일단  테스트하기 위해 만들어 보았습니다.  
      Connection := SAPLogonControl1.NewConnection;   //   sap.SAPLogon.NewConnection;
      Connection.ApplicationServer :=  '172.16.8.41';       <=== 이부분부터 에러가 발생합니다.

    자세한 내용은 파일로 첨부하였습니다.  죄송하지만 한번 더 확인해 주신다면 감사하겠습니다.

    휴~~ 제가 별의별 방법과 여러자료를 가지고 다 해보았지만..  안되는군요. 제가 많이 부족해서
    그런것 같습니다. ㅠ.ㅠ
    설정을 잘못해서 그런건지 ....   아니면...  뭐가 잘못되여서 그런건지 알수가 없어 너무 답답해서
    이렇게까지 하게 되는군요......  


    unit Unit1;

    interface

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

    type
      TForm1 = class(TForm)
        SAPLogonControl1: TSAPLogonControl;
        SAPFunctions1: TSAPFunctions;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        Connection : Variant;
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Connection := SAPLogonControl1.NewConnection;   //   sap.SAPLogon.NewConnection;
      Connection.ApplicationServer :=  '172.16.8.41';
      Connection.SystemNumber      :=  00;
      //Connection.System            :=  _sap_system;
      Connection.Client            :=  '100';
      Connection.User              :=  'xxxx';
      Connection.Password          :=  'xxxx';
      Connection.Language          :=  'KO';

    end;

    end.

  • Profile
    정해철 2007.12.07 19:21
    안녕하세요.

    제가 지금 격고 있는 상황하고 똑같은데요.
    혹시 원인 파악 되셨나요?? 답글좀 부탁 드려요..
    저도 급한데.. ㅡㅜ


  • Profile
    유재희 2008.11.21 23:43
    델파이 버젼 6 에서 같은 에러 발생함
    => 델파이 버젼 7에서 컴파일 후 해결함