C# 服务调用RFC函数获取物料信息,并输出生成Excel文件

这个例子是C#服务调用RFC函数,获取物料的信息,并生成Excel文件

上接文章:C#服务

文章目录

  • 创建函数
  • 创建结构
  • 编写源代码
  • 创建批处理文件
  • 运行结果-成功
  • 部署服务器
  • C#代码
  • 配置文件
  • 注意!!

创建函数

在这里插入图片描述

创建结构

在这里插入图片描述

编写源代码

在这里插入图片描述

创建批处理文件

在这里插入图片描述
在这里插入图片描述

echo %~dp0
%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\installUtil.exe %~dp0WindowsService1_SAP_RFC.exe
Net Start C#ServerTest
sc config C#ServerTest=auto
pause

在这里插入图片描述

%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /u %~dp0WindowsService1_SAP_RFC.exe
pause

运行结果-成功

在这里插入图片描述

部署服务器

在这里插入图片描述

C#代码

using SAP.Middleware.Connector;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;namespace WindowsService1_SAP_RFC
{//创建人:LiuHongyu//创建日期:2024年12月20日//描述:测试C#服务的创建以及和SAP进行通讯,并生成Excel文档public partial class Service1 : ServiceBase{public Service1(){InitializeComponent();}//文件路径private string filePath = ConfigurationManager.AppSettings["FilePath"];//Excel文件路径private string excelFilePath = ConfigurationManager.AppSettings["ExcelFilePath"];//Excel模板文件路径private string excelFileTemplatePath = ConfigurationManager.AppSettings["ExcelFileTemplatePath"];private int n = 1;//计时器Timer timer;//rfc的地址private RfcDestination _rfcDestination;//每天定时器开关private bool dayScheduleSwitch;//每天定时执行的时间private string dayScheduleTime;//每月定时器开关private bool monthScheduleSwitch;//服务启动时调用protected override void OnStart(string[] args){WriteLog(filePath, "启动服务------");InitTimer();}private void InitTimer(){try{WriteLog(filePath, "开始计数------");timer = new Timer(60000);//1分钟//时间间隔到了之后,执行的操作为Executetimer.Elapsed += Execute;//是否重复执行timer.AutoReset = true;  //如果不设置就是只会执行一次//是否执行Elapsed中的事件timer.Enabled = true;}catch (Exception ex){WriteLog(filePath, "计时器错误: " + ex.Message);throw;}}//执行的操作private void Execute(object sender, ElapsedEventArgs e){//注册SAP客户端this.RegisterDestination();//获取当前的每日定时开关状态dayScheduleSwitch = Convert.ToBoolean(ConfigurationManager.AppSettings["DayScheduleSwitch"]);//获取每日定时执行的时间dayScheduleTime = ConfigurationManager.AppSettings["DayScheduleTime"];//获取当时的每月定时开关状态monthScheduleSwitch = Convert.ToBoolean(ConfigurationManager.AppSettings["MonthScheduleSwitch"]);//如果每日定时开关打开,并且当时是设置的时间if (dayScheduleSwitch && DateTime.Now.ToString("t") == dayScheduleTime){timer.Stop();//获取SAP数据this.InvokeRFCFunctionGetJobList();WriteLog(filePath, "第 " + n + " 次数据写入完毕------");n++;timer.Start();}else if (monthScheduleSwitch) //每月定时开关是打开状态{DateTime dt = DateTime.Now;int year = dt.Date.Year;    //获取当前的年int month = dt.Date.Month;  //获取当前的月int dayCount = DateTime.DaysInMonth(year, month); //返回这个当前年当前月的天数var endDayOfMonth = new DateTime(year, month, dayCount, 0, 0, 0);  //最后一天if (DateTime.Now.ToString("g") == endDayOfMonth.ToString("g"))//g:常规(短日期和短时间){timer.Stop();//获取SAP数据this.InvokeRFCFunctionGetJobList();WriteLog(filePath, "第 " + n + " 次数据写入完毕------");n++;timer.Start();}}//DateTime dt = DateTime.Now;//int year = dt.Date.Year;    //获取当前的年//int month = dt.Date.Month;  //获取当前的月//int dayCount = DateTime.DaysInMonth(year, month); //返回这个当前年当前月的天数//var endDayOfMonth = new DateTime(year, month, dayCount, 0, 0, 0);  //最后一天if (DateTime.Now.ToString("t") == "7:00" || DateTime.Now.ToString("t") == "11:30" || DateTime.Now.ToString("t") == "18:00")if (DateTime.Now.ToString("g") == endDayOfMonth.ToString("g"))//g:常规(短日期和短时间)//if (DateTime.Now.ToString("t") == "16:30")//{//    timer.Stop();//    //获取SAP数据//    this.InvokeRFCFunctionGetJobList();//    WriteLog(filePath, "第 " + n + " 次数据写入完毕------");//    n++;//    timer.Start();//}}//获取函数private void InvokeRFCFunctionGetJobList(){//数据表DataTable dataTable = new DataTable();//根据Destination获取函数IRfcFunction rfcFunction = null;try{WriteLog(filePath, "获取数据,第 "+ n +" 次------");RfcRepository rfcRepository = _rfcDestination.Repository;rfcFunction = rfcRepository.CreateFunction("Z_TEST_CSHAP_GET_MARA");rfcFunction.SetValue("I_MATKL", "10010101");  //设置参数rfcFunction.SetParameterActive(0, false); //设置参数有效性,false无效rfcFunction.Invoke(_rfcDestination);     //执行函数IRfcTable rfcTable = rfcFunction.GetTable("OT_TABLE"); //获取返回的表//给数据表添加列结构for (int i = 0; i < rfcTable.ElementCount; i++){RfcElementMetadata rfcElementMetadata = rfcTable.GetElementMetadata(i);dataTable.Columns.Add(rfcElementMetadata.Name);}//填充数据表DataRow drH = dataTable.NewRow();drH["MATNR"] = "物料编号";drH["MAKTX"] = "物料描述";drH["ERSDA"] = "创建日期";drH["MATKL"] = "物料组";drH["MEINS"] = "基本计量单位";drH["ZGUIG"] = "规格";dataTable.Rows.Add(drH);//填充数据foreach (IRfcStructure rs in rfcTable){DataRow dr = dataTable.NewRow();//循环每一列for (int i = 0; i < rfcTable.ElementCount; i++){RfcElementMetadata rfcElement = rfcTable.GetElementMetadata(i);dr[rfcElement.Name] = rs.GetString(rfcElement.Name);}dataTable.Rows.Add(dr);}dataTable.TableName = "Data";//复制模板Excel,覆盖原来的旧的Excel文件File.Copy(excelFileTemplatePath, excelFilePath, true);//选择解析文档格式相匹配的字符串string connectString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + excelFilePath + ";" + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=0'";using(OleDbConnection con = new OleDbConnection(connectString)){con.Open();string insertCmd = "INSERT INTO [Sheet1$] (物料编号,物料描述,创建日期,物料组,基本计量单位,规格) VALUES (?, ?, ?, ?, ?, ?)";//拼接插入语句;//创建执行命令OleDbCommand command = new OleDbCommand(insertCmd, con);//定义执行命令对应值的参数类型;command.Parameters.Add("@物料编号", OleDbType.VarChar);command.Parameters.Add("@物料描述", OleDbType.VarChar);command.Parameters.Add("@创建日期", OleDbType.DBDate);command.Parameters.Add("@物料组", OleDbType.VarChar);command.Parameters.Add("@基本计量单位", OleDbType.VarChar);command.Parameters.Add("@规格", OleDbType.VarChar);//执行插入语句for (int i = 1; i < dataTable.Rows.Count; i++){command.Parameters["@物料编号"].Value = dataTable.Rows[i]["MATNR"].ToString();command.Parameters["@物料描述"].Value = dataTable.Rows[i]["MAKTX"].ToString();command.Parameters["@创建日期"].Value = dataTable.Rows[i]["ERSDA"].ToString();command.Parameters["@物料组"].Value = dataTable.Rows[i]["MATKL"].ToString();command.Parameters["@基本计量单位"].Value = dataTable.Rows[i]["MEINS"].ToString();command.Parameters["@规格"].Value = dataTable.Rows[i]["ZGUIG"].ToString();command.ExecuteNonQuery();}con.Close();}#region 写入txt文件,已经注释写入txt文件//string dataFilePath = "D:\\Projects\\Visual_Studio_2022\\WindowsService1_SAP_RFC\\Data.txt";//using (StreamWriter sw = new StreamWriter(dataFilePath,true))//{//    foreach (IRfcStructure rs in rfcTable)//    {//        sw.Write(rs.GetString(0).Trim().ToString() + " ");//        sw.Write(rs.GetString(1).Trim().ToString() + " ");//        sw.Write(rs.GetString(2).Trim().ToString() + " ");//        sw.Write(rs.GetString(3).Trim().ToString() + " ");//        sw.Write(rs.GetString(4).Trim().ToString() + " ");//        sw.Write(rs.GetString(5).Trim().ToString() + " ");//        sw.WriteLine();//    }//}#endregion}catch (Exception ex){WriteLog(filePath, "发生错误: " + ex.Message);throw;}}private void RegisterDestination(){try{if (_rfcDestination == null){//_rfcDestination = RfcDestinationManager.GetDestination("S4P");  //正式库_rfcDestination = RfcDestinationManager.GetDestination("S4D");  //测试库}}catch (Exception ex){WriteLog(filePath, "SAP注册客户端失败: " + ex.Message);}}//写日志private void WriteLog(string filePath,string message){StreamWriter sw = null;try{//创建一个log文件sw = new StreamWriter(filePath, true);sw.WriteLine(message + DateTime.Now.ToString());}catch(Exception ex){sw.Write(ex.Message + DateTime.Now.ToString());}finally{if (sw != null){sw.Close();  //关闭流对象sw.Dispose(); //释放资源}}}//服务停止时调用protected override void OnStop(){WriteLog(filePath, "停止服务------");}}
}

