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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.04.2013, 12:34   #21  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Чего прям все сразу, в одной строке? LIKE так не умеет.

Так умеет QueryBuildRange
Почему-то так и думал. Печально. Получается нужно весь запрос перестраивать с нуля(

А самое интересное, что даже если в переменной строковой 1 значение - условие всё равно не отрабатывает...
Пробовал построить qeury на 5 источников - не ахти получилось, если честно... Учитывая, что каждый источник связан с предыдущим по своим связям, которые через relations(true) не активируешь, делал их через addLink , не сработало.

А если разбить пришедшую строку на элементы в контейнер и сравнивать элементы контейнера? Возможно бред написал, но пришла в голову такая мысль

Последний раз редактировалось user_ax; 15.04.2013 в 12:36.
Старый 15.04.2013, 12:55   #22  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Брр... чего-то вы далеко куда-то полезли.

Вам просто нужно реализовать это условие не через один LIKE, а через несколько через ИЛИ.

Цитата:
Сообщение от user_ax Посмотреть сообщение
А самое интересное, что даже если в переменной строковой 1 значение - условие всё равно не отрабатывает...
Странно. А дополнительных символов никаких не оставили в условии? Никакие дополнительные символы (типа скобок) не нужны.

Последний раз редактировалось S.Kuskov; 15.04.2013 в 12:58.
Старый 15.04.2013, 13:20   #23  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Брр... чего-то вы далеко куда-то полезли.

Вам просто нужно реализовать это условие не через один LIKE, а через несколько через ИЛИ.


Странно. А дополнительных символов никаких не оставили в условии? Никакие дополнительные символы (типа скобок) не нужны.
Куда посоветовали, туда и попытался полезть))

В смысле через несколько или ? В смысле?)

Строка имеет такой вид

X++:
<"Отдел продаж трансф.", "БП", "ДЗАТ", "ДЗБВА", "ДЗЕА", "РФ", "СРАЗ", "УБМ">
Если выбрать одно поле то

X++:
<"БП.">
Старый 15.04.2013, 13:28   #24  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
попробуйте просто
X++:
like "БП"
без угловых скобок и лишних кавычек. Откуда вообще вы взяли эти <>?

Кстати а вам точно нужно сравнение по маске? Или возможно подойдёт равенство? Если вы хотите выбрать данные которые содержат подстроку "БП" тогда нужно
X++:
like "*БП*"
Старый 15.04.2013, 13:33   #25  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
попробуйте просто
X++:
like "БП"
без угловых скобок и лишних кавычек. Откуда вообще вы взяли эти <>?

Кстати а вам точно нужно сравнение по маске? Или возможно подойдёт равенство? Если вы хотите выбрать данные которые содержат подстроку "БП" тогда нужно
X++:
like "*БП*"
Нет, вы не поняли. Поле smmSalesUnitid у меня берётся из выпадающего списка диалога(дерево). Мне посоветовали его раскрывать через list, что я и сделал и он мне в зависимости от выбранного элемента выбирает все дочерние по отношению к выбранному. Мне нужно пробегаться каждый раз по всем дочерним элементам, если таковы существуют и выбирать все строки, в которых есть один из дочерних элементов.

Кавычки эти беруться из List насколько я понимаю, он их обрамляет в них.

А лист я сделал для того, чтобы если будут добавлены ещё ветки, чтобы не переписывать запрос.
Старый 15.04.2013, 13:44   #26  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Нет, вы не поняли...
И сейчас не понимаю. Зачем смешивать в одно формирование списка и формирование запроса? Запрос не может работать со списком как есть. Для запроса данные нужно преобразовать. Как минимум убрать угловые скобки <>
Старый 15.04.2013, 13:53   #27  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
И сейчас не понимаю. Зачем смешивать в одно формирование списка и формирование запроса? Запрос не может работать со списком как есть. Для запроса данные нужно преобразовать. Как минимум убрать угловые скобки <>
Формирование списка у меня идёт отдельным методом, который присваивается строковой переменной, которая потом используется в запросе.

