Как получить возврат параметра обмена с помощью Sap Connector

У меня проблема с чтением возвращаемого значения параметра обмена. У меня есть опыт передачи и чтения таблиц и простых полей, но я не получаю это возвращаемое значение.

На изображении показан результат («Ergebnis» = Результат). Это специальный RFC.

Результат SE37

Это код. Сап-коннектор вроде как "завёрнутый". После выполнения RFC я хочу прочитать значение обмена, но оно возвращает «0» вместо «150».

            rfcFunction = connector.CreateFunction("Z_SOME_CUSTOM_RFC")
            With rfcFunction
                .SetValue("I_WERKS", "4711")
                .SetValue("I_MATNR", "1234")
                .SetValue("I_CHARG", "")
            End With
            connector.Execute(rfcFunction) ' This wrapper actually calls the invoke-function
            Return rfcFunction.GetDecimal("E_ZQM_QTY_FULL_UNIT")

Что не так?


person etalon11    schedule 17.02.2016    source источник
comment
что за объект соединитель? Класс RfcDestination из SAP NCo не имеет ни CreateFunction (то есть в RfcRepository), ни Execute (RfcDestination вызывает функции с помощью Invoke (), как vwegert упомянул в своем ответе). Это какая-то обертка?   -  person Dirk Trilsbeek    schedule 18.02.2016
comment
Да, у меня есть своего рода оболочка, и выполнение вызывает функцию вызова   -  person etalon11    schedule 19.02.2016
comment
Затем добавьте также полный код оболочки. Как вы ожидаете, что мы поможем вам с проблемой, если вы покажете только половину задействованного кода?   -  person vwegert    schedule 19.02.2016
comment
Парню, который работал с sapconnector и параметрами обмена, не нужен остальной код. Любой, кто не имеет опыта работы с sapconnector, не может здесь помочь. Прости.   -  person etalon11    schedule 19.02.2016
comment
Сначала проверьте, действительно ли функция выполняется в вашей оболочке. Не глядя на это, мы не можем увидеть, есть ли побочный случай, когда вызов не будет выполнен или где исключение может быть обнаружено и проигнорировано. Является ли E_ZQM_QTY_FULL_UNIT десятичным типом?   -  person Dirk Trilsbeek    schedule 19.02.2016


Ответы (3)


Вы пробовали rfcFunction.GetDecimal ("Ergebnis")?

person Alex Suleap    schedule 17.02.2016
comment
Какой результат дает вам rfcFunction.GetValue (0)? - person Alex Suleap; 17.02.2016
comment
Один раз, но на очень простом примере. Но даже на вашем скриншоте E_ZQM_QTY_FULL_UNIT имеет значение 0. Значит, вам нужно каким-то образом получить результат функции. - person Alex Suleap; 17.02.2016

Насколько я знаю .NET Connector, попробуйте использовать

rfcFunction.Invoke(someDestination) 

вместо connector.Execute(rfcFunction),

person vwegert    schedule 17.02.2016
comment
Я использую invoke. Он вызывается в функции-исполнителе. Это обертка для разъема. Я редактировал свой вопрос. Так что это не поможет. - person etalon11; 19.02.2016

Думаю, ваша проблема связана с номером материала (I_MATNR). Когда вы тестируете свою функцию с SE37 транзакцией, SAP автоматически вызывает CONVERSION_EXIT, зарегистрированный в домене MATNR.

В моей системе материал 1234 конвертируется в 000000000000001234. Но когда вы вызываете свою функцию с помощью RFC, вам нужно преобразовать ее самостоятельно, либо на клиенте (.Net), либо на сервере (ABAP). Попробуйте снова вызвать функцию, используя 000000000000001234 в качестве параметра I_MATNR.

Кроме того, если вы работаете с вызовом более сложных функций с использованием RFC, я хотел бы познакомить вас с SharpSapRfc , оболочка OSS для NCo 3, которую я использую некоторое время.

Это удобно при работе с таблицами и структурами, так как автоматически сопоставляется с классами и списками. В репозитории есть несколько примеров (все с использованием C #).

using (SapRfcConnection conn = new PlainSapRfcConnection("your-sap-con"))
{
    var result = conn.ExecuteFunction("Z_SOME_CUSTOM_RFC", new {
        I_WERKS = "4711",
        I_MATNR = "1234".
        I_CHARG = ""
    });

    decimal result = result.GetOutput<decimal>("E_ZQM_QTY_FULL_UNIT");
}
person goenning    schedule 12.04.2016