그 전에 Java에서 SAP JCO RFC 인터페이스를 하는 방법에 대한 글을 작성했다.
2023.05.16 - [Language/Java] - [Java] Java에서 SAP JCO RFC 인터페이스 통신하는 방법
이번 글에서는 SAP와 RFC 통신을 할 때, 어떠한 구조로 RFC 통신을 할 수 있는지, 우리가 SAP로 데이터를 던질 때 어떤 형식으로 던져서 어떤 형식으로 리턴을 받는지에 대한 글을 작성한다.
목차
1. SAP와 RFC 통신
2. RFC 통신 방법
1. SAP와 RFC 통신
우리가 SAP와 RFC 통신 인터페이스를 할 때, 제일 먼저 했던 것이 통신을 하기 위한 정보들을 가져오는 setProperty하는 작업이었다. 물론, SAP RFC 통신을 위한 환경 구성은 다 했다고 가정한다.
아래와 같이, IP부터 SAP시스템번호, Client, 패스워드 등을 설정한다.
static String ABAP_NOPOOL = "ABAP_AS_WITHOUT_POOL";
static String ABAP_POOL = "ABAP_AS_WITH_POOL";
Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "IP");
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "SAP시스템번호");
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "CLIENT");
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "ID");
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "PASSWD");
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "언어");
connectProperties.setProperty(DestinationDataProvider.JCO_R3NAME, "R3NAME");
connectProperties.setProperty(DestinationDataProvider.JCO_GROUP, "SGROUP[");
connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "CAPACT");
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,"SLIMIT");
createDestinationDataFile("ABAP_AS_WITH_POOL", connectProperties);
그 다음에, 호출할 RFC를 설정하는데, 제일 중요한 것이 RFC 호출을 하기 위한 이름을 설정해야 한다. 제일 먼저, RFC 호출 통신을 하기 위해 우리가 설정한 RFC 이름이 있는지 확인을 하는데, 이게 없으면 연결을 하지 않는다.
// destination 설정
JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
// RFC 이름이 있는지 확인
JCoFunction function = destination.getRepository().getFunction("String 형 RFC 이름");
// RFC가 없으면 Exception 처리
if(function == null) {
throw new RuntimeException("FUNCTION not found in SAP. Error");
}
위와 같이, destination을 설정하고 RFC 이름이 있는지 확인을 하여 없으면 Exception을 리턴한다.
2. RFC 통신 방법
RFC 통신하는 방법에 있어서는 Java를 기준으로 설명하는데, 송신(Send)과 수신(Return)으로 나눈다. 송신하는 방법에 있어서 map, List(table), 헤더-Table 기준 등으로 보낼 수 있다.
1) map1개의 map에 Key-Value 형태로 담아서 데이터를 전송하는 방법이다.
try {
JCoParameterList paramlist = function.getImportParameterList();
Iterator keys = hashMap.keySet().iterator();
String key = "";
//위에서 key값을 가져와서 paramlist에 다시 key-value형태로 담는다.
while(keys.hasNext()){
key = (String) keys.next();
paramlist.setValue(key, hashMap.get(key));
}
// rfc 실행
rfcExecute(function, destination);
}
catch(AbapException e)
{
return returnList;
}
// 실행 후 정상적으로 호출이 완료되었으면, table 형태로 데이터가 넘어 온다.
JCoTable returnTable = function.getTableParameterList().getTable("RFC 리턴 테이블 이름 명시");
// 리턴 받은 테이블에서 Row 수를 가져온 다음에, row 수 만큼 변수를 꺼내와서 다시 Hashmap에 담아 리턴한다.
int rfcRowNum = returnTable.getNumRows();
for(int j = 0; j < rfcRowNum; j++){
DataMap returnMap = new DataMap();
returnTable.firstRow();
JCoFieldIterator retbl = returnTable.getFieldIterator();
JCoField jField = null;
while(retbl.hasNextField()){
jField = retbl.nextField();
returnMap.put(jField.getName(), jField.getValue());
}
returnList.add(j, returnMap);
returnTable.deleteRow(0);
}
이 방법은 HashMap 형태로 던져서, 결과는 Table로 리턴 받지만, Table 형태에서 데이터를 꺼내 오는 방법은 다시 HashMap으로 가져오고, 그것을 다시 Java에 맞게 List로 세팅하여 리턴하는 소스다.
이 방법 외에도, HashMap으로 송신을 하였을 때, 단일로 HashMap을 리턴받는 형태로도 RFC 통신을 진행할 수 있다. 다음 글에서는 HashMap으로 리턴받는 형태에 글을 작성한다.
'Language > Java' 카테고리의 다른 글
Windows11에서 Java JDK 1.8 다운로드 하는 방법 (1) | 2024.11.06 |
---|---|
[Java] Java SAP RFC 호출 시 락 걸리는 문제 해결하는 방법 (0) | 2023.09.18 |
[Java] Java 다중 이미지 첨부파일(img) 업로드하여 메일 전송하기(SMTP) - 1 (0) | 2023.08.09 |
[Java] Java 날짜 계산하는 방법(N개월 전, 후) (0) | 2023.06.27 |
[프로그래머스] 등차수열의 특정한 항만 더하기 자바(JAVA) (0) | 2023.06.07 |
[Java] java.lang.OutOfMemoryError: Java heap space 문제 해결하는 방법 (0) | 2023.06.02 |
[Java] Java 트랜잭션 예외 발생 시 DB에 예외 데이터 처리 하는 방법 (0) | 2023.06.01 |
[Java] Java KST 시간에서 연월일 추출하는 방법 (0) | 2023.06.01 |
최근댓글