日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA与SAP数据交互的方式总结

發(fā)布時間:2025/3/16 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA与SAP数据交互的方式总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


JAVA與SAP數(shù)據(jù)交互的方式總結(jié)

??? RFC方式:Java程序直接通過RFC訪問SAP的對象(或稱函數(shù),可能叫法不對)
??? SAP提供了BAPI(Business Application Programming Interface),BAPI是SAP系統(tǒng)對外提供的一系列接口,主要是使第三方程序通過這些接口來使用SAP,從而方便客戶定制某些程序.VB,Java,C,C++等都可以通過BAPI來訪問SAP.BAPI是通過R/3系統(tǒng)上的RFC(Remote function call)功能來實現(xiàn)的.因為BAPI的強大功能作為基礎(chǔ),SAP就完全可以選擇Java在CRM上加強各種功能,比如可以用Java快速開發(fā)一個實現(xiàn)特定功能的客戶端。針對Java,SAP也提供了一個API叫Java Connector(JCo),可以使用它方便的調(diào)用BAPI提供的接口。

舉例說明:在我們的某一個項目中,需要每個月從R3取出供應(yīng)商的寄售和非寄售匯總結(jié)算數(shù)據(jù)和明細數(shù)據(jù),展現(xiàn)在供應(yīng)商信息平臺上,供供應(yīng)商開發(fā)票和財務(wù)部付款進行結(jié)算,那么可以做一個定時器,通過RFC在每個月的一號0點將結(jié)算數(shù)據(jù)取出。

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企業(yè)系統(tǒng)軟件的應(yīng)用程序之間或SAP應(yīng)用程序與外部程序之間電子數(shù)據(jù)交換用的標(biāo)準(zhǔn)數(shù)據(jù)格式。IDoc是SAP的應(yīng)用程序連接系統(tǒng)的數(shù)據(jù)轉(zhuǎn)換工具。IDoc用于數(shù)據(jù)異步處理:每個IDoc生成獨立的文本文件,無需連接中央數(shù)據(jù)庫,就可以傳送給要求數(shù)據(jù)的工作平臺。SAP的另一個系統(tǒng)業(yè)務(wù)應(yīng)用程序接口則用于數(shù)據(jù)同步處理。  一個大公司的網(wǎng)絡(luò)操作環(huán)境很可能需要各地分公司的電腦都能與公司的主數(shù)據(jù)庫連接。這些電腦很可能是用不同的硬件或操作系統(tǒng)平臺。因為IDoc對數(shù)據(jù)進行了壓縮,所以它無需變換格式就能在不同的操作系統(tǒng)上使用。  IDoc類型指定不同種類的數(shù)據(jù),比如說購買訂單或發(fā)票,它們可能被劃分為更細小的數(shù)據(jù)種類,即信息類型。更詳細的分類意味著一個IDoc類型只能儲存某一特定交易所需的數(shù)據(jù),這樣既提高了工作效率又降低了資源損耗。  在事務(wù)處理過程中,IDoc隨時會生成。例如,在運貨交易過程中,可能會產(chǎn)生打印貨運清單所需數(shù)據(jù)的IDoc。客戶在SAP系統(tǒng)執(zhí)行完一項交易后,在數(shù)據(jù)傳送過程中和經(jīng)過ALE通訊層時,一個或多個IDoc會生成。通訊層執(zhí)行遠程功能調(diào)用,使用由客戶模式規(guī)定得端口定義和RFC介面定義。IDoc的接收者可能為R/3、R/2或一些外部系統(tǒng)。

在采用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,以消息的方式進行的數(shù)據(jù)的交換;另外一個層次是 BPM,即業(yè)務(wù)流程管理。
在 XI 中,數(shù)據(jù)(可以使一條記錄,比如單個的物料主數(shù)據(jù);也可以是多條記錄,比如含主單明細的供應(yīng)商主數(shù)據(jù))從某一個業(yè)務(wù)系統(tǒng)通過 XI 發(fā)送到另外一個業(yè)務(wù)系統(tǒng),站在業(yè)務(wù)系統(tǒng)的角度,前者稱為 Sender,后者稱為 Receiver 。
適配器(Adapter)進行 XI-XML 格式與業(yè)務(wù)系統(tǒng)的特定類型的數(shù)據(jù)格式之間的轉(zhuǎn)換。依據(jù)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)格式的不同,適配器可以分為多種類型,比如 SOAP Adapter, JDBC Adapter, File Adapter, RFC Adapter 和 IDoc Adapter 等。通常說的實現(xiàn)方式,譬如 SOAP+RFC,是指Sender 與 XI 之間使用 SOAP Adapter,XI 與 Receiver 之間使用 RFC Adapter。

總結(jié)

以上是生活随笔為你收集整理的JAVA与SAP数据交互的方式总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。