Есть таблица сталей
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