訪問SAP的RFC


.NET

環境
Xp(sp3) vs2010, win2003 EN 32bit(sp2)
winform,webform

引用sapnco.dll,sapnco_utils.dll(自動引用)
配置文件需要改成混合模式

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>
View Code

代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SAP.Middleware.Connector;
using System.IO;

namespace RMBreakSync
{


    //登陸SAP前的准備工作
    public class MyBackendConfig : IDestinationConfiguration
    {
        public RfcConfigParameters GetParameters(String destinationName)
        {
            if ("PRD_xxx".Equals(destinationName))
            {
                RfcConfigParameters parms = new RfcConfigParameters();
                parms.Add(RfcConfigParameters.AppServerHost, "10.**.**.***");   //SAP主機IP
                parms.Add(RfcConfigParameters.SAPRouter, "/H/2*8.??.**.***/H/");   //SAP主機IP
                parms.Add(RfcConfigParameters.SystemNumber, "00");  //SAP實例
                parms.Add(RfcConfigParameters.User, "xxx");  //用戶名
                parms.Add(RfcConfigParameters.Password, "xxx");  //密碼
                parms.Add(RfcConfigParameters.Client, "100");  // Client
                parms.Add(RfcConfigParameters.Language, "ZH");  //登陸語言
                return parms;
            }
            else return null;
        }
        public bool ChangeEventsSupported()
        {
            return false;
        }
        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;


        public  static bool IsAlive = false;

        private static RfcDestination _RfcDest = null;
        /// <summary>
        /// 獲取驗證票
        /// </summary>
        /// <returns></returns>
        public static  RfcDestination GetRfcDest()
        {
            if (_RfcDest == null || IsAlive==false)
            {
                lock (typeof(string))
                {
                    if (_RfcDest == null || IsAlive == false)
                    {
                        IDestinationConfiguration ID = new MyBackendConfig();
                        RfcDestinationManager.RegisterDestinationConfiguration(ID);
                        RfcDestination prd = RfcDestinationManager.GetDestination("PRD_xxx");
                        RfcDestinationManager.UnregisterDestinationConfiguration(ID);
                        _RfcDest = prd;
                        IsAlive = true;
                    }
                }
            }


            return _RfcDest;
        }

        


    }

    public class SAPWrap
    {
        /// <summary>
        /// 更新服務器狀態
        /// </summary>
        /// <param name="planId"></param>
        /// <param name="batno"></param>
        /// <param name="FGPartno"></param>
        public static void UpdateServerStatus(List<p_prodplanImport> list)
        {
            var prd = MyBackendConfig.GetRfcDest();
            RfcRepository repo = prd.Repository;
            IRfcFunction companyBapi = repo.CreateFunction("ZTPP_TO_MFG_FLAG");   //調用函數名
            IRfcTable rfcTable = companyBapi.GetTable("ITAB");
           // companyBapi.SetValue("EX_WERKS", "3003");   //設置Import的參數 ,即:輸入參數

           //多行
            foreach (var plan in list)
            {
                rfcTable.Insert();
                rfcTable.CurrentRow.SetValue("PLANID", plan.PlanID);
                rfcTable.CurrentRow.SetValue("FGPARTNO", plan.P8code);
                rfcTable.CurrentRow.SetValue("BATNO", plan.batno.ToString());
                rfcTable.CurrentRow.SetValue("FLAG", "X");
            }

            

            companyBapi.Invoke(prd);   //執行函數      

      
           
        }

        public static List<RMBreakImport> DownItems(p_prodplanImport plan)
        {
            var prd = MyBackendConfig.GetRfcDest();
            RfcRepository repo = prd.Repository;
            IRfcFunction companyBapi = repo.CreateFunction("ZTPP_TO_MFG_ITEM");   //調用函數名

            IRfcTable rfcTable = companyBapi.GetTable("ITAB");

            //單行
            rfcTable.Insert();
            rfcTable.CurrentRow.SetValue("PLANID", plan.PlanID);
            rfcTable.CurrentRow.SetValue("FGPARTNO", plan.P8code);
            rfcTable.CurrentRow.SetValue("BATNO", plan.batno.ToString().Trim());
         
    
            companyBapi.Invoke(prd);   //執行函數        


            IRfcTable table = companyBapi.GetTable("ZITEM");  //獲取相應的品號內表

            var list = new List<RMBreakImport>();
            for (int i = 0; i < table.RowCount; i++)
            {
                table.CurrentIndex = i;  //當前內表的索引行

                var item = new RMBreakImport();
                item.PlanId = table.GetString("PLANID");
                item.PlanId = item.PlanId.TrimStart("0".ToCharArray());

                item.FGpartno = table.GetString("FGPARTNO"); //前導零
                item.FGpartno = item.FGpartno.TrimStart("0".ToCharArray());


                item.p_yw = table.GetString("P_YW");
                item.p_FGName = table.GetString("P_FGNAME");
                item.batno = decimal.Parse(table.GetString("BATNO"));
                item.Poutput = table.GetDecimal("POUTPUT");
                item.productdate =DateTime.Parse( table.GetString("ProductDate")).ToString("yyyy-MM-dd");

                item.partno = table.GetString("PartNO");
                item.partno = item.partno.TrimStart("0".ToCharArray());

                item.p_partnoName = table.GetString("P_PartNoName");
                item.partnoqty = table.GetDecimal("PartNoQty");
                item.partnototalqty = table.GetDecimal("PartNoTotalQty");
                item.UM = table.GetString("UM");
                item.p_brand = table.GetString("P_BRAND");
                item.p_supplier = table.GetString("NORMT");
                item.BreakDate =DateTime.Parse(table.GetString("BreakDate")).ToString("yyyy-MM-dd");
                item.Breaker = table.GetString("BREAKER");
                //設置默認值
                item.TicketStatus = "已審核";
                item.IsOut = "";
                item.p_type = string.Empty;

                list.Add(item);

            }



            return list;
        }

