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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2008, 20:49   #1  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Запрос по таблице параметров.
Всем привет!
Помогите с запросиком плиз.

Имеем две таблицы:
Table1
поля: num, type
Table2
поля: num, param, value

Связь по num, в Table2 может быть набор записей привязаных к одной записи в Table1.

Необходим запрос, в котором можно бы было задать тип(типы) и параметр(параметры) с соответствующим значением для поиска, причем значение параметра можно было бы задавать в виде "*ала*", ну т.е. что-то типа:
Код:
while select table1 table1.where type=="стол"
join table2 where table2.num==table1.num
&& (
(table2.param=="цвет" && table2.value=="красный")
||
(table2.param=="ножек" && table2.value=="2..4")
||
(table2.param=="название" && table2.value like "тол"))
Запрос нужен в виде query на форму.
Спасибо!
Старый 15.12.2008, 21:46   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Расширенный AddRange
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 16.12.2008, 07:16   #3  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Да так и делаю и все вроде работает, но видимо:
"Using wildcards and comma-separated range values
Again, the previous example here was using standard syntax, not the special syntax using expressions. It's not possible to modify the above examples to work with wildcards.
The above statement applies to AX versions < 5.0
AX 5.0 introduced solution to wildcards - while you still cannot directly use wildcards in ranges, now it supports the 'LIKE' keyword.
(AccountNum LIKE "*AA*" || Name LIKE "*AA*")"

Забыл указать Ах3.0

Мой сумбур на данный момент выглядит так:
Код:
...
QueryBuildDataSource qbdsTable1;
QueryBuildDataSource qbdsTable2;
QueryBuildRange      qbrTable1;
QueryBuildRange      qbrTable2;
FreeTxt              qValueTable1;
FreeTxt              qValueTable2;
;
qbdsTable1 = this.query().dataSourceTable(tablenum(Table1));
qbdsTable2 = this.query().dataSourceTable(tablenum(Table2));
qbdsTable2.addLink(fieldnum(Table2, num), fieldnum(Table1, num));
qbdsTable2.joinMode(JoinMode::ExistsJoin);
qbrTable1 = qbdsTable1.addRange(fieldnum(Table1, RecId));
qbrTable2 = qbdsTable2.addRange(fieldnum(Table2, RecId));
while select Table3
{
        if(qValueTable1)
         qValueable1 += '||';
                qValueTable1 += strFmt('(%1.Type=="%2")', qbdsTable1.name(), Table3.Type);
}  
while select Table4
{
 if(qValueTable2)
         qValueTable2 += '||';
                qValueTable2 += strFmt('(%1.Param=="%2")&&(%1.Value=="%3")',
                    qbdsTable2.name(), Table4.Param, Table4.Values);
}
qbrTable2.value(qValueTable2);
qbrTable1.value(qValueTable1);
...
Смого главного добиться не знаю как.

Последний раз редактировалось uchenik; 16.12.2008 в 07:29.
Старый 16.12.2008, 13:30   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Не понял, так что не работает то? Что у вас самое главное, которого не можете добиться? like?
С ним нормально можно работать и в тройке (пример на 3.0 SP3):
X++:
static void ZVVTestJobQuery(Args _args)
{
    QueryBuildDataSource    qbdsIJT;
    QueryBuildRange         qbrIJT;

    Query                   query = New Query();
    QueryRun                queryRun;

    FreeText                rangeValue;

    inventJournalTable      inventJournalTable;
    ;

    qbdsIJT = query.addDataSource(tablenum(inventJournalTable));
    qbdsIJT.addSelectionField(FieldNum(inventJournalTable, JournalNameId));
    qbdsIJT.orderMode(OrderMode::GroupBy);
    qbdsIJT.addSortField(FieldNum(inventJournalTable, JournalNameId));


    qbrIJT =  qbdsIJT.addRange(fieldnum(inventJournalTable, RecId));

    rangeValue = strFmt('(%1.%2 like "%3")&&(%1.%4==%5)'
                       ,qbdsIJT.name()
                       ,FieldStr(inventJournalTable, JournalNameId)
                       ,strFmt("%1%2", "Перенос", '*')
                       ,FieldStr(inventJournalTable, JournalType)
                       ,any2int(InventJournalType::Transfer));

    qbrIJT.value(rangeValue);

    info(qbdsIJT.toString());

    queryRun = New QueryRun(query);

    while (queryRun.next())
    {
        inventJournalTable = queryRun.get(tablenum(inventJournalTable));
        info(inventJournalTable.JournalNameId);
    }
}
Результат:
PHP код:
Сообщение (12:25:42)
SELECT JournalNameId FROM InventJournalTable GROUP BY InventJournalTable.JournalNameId ASC WHERE (((InventJournalTable_1.JournalNameId like "Перенос*")&&(InventJournalTable_1.JournalType==2)))
перенос
перенос сгп 
Или в чём собственно затык, поясните?
__________________
Zhirenkov Vitaly
Старый 16.12.2008, 15:20   #5  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Есть две описанные ДВЕ таблицы, собственно для примера в них есть такие данные:
таблица1
num type
1 пользователь
2 пользователь
3 системный блок

таблица2
num param value
1 Фамилия Иванов
2 Фамилия Иванова
Старый 16.12.2008, 18:20   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Мне без разницы сколько у вас таблиц... я не вижу тут никакой проблемы.
Вы ответьтьте на поставленный вопрос, тогда может будет о чём-то поговорить...
А то пишете какой-то сумбур
Цитата:
Да так и делаю и все вроде работает...
Цитата:
Самого главного добиться не знаю как.
__________________
Zhirenkov Vitaly
Старый 16.12.2008, 20:19   #7  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
На SP2 не работает "Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 42", возможно и мое поэтому же не работает.

Пришлось "раздувать" запрос, предварительно перелопачивая возможные варианты путем select с like.

Последний раз редактировалось uchenik; 16.12.2008 в 21:10.
Старый 16.12.2008, 21:17   #8  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Поиск по форуму Вам в руки. Про ожидаемую скопку рядом с 42, 43, 4**** уже обсуждалось. С синтаксисом у Вас проблемы.
Старый 16.12.2008, 21:35   #9  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Sada, т.е. у ZVV все ок, а у меня нет? (copy/past применял)

Смена like на == все меняет и скобка уже не нужна.

Ну не работает like в нужном разрезе

Последний раз редактировалось uchenik; 16.12.2008 в 21:53.
Старый 17.12.2008, 10:11   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от uchenik Посмотреть сообщение
Sada, т.е. у ZVV все ок, а у меня нет? (copy/past применял)

Смена like на == все меняет и скобка уже не нужна.

Ну не работает like в нужном разрезе
гм... ну возможно и не работает, только зависит это скорее всего не от SP, а от KR.
Проверил на KR2 & KR3 - работает.
У вас вероятно KR1 или вообще нет?
__________________
Zhirenkov Vitaly
Старый 04.03.2009, 15:52   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
На 4.0 SP2 в похожей ситуации такая же ошибка! Кто-нибудь нашёл выход?
Старый 16.03.2009, 16:26   #12  
SIrina is offline
SIrina
Участник
Аватар для SIrina
 
51 / 10 (1) +
Регистрация: 02.03.2007
Аналогичная проблема. Написан простенький джоб, но с == работает, а с LIKE не работает.
Может кто-нибудь решил проблему?

X++:
static void my_Job35(Args _args)
{
    Query       q;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;
    str                     s;

    QueryRun                qr;
    InventDim               inventDim;
    ;

    q    = new Query();
    qbds = q.addDataSource(TableNum(InventDim));

    qbr  = qbds.addRange(fieldNum(InventDim, DataAreaId));
    s    = strFmt('(InventLocationId LIKE "%1")', 'Новый');
    qbr.value(s);

    info(q.dataSourceNo(1).toString());

    qr = new QueryRun(q);
    while (qr.next())
    {
        inventDim = qr.getNo(1);
        info(inventDim.inventLocationId);
        break;
    }

}
Старый 16.03.2009, 17:07   #13  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Была проблема с like. Решил её так:
X++:
    QueryBuildDataSource    qbdsIJT;
    QueryBuildRange         qbrIJT;

    Query                   query = New Query();
    QueryRun                queryRun;

    FreeText                rangeValue;

    Dimensions              dimensions;
    ;

    qbdsIJT = query.addDataSource(TableNum(Dimensions));
    qbdsIJT.addSelectionField(FieldNum(Dimensions, Description));
    qbdsIJT.addSortField(FieldNum(Dimensions, Description));

    qbrIJT =  qbdsIJT.addRange(FieldNum(Dimensions, Description));

    [B]rangeValue = strFmt("*АХО*, *Складская логистика (РЦ)*");[/B]

    qbrIJT.value(rangeValue);

    info(qbdsIJT.toString());

    queryRun = New QueryRun(query);

    while (queryRun.next())
    {
        dimensions = queryRun.get(tablenum(Dimensions));
        info(dimensions.Description);
    }
