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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.05.2004, 14:38   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Копирование Range по имени (2.5)
Понадобилось мне скопировать набор range из одной таблицы в другую по одноименным полям.
Код, который воспроизводит данный процесс на тестовой формочке:
PHP код:
    Query                   qqn = new Query();
    
QueryBuildDataSource    qbDSqbDSn;
    
DictTable               dictTableSourdictTableDest;
    
FieldId                 fieldId_DestfieldId_Sour;

    
str 100     qv;
    
int         i;
    ;

    
super();

    if(
InventTable_ds.queryRun())
        
InventTable_ds.queryRun().query();
    else
        
InventTable_ds.query();

    
qbDS  q.dataSourceNo(1);
    
qbDSn qn.addDataSource(qbDS.table());

    
dictTableSour = new DictTable(qbDS.table());
    
dictTableDest = new DictTable(qbDSn.table());

    for(
1<= qbDs.rangeCount(); i++)
    {
        
fieldId_Sour qbDS.range(i).field();
        
fieldId_Dest dictTableDest.fieldName2Id(dictTableSour.fieldName(fieldId_Sour));
//        fieldId_Dest = fieldId_Sour;

        
qv qbDS.range(i).value();
        if(
fieldId_Sour && fieldId_Dest)
            
qbDSn.addRange(fieldId_Dest).value(qv);
    }

    
info(qbDS.toString());
    
info(qbDSn.toString()); 
И все работало, пока не попался "хитрый" запрос с несколькими range по одному полю. В результирующем запросе получился OR между этими ограничениями вместо AND из исходного.

Создал тестовый пример - форма с одним DS (InventTable) в init устанавливается фильтр на поле ItemId. При установке пользовательского фильтра на этоже поле и копировании ограничений получаем:
[FIG1]

Кто-то может объяснить такой феномен?
Вложения
Тип файла: xpo xinventtable.xpo (19.4 Кб, 179 просмотров)
Старый 14.05.2004, 15:51   #2  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Ну так все правильно, при добавлении ranges по одному полю они объединяются по ИЛИ (было бы странно, если бы поле имело одновременно 2 значения , а более общие условия можно исключить как избыточные), а по разным полям - по И. Интересно, как ты получил такой исходный запрос с И?
__________________
Андрей.
Старый 14.05.2004, 16:02   #3  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Wamr, извини, только сейчас заметил, что прикреплен пример формы. Теперь увидел, как получается такой запрос...

Но addRange(), тем не менее, работает только так.
__________________
Андрей.
Старый 14.05.2004, 16:08   #4  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Кстати, разные результаты в 2.5 и 3.0!

В 2.5 работает как описано у тебя, а в 3.0 вообще при наложении фильтра остается только 1 range, последний:

SELECT * FROM InventTable WHERE ((ItemId = 10817))
__________________
Андрей.
Старый 14.05.2004, 16:22   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Изначально опубликовано Dron AKA andy
Но addRange(), тем не менее, работает только так.
Тогда покажу тебе фокус
PHP код:
...
    
int         ishift;
    ;
...

    for(
1<= qbDs.rangeCount(); i++)
    {
        
fieldId_Sour qbDS.range(i).field();
        
shift fieldId_Sour 0xFFFF0000;
        
fieldId_Dest dictTableDest.fieldName2Id(dictTableSour.fieldName(fieldId_Sour)) | shift;
... 
Но почему это так я не догоняю.
Старый 14.05.2004, 16:30   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Изначально опубликовано Dron AKA andy
Кстати, разные результаты в 2.5 и 3.0!

В 2.5 работает как описано у тебя, а в 3.0 вообще при наложении фильтра остается только 1 range, последний:

SELECT * FROM InventTable WHERE ((ItemId = 10817))
Это я тоже заметил. Очень неприятная фича.
Например, я из кода установил range со статусом LOCK, потом пользователь установил свой фильтр по томуже полю. В результате юзер не сможет поправить фильтр из стандартной формы фильтрации, так как статус у него сохранился (LOCK).
Или еще. Опять же из кода поставили фильтр, потом пользователь установил свой, теперь у меня нет возможности грохнуть свой и сохранить юзерский.
Старый 14.05.2004, 17:06   #7  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
shift = fieldId_Sour & 0xFFFF0000;
а откуда это взято, не интуитивно же выведено ?

Добавление:
А, понял, все же по info() видно
__________________
Андрей.
Старый 14.05.2004, 17:15   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Опыт - сын ошибок трудных
Методом проб и ошибок.
Раньше часто замечал, что некоторые методы возвращают вместо fieldId значение 0x10000 + fieldId, но закономерности не видел.
В данном случаи range добавленый программно возвращает fieldId, а вот добавленный юзер fieldId "с хвостиком".
И что самое прикольно addRange понимает оба варианта, но воспринимает их как разные поля (т.е. объединяет по AND).
Старый 14.05.2004, 17:20   #9  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Еще вспомнил
В Global есть метод
PHP код:
/*
    Returns the fieldId part of an extended FieldId
    (an extended FieldId is a fieldId including the array index)
*/
static fieldId fieldExt2Id(fieldId fieldExtId)
{
    return (
fieldExtId 0xFFFF);

Что-то он мне напоминает
Старый 14.05.2004, 18:33   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Интересный вывод
PHP код:
static void Job_2(Args _args)
{
    
Query           q;
    
QueryRun        qr;

    
QueryBuildDataSource    qbDS;
    ;

    
= new Query();

    
qbDS q.addDataSource(tableNum(InventTable));
    
qbDS.orderMode(OrderMode::GROUPBY);
    
qbDS.addSelectionField(fieldNum(InventTableRecId), SelectionField::COUNT);

    
qbDS.addRange(fieldNum(InventTableItemId)).value("A..");
    
qbDS.addRange(fieldNum(InventTableItemId)).value("..D");

    
info(qbDS.toString());

    
qr = new QueryRun(q);
    while(
qr.next())
        
info(int2str(qr.getNo(1).RecID));

    
qbDS.clearRanges();
    
qbDS.addRange(fieldNum(InventTableItemId)).value("A..");
    
qbDS.addRange(fieldId2Ext(fieldNum(InventTableItemId), 1)).value("..D");

    
info(qbDS.toString());

    
qr = new QueryRun(q);
    while(
qr.next())
        
info(int2str(qr.getNo(1).RecID));

Причем попытка написать fieldId2Ext(fieldNum(InventTable, ItemId), 2) приводит к ошибке.
Т.е. любое простое поле имеет дублирующий fieldId, как будто поле является первым и единственным элементом массива.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Packing date range values in queries Blog bot DAX Blogs 1 09.11.2007 13:10
axaptafreak: Label for Query Range cannot be modified (still) Blog bot DAX Blogs 2 25.07.2007 10:09
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Fred Shen: Date data type in Query Range Value Expression Blog bot DAX Blogs 0 28.10.2006 16:40

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

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

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