关于一些插件开发的参考代码 下载本文

K/3 BOS开发百问百答 应用集成部 客户化管理部 2005年12月 目录

一,插件开发篇

【问题1】在插件中以新增,修改和查看方式打开另一单据 【解答】

使用代码调用序时簿

'******************************************** '功能:显示BOS单据,显示的方式为新增,修改和浏览 '参数:lClassTypeID—显示BOS单据的ID

'******************************************** Private Sub ShowBill(ByVal lClassTypeID As Long)

Dim oDataSrv As Object Dim oBill As Object

On Error GoTo err_ctr

Set oDataSrv = m_BillInterface.K3Lib.CreateK3Object(\oDataSrv.ClassTypeID = lClassTypeID

Set oBill = CreateObject(\With oBill

.DataSrv = oDataSrv .ISNetControl = True .ISCheckRight = True .Show

'********************** 'Show 参数类型

'第一个参数 Optional ByVal lID As Long = 0 ;描述修改或查看的单据ID

'第二个参数 Optional ByVal bShowGroup As Boolean = False ;如是基础资料时,是否显示分组 '第三个参数 Optional ByVal BillStatus As Long = Enu_BillStatus_New ;显示方式 0—查看;1—新增;2—修改

'第四个参数 Optional ByVal dctData As KFO.Dictionary '单据初始值 '********************** End With

Set oDataSrv = Nothing Set oBill = Nothing

Exit Sub err_ctr:

Set oDataSrv = Nothing Set oBill = Nothing End Sub

【问题2】我想在投料变更单的菜单上加入一个菜单项,需要插入一个插件,但投料变更单上已经有一个插件了,我想了解一下怎样才可以再插入一个插件呢 【解答】

点插件管理中的按钮,可以通过浏览来选择自定义插件,并选择多个插件对象,BOS允许多个插件同时存在.

【问题3】如何通过插件代码动态设置基础资料或业务单据序时薄过滤条件 【解答】 业务场景:

在开发BOS单据时,经常需要根据前面录入的字段值来过滤选择

的基础资料.例如录入客户后,在选择客户对应客户地址基础资料时,在基础资料F7查询界面只显示当前单据上客户对应地址.根据当前物料,在选择物料对应批次. 我们下面就以批次为例说明实现方法:

需求:在选择批次前要求必须录入物料,批次查询界面只显示物料对应的批次 开发步骤:

假设:物料对应FKey=\批次对应FKey=\单据类型 200000001

只需更新对应元数据即可实现: update ICClassTableinfo set FFilter='(FItemID=GetFldValue(FItemID,1))' where FKey=\如果不要求先录入物料 update ICClassTableinfo set FFilter='(FItemID=GetFldValue(FItemID,0))' where FKey=\再举个例子

根据工艺路线过滤工序名称

假设:工艺路线FKey=\工序名称FKey=\单据类型 200000001

update ICClassTableinfo set FFilter='FInterID In (Select FOperID from t_routingoper where FinterID=GetFldValue(FNewRoutingID,1))' where FKey='FOperID' and FClassTypeID=200000001

其中GetFldValue为BOS内部函数,取单据上指定字段值,

第一个参数为字段对应FKey,第二个参数为是否要求该字段先录入,1 要求 0 不要求 此方法虽能实现,但不是最好方法.希望能在插件接口中提供在函数. 【问题4】在插件中调用序时簿并返回选中的数据 【回答】

请参考下面代码

'******************************************** '功能:显示BOS序时簿并返回选中的值 '参数:lClassTypeID—显示BOS单据的ID

'********************************************

Private Function ShowListByReturn(ByVal lClassTypeID As Long) As Object

Dim oDataSrv As Object Dim objLookup As Object

On Error GoTo err_ctr

Set oDataSrv = m_BillInterface.K3Lib.CreateK3Object(\oDataSrv.ClassTypeID = lClassTypeID If oDataSrv.showfilter Then

Set objLookup = CreateObject(\objLookup.ClassTypeID = lClassTypeID Set objLookup.DataSrv = oDataSrv

objLookup.Lookup

Set ShowListByReturn = objLookup.VectReturn

End If

Set oDataSrv = Nothing Set objLookup = Nothing

Exit Function err_ctr:

Set oDataSrv = Nothing Set objLookup = Nothing End Function

【问题5】在自定义的BOS单据上,通过插件作生成凭证的功能,但是在调用凭证的组件时,需要一个二次登录后才能使用相应的模块.请问:如何处理隐身的二次登录,或者其他的变通处理. 【解答】

凭证组件的调用是不需要二次登录的,可能你是在VB调试状态下运行,编译后就没事了. 请参考下面代码

Private Sub m_BillInterface_MenuBarClick(ByVal BOSTool As K3ClassEvents.BOSTool, Cancel As Boolean)

Dim glvch As Object '中间层凭证对象

Dim mvch As KFO.Dictionary '待保存凭证头

Dim mvchentry As KFO.Vector '待保存凭证分录集 Dim entry As KFO.Dictionary '待保存凭证分录 Dim mvchdetail As KFO.Vector '核算项目明细集 Dim detail As KFO.Dictionary '核算项目明细 Dim i, iCount As Long Dim vValue As Variant

'TODO: 请在此处添加代码响应事件 MenuBarClick

Select Case BOSTool.ToolName Case \生成凭证\

vValue = m_BillInterface.GetFieldValue(\

If Not (CStr(vValue) = \

MsgBox \当前合同已经生成凭证!\金蝶提示\Exit Sub End If

'此处添加处理 生成凭证 菜单对象的 Click 事件 Set mvch = New KFO.Dictionary mvch(\

mvch(\金华泰项目\

mvch(\Set mvchentry = New KFO.Vector

vValue = m_BillInterface.GetFieldValue(\合同金额

'创建凭证分录

Set entry = New KFO.Dictionary

entry(\entry(\entry(\

entry(\'数量&单价

entry(\entry(\

entry(\'创建核算项目明细

Set mvchdetail = New KFO.Vector Set detail = New KFO.Dictionary detail(\detail(\mvchdetail.Add detail

Set entry(\mvchentry.Add entry

Set mvch(\Set entry = New KFO.Dictionary

entry(\entry(\entry(\

entry(\'数量&单价

entry(\