需求描述:一张发货通知单上可能有多个仓库,用户希望能够根据不同仓库分别自动下推销售出库单。
需求分析:此需求有几个难点,1、要自动分仓库生成销售出库单,即发货通知单上有几个仓库,就要对应生成几张销售出库单,要理清楚发货通知单与销售出库单上各个字段的对应关系,哪些是可以直接传递,哪些是需要进行转换;2、涉及到库存、锁库的更新,由系统的“库存更新参数”控制;3、涉及到对上游单据发货通知单、销售订单的反写及关闭;4、涉及到上下游单据的关联,如果关联建立不起来,就没法上查下查;5、涉及到当前登录用户、计算机IP地址的获得,当前登录用户用来填入自动生成的销售出库单制单人字段和上机日志中操作者字段,计算机IP也是为了在上机日志中记录。
因此,虽然看起来需求很简单,但真正实现起来,是非常复杂的。
所以采用了模块化的方式,每个功能点独立出来,但又互相关联。我们把上述需求分为:
1、生成出库单记录;2、更新库存,更新锁定库存;3、反写上游单据;4、写入上机日志。步骤1、3、4必定执行,步骤2则由库存更新参数控制。

这些步骤的SQL脚本以资源文件的形式内嵌到插件里,使用时只需要用LoadResString函数载入即可。
为了使脚本具有普适性,因此对于可变字段,采用{}括起来,实际运行时,由插件根据运算得到的结果进行替换。
最终效果:

逻辑:
1、发货通知单必须已审核,否则不允许生成出库单,插件会予以提示;
2、发货通知单只能生成一次出库单,不允许多次重复生成,重复操作时,插件会予以提示;
3、生成出库单后,自动反写所有关联单据;根据库存更新参数,自动更新库存信息;
4、通过“出库”功能自动生成销售出库单后,将不能通过系统自带的下推功能重复生成出库单,因此不用担心误操作问题;
5、自动记录上机日志。

由发货通知单自动生成的两张出库单。

上机日志。
附1、工业单据插件中获得当前登录的用户
Private Function GetCurrentUserID() As String
'获取K3系统当前登录的用户内码
Dim c_usr As String
c_usr=GetCurrentUser()
Dim cn As Object
Dim rs As ADODB.Recordset
Dim tSQL As String
Set cn = CreateObject("K3Connection.AppConnection")
tSQL = "select FUserID from t_user where FName='" & c_usr & "'"
Set rs = cn.Execute(tSQL)
GetCurrentUserID = rs.Fields(0).Value
End Function
附2、VB6代码获取本机名称和IP地址(部分代码)
其中涉及到API调用,具体可以通过VB6的API浏览器查阅。
Public Function GetIPAddress() As String
Dim sHostName As String * 256
Dim lpHost As Long
Dim HOST As HOSTENT
Dim dwIPAddr As Long
Dim tmpIPAddr() As Byte
Dim i As Integer
Dim sIPAddr As String
If Not SocketsInitialize() Then
GetIPAddress = ""
Exit Function
End If
If gethostname(sHostName, 256) = SOCKET_ERROR Then
GetIPAddress = ""
' MsgBox "Windows Sockets error " & Str$(WSAGetLastError()) & _
' " has occurred. Unable to successfully get Host Name."
SocketsCleanup
Exit Function
End If
sHostName = Trim$(sHostName)
lpHost = gethostbyname(sHostName)
If lpHost = 0 Then
GetIPAddress = ""
MsgBox "Windows Sockets are not responding. " & _
"Unable to successfully get Host Name."
SocketsCleanup
Exit Function
End If
CopyMemory HOST, lpHost, Len(HOST)
CopyMemory dwIPAddr, HOST.hAddrList, 4
ReDim tmpIPAddr(1 To HOST.hLen)
CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen
For i = 1 To HOST.hLen
sIPAddr = sIPAddr & tmpIPAddr(i) & "."
Next
GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)
SocketsCleanup
End Function
本插件适用于K/3 WISE和RISE全系列版本。
咨询电话:027-84233202
公 司:湖北微信科技有限公司