Я так понимаю нужно их итерировать(ListIterator) для разбития и корректного отображения ?
Старый 15.04.2013, 15:14   #28  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
У-у-ух... Чего-то вы замудрили... запутался пока читал...
В каком виде Вам необходимо представить это все в Excel? Если в виде дерева с корнем выбранного Вами узла? Метод, который рекурсивно будет вызвывать сам себя в каждом узле - параллельно выводя все необходимые данные в Excel в случае их обнаружения. То есть их можно и не собирать в Листы и Мапы - если вывод будет производится сразу.
Например:
X++:
public void WildRunning(str NameNode)
{
     Table  TableLocal;
      ;
      select while TableLocal where TableLocal.ParentNodeId == NameNode
      {
           ... //вывод в Excel
           this.WildRunnig(TableLocal.NameNode);
      }
}
На первом входе скормить имя вашего узла...
Старый 15.04.2013, 15:38   #29  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от LeonDerCom Посмотреть сообщение
У-у-ух... Чего-то вы замудрили... запутался пока читал...
В каком виде Вам необходимо представить это все в Excel? Если в виде дерева с корнем выбранного Вами узла? Метод, который рекурсивно будет вызвывать сам себя в каждом узле - параллельно выводя все необходимые данные в Excel в случае их обнаружения. То есть их можно и не собирать в Листы и Мапы - если вывод будет производится сразу.
На первом входе скормить имя вашего узла...

Да, с объяснениями туговато, согласен.

Нет, не в виде дерева. Поле Отдел продаж - это дерево. Нужно выдать в отчёт те строки, в которых есть дочерний элемент данного дерева в зависимости от выбранного в нём элемента. там 3 уровня, если выбран второй уровень, у него есть подуровни. И если выбран 2 уровень, нужно вывести в отчёт все строки, в которых есть 3 подуровень.

То есть, если выбрать БП - в отчёт попадут только строки, salesunitid в которых равен БП, а если выбрать Отдел продаж, в который входят БП,РФ, и т.д., то в отчёт попадут строки, salesunitid которых равен БП, РФ и т.д.

Надеюсь боеле понятно объяснил.
Старый 15.04.2013, 16:23   #30  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Разобьём задачу на две
1) определить список отделов для фильтрации
2) задать фильтр по списку отделов

С первым пунктом я так понял вы справились.


По второму пункту есть несколько решений:
- использовать класс Query. Он поддерживает условие по списку значений. Хороший способ если список отделов не слишком велик.
- использовать временную таблицу. Вместо фильтра по выбранным отделам сделать цикл по выбранным отделам. Результат поместить во временную таблицу, которую использовать для вывода отчёта. Если у вас уже используется временная таблица, то так возможно будет даже проще.
- использовать вспомогательную постоянную таблицу. Поместить список отделов во вспомогательную таблицу. Присоеденить эту таблицу к источнику данных с целью его фильтрации. Хороший способ если число отделов велико. Выборка произвольных записей одним запросом
За это сообщение автора поблагодарили: user_ax (1).
Старый 15.04.2013, 16:36   #31  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
user_ax
Теперь понятно. То что необходимо сделать для дерева - Вам подсказал plumbum. Далее ListIterator (поскольку у Вас все подразделения загоняются в List) - и вот уже то, что возвращает ListIterator гоним в запрос.
X++:
ListIterator   Liter = new ListIterator('Ваш полученный лист');
String50 ( Ex. Type -      )   lValue;
;
while (Liter.more())
{
     lValue = Liter.value();
     while select Table where Table.Field like +'*'+lValue+'*'
//   while select Table where Table.Field == lValue
     {
     ...//делаем что нужно
     }
     Liter.next();
}

Последний раз редактировалось LeonDerCom; 15.04.2013 в 17:02. Причина: Очепятки + добавил случайно удаленную строчку=((
За это сообщение автора поблагодарили: user_ax (1).
Старый 15.04.2013, 16:43   #32  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Разобьём задачу на две
1) определить список отделов для фильтрации
2) задать фильтр по списку отделов

С первым пунктом я так понял вы справились.


По второму пункту есть несколько решений:
- использовать класс Query. Он поддерживает условие по списку значений. Хороший способ если список отделов не слишком велик.
- использовать временную таблицу. Вместо фильтра по выбранным отделам сделать цикл по выбранным отделам. Результат поместить во временную таблицу, которую использовать для вывода отчёта. Если у вас уже используется временная таблица, то так возможно будет даже проще.
- использовать вспомогательную постоянную таблицу. Поместить список отделов во вспомогательную таблицу. Присоеденить эту таблицу к источнику данных с целью его фильтрации. Хороший способ если число отделов велико. Выборка произвольных записей одним запросом
Я взял Query, подсоединил верно(подсказали опытные товарищи), теперь добавляю сортировочку.

