Страница 1 из 2

вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 13:49
s2176
Добрый день!
Продолжаю мучить форму Т-13 (табель).
Мне надо из прямо из формы создать атрибут (запись в Attrval) для записи таблицы lstab.
Создала новый атрибут для таблицы lstab с названием "АФД_исходный".
Отчет должен записать в него информацию, как только табель сотрудника был распечатан (точнее, сформирована данная печатная форма).
В отчет вставляю такие строки:
Set attrval.nrec:=getnextnrec(tnattrval,0);
set attrval.wtable:=16044;
set attrval.crec:=nrec_lstab;
set attrval.cattrnam:=nrec_attrInitAFD;
set attrval.vstring:=_strAttr;
Insert current attrval;

У нас несколько разных баз, так вот, на маленькой работает без проблем, а на большой сначала долго висит, потом ругается на дублированное значение nrec-а!
Как это может быть, ведь я генерю новый nrec!
Делала и по-другому:
Insert attrval
set wtable:=16044, crec:=nrec_lstab, cattrnam:=nrec_attrInitAFD, vstring:=_strAttr;
но с тем же успехом, а, точнее, неуспехом ((

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 14:15
Den
Насколько помню, в fcom операции модицикации не могут быть вне LOT
Т.е. attrval дложна быть описана внутри create view И обращение в коде вставки должно идти с префиксами имени этой CREATE VIEW. Вроде :

Код: Выделить всё

Set view1.attrval.nrec:=getnextnrec(view1.tnattrval,0);
set view1.attrval.wtable:=16044;
set view1.attrval.crec:=nrec_lstab;
set view1.attrval.cattrnam:=nrec_attrInitAFD;
set view1.attrval.vstring:=_strAttr;
view1.Insert current attrval;

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 14:23
s2176
но ведь работает на небольшой базе!
Но конечно попробую...

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 14:33
Den
+view.clearbuffer(..)
+set уберите у каждой строчки - ни к чему он там

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 14:56
s2176
.create view tvav as select *
from attrval
;
...
Tvav.Clearbuffer(Tvav.tnattrval);
Tvav.attrval.nrec:=getnextnrec(Tvav.tnattrval,0);
Tvav.attrval.wtable:=16044;
Tvav.attrval.crec:=nrec_lstab;
Tvav.attrval.cattrnam:=nrec_attrInitAFD;
Tvav.attrval.vstring:=_strAttr;
Tvav.Insert current attrval;
увы, результат все тот же :-(
Ошибка N 5.
Дублированное значение при уникальном ключе.
В таблице ATTRVAL повторяется значение поля
NREC : "281474976721367",
что противоречит описанной в словаре уникальности
индекса ATTRVAL0. таблица N1006

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 15:09
Ольга
А почему не использовать объект ExtAttr? У него есть методы для записи значений в атрибуты - sSetAttr и sSetAttdID.
Будет как-то так:

Код: Выделить всё

!объявить
.declare
#Include ExtAttr.vih
.enddeclare
!Создать переменную для работы с объектом
.var
  iAttr : C_ExtClass::iExtAttr;
.endVar
! там где надо записать значение в атрибут:
.begin
  iAttr.sSetAttrID(16044, nrec_lstab, nrec_attrInitAFD, _strAttr);
  //Или по имени:
  //iAttr.sSetAttr(16044, nrec_lstab, <Имя атрибута>, _strAttr);
end.

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 15:14
s2176
Я как-то с этим не работала((
это по сути своей то же самое? такая же запись в таблицу AttrVal?

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 15:27
Ольга
Ага, совершенно стандартная запись. И намного проще, чем возиться с таблицами.

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 15:32
s2176
А можно пример, как это синтаксически правильно должно быть оформлено? Версия 8,1

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 16:00
Ольга
Я вроде примерно написала пример.
1. Подключить описание объекта. Секция .declare/.enddeclare - в начале формы. Инклудом подключается описание (ExtAttr.vih). (если компилируете через проект - можно добавить #include ExtAttr.vih в проекте, а не в форме). Соответственно, в cfg должен быть прописан путь где искать инслуды (Compilers.IncludesPath) и положить туда файл. Сам файл найдете в FRM\C_ExtClass.rar (Для 8.1)
2. Добавить переменную в секцию .var/.EndVar, в компанию к остальным переменным, если они есть.
3. Где нужно - вызывать методы объекта через переменную. Если надо установить атрибут - логично это делать в .begin/end. Если наоборот - получить и вывести в форму, можно прямо в .fields/.endFields. Описание всех методов есть в файле ExtAttr.vih или в документации exe\GalDoc

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 16:15
s2176
Сделала так:

.linkform ’TabT13_LS_AFDinit’ prototype is ’TabT13’
.declare
#Include ExtAttr.Vih
.enddeclare
.nameinlist ’Фактический табель для выгрузки в архив финансовых документов’
.group ’Т-13’
.var
iAttr: iExtAttr;
.endvar
...
.procedure writeAttr;
Begin
iAttr.sSetAttrID(16044, nrec_lstab, nrec_attrInitAFD, _strAttr);
end.

Но, увы, обмануть не удалось... теперь такая ошибка:
"Возникло необработанное исключение
ExObjIfcNoLoad (ExRef)
ошибка загрузки объекта из ресурсного файла(iExtAttr)
"Да" - Продолжить, "Нет" - Отлаживать в окне отладчика
"Отмена" - Не выдавать больше это сообщение - Да !
Возникло необработанное исключение
ExObjIfcNoInit (ExRef)
ссылка не была инициализирована
"Да" - Продолжить, "Нет" - Отлаживать в окне отладчика
"Отмена" - Не выдавать больше это сообщение - Да !

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 16:24
Алексей
в проекте где собираете форму укажите

Код: Выделить всё

#define ComponentVersion
и соберите заново

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 06 окт 2015, 16:26
Ольга
Попробуйте в описании переменной указать компонент:

Код: Выделить всё

 iAttr: C_ExtClass::iExtAttr;

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 07 окт 2015, 08:20
s2176
Все получилось! Спасибо, Ольга и Алексей!
Но, все равно теперь мучает вопрос, почему же обычный insert не отрабатывал....

Re: вставка новой записи в таблицу attrval из формы

Добавлено: 07 окт 2015, 10:24
edward_K
Не люблю функция GetNextNrec. Надежней Attrval.nrec:=0 либо vvv.ClearBuffer(vvv.tnAttrVal)