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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2009, 15:39   #1  
Alexanderrrr is offline
Alexanderrrr
Участник
Аватар для Alexanderrrr
 
54 / 19 (1) ++
Регистрация: 06.03.2009
Адрес: Саратов
Позиционирование в гриде
Доброго времени суток, уважаемые гуру аксапты!

Не могли бы вы мне помочь в следующем:
имеется форма с тремя датасорсами: RContractTable, ObjectTable, PointAccountTable.
На форме грид, свойство datasourse=RContractTable.

Необходимо было добавить возможность удаления строки/строк из грида, для последующего вывода в отчет только нужных строчек.
Удаление организовал по кнопке; ее метод кликед:
X++:
void clicked()
{
    QueryBuildDatasource    pointTable;
    query q;
    queryBuildRange qbr;
    RContractTable              RContract;
    ObjectTable              object;
    PointAccountTable        pointAccount;
    int c;
    ;

    for (RContract = RContractTable_ds.getFirst(true) ? RContractTable_ds.getFirst(true) : RContractTable_ds.cursor(); RContract; RContract = RContractTable_ds.getNext())
      {
      c++;
      }

    qbr=pointTable.findRange(FieldNum(ICLPointAccountTable,PointAccountId));
    if (qbr)
    {
    for (RContract = RContractTable_ds.getFirst(true) ? RContractTable_ds.getFirst(true) : RContractTable_ds.cursor(); RContract; RContract = RContractTable_ds.getNext())
      {
       object = RContract.joinChild();
       pointAccount = object.joinChild();
    qbr.value(qbr.value()+',!'+pointAccount.PointAccountId);
      }
    }
    else
    {
    if (c==1)
    {
     qbr=pointTable.addRange(FieldNum(ICLPointAccountTable,PointAccountId));
     qbr.value('!'+ICLPointAccountTable.PointAccountId);
      
    }
    else
    {
qbr=pointTable.addRange(FieldNum(ICLPointAccountTable,PointAccountId));
    for (RContract = RContractTable_ds.getFirst(true) ? RContractTable_ds.getFirst(true) : RContractTable_ds.cursor(); RContract; RContract = RContractTable_ds.getNext())
      {
                object = RContract.joinChild();
                pointAccount = object.joinChild();

    qbr.value(qbr.value()+',!'+pointAccount.PointAccountId);
      }
    }
    }
 RContractTable_ds.research();
 }

Работает, как и нужно. Но после research курсор уходит на первую запись в гриде.

На форуме читал похожие темы, но то, что мне нужно не нашел..ведь мне нужно запоминать не позицию выделенной строки, а позицию следующей за ней, поскольку выделенная удаляется.
Не направите ли на путь истинный?

п.с. если было такое на форуме, очень извиняюсь..
__________________
..в каждой программе есть хотя бы одна ошибка..

Последний раз редактировалось Dron AKA andy; 30.09.2009 в 17:53.
Старый 30.09.2009, 16:00   #2  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Alexanderrrr Посмотреть сообщение
Доброго времени суток, уважаемые гуру аксапты!
Необходимо было добавить возможность удаления строки/строк из грида, для последующего вывода в отчет только нужных строчек....
Вы выбрали неправильное решение для поставленной задачи. Добавьте в грид галочку и отмечайте те строчки без которых нужно выводить на печать.
Старый 30.09.2009, 16:16   #3  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Попробуйте вслед за циклом, внутри которого удаляются строки прописать:
RContractTable_ds.next();

Должны на следующую строчку перескочить
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 30.09.2009, 16:19   #4  
Alexanderrrr is offline
Alexanderrrr
Участник
Аватар для Alexanderrrr
 
54 / 19 (1) ++
Регистрация: 06.03.2009
Адрес: Саратов
Цитата:
Вы выбрали неправильное решение для поставленной задачи. Добавьте в грид галочку и отмечайте те строчки без которых нужно выводить на печать.
все же юзеру было так удобнее, с кнопочкой для удаления..юзер еще в экслель данные копирует из грида, так что так пришлось..
неужели нет решения?
__________________
..в каждой программе есть хотя бы одна ошибка..
Старый 30.09.2009, 16:22   #5  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Alexanderrrr Посмотреть сообщение
все же юзеру было так удобнее, с кнопочкой для удаления..юзер еще в экслель данные копирует из грида, так что так пришлось..
неужели нет решения?
1. Вам известно про ограничение длины строки, которую можно засунуть в QueryBuildRange?
2. Для копирования в excel пускай сделает потом фильтр по галочке и копирует себе на здоровье.
За это сообщение автора поблагодарили: Alexanderrrr (1).
Старый 30.09.2009, 16:24   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Позиционирование на нужную запись - это методы X_ds.findRecord() или X_ds.findValue(). Определяете запись, на которой хотите оказаться и после X_ds.research() выполняете поиск нужной записи одним из этих методов.

Как определить нужную запись? 100% гарантии надежности определения нет. Один из вариантов - это определить последнюю запись выделенного диапазона, перейти к ней, затем выполнить X_ds.next(). Теоретически, должны бы попасть на одну из записей вне диапазона. Но это без гарантий.

