JAVA与SAP数据交互的方式总结
生活随笔
收集整理的這篇文章主要介紹了
JAVA与SAP数据交互的方式总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JAVA與SAP數據交互的方式總結
??? RFC方式:Java程序直接通過RFC訪問SAP的對象(或稱函數,可能叫法不對)
??? SAP提供了BAPI(Business Application Programming Interface),BAPI是SAP系統對外提供的一系列接口,主要是使第三方程序通過這些接口來使用SAP,從而方便客戶定制某些程序.VB,Java,C,C++等都可以通過BAPI來訪問SAP.BAPI是通過R/3系統上的RFC(Remote function call)功能來實現的.因為BAPI的強大功能作為基礎,SAP就完全可以選擇Java在CRM上加強各種功能,比如可以用Java快速開發一個實現特定功能的客戶端。針對Java,SAP也提供了一個API叫Java Connector(JCo),可以使用它方便的調用BAPI提供的接口。
舉例說明:在我們的某一個項目中,需要每個月從R3取出供應商的寄售和非寄售匯總結算數據和明細數據,展現在供應商信息平臺上,供供應商開發票和財務部付款進行結算,那么可以做一個定時器,通過RFC在每個月的一號0點將結算數據取出。
private final static String FUNCTION_GET_NONVMI_DATA = "ZPUR_DATA_GET_TMP1";
?
?private JCO.ParameterList getNonVmiTableParameterList(
?? JCO.Client aConnection, String bukr, String month, String start,
?? String end, String lifnr) {
? IRepository aRepository = new JCO.Repository("SAPRep", aConnection);
? IFunctionTemplate functionTemplate = aRepository
??? .getFunctionTemplate(FUNCTION_GET_NONVMI_DATA);
? logger.debug("FunctionTemplate=" + functionTemplate);
? JCO.Function function = new JCO.Function(functionTemplate);
? JCO.ParameterList input = function.getImportParameterList();
? input.getField("BUKRS").setValue(bukr);
? //input.getField("SPMON").setValue(month);
? input.getField("LIFNR").setValue(lifnr);
? input.getField("ZBUDATB").setValue(start);
? input.getField("ZBUDATN").setValue(end);
? logger.debug("ImportParameterList=" + input);
? aConnection.execute(function);
? JCO.ParameterList tableParams = function.getTableParameterList();
? return tableParams;
?}
2、Idoc方式
適用于中間文件的IDoc定義格式,是SAP企業系統軟件的應用程序之間或SAP應用程序與外部程序之間電子數據交換用的標準數據格式。IDoc是SAP的應用程序連接系統的數據轉換工具。IDoc用于數據異步處理:每個IDoc生成獨立的文本文件,無需連接中央數據庫,就可以傳送給要求數據的工作平臺。SAP的另一個系統業務應用程序接口則用于數據同步處理?! ∫粋€大公司的網絡操作環境很可能需要各地分公司的電腦都能與公司的主數據庫連接。這些電腦很可能是用不同的硬件或操作系統平臺。因為IDoc對數據進行了壓縮,所以它無需變換格式就能在不同的操作系統上使用?! Doc類型指定不同種類的數據,比如說購買訂單或發票,它們可能被劃分為更細小的數據種類,即信息類型。更詳細的分類意味著一個IDoc類型只能儲存某一特定交易所需的數據,這樣既提高了工作效率又降低了資源損耗。 在事務處理過程中,IDoc隨時會生成。例如,在運貨交易過程中,可能會產生打印貨運清單所需數據的IDoc。客戶在SAP系統執行完一項交易后,在數據傳送過程中和經過ALE通訊層時,一個或多個IDoc會生成。通訊層執行遠程功能調用,使用由客戶模式規定得端口定義和RFC介面定義。IDoc的接收者可能為R/3、R/2或一些外部系統。
在采用IDOC方式的時候,可以采用IDOC落地或不落地的方式,一般只有在跟蹤測試或做傳輸記錄的時候的采用IDOC落地的方式,一般其他情況基本上都是采用不落地的方式。
public class JcoIdocServer extends JCoIDoc.Server {
? private final Log logger = LogFactory.getLog(JcoIdocServer.class);
? public JcoIdocServer(java.util.Properties properties,
??? IRepository jcoRepository, IDoc.Repository idocRepository) {
?? super(properties, jcoRepository, idocRepository);
? }// constructor MyIDocServer
?
? protected void handleRequest(JCO.Function function) {
?? logger.error("error:incoming function request '"
???? + function.getName() + "',but this should be not happen.");
? }// method handleRequest
?
? protected void handleRequest(IDoc.DocumentList documentList) {
?? logger.debug("Incoming IDoc list request containing "
???? + documentList.getNumDocuments() + " documents...");
?? IDoc.DocumentIterator iterator = documentList.iterator();
?? IDoc.Document doc = null;
?? while (iterator.hasNext()) {
??? doc = iterator.nextDocument();
??? logger.debug("Processing document no. " + doc.getIDocNumber()
????? + "...");
??? JcoIdocAudit jcoIdocAudit = new JcoIdocAudit();
??? jcoIdocAudit.setTabnam(doc.getTableStructureName());
??? jcoIdocAudit.setMandt(doc.getClient());
??? jcoIdocAudit.setDocnum(doc.getIDocNumber());
??? jcoIdocAudit.setDocrel(doc.getIDocSAPRelease());
??? jcoIdocAudit.setStatus(doc.getStatus());
??? jcoIdocAudit.setDirect(doc.getDirection());
??? jcoIdocAudit.setOutmod(doc.getOutputMode());
??? jcoIdocAudit.setExprss(doc.getExpressFlag());
??? jcoIdocAudit.setTest(doc.getTestFlag());
??? jcoIdocAudit.setIdoctyp(doc.getIDocType());
??? jcoIdocAudit.setCimtyp(doc.getIDocTypeExtension());
??? jcoIdocAudit.setMestyp(doc.getMessageType());
??? jcoIdocAudit.setMescod(doc.getMessageCode());
??? jcoIdocAudit.setMesfct(doc.getMessageFunction());
??? jcoIdocAudit.setStd(doc.getEDIStandardFlag());
??? jcoIdocAudit.setStdvrs(doc.getEDIStandardVersion());
??? jcoIdocAudit.setStdmes(doc.getEDIMessageType());
??? jcoIdocAudit.setSndpor(doc.getSenderPort());
??? jcoIdocAudit.setSndprt(doc.getSenderPartnerType());
??? jcoIdocAudit.setSndpfc(doc.getSenderPartnerFunction());
??? jcoIdocAudit.setSndprn(doc.getSenderPartnerNumber());
??? jcoIdocAudit.setSndsad(doc.getSenderAddress());
??? jcoIdocAudit.setSndlad(doc.getSenderLogicalAddress());
??? jcoIdocAudit.setRcvpor(doc.getRecipientPort());
??? jcoIdocAudit.setRcvprt(doc.getRecipientPartnerType());
??? jcoIdocAudit.setRcvpfc(doc.getRecipientPartnerFunction());
??? jcoIdocAudit.setRcvprn(doc.getRecipientPartnerNumber());
??? jcoIdocAudit.setRcvsad(doc.getRecipientAddress());
??? jcoIdocAudit.setRcvlad(doc.getRecipientLogicalAddress());
??? jcoIdocAudit.setCredat(doc.getCreationDateAsString());
??? jcoIdocAudit.setCretim(doc.getCreationTimeAsString());
??? jcoIdocAudit.setRefint(doc.getEDITransmissionFile());
??? jcoIdocAudit.setRefgrp(doc.getEDIMessageGroup());
??? jcoIdocAudit.setRefmes(doc.getEDIMessage());
??? jcoIdocAudit.setArckey(doc.getArchiveKey());
??? jcoIdocAudit.setSerial(doc.getSerialization());
??? jcoIdocAuditManager.create(jcoIdocAudit);
??? String[] result = new String[] {
????? JcoIdocAudit.OPERATION_FAILURE, "未知錯誤" };
??? String msgType = doc.getMessageType();
??? logger.debug("Processing message of type '" + msgType + "'...");
??? if ("MATMAS".equals(msgType)) {
???? logger.debug("idocManager.processMATMAS(doc),msgType="
?????? + msgType);
???? logger.debug("idocManager=" + idocManager);
???? result = idocManager.processMATMAS(doc);
??? } else {
???? logger.debug("invalid msgType:" + msgType);
???? return;
??? }
??? jcoIdocAudit.setOpcod(result[0]);
??? jcoIdocAudit.setOpmsg(result[1]);
??? jcoIdocAuditManager.update(jcoIdocAudit);
?? }
? }// method handleRequest
?
? protected boolean onCheckTID(String tid) {
?? return true;
? }// method onCheckTID
? protected void onConfirmTID(String tid) {
? }// method onConfirmTID
? protected void onCommit(String tid) {
? }// method onCommit
? protected void onRollback(String tid) {
? }// method onRollback
@Override
? public String toString() {
?? return "gwhost=" + this.getGWHost() + ";gwserv=" + this.getGWServ()
???? + ";progid=" + this.getProgID();
? }
?}
3、XI方式
XI 的集成又可以分為兩個層次,第一個層次稱為Integration Broker,以消息的方式進行的數據的交換;另外一個層次是 BPM,即業務流程管理。
在 XI 中,數據(可以使一條記錄,比如單個的物料主數據;也可以是多條記錄,比如含主單明細的供應商主數據)從某一個業務系統通過 XI 發送到另外一個業務系統,站在業務系統的角度,前者稱為 Sender,后者稱為 Receiver 。
適配器(Adapter)進行 XI-XML 格式與業務系統的特定類型的數據格式之間的轉換。依據業務系統的數據格式的不同,適配器可以分為多種類型,比如 SOAP Adapter, JDBC Adapter, File Adapter, RFC Adapter 和 IDoc Adapter 等。通常說的實現方式,譬如 SOAP+RFC,是指Sender 與 XI 之間使用 SOAP Adapter,XI 與 Receiver 之間使用 RFC Adapter。
總結
以上是生活随笔為你收集整理的JAVA与SAP数据交互的方式总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: symbian 视频播放解决方案
- 下一篇: Web 设计:实现干净代码的12条定律