EDI订单交换系统的建立与开发论文_倪伟

(喜开理(中国)有限公司 总务部IT)

摘要:为高效、准确的在总部、销售公司、世界各地分支机构间交换订单信息,参照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

标签:;  ;  ;  ;  ;  ;  ;  ;  

EDI订单交换系统的建立与开发论文_倪伟
下载Doc文档

猜你喜欢