首页 > 编程语言 >c# 用SapNwRfc调用sap内置bom函数用TreeView把bom展示出来

c# 用SapNwRfc调用sap内置bom函数用TreeView把bom展示出来

时间:2023-10-06 20:22:33浏览次数:45  
标签:LIKE c# list1 VALUE bom TreeView OPTIONAL BOM

一个需求,winform根据料号,查询sap 的bom,然后用控件调用sap内置bom函数,根据料号查询bom用TreeView把bom展示出来树形控件TreeView展示出来,TreeView的好处是父级子级直观明了。

sap关于bom 的tcode 主要是cs11 ,cs12,cs13。cs12可以显示多级bom,查询出来是这样的:

 这种表现方式,不是很直观。

sap内置的有一个bom 函数,CS_BOM_EXPL_MAT_V2  可以逐级BOM 展开。但是,CS_BOM_EXPL_MAT_V2是一个常规函数,并不是一个远程函数,c#不能调用。

我自己建一个远程函数,然后在这个远程函数里面去调用CS_BOM_EXPL_MAT_V2。

 

新建一个远程函数,处理类型设置 成远程启用的模块, 

 

 新建导入参数:

 参数名称,关联类型参照CS_BOM_EXPL_MAT_V2,有三个参数是必须的,有效起始日期 DATUV,物料编号 MTNRV,工厂 WERKS。

导出和表 这里设置  参照 CS_BOM_EXPL_MAT_V2

 

 然后开始写函数:代码如下

FUNCTION zfm_******bom001.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(DATUV) LIKE  STKO-DATUV OPTIONAL
*"     VALUE(MTNRV) LIKE  MARA-MATNR OPTIONAL
*"     VALUE(STLAN) LIKE  STZU-STLAN OPTIONAL
*"     VALUE(STLAL) LIKE  STKO-STLAL OPTIONAL
*"     VALUE(MKTLS) LIKE  CSDATA-XFELD OPTIONAL
*"     VALUE(MEHRS) LIKE  CSDATA-XFELD OPTIONAL
*"     VALUE(RNDKZ) LIKE  CSDATA-XFELD OPTIONAL
*"     VALUE(WERKS) LIKE  MARC-WERKS OPTIONAL
*"  EXPORTING
*"     VALUE(TOPMAT) LIKE  CSTMAT STRUCTURE  CSTMAT
*"     VALUE(DSTST) LIKE  CSDATA-XFELD
*"  TABLES
*"      STB STRUCTURE  STPOX
*"      MATCAT STRUCTURE  CSCMAT OPTIONAL
*"  EXCEPTIONS
*"      ERROR
*"----------------------------------------------------------------------

  CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
    EXPORTING
      capid  = 'PP01' "应用程序 ID
      datuv  = DATUV "有效日期
      mtnrv  = MTNRV "物料号
       stlan                 = '1' "BOM Usage#1 is product
        stlal                 = '1' "Alternative BOM
      mehrs  = 'X' "多级展开
      mktls   = 'X'
      werks  = WERKS "工厂号
    IMPORTING
      topmat = topmat "顶级物料数据

    TABLES
      stb    = stb "BOM 明细表
      matcat = matcat. "父级物料清单表

  IF sy-subrc <> 0.
    WRITE:/ sy-subrc.
    RAISE error.
  ENDIF.

激活,测试一下,结果是对的,说明这个远程函数是没问题的。下面开始用c# 去调用这个远程函数。

 

ENDFUNCTION.

 

c# 调用sap远程函数,搜索一下,大多人使用 的 是.net connector 3.0。我这次用的是开源程序 SapNwRfc,开源地址是:https://github.com/huysentruitw/SapNwRfc,强烈推荐非常好用!

c#代码,第一步获取连接:

 public  class SAPConnection
 {
     public static SapConnection OpenConnection()
     {

         string connectionString = "AppServerHost=192.168.1.**; SystemNumber=00; User=***;Password=***; Client=300; Language=EN; PoolSize=5; Trace=8";

         var connection = new SapConnection(connectionString);
         connection.Connect();
         return connection;
     }
 }

创建winform窗体,大概是这样的:

 查询按钮事件代码,如下,先把bom数据查询出来,然后再通过递归函数 用treeView展示出来:

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.DataSource = null;
            dataGridView1.Refresh();
            listSTB.Clear();
            var connection = SAPConnection.OpenConnection();
            var someFunction = connection.CreateFunction("ZFM_****001");
            string str1 = someFunction.Metadata.Parameters.Count().ToString();
            string strdate = dtp_DATUV.Value.ToString("yyyyMMdd");

            var result = someFunction.Invoke<EexportCS_BOMResult>(new ImportParameters_CS_BOM
            {
                DATUV = strdate,
                MTNRV = txt_MTNRV.Text.Trim(),
                WERKS = txt_WERKS.Text.Trim(),
            });
            if (result.STB.Count() > 0)
            {
                foreach (var stb in result.STB)
                {
                    var someFunction1 = connection.CreateFunction("ZFM_****002");
                    var result1 = someFunction1.Invoke<EexportZHUBOM002Result>(new ImportParameters_ZHUBOM002
                    {
                        I_MTNRV = stb.IDNRK,
                    });
                    stb.OJTXB = result1.T_MAKT[0].MAKTX;
                    listSTB.Add(stb);
                }
            }
            connection.Disconnect();

            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.DataSource = listSTB;
            treeView1.Nodes.Clear();
            treeView1.Refresh();

            List<EexportSTB> list1 = listSTB.Where(a => a.STUFE == "1").ToList();

            tn.Nodes.Clear();
            tn.Text = result.TOPMAT.STLNR + "----" + result.TOPMAT.MATNR;

            AddChildModuleTreeNode(tn, list1);

            treeView1.Nodes.Add(tn);

            treeView1.Nodes[0].ExpandAll();

        }

