摘要:为高效、准确的在总部、销售公司、世界各地分支机构间交换订单信息,参照EDI电子数据交换原理,以ERP为核心,Hulft为传输工具,配合相应数据抽取、格式转换、数据导入等程序的开发,实现通过Internet连接的各据点间的数据自动交换、传输和处理。
关键词:EDI电子数据交换;Hulft;JavaScript
一、系统建立背景
我公司是日本CKD集团在中国(无锡)的制造基地,主要生产自动机械、省力机械、气动控制元件等产品。作为集团在海外规模最大的生产基地,公司以中国国内、日本、亚洲为中心,把商品销往世界各地。
公司每天源源不断与总部、上海销售公司、总部在世界各地分支机构间交换以下数据:
1.接收销售公司喜开理(上海)发送的的客户订单;
2.接收世界各地分支机构发送的out-out订单(公司对出口海外订单的特称);
3.发送到日本总公司的KD品采购订单;
4.接收各地先行情报数据(即备库计划);
系统建立前的工作方式是:各地从各自系统中导出订单数据保存为excel表格,通过电子邮件发送,再以电话形式与对方确认有无收到,核对接收是否完整。然后再各自手工输入系统。
二、需要解决的问题
1.订单使用电子邮件传送,特别是国际间通信,常常被延迟、拒收等。比如与台湾地区的通信就经常出现莫名其妙的问题,严重影响业务;
2.订单发送后的双方的核对确认工作量巨大,且容易出错;
3.订单数据的导出、输入工作为手工进行,效率低、易出错,经常无法及时对应紧急的客户订单;
4.各方ERP系统不同,系统间数据无法直接交换共享。
三、系统的建立过程
针对上述问题点,通过日本总部、本地工厂及上海销售公司三方协作,参照EDI电子数据交换原理,以ERP IFS系统数据为源头和终点,选用Hulft 7e为数据传输工具,配合相应数据抽取、格式转换、数据导入等程序开发,实现通过Internet连接的各据点间的数据自动交换、传输和处理。系统在随后陆续接入了CKD在世界各地的各个分支结构。各方任务分工如下:
本地工厂工作内容由我及所在IT部门主导实施及开发,生管、生产部门协助完成,以下就工作内容作逐一介绍。
1.系统结构图设计如下
EDI系统结构图
2.本地侧Hulft安装调试
使用安装光盘以默认方式安装Hulft 7e,配置发送端和接收端。本地和异地通信端都配置完成后双方可以进行文件传输通信。
通信据点设定
*此处填入的服务器主机名要能被对端机器解析成IP地址,必须在操作系统Hosts文件中添加对端主机名和IP地址的记录,hosts文件地址:C:\Windows\System32\drivers\etc
传输参数设定
接收参数设定
3.接收端EDI文件(tsv格式)自动分发脚本开发
Hulft服务器接收到的tsv文件,放在服务器指定文件夹下,因系统有多人使用,必须将文件分类自动分发到对应担当电脑指定文件夹下。我使用JavaScript编写了‘分发EDI数据.js’运行于Windows 脚本宿主,并使用Windows计划任务控制脚本的运行时间间隔。部分代码如下:
//定义初始函数参数 略
//定义通用对象
var objFSO = new ActiveXObject("scripting.filesystemobject");
//定义常量
var runDir = objFSO.GetParentFolderName(WScript.ScriptFullName)
var OverWriteExisting = true;
//复制文件到目录
function CopyFiles(sources,destination){
var strSource=sources;
var strDestination=destination;
var strfi="";
//虽然CopyFile函数可以在目标目录不存在时自动创建目录,但是只能创建目标的最后一级目录,不能创建中间部分目录,如果中间部分目录不存在则会出错。下面为判断并创建完整目录。
if(!objFSO.FolderExists(strDestination)){
var arrFolder= new Enumerator(strDestination.split('\\'));
for (;!arrFolder.atEnd();arrFolder.moveNext()){
objItem = arrFolder.item();
strfi+=objItem+'\\';
if(!objFSO.FolderExists(strfi))
objFSO.CreateFolder(strfi);
}
}
fi=objFSO.GetFolder(objFSO.GetParentFolderName(strSource)).Files
if(fi.Count>0)
objFSO.CopyFile(strSource,strDestination,OverWriteExisting);
}
//生成日志文件 略
//脚本运行入口函数
function start(){
try {
WshShell.run('NET USE \\\\' + RemotePcName + '\\' + RemoteEDIDriver +' '+ RemoteUserPasswd +' /USER:'+ RemoteUserName,0);
WScript.Sleep(1000);
CopyFiles('\\\\' + RemotePcName + '\\' + RemoteEDIDriver + '\\' + RemoteEDIPath + '\\*.tsv', LoaclEDIPath);
MoveFiles('\\\\' + RemotePcName + '\\' + RemoteEDIDriver + '\\' + RemoteEDIPath + '\\*.tsv', '\\\\' + RemotePcName + '\\' + RemoteEDIDriver + '\\' + RemoteBackupPath + '\\' );
WriteLog("同步数据完成!文件数:" + filesNum);
////WScript.Sleep(syncTime);
////start();
}
catch(e){
//WScript.Echo("Nested catch caught " + e+e.Error + ':' +e.description+e.name);
WriteLog("出现问题:" + e + "错误:"+e.Error + '\t名称:' +e.name +'\t说明:'+ e.description);
WshShell.run('NET USE * /del /yes',0);
////WScript.Sleep(syncTime);
////start();
}
}
4.IFS客户订单批量导入开发概要书设计
业务流程图
功能要件:
1)目的:通过指定格式的客户订单tsv读取至临时表,可对导入项目做修正,检查无误后再导入至IFS的客户订单相关表中(主要为订单表和订单行明细表)。其中的默认值需要从相关表中读取。
2)功能要求:
1))以tsv的形式批量导入客户订单;
2))将tsv各项目保存在IFS系统内,可对导入相关项目做修正;
3))可进行订单的重复性检查,当订单重复时禁止登录;
4))导入时发生错误时,禁止订单登录;
a) 当遇到第一条订单明细行出错时,退出导入处理,所有数据都不保存。
b) 当遇到订单明细行出错时,不导入该明细行,但继续处理。
5))出错时显示错误信息,产生错误列表,显示所有的错误消息;
6))导入后的订单的初始状态为“已计划”;
7))将客户的默认订单类型代入被导入订单中;
8))对于一部分与tsv中未提供的字段(如:货币、货运方式、税率编号等),通过取得客户或销售件相关内容自动代入
9))特价信息提供时,不判断特价和销售件主表价格的关系;
10))特价信息未提供时,需要判断特价和销售件主表价格的一致性。不一致时报错,并中断录入;
11))成功导入后的订单自动下达
开发概要完成后,移交NEC进行开发,开发完成后由NEC中国编译链接至IFS系统相关模块中,CKD中国测试验收。
上述1~3步完成以后,订单处理人员可以自动接收到tvs格式的EDI订单,然后通过下述窗口导入IFS系统,系统自动初步判断EDI订单格式、内容是否存在问题,并自动从系统其他表中拉取订单相关其他数据元素,经过处理人员审核无误后按‘批量导入’按钮,即完成订单从接收到下达车间生产订单的全过程。
IFS系统中EDI订单导入处理界面
5.ERP IFS系统KD品订单数据的抽取、EDI转换
此项任务为从IFS系统中,按供应商号抽出KD品订单数据,由用户选择发送范围,生成tsv文件后自动传递到Hulft服务器,再由Hulft定时对外发送。
EDI发送界面
该程序使用vb.net、asp.net工具开发,发布为网页B/S模式,临时数据及tvs生成履历、日志等存入单独的SQLServer数据库中。功能如下:
3)检索IFS系统订单数据,部分代码如下:
Public Function GetSearchData(ByRef sort As String) As Boolean
Dim strsql As String
‘其他变量声明略
strsql = ""
strsql = strsql + " select "
strsql = strsql + " t1.vendor_no, "
‘其他查询字段略
strsql = strsql + " from purchase_order_tab t1 left join mpccom_ship_via_tab t3 on t1.ship_via_code=t3.ship_via_code"
strsql = strsql + " ,purchase_order_line_tab t2,iso_unit_tab t4,inventory_part_tab t5,purchase_order_hist_tab t6"
strsql = strsql + " where(t1.order_no = t2.order_no)"
strsql = strsql + " and t1.order_no=t6.order_no "
‘其他查询字段略
If Me.tbxPOPerson.Text <> "" Then
strsql = strsql + " and t1.recipient_name like '%" & Me.tbxPOPerson.Text & "%'"
End If
‘其他判断条件略
strsql = strsql + " order by t1.order_no"
‘其他判断条件略
‘声明数据表类型变量,实例化对象,取得表数据
Dim dtable As System.Data.DataTable
Dim clsdb As DBHELP.clsdbhelp
clsdb = New DBHELP.clsdbhelp
clsdb.GetDataTable(dtable, strsql)
If dtable.Rows.Count >= 1 Then。。。
‘随后读出、检查、显示数据
4)查询出订单数据后,由操作人员选择要发送EDI的订单条目,按确认后将数据导出为tsv格式,并传送至Hulft服务器指定位置,部分代码如下:
’发送按钮按下后数据抽取
Protected Sub btnSend_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSend.Click
Dim clsini As INI.clsini
‘tsv文件输出地址等常用及可能变化的参数在INI文件中定义,其他变量声明略
clsini = New INI.clsini
Me.tbxlog.Text = ""
‘错误判断略
If Len(Now.Month.ToString) = 1 Then
strmonth = "0" + Now.Month.ToString
Else
strmonth = Now.Month.ToString
End If
If Len(Now.Day.ToString) = 1 Then
strday = "0" + Now.Day.ToString
Else
strday = Now.Day.ToString
End If
‘其他列判断过程略
strfilename = "CHN_Purchase_" + Me.cmbvender.Text.ToString + "_" + Now.Year.ToString + strmonth + strday + strhour + strminute + strsecond + ".tsv"
stroutputpath = strpath + strfilename
End If
‘输出tsv文件
Public Function OutputTSVFile(ByVal vstrFileName As String, ByVal vArray As Object) As Boolean
Dim sw As StreamWriter
‘输出文件流,其他变量声明略
Try
OutputTSVFile = False
sw = New StreamWriter(vstrFileName, False, Encoding.Unicode)
lineCount = vArray.GetUpperBound(0)
colCount = vArray.GetUpperBound(1) - 1
For i = 0 To lineCount
strTempLine = ""
For j = 0 To colCount
'strTempLine = strTempLine & """" & vArray(i, j) & """" & vbTab
If j = colCount Then
strTempLine = strTempLine & vArray(i, j)
Else
strTempLine = strTempLine & vArray(i, j) & vbTab
End If
Next
sw.WriteLine(strTempLine)
Next
sw.Flush()
sw.Close()
OutputTSVFile = True
Catch ex As Exception
Return False
End Try
End Function
至此,步骤1~4完成了以下一个完整的订单处理过程:
外部EDI订单(客户)接收导入IFS系统分解,下达车间订单KD缺料,订货,生成EDI订单EDI订单(向总部订进口部件)外发。
四、系统综述
EDI系统的建立与开发,是企业现有ERP系统的补足与延伸,程序替代大部分手动劳动,极大的提高了工作效率与准确性,通过此项目,我从中受益良多,总结如下:
1.企业IT部门的价值,不仅在于保障企业信息安全、设备稳定运行,在有能力的前提下,应用系统的开发与完善也是一项重要的任务;
2.通过应用系统的开发,我进一步了解了企业生产、工作流程及企业产品,对于系统维护也大有帮助;
3.日常重复程度高的工作,往往存在可改善之处,需要重点加以关注和研究;
4.不断的寻找开发需求,促使我不断学习新的开发技术和工具,也是促进自己进步好办法。
我个人的成长进步离不开企业的培训、培育和帮助,企业和员工是真正的利益共同体、事业共同体和命运共同体。今后我也将在工作实践中继续学习、提高自己,也希望我的想法和项目实施的经验,对同业人员有所参考。
参考文献:
[1]《EDI知识与应用》,牛鱼龙,海天出版社,2005年5月
[2]《SQL Server应用与开发范例宝典》,高春艳 陈威 张磊,人民邮电出版社,2015年2月
[3]《JavaScript入门经典》,高春艳,机械工业出版社,2013年4月
论文作者:倪伟
论文发表刊物:《电力设备》2018年第18期
论文发表时间:2018/10/14
标签:订单论文; 系统论文; 数据论文; 文件论文; 客户论文; 世界各地论文; 目录论文; 《电力设备》2018年第18期论文;