⾦蝶K3wise插件⼆次开发与配置开发环境:K/3 Wise 13.0、K/3 Bos开发平台、Visual Basic 6.0
⽬录
⼀、⼆次开发插件编程
⼆、代码演⽰
三、配置插件
四、测试插件
五、插件事件附录
⼀、⼆次开发插件编程
  打开Visual Basic 6.0,新建⼯程ActiveX DLL:
  命名为FirstPlugin.class:
  引⽤类库如下:
  已安装K/3 Wise,在VB 6.0菜单栏上会多出⼀个⾦蝶开发插件:
  打开⾦蝶开发向导,创建⼯业单据客户端插件(⼯业单据俗称“⽼单”):
  点击“确定”,选择类“FirstPlugin”:
  点击“下⼀步”,这⾥我们⾃定义⼀个菜单项“插件⼯具”:
  点击“下⼀步”,选择事件“UserMenuClick”:
  完成向导。
⼆、代码演⽰
  代码编写如下:
'配置路径:供应链-外购⼊库单
'函数功能:插件⼯具--根据“长、宽、厚”⾃动计算批号
'定义插件对象接⼝. 必须具有的声明, 以此来获得事件
Private WithEvents m_BillTransfer  As K3BillTransfer.Bill
Dim F55 As Long, F55Text As String  '长
Dim F56 As Long, F56Text As String  '宽
Dim F57 As Long, F57Text As String  '⾼
Dim FDate As Long, FDateText As String  '⽇期
Dim FBatchNo As String  '批号
Dim FItemID As Long, FNumber As String  '物料编码
Dim FBatchManager As Boolean  '是否采⽤业务批号管理
Dim str As String
Public Sub Show(ByVal oBillTransfer As Object)
'接⼝实现
'注意: 此⽅法必须存在, 请勿修改
Set m_BillTransfer = oBillTransfer
End Sub
Private Sub Class_Terminate()
'释放接⼝对象
'注意: 此⽅法必须存在, 请勿修改
Set m_BillTransfer = Nothing
End Sub
Private Sub m_BillTransfer_BillInitialize()
'*************** 开始设置菜单 ***************
m_BillTransfer.AddUserMenuItem "⾃动批号", "插件⼯具"
'*************** 结束设置菜单 ***************
'TODO: 请在此处添加代码响应事件 BillInitialize
F55 = GetCtlIndexByFld("FEntrySelfA0155", True)
F56 = GetCtlIndexByFld("FEntrySelfA0156", True)
F57 = GetCtlIndexByFld("FEntrySelfA0157", True)
FBatchNo = GetCtlIndexByFld("FBatchNo", True)
FDate = GetCtlIndexByFld("FDate", False)
FItemID = GetCtlIndexByFld("FItemID", True)
End Sub
Private Sub m_BillTransfer_UserMenuClick(ByVal Index As Long, ByVal Caption As String)
'TODO: 请在此处添加代码响应事件 UserMenuClick
Select Case Caption
Case "⾃动批号"
'此处添加处理批号⽣成菜单对象的 Click 事件
With m_BillTransfer
For i = 1 To 1000
If .GetGridText(i, FItemID) = "" Then
Exit For
End If
'从物料表检测是否采⽤业务批次管理
Dim strSQL As String '⽤于执⾏SQL
Dim rs As ADODB.Recordset
FNumber = ""
FNumber = .GetGridText(i, FItemID)
strSQL = ""
strSQL = "SELECT FBatchManager FROM t_ICItem WHERE FNumber='" & FNumber & "'"
Set rs = SQLHelper.ExecuteSQL(strSQL, "")
If rs.EOF = False Then
FBatchManager = rs.Fields("FBatchManager")
End If
Set rs = Nothing
F55Text = .GetGridText(i, F55)
F56Text = .GetGridText(i, F56)
F57Text = .GetGridText(i, F57)
If F55Text = "" Then F55Text = "0"
If F56Text = "" Then F56Text = "0"
If F57Text = "" Then F57Text = "0"
FDateText = Replace(.GetHeadText(FDate), "-", "")
If (FBatchManager = True) Then
.SetGridText i, FBatchNo, F55Text & "-" & F56Text & "-" & F57Text & "-" & FDateText
End If
Next
End With
Case Else
End Select
End Sub
'*****************************************
'获取分录⾏数
'*****************************************
Public Function GetEntryMax() As Long
Dim k As Long
Dim iFItemID As Long
Dim oEntryCtl As Variant
Dim maxrow As Long '最⼤⾏'
For k = LBound(m_BillTransfer.EntryCtl) To UBound(m_BillTransfer.EntryCtl)
If UCase(m_BillTransfer.EntryCtl(k).FieldName) = UCase("FItemID") Then '物料代码所在列
iFItemID = k
Exit For
End If
Next k
oEntryCtl = m_BillTransfer.EntryCtl
maxrow = UBound(oEntryCtl(iFItemID).DInterID) '获取表体最⼤⾏
GetEntryMax = maxrow
End Function
'**********************************
'返回单据字段顺序(isEntry True是表体)
'**********************************
Public Function GetCtlIndexByFld(ByVal fldName As String, Optional ByVal isEntry As Boolean = False) As Long
Dim ctlIdx As Long
Dim i As Integer
Dim isFind As Boolean
Dim vValue As Variant
fldName = UCase(fldName)
isFind = False
With m_BillTransfer
If isEntry Then
For i = LBound(.EntryCtl) To UBound(.EntryCtl)
If UCase(.EntryCtl(i).FieldName) = fldName Then
ctlIdx = .EntryCtl(i).FCtlOrder
isFind = True
Exit For
End If
Next i
Else
For i = LBound(.HeadCtl) To UBound(.HeadCtl)
If UCase(.HeadCtl(i).FieldName) = fldName Then
ctlIdx = .HeadCtl(i).FCtlIndex
isFind = True
Exit For
End If
Next i
End If
End With
If isFind = True Then
GetCtlIndexByFld = ctlIdx
Else
GetCtlIndexByFld = 0
End If
End Function
三、配置插件
  在Visual Basic 6.0⽣成DLL:
  启动K/3 Wise BOS开发平台,打开外购⼊库单,并进⾏插件配置:
  点击“插件配置管理”,配置客户端插件:
  点击“浏览”,到插件并勾选:
  点击“确定”,并保存外购⼊库单。
