Откат функции BAPI на веб-страницах asp.net

У меня есть веб-приложение C#, которое вызывает несколько BAPI и хранимых процедур в одной из функций на веб-сайте ASP.net. мне нужно откатить все bapi, выполненные в функции, которая вызывается в Интернете, если один из методов внутри функции не работает.

в SQL я звоню

SqlTransaction transaction = connectionsql.BeginTransaction();
...
transaction.Rollback();

в коде С#, если один из методов не удался. (это можно сделать для отката sql)

но для SAP BAPI, даже если я вызову BAPI_TRANSACTION_ROLLBACK в операторе catch C#, изменения все равно останутся. (откат не удался)

К вашему сведению, в моей функции BAPI я использую CSAP_MAT_BOM_MAINTAIN для обновления информации о спецификации.

Есть ли способ выполнить откат, например транзакцию sql, в моем коде С# для функции SAP BAPI и откатить все BAPI, запущенные на С#, если в Интернете возникнет исключение?


person mdsuffian    schedule 21.11.2017    source источник
comment
Пост больше о SAP и BAPI. Насколько я знаю, если что-то не получится на полпути, BAPI выполнит откат, что означает, что SAP будет обрабатывать это сам.   -  person Mike    schedule 21.11.2017


Ответы (2)


Ваше мышление правильное. В идеале вы должны иметь возможность сделать следующее из своего кода ASP.net:

  1. Позвоните в БАПИ 1.
  2. Позвоните в БАПИ 2.
  3. и т. д.
  4. В случае успеха вызовите BAPI_TRANSACTION_COMMIT, если ошибка, вызовите BAPI_TRANSACTION_ROLLBACK.

К сожалению, если BAPI сами содержат COMMIT (как и многие старые и не-BAPI функциональные модули), ваш ROLLBACK будет слишком поздно — данные уже будут зафиксированы.

В вашем случае функциональный модуль CSAP_MAT_BOM_MAINTAIN содержит параметр FL_COMMIT_AND_WAIT, но это влияет только на то, ожидает ли COMMIT (фиксация все равно происходит в любом случае). Однако может быть обходной путь: в подпрограмме CSAP_MAIN_INIT (включить LCSAPF01) в моей системе есть эта строка кода:

import flg_no_commit_work  from memory id 'CS_CSAP'.

Этот флаг (flg_no_commit_work) позже передается в вызов функционального модуля CS_DI_BOM_VB (вызывается из CSAP_MAT_BOM_MAINTAIN), и если он установлен, COMMIT не выполняется. Возможно, попробуйте установить этот флаг через EXPORT TO MEMORY и посмотрите, поможет ли это. Конечно, это недокументировано и не поддерживается SAP, но вполне может сработать...

person mjturner    schedule 21.11.2017
comment
Большое тебе спасибо. теперь я знаю, почему именно мой BAPI не откатился. вы были правы, CSAP_MAT_BOM_MAINTAIN содержит параметр FL_COMMIT_AND_WAIT, который позже будет обработан и зафиксирует изменения, если флаг (flg_no_commit_work) не установлен. следующий код решает проблему. (источник: archive.sap.com/discussions/thread/182580) данные: тип flg_no_commit_work c. flg_no_commit_work = 'Х'. экспортировать flg_no_commit_work в память с идентификатором «CS_CSAP». - person mdsuffian; 22.11.2017
comment
Используя SE37, протестировав его последовательно, фиксация и откат работали. но в Интернете, даже если я использую несколько bapi по одному и тому же соединению, фиксация не выполняется. В настоящее время я использую коннектор SAP. Есть ли какой-либо образец, который я могу использовать для использования этого отката в моем веб-приложении c # asp.net? - person mdsuffian; 22.11.2017
comment
Таким образом, вызов CSAP_MAT_BOM_MAINTAIN был успешным (т. е. он возвращает значения, указывающие на то, что спецификация была обновлена), но данные не фиксируются? Возможно, стоит отладить вызов на стороне SAP, чтобы понять, почему он не работает. - person mjturner; 22.11.2017
comment
на веб-сервисе, если я поставлю репозиторий.CreateFunction(BAPI_TRANSACTION_COMMIT); function.invoke (пункт назначения); в конце кода веб-сервиса после завершения вызова первого BAPI данные сохраняются. однако, если я вызову его отдельно, он не будет сохранен, и данные будут заблокированы. я помещаю RfcSessionManager.BeginContext (назначение); в первом bapi и другом отдельном bapi вызывается конец с RfcSessionManager.EndContext(destination); (после вызова фиксации). Я также поместил IRfcFunction , RfcDestination и RfcRepository в качестве статической переменной, чтобы она никогда не сбрасывалась и не изменялась. есть что-то, что я пропустил? - person mdsuffian; 23.11.2017

сначала вы должны проверить, содержат ли BAPI оператор COMMIT WORK. Конечно, это будет мешать обработке ваших транзакций.

Далее вы должны позаботиться о правильной обработке сеанса. Вы поместили следующие вызовы функций вокруг вызовов BAPI.

RfcSessionManager.BeginContext() 

и

RfcSessionManager.EndContext()

Без этой контекстной скобки каждый вызов BAPI будет выполняться в другом контексте.

person Michael Meyer    schedule 21.11.2017