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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.01.2007, 14:37   #1  
PODOL is offline
PODOL
Участник
 
44 / 16 (1) ++
Регистрация: 20.07.2006
снятие данных с GRID
Как доступиться до значений полей уже открывшегося грида ?
датасорс не подходит, т.к. дисплейные методы могут иметь место...
как исследуя treenode...снять данные с грида?
Старый 11.01.2007, 14:44   #2  
Himan is offline
Himan
Участник
Аватар для Himan
 
312 / 12 (1) ++
Регистрация: 07.11.2006
Адрес: Tumen
а не пробовал дисплейный метод пересчитать? Тогда с ДС сдернеш данные
__________________
Рабочий день сокращает жизнь на 8 часов
Старый 11.01.2007, 15:01   #3  
PODOL is offline
PODOL
Участник
 
44 / 16 (1) ++
Регистрация: 20.07.2006
Тогда нужно знать где он тот дисплейный метод..на датасорсе, на таблице...
а это ещё кусок кода, причем не малый...
Давайте разберемся на примере. Я открыл SalesTable (расячеты с клиентами/закупки). Там 3 датасорса (SalesTable, SalesLine, InventDim)...Логично бы сказать что главный датасорс SalesTable, Ну допустим я из X++ выясню какой из датасорсов главный...определю как линкуются другие...А как быть с дисплей методами... В общем все очень сложно как-то... А нельзя ли с грида снять?
Старый 11.01.2007, 15:17   #4  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,999 / 3919 (188) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от PODOL Посмотреть сообщение
Как доступиться до значений полей уже открывшегося грида ?
датасорс не подходит, т.к. дисплейные методы могут иметь место...
Во-первых,

похоже, вы начинаете писать некий "универсальный обработчик".
Я уже говорил, что необходимость в универсальном обработчике возникает, как правило, в тех случаях, когда программист мало знает о предметной области...
Попытка программистов делать "универсальные обработчики" зачастую приводит к тому, что вместо реальных задач клиентов решаются некие программистские задачи (остальным не нужные и не интересные). Так например,...

Во-вторых,
Вместо нормальных дисплейных методов вы будете вынуждены разбираться с типами этих контролов. Так значение строкового контрола читается одним методом, значение даты читается другим методом, значение enum читается третьим методом и т.п. Другими словами при создании вашего "универсального обработчика" вы с удовольствием будете заниматься программисткими задачами, которые мало приблизят вас к решению задачи, потому что...

В-третьих,
при работе с контролами вам придется заниматься вопросами безопасности вручную. Поле, с которым связан контрол может быть запрещено конфигурационным ключом, секьюрити ключом, либо настройками пользователя. Скрытые контролы не рассчитываются и не получают никаких значений. Таким образом, вместо того, чтобы заниматься задачами пользователей, вы будете заниматься обеспечением нескрываемости нужных вам контролов.

Но это еще не все...
В чертвертых,
вы будете бороться со штатным механизмом кэширования.
Почитайте о кэшировании, о свойстве NotInTts.

И это не все.
В пятых,
вы будете материться на штатный механизм проверки измененных данных. Аксапта - многопользовательская система. И данные, введенные в форму перед записью проверяются - "а не изменил ли кто введенные данные?". А считанное из контрола значение может не совпадать с текущим значением в базе...

и т.д.
Там еще много подводных камней...
Не дай бог вы начнете использовать ListView (как это сделано в оборотно-сальдовых ведомостях и в налоговом учете).

В общем, займитесь решением задачи ваших клиентов.
Не тратьте время на интеллектульный онанизм.


ЗЫ: если вы сейчас начнете говорить, что делаете системную утилиту... Пожалуйста не надо. Вам пока лучше воздержаться от создания системных утилит. Приступайте к ним после того, как разберетесь со штатными возможностями ядра.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 11.01.2007, 15:23   #5  
Himan is offline
Himan
Участник
Аватар для Himan
 
312 / 12 (1) ++
Регистрация: 07.11.2006
Адрес: Tumen
Цитата:
Сообщение от PODOL Посмотреть сообщение
Тогда нужно знать где он тот дисплейный метод..на датасорсе, на таблице...
а это ещё кусок кода, причем не малый...
Давайте разберемся на примере. Я открыл SalesTable (расячеты с клиентами/закупки). Там 3 датасорса (SalesTable, SalesLine, InventDim)...Логично бы сказать что главный датасорс SalesTable, Ну допустим я из X++ выясню какой из датасорсов главный...определю как линкуются другие...А как быть с дисплей методами... В общем все очень сложно как-то... А нельзя ли с грида снять?
тебе все поля надо снять или конкретные?
__________________
Рабочий день сокращает жизнь на 8 часов
Старый 11.01.2007, 15:24   #6  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2064 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
2 mazzy: Жестоко, конечно, но по делу.
Только вот не понял в первых двух пунктах многоточия вконце? Это забыл дописать, или надо додумать самому?
Старый 11.01.2007, 15:27   #7  
Himan is offline
Himan
Участник
Аватар для Himan
 
312 / 12 (1) ++
Регистрация: 07.11.2006
Адрес: Tumen
Цитата:
Сообщение от kashperuk Посмотреть сообщение
2 mazzy: Жестоко, конечно, но по делу.
Только вот не понял в первых двух пунктах многоточия вконце? Это забыл дописать, или надо додумать самому?
Мне кожется экономия времени, но могу и ошибаться, примеры могут занять много времени, которое щас стоит денег
__________________
Рабочий день сокращает жизнь на 8 часов
Старый 11.01.2007, 15:43   #8  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,999 / 3919 (188) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Это забыл дописать, или надо додумать самому?
Это переход на следующий пункт читать следует подряд единым текстом.

Пока пиал ответ, столько контраргументов в голову пришло.
Писать полный перечень действительно лениво.

Наличие контраргументов вовсе не означает, что такого никогда делать не надо.
Но такими извращенно-хакерским способам доступа должен пользоваться человек, хорошо изучивший стандартный функционал. ИМХО.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 11.01.2007, 16:18   #9  
PODOL is offline
PODOL
Участник
 
44 / 16 (1) ++
Регистрация: 20.07.2006
я всего лишь хотел узнать...
1. я ещё не начал его писать,..я просто у более опытных интересуюсь по силам ли, вот и всё
2. выбрасыая всё наружу ч-з COM мне не так интересно, что там за тип переменной
3. скрытые контролы меня не интересуют...мне важно, лишь то что видит пользователь...(но проблема серьзная, я об ней не подумал)
4. м-да...
5. мне пофиг...ситуация аналогичная постройке отчета...в данный момент и всё...(после init формы)
Старый 11.01.2007, 16:44   #10  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,869 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Формально снять информацию с грида нельзя, поскольку адресовать можно только поля грида, соответсвуюшие текущей записи (т.е. только активную строку). Именно из-за этого глубокого ограничения российские разработчики использовали ListView там, где они его использовали.
Старый 11.01.2007, 16:55   #11  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,999 / 3919 (188) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от EVGL Посмотреть сообщение
Формально снять информацию с грида нельзя, поскольку адресовать можно только поля грида, соответсвуюшие текущей записи (т.е. только активную строку). Именно из-за этого глубокого ограничения российские разработчики использовали ListView там, где они его использовали.
Правильно, потому что данные нужно хранить в таблицах, а не в свопе клиента (ListView).
То, что российские разработчики использовали ListView там, где они его использовали, является на мой взгляд грубейшей ошибкой. Именно это решение приводит к катастрофичным последствиям для тех, кто внедряет... столько подзатыльников и пинков под зад...
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 11.01.2007, 17:12   #12  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,442 / 150 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
Правильно, потому что данные нужно хранить в таблицах, а не в свопе клиента (ListView).
А если пользователь хочет на закладке формы увидеть что то типа истории продаж в разрезе складов например. А в ходе работы количество складов может изменятся, тогда как эту историю хранить в таблице и выводить в грид????(хранить то можно, но вот вывести....)

Последний раз редактировалось Sada; 11.01.2007 в 17:18.
Старый 11.01.2007, 17:46   #13  
PODOL is offline
PODOL
Участник
 
44 / 16 (1) ++
Регистрация: 20.07.2006
поскольку адресовать можно только поля грида, соответсвуюшие текущей записи (т.е. только активную строку)
а потом двигаться next-om как по датасорсу...так можно?
Старый 11.01.2007, 17:49   #14  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,869 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от PODOL Посмотреть сообщение
поскольку адресовать можно только поля грида, соответсвуюшие текущей записи (т.е. только активную строку)
а потом двигаться next-om как по датасорсу...так можно?
Можно. А теперь прикиньте: не проще ли работать напрямую с таблицей? Определив заодно те display-поля, которые нужны впридачу? В целом согласен с Mazzy.
Старый 11.01.2007, 17:59   #15  
PODOL is offline
PODOL
Участник
 
44 / 16 (1) ++
Регистрация: 20.07.2006
Пасиб за советы!
Тогда так: определю датасорсы, все...(это я уже сделал); список датасорсов(их имен) уже есть...осталось "выбрать" из них главного...думаю это не проблема...
Выяснить где диспл. метод ,а где нет...вроде на этом форуме я где-то видел,..буду смотреть, разбираться...
вопрос: как определить,...но на гриде есть столько то полей....и 2 из них диспленые...
т.е как обратиться к контролу и спросить его... design("design").grid.stringedit ? ....как?
Старый 11.01.2007, 18:10   #16  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,869 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от PODOL Посмотреть сообщение
т.е как обратиться к контролу и спросить его... design("design").grid.stringedit ? ....как?
Обсуждалось не раз. Обращаться можно по номеру или по имени. Design разбирается рекурсивно.
http://www.axforum.info/forums/showthread.php?t=701

Последний раз редактировалось EVGL; 11.01.2007 в 18:17.
Старый 04.09.2008, 19:06   #17  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Некоторым боком сегодня был недалеко от этой темы и набросал небольшой пример. Немного помучался, куда помещать это сообщение - сюда или в свой "блог". Решил всё же сюда, так как здесь уже имеется интересное готовое обсуждение.

Простенький статический метод. Без больших претензий. Построчно выводит в буфер текстовые представления значений (valueStr) контролов грида (со строкой заголовков). Не умеет работать с выделенными строками, но учитывает сортировку, фильтрацию, перестановку и скрытие колонок пользователем. И нумерует строчки - о как! Может быть помещен, например, в Global или аналогичный класс - набор утилит (у меня такой класс называется KKu - я предпочитаю не портить фирменный Global ).

