Страница 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
Проблема была не в коде.

В итоге помогла перезагрузка сервера.

Всем успешных приключений в Галактике :cool:

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.