配置文件

在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<configuration><!--关于连接SAP的配置--><configSections><sectionGroup name="SAP.Middleware.Connector"><sectionGroup name="ClientSettings"><section name="DestinationConfiguration" type="SAP.Middleware.Connector.RfcDestinationConfiguration,sapnco"/></sectionGroup></sectionGroup></configSections><SAP.Middleware.Connector><ClientSettings><DestinationConfiguration><destinations><!--正式系统800--><!--<add NAME="S4P" USER="999999" PASSWD="Hs123456789" CLIENT="800" SYSNR="00" ASHOST="192.168.4.23" LANG="ZH" GROUP="PUBLIC" MAX_POOL_SIZE="10" IDLE_TIMEOUT="600"/>--><!--测试系统310--><add NAME="S4D" USER="024083" PASSWD="Hs87654321" CLIENT="310" SYSNR="00" ASHOST="192.168.4.20" LANG="ZH" GROUP="PUBLIC" MAX_POOL_SIZE="10" IDLE_TIMEOUT="600"/></destinations></DestinationConfiguration></ClientSettings></SAP.Middleware.Connector><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /></startup><startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0"/></startup><!--配置日志的位置--><appSettings><!--本机测试目录--><add key="FilePath" value="D:\Projects\Visual_Studio_2022\WindowsService1_SAP_RFC\log.txt" /><add key="ExcelFilePath" value="D:\Projects\Visual_Studio_2022\WindowsService1_SAP_RFC\SAP返回数据.xlsx"/><add key="ExcelFileTemplatePath" value="D:\Projects\Visual_Studio_2022\WindowsService1_SAP_RFC\SAP返回数据模板.xlsx"/><!--服务器测试目录--><!--<add key="FilePath" value="D:\HS_C#Service_RFC_SAP_TEST\WindowsService1_SAP_RFC\log.txt" /><add key="ExcelFileTemplatePath" value="D:\HS_C#Service_RFC_SAP_TEST\WindowsService1_SAP_RFC\SAP返回数据模板.xlsx"/><add key="ExcelFilePath" value="D:\HS_C#Service_RFC_SAP_TEST\WindowsService1_SAP_RFC\SAP返回数据.xlsx"/>--><!--每月循环开关MonthScheduleSwitch,如果打开(设置为true)就是每月月末执行生成Excel,关闭(设置为false)就不执行--><add key="MonthScheduleSwitch" value="false"/><!--定时开关DayScheduleSwitch,如果打开(设置为true)就是每天定时执行生成Excel,关闭(设置为false)就不执行--><add key="DayScheduleSwitch" value="true"/><!--time:指定每天定时生成Excel的时间 9:00,10:00的格式--><add key="DayScheduleTime" value="14:30"/><add key="ClientSettingsProvider.ServiceUri" value="" /></appSettings>
</configuration>

