K3 wise 表单插件开发

  目前,我也是刚学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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值