使用sap.connector.dll的SAP RFC命令

时间:2015-05-13 05:52:20

标签: .net sap

想寻求您的帮助,并要求命令用于启动和调用rfc函数。 我已下载文件sap.connector.dll并使用它。我浏览网络,我找不到或做SAP组件。有没有办法只执行命令?

1 个答案:

答案 0 :(得分:0)

你可以试试这个.. 我正在使用SAP Connector

附带的这些DLL
  • rscp4n.dll
  • sapnco.dll
  • sapnco_utils.dll

如果您需要使用这些连接详细信息调用SAP事务,可以尝试此操作..

public void ExecuteTransaction(string tCode, string input)
        {
            int sub = 0;
            try
            {
                tCode = "YOUR Transaction Code";
                RfcConfigParameters rfc = new RfcConfigParameters();
                rfc.Add(RfcConfigParameters.Name, "BOXName");
                rfc.Add(RfcConfigParameters.AppServerHost, "HOST");
                rfc.Add(RfcConfigParameters.SAPRouter, "YOUR ROUTER STRING");
                rfc.Add(RfcConfigParameters.Client, "CLIENT");
                rfc.Add(RfcConfigParameters.UseSAPGui, "1");
                rfc.Add(RfcConfigParameters.User, "SAP USERNAME");
                rfc.Add(RfcConfigParameters.Password, "PW");
                rfc.Add(RfcConfigParameters.SystemNumber, "SYS NUMBER");
                rfc.Add(RfcConfigParameters.Language, "EN");
                rfc.Add(RfcConfigParameters.PoolSize, "5");

                //rfc.Add(RfcConfigParameters.IdleCheckTime, "0");

                RfcDestination rfcDest = RfcDestinationManager.GetDestination(rfc);
                //rfcDest.Ping();
                RfcRepository rfcRep = rfcDest.Repository;



                IRfcFunction funcArtikel =  rfcRep.CreateFunction("ABAP4_CALL_TRANSACTION");
                //IRfcTable itab = funcArtikel.GetTable("SPAGPA_TAB");
                funcArtikel.SetValue("TCODE", tCode);
                funcArtikel.SetValue("MODE_VAL", "A");
                funcArtikel.SetValue("UPDATE_VAL", "A");
                funcArtikel.SetValue("SKIP_SCREEN", "X");
                //itab.Append();
                //itab.SetValue("PARID", "PARAMETER NAME");
                //itab.SetValue("PARVAL", VALUE);
                //funcArtikel.SetValue("SPAGPA_TAB", itab);
                funcArtikel.Invoke(rfcDest);

            }
            catch (Exception ex)
            {
                lblError.Text = ex.ToString();
                //throw ex;   
            }
        }

在这里,我已经评论了一些代码,因为它用于通过RFC表从SAP获取一些值(数据集),如果需要,也可以启用它们。

并且不要更改以下代码集。它是RFC调用的默认SAP事务。您可以更改所需的任何TCODE。

 IRfcFunction funcArtikel =  rfcRep.CreateFunction("ABAP4_CALL_TRANSACTION");
                    //IRfcTable itab = funcArtikel.GetTable("SPAGPA_TAB");
                    funcArtikel.SetValue("TCODE", tCode);
                    funcArtikel.SetValue("MODE_VAL", "A");
                    funcArtikel.SetValue("UPDATE_VAL", "A");
                    funcArtikel.SetValue("SKIP_SCREEN", "X");

如果你使用IrfcTable检索一些数据,你可能需要将IRfcTable转换为DataTable,你可以使用它。

public static class IRfcTableExtentions
    {
        /// <summary>
        /// Converts SAP table to .NET DataTable table
        /// </summary>
        /// <param name="sapTable">The SAP table to convert.</param>
        /// <returns></returns>
        public static DataTable ToDataTable(this IRfcTable sapTable, string name)
        {
            DataTable adoTable = new DataTable(name);
            //... Create ADO.Net table.
            for (int liElement = 0; liElement < sapTable.ElementCount; liElement++)
            {
                RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement);
                adoTable.Columns.Add(metadata.Name, GetDataType(metadata.DataType));
            }

            //Transfer rows from SAP Table ADO.Net table.
            foreach (IRfcStructure row in sapTable)
            {
                DataRow ldr = adoTable.NewRow();
                for (int liElement = 0; liElement < sapTable.ElementCount; liElement++)
                {
                    RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement);

                    switch (metadata.DataType)
                    {
                        case RfcDataType.DATE:
                            ldr[metadata.Name] = row.GetString(metadata.Name).Substring(0, 4) + row.GetString(metadata.Name).Substring(5, 2) + row.GetString(metadata.Name).Substring(8, 2);
                            break;
                        case RfcDataType.BCD:
                            ldr[metadata.Name] = row.GetDecimal(metadata.Name);
                            break;
                        case RfcDataType.CHAR:
                            ldr[metadata.Name] = row.GetString(metadata.Name);
                            break;
                        case RfcDataType.STRING:
                            ldr[metadata.Name] = row.GetString(metadata.Name);
                            break;
                        case RfcDataType.INT2:
                            ldr[metadata.Name] = row.GetInt(metadata.Name);
                            break;
                        case RfcDataType.INT4:
                            ldr[metadata.Name] = row.GetInt(metadata.Name);
                            break;
                        case RfcDataType.FLOAT:
                            ldr[metadata.Name] = row.GetDouble(metadata.Name);
                            break;
                        default:
                            ldr[metadata.Name] = row.GetString(metadata.Name);
                            break;
                    }
                }
                adoTable.Rows.Add(ldr);
            }
            return adoTable;
        }
}