目前,我也是刚学K3 BOS 插件开发,在这里记录下学习的心得及相关知识点,算是总结、积累吧,为以后有用!
在 创建表单插件中,每个类中都有如下代码:
'定义 BillEvent 接口. 必须具有的声明, 以此来获得事件
Private WithEvents m_BillInterface As BillEvent
Public Sub Show(ByVal oBillInterface As Object)
'BillEvent 接口实现
'注意: 此方法必须存在, 请勿修改
Set m_BillInterface = oBillInterface
End Sub
Private Sub Class_Terminate()
'释放接口对象
'注意: 此方法必须存在, 请勿修改
Set m_BillInterface = Nothing
End Sub
在这里我主要写下当表单头中的某一个字段值发生变化后,出发的一个事件。
说道这里,有几个问题需要思考:
1.表单的值更改事件如何触发?
可以通过BillEvent对象的Change事件来触发,例如:
Private Sub m_BillInterface_Change(ByVal dct As KFO.IDictionary, ByVal dctFld As KFO.IDictionary, ByVal Col As Long, ByVal Row As Long, Cancel As Boolean)
2.获得数据字典后,如何知道是表单值改变还是表体值改变?
Select Case dct.Value("Fpage")
Case 1
.......
End Select
其中Case 1 代表的是表头,2代表的是表体(目前这里只是我的猜测的,不权威,我也不知道从哪里照这方面的资料,如果有朋友知道的话也告诉我下)。
3.表单值更改出发后,如何确定是哪个字段值更改触发的?
If UCase(dct.Value("FFieldName")) = UCase("FBase") Then
.....
End If
dct.Value("FFieldName") 可以获取表单上控件的关键字段,至于从哪里知道的,我也是瞎猜的,目前还不知道为啥是这样。但是这样可行。
UCase : 是将字符串传换成大写。(至于VB我还是初学者,所以这些基本的知识点开始还是写写。)
4.如何在控制台中打印输出的信息,有利于调试或其他?
Debug.Print "输入你要输出的数据......"
5 表单插件开发中,如何通过SQL语句获取数据?
strSQL = "Select item.FNumber FNumber,item.FName FName,Scph,mu1.FNumber DhslUnit,Dhsl,mu2.FNumber ScslUnit,Scsl,YwgCount,isnull(JhDate,'') JhDate,Remark,FComboBox " & _
"From t_BOS200000035 bos " & _
"Join t_BOS200000035Entry2 bosEntry " & _
"On bos.FID = bosEntry.FID " & _
"Join t_Icitem item " & _
"On bosEntry.Hpdh = item.FItemID " & _
"Join t_MeasureUnit mu1 " & _
"On mu1.FMeasureUnitID = bosEntry.DhslUnit " & _
"Join t_MeasureUnit mu2 " & _
"On mu2.FMeasureUnitID = bosEntry.ScslUnit " & _
"Where bos.FBase = " & strCustomer
Debug.Print strSQL
Set rs = m_BillInterface.K3Lib.GetData(strSQL)
使用K3Lib.GetData("sql语句")就可以获取查询出来后的结果集。
6.如何清空表体中的数据?
For i = 1 To m_BillInterface.Data("Page2").UBound Step 1
m_BillInterface.RemoveRow False, 2, 1
Next
7.如何给表体赋值,或遍历数据集插入表体中?
j = 1
Do While Not rs.EOF
m_BillInterface.InsertNewRowAndFill 2, j, _
"FBase1", rs.Fields("FNumber").Value, _
"FText1", rs.Fields("Scph").Value, _
"FBase2", rs.Fields("DhslUnit").Value, _
"FQty", rs.Fields("Dhsl").Value, _
"FBase3", rs.Fields("ScslUnit").Value, _
"FQty1", rs.Fields("Scsl").Value, _
"FInteger", rs.Fields("YwgCount").Value, _
"FNOTE", rs.Fields("Remark").Value, _
"FDate2", rs.Fields("JhDate").Value, _
"FComboBox", rs.Fields("FComboBox").Value
rs.MoveNext
j = j + 1
Loop
InsertNewRowAndFill 函数
在多分录单据体中插入一个新行,并填充数据。
语法
Object.InsertNewRowAndFill (nPage As Long, nRow As Long, ParamArray vFieldsData() As Variant)
注释
1. 参数 nRow 必须是有效的行号。
即:必须大于等于 1,小于单据体分录的最大行;必须和已有数据的行连续。
例如要在单据体分录第 3 行新增行并插入数据,首先要确认单据体分录的最大行大于3,其次单
据体分录的第2 行要有数据。
2. 可变参数 vFieldsData 格式为:
[字段1 关键名称, 字段1 的值], [字段2 键名称, 字段2 的值], […], [字段n 关键名称, 字段n 的值]
字段关键名称可以从如下找得到,这是我目前认为的方法:
可以属性窗口中的下拉列表中找到。
8. 以上例子的关键代码:
Private Sub m_BillInterface_Change(ByVal dct As KFO.IDictionary, ByVal dctFld As KFO.IDictionary, ByVal Col As Long, ByVal Row As Long, Cancel As Boolean)
Dim strSQL As String, i As Integer, j As Integer
Dim rs As ADODB.Recordset
Dim Fnumber As String
Dim strCustomer As String
Select Case dct.Value("Fpage")
Case 1
If UCase(dct.Value("FFieldName")) = UCase("FBase") Then
strCustomer = m_BillInterface.GetFieldValue("FBase", -1, Enu_ValueType_FFLD)
strSQL = "Select item.FNumber FNumber,item.FName FName,Scph,mu1.FNumber DhslUnit,Dhsl,mu2.FNumber ScslUnit,Scsl,YwgCount,isnull(JhDate,'') JhDate,Remark,FComboBox " & _
"From t_BOS200000035 bos " & _
"Join t_BOS200000035Entry2 bosEntry " & _
"On bos.FID = bosEntry.FID " & _
"Join t_Icitem item " & _
"On bosEntry.Hpdh = item.FItemID " & _
"Join t_MeasureUnit mu1 " & _
"On mu1.FMeasureUnitID = bosEntry.DhslUnit " & _
"Join t_MeasureUnit mu2 " & _
"On mu2.FMeasureUnitID = bosEntry.ScslUnit " & _
"Where bos.FBase = " & strCustomer
Debug.Print strSQL
Set rs = m_BillInterface.K3Lib.GetData(strSQL)
For i = 1 To m_BillInterface.Data("Page2").UBound Step 1
m_BillInterface.RemoveRow False, 2, 1
Next
j = 1
Do While Not rs.EOF
m_BillInterface.InsertNewRowAndFill 2, j, _
"FBase1", rs.Fields("FNumber").Value, _
"FText1", rs.Fields("Scph").Value, _
"FBase2", rs.Fields("DhslUnit").Value, _
"FQty", rs.Fields("Dhsl").Value, _
"FBase3", rs.Fields("ScslUnit").Value, _
"FQty1", rs.Fields("Scsl").Value, _
"FInteger", rs.Fields("YwgCount").Value, _
"FNOTE", rs.Fields("Remark").Value, _
"FDate2", rs.Fields("JhDate").Value, _
"FComboBox", rs.Fields("FComboBox").Value
rs.MoveNext
j = j + 1
Loop
End If
End Select
End Sub
9.K3 BOS 如何调用存储过程?
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Proc_K3_ProductionOrdersByCustomer]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[Proc_K3_ProductionOrdersByCustomer]
GO
------------------------------------
--用途:查询记录信息
--项目名称:K3
--说明:
--时间:2012-1-30 15:30:59
------------------------------------
CREATE PROCEDURE Proc_K3_ProductionOrdersByCustomer
@strCustomer int
AS
Select item.FNumber FNumber,item.FName FName,Scph,mu1.FNumber DhslUnit,Dhsl,mu2.FNumber ScslUnit,Scsl,YwgCount,isnull(JhDate,'') JhDate,Remark,FComboBox
From t_BOS200000035 bos
Join t_BOS200000035Entry2 bosEntry
On bos.FID = bosEntry.FID
Join t_Icitem item
On bosEntry.Hpdh = item.FItemID
Join t_MeasureUnit mu1
On mu1.FMeasureUnitID = bosEntry.DhslUnit
Join t_MeasureUnit mu2
On mu2.FMeasureUnitID = bosEntry.ScslUnit
Where bos.FBase = @strCustomer
GO
exec Proc_K3_ProductionOrdersByCustomer 878
在Bos中调用如下:
strSQL = "exec Proc_K3_ProductionOrdersByCustomer " & strCustomer
Set rs = m_BillInterface.K3Lib.GetData(strSQL)
个人理解,m_BillInterface.K3Lib.GetData()传入的语句,只要查询分析器下可执行的语句,在GetData语句中都可以执行。
————————————————
版权声明:本文为CSDN博主「sz_bdqn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sz_bdqn/article/details/7219469