        /// <summary>
        /// 下載計划列表
        /// </summary>
        /// <returns></returns>
        public static List<p_prodplanImport> DownPlan()
        {
            var prd = MyBackendConfig.GetRfcDest();
            RfcRepository repo = prd.Repository;
            IRfcFunction companyBapi = repo.CreateFunction("ZTPP_TO_MFG");   //調用函數名
            companyBapi.SetValue("EX_WERKS", "3003");   //設置Import的參數 ,即:輸入參數          
            companyBapi.Invoke(prd);   //執行函數        
            string MAKTX = companyBapi.GetValue("EX_WERKS").ToString();  //獲取字段
   
           
            IRfcTable table = companyBapi.GetTable("ITAB");  //獲取相應的品號內表
   
            var list=new List<p_prodplanImport>();
            

            for (int i = 0; i < table.RowCount; i++)
            {
                table.CurrentIndex = i;  //當前內表的索引行

                var plan=new p_prodplanImport();
                plan.PlanID = table.GetString("PLANID");
                plan.PlanID = plan.PlanID.TrimStart("0".ToArray());//前導零

                plan.P8code = table.GetString("FGPartNO");
                plan.P8code = plan.P8code.TrimStart("0".ToArray());
                plan.Pname = table.GetString("pname"); //計划名稱 
                plan.PlanType = table.GetString("PlanType");
                plan.Ppname = table.GetString("P_FGName");
                plan.Psetting = table.GetString("PSetting");
                if (plan.Psetting.Length > 50) plan.Psetting = plan.Psetting.Substring(0, 50);
                plan.batno =decimal.Parse( table.GetString("batno"));
                plan.P_yw = table.GetString("P_YW");
                plan.Poutput = table.GetDecimal("Poutput");
                plan.Pdate =DateTime.Parse( table.GetString("ProductDate")).ToString("yyyy-MM-dd");

                //設置默認列

                plan.Pweek1 = plan.Pdate;
                plan.Pplanner = "";
                plan.Pmanger = "";
                plan.Pcheckreust = "通過";
                plan.Pcheckdate = plan.Pdate;
                plan.Ptype = "新制";
                plan.Pday1 = plan.Poutput;

    
                list.Add(plan);

            }


           
            return list;

        }


    }




}
View Code

 Java

使用JCO,jco里面有4個版本,需要選擇正確的版本,測試Jco是否正確可以使用 java -jar d:\jco\sapjco3.jar ,如果沒有報錯表示正常了

 public static List<String> callRfcExample() {
        // 獲取RFC 對象
        JCoFunction function = RfcManager.getFunction("xxxx_V1");
        // 設置import 參數
        JCoParameterList importParam = function.getImportParameterList();
        importParam.setValue("I_WERKS", "www1");
        
        
        JCoTable tablename = function.getTableParameterList().getTable("R_GSTRP");
        tablename.deleteRow();
        tablename.deleteAllRows();
        tablename.clear();
        tablename.firstRow();
        
        tablename.appendRow();
        tablename.firstRow();

        tablename.setValue("SIGN", "I");
        tablename.setValue("OPTION", "BT");
        tablename.setValue("LOW", "2013-06-25");
        tablename.setValue("HIGH", "2013-06-25");
        // 執行RFC
        RfcManager.execute(function);

        // 獲取RFC返回的字段值
//        JCoParameterList exportParam = function.getExportParameterList();
//        String exParamA = exportParam.getString("field_A");
//        String exParamB = exportParam.getString("field_B");
        // 遍歷RFC返回的表對象
        List<String> list=new ArrayList<String>();
        
        JCoTable tb = function.getTableParameterList().getTable("ZAFKO");
        for (int i = 0; i < tb.getNumRows(); i++) {
            tb.setRow(i);
            list.add(tb.getString("ORDER_NUMBER"));
            System.out.println(tb.getString("ORDER_NUMBER"));
            //System.out.println(tb.getString("field02"));
        }
        return list;
    }
View Code

詳細請參考這里:http://www.cnblogs.com/geun/archive/2012/11/12/2765793.html#2714359

另外win2003,32或64 bit的需要安裝對應的
Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package (KB973544)
話說win2003,32bit上安裝了七把次都沒成功:(

//============

完成代碼參考網盤內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM