B1 SDK:发布更新UDO订单项的问题

2020-09-18 18:02发布

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

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


嗨,

我创建了一个具有订单项的UDO。 下面是数据在SAP中的外观

下面是数据在SQL中的显示方式

基于上述查询,我​​正在尝试更新LindId 10和11。对于SDK,您在更新订单项时会减去一。 因此,对于SDK中的此示例,订单项将为9和10。当我尝试使用这些行号更新这两行时,出现无效行错误。 当我删除行项目之后,此问题开始发生。 尽管我在数据库中看到了这些行号以及上面显示给您的屏幕截图,但我仍想弄清楚为什么会遇到此问题?

编辑:

下面是我正在使用的一些用于处理更新的代码

将oGeneralService用作SAPbobsCOM.GeneralService
 Dim oGeneralData作为SAPbobsCOM.GeneralData
 昏暗的孩子作为SAPbobsCOM.GeneralDataCollection
 Dim oGeneralParams作为SAPbobsCOM.GeneralDataParams
 Dim sCmp作为SAPbobsCOM.CompanyService
 昏暗的行作为整数= oMatrix.RowCount-1

 sCmp = oCompany.GetCompanyService
 oGeneralService = sCmp.GetGeneralService(" SPA")
 oGeneralParams = oGeneralService.GetDataInterface(SAPbobsCOM.GeneralServiceDataInterfaces.gsGeneralDataParams)
 oGeneralParams.SetProperty(" DocEntry"," 5")
 oGeneralData = oGeneralService.GetByParams(oGeneralParams)
 oChildren = oGeneralData.Child(" SPA_L")

 对于行As Integer = 1到行

 lineNum = CInt(oMatrix.Columns.Item(" LineId")。Cells.Item(row).Specific.Value())-1
 docNum = CInt(oMatrix.Columns.Item(" DocNum")。Cells.Item(row).Specific.Value())
 cardCode = oMatrix.Columns.Item(" CardCode")。Cells.Item(row).Specific.Value()
 cardName = oMatrix.Columns.Item(" CardName")。Cells.Item(row).Specific.Value()

 oChildren.Item(lineNum).SetProperty(" U_DocNum",docNum)
 oChildren.Item(lineNum).SetProperty(" U_CardCode",cardCode)
 oChildren.Item(lineNum).SetProperty(" U_CardName",cardName)
 下一个

 oGeneralService.Update(oGeneralData)
 

(10.1 kB)

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

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


嗨,

我创建了一个具有订单项的UDO。 下面是数据在SAP中的外观

下面是数据在SQL中的显示方式

基于上述查询,我​​正在尝试更新LindId 10和11。对于SDK,您在更新订单项时会减去一。 因此,对于SDK中的此示例,订单项将为9和10。当我尝试使用这些行号更新这两行时,出现无效行错误。 当我删除行项目之后,此问题开始发生。 尽管我在数据库中看到了这些行号以及上面显示给您的屏幕截图,但我仍想弄清楚为什么会遇到此问题?

编辑:

下面是我正在使用的一些用于处理更新的代码

将oGeneralService用作SAPbobsCOM.GeneralService
 Dim oGeneralData作为SAPbobsCOM.GeneralData
 昏暗的孩子作为SAPbobsCOM.GeneralDataCollection
 Dim oGeneralParams作为SAPbobsCOM.GeneralDataParams
 Dim sCmp作为SAPbobsCOM.CompanyService
 昏暗的行作为整数= oMatrix.RowCount-1

 sCmp = oCompany.GetCompanyService
 oGeneralService = sCmp.GetGeneralService(" SPA")
 oGeneralParams = oGeneralService.GetDataInterface(SAPbobsCOM.GeneralServiceDataInterfaces.gsGeneralDataParams)
 oGeneralParams.SetProperty(" DocEntry"," 5")
 oGeneralData = oGeneralService.GetByParams(oGeneralParams)
 oChildren = oGeneralData.Child(" SPA_L")

 对于行As Integer = 1到行

 lineNum = CInt(oMatrix.Columns.Item(" LineId")。Cells.Item(row).Specific.Value())-1
 docNum = CInt(oMatrix.Columns.Item(" DocNum")。Cells.Item(row).Specific.Value())
 cardCode = oMatrix.Columns.Item(" CardCode")。Cells.Item(row).Specific.Value()
 cardName = oMatrix.Columns.Item(" CardName")。Cells.Item(row).Specific.Value()

 oChildren.Item(lineNum).SetProperty(" U_DocNum",docNum)
 oChildren.Item(lineNum).SetProperty(" U_CardCode",cardCode)
 oChildren.Item(lineNum).SetProperty(" U_CardName",cardName)
 下一个

 oGeneralService.Update(oGeneralData)
 

(10.1 kB)
付费偷看设置
发送
5条回答
梦想连接
1楼 · 2020-09-18 18:24.采纳回答

嗨,约翰,

这是我从故障排除中学到的SDK。

下面是显示我的UDO的SQL Serer中当前结果的查询

当我使用以下语句时,它将更新SQL Server中的第2行结果

 oChildren.Item(1).SetProperty(" U_CardName","威廉")

我认为索引正在使用LineId。 但是,我了解到它可以与行索引一起使用。

因为数据网格中的结果显示了过滤后的结果,所以我了解到我需要使用子查询来查找行ID在SAP中将显示为什么。 这是我写的查询

选择前1000名
     RowNum,U_CardName
 从
 [@SPA_L]主要
 加入
 (选择前1000名
 ROW_NUMBER()OVER(按DocEntry ASC命令)AS RowNum,LineId
 从
 [@SPA_L]
 哪里
 DocEntry = 6)SUB
 上
 MAIN.LineId = SUB.LineId


 哪里
 U_Process ='H'并且DocEntry = 6
 

上面的查询将为我提供UDF U_Process = H上的过滤结果的文档条目6的行ID。


谢谢约翰,让我知道为什么我要面对这个问题。

此致

威廉

土豆飞人
2楼-- · 2020-09-18 18:08

嗨威廉,

能否请您分享选择和更新行的代码部分?

此致

Johan

jovirus
3楼-- · 2020-09-18 18:15

嗨威廉,

问题可能是oChildren.Item(lineNum)需要一个实际的索引号,而lineNum变量包含oMatrix.Columns.Item(" LineId")的值

假设该值实际上与行索引匹配,则可以测试不从该值中减去-1。

此致

Johan

四川大学会员
4楼-- · 2020-09-18 18:16

嗨,Johan,

下面是处理更新的代码示例。

将oGeneralService用作SAPbobsCOM.GeneralService
 Dim oGeneralData作为SAPbobsCOM.GeneralData
 昏暗的孩子作为SAPbobsCOM.GeneralDataCollection
 Dim oGeneralParams作为SAPbobsCOM.GeneralDataParams
 Dim sCmp作为SAPbobsCOM.CompanyService
 昏暗的行作为整数= oMatrix.RowCount-1

 sCmp = oCompany.GetCompanyService
 oGeneralService = sCmp.GetGeneralService(" SPA")
 oGeneralParams = oGeneralService.GetDataInterface(SAPbobsCOM.GeneralServiceDataInterfaces.gsGeneralDataParams)
 oGeneralParams.SetProperty(" DocEntry"," 5")
 oGeneralData = oGeneralService.GetByParams(oGeneralParams)
 oChildren = oGeneralData.Child(" SPA_L")

 对于行As Integer = 1到行

 lineNum = CInt(oMatrix.Columns.Item(" LineId")。Cells.Item(row).Specific.Value())-1
 docNum = CInt(oMatrix.Columns.Item(" DocNum")。Cells.Item(row).Specific.Value())
 cardCode = oMatrix.Columns.Item(" CardCode")。Cells.Item(row).Specific.Value()
 cardName = oMatrix.Columns.Item(" CardName")。Cells.Item(row).Specific.Value()

 oChildren.Item(lineNum).SetProperty(" U_DocNum",docNum)
 oChildren.Item(lineNum).SetProperty(" U_CardCode",cardCode)
 oChildren.Item(lineNum).SetProperty(" U_CardName",cardName)

 下一个

 oGeneralService.Update(oGeneralData)
 
SKY徐
5楼-- · 2020-09-18 18:21

嗨,

Johan Hakkesteegt 所述,您需要找出索引,通常可以使用VisOrder来实现,但是 在您的情况下,为什么它与LineNum相同是很奇怪的。

无论如何,如果您具有UDO表单,我不明白为什么要通过代码更新UDO,一旦将表单绑定到UDO,就无需编写任何代码来进行更新。

# p#

嗨Danilo,

"我的矩阵"网格显示的是过滤结果,而不是所有订单项。 例如,假设我的文档有6个订单项,但我只想显示2个订单项。 由于矩阵网格显示过滤结果,因此我不确定网格是否会知道如何更新正确的订单项?

一周热门 更多>