Цитата:
Сообщение от LeonDerCom Посмотреть сообщение
user_ax
Теперь понятно. То что необходимо сделать для дерева - Вам подсказал plumbum. Далее ListIterator (поскольку у Вас все подразделения загоняются в List) - и вот уже то, что возвращает ListIterator гоним в запрос.
X++:
ListIterator   Lier = new ListIterator('Ваш полученный лист');
String50 ( Ex. Type -      )   lValue;
;
while (Liter.more())
{
     while select Table where Table.Field like +'*'+lValue+'*'
//   while select Table where Table.Field == lValue
     {
     ...//делаем что нужно
     }
     Liter.next();
}
То есть в итератор заключить мой запрос ? У меня идёт мой запрос и сразу идёт построение отчёта в excel, будет ли это корректно ?
Старый 15.04.2013, 17:04   #33  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
Вы получили список дочерних подразделений и записали их в Лист - так вот вытягнивайте с помощью Итератора поочередно элементы Листа и кидайте их в запрос.
По поводу Excel - почему нет?
Старый 15.04.2013, 17:20   #34  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от LeonDerCom Посмотреть сообщение
Вы получили список дочерних подразделений и записали их в Лист - так вот вытягнивайте с помощью Итератора поочередно элементы Листа и кидайте их в запрос.
По поводу Excel - почему нет?
Ваш способ конечно очень привлекателен, но , допустим у меня будет сортировка по необходимым мне полям, а есди делать через listiterator, он возьмёт первое значение из листа, выберет все строки согласно нему, возьмёт второе , выберет все строки согласно второму, при этом заданная мною группировка не будет учитываться уже...
Но попробую в любом случае
Старый 15.04.2013, 23:40   #35  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
Можно в запросе сортировать и загружать в Лист. Можно загружать в контейнер и сортировать там следующим алгоритмиком.
X++:
    container       cList;
    str             sBufi, sBufj;
    int             i,j;
    ;
//данные загрузили в cList
    i=1;
    while (i<=conlen(cList))
    {
        j=1;
        while (j<=conlen(cList))
        {
            sBufi = conpeek(cList, i);
            sBufj = conpeek(cList, j);
            if (sBufi<sBufj)
            {
                cList = condel(cList, i, 1);
                cList = conins(cList, i, sBufj);
                cList = condel(cList, j, 1);
                cList = conins(cList, j, sBufi);
            }
            j++;
        }
        i++;
    }
    conview(cList);
Можно выгрузить в Массив и аналогично. И т.д. Возможностей куча - придумать свое не проблема.
Старый 16.04.2013, 08:06   #36  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от LeonDerCom Посмотреть сообщение
Возможностей куча - придумать свое не проблема.
LeonDerCom, проблема возникает когда в отчёте не нужно разбивать данные по каждому отделу (а фильтровать надо). Ну т.е. например данные в выбранных отделах нужно сгрупировать по какой-нибудь финансовой аналитике. В этом случае для вывода каждой строки отчёта мы должны агрегировать данные по всем отделам сразу. В случае пошагового обхода отделов нам прийдётся либо сохранять предварительные данные во временную таблицу либо в ещё какой-нибудь промежуточный буфер. Если же сделать запрос по данным сразу с нужной группировкой, то промежуточный буфер не понадобится, но в таком случае неообходимо будет в запросе задать фильтр только по нужным отделам.
Старый 16.04.2013, 09:21   #37  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от user_ax Посмотреть сообщение
Ваш способ конечно очень привлекателен, но , допустим у меня будет сортировка по необходимым мне полям, а есди делать через listiterator, он возьмёт первое значение из листа, выберет все строки согласно нему, возьмёт второе , выберет все строки согласно второму, при этом заданная мною группировка не будет учитываться уже...
Но попробую в любом случае
Если вам нужна сортировка, попробуйте через класс RecordSortedList. В своем запросе, построенном на основе классов QueryBuild*, используйте метод QueryBuildRange.value(). В него нужно передать строку, в которой через запятую должны стоять все ваши значения из списка RecordSortedList.
X++:
static void Job45(Args _args)
{
    SMMSalesUnitId      salesUnitId;
    RecordSortedList    salesUnitList = new RecordSortedList(tablenum(SMMSalesUnit));
    SMMSalesUnit        su;
    boolean             x;

    void getChildSalesUnit(SMMSalesUnitId _salesUnitIdParent)
    {
        SMMSalesUnit    salesUnit;
        ;

        //Add current sales unit to list
        salesUnit = SMMSalesUnit::find(_salesUnitIdParent);
        salesUnitList.ins(salesUnit);

        //Check for child records
        select count(RecId) from salesUnit
            where salesUnit.ParentId == _salesUnitIdParent;

        if (salesUnit.RecId != 0)
        {
            //Go through child records and call recurent function
            while select SalesUnitId from salesUnit
                where salesUnit.ParentId == _salesUnitIdParent
            {
                getChildSalesUnit(salesUnit.SalesUnitId);
            }
        }
    }
    ;
    
    salesUnitId = "Отдел продаж трансф.";
    salesUnitList.sortOrder(fieldnum(SMMSalesUnit, SalesUnitId));
    getChildSalesUnit(salesUnitId);
    for (x = salesUnitList.first(su); x; x = salesUnitList.next(su))
    {
        print su.SalesUnitId;
    }
    pause;
}
__________________
// no comments

