您的位置:首页 > 其它

K3 BOS 表单插件开发 - 表头值改变事件

2017-03-01 15:16 211 查看
在 创建表单插件中,每个类中都有如下代码:

[vb] view
plain copy

   

'定义 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事件来触发,例如:

[vb] view
plain copy

Private Sub m_BillInterface_Change(ByVal <u>dct</u> As KFO.IDictionary, ByVal dctFld As KFO.IDictionary, ByVal Col As Long, ByVal Row As Long, Cancel As Boolean)  

 

2.获得数据字典后,如何知道是表单值改变还是表体值改变?

[vb] view
plain copy

Select Case dct.Value("Fpage")  

    Case 1  

    .......  

End Select  

    其中Case 1 代表的是表头,2代表的是表体(目前这里只是我的猜测的,不权威,我也不知道从哪里照这方面的资料,如果有朋友知道的话也告诉我下)。

 

3.表单值更改出发后,如何确定是哪个字段值更改触发的?

[html] view
plain copy

If UCase(dct.Value("FFieldName")) = UCase("FBase") Then  

  .....  

End If  

   dct.Value("FFieldName") 可以获取表单上控件的关键字段,至于从哪里知道的,我也是瞎猜的,目前还不知道为啥是这样。但是这样可行。

UCase : 是将字符串传换成大写。(至于VB我还是初学者,所以这些基本的知识点开始还是写写。)

4.如何在控制台中打印输出的信息,有利于调试或其他?

[vb] view
plain copy

Debug.Print "输入你要输出的数据......"  

 

5 表单插件开发中,如何通过SQL语句获取数据?

[vb] view
plain copy

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.如何清空表体中的数据?

[vb] view
plain copy

For i = 1 To m_BillInterface.Data("Page2").UBound Step 1  

    m_BillInterface.RemoveRow False, 2, 1  

Next  

 

7.如何给表体赋值,或遍历数据集插入表体中?

[vb] view
plain copy

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. 以上例子的关键代码:

[vb] view
plain copy

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 如何调用存储过程?

[sql] view
plain copy

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中调用如下:

[sql] view
plain copy

strSQL = "exec Proc_K3_ProductionOrdersByCustomer " & strCustomer  

  

Set rs = m_BillInterface.K3Lib.GetData(strSQL)  

      个人理解,m_BillInterface.K3Lib.GetData()传入的语句,只要查询分析器下可执行的语句,在GetData语句中都可以执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: