B1 SDK:防止重复事件向下钻取。

2020-09-16 01:08发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我目前有一个Matrix网格,其钻取如下所示。 文档编号用于销售订单。

因为使用文档条目向下钻取文档,所以我有一种方法,当按下文档编号向下钻取时,它将从文档编号ID中找到文档条目ID并加载销售订单。

这是我面临的问题。 如果我是第一次打开该表单,然后单击doc num,它将加载一次销售订单。 如果我关闭"电子邮件回单"表单并重新打开,请单击"文档编号",它将打开两次销售订单。 表单关闭时,似乎触发了doc num的旧事件。 我为您提供了用于文档输入查找功能的代码示例。

 Private Sub createDocEntryDrillDown(linkedObjectType As Integer)
 Dim oLink as SAPbouiCOM.LinkedButton
 Dim oItem作为SAPbouiCOM.Item
 Dim oStaticText作为SAPbouiCOM.StaticText
 尝试
 oItem = oForm.Items.Item(" LinkedText")
 异常捕获
 oItem = oForm.Items.Add(" LinkedText",SAPbouiCOM.BoFormItemTypes.it_STATIC)

 oItem.Left = -700
 oItem.Width = 148
 oItem.Top = -800
 oItem.Height = 14
 oStaticText = oItem.Specific
 oStaticText.Caption =""

 oItem = oForm.Items.Add(" Lnk1",SAPbouiCOM.BoFormItemTypes.it_LINKED_BUTTON)
 oItem.Left = -700
 oItem.Top = -800
 oItem.LinkTo =" LinkedText"
 oLink = oItem.Specific
 oLink.LinkedObjectType =链接对象类型
 结束尝试
 结束子
 

当单击文档向下钻取时,我将使用以下代码覆盖click事件

如果pVal.EventType = SAPbouiCOM.BoEventTypes.et_MATRIX_LINK_PRESSED并且pVal.ColUID =" DocNum"并且pVal.BeforeAction = True,那么

 BubbleEvent = False
 尝试
 昏暗DocEntry作为整数
 昏暗的SQL作为字符串

 如果(sqlType =" SQL")然后
 sql ="从ORDR WHERE中选择DocEntry"" DocNum"" ="
 其他'HANA
 sql =" SELECT"" DocEntry""从ORDR所在位置"" D​​ocNum"" ="
 万一

 sql = sql + oForm.Items.Item(pVal.ItemUID).Specific.Columns(pVal.ColUID).Cells.Item(pVal.Row).Specific.Value.ToString
 oRs = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset)
 oRs.DoQuery(sql)

 尽职尽责
 DocEntry = CInt(oRs.Fields.Item(" DocEntry")。Value)
 oRs.MoveNext()
 循环
 setDocEntryDrillDown(DocEntry)
 返回
 异常捕获
 MsgBox(例如消息)
 结束尝试
 万一
 

当上面的代码调用setDocEntryDrillDown(DocEntry)方法时,它将执行下面的代码。

私有子setDocEntryDrillDown(docEntry作为整数)

 Dim oItem作为SAPbouiCOM.Item
 Dim oStaticText作为SAPbouiCOM.StaticText
 Dim oLink as SAPbouiCOM.LinkedButton

 oItem = oForm.Items.Item(" LinkedText")
 oStaticText = oItem.Specific
 oStaticText.Caption = docEntry.ToString

 oItem = oForm.Items.Item(" Lnk1")
 oLink = oItem.Specific
 oLink.Item.Click()
 结束子
 

基于提供的代码,您是否知道为什么我重新打开表单并单击doc num时,销售订单会出现两次? 单击卡号后,我不会遇到此问题。 提醒您,我没有修改卡代码明细的点击事件。

