SAP B1 DI-API заменяет символ при сохранении
Я написал небольшую службу на C #, импортирующую номера таркинга в один UDF, разделенные запятой. Проблема в том, что иногда (возможно, в каждом 200-м документе) запятая сохраняется как точка с запятой. У меня похожая проблема с импортером Amazon, где я добавляю комментарий. Возможно, с той же частотой в комментарии есть пробелы между всеми исходными символами. Общее в том, что ошибка не может быть в моем коде. Нет никакой разницы между правильными документами (около 95%) и другими.
Есть ли у кого-нибудь идеи, как я могу решить эту проблему, чтобы эти проблемы больше не появлялись? Или почему это может случиться?
Я знаю, что у меня устаревшая версия SAP B1 9.2 PL 10 Hotfix3. DI-API связан с установочной папкой. Исправлена ли эта проблема в более поздних версиях?
(Текущий обходной путь - это задание cron, которое проверяет неправильные записи в базе данных и обновляет эти документы. Очень не круто)
2 ответа
Определенно звучит как ошибка DI-API. Если вы разместили свой код, это поможет подтвердить это.
Предполагая, что это ошибка DI-API, я бы сделал ее «темной стороной» и просто сделал бы регулярное обновление SQL (в обход DI-API), так как это всего лишь UDF и, вероятно, нет какой-либо бизнес-логики, которая нужна SAP для выполнения с этими обновления.
В качестве альтернативы вы можете нормализовать свои данные и создать отдельную таблицу, связанную через FK с вашей текущей таблицей, чтобы разместить одну UDF для каждой строки (поэтому не нужно иметь дело со странной проблемой символа комы).
В качестве третьей альтернативы вы можете использовать SP для уведомлений о пост-транзакциях SBO, чтобы отслеживать случай ошибки и выполнять там «исправление», в том числе в задании cron.
Отказ от ответственности: я не работал с SAP более 4 лет.
Например, один из получаемых мной кодов ошибок:
1250000138 - Definieren Sie das Frachterlös- oder das Frachtaufwandskonto für Fracht
или же
Could not commit transaction: Deadlock (-2038) detected during transaction
Например, ошибка 1, я не понимаю, так как мой код не касается расходов, и все же он говорит, что счет расходов не найден (больше). Эта ошибка также появляется в дополнении, предоставленном нашим SAP-партнером. Если я не ошибаюсь, они используют немного другую версию DI-API, чем я.
Почему может произойти ошибка 2? Моя программа никогда не выполняет два процесса DIAPI одновременно.
Сценарий PowerShell выполняется в службе C #. Среда выполнения - .Net Core 5 и соответствующая PowerShell 7.
...
$csv = Import-Csv -Path $filepath -Delimiter $delimiterCSV -Encoding "windows-1251" | Select-Object $headerDocNum, $headerTracingNo
$docNum = ($csv | Select-Object -ExpandProperty $headerDocNum -Unique)
$tracingNoRaw = ($csv | Select-Object -ExpandProperty $headerTracingNo | ForEach-Object { $t = "" } { $t += $delimiterCSVTracing + $_ } { $t })
$tracingNoList = $tracingNoRaw.Substring(1, $tracingNoRaw.Length - 1).Split($delimiterCSVTracing) | Select-Object -Unique | Sort-Object
$tracingNo = $tracingNoList | ForEach-Object { $t = "" } { $t += $delimiterSAP + $_ } { $t }
$tracingNo = $tracingNo.Substring(1, $tracingNo.Length - 1)
$shippingCount = $tracingNoList.Count
$rs = $company.GetBusinessObject([SAPbobsCOM.BoObjectTypes]::BoRecordset)
$rs.DoQuery("SELECT DocEntry FROM ODLN WHERE DocNum = '$docNum'")
if ($rs.EoF) {
throw ("DN DocNum does not exist! '$docNum'")
}
$docEntryDN = [int]$rs.Fields.Item(0).Value
$docDN = $company.GetBusinessObject([SAPbobsCOM.BoObjectTypes]::oDeliveryNotes)
$docDN.UserFields.Fields.Item("U_Tracing").Value = [string]$tracingNo
$docDN.UserFields.Fields.Item("U_SHIPPING_COUNT").Value = [string]$shippingCount
for ($i = 0; $i -lt 3; $i++) {
$res = $docDN.Update()
if ($res -eq 0) {
Write-Information "DPD-Tracing updated for delivery [$i]: $($docDN.DocNum) | $($docDN.DocEntry) -> $([string]$tracingNo)"
break
}
Write-Warning "Attempt failed [$i] -> $($company.GetLastErrorDescription())"
Start-Sleep -Milliseconds 100
}
if ($res -ne 0) {
Write-Error ("Error updating delivery note: '$docEntryDN'")
return
}
...