25.11.2013, 13:13 | #1 |
Участник
|
Запрос по данным полученным с 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()) { //вычисления } } |
|
25.11.2013, 13:25 | #2 |
Участник
|
Цитата:
X++: //FieldNum(sFindVoucher, Recid) fieldname2id(sFindVoucher.RefTableId, 'Recid') Последний раз редактировалось S.Kuskov; 25.11.2013 в 13:32. |
|
25.11.2013, 14:38 | #3 |
Мрачный тип
|
Для любой таблицы код поля RecId в ней - постоянен.
Можно смело пользовать X++: fieldnum(Common, RecId)
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
26.11.2013, 07:44 | #4 |
Участник
|
Всем спасибо за ответы. Еще один небольшой вопрос, данный алгоритм в цикле выполняет запрос к разным таблицам, поэтому при присчваивании результата запроса в переменную происходит ошибка :
X++: qres = queryrun_.get(id); |
|
26.11.2013, 08:02 | #5 |
Участник
|
Какого типа переменная qres?
X++: Common qres; |
|
26.11.2013, 08:14 | #6 |
Участник
|
теперь Common, спасибо.
|
|
26.11.2013, 09:07 | #7 |
Участник
|
теперь выдает синтаксическую ошибку, "Таблица не содержит это поле". Почему возникает ошибка понятно, но как обойти ее?
X++: common qres; ... qres = queryrun_.get(id); ... qres.dimension8 = AccountNum; |
|
26.11.2013, 09:36 | #8 |
Участник
|
Как вы определяете нужно вам поле dimension8? У него во всех таблицах будет такое имя? Для обращения к произвольному полю нужно знать его FieldId, и тогда можно будет написать так
X++: qres.(FieldId) Получить значение поля по TableId, FieldId, RecId |
|
26.11.2013, 12:09 | #9 |
Участник
|
Нужно именно 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 |
Участник
|
X++: // ret = VendTable.AccountNum;
qres.(fieldid) = VendTable.AccountNum; Последний раз редактировалось S.Kuskov; 26.11.2013 в 13:46. |
|
|
За это сообщение автора поблагодарили: r2d2 (1). |
28.11.2013, 10:07 | #11 |
Участник
|
Все работает, однако при попытке установки значения в один из журналов выдает следующее сообщение: "Журнал был разнесен и, следовательно, не является открытым." Судя по тексту журанл заблокирован для редактирования, однако вручную можно установить значение любого поля. Существует ли возможность программно обойти данную ситуацию?
|
|
28.11.2013, 10:55 | #12 |
Мрачный тип
|
Сколько вешать граммов ?! ©
Обойти - это что значит ? Пролетать такие журналы без обработки или выполнять действие, но чтоб ошибок не выдавало ? P.S. Курсы по разработке посещались какие ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
28.11.2013, 12:51 | #13 |
Участник
|
Выполнять необходимое действие, т.е. проставить значение необходимого поля. Курсы не посещал, это только предстоит, пока пытаюсь разобраться сам.
|
|
28.11.2013, 13:00 | #14 |
Мрачный тип
|
Нет опасений накосорезить неслабо ?
Какой смысл менять счет в разнесенном журнале при наличии соотв. модульных проводок по этому счету ? Какая вообще задача стоит ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
28.11.2013, 13:05 | #15 |
Участник
|
Задача заключается в заполнении аналитики в проводках. В свое время забыли ввести контрагента, теперь необходимо заполнить. накосорезить не страшно ибо все на тестовой базе выполняется.
|
|
28.11.2013, 13:13 | #16 |
Мрачный тип
|
Дерзайте.
doUpdate() вместо update() Вам в помощь.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
|
За это сообщение автора поблагодарили: r2d2 (1). |