递归函数:

  /// <summary>
  /// 递归函数
  /// </summary>
  private void AddChildModuleTreeNode(TreeNode tn, List<EexportSTB> list1)
  {
      for (int i = 0; i < list1.Count; i++)
      {
          TreeNode node = new TreeNode();
          node.Text = list1[i].IDNRK + "----" + list1[i].STLNR.ToString();
          // node.Tag = ds.Tables[0].Rows[i]["module_id"].ToString();
          tn.Nodes.Add(node);

          if (!string.IsNullOrEmpty(list1[i].XTLNR))
          {

              List<EexportSTB> list2 = listSTB.Where(a => a.STLNR == list1[i].XTLNR).ToList();

              AddChildModuleTreeNode(node, list2);
          }
      }
  }

最后查询结果展示:

 

标签:LIKE,c#,list1,VALUE,bom,TreeView,OPTIONAL,BOM
From: https://www.cnblogs.com/jiqingsishenet/p/17744904.html

相关文章

  • 构造Vulkan图形管线:VkGraphicsPipeline
     创建Pipeline构造信息:它包括:基本构造信息VkStructureType构建Pipeline额外需要的结构:constvoid*pNext构建Pipeline时指定的Flags:VkPipelineCreateFlags多个ShaderStage信息:VkPipelineShaderStageCreateInfo*(数组)......
  • 网络规划设计师真题解析--TCP慢启动拥塞避免机制
    TCP使用慢启动拥塞避免机制进行拥塞控制。当拥塞窗口大小为16时,发送节点出现超时未收到确认现象时,将采取的措施是(26)。再经过5轮后的拥塞窗口大小为(27)。26、A.将慢启动阈值设为16,将拥塞窗口设为8,并进入拥塞避免阶段B.将慢启动阈值设为16,将拥塞窗口设为1,并进入慢开始阶段C.将慢启动......
  • umich cv-2-1
    UMICHCVLinearClassifiers对于使用线性分类器来进行图片分类,我们可以给出这样的参数化方法:而对于这样一个式子,我们怎么去理解呢?首先从代数的角度,这个f(x,W)就是一张图片的得分,我们可以将一张图片所有的像素点输入,乘以一个权重矩阵,再加上一个偏置项b,就得到f(x,W)举个具体的......
  • 《CF gym Reverse LIS》解题报告
    原题链接一开始看到这题就很像模拟费用流,不过立马就放弃了,然后之后就再也没想过这个思路了。。。正解是模拟费用流,先讲一下答案长什么样,把\(0\)的权值记为\(1\),\(1\)的权值记为\(-1\),那么我们答案就是要选一段前缀和\(k\)段不相交的区间的最大值加上\(1\)的个数。......
  • typescript: Adapter pattern
     /***Adapterpattern适配器是一种结构型设计模式,它能使不兼容的对象能够相互合作。*file:Adapterts.ts***//***TheTargetdefinesthedomain-specificinterfaceusedbytheclientcode.*/classTarget{publicrequest():string{......
  • SpringMVC
    MVC:模型(model),视图(view),控制器(controller)SpringMVC是SprIng框架的web组件拦截器是类似于过滤器的OSI七层模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层TCP/IP协议四层:网络接口层,网络层,传输层,应用层JAVAEE三层:持久层,业务层,表现层SpringMVC工作流程核心: ......
  • 网络规划设计师真题解析--TCP慢启动拥塞避免机制
    TCP使用慢启动拥塞避免机制进行拥塞控制。当拥塞窗口大小为16时,发送节点出现超时未收到确认现象时,将采取的措施是(26)。再经过5轮后的拥塞窗口大小为(27)。26、A.将慢启动阈值设为16,将拥塞窗口设为8,并进入拥塞避免阶段B.将慢启动阈值设为16,将拥塞窗口设为1,并进入慢开始阶段C.将慢启动阈......
  • [题解] CF1245D - Shichikuji and Power Grid
    CF1245D-ShichikujiandPowerGrid题目传送门题意在一个网格图中,有\(n\)个城市。目标是使得\(n\)个城市都通电。对于一个城市有电,要么选择在其位置建立发电站,要么和另一个有电的城市连线。对于城市\(i\),在其位置建立发电站的费用为\(c_i\),和另一个城市\(j\)连电......
  • 视频监控/视频融合平台EasyCVR视频监控系统组成详解
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 《CF1824E LuoTianyi and Cartridge》 解题报告
    好题。模拟赛出了这题,抽象。初步化简:由于\(\min(A,C)\)不好处理,我们考虑从大到小加边加点,或者从小到大删边删点。一般题目是考虑加边加点好操作一点,这题是考虑删边删点好操作。然后我们记当前枚举的\(\min(A,C)\)的最小值是多少,记为\(x\)。然后称大于等于\(x\)点权......