Последний раз редактировалось Владимир Максимов; 30.09.2009 в 16:28.
За это сообщение автора поблагодарили: Alexanderrrr (1).
Старый 30.09.2009, 16:31   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Позиционирование на нужную запись - это методы X_ds.findRecord() или X_ds.findValue().
Но помните, что производительность этих методов будет катастрофической, если в гриде будет боль-мень вменяемое количество записей. Например, несколько тысяч...

Не пользуйтесь этими методами на больших таблицах.
__________________
полезное на axForum, github, vk, coub.
Старый 30.09.2009, 17:02   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
а можно и вовсе сделать через временную таблицу.
пускай пользователь удаляет в ней что хочет, а потом копирует в Excel
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.09.2009, 17:25   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
где-то на форуме было исследование как лучше хранить галочки - во временных таблицах, в map, в контейнере или еще как. не могу найти
__________________
полезное на axForum, github, vk, coub.
Старый 30.09.2009, 17:34   #10  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Alexanderrrr когда сообщение пишите на панели есть кнопочка Х++.
Код будет смотрется лучше.
Сейчас он выглядит ужасно.
После
X++:
 c++;
добавьте
X++:
        if (c >= 2)
            break;
Зачем мучить аксапту. Ведь вам интересно есть ли строки и что их больше 1.
А две или 10 вам уже без разницы.
Вот так же красивее.
X++:
void clicked()
{
    QueryBuildDatasource    pointTable;
    query q;
    queryBuildRange qbr;
    RContractTable              RContract;
    ObjectTable              object;
    PointAccountTable        pointAccount;
    int c;
;

    for (RContract = RContractTable_ds.getFirst(true) ? RContractTable_ds.getFirst(true) : RContractTable_ds.cursor(); 
        RContract;
        RContract = RContractTable_ds.getNext())
    {
        c++;
    }

    qbr=pointTable.findRange(FieldNum(ICLPointAccountTable,PointAccountId));
    if (qbr)
    {
        for (RContract = RContractTable_ds.getFirst(true) ? RContractTable_ds.getFirst(true) : RContractTable_ds.cursor(); 
            RContract;
            RContract = RContractTable_ds.getNext())
        {
            object = RContract.joinChild();
            pointAccount = object.joinChild();
            qbr.value(qbr.value()+',!'+pointAccount.PointAccountId);
        }
    }
    else
    {
        if (c==1)
        {
            qbr=pointTable.addRange(FieldNum(ICLPointAccountTable,PointAccountId));
            qbr.value('!'+ICLPointAccountTable.PointAccountId);
        }
        else
        {
            qbr=pointTable.addRange(FieldNum(ICLPointAccountTable,PointAccountId));
            for (RContract = RContractTable_ds.getFirst(true) ? RContractTable_ds.getFirst(true) : RContractTable_ds.cursor(); 
                RContract;
                RContract = RContractTable_ds.getNext())
            {
                object = RContract.joinChild();
                pointAccount = object.joinChild();

                qbr.value(qbr.value()+',!'+pointAccount.PointAccountId);
            }
        }
    }
    RContractTable_ds.research();
}
Раньше, когда я только начинал, ведущий у меня не принимал задачу, если отступления были не там где надо или их не было. Придирался к мелочам.
Но я с ним был согласен. Потом, смотреть как выглядит код когда уже всё готово, стало привычкой.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
За это сообщение автора поблагодарили: Alexanderrrr (1).
Старый 30.09.2009, 17:36   #11  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от mazzy Посмотреть сообщение
где-то на форуме было исследование как лучше хранить галочки - во временных таблицах, в map, в контейнере или еще как. не могу найти
Может это? axaptapedia: Tutorial Form MultiSelectCheckBox
За это сообщение автора поблагодарили: mazzy (1).
Старый 30.09.2009, 17:38   #12  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от mazzy Посмотреть сообщение
где-то на форуме было исследование как лучше хранить галочки - во временных таблицах, в map, в контейнере или еще как. не могу найти
axaptapedia: Tutorial Form MultiSelectCheckBox - находится по ключевым словам 'map', 'скорость'. Там всего три темы получается, в одно из них ссылка на нужную.
За это сообщение автора поблагодарили: mazzy (1).
Старый 30.09.2009, 17:55   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Lucky13, oip, то, что надо. а я на "маркировке" зациклился...

Цитата:
Сообщение от Alexanderrrr Посмотреть сообщение
Необходимо было добавить возможность удаления строки/строк из грида, для последующего вывода в отчет только нужных строчек.
Если вернуться к исходной задаче, то видна большая проблема в самой постановке.
Предположим вы сделали как у вас просят.
Предположим пользователь решил, что строчку в отчет выводить не надо и удалил строчку.
Предположим что где-то в середине процесса пользователь вдруг вспомнил "Ой, а я зря удалил, печатать все ж таки надо".
Как в вашей постановке пользователь сможет вернуть и напечатать строку, которую раньше удалил из грида?

