SAP 연동
메시지 정의서
2 024 년 02 월 01 일
㈜ 비아이매트릭스 기술연구소
제 . 개정 이력
버전 |
변경 일자 |
제 개정 내용 |
작성자 |
1.0 |
2021.03.08 |
최초 작성 |
박나미 |
1.1 |
2021 .03.15 |
메시지 형식 변경 |
박나미 |
1.2 |
2021. 0 3.16 |
오류 메시지 추가 |
박나미 |
1 .3 |
2021. 0 3.22 |
콤보 박스 옵션 사용하도록 추가 개행 처리 및 IN 파싱 오류 처리 |
박나미 |
1.4 |
2021.03.22 |
Table 형태의 input 설정 방법 |
박나미 |
1.5 |
2021.04.05 |
RFC CRUD 기능 사용 방법 |
박나미 |
1 .6 |
2021.04.08 |
1. SAP의 CRUD Table에 대한 스키마 정보를 MTX_META 테이블에 insert 시키는 sql 문 작성 Tool 2. RFC CRUD 실행 시 일반 파라메터 설정 기능 추가 |
박나미 |
1 .7 |
2021.04.16 |
RFC CRUD 실행 시 오류 처리를 위한 ERROR 파라메터 추가 |
박나미 |
1.8 |
2021.05.04 |
SAP RFC 호출 후 Return 값을 다중으로 받을 수 있는 구조 추가 |
박나미 |
2.0 |
2024.02.01 |
자체 RFC 연동 방식으로 기능 고도화 Exception 기능 미 구현 ( 구현 예정) |
박나미 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- SAP Function 호출 후 결과 TABLE 반환에 필요한 메시지 정의
I - Matrix , I - AUD 보고서 쿼리 설정 화면에 프로시저 형태의 호출 메시지를 작성합니다.
해당 요청 메시지에 따른 결과는 JDBC 형식의 Result Set 으로 변환하여 반환합니다.
하나의 Function 실행에 따른 결과 Table 은 1 개만 반환됩니다.
요청 메시지 명세
항목명(영문) |
항목명(국문) |
항목 구분 |
항목 설명 |
FUNCTION_NAME |
Sap Function 이름 |
필수 |
호출할 Sap Function 선택 |
TABLE_NAME |
결과 테이블 이름 |
필수 |
리턴받을 테이블 선택 없을 시 빈값 (“”) 처리 |
INPUT_PARAMS |
요청 파라메터 |
선택 |
Sap Function 실행 시 import 파라메터가 있으면 설정. |
① “ 매개변수명 ” : “ 값 ” 형식으로 설정 ② 값을 보고서 내에서 :VN_ , :VS_ 설정 가능 ③ 매개변수의 값이 여러 개 일때는 ; 로 구분하여 설정 각 매개변수의 값 개수는 동일하게 맞춰야 하며 값이 없을 시에는 빈 값( “”) 처리 ④ Table일 경우 매개변수명 앞에 <@T@> 를 붙인 후 작성한다. |
|||
OUTPUT_PARAMS |
응답 컬럼 |
선택 |
리턴받을 테이블에서 실제 조회하고 싶은 컬럼들 설정. 전체 컬럼을 모두 조회할 때는 설정 안함. |
① Name : 조회할 테이블의 컬럼명 ② Index : 조회 시 표시할 컬럼 순서. |
요청 메시지 형태
{ } 로 쌓여 있는 부분은 값이 없을 시 설정하지 않음
리턴테이블명이 없으면 공백으로 설정
INPUT_PARAMS의 매개변수의 값이 여러 개이면 ; 로 구분하여 설정
- T able 형태의 값 설정 시 [ ] 로 묶어서 값을 설정한다.
I-AUD 보고서에서 멀티 콤보박스 값 사용 시 구분자 ; 로 변환하여 전달
EXEC_RFC ( “ Function명 ”,” 리턴테이블명 ”,” INPUT_ PARAMS ”,{” 매개변수명 ”,” 값 ”,” 매개변수명 ”,” 값 ”……..},” OUTPUT_PARAMS ”,{” 컬럼명 ”,” 컬럼순서 ”,” 컬럼명 ”,” 컬럼순서 ”}) |
Import Parameter 의 값이 여러 개 일 때 예시 |
EXEC_RFC("ZXNSC_NEW_RFCCALL_TEST","IT_RESULT","INPUT_PARAMS","INPUT1",["PARAM1":'ABCD',"PARAM2":"1.21","PARAM3":"100000"],"IT_INPUT",["PARAM1":"EFGH";"IJKL";"MNOP","PARAM2":"2.32";"3.43";"4.54","PARAM3":”20”;”30”;”40”],"OUTPUT_PARAMS","PARAM1","2","PARAM2","1","PARAM3","3") |
Import Parameter의 값이 하나 일 때 예시 |
EXEC_RFC("ZXNSC_RFC_EXEC_SAMPLE","FIELDS","INPUT_PARAMS","STRUCT","ZXNSC_RFC_RESULT","PARAM1","3","PARAM2","ADD3","PARAM3","TEST2012DDSSDD","OUTPUT_PARAMS","FIELDNAME","2","FIELDTEXT","1","OFFSET","3") |
Output Parameter의 값을 설정하지 않을 때 예시 |
EXEC_RFC("ZXNSC_NEW_RFCCALL_TEST,"IT_RESULT","INPUT_PARAMS","INPUT1",["PARAM1":"ABCD","PARAM2":"1.21","PARAM3":"100000"],"<@T@>IT_INPUT",["PARAM1":"EFGH";"IJKL";"MNOP","PARAM2":"2.32";"3.43";"4.54","PARAM3":"20";"30";"40"],"OUTPUT_PARAMS") |
리턴 테이블이 없을 때 예시 |
EXEC_RFC("ZXNSC_NEW_RFCCALL_TEST","","INPUT_PARAMS","INPUT1",["PARAM1":"ABCD","PARAM2":"1.21","PARAM3":"100000"],"<@T@>IT_INPUT",["PARAM1":"EFGH","PARAM2":"2.32","PARAM3":"20"],"OUTPUT_PARAMS") |
- CRUD 기능
I - Matrix , I - AUD 보고서 에서 CRUD용 SAP RFC 호출하는 기능입니다
리턴값을 CRUD 성공 결과 count 가 SAP 에서 전달 시에만 Return 값을 설정하여 받을 수 있다. 기본은 Return 값을 공백으로 설정한다.
해당 기능은 Meta 를 수동으로 만들어서 사용해야 되기 때문에 이 기능은 가능하면 사용하지 않고 Multi Result (Procedure Call 형태) 형태로 사용해도 동일 결과를 받을 수 있다.
2-1. i-Matrix
DB Bot – DB Upload Plan을 사용
SAP RFC에서 CRUD에 사용하는 Table의 메타 정보를 Repository DB에 insert 합니다.
추가해야 될 Repository Table 정보
MTX_META_RELATION
MTX_META_OBJECT
MTX_META_ATTR
make_Insert_MetaData_SQL.jar 를 실행하여 테이블의 컬럼 정보가 있는 엑셀 파일들을 읽어서 자동으로 MTX_META 에 insert할 SQL 을 생성한다.
D B Upload Plan 을 실행한다.
- 첫번째로 S Q L 을 추가한다.
아래와 같이 메시지를 추가한다.
CRUD_RFC(RFC 함수명 , Return 값 , CRUD import 매개변수명)
매개변수가 Table 구조이면 매개변수명 앞에 <@T@> 를 삽입한다.
- 두번째부터 Repostiory Meta 에 생성한 테이블 항목별 CRUD 실행값을 설정한다.
CRUD import 매개변수에 설정한 명칭 순서대로 TABLE 또는 일반 파라메터를 추가하여 CRUD 값을 설정한다.
일반 파라메터는 “ key:value ” 형태로 설정
E x) “ 파라미터명1:값1 ” , “ 파라미터명2:값2 ” , “ 파라미터명n:값n ” 로 설정
오류에 대한 설정이 없을 시에는 공백으로 작성
- 실행 버튼을 작성한 해당 PLAN 을 실행시킨다.
2-2. i-AUD
I-AUD 디자이너를 실행한다.
CRUD 에 필요한 import 항목별 Grid 를 생성한다.
디자인에서 필드를 추가한다 . 각 항목별 CRUD 에 필요한 컬럼 항목을 작성한다.
Grid 의 Row 를 Append 하는 Button 을 만든다 .
- 보고서 작성은 사용자에 편의대로 작성하셔서 만드시면 됩니다.
Script Editor를 실행시킨다.
- Server Script 를 작성한다.
S QL 을 작성한다
CRUD_RFC( FUNC_NAME , RETURN , CRUD import 매개변수명)
매개변수가 Table 구조이면 매개변수명 앞에 <@T@> 를 삽입한다.
기존과 동일한 방식으로 connection 객체에 선언한다.
var INPUT1_TABLE = req.getTable("DataGrid"); var IT_INPUT_TABLE = req.getTable("DataGrid2"); var stmt; ………. ……….. stmt = con.PreparedStatement(sql); stmt.setString(1 , "ZXNSC_NEW_RFCCALL_TEST"); // function 명 stmt.setString(2 ,""); // return 값 stmt.setObject(3 , INPUT1_TABLE.toSapDataTable()); // crud g rid data stmt.setObject(4 , IT_INPUT_TABLE.toSapDataTable()); // crud grid data stmt.executeUpdate(); |
- 작성한 Server Script를 저장한다.
[Server Script Sample]
# 일반 파라메터 설정 예시
sql = “CRUD_RFC(FUNC_NAME , RETURN, “PARAM2”)”;
stmt = con.PreparedStatement(sql);
stmt.setString(1 , “Z_TEST”) ;
stmt.setString(2 , “”);
stmt.setString(3 , “test1”);
stmt.setString(4 , “test2”);
stmt.executeUpdate();
[ Meta 테이블 Insert SQL문 자동 생성 방법]
- CRUD 테이블에 해당하는 컬럼 정보가 있는 엑셀 파일들을 SAP 프로그램으로 생성한다.
- SAP 프로그램 중에서 테이블명을 입력하면 컬럼 정보가 엑셀 파일로 생성된다.
- 엑셀파일명칭은 RFC 명_ _ 테이블명.XLS ( 구분자 는 __ )
- MTX_META 테이블에 필요한 Meta data sql 을 생성해주는 모듈을 실행시킨다.
- j ava –jar make_Insert_MetaData_SQL.jar
- 실행 완료 후 생성된 sql 파일을 Matrix 서버의 Repository DB에 insert 한다.
- Upload Plan에서 생성한 테이블을 CRUD 에 맞게 설정한다.
- Multi Result (Procedu re Call 형태)설정 방법
SAP을 실행 후 전달받은 결과를 여러 건 동시에 처리할 수 있는 기능입니다.
JDBC 의 PrepareCall 형태로 registerOutParameter를 여러 개 설정하여 전달받는다.
3-1. 설정 방법( i-Matrix / i-AUD 공통)
I-AUD 디자이너를 실행한다.
Server Script 를 작성한다.
- Server Script 이름 맨 앞에 @ 를 붙여준 후에 명칭을 작성한다.
Ex) @SapCallable
- Template 중에서 Proceduer Call을 참고한다.
- S ql 작성은 아래와 같이 설정한다.
I ndex 기준으로 설정 할 때
{call RFC_함수명 (outParameterName , ….. , inputParameterName, … )}
Name 기준으로 설정 할 때
{call RFC_함수명}
- registerOutParameter를 설정 시 SQL Type 종류는 다음과 같다.
- 실행시에 해당 설정값을 의미없는 int형 값으로 주어도 무방하다.
SQL T ype |
설정값 |
SQL T ype |
설정값 |
Table 즉 DataSet( Array) 구조 |
-10 |
DOUBLE |
8 |
STRING (VARCHAR) |
12 |
FLOAT |
6 |
NUMERIC |
2 |
BOOLEAN |
16 |
DATE |
91 |
|
|
O utput , input 설정 예시
I ndex 기준으로 설정 할 때
var req = Matrix.getRequest(); var res = Matrix.getResponse(); var conn = Matrix.getConnection(); try{ conn.Connect("DBBEE56A722B7F472BA9E746EE412F6D17"); var sql = " {call /IAPPS/IAC_INF_APPRDETAIL (E_FLOWHD,ET_FIDOC,E_RETMSG,E_RETTYP, I_FLOWCODE,I_FLOWNO,I_FLOWCNT,I_LOGIN_ID)} ";
// set output parameters var stmt = conn.PrepareCall(sql); stmt.registerOutParameter(1, -10); stmt.registerOutParameter(2, -10); stmt.registerOutParameter(3, 12); stmt.registerOutParameter(4, 12);
// set input parameters stmt.setString(5 ,req.getParam("VS_PARAM1")); stmt.setString(6 ,req.getParam("VS_PARAM2")); stmt.setString(7 ,req.getParam("VS_PARAM3")); stmt.setString(8 ,req.getParam("VS_PARAM4"));
stmt.execute(); // 실행 var E_FLOWHD_DATA = stmt.getDataTable(1); var ET_FIDOC_DATA = stmt.getDataTable(2); var E_RETMSG_DATA = stmt.getString(3); var E_RETTYP_DATA = stmt.getString(4);
//set response dataset res.getDataSet().AddTable(E_FLOWHD_DATA, "E_FLOWHD_GRID"); res.getDataSet().AddTable(ET_FIDOC_DATA, "ET_FIDOC_GRID");
//create manual datatable var table = res.getDataSet().CreateTable("RETERROR"); table.AddColumn("E_RETMSG", false); table.AddColumn("E_RETTYP", false); var row = table.AppendRow(); row.setData("E_RETMSG", E_RETMSG_DATA); row.setData("E_RETTYP", E_RETTYP_DATA); } catch(e){…….} |
Name 기준으로 설정 할 때
var req = Matrix.getRequest(); var res = Matrix.getResponse(); var conn = Matrix.getConnection();
var INPUT1_TABLE = req.getTable("DataGrid"); var IT_INPUT_TABLE = req.getTable("DataGrid2");
try{ conn.Connect("DBBEE56A722B7F472BA9E746EE412F6D17"); sql = " {call ZXNSC_NEW_RFCCALL_TEST} "; // set output parameters var stmt = conn.PrepareCall(sql); stmt.registerOutParameter("IT_RESULT", -10); stmt.registerOutParameter("IT_INPUT", -10);
// set input parameters stmt.setObject("INPUT1" , INPUT1_TABLE. toSapDataTable() ); stmt.setObject ("IT_INPUT" , IT_INPUT_TABLE.toSapDataTable() );
stmt.execute(); // 실행
var IT_RESULT_DATA = stmt.getDataTable(1); var IT_INPUT_DATA = stmt.getDataTable(2);
//set response dataset res.getDataSet().AddTable(IT_RESULT_DATA, "IT_RESULT_GRID"); res.getDataSet().AddTable(IT_INPUT_DATA, "IT_INPUT_GRID");
conn.DisConnect(); conn = null; }catch (e){ if(conn != null){conn.DisConnect();conn = null;} } |
3-2. Client 설정 방법
3-2-1. i-Matrix
i-AUD Designer 에서 Server Script 작성 후 해당 Script 를 호출하여 설정한다 .
실행 버튼에 해당하는 매크로를 아래 예시처럼 작성한다.
I nput pa rameter 설정
구분 |
key |
value |
일반 변수 |
Server Script에 설정한 R equest parameter name |
Range(이름정의 변수명) . Value |
Table(구조체) |
Server Script 에 설정한 setObject parameter name |
Range(셀 지정) , True |
…… Set mxmodule = Application.COMAddIns.Item(" iMATRIX6.ExcelModule ").Object 'Server Script 호출 준비 Set svc = mxmodule.xapi.GetServerScript() 'ServerScript 에 전달할 input parameter( 변수명 , 변수값 ) 추가 'svc.AddParam "VS_PARAM1", Range("VS_PARAM1").Value
'TABLE 추가 svc.AddTable "INPUT1", Range("A2:C3"), True svc.AddTable "IT_INPUT", Range("A7:C10"), True
'ServerScript 실행 (i-AUD 보고서 code, ServerScript Code) Set result = svc.Execute("REP612DC32FF2F2412BB4F6AB68FEE98A51", "@SapCallable")
' 실행 결과 확인 If result.code <> 0 Then MsgBox " 실행 오류 발생 " & result.Message Else
' 데이터 출력 ( server script 에 작성한 output data set 이름 정의 ) Recordset Range("A13").CopyFromRecordset result.GetRecordset("IT_RESULT_GRID")
' 데이터 출력 ( server script 에 작성한 output data set 이름 정의 ) Recordset Range("H13").CopyFromRecordset result.GetRecordset("IT_INPUT_GRID")
'table 명을 모를 경우 'table count 확인 For idx = 1 To result.TableCount Set rs = result.GetRecordset(idx - 1) Debug.Print rs.RecordCount, rs.Fields.Count Next
End If ……………. |
구분 |
내용 |
result . GetRecordset(“ 이름 ”) |
i-AUD ServerScript에서 res.getDataSet().AddTable 로 설정한 name |
output pa rameter 설정
[매크로 예시]
3-2 -2 . i-AUD
I-AUD D esigner 에서 작성한 Server Script 를 기준으로 Client Script 를 작성한다.
버튼을 통한 Server Script 실행 시 예시는 다음과 같다.
output pa rameter 표현
구분 |
내용 |
R esponse로 설정한 Table |
Grid로 만들어 놓은 Form 에 response 로 전달한 Dataset 을 설정 |
[Client Script 예시]
var ET_FIDOC_GRID; var E_FLOWHD_GRID; var RETERROR;
……..
var OnButtonClick = function(sender, args){
if (args.Id == "RUN"){ Matrix.RunScript(" null " ,"@SapCallable" ,function(p){
if(p.Success == false){ Matrix.Alert(p.Message); return; } var ds = p.DataSet;
ET_FIDOC_GRID.SetDataSet(ds.GetTable("E_FLOWHD_GRID").ToDataSet()); E_FLOWHD_GRID.SetDataSet(ds.GetTable("ET_FIDOC_GRID").ToDataSet()); RETERROR.SetDataSet(ds.GetTable("RETERROR").ToDataSet());
});
} };
…………………… |