2014-01-30 5 views
0

для множественного ввода данных у нас есть эффективный способ: RecordSortedListОптимизация поездки базы данных для извлечения данных

RecordSortedList rsl; 
MyTable   myTable; 
; 
rsl = new RecordSortedList(myTable.tableid); 
rsl.sortOrder(fieldname2id(myTable.tableId,'RecId')); 
myTable.field1 = 'Value1'; 
rsl.ins(myTable); 
myTable.field1 = 'Value2'; 
rsl.ins(myTable); 
rsl.insertDatabase(); 

То же самое, возможно, для многократного извлечения записей из БД за один раз? Что-то вроде

int i =1; 
while(i<10000) 
{ 
    //enter records from db into a buffer in db 
    i++ 
} 
//now bring the buffer from db in a single trip 
//and do the data manipulation in AX 

Мое намерение состоит в том, чтобы оптимизировать путешествие db как минимум. Пожалуйста, предложите.

+0

Похоже, вы уже знаете ответ на этот вопрос. –

+0

Я немного знаю ... им просто блуждает, что в любом случае потребуется 500+ поездок для хранения данных на карте (классе). Это может быть сделано любым другим способом. – piku

+0

Нет, если вы используете один оператор SELECT для извлечения данных для карты. –

ответ

1

insertDatabase метод, как указано (используйте RecordInsertList класс вместо RecordSortedList, если вам не нужен порядок сортировки):

вставляет несколько записей на одну поездку в базу данных.

Однако это в основном с точки зрения программистов. Работа с SQL goes like this:

INSERT INTO MyTable (Column1, Column2) 
VALUES (Value1, Value2), 
     (Value1, Value2), ... 

Существуют ограничения на количество записей вставлено таким образом, так что ядро ​​AX может разделить список, чтобы сделать несколько вызовов на сервер SQL.

Другой путь из БД в AX легко:

while select myTable where ... 

Что переводится в SQL как:

SELECT T1.Column1, T1.Column2 FROM MyTable T1 WHERE... 

Это переносит данные из таблицы AX как можно более эффективным ,

Вместо этого вы можете использовать объект QueryRun, но вызов SQL остается неизменным.

Если вы делаете простые обновления в таблице, рассмотрите возможность использования update_recordset, так как это может перемещать обновления на SQL-сервер и устранять обратную связь.

+0

спасибо за ответ. Я думаю, что у нас есть эффективные способы ограничить Db-поездку для обновления, вставки и удаления, а не для извлечения данных? – piku

+0

Вы можете сократить время, выбрав только нужные вам поля. В противном случае 'select' выполняется так быстро, как может быть. –

+0

Я выбрал только нужные столбцы и вернул выбранные записи в RecordLinkList. Показатель отличается от 30+ до 4-5 минут. Еще одна причина задержки в моем случае - это рисование строк для каждой ячейки (отчет excel), который я удалил позже. – piku

2

Да, это называется RecordLinkList - http://msdn.microsoft.com/en-us/library/aa643250(v=ax.50).aspx

recordLinkList является двойным связанным списком, который может содержать записи разных типов одновременно. Он не подбирается и не сортируется.

recordLinkList особенно полезен для передачи записей из разных таблиц в качестве параметра вместо получения тех же записей снова.

Нет размера для recordSortedList; это Ответственность программиста за его размер и, следовательно, расход памяти .

Вы также можете добавить записи разных типов.

static void RecordLinkList(Args _args) 
{ 
    RecordLinkList  rll = new RecordLinkList(); 
    SalesTable   salesTable; 
    CustTable   custTable; 
    InventTrans   inventTrans; 
    Address    address; 
    boolean    iterate; 
    ; 

    select firstonly salesTable; 
    select firstonly custTable; 
    select firstonly inventTrans; 
    select firstonly address; 

    rll.ins(salesTable); 
    rll.ins(custTable); 
    rll.ins(inventTrans); 
    rll.ins(address); 


    iterate = rll.first(); 

    while (iterate) 
    { 
     switch (rll.fileId()) // FileId == TableId 
     { 
      case tablenum(SalesTable): 
       salesTable = rll.peek(); 
       info(strfmt("SalesTable"); 
       break; 

      case tablenum(CustTable): 
       custTable = rll.peek(); 
       info("CustTable"); 
       break; 

      case tablenum(InventTrans): 
       inventTrans = rll.peek(); 
       info("InventTrans"); 
       break; 

      default: 
       error(strfmt("Table %1 (%2) not expected", tableid2name(rll.fileId()), rll.fileId())); 
     } 

     iterate = rll.next(); 
    } 

    info("Done"); 



} 
+0

Здесь будут записаны записи, записанные вручную по записи. Возможно, это не то, что ожидалось @piku. –

+0

Полагаю, я не совсем понимаю его вопрос. Я видел, что он хотел вставить записи в буфер, и в одном из своих комментариев он использовал класс Map. И он нашел RecordSortedList, поэтому я решил, что RecordLinkList может быть в том же порядке, что и он ищет. –

+0

Я добавил RecordLinkList в свой код, который увеличил производительность, спасибо за это. Но мой вопрос, как сказал @Jan, - это эффективный способ извлечения данных из базы данных, так же как мы можем использовать insertDatabase() для вставки, update_recordset для обновления и т. Д. – piku

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