注意!!

要先创建好Excel表,并预先准备好表头:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开idea开发软件停留在加载弹出框页面进不去

问题 idea软件点击打开&#xff0c;软件卡在加载弹框进不去。 解决方法 先进入“任务管理器”停止IDEA的任务进程 2.找到IDEA软件保存的本地数据文件夹 路径都是在C盘下面&#xff1a;路径&#xff1a;C:\Users\你的用户名\AppData\Local\JetBrains 删除目录下的文件夹&…

sqlserver sql转HTMM邮件发送

通过sql的形式&#xff0c;把表内数据通过邮件的形式发送出去 declare title varchar(100) DECLARE stat_date CHAR(10),create_time datetime SET stat_dateCONVERT(char(10),GETDATE(),120) SET create_timeDATEADD(MINUTE,-20,GETDATE()) DECLARE xml NVARCHAR (max) DECLAR…

用语言模型 GLM-Zero-Preview 来驱动战场推演

起源是一个验证性需求 如果告诉模型武器装备与战区背景 那么我们能不能推演在有限规模下的两军博弈场景 需求分析&#xff1a;明确推演目标 推演目的&#xff1a;你希望通过推演来分析两军在特定战区背景下的博弈局面&#xff0c;例如评估双方武器装备的对抗效果、作战策略的选…

