K3 BOS开发百问百答

客户化开发技术资料——K/3 BOS开发百问百答

Set oDataSrv = Nothing Set objLookup = Nothing

Exit Function err_ctr:

Set oDataSrv = Nothing Set objLookup = Nothing End Function

【问题20】K/3 BOS SDK 二次开发组件(k3Billtransfer组件)嵌入K/3系统,数据库端按装后(update ictransactiontype... 后),再在..../system32/ls_DV.dll,并注册,最后进入K/3,没有效果!是不是K3 V10.2不支持二次组件开发???还是不支持K/3 BOS SDK中的K3billtransfer组件? 【解答】

为了支持多二次开发的结构,单据二次开发记录现在在t_ThirdPartyComponent表里维护。 FTypeID,INT,4,用于区分事件类型(0、表示单据,1、表示序时簿,2、表示其它通用业务); FTypeDetailID,INT,4,对应单据、序时簿上的具体ID,在单据上使用时,该事件ID对应单据的TranType,在序时簿上使用时,对应序时簿的FID,对于FTypeID=2的类型,FTypeDetailID表示只有中间层的二次开发类型,比如审核;

FIndex,INT,4,对于一个FTypeDetailID,可以有多个二次开发操作,中间用FIndex来决定执行顺序,(标记为负数的会在ictransactiontype中记录的二次开发之前执行,ictransactiontype中的FIndex默认为0),非空; FComponentName,VARCHAR,200,二次开发组件名称(ComName.clsName); FCompenentSrv,VARCHAR,200,中间层二次开发组件; FDescription,NVARCHAR,255,二次开发组件说明;

【问题21】如何在单据插件代码中通过条件判断来启动多级审核. 【解答】

在保存后事件(AfterSave)中添加下列代码: ‘条件判断

If m_BillInterface.MultiCheckMgr.MultiCheckBill(m_BillInterface.BillCtl.CurBillID) Then m_BillInterface.RefreshBill End If

【问题22】在插件开发中,如何获得当前登陆的用户ID?比如administrator登陆,如何得到ID?另外,如何得到选中多行单据时的集合?一个表体中,有职员编码和职员名称,想通过输入编码后,直接关联出名称来。名称这个字段用职员类型,还是文本?值更新事件好象不管用。 【解答】

获得当前登陆的用户ID:K3Lib.User.UserID。

选中多行的函数GetSelectedBillInfo(),此函数返回一个KFO.Vector数据包,Vector的Size和选中的行数一致。每行包含一个KFO.Dictionary数据包,此数据包包含FClassTypeID,FID,FEntryID。

第13页

客户化开发技术资料——K/3 BOS开发百问百答

FClassTypeID表示单据类型;FID表示当前行所属单据的内码;FEntryID表示单据分录ID。

示例

获取选中的第一行所属单据的分录ID: Dim I As Long

Dim dct as KFO.Dictionary Dim vct As KFO.Vector

