17.08.2010, 22:06 | #1 |
Участник
|
dynamicsaxtraining: Select statement patterns
Источник: http://www.dynamicsaxtraining.com/ti...ement-patterns
============== This article contains descriptions of select statement patterns that can be used in the Microsoft Dynamics AX (Axapta). The list of select statement patterns provided is as follows:
Use this pattern when the condition in the “where” clause is dependant of a parameter. For example, we need to perform some procedure with either all Customer or Customers with invoice account only. It depends on the User input parameter. We create a periodic job with the following dialog box: Process Customers We will assume that the Customer with invoice account check box has the dialogField name in the code. The select statement will have the following view in the “run” method: X++: while select custTable where (!dialogField.value() || custTable.InvoiceAccount != '') General structure looks as follows: where (!EnableConditionFlag || condition) Switch Condition Use this pattern when either one or another condition dependant of parameter must be applied to the select statement. For example, we need to perform a procedure with items of either a BOM item or items of other item types. We need to create a periodic job with a dialog box. The dialog box contains only one BOM type checkbox. We will assume that the BOM type check box has the dialogField name in the code. In the run method, we write the following select statement: X++: while select inventTable where ((!dialogField.value() && inventTable.ItemType != ItemType::BOM) || (dialogField.value() && inventTable.ItemType == ItemType::BOM)) General structure looks as follows: where ((!Condition2Flag && condition 1) || (Condition2Flag && condition 2)) Enable/Disable Join Table with Condition Use this pattern when a joined table with a condition can either contain records or be empty. For example, we need select sales orders without Recipient or terminated Recipient. The SalesTaker field in the SalesTable table stores the Recipient ID. The Status field in the EmplTable table stores the Recipient’s status (None, Employed, or Resigned). The select statement has the following view: X++: while select SalesTable notexists join EmplTable where EmplTable.EmplId == SalesTable.SalesTaker && EmplTable.status != HRMEmplStatus::Resigned General structure looks as follows: notexists join where && (condition != required value) If you know other interesting patterns, please write them in the comments Technorati Tags: select statement, select statement patterns, where clause Источник: http://www.dynamicsaxtraining.com/ti...ement-patterns
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
18.08.2010, 01:05 | #2 |
----------------
|
и главный pattern - не используйте эти patterns
используйте Query & QueryRun |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
18.08.2010, 12:16 | #3 |
Участник
|
Почему? Интересно что отработает быстрее Query или select?
|
|
18.08.2010, 12:32 | #4 |
Ищущий знания...
|
Одинаково должно отрабатывать по идее И то и другое отсылает сформированный запрос к базе.
Не один раз проводил тесты у себя, время выполнения всегда было идентично Тут скорее вопрос в читаемости кода, и в удобности использования синтаксиса, и на мой взгляд, все зависит от ситуации
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.08.2010, 13:05 | #5 |
Axapta
|
Цитата:
If you need user interaction regarding the data you need processed, a query is the preferable way
|
|
18.08.2010, 13:27 | #6 |
Участник
|
Спасибо! Вобщем то если это переменная не из юзер интерфейса, то можно использовать. Я например очень часто первым Enable/Disable пользуюсь.
|
|
18.08.2010, 14:44 | #7 |
Участник
|
Подобные публикации так и побуждают понудеть...
Цитата:
Цитата:
Цитата:
|
|
|
За это сообщение автора поблагодарили: Wamr (3), Logger (5), oip (1), Volodymyr (1). |
19.08.2010, 12:57 | #8 |
Участник
|
Привет. Кажется не туда копать стали.
Как по мне интерес представляет именно "шаблон", а не условие. Структура первая, вида : while select custTable where (!dialogField.value() || custTable.InvoiceAccount != '') Позволяет включать выключать любое условие, а какое оно дело рук каждого. Удобно и практично, ну можно и кверей никто не спорить. Насчет notexists join опять же дело рук каждого. Соглашусь что примере приведены не самые лучшие. Но идея хорошая. |
|
19.08.2010, 19:12 | #9 |
Участник
|
Мне лично Query больше нравится тем, что:
|
|
20.08.2010, 00:37 | #10 |
Модератор
|
Цитата:
Цитата:
Структура первая, вида :
X++: while select custTable where (!dialogField.value() || custTable.InvoiceAccount != '')
__________________
-ТСЯ или -ТЬСЯ ? |
|
20.08.2010, 14:01 | #11 |
----------------
|
вот к чему в конечном итоге приводит любовь к "хорошей идеи"
X++: while select sum(Qty), sum(costAmountPosted), sum(costAmountAdjustment) from InventTrans group by ItemId where (!itemId || InventTrans.ItemId == itemId) && ( ( !dateFrom || ( InventTrans.DatePhysical > dateFrom || ( isTime && ( InventTrans.DatePhysical == dateFrom && ( InventTrans.GM_DatePhysical > dateFrom || ( InventTrans.GM_DatePhysical == dateFrom && InventTrans.AX_TimePhysical >= timeFrom ) ) ) ) ) ) && ( !dateTo || ( InventTrans.DatePhysical < dateTo || ( isTime && ( InventTrans.DatePhysical == dateTo && ( InventTrans.GM_DatePhysical < dateTo || ( InventTrans.GM_DatePhysical == dateTo && InventTrans.AX_TimePhysical < timeTo ) ) ) ) ) ) ) && ( InventTrans.StatusReceipt == StatusReceipt::Purchased || InventTrans.StatusReceipt == StatusReceipt::Received || InventTrans.StatusIssue == StatusIssue::Sold || InventTrans.StatusIssue == StatusIssue::Deducted ) && InventTrans.TransType == InventTransType::Sales join salesTable group by GM_SalesOperationType where salesTable.SalesId == inventTrans.TransRefId join inventDim group by inventDimDefect where inventDim.inventDimId == inventTrans.inventDimId && (!defect || inventDim.inventDimDefect == defect) exists join GM_CalcInventLocationOperational where dataAreaAdmin || (!dataAreaAdmin && GM_CalcInventLocationOperational.InventLocationId == inventDim.InventLocationId) exists join GM_CalcInventLocationAdministrative where ( ( dataAreaAdmin && GM_CalcInventLocationAdministrative.CalcInventLocation == GM_CalcInventLocation && GM_CalcInventLocationAdministrative.InventLocationId == inventDim.InventLocationId ) || ( !dataAreaAdmin && GM_CalcInventLocationAdministrative.InventLocationId == GM_CalcInventLocationOperational.AdministrativeInventLocationId && GM_CalcInventLocationAdministrative.CalcInventLocation == GM_CalcInventLocation ) ) |
|
|
За это сообщение автора поблагодарили: fed (5), Lemming (5), gl00mie (2). |
|
|