Страница 1 из 1
Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 11 дек 2013, 16:40
Zver
Уважаемые форумчане,
Есть триггер перед модификацией записи в KatMc.
Его задача проставлять в поле ссылку на группу МЦ, которая получается
по правилу, определённому в функции oi_Trigger_MC_cGroup.GetGroupMc_Kod_By_nRec.
Логика следующая: получаем МЦ из буфера, вносим изменения в нужное поле, затем модифицированную запись вставляем в буфер.
Проблема возникает при вставки изменённой переменной buf в буфер с помощью функции SetTableBuffer();
Вот код триггера:
Код: Выделить всё
var oi_Trigger_MC_cGroup : Trigger_MC_cGroup new;
handler with replace Trigger_KatMc_ret1 on trigger KatMc before update [10]
action
{
var buf : record as table KatMc;
GetTableBuffer(buf);
//Извлекаем nRec записи из таблицы GroupMC
buf.ret1 := oi_Trigger_MC_cGroup.GetGroupMc_Kod_By_nRec(buf.cGroupMC);
if ( SetTableBuffer(buf) != tsOk )
Message('Ошибка вставки в буфер'); //Возникает ошибка при вставке в буфер
result := true;
}
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 12 дек 2013, 00:08
edward_K
Посмотрите функции с "p" на конце - при обновлении нужно работать с буфером с указателем на позицию. И вы не написали - а в чем проблема то.
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 12 дек 2013, 10:42
Zver
Проблема в том, что триггер не отрабатывает необходимое действие.
А именно, при каждой модификации должно актуализироваться поле KatMc.ret1.
В настоящее время это не происходит.
Удалось локализовать ошибку, что при выполнении функции SetTableBuffer возвращается код 311.
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 12 дек 2013, 11:38
edward_K
Код: Выделить всё
handler with replace titledoc_Before_upd on trigger titledoc before update [201]
action
{
//переменная буфера с позицией
var buf : record as table titledoc with x$position;
GetTableBufferP(buf); // Считываем буфер
if buf.DocMemo=0
{ //buf.DocMemo := coGetTune('UP.STAFF.NAME_FILIAL'); // Изменяем значение поля
set buf.DocMemo :=coGetTune('UP.MY.FILIAL_STAFF')
//message(string(buf.DocMemo))
SetTableBuffer(buf); // Сохраняем буфер
}
result := true;
}
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 12 дек 2013, 12:34
Zver
edward_K,
Переделал по аналогии с Вашим примером. Решил оставить только чтение из буфера и вставку в буфер.
Всё равно выскакивает ошибка 311.
Есть подозрение, что проблема не в коде, а в настойках.
Код: Выделить всё
handler with replace Trigger_KatMc_ret1 on trigger KatMc before update [200]
action
{
var buf : record as table KatMc with x$position;
var wErr: word;
wErr := GetTableBufferP(buf);
if(wErr != tsOK)
Message( wErr + ' Ошибка считывания из буфера');
wErr := SetTableBuffer(buf);
if ( wErr != tsOk )
Message( wErr + ' Ошибка вставки в буфер' + chr(13) + buf.ret1 ); //Возникает ошибка при вставке в буфер
result := true;
}
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 12 дек 2013, 13:09
edward_K
поменяйте сообщения. Убедитесь, что срабатывает именно новый текст(рес лучше грохнуть перед сборкой + atlantis.res).
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 12 дек 2013, 13:21
Zver
Поменял сообщения. Ошибка осталась.
Решил попробовать вынести процедуру обновления поля в интерфейс.
В результате выполнения триггера появилось сообщение "Конфликт с другим пользователем. Запись будет пересчитана. Таблица N1411."
1411 - это номер таблицы KatMc.
Есть подозрение, что что-то не то с доступом к таблице KatMc.
Вот код нового триггера:
Код: Выделить всё
//var oi_Trigger_MC_cGroup : Trigger_MC_cGroup new;
handler with replace Trigger_KatMc_ret1 on trigger KatMc before update [200]
action
{
var buf : record as table KatMc with x$position;
var wErr: word;
wErr := GetTableBufferP(buf);
if(wErr != tsOK)
Message( wErr + ' Ошибка считывания из буфера');
if(RecursionLevel = 1 )
{
//Извлекаем nRec записи из таблицы GroupMC
set buf.ret1 := oi_Trigger_MC_cGroup.GetGroupMc_Kod_By_nRec(buf.cGroupMC);
oi_Trigger_MC_cGroup.UpdRet1(buf.nRec, buf.ret1);
}
result := true;
}
//Вот реализация функции интерфейса:
function UpdRet1(cMc: comp; ret1: comp): void;
{
if (GetFirst FastFirstRow KAtMc where (( cMc == KatMc.NRec )) = tsOk )
update current katMc
set KatMc.Ret1 := ret1;
}
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 12 дек 2013, 14:01
edward_K
Если вы будете менять таблу вне тригера, то так и будет - тогда в родительском нужно вызвать Rereadrecoord(#katmc) - а это затратно, если речь идет о нескольких возможностях. Проще уж сразу их докомпилить. Ну у меня работало - бейтесь. В ТП отпишите - что они скажут. Попробуйте с другой таблой.
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 13 дек 2013, 12:07
Zver
Проблема была не в коде.
В итоге помогла перезагрузка сервера.
Всем успешных приключений в Галактике
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 09 янв 2014, 17:28
Zver
К сожалению, проблема не ушла.
Попробовал реализовать триггер на другой таблице - тоже самое.
Жду любых рекомендаций по поводу того, в чём может быть проблема.
Вот код триггера:
Код: Выделить всё
handler MnPlan_Test_Trig on trigger MnPlan before update [99]
action
{
var buf :record as table MnPlan;
var wErr : word;
Message('Обработка триггера на изменение записи в MnPlan');
GetTableBuffer(buf);
wErr := SetTableBuffer(buf);
if (wErr != tsOK)
Message(wErr + ' Ошибка вставки в буфер');
}
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 21 янв 2014, 18:57
Zver
Уважаемые коллеги, заметил интересную закономерность.
Если у переменной, которой присваивается значение из буфера,
изменить значение какого либо поля, пример кода приведён ниже,
то появится сообщение об ошибке в буфер, но изменения будут производиться в соответствии с кодом.
Код: Выделить всё
#include GetCurMc.vih
var oi_GetCurMc : GetCurMc new;
handler with replace MC_trigger_Cancel_Groups on trigger KatMc before update [99]
action
{
var buf : record as table KatMc;
var CurMc : record as table KatMc;
var sTmp : string;
var wErr : word;
GetTableBuffer(buf);
buf.Name := buf.name + 'Test';
wErr := SetTableBuffer(buf);
if(wErr != tsOK)
Message('Ошибка вставки в буфер');
result := true;
}
rollback
{}
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 22 янв 2014, 01:43
Den
Похоже на баг какой то.... быстрее всего что и GetTableBuffer чуть Выше в Вашем коде тоже кидает не tsok значение контанты в качестве результата выполнения метода.
Re: Ошибка при вставке в буфер после SetTableBuffer
Добавлено: 22 янв 2014, 11:12
Zver
Den писал(а):Похоже на баг какой то.... быстрее всего что и GetTableBuffer чуть Выше в Вашем коде тоже кидает не tsok значение контанты в качестве результата выполнения метода.
Вы правы, GetTableBuffer тоже возвращает не tsOK, а тоже 311.