Обратите внимание на использование символов "*" (синтаксис) и StrFmt (даже без каких-либо параметров).
Старый 16.03.2009, 17:07   #14  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Extended Range не поддерживает wildcards и соответствующие keywords
поэтому ничего удивительного
Старый 16.03.2009, 18:06   #15  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
но с == работает, а с LIKE не работает.
у меня тоже ваш джоб не работает. К тому же фильтр не на то поле накладываете:
X++:
qbr  = qbds.addRange(fieldNum(InventDim, [B]DataAreaId[/B]));
Попробуйте так:
X++:
static void Job9(Args _args)
{
    Query                   q;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;

    QueryRun                qr;
    InventDim               inventDim;
    ;

    q    = new Query();
    
    qbds = q.addDataSource(TableNum(InventDim));

    // можно еще так
    //global::findOrCreateRange_W(qbds,fieldNum(InventDim, InventLocationId), "Глав*");
 
    qbr = qbds.addRange(fieldnum(InventDim, InventLocationId));
    qbr.value("Глав*");
 
    info(q.dataSourceNo(1).toString());

    qr = new QueryRun(q);
    
    while (qr.next())
    {
        inventDim = qr.get(TableNum(InventDim));
        
        info(inventDim.inventLocationId);
        
        break;
    }
}
Последнее работает отлично.
Старый 16.03.2009, 19:07   #16  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от ZVV Посмотреть сообщение
гм... ну возможно и не работает, только зависит это скорее всего не от SP, а от KR.
Проверил на KR2 & KR3 - работает.
У вас вероятно KR1 или вообще нет?
Еще литералы могут влиять. а с учетом того что для тяжелых запросов ядро в зависимости от настроек конфигурационной утилиты может их само втыкать - очень весело получается.
Старый 17.03.2009, 08:28   #17  
SIrina is offline
SIrina
Участник
Аватар для SIrina
 
51 / 10 (1) +
Регистрация: 02.03.2007
Согласна, что вариант с наложением фильтра на само поле отработает как LIKE.

X++:
    qbr = qbds.addRange(fieldnum(InventDim, InventLocationId));
    qbr.value("Глав*");
Но хотелось бы наложить фильтр на другое поле, например, InventDim.DataAreaId, чтобы воспользоваться более сложным фильтром для поля InventDim.
InventLocationId

Пример
Код:
select InventDim
      where InventDim.InventLocationId LIKE 'Склад1'
          && InventDim.InventLocationId LIKE 'Склад2'
Или я много хочу? Причем обязательно через логическое И?
Старый 17.03.2009, 08:47   #18  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
X++:
    global::findOrCreateRange_W(qbds,fieldNum(Table1, Field2), "Глав*");
     global::findOrCreateRange_W(qbds,fieldNum(Table1, Field3), "Д_*");
это условие И по двум разным полям.
А вот запрос:
X++:
select InventDim
      where InventDim.InventLocationId LIKE 'Склад1'
          && InventDim.InventLocationId LIKE 'Склад2'
по сути ничего не должен выдать, так как противоречит сам себе

И у меня есть подозрение, что на DataAreaId не выйдет наложить фильтр. Записи уже фильтрованы по текущей компании. Тогдв два выхода, переносить таблицу в холдинг, что не есть хорошо. Или использовать changecompany, заполняя временную таблицу и вытягивая данные уже по нее.

Последний раз редактировалось Eldar9x; 17.03.2009 в 08:52.
Старый 17.03.2009, 09:22   #19  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Что-то я не очень понял о чем спор. По-моему вот правильный ответ:

Цитата:
Сообщение от kashperuk Посмотреть сообщение
Extended Range не поддерживает wildcards и соответствующие keywords
поэтому ничего удивительного
Здесь ключевые слова "расширенный фильтр" и "like". Расширенный фильтр like не поддерживает, по крайне мере в 3.0 точно.
Старый 17.03.2009, 09:31   #20  
SIrina is offline
SIrina
Участник
Аватар для SIrina
 
51 / 10 (1) +
Регистрация: 02.03.2007
TO Eldar9x
Range как раз и накладывается на любое поле в таблице, чтобы воспользоваться механизмом фильтров через StrFmt.

X++:
// Add our range
queryBuildRange = dsInventTable.addRange(fieldNum(InventTable, DataAreaId));

queryBuildRange.value(strFmt('((%1.%2 == %3) || ((%1.%2 == %4) && (%1.%5 == %6)))',
    query.dataSourceTable(tableNum(InventTable)).name(), // InventTable %1
    fieldStr(InventTable, ItemType), // ItemType %2
    any2int(ItemType::Service), // %3
    any2int(ItemType::Item), // %4
    fieldStr(InventTable, ItemId), // ItemId %5
    fieldStr(InventItemBarCode, ItemId))); // %6
Взято тут
Но это отдельная тема.

TO Lucky13 и kashperuk Спасибо
Жаль только что не получится так написать...
Теги
query, range, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
передача параметров в запрос while select tolstjak DAX: Программирование 13 15.02.2009 19:39
как сохранить запрос в таблице kitty DAX: Программирование 13 19.11.2007 20:16
Долго отрабатывает запрос по таблице InventItemLocation AlexeyBP DAX: Администрирование 1 30.05.2007 17:33
Запрос к таблице ценовых соглашений igorian DAX: Программирование 3 17.05.2006 18:42
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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