Получить таблицу SAP Bapi (без экспорта) после обработки - с помощью Sap Connector 3.0

Друзья. В настоящее время я использую BAPI SAP по умолчанию. Я использовал любой Z *, созданный abappers или мной.

Я кодирую на C # vb. 2010. Вопрос о том, что bapi, заключается в том, что в настоящее время я вижу 2 таблицы, одну с параметрами, а другую с результатами.

Пока что мне удалось заполнить таблицу параметрами, но я не знаю, как получить информацию из результирующей таблицы.

Я поискал в Интернете без ответа. Не знаю, правильно я это делаю или нет. :П

Я публикую свой код, чтобы кто-нибудь мог мне помочь.

Спасибо.

        String include = "I", rango = "EQ";// EQ - BT -- Equal o Between
        DataTable dt = new DataTable("ws_clientes_contactos");

        dt.Columns.Add("PARTNEREMPLOYEEID", typeof(String));
        dt.Columns.Add("CUSTOMER", typeof(String));
        dt.Columns.Add("LASTNAME", typeof(String));
        dt.Columns.Add("FIRSTNAME", typeof(String));
        dt.Columns.Add("SEX", typeof(String));
        dt.Columns.Add("TITLE_P", typeof(String));
        dt.Columns.Add("LANGU_P", typeof(String));
        dt.Columns.Add("LANGUP_ISO", typeof(String));
        dt.Columns.Add("COUNTRY", typeof(String));
        dt.Columns.Add("COUNTRYISO", typeof(String));
        dt.Columns.Add("CITY", typeof(String));
        dt.Columns.Add("POSTL_COD1", typeof(String));
        dt.Columns.Add("REGION", typeof(String));
        dt.Columns.Add("STREET", typeof(String));
        dt.Columns.Add("TEL1_NUMBR", typeof(String));
        dt.Columns.Add("FAX_NUMBER", typeof(String));
        dt.Columns.Add("FUNCTION", typeof(String));
        dt.Columns.Add("SORT1_P", typeof(String));
        dt.Columns.Add("ADDRESS", typeof(String));
        dt.Columns.Add("PERS_NO", typeof(String));
        dt.Columns.Add("E_MAIL", typeof(String));

        try
        {

            RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("DEV");
            RfcRepository SapRfcRepository = SapRfcDestination.Repository;
            IRfcFunction bapigetcontactlist = SapRfcRepository.CreateFunction("BAPI_CUSTOMER_GETCONTACTLIST");

            IRfcTable CUSTOMERRANGE, CONTACTADDRESSDATA;
            CUSTOMERRANGE = bapigetcontactlist.GetTable("CUSTOMERRANGE");

              //LLENA TABLA FILTROS DE LA BAPI

            if (Opc == "B")
            {
                rango = "BT";
            }

            CUSTOMERRANGE.Append();
            CUSTOMERRANGE.SetValue("SIGN", include);
            CUSTOMERRANGE.SetValue("OPTION", rango);
            CUSTOMERRANGE.SetValue("LOW", ClienteMin);

            if (Opc == "B")  // BETWEEEN
            {
                CUSTOMERRANGE.SetValue("HIGH", ClienteMax);
            }
            else // EQUAL = LWO 
            {
                CUSTOMERRANGE.SetValue("HIGH", " ");
            }

            bapigetcontactlist.SetValue("MAXROWS", 1000);

            //DataTable dtt = CreateDataTable(CUSTOMERRANGE);
            bapigetcontactlist.SetValue("CUSTOMERRANGE", CUSTOMERRANGE);
            CONTACTADDRESSDATA = bapigetcontactlist.GetTable("CONTACTADDRESSDATA");

            bapigetcontactlist.Invoke(SapRfcDestination);

            IRfcTable Result = bapigetcontactlist["CONTACTADDRESSDATA"].GetTable();

            for (Int16 i = 0; i < (Result.RowCount); i++)
            {
                DataRow dr = dt.NewRow();

                dr["PARTNEREMPLOYEEID"] = CONTACTADDRESSDATA[i].GetString(0);
                dr["CUSTOMER"] = CONTACTADDRESSDATA[i].GetString(1);
                dr["LASTNAME"] = CONTACTADDRESSDATA[i].GetString(2);
                dr["FIRSTNAME"] = CONTACTADDRESSDATA[i].GetString(3);
                dr["SEX"] = CONTACTADDRESSDATA[i].GetString(4);
                dr["TITLE_P"] = CONTACTADDRESSDATA[i].GetString(5);
                dr["LANGU_P"] = CONTACTADDRESSDATA[i].GetString(6);
                dr["LANGUP_ISO"] = CONTACTADDRESSDATA[i].GetString(7);
                dr["COUNTRY"] = CONTACTADDRESSDATA[i].GetString(08);
                dr["COUNTRYISO"] = CONTACTADDRESSDATA[i].GetString(9);
                dr["CITY"] = CONTACTADDRESSDATA[i].GetString(10);
                dr["POSTL_COD1"] = CONTACTADDRESSDATA[i].GetString(11);
                dr["REGION"] = CONTACTADDRESSDATA[i].GetString(12);
                dr["STREET"] = CONTACTADDRESSDATA[i].GetString(13);
                dr["TEL1_NUMBR"] = CONTACTADDRESSDATA[i].GetString(14);
                dr["FAX_NUMBER"] = CONTACTADDRESSDATA[i].GetString(15);
                dr["FUNCTION"] = CONTACTADDRESSDATA[i].GetString(16);
                dr["SORT1_P"] = CONTACTADDRESSDATA[i].GetString(17);
                dr["ADDRESS"] = CONTACTADDRESSDATA[i].GetString(18);
                dr["PERS_NO"] = CONTACTADDRESSDATA[i].GetString(19);
                dr["E_MAIL"] = CONTACTADDRESSDATA[i].GetString(20);


                dt.Rows.Add(dr);
            }

person Mario Rafael Tejada    schedule 03.03.2016    source источник
comment
Мне кажется, что вы правильно вызываете функцию. Каковы значения ClienteMin и ClienteMax? Может параметры неправильные. Вы проверили эту ссылку.   -  person Nelson Miranda    schedule 04.03.2016
comment
это коды клиентов, соответственно Min и Max, которые используются в качестве параметров в BAPI. Пример: 1027810   -  person Mario Rafael Tejada    schedule 04.03.2016


Ответы (2)


Что ж, я никогда не использовал SAP Connector (у меня он тоже не установлен), но я постараюсь ответить на ваш вопрос;

Я вижу в вашем коде, что вы пытаетесь вернуть результирующую таблицу данных в «CONTACTADDRESSDATA», однако вы еще не вызвали функцию «BAPI_CUSTOMER_GETCONTACTLIST», поэтому я думаю, что она пуста.

Затем вы вызываете BAPI и сохраняете результирующий набор данных в переменной IRfcTable 'Result'.

После этого вы пытаетесь прочитать «CONTACTADDRESSDATA», но, как я уже указал, он пуст.

bapigetcontactlist.SetValue("CUSTOMERRANGE", CUSTOMERRANGE); // Context

CONTACTADDRESSDATA = bapigetcontactlist.GetTable("CONTACTADDRESSDATA"); // Here you try to get the datatable.

bapigetcontactlist.Invoke(SapRfcDestination); // Then you invoke the function

IRfcTable Result = bapigetcontactlist["CONTACTADDRESSDATA"].GetTable(); // The datatable you're trying to read is set here.

for (Int16 i = 0; i < (Result.RowCount); i++)
{
  DataRow dr = dt.NewRow();
  dr["PARTNEREMPLOYEEID"] = CONTACTADDRESSDATA[i].GetString(0); // Try to replace 'CONTACTADDRESSDATA' with 'Result'
  dr["CUSTOMER"] = CONTACTADDRESSDATA[i].GetString(1);

Я проанализировал ваш код на основе этого вопроса.

Надеюсь, это поможет.

person Nelson Miranda    schedule 04.03.2016
comment
Спасибо за помощь! - person Mario Rafael Tejada; 04.03.2016

Наконец-то я обнаружил, что происходит. Когда я выполнял BAPI в SAP, я просто написал код клиента. Без левой панели 000.

Но когда я позвонил, мне просто нужно было добавить нули в код клиента.

          CUSTOMERRANGE.SetValue("LOW", "000" + ClienteMin);
person Mario Rafael Tejada    schedule 04.03.2016
comment
Я рад, что вы смогли решить свою проблему, однако параметр таблицы «CUSTOMERRANGE» для BAPI «BAPI_CUSTOMER_GETCONTACTLIST» имеет длину 10 символов для «LOW» и «HIGH». С наилучшими пожеланиями. - person Nelson Miranda; 04.03.2016
comment
Да, это была проблема, коды клиентов, которые я использую, представляют собой только 7-значные коды, но все же bapi нуждался в параметре 10 Char. было бы лучше использовать что-то вроде этого: foreach (строка i в словах) {if (i.Length ›1) {CustomerCode = i.PadLeft (10, '0'). ToString (); }} - person Mario Rafael Tejada; 07.03.2016
comment
На самом деле вам не нужен оператор if, мой совет - не используйте PadLeft, попробуйте вместо него i.ToString (0000000000). Внутри SAP всегда хранит эти данные с нулями слева. С наилучшими пожеланиями. - person Nelson Miranda; 07.03.2016