K3 BOS开发百问百答

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

ERow-合计结束行,可选参数,默认值是最大行

举例(要求税额合计值): Set

参考(表体行数的取值方法): BillEntry.MaxRows

dct

=

m_BillInterface.GetFieldInfoByKey(\

\

0)

dblTaxSum

=

m_BillInterface.Sum(dct)

【问题12】隐藏选单时序时簿不要的菜单和工具栏。K/3单据查看和选单使用的是同一个序时簿,在插件中用MenuBarInitialize添加的菜单和工具栏在选单时也显示出来。

【解答】

在MenuBarInitialize事件中使用m_ListInterface.List.ShowMode判断(查看和选单)1—查看;2—选单。如:If m_ListInterface.List.ShowMode = 1 Then ??end. 如需隐藏其他的菜单和工具栏,参考以下代码: Dim oTool As K3ClassEvents.BOSTool Dim oBand As K3ClassEvents.BOSBand

'*************** 开始设置 BOS 原有菜单 ***************

'获得 mnuEdit 菜单对象,并设置属性 Set oBand = oMenuBar.BOSBands(\ Set oTool = oBand.BOSTools(\ With oTool

.Visible = False .Enabled = False End With

【问题13】标体行高设置和值更新事件

1. 表单的表体的行高的属性在哪里,我找不到,如果发布后到主控台里去调,表体的标

题行会同比例变化,非常不美观。 2. 在值更新事件里怎么能调用sql呢?

3. 对于已携带辅助属性的字段再定义值更新事件,如果值更新事件里包含该辅助属性,

计算公司无效。也就是值更新事件公式里调用的辅助属性是更新前的。 4. 事件函数描述中,tkeyword参数应该是fkeyword的笔误,能否改正。

【解答】

1. 2. 3. 4.

标体的行高目前不能调整。

插件中调用SQL的方法有:m_BillInterface.K3Lib.GetData 和 m_BillInterface.K3Lib.UpdateData。 在插件中使用更新后事件。 谢谢提醒,在下一版本中改之。

第9页

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

【问题14】事务处理

1. BOS的插件开发中,事务怎样处理啊?又不能直接操作数据库。有什么好方法吗?否则

数据可能就乱掉了。

2. 在事务完整性处理上,目前的BOS插件还有很多需要改进。

说个简单例子:

BOS是支持多插件的,那么多插件之间如何保证事务完整性呢?

同样是审核事件,有2个插件响应了这个事件,如果第一个插件通过了审核,但是第二

个插件却不能通过,那么第一个插件处理了的数据又如何回滚?

【解答】 1. 2.

如在插件中编写大量的更新SQL请使用中间层插件,中间层插件能保证事务的完整性。

如果在客户端希望执行SQL时保证事务一致性,建议使用 K3Lib.UpdateData 方法,将希望在同一事物中处理的SQL语句通过它一次性提交,BOS会自动启用事务处理来保证;如果像多个插件中的审核等操作的一致性问题,解决的方法是制定一个中间层的审核前插肩来判断处理;这类的问题都可以在中间层的相关事件中处理,来保证一致性。

【问题15】如何在新的BOS单据中通过代码逐行添加分录数据?

在BOS单据中新增菜单,功能为向当前新单据(单据为BOS创建)中添加物料等数据,因需加入的数据来自多张表,所以不适用于BOS的单据流程下推功能生成,而采用插件的方式实现。但在用

SetFieldValue 方法向分录中添加数据时发现第一行总是顺利通过,但写下一行(即第二行)时就写不下去了,错误提示:

Err.Description : 没有找到给定字段名的字段的值 Err.Number : -2147221403

Err.Source : K3ClassEvents.BillEvent 请问是什么原因? 附部分代码: With rsItem lngRow = 1 .MoveFirst Do Until .EOF

m_BillInterface.SetFieldValue \ m_BillInterface.SetFieldValue \ lngRow = lngRow + 1 .MoveNext Loop End With

【解答】

参考下列代码 With rsItem lngRow = 1 MoveFirst

第10页

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

m_BillInterface.InsertNewRowAndFill 2,lngRow,\!FNumber,\lngRow lngRow = lngRow + 1 MoveNext Loop End With

【问题16】在单据体中有没有办法让下一条分录自动携带上一条分录的数据(只是部分字段)。 【解答】

用插件可以实现。示例代码:

'物料录入后,第二行的值自动默认第一行的值 If dct(\

m_BillInterface.SetFieldValue \row - 1, Enu_ValueType_FFND), row '提货地点

endif

【问题17】否有办法完成单据体中的行点击事件?现在有需要在点击BOS单据中单据体的某一行时,在另一个表体中显示与该行有关的信息,请问各位有什么好的实现方法,特别是怎么获取点击事件和所点击的行数据信息。

【解答】

【问题18】多分录序时簿浏览,字段权限。

1. 2.

在多表体单据中,用序事簿预览时,不出现第二个表体的内容.怎么实现查询第二个表体的内容. 在使用单据的序事簿查询时,想看单据的全部内容,但在选单时想看一少部分内容,现在不能实现. 可用字段授权对不同的人进行授权解决(给选单人字段权限少一些字段)

【解答】

1. 2.

目前序时薄只能实现单据头+一个单据体的预览方式,但单据体在过滤界面是可选择的。如果问题的要求是实现多单据体的同时展现,则为需求,目前暂不能实现,待后续版本规划。

此问题要求选单与单据序时薄有不同的展现设置,字段授权的方式解决不了这个问题,请确定这个需求的通用性。如不通用建议通过序时薄插件开发来实现。FillRow时,不可见字段内容作屏蔽。

【问题19】怎么样可以用代码调出单据的序时薄窗口。

【解答】

调用序时簿不返回选中值 'lClassTypeID ——BOS单据ID

Private Function ShowList(ByVal lClassTypeID As Long) As Boolean

第11页

客户化开发技术资料——K/3 BOS开发百问百答 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 'oDataSrv.ClassTypeID Set objLookup.DataSrv = oDataSrv

objLookup.Show End If

Set oDataSrv = Nothing Set objLookup = Nothing

Exit Function err_ctr:

Set oDataSrv = Nothing Set objLookup = Nothing End Function

调用序时簿返回选中值

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

第12页

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