四、测试插件
  启动K/3 Wise,打开“供应链-仓存管理-外购⼊库单-新增”:
      ⾄此,插件开发和配置完成!
五、插件配置后未⽣效
1.在插件配置管理提⽰“没有到⽂件,或⽂件没有正确注册”
解决⽅法:插件dll名称命名要和⼯程名称⼀致。
⽐如⼯程名称“aaaa”,其中有⼀个类“bbb”,dll命名为“aaa”,
配置插件后,显⽰完整名称“aaa.bbb”,提⽰aaaa“没有到⽂件,或⽂件没有正确注册”。
修改dll名称“aaa”为“aaaa”,重新配置插件,即可修复问题。
附SqlHelper源码:
Attribute VB_Name = "SQLHelper"
'Public Function Conn() As ADODB.Connection
'    Set Conn = New ADODB.Connection
'    Conn.Open = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=AIS20140411200431;Data Source=."
'End Function
Public Function ConnectString() As String
splitwise
'ConnectString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=AIS20140411200431;Data Source=."
ConnectString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;password=Ab123456;Initial Catalog=AIS20140508100349;Data Source=KDSERVER" End Function
'传递参数SQL传递查询语句,MsgString传递查询信息。⾃⾝以⼀个数据集对象的形式返回
Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
Dim Cnn As ADODB.Connection '定义连接
Dim Rst As ADODB.Recordset
Dim sTokens() As String '定义字符串
On Error GoTo ExecuteSQL_Error '异常处理
sTokens = Split(SQL) '⽤Split函数产⽣⼀个包含各个⼦串的数组
Set Cnn = New ADODB.Connection '创建连接
Cnn.Open ConnectString
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then '判断字符串中是否含有指定内容
Cnn.Execute SQL '执⾏查询语句
MsgString = sTokens(0) & "query successful" '返回查询信息
Else
Set Rst = New ADODB.Recordset '闯将数据集对象
Rst.Open Trim$(SQL), Cnn, adOpenKeyset, adLockOptimistic '返回查询结果
Set ExecuteSQL = Rst '返回记录集对象
MsgString = "查询到" & Rst.RecordCount & " 条记录"
End If
ExecuteSQL_Exit:
Set Rst = Nothing '清空数据集对象
Set Cnn = Nothing '中断连接
Exit Function
ExecuteSQL_Error: '判断错误类型
MsgString = "查询错误:" & Err.Description
MsgBox MsgString
Resume ExecuteSQL_Exit
End Function

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。