客户化开发技术资料——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页