AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.07.2009, 12:45   #1  
sgt.Pepper is offline
sgt.Pepper
Участник
Аватар для sgt.Pepper
 
43 / 15 (1) ++
Регистрация: 05.10.2007
Адрес: Германия
Выборка нескольких записей из подчиненной таблицы с группировкой AND.
Есть таблица сталей
MaterialSteel
SteelId

и стандартов
MaterialStandard
StandardId
StandardGroupId

Есть таблица наборов этих сталей и стандартов, которая прикрепляется к InventTable и TmkSpecTable:

MaterialCollection
CollectionId
Type
RefKey
RefTable

MaterialCollection Relations:
MaterialCollection.CollectionId == MaterialSteel.SteelId
MaterialCollection.Type == 1

MaterialCollection.CollectionId == MaterialStandard.StandardId
MaterialCollection.Type == 2

InventTable.ItemId == MaterialCollection.RefKey
InventTable.TableId == MaterialCollection.RefTableId

TmkSpecTable.SpecId == MaterialCollection.RefKey
TmkSpecTable.TableId == MaterialCollection.RefTableId

Пользователь может ввести набор из сталей и стандартов, по которым необходимо сделать выборку из InventTable.
Необходимо выбрать только те, в которых присутствуют все стали и стандарты, выбранные пользователем.

К InventTable добавил MaterialCollection, сгруппировал результат по ItemId. Выбираю
из MаterialCollection.CollectionId по ИЛИ, при этом если добавлять тип коллекции, то результат пустой, равно как и если поставить "&&" в 74 строке.
С представленным ниже кодом возвращаются все InventTable-s, в которых присутствуют хотя бы одна из сталей/сандартов.

X++:
01 void setCollectionRange(TmkSteelText _steelText, TmkStandardText _standardText)
02 {
03    QueryBuildDataSource  ds = inventTable_DS.query().dataSourceTable(tablenum(InventTable));
04    FreeTxt rangeText;
05    int i;
06    FreeTxt parseRange(FreeTxt _txt)
07    {
08        Array arrayValues;
09        FreeTxt result;
10        TmkCollectionId    collectionId;
11        boolean isFirst = true;
12        ;
13        arrayValues = TmkStringTools::explode(_txt, #COLLECTION_SEPARATOR);
14        if(arrayValues.lastIndex() > 0)
15        {
16            if(arrayValues.lastIndex() == 1)
17            {
18                collectionId = TmkStringTools::trim(arrayValues.value(1));
19                return strfmt('(%1.%2 == "%3")', 
20			inventTable_DS.query().dataSourceTable(tableNum(MaterialCollection)).name(), 
21			fieldstr(MaterialCollection, CollectionId), collectionId);
22            }
23            else
24            {
25                for(i = 1; i <= arrayValues.lastIndex(); i++)
26                {
27                    collectionId = TmkStringTools::trim(arrayValues.value(i));
28                    if (isFirst)
29                    {
30                        result = strfmt('((%1.%2 == "%3")', 
31                            inventTable_DS.query().dataSourceTable(tableNum(MaterialCollection)).name(), 
32                            fieldstr(TmkCollection, CollectionId), collectionId);
33                        isFirst = false;
34                    }
35                    else
36                    {
37                        result += strfmt(' || (%1.%2 == "%3")', 
38                            inventTable_DS.query().dataSourceTable(tableNum(MaterialCollection)).name(), 
39                            fieldstr(MaterialCollection, CollectionId), collectionId);
40                    }
41                }
42            }
43        }
44        result += ')';

45        return result;
46    }
47    ;

48    if(collectionRange != null)
49    {
50        if(_standardText == '' && _steelText == '')
51        {
52            collection_ds.enabled(false);
53            collectionRange = null;
54            return;
55        }
56    }
57    else
58    {
59        if(_standardText == '' && _steelText == '')
60            return;

61        if(!collection_ds)
62        {
63            collection_ds = ds.addDataSource(tablenum(MaterialCollection));
64            collection_ds.joinMode(JoinMode::InnerJoin);
65            collection_ds.relations(true);
66            ds.addSortField(fieldnum(inventTable, ItemId));
67            ds.orderMode(OrderMode::GroupBy);
68        }
69        collection_ds.enabled(true);
70        collectionRange = SysQuery::findOrCreateRange(collection_ds, fieldnum(MaterialCollection, CollectionId));
71    }

72    if(_steelText != '' && _standardText != '' )
73    {
74        rangeText = strfmt("(%1 && %2)", parseRange(_steelText), parseRange(_standardText));
75    }
76    else
77    {
78        if(_standardText == '')
79            rangeText = parseRange(_steelText);
80        else
81            rangeText = parseRange(_standardText);
82    }

83    collectionRange.value(rangeText);
84}
Что я делаю неправильно?

AX 4.0.2163.0 SP2
Localization version: Eastern Europe
Старый 10.07.2009, 13:31   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
По-моему, вам надо не Inner, а Exist Join использовать (без группировки).
Либо, по всем полям в InventTable надо будет так же включить группировку
__________________
Axapta v.3.0 sp5 kr2
Старый 10.07.2009, 14:28   #3  
sgt.Pepper is offline
sgt.Pepper
Участник
Аватар для sgt.Pepper
 
43 / 15 (1) ++
Регистрация: 05.10.2007
Адрес: Германия
С ExistJoin и без группировки не работает.
Включил группировку по нескольким полям InventTable - тот же результат.
А можно ли привязать несколько раз MaterialCollection, каждый раз указывая необходимый CollectionId и тип, черезе InnerJoin?
Старый 10.07.2009, 16:13   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Можно посмотреть на генерируемый текст запроса
X++:
info(query().dataSourceNo(1).toString())
Старый 10.07.2009, 16:18   #5  
sgt.Pepper is offline
sgt.Pepper
Участник
Аватар для sgt.Pepper
 
43 / 15 (1) ++
Регистрация: 05.10.2007
Адрес: Германия
SELECT * FROM InventTable
GROUP BY InventTable.RecId ASC,
InventTable.ItemId ASC,
InventTable.ItemName ASC,
InventTable.Intracode ASC,
InventTable.DiameterId ASC,
InventTable.WallThicknessId ASC
WHERE ((Dimension[5] = N'S0')) AND
((ChainType = 1)) AND ((PipeUnitId = N'mm'))
JOIN * FROM MaterialCollection
WHERE InventTable.ItemId = MaterialCollection.RefKey AND
InventTable.TableId = MaterialCollection.RefTableId AND
(((((MaterialCollection_1.CollectionId == "08X22H6T") || (MaterialCollection_1.CollectionId == "10G2FB")) || (MaterialCollection_1.CollectionId == "API 5L"))))
Старый 14.07.2009, 11:33   #6  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
поробуйте поменять порядок датасорсов в запросе
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
Теги
join, select

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Set записей таблицы OOuph DAX: Программирование 6 11.02.2008 10:27
Как добавить в фильтрацию записей доп. таблицы n:1 или 1:n? Hidden DAX: Программирование 6 11.08.2006 14:04
вывод количества записей в таблице на web форме и указание текущей страницы таблицы bambuk1960 DAX: Программирование 1 06.07.2006 13:27
Выборка записей Swetik DAX: Функционал 12 23.12.2003 14:32
Lookupы при большом количестве записей выводимой таблицы Pavlo AKA Panok DAX: Программирование 9 07.05.2002 22:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:22.