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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.11.2013, 13:13   #1  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
Запрос по данным полученным с Grid
Добрый день. На форме есть Grid, в нем есть поля, "имя таблицы", "Имя поля" и "ссылка". Необходимо выбрать из указанной таблицы все записи по ссылке. Создал кнопку на форме а дальше ступор, не совсем представляю, что делать. Пробовал следующее:

X++:
void clicked()
{
    
    str  strTableName;
    tableid id;
    str s;



    LedgerTrans LedgerTrans;

    Query query;
    QueryRun qr;
    QueryBuildDataSource qbd;
    QueryBuildRange qbr;
    QueryRun    queryrun    ;
    N_FindVoucher N_FindVoucher;
    str strRecid;


    DictTable dt;
    DictField dictField;
    Dictionary            dictionary;
    tableName         tableName;
    ;

    breakpoint;




   query = new Query();
    // получим id таблицы
    id = sFindVoucher.RefTableId;
    qbd = query.addDataSource(id);


    strRecid = "Recid";

   dt = new DictTable(id);


    tableName = dictionary.tableName(Id);

    qbr = qbd.addRange(FieldNum(sFindVoucher, Recid));
    qbr.value("==" + int2str(sFindVoucher.RefRecId));
    QueryRun = new QueryRun(query);

     while(queryrun.next())
    {
         //вычисления
    }

}
однако на строке qbr = qbd.addRange(FieldNum(sFindVoucher, Recid)); ошибка,что такой таблицы не существует. Опыта разработки в axapta нет, поэтому прошу помоч, как лучше реализовать задачу?
Старый 25.11.2013, 13:25   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от r2d2 Посмотреть сообщение
на строке qbr = qbd.addRange(FieldNum(sFindVoucher, Recid)); ошибка,что такой таблицы не существует.
У вас sFindVoucher - это не имя таблицы, которую вы хотите фильтровать.Вам нужно использовать переменную id, содержащую TableId таблицы, на которую указана ссылка.
X++:
//FieldNum(sFindVoucher, Recid)
fieldname2id(sFindVoucher.RefTableId, 'Recid')

Последний раз редактировалось S.Kuskov; 25.11.2013 в 13:32.
Старый 25.11.2013, 14:38   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Для любой таблицы код поля RecId в ней - постоянен.
Можно смело пользовать
X++:
fieldnum(Common, RecId)
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 26.11.2013, 07:44   #4  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
Всем спасибо за ответы. Еще один небольшой вопрос, данный алгоритм в цикле выполняет запрос к разным таблицам, поэтому при присчваивании результата запроса в переменную происходит ошибка :
X++:
qres = queryrun_.get(id);
Пробовал присваивать null? но не помогло. Как обойти?
Старый 26.11.2013, 08:02   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Какого типа переменная qres?
X++:
Common qres;
Старый 26.11.2013, 08:14   #6  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
теперь Common, спасибо.
Старый 26.11.2013, 09:07   #7  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
теперь выдает синтаксическую ошибку, "Таблица не содержит это поле". Почему возникает ошибка понятно, но как обойти ее?
X++:
common qres;
...
qres = queryrun_.get(id);
...
qres.dimension8 = AccountNum;
Старый 26.11.2013, 09:36   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Как вы определяете нужно вам поле dimension8? У него во всех таблицах будет такое имя? Для обращения к произвольному полю нужно знать его FieldId, и тогда можно будет написать так
X++:
qres.(FieldId)