Set vct = m_ListInterface.GetSelectedBillInfo Set dct = vct(1) I = dct(\

职员名称用\基础资料属性\不要用文本。

【问题23】在销售系统中增加了一张BOS开发的单据. 单据上也指定了相应的插件.(插件是依据BOS 开发向导生成的. 插件的功能只是增加一个自定的菜单项).组件中也引用了: K3ClassEvents.dll,但在单据测试时,却总是提示错误: \单据接口无效\的错误. 请问BOS新开发的单据是不是不能调用自定义的插件? 如果有调用是不是要做其它处理? 【解答】

插件调试时要编译或运行起来。BOS单据可以调用插件,也可以在插件中调用其他组件。请把你的Project Properties->Project Name改为和组件名一致。

【问题24】Bos 开发的单据还能不能调用 k3billtransfer.dll 这个组件? BOS插件中如何取得连接字符串? (以前 m_Billtransfer.Cnnstring ) 我想把连接字符串做为参数传递给其它语言开发的程序. 【解答】

BOS 开发的单据不能调用 k3billtransfer.dll,只有在工业单据里能调用。目前BOS插件不能获取连接字符串。

【问题25】需要通过工具栏上的按钮,实现单据体分录的上移和下移功能,请问BOS插件的如何实现? 【解答】

可通过m_BillInterface_MenuBarInitialize事件实现“上移”、“下移”按钮的添加,通过在m_BillInterface_MenuBarClick事件中重写单据体和数据包,实现该功能。

【问题26】新增BOS 单据分录中有数量 及基本单位数量 字段, 基本单位数量关联字段为数量, 但输入完数量后,基本单位数量仍然为空. 【解答】

保存后基本单位数量就有了。

第14页

客户化开发技术资料——K/3 BOS开发百问百答

【问题27】我在做k3BillTransfer开发时需要取表体中的“批次”列是否可以录入,即该物料是否批次管理,请问控件fpSpread中,怎么才能知道哪一个单元格可以录入或不能录入?或者可以取到该物料的内码也可以。EnteryCtl都有那些属性啊,我只知道一个fieldname,其他的比如内码等是什么?在单据二次开发参考组件没有描述,在哪有详细的说明?

【解答】

1、获取分录某一分录物料的内码你可以通过EndGridLookUp(BeforGridLookUp)在分录执行查找功能

后(前)激化这个事件,你就可以获取当前行、列、当前查询的资料类型(例如返回4说明是物料)。EnteryCtl对应分录各列,记录每个分录列个属性的数组,在数组属性里面会有物料内码的属性!

2、当TEntryCtl(Col).LookUpCls = 4 为按F7时查询物料 Col为物料在单身对应的列TEntryCtl(Col).DInterID(CurRow)保存的就是物料ID,Col:为物料在单身对应的列,CurRow:分录行号。

【问题28】K/3 BOS单据、序时簿和工业单据、序时簿中分别如何获得当前用户的信息?(比如ID) 【解答】

BOS单据单据和序时簿都能读“当前用户”,方法为:.K3Lib.User.UserID。 工业单据单据目前还不能没有办法实现你的需求,请另想办法。

【问题29】通过工业单据插件怎么获得当前K/3的版本号?工业单据插件是否支持所有账套类型的单据,不区分工业供应链、商业供应链? 【解答】

通过以下代码可以解决: Dim read As Object Dim reg As String Dim result As String

Set read = CreateObject(\

reg = \result = read.RegRead(reg) MsgBox result Set read = Nothing

在ictransactiontype表中管理的单据,都可以应用工业单据插件

【问题30】在工业单据的插件中如何得到单据的FInterID? (工业单据) 【解答】

BillID = m_BillTransfer.SaveVect.Item(1).Value(\

【问题31】在BOSV10.2中,填充新行数据可以用m_BillInterface.InsertNewRowAndFill方法实现,但是在BOSV10.1中不知道用什么方法可以向单据体逐行插入数据?如果单据体中有物料、计量单位等查找类型字段,其赋值是否一样? 【解答】

将10.1的KFO.DLL换成10.2 KFO.DLL,是兼容的

第15页

客户化开发技术资料——K/3 BOS开发百问百答

m_BillInterface.Data(\

【问题32】请问10.2的工业老单(非BOS),作k3BillTransfer插件的时候,是否可以在BeforHeadLookUp事件中指定基础资料的过滤条件,如:m_BillTransfer.HeadCtl(CtlIndex).Filter = \。我发现这段代码所指定的过滤条件不起作用。 【解答】

参考以下代码:

Private Sub m_BillTransfer_BeforHeadLookUp(ByVal CtlIndex As Long, ByVal nLookUpClsID As Long, Cancel As Boolean) If nLookUpClsID = 5 Then Dim tHeadCtl As Variant

tHeadCtl = m_BillTransfer.HeadCtl

tHeadCtl(CtlIndex).Filter = tHeadCtl(CtlIndex).Filter & \'m_BillTransfer.HeadCtl(CtlIndex).Filter = \m_BillTransfer.HeadCtl = tHeadCtl End If End Sub

第16页

联系客服:779662525#qq.com(#替换为@)