Linux:各发行版及其包管理工具

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Debian 包管理工具&#xff1a;dpkg&#xff08;低级包管理器&#xff09;、apt&#xff08;高级包管理器&#xff0c;建立在dpkg基础上&#xff09;包格式&#xff1a;…

Java项目实战II基于小程序的驾校管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着汽车保有量的不断增长&#xff0c;驾驶培训市场日…

小程序租赁系统开发的优势与应用探索

内容概要 在如今这个数码科技飞速发展的时代&#xff0c;小程序租赁系统开发仿佛是一张神奇的魔法卡&#xff0c;能让租赁体验变得顺畅如丝。想象一下&#xff0c;无论你需要租用什么&#xff0c;从单车到房屋&#xff0c;甚至是派对用品&#xff0c;只需动动手指&#xff0c;…

AAAI2025:这也能融合?巧用多坐标系融合策略,PC-BEV实现点云分割170倍加速,精度显著提升!

引言&#xff1a;本文提出了一种基于鸟瞰图&#xff08;BEV&#xff09;空间的激光雷达点云分割方法&#xff0c;该方法通过融合极坐标和笛卡尔分区策略&#xff0c;实现了快速且高效的特征融合。该方法利用固定网格对应关系&#xff0c;避免了传统点云交互中的计算瓶颈&#x…

java接口下载zip,不生成中间文件,返回前端文件流

java接口下载zip&#xff0c;不生产中间文件&#xff0c;返回前端文件流 程序设计&#xff1a;代码实现&#xff1a; 程序设计&#xff1a; 前端向后端请求zip文件&#xff0c;zip文件中有多个文件压缩而成&#xff0c;后端操作文件流&#xff0c;而不生成中间文件。最后把zip…

在 pandas.Grouper() 中,freq 参数用于指定时间频率,它定义了如何对时间序列数据进行分组。freq 的值可以是多种时间单位

在 pandas.Grouper() 中&#xff0c;freq 参数用于指定时间频率&#xff0c;它定义了如何对时间序列数据进行分组。freq 的值可以是多种时间单位&#xff0c;具体包括以下几类&#xff1a; 常见的时间频率 (freq) 取值&#xff1a; 1. 日频率&#xff08;Daily&#xff09; …