X++:
static TextBuffer gridToBuffer( FormRun _formRun,
                                str     _gridName,
                                str     _separator = '\t')
{
    FormGridControl grid;
    FormControl     control;
    FormDataSource  formDataSource;
    Common          common;

    int             i;
    int             row;
    str             lineToBuffer;
    TextBuffer      textBuffer = new TextBuffer();
    ;

    grid = _formRun.design().controlName(_gridName);

    // заголовки колонок (label) -> вывод в буфер
    lineToBuffer = strfmt('%1%2', 'Row', _separator);
    for (i=1; i<=grid.controlCount(); i++)
    {
        control = grid.controlNum(i);
        if (control.isDisplayed())
        {
            lineToBuffer += strFmt('%1%2', control.labelText(), _separator);
        }
    }
    lineToBuffer = subStr( lineToBuffer, 1, strLen(lineToBuffer)-strLen(_separator) );
    textBuffer.appendText( lineToBuffer + '\n' );

    // ищем датасорс грида
    for (i=1; i<=_formRun.dataSourceCount(); i++)
    {
        if (_formRun.dataSource(i).id() == grid.dataSource())
        {
            formDataSource = _formRun.dataSource(i);
            break;
        }
    }

    // неявный цикл по строкам грида (явный - по датасорсу)
    row = 0;
    for ( common = formDataSource.getFirst() ? formDataSource.getFirst() : formDataSource.cursor();
          common ;
          common = formDataSource.getNext() )
    {
        row++;

        if (row==1)
        {
            formDataSource.first();
        }
        else
        {
            formDataSource.next();
        }

        // очередная строка -> вывод в буфер
        lineToBuffer = strFmt('%1%2', row, _separator);
        for (i=1; i<=grid.controlCount(); i++)
        {
            control = grid.controlNum(i);
            if (control.isDisplayed())
            {
                lineToBuffer += strFmt('%1%2',
                    strReplace(strReplace( control.valueStr(), '\n',' '), '\r',' '), _separator);
            }
        }
        lineToBuffer = subStr( lineToBuffer, 1, strLen(lineToBuffer)-strLen(_separator) );
        textBuffer.appendText( lineToBuffer + '\n' );
    }

    return textBuffer;
}
Для тестирования вызов метода можно повесить на какое-нибудь событие для грида. Мне нравится двойной щелчок - mouseDblClick. И русская форма "Основные средства" (RAssetTable), грид на первой вкладке "Обзор".
X++:
public int mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
{
    int ret;

    ret = super(_x, _y, _button, _Ctrl, _Shift);

    KKu::gridToBuffer(element, 'Grid').toClipboard();

    return ret;
}
Щелкать надо либо по строке слева (по серому квадратику полосы выделения), либо по сетке между ячейками (указатель при этом не меняет форму). Перед щелчком по сетке указатель мыши надо либо подвести к вертикальной линии между соседними ячейками в строке так, чтобы он сливался с этой линией, либо навести указатель на горизонтальную линию сетки между соседними строками так, чтобы эта линия делила указатель примерно пополам. Не следует щелкать по самим ячейкам - это зона ответственности mouseDblClick того контрола, по которому произведен щелчок, и до грида этот щелчок не дойдет.

После двойного щелчка и наблюдения за тем, как пробежит вниз бегунок вертикальной полосы прокрутки, можно перейти в Excel и выполнить вставку. Если у вас очень много основных средств, желательно сначала наложить фильтр, чтобы в рамках эксперимента разумно ограничить количество строк в буфере.
Старый 08.09.2009, 16:18   #18  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Цитата:
Сообщение от Gustav Посмотреть сообщение
Простенький статический метод. Без больших претензий. Построчно выводит в буфер текстовые представления значений (valueStr) контролов грида (со строкой заголовков). Не умеет работать с выделенными строками, но учитывает сортировку, фильтрацию, перестановку и скрытие колонок пользователем. И нумерует строчки - о как! Может быть помещен, например, в Global или аналогичный класс - набор утилит (у меня такой класс называется KKu - я предпочитаю не портить фирменный Global ).
Если не возражаете доработал немного метод, т.к. он не учитывает контролы, которые "под" FormGroupControl в гриде:

X++:
static TextBuffer gridToBuffer( FormRun _formRun,
                                str     _gridName,
                                str     _separator = '\t')
{
    FormGridControl grid;
    FormControl     control;
    FormDataSource  formDataSource;
    Common          common;

    int             i;
    int             row;
    str             lineToBuffer;
    TextBuffer      textBuffer = new TextBuffer();

    //+ для работы с FormGroupControl в гриде
    FormGroupControl    groupCtrl;
    FormControl         controlGrp;
    int             j;
    //- для работы с FormGroupControl в гриде
    ;

    grid = _formRun.design().controlName(_gridName);

    // заголовки колонок (label) -> вывод в буфер
    lineToBuffer = strfmt('%1%2', 'Row', _separator);
    for (i=1; i<=grid.controlCount(); i++)
    {
        control = grid.controlNum(i);
        //+ для работы с FormGroupControl в гриде
        if(classIdGet(control) == classnum(FormGroupControl))
        {
            groupCtrl = control;
            if(groupCtrl.isVisible())
            {
                for(j=1; j<=groupCtrl.controlCount(); j++)
                {
                    controlGrp = groupCtrl.controlNum(j);
                    if (controlGrp.isDisplayed())
                    {
                        lineToBuffer += strFmt('%1%2', controlGrp.labelText(), _separator);
                    }
                }
            }
        }
        else
        //- для работы с FormGroupControl в гриде
            if (control.isDisplayed())
            {
                lineToBuffer += strFmt('%1%2', control.labelText(), _separator);
            }
    }
    lineToBuffer = subStr( lineToBuffer, 1, strLen(lineToBuffer)-strLen(_separator) );
    textBuffer.appendText( lineToBuffer + '\n' );

    // ищем датасорс грида
    for (i=1; i<=_formRun.dataSourceCount(); i++)
    {
        if (_formRun.dataSource(i).id() == grid.dataSource())
        {
            formDataSource = _formRun.dataSource(i);
            break;
        }
    }

    // неявный цикл по строкам грида (явный - по датасорсу)
    row = 0;
    for ( common = formDataSource.getFirst() ? formDataSource.getFirst() : formDataSource.cursor();
          common ;
          common = formDataSource.getNext() )
    {
        row++;

        if (row==1)
        {
            formDataSource.first();
        }
        else
        {
            formDataSource.next();
        }

        // очередная строка -> вывод в буфер
        lineToBuffer = strFmt('%1%2', row, _separator);
        for (i=1; i<=grid.controlCount(); i++)
        {
            control = grid.controlNum(i);
            //+ для работы с FormGroupControl в гриде
            if(classIdGet(control) == classnum(FormGroupControl))
            {
                groupCtrl = control;
                if(groupCtrl.isVisible())
                {
                    for(j=1; j<=groupCtrl.controlCount(); j++)
                    {
                        controlGrp = groupCtrl.controlNum(j);
                        if (controlGrp.isDisplayed())
                        {
                            lineToBuffer += strFmt('%1%2',
                                strReplace(strReplace( controlGrp.valueStr(), '\n',' '), '\r',' '), _separator);
                        }
                    }
                }
            }
            else
            //- для работы с FormGroupControl в гриде
                if (control.isDisplayed())
                {
                    lineToBuffer += strFmt('%1%2',
                        strReplace(strReplace( control.valueStr(), '\n',' '), '\r',' '), _separator);
                }
        }
        lineToBuffer = subStr( lineToBuffer, 1, strLen(lineToBuffer)-strLen(_separator) );
        textBuffer.appendText( lineToBuffer + '\n' );
    }

    return textBuffer;
}
За это сообщение автора поблагодарили: Gustav (7).
Старый 09.09.2009, 14:21   #19  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
537 / 245 (10) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Вообще, интересно было бы узнать, что топикстартер хочет "замутить"? И что за форма, своя собственная, или уже кем-то сделанная? Почему нужны данные с грида, а не из таблицы, данные которой отображает грид?
Цитата:
Сообщение от PODOL Посмотреть сообщение
как исследуя treenode...снять данные с грида?
Возможно, вам помогут в этом классы xFormTree или CCFormTreeDatasource (от этого класса лучше сделать наследника).
__________________
Незаменимых людей нет. Но и в отпуск мы тебя не отпустим. © Начальник

Последний раз редактировалось dech; 09.09.2009 в 14:24.
Теги
grid

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Filter-by-Grid Blog bot DAX Blogs 2 30.05.2012 13:39
Невозможно выполнить команду языка определения данных в () iHomer13 DAX: Программирование 8 18.07.2008 10:56
Dynamics AX: DAX 4.0 Filter by Grid [Update] Blog bot DAX Blogs 0 27.04.2007 17:10
Изменение свойств Grid с помощью метода источника данных displayOption Anton Sk. DAX: База знаний и проекты 0 03.12.2001 18:08
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:54.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.