(9.1 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我目前有一个Matrix网格,其钻取如下所示。 文档编号用于销售订单。

因为使用文档条目向下钻取文档,所以我有一种方法,当按下文档编号向下钻取时,它将从文档编号ID中找到文档条目ID并加载销售订单。

这是我面临的问题。 如果我是第一次打开该表单,然后单击doc num,它将加载一次销售订单。 如果我关闭"电子邮件回单"表单并重新打开,请单击"文档编号",它将打开两次销售订单。 表单关闭时,似乎触发了doc num的旧事件。 我为您提供了用于文档输入查找功能的代码示例。

 Private Sub createDocEntryDrillDown(linkedObjectType As Integer)
 Dim oLink as SAPbouiCOM.LinkedButton
 Dim oItem作为SAPbouiCOM.Item
 Dim oStaticText作为SAPbouiCOM.StaticText
 尝试
 oItem = oForm.Items.Item(" LinkedText")
 异常捕获
 oItem = oForm.Items.Add(" LinkedText",SAPbouiCOM.BoFormItemTypes.it_STATIC)

 oItem.Left = -700
 oItem.Width = 148
 oItem.Top = -800
 oItem.Height = 14
 oStaticText = oItem.Specific
 oStaticText.Caption =""

 oItem = oForm.Items.Add(" Lnk1",SAPbouiCOM.BoFormItemTypes.it_LINKED_BUTTON)
 oItem.Left = -700
 oItem.Top = -800
 oItem.LinkTo =" LinkedText"
 oLink = oItem.Specific
 oLink.LinkedObjectType =链接对象类型
 结束尝试
 结束子
 

当单击文档向下钻取时,我将使用以下代码覆盖click事件

如果pVal.EventType = SAPbouiCOM.BoEventTypes.et_MATRIX_LINK_PRESSED并且pVal.ColUID =" DocNum"并且pVal.BeforeAction = True,那么

 BubbleEvent = False
 尝试
 昏暗DocEntry作为整数
 昏暗的SQL作为字符串

 如果(sqlType =" SQL")然后
 sql ="从ORDR WHERE中选择DocEntry"" DocNum"" ="
 其他'HANA
 sql =" SELECT"" DocEntry""从ORDR所在位置"" D​​ocNum"" ="
 万一

 sql = sql + oForm.Items.Item(pVal.ItemUID).Specific.Columns(pVal.ColUID).Cells.Item(pVal.Row).Specific.Value.ToString
 oRs = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset)
 oRs.DoQuery(sql)

 尽职尽责
 DocEntry = CInt(oRs.Fields.Item(" DocEntry")。Value)
 oRs.MoveNext()
 循环
 setDocEntryDrillDown(DocEntry)
 返回
 异常捕获
 MsgBox(例如消息)
 结束尝试
 万一
 

当上面的代码调用setDocEntryDrillDown(DocEntry)方法时,它将执行下面的代码。

私有子setDocEntryDrillDown(docEntry作为整数)

 Dim oItem作为SAPbouiCOM.Item
 Dim oStaticText作为SAPbouiCOM.StaticText
 Dim oLink as SAPbouiCOM.LinkedButton

 oItem = oForm.Items.Item(" LinkedText")
 oStaticText = oItem.Specific
 oStaticText.Caption = docEntry.ToString

 oItem = oForm.Items.Item(" Lnk1")
 oLink = oItem.Specific
 oLink.Item.Click()
 结束子
 

基于提供的代码,您是否知道为什么我重新打开表单并单击doc num时,销售订单会出现两次? 单击卡号后,我不会遇到此问题。 提醒您,我没有修改卡代码明细的点击事件。

(9.1 kB)
付费偷看设置
发送
3条回答
亦是此间程序员
1楼 · 2020-09-16 01:43.采纳回答

嗨,约翰,

我从SAP那里得到了答复,并了解了发生了什么。 由于某种原因,当窗体关闭时,它不会删除项目单击事件。 SAP为我提供了一种解决方案,可在表单关闭后强制表单删除项目事件。 以下是他们为我提供的解决方案。

如果pVal.FormType =" 60004"并且pVal.EventType = SAPbouiCOM.BoEventTypes.et_FORM_CLOSE并且pVal.BeforeAction = True,则
   RemoveHandler SBOApp.ItemEvent,AddressOf SBO_Application_ItemEvent
 如果结束

我想再次感谢您分享我所面临问题的SAP注释。

此致

威廉

三十六小时_GS
2楼-- · 2020-09-16 01:56

嗨,约翰,

我刚刚提供的最佳答案是SAP提供的解决方案。 再次感谢您提供的帮助。

此致

威廉

95年老男孩
3楼-- · 2020-09-16 01:47

嗨威廉,

请测试从setDocEntryDrillDown子对象中删除oLink.Item.Click()。

此致

Johan

P.S。 在错误捕获器中运行代码不是一个好主意。 如果该代码中发生错误,您的程序将崩溃,并且您将不知道为什么。 您最好将此类代码移动到带有自己的try catch块的自己的子代码中。 另外,我建议您在调用LinkedText项目之前检查其是否存在。 您可以在一个单独的子目录中进行检查,并在必要时创建该项目。 然后,您可以先调用此子项,然后再继续。

一周热门 更多>