Получить значение поля по TableId, FieldId, RecId
Старый 26.11.2013, 12:09   #9  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
Нужно именно dimension[8], имя в таблицах одно и то же. Удалось получать данное поле и заполнять переменную, однако в таблице значение не проставляется, что здесь может быть неправильно.
X++:
void clicked()
{

    str  strTableName;
    tableid id;
    str s;



    LedgerTrans LedgerTrans;
    Common              tmpTable;
    Query query;
    QueryRun qr;
    QueryBuildDataSource qbd;
    QueryBuildRange qbr;
    QueryRun    queryrun_    ;
    Common qres, myanytype;
    N_FindVoucher N_FindVoucher;
    int64 recId;
    str strRecid;
    fieldId fieldid,accnameid;
    anyType ret,accname;


    DictTable dt;
    DictField dictField;

    //N_FindVoucher sFindVoucher;

    Dictionary            dictionary;

    tableName         tableName;
    VendTable    VendTable;
    //enum    type;
    ;

    breakpoint;

    //получим вставляемые данные
    Select firstonly  VendTable
                WHERE VendTable.AccountNum == "ПСчП002642";
    if (VendTable.AccountNum)

    {
         while Select sFindVoucher
            {
               query = new Query();
                // получим id таблицы
                //id = tableName2Id(strTableName);
                //передадим id в запрос
                id = sFindVoucher.RefTableId;
                qbd = query.addDataSource(id);
                qbd.update(true);
                //strRecid = "Recid";
                recId = fieldname2id(id, 'RecId');
                qbr = qbd.addRange(recId);
                qbr.value(int642Str(sFindVoucher.RefRecId));

                QueryRun_ = new QueryRun(query);
               // QueryRun.prompt();


                 while(queryrun_.next())
                {
                    //qres = typeId2ExtendedTypeId(qres);
                    qres = queryrun_.get(id);



                        if (qres != null)
                        {
                            fieldid = fieldName2Id(id,"dimension[8]");
                            ret = qres.(fieldid);
                            accnameid = fieldName2Id(id,"accountnum");
                            accname = qres.(accnameid);
                             if (ret == "" && accname == "91.2.2.02"  || accname == "91.2.2.01")
                             {
                                  if (qres.validateWrite())
                                    {
                                        ttsbegin;
                                        ret = VendTable.AccountNum;
                                        qres.update();
                                        ttscommit;
                                    }
                            }
                        }

                }
            }
        }
}
Старый 26.11.2013, 13:38   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
X++:
// ret = VendTable.AccountNum;
qres.(fieldid) = VendTable.AccountNum;
И ещё посмотрите тему Common.update()

Последний раз редактировалось S.Kuskov; 26.11.2013 в 13:46.
За это сообщение автора поблагодарили: r2d2 (1).
Старый 28.11.2013, 10:07   #11  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
Все работает, однако при попытке установки значения в один из журналов выдает следующее сообщение: "Журнал был разнесен и, следовательно, не является открытым." Судя по тексту журанл заблокирован для редактирования, однако вручную можно установить значение любого поля. Существует ли возможность программно обойти данную ситуацию?
Старый 28.11.2013, 10:55   #12  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Сколько вешать граммов ?! ©

Обойти - это что значит ?
Пролетать такие журналы без обработки или выполнять действие, но чтоб ошибок не выдавало ?

P.S. Курсы по разработке посещались какие ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 28.11.2013, 12:51   #13  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
Выполнять необходимое действие, т.е. проставить значение необходимого поля. Курсы не посещал, это только предстоит, пока пытаюсь разобраться сам.
Старый 28.11.2013, 13:00   #14  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Нет опасений накосорезить неслабо ?
Какой смысл менять счет в разнесенном журнале при наличии соотв. модульных проводок по этому счету ?
Какая вообще задача стоит ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 28.11.2013, 13:05   #15  
r2d2 is offline
r2d2
Участник
 
62 / 10 (1) +
Регистрация: 25.11.2013
Задача заключается в заполнении аналитики в проводках. В свое время забыли ввести контрагента, теперь необходимо заполнить. накосорезить не страшно ибо все на тестовой базе выполняется.
Старый 28.11.2013, 13:13   #16  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Дерзайте.
doUpdate() вместо update() Вам в помощь.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: r2d2 (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
tlefor: Dynamics AX 2012: How Wide is my Grid Column? Blog bot DAX Blogs 0 28.10.2013 10:11
axaptapedia: Filter-by-Grid Blog bot DAX Blogs 2 30.05.2012 13:39
epblog: Persisting Filter conditions in EP Grid Blog bot DAX Blogs 0 29.08.2009 11:05
Advanced programming: Grid data and view manipulations batiskaf_new DAX: Программирование 15 21.06.2006 11:44
Сохранение настроек GRID (ширина и порядок колонок) liza DAX: Программирование 1 25.07.2003 22:20

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

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

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