java下载文件流,不生成中间文件。

java下载文件流&#xff0c;不生成中间文件。 代码设计&#xff1a;代码实现 代码设计&#xff1a; 从前端获取的数据经过后端加工后&#xff0c;生成文件流&#xff0c;并返回前端&#xff0c;&#xff08;不生成中间文件&#xff0c;注意内存&#xff0c;记得关闭流&#xf…

【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)

文章目录 前言完整代码Githubdocxdoc 代码解释1. msoffcrypto 方法&#xff08;用于解密 .docx 文件&#xff09;read_secret_word_file 函数密码生成与解密尝试try_decrypt_file 函数 2. comtypes 方法&#xff08;用于解密 .doc 文件&#xff09;read_secret_word_file 函数注…

职场常用Excel基础04-二维表转换

大家好&#xff0c;今天和大家一起分享一下excel的二维表转换相关内容~ 在Excel中&#xff0c;二维表&#xff08;也称为矩阵或表格&#xff09;是一种组织数据的方式&#xff0c;其中数据按照行和列的格式进行排列。然而&#xff0c;在实际的数据分析过程中&#xff0c;我们常…

python-redis访问指南

Redis&#xff08;Remote Dictionary Server&#xff09;是一种开源的内存数据结构存储&#xff0c;可用作数据库、缓存和消息代理。它功能强大且灵活&#xff0c;可根据需求调整架构和配置&#xff0c;以高性能、简单易用、支持多种数据结构而闻名&#xff0c;广泛应用于各种场…

MySQL锁的概念

锁的基本概念 锁在 MySQL 中是一种并发控制机制&#xff0c;它确保在多用户或多事务环境下数据的完整性和一致性。当多个事务同时访问和操作数据库中的数据时&#xff0c;为了防止数据出现不一致、丢失更新、脏读、不可重复读和幻读等问题&#xff0c;就需要使用锁来协调这些事…

Java-多种方法实现多线程卖票

Java多线程卖票是一个经典的并发编程问题,它展示了如何在多个线程之间安全地共享和修改资 源。以下是几种实现方式: 使用synchronized关键字: 使用synchronized修饰符来同步方法或代码块,确保同一时刻只有一个线程可以访问临界区(即操 作共享资源的代码)。 使用Reen…

Px4 V2.4.8飞控Mavlink命令控制说明

首先&#xff0c;可以使用两种方法连接飞控&#xff0c;使用虚拟机&#xff08;LINUX&#xff09;或使用地面站&#xff08;QGC&#xff09;连接。 在px4的代码文件位置打开命令终端&#xff0c;输入连接命令&#xff1a; ./Tools/mavlink_shell.py 在控制台使用help来获取所有…

【Vue3】h、ref:vue3的两个新特性(重要)-h和ref

h、ref&#xff1a;vue3的两个新特性-重要 h 函数&#xff08; createElement&#xff09;ref 函数总结 在 Vue 3 中&#xff0c;h 和 ref 是两个非常重要的函数&#xff0c;它们在框架的运行和组件的创建中扮演着关键角色。在 Vue 3 中&#xff0c;这两个函数是构建现代 Vue 应…

MySQL8安装与卸载

1.下载mysql MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压mysql安装包 解压到自己定义的目录&#xff0c;这里解压就是安装&#xff0c;解压后的路径不要有空格和中文。 3.配置环境变量 配置环境变量可以方便电脑在任何的路径…

简洁安装配置在Windows环境下使用vscode开发pytorch

简洁安装配置在Windows环境下使用vscode开发pytorch 使用anaconda安装pytorch&#xff0c;通过vscode集成环境开发pytorch 下载 anaconda 下载网址&#xff0c;选择对应系统的版本 https://repo.anaconda.com/archive/ windows可以选择Anaconda3-2024.10-1-Windows-x86_64.e…

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称&#xff0c;这是一个处理线程的工具包&#xff0c;从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 &#xff08;1&#xff09;进程 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源…