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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.08.2013, 18:48   #1  
kit22 is offline
kit22
Участник
 
30 / 12 (1) ++
Регистрация: 15.08.2012
Сравнение Query.pack()
Здравствуйте!
Есть таблица, где есть поле типа контейнер.
Туда я пишу query.pack().

Мне надо узнать, есть ли уже в этом поле данный запрос. Как это сделать?

X++:
void compareFunc(container _packedQuery)
{
   ;
   for (i = 1; i<= conpeek(this.ContainerField); i++)
  {
     if (conPeek(this.containerField, i) == conpeek(_packedQuery, 1))
     {
         info("");
     }
  }
}
Пробовал так, но падает что типы сравнения несовместимы.
Старый 10.08.2013, 00:47   #2  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Добрый вечер!

myQueryTable - таблица с полем типа контейнер.

У меня следующий джоб сравнивает верно:
X++:
static void Job30(Args _args)
{
    // Таблица, содержащая контейнер запроса AssetTable
    QueryTable  myQueryTable;

    // AssetTable - Эквивалентны
    container   packedQuery = new Query(querystr(AssetTable)).pack();

    // AxdAddress - неэквивалентны
    // container   packedQuery = new Query(querystr(AxdAddress)).pack();
    ;

    // Наполнил исходными данными
    /*
    QueryTable.QueryCon = (new Query(querystr(AssetTable)).pack());
    QueryTable.write();
    */

    select firstonly myQueryTable;

    // Сравниваю
    if (myQueryTable.QueryCon == packedQuery)
    {
        info("Equal");
    }
}

Последний раз редактировалось Cardagant; 10.08.2013 в 01:15.
Старый 10.08.2013, 23:10   #3  
kit22 is offline
kit22
Участник
 
30 / 12 (1) ++
Регистрация: 15.08.2012
Добрый! Дело в том, что у меня в этом поле может храниться много query.pack(). Заполнение поля идет следующим образом

X++:
 this.containerField += query.pack()
То есть мне надо узнать, есть ли в этом поле уже данный запрос, а в поле, например, хранится уже 4 query.pack() и пришел новый query.pack(). И мне не надо записывать query.pack() в это поле, если он уже есть там.
Старый 10.08.2013, 23:57   #4  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от kit22 Посмотреть сообщение
Добрый! Дело в том, что у меня в этом поле может храниться много query.pack(). Заполнение поля идет следующим образом

X++:
 this.containerField += query.pack()
То есть мне надо узнать, есть ли в этом поле уже данный запрос, а в поле, например, хранится уже 4 query.pack() и пришел новый query.pack(). И мне не надо записывать query.pack() в это поле, если он уже есть там.
Для проверки данного запроса на наличие в поле таблицы придумал вот такой способ:
X++:
static void EqualQueries(Args _args)
{
    // Таблица, содержащая контейнер запроса AssetTable
    QueryTable  myQueryTable;
    container   containerField;

    // AssetTable - Эквивалентны
    container   packedQuery = new Query(querystr(AssetTable)).pack();

    // AxdAddress - неэквивалентны
    // container   packedQuery = new Query(querystr(AxdAddress)).pack();
    ;

    // Наполнил исходными данными
    /*
    containerField += (new Query(querystr(AssetTable))      .pack());
    containerField += (new Query(querystr(AssetBudgetModel)).pack());
    containerField += (new Query(querystr(AssetProposal))   .pack());
    containerField += (new Query(querystr(AxdExpense))      .pack());

    myQueryTable.QueryCon = containerField;
    myQueryTable.write();
    */

    select firstonly myQueryTable;
    containerField = myQueryTable.QueryCon;

    // Сравниваю
    while (conlen(containerField))
    {
        if (new Query(containerField).pack() == packedQuery)
        {
            info("Equal");
        }

        containerField = condel(containerField, 1, 1);
    }
}

Последний раз редактировалось Cardagant; 11.08.2013 в 00:39.
За это сообщение автора поблагодарили: kit22 (1).
Старый 11.08.2013, 13:35   #5  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
юзайте это

for (i = 1; i <= conlen(con); i++)
{
variable = conpeek(con, i);
}
Старый 11.08.2013, 14:31   #6  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Sada Посмотреть сообщение
юзайте это

for (i = 1; i <= conlen(con); i++)
{
variable = conpeek(con, i);
}
Пробовал, для данного случая вылетает ошибка несовместимости типов присвоения:
"Неправильные типы аргументов в операции присвоения значения переменной."
Старый 11.08.2013, 20:04   #7  
kit22 is offline
kit22
Участник
 
30 / 12 (1) ++
Регистрация: 15.08.2012
Спасибо! Действительно работает, хотя и немного искусственно Но других способов не нашел. Странно, что conpeek падает на сравнение. Видимо, дело в том, что query.pack() пакуется как контейнер с BLOB данными.
Старый 12.08.2013, 09:38   #8  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от kit22 Посмотреть сообщение
Спасибо! Действительно работает, хотя и немного искусственно Но других способов не нашел. Странно, что conpeek падает на сравнение. Видимо, дело в том, что query.pack() пакуется как контейнер с BLOB данными.
Соглашусь, что вполне может быть связано с этим.
Может кто-то предложит более красивый вариант решения данной задачи.
Рад помочь!
Старый 13.08.2013, 11:41   #9  
Мартынов Дмитрий is offline
Мартынов Дмитрий
Участник
 
236 / 66 (3) ++++
Регистрация: 02.02.2004
Адрес: г. Москва
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Соглашусь, что вполне может быть связано с этим.
Может кто-то предложит более красивый вариант решения данной задачи.
Рад помочь!
А как вообще сравнить два query ?
Напрашивается один простой способ:

X++:
if (
query1.dataSourceNo(1).toString() == query2.dataSourceNo(1).toString();
)
Если это сработает - то дальше очевидно распаковываем нужный контейнер в query и сравнить два query.
Теги
ax2009, container, query

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX Sustained Engineering: Servicing of Dynamics AX 2012 and Dynamics AX 2012 Feature Pack Blog bot DAX Blogs 0 08.05.2012 23:12
AIF: OData Query Service Blog bot DAX Blogs 0 24.08.2011 09:11
jinx: Dynamics AX &ndash; Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Сравнение двух полей в Query Lucky13 DAX: Программирование 3 17.08.2005 11:42

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

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

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