Последний раз редактировалось dech; 16.04.2013 в 09:35.
Старый 16.04.2013, 09:34   #38  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
S.Kuskov
Угу, об этом и говорю.
Проще использовать временную таблицу - удобней заносить данные и пользоваться уже привычными запросами. Можно создать двумерный массив из контейнеров и уже группировать и фильтровать данные проходя по нему. Можно двумерный массив из обычных. И все же вариантов куча.
X++:
    container       cList, cListLine, cListLineBuf;
    int             sBufi, sBufj;
    int             i,j, iLength;
    ;
    cListLine = ['Яблоки, кг','Груши, кг','Сливы, кг','Батон, 1 шт'];
    cList = conins(cList, 1, cListLine);
    cListLine = [20,40,90,30];
    cList = conins(cList, 2, cListLine);
    cListLine = [13,55,85,25];
    cList = conins(cList, 2, cListLine);
    cListLine = [05,100,100,100];
    cList = conins(cList, 2, cListLine);
    cListLine = [25,19,13,15];
    cList = conins(cList, 2, cListLine);
    cListLine = [12,10,55,1000];
    cList = conins(cList, 2, cListLine);
    i = 3;
    while (i<=conlen(cList))
    {
        j=1;
        while (j<=conlen(cList))
        {
            cListLine = conpeek(cList, i);
            cListLineBuf = conpeek(cList, j);

            sBufi = conpeek(cListLine, 1);
            sBufj = conpeek(cListLineBuf, 1);
            if (sBufi<sBufj)
            {
                cList = condel(cList, i, 1);
                cList = conins(cList, i, cListLineBuf);
                cList = condel(cList, j, 1);
                cList = conins(cList, j, cListLine);
            }
            j++;
        }
        i++;
    }
    i = 1;
    while (i<=conlen(cList))
    {
        cListLine = conpeek(cList, i);

        sBufi = conpeek(cListLine, 1);
        sBufj = conpeek(cListLine, 4);
        if (sBufi<21 && sBufj<101)
            {
                if (i==1)
                { info('<'+conpeek(cListLine, 1)+'> <'+conpeek(cListLine, 2)+'> <'+conpeek(cListLine, 3)+'> <'+conpeek(cListLine, 4)+'>'); }
                else
                { info('<'+int2Str(conpeek(cListLine, 1))+'> <'+int2Str(conpeek(cListLine, 2))+'> <'+int2Str(conpeek(cListLine, 3))+'> <'+int2Str(conpeek(cListLine, 4))+'>'); }
            }
        i++;
    }
Старый 16.04.2013, 10:00   #39  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от LeonDerCom Посмотреть сообщение
Можно создать двумерный массив из контейнеров и уже группировать и фильтровать данные проходя по нему. Можно двумерный массив из обычных.
Простите, но это уже извращение. Контейнер подходит только чтобы хранить в одном месте данные разных типов. Для сортировки, фильтрации и группировки есть другие способы. Например, RecordSortedList - оптимальное решение для сортировки. Сюда же подойдет и Map в принципе.
__________________
// no comments
Старый 16.04.2013, 11:16   #40  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
dech
Извращение или нет - дело привычки. Хранит он разные типы данных, вот и воспользовался его всеядностью, а сортировка - так и для других классов писали методы сортировок и т.д., почему мне нельзя написать свой удобный способ для определенных частных случаев (а если универсален, так можно и классом отдельным оформить)?
Теги
tree, дерево, построение дерева, раскрытие

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить метки всех элементов всех форм (DAX 4) Qaz Qwerty DAX: Программирование 1 09.08.2008 05:39
Как поменять порядок элементов в Tree Lucky13 DAX: Программирование 3 16.02.2007 14:29
Tree. Проблема с data() alexbn DAX: Программирование 2 03.11.2005 14:39
Как работать с tree? Oz DAX: Программирование 3 23.08.2002 12:36
Динамическое добавление элементов в отчет Maxim Gorbunov DAX: База знаний и проекты 1 17.01.2002 14:48

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

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

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