Ответ: никак, только закрыть форму и начать отмечать строки заново

Поэтому в Аксапте используется маркировка галочками для больших таблиц
а для маленьких списков - пара listview.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Alexanderrrr (1).
Старый 01.10.2009, 08:15   #14  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
В дополнение ко всему, переименуйте переменную "с" на "х". И все у вас будет!
__________________
// no comments
Старый 01.10.2009, 08:43   #15  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от dech Посмотреть сообщение
В дополнение ко всему, переименуйте переменную "с" на "х". И все у вас будет!
Почему x? Лучше тогда n.
Но это мне кажется не принципиальным.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 01.10.2009, 13:40   #16  
Alexanderrrr is offline
Alexanderrrr
Участник
Аватар для Alexanderrrr
 
54 / 19 (1) ++
Регистрация: 06.03.2009
Адрес: Саратов
Насоветовали тут))
да, согласен..с постановкой задачи у нас проблемы часто.
да и код написан с недочетами, согласен.
Думаю с галочками будет гораздо проще и проблем меньше
Спасибо всем за помощь!
__________________
..в каждой программе есть хотя бы одна ошибка..
Старый 01.10.2009, 14:07   #17  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
немного офф-топика по ходу...
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
1. Вам известно про ограничение длины строки, которую можно засунуть в QueryBuildRange?
А какое там ограничение?

Я знаю, что есть ограничение EDT Range, которое равно 250 символам и которое срабатывает, если у QueryRun вызывается prompt(), т.е. стандартная форма запроса показывается пользователю. И далее, если пользователь нажмет на OK, но какой-либо критерий (уже неважно, введенный вручную или поданый из кода) будет длинее 250 символов, то возникнет ошибка.

Но, вроде, в коде топикстартера prompt'а нет и в этом случае можно многие тысячи символов поместить в QueryBuildRange и они корректно обработаются. Даже не знаю точно, сколько много. Разве не так?
Старый 01.10.2009, 14:24   #18  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Gustav Посмотреть сообщение
немного офф-топика по ходу...
А какое там ограничение?
Я имел ввиду вот это. Т.е. записать в range можно строку какой угодно длины, а вот насколько корректно она потом преобразуется в запрос... Хотя на новых версиях AX не проверял, может и все хорошо уже.
Старый 01.10.2009, 14:58   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
В Ax 3.0 sp5 kr2 у меня на запрос ругался sql сервер (MS SQL 2005 sp2)

Ругался не на размер where, а на уровень вложености (видно по ссылке _scorp_ в сообщении Владимира Максимова кучу открывающих скобок)

Получалось, что обрабатывалось 477 ограничений, а на 478-м прилетала ошибка от sql.
Причем, этот запрос, перенесенный в Management Studio, в нем вызывал ту же самую ошибку, а при удалении одного из условий корректно возвращал 477 записей.
Так что это ограничение самого MS SQL (по крайней мере, 2005-го). Ну и способа, которым Ax формирует запрос.

Что касается просто ограничения на размер запроса в WHERE, то такого самого по себе нет.
Есть общее ограничение на размер selecta'а
Цитата:
Length of a string containing SQL statements (batch size)
65,536 * Network packet size
65,536 * Network packet size

batch size
The default packet size is 4 kilobytes (KB), and is controlled by the network packet size configuration option
Это для SQL 2005-2008
__________________
Axapta v.3.0 sp5 kr2
Старый 02.10.2009, 17:17   #20  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
небольшой offtop
Цитата:
Сообщение от miklenew Посмотреть сообщение
После
X++:
 c++;
добавьте
X++:
        if (c >= 2)
            break;
Зачем мучить аксапту. Ведь вам интересно есть ли строки и что их больше 1.
А две или 10 вам уже без разницы.
Влезу со своими 5 копейками: в таком случае, чтобы определить помечена 1 или несколько строк в общем то не за чем гонять первый цикл:
X++:
void clicked()
{
    int c;
;
    ...
    for (RContract = RContractTable_ds.getFirst(true) ? RContractTable_ds.getFirst(true) : RContractTable_ds.cursor(); 
        RContract;
        RContract = RContractTable_ds.getNext())
    {
        c++;
    }
    ...
}
факт того что помечено несколько (больше 1) строк можно проанализировать через RContractTable_ds.anyMarked().
__________________
Dynamics AX 4.0 SP2
За это сообщение автора поблагодарили: miklenew (3), Alexanderrrr (1).
Теги
grid, позиционирование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Открытие формы с деталями активной записи в гриде sweeper DAX: Программирование 4 19.09.2008 15:55
Обработка события нажатие клавиши на гриде berlioz DAX: Программирование 17 27.09.2006 09:48
как перечислить все колонки в гриде ? Omeo DAX: Программирование 5 16.06.2004 09:22
Позиционирование при переходе к основной таблице dn DAX: Программирование 2 29.01.2004 18:35
Lookup поля в Гриде NeveB DAX: Программирование 1 10.12.2003 12:18

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

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

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