2016-01-07 4 views
0

У меня есть два DataGridView в основной форме, а первый отображает данные из SAP, а другой отображает данные из Vertica DB, FM, который я использую, является RFC_READ_TABLE, но при вызове этого FM , то есть, если в целевой таблице слишком много столбцов, соединитель SAP вернет исключение DATA_BUFFER_EXCEED, есть ли какие-либо другие FM-файлы или способы извлечения данных из SAP без исключения?
Я выяснил решение, посвященное разбиению полей на несколько массивов и хранение данных каждой детали в виде данных, а затем слияние данных, но я боюсь, что это будет стоить много времени, если количество строк слишком велико.Извлечение данных из SAP с использованием C#

screenshot of the program

here comes my codes: 
RfcDestination destination = RfcDestinationManager.GetDestination(cmbAsset.Text); 
      readTable = destination.Repository.CreateFunction("RFC_READ_TABLE"); 
      /* 
      * RFC_READ_TABLE will only extract data up to 512 chars per row. 
      * If you load more data, you will get an DATA_BUFFER_EXCEEDED exception. 
      */ 
      readTable.SetValue("query_table", table); 
      readTable.SetValue("delimiter", "~");//Assigns the given string value to the element specified by the given name after converting it appropriately. 
      if (tbRowCount.Text.Trim() != string.Empty) readTable.SetValue("rowcount", tbRowCount.Text); 
      t = readTable.GetTable("DATA"); 
      t.Clear();//Removes all rows from this table. 
      t = readTable.GetTable("FIELDS"); 
      t.Clear(); 

      if (selectedCols.Trim() != "") 
      { 
       string[] field_names = selectedCols.Split(",".ToCharArray()); 
       if (field_names.Length > 0) 
       { 
        t.Append(field_names.Length); 
        int i = 0; 
        foreach (string n in field_names) 
        { 
         t.CurrentIndex = i++; 
         t.SetValue(0, n); 
        } 
       } 
      } 
      t = readTable.GetTable("OPTIONS"); 
      t.Clear(); 
      t.Append(1);//Adds the specified number of rows to this table. 
      t.CurrentIndex = 0; 
      t.SetValue(0, filter);//Assigns the given string value to the element specified by the given index after converting it appropriately. 

      try 
      { 
       readTable.Invoke(destination); 
      } 
      catch (Exception e) 
      { 
      } 
+3

Я бы хотел назначить это для бесценной премии за скриншот ... – vwegert

+1

И так как вы не говорите нам, какую таблицу вы действительно читаете, трудно ответить ... – vwegert

+0

ahh, так что извините за описание, таблицу Мне нужно прочитать LIPS, LIKP, BKPF и другие, все бизнес-данные. –

ответ

1

Прежде всего, вы должны использовать BBP_READ_TABLE, если он доступен в вашей системе. Это лучше по многим причинам. Но это не вопрос вашего вопроса. В RFC_READ_TABLE у вас есть два импорта ROWCOUNT и ROWSKIPS. Вы должны использовать их.

Я бы порекомендовал вам ряд оценок от 30.000 до 60.000. Поэтому вам нужно выполнить RFC несколько раз и каждый раз, когда вы увеличиваете свой ROWSKIPS. Первый цикл: ROWCOUNT = 30000 И ROWSKIPS = 0, второй цикл: ROWCOUNT = 30000 И ROWSKIPS = 30000 и т. Д.

Также будьте осторожны с поплавковыми полями при использовании старой RFC_READ_TABLE. В таблице LIPS есть один. У этого RFC есть проблемы с ними.

0

Использование транзакций

BAPI

пресс-фильтр и установить для всех. В разделе «Выполнение логистики» вы найдете поставки. Экран подробной информации показывает имя функции. Проверьте их непосредственно, чтобы найти тот, который подходит, а затем вызовите эту функцию вместо RFC_read_tab.
пример:

BAPI_LIKP_GET_LIST_MSG

+0

Спасибо, Фил, позволь мне попробовать. –

0

Другая возможность состоит в том, чтобы иметь функцию ABAP RFC развившейся получить ваши ДАННЫЕ (с тем преимуществом, что вы можете получить структурированный/мульти ответ таблицы в одном вызове, и недостаток, что это не стандартная функция/BAPI)

Смежные вопросы