Membangun Integrasi Data SAP RFC dengan JAVA

Data integrations is connecting the dots

“Data is a precious thing and will last longer than the systems themselves.”

Tim Berners-Lee, inventor of the World Wide Web.

Membangun sebuah system yang terintegrasi dengan SAP merupakan hal yang gampang-gampang susah, mulai dari mempersiapkan infrastruktur pendukung hingga menganalisa performa aplikasi yang terintegrasi dengan SAP.

dalam kesempatan kali ini saya akan mencoba membangun sebuah integrasi data SAP dengan Java menggunakan Library SAPJCO untuk librarinya bisa di download pada link berikut, dengan SAP R/3 System, SAPJCO versi 3.0.18 dan dengan operating system Windows 7.

1. Download SAPJCO pada website resmi SAP

Langkah pertama adalah mendownload library sapjco kemudian Extract dan letakkan pada directory C:\sapjco dan tambahkan PATH C:\sapjco pada Environment Variables.

2. Membuat File Connection

Membuat file connection yang nanti akan dipanggil pada program seperti berikut :

jco.client.lang=EN
jco.client.client=320
jco.client.sysnr=00
jco.client.ashost=192.168.1.1
jco.client.user=userdev
jco.client.passwd=*************************

copy string di atas kemudian paste ke Notepad kemudian simpan dengan extension .jcoDestination sehingga akan menjadi seperti berikut :{namafile}.jcoDestination.

3. Setting Library to IDE

Saya menggunakan IDE Netbeans 8 untuk masukkan library sapjco lakukan langkah sebagai berikut :

klik kanan pada folder library
Tambahkan library sapjco.jar
Library berhasil di tambahkan

4. Let’s Begin to Code

Import library yang akan digunakan pada java code seperti berikut :

package javarfc_connection;import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoFunction;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;
import com.sap.conn.jco.AbapException;
import com.sap.conn.jco.JCoField;
import com.sap.conn.jco.JCoTable;
import com.sap.conn.jco.JCoRecordFieldIterator;
import com.sap.conn.jco.JCoStructure;
import java.util.*;

Berikut full source codenya :

public class JavaRFC_Connection {private static String ABAP_AS = "ABAP_AS";private static void eshtablishing() {try {
JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS);
BufferedReader br = null;
try {
String sCurrentLine;
sCurrentLine = "STFC_CONNECTION";
JCoFunction function = destination.getRepository().getFunction(sCurrentLine);
if (function == null) {
throw new RuntimeException("RFC Enabled Function Module " + sCurrentLine + " not found in SAP.");
}
function.getImportParameterList().setValue("REQUTEXT", "I am Rey");try {
function.execute(destination);
} catch (AbapException e) {
System.out.println("Error:" + e.getMessage());
return;
}
Iterator<JCoField> iterator = function.getExportParameterList().iterator();
String exportParams = "";
String structoutput = "";
String exportTableParams = "";
int newlineflag = 0;
while (iterator.hasNext()) {
JCoField field = iterator.next();
if (!field.getTypeAsString().equals("STRUCTURE")) {
exportParams = exportParams + field.getName() + "\n" + field.getTypeAsString() + "\n" + field.getValue().toString() + "\n";
} else if (field.getTypeAsString().equals("STRUCTURE")) {
JCoStructure exportStructure = function.getExportParameterList().getStructure(field.getName());
structoutput = structoutput + field.getName() + "\n";
for (int i = 0; i < exportStructure.getMetaData().getFieldCount(); i++) {
structoutput = structoutput + exportStructure.getMetaData().getName(i) + "\n" + exportStructure.getString(i) + "\n";
}
structoutput = structoutput + "END;\n";
}
}
exportParams = exportParams + "END;\n";
if (function.getTableParameterList() != null) {
Iterator<JCoField> iteratorTable = function.getTableParameterList().iterator();
while (iteratorTable.hasNext()) {
JCoField field = iteratorTable.next();
JCoTable codes = function.getTableParameterList().getTable(field.getName());
exportTableParams = exportTableParams + field.getName() + "\n";
JCoRecordFieldIterator iterator1 = codes.getRecordFieldIterator();
while (iterator1.hasNextField()) {
JCoField fieldtab = iterator1.nextField();
exportTableParams = exportTableParams + fieldtab.getName() + "\n";
}
exportTableParams = exportTableParams + "ENDMETADATA;\n";
for (int i = 0; i < codes.getNumRows(); i++) {
codes.setRow(i);
JCoRecordFieldIterator iterator2 = codes.getRecordFieldIterator();
while (iterator2.hasNextField()) {
JCoField fieldval = iterator2.nextField();
exportTableParams = exportTableParams + fieldval.getValue().toString() + "\n";
}
}
exportTableParams = exportTableParams + "END;\n";
}
}
File fileExport = new File("exportParameters.txt");
FileOutputStream fopExport = new FileOutputStream(fileExport);
System.out.println(exportParams);
// try {
// byte[] exportParameters = exportParams.getBytes();
// fopExport.write(exportParameters);
// fopExport.flush();
// fopExport.close();
// } catch (IOException e) {
// System.out.println("Error from Java : " + e.getMessage());
// }
File fileStructExport = new File("exportStructParameters.txt");
FileOutputStream fopStructExport = new FileOutputStream(fileStructExport);
try {
byte[] exportStructParameters = structoutput.getBytes();
fopStructExport.write(exportStructParameters);
fopStructExport.flush();
fopStructExport.close();
} catch (IOException e) {
System.out.println("Error from Java : " + e.getMessage());
}
File fileTable = new File("exportTableParams.txt");
FileOutputStream foptabExport = new FileOutputStream(fileTable);
try {
byte[] exportTabParameters = exportTableParams.getBytes();
foptabExport.write(exportTabParameters);
foptabExport.flush();
foptabExport.close();
} catch (IOException e) {
System.out.println("Error from Java : " + e.getMessage());
}
} catch (IOException e) {
System.out.println("Error from Java : " + e.getMessage());
}
String content = "success";
System.out.println(content);
} catch (JCoException e) {
String content = e.getMessage();
System.out.println("Error : " + content);
}}public static void main(String[] args) {
eshtablishing();
}
}

Pembahasan :

JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS);
  • digunakan untuk membuka koneksi ke SAP menggunakan file config {namafile}.jcoDestination. Dalam kasus ini file confignya bernama ABAP_AS.jcoDestination.
destination.getRepository().getFunction("STFC_CONNECTION");
  • digunakan untuk memanggil (FM) Fuction Modul, STFC_CONNECTION merupakan nama FM pada SAP.
function.getImportParameterList().setValue("REQUTEXT", "I'm Rey");
  • Digunakan untuk parsing parameter kepada SAP FM, dalam kasus ini FM"STFC_CONNECTIONmemiliki variable Import REQUTEXT yang diisi dengan string I'm Rey .
function.execute(destination);
  • Function untuk melakukan eksekusi proses.
Iterator<JCoField> iterator = function.getExportParameterList().iterator();
  • Function untuk menangkap Respons atau retun value dari SAP.

5. Hasil Akhir

jika sudah benar maka hasil dari eksekusinya adalah sebagai berikut :

Sekian tutorial dari saya, semoga bermanfaat dan bisa diimplementasikan dengan baik.

Mohon maaf jika ada yang kurang berkenan dan salah kata.

— Terima Kasih.

Lalu Raynaldi Pratama Putra

Written by

- Programming is Art - | ( Kotlin,Go Lang,ABAP) | Blockchain | Microservice | Mobile Apps |

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade