Нет записей в таблице сразу после успешной вставки

Программирование на Atlantis: приемы и подходы, обмен опытом

Модераторы: larin, Screw

Kefiro
Сообщения: 22
Зарегистрирован: Чт, 08/09/2011 17:13
Имя Фамилия: Андрей Пеньков

Нет записей в таблице сразу после успешной вставки

Сообщение Kefiro » Пн, 17/10/2011 12:48

Помогите, пожалуйста, с такой проблемой. В чём тут может быть дело?
Есть временная таблица. После вставки записи в эту таблицу пытаюсь получить первую запись, и getFirst возвращает ошибку.

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

   table struct Tables (
      cLsch : comp,
      Month : word,
      Year : word
   )
   ;
...
      Tables.cLsch := workingTable.cLschet;
      Tables.Month := workingTable.MesN;
      Tables.Year := workingTable.YearN;

      message((insert current Tables), cmOk);
      message ((getFirst Tables), cmOk);


В этом коде первый message показывает 0, а второй - 4. При чём происходит это не всегда, а только в определённых случаях. Выяснить, чем эти "определённые" случаи отличаются от других, мне не удаётся.

Аватара пользователя
Screw
корпорация
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Re: Нет записей в таблице сразу после успешной вставки

Сообщение Screw » Ср, 19/10/2011 14:38

Без описания логической таблицы трудно ответить определённо.

Kefiro
Сообщения: 22
Зарегистрирован: Чт, 08/09/2011 17:13
Имя Фамилия: Андрей Пеньков

Re: Нет записей в таблице сразу после успешной вставки

Сообщение Kefiro » Чт, 20/10/2011 10:13

Логическая таблица такая:

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

   create view
   var
      cPodr : comp;
      bDate : date;
      eDate : date;
      WTLF : WorkingTableListFunctions;
      avSum : double;
      motherVac : integer;
   as select *
   from
      StaffStruct,
      ExtCatLinks,
      Tables
   where ((
          11 == ExtCatLinks.ObjType
      and 1 == ExtCatLinks.ModType
      and cPodr == ExtCatLinks.ExtCat
      and ExtCatLinks.StaffCat == StaffStruct.Department
      and StaffStruct.nRec == Appointments.StaffStr
   ))
   and (
             (StaffStruct.dClose = date(0,0,0)
         or  StaffStruct.dClose >= eDate)
         and StaffStruct.dInput <= eDate
         and (Appointments.DismissDate = date(0,0,0)
         or  eDate <= Appointments.DismissDate)
       )
   ;


Добавлю то, что писал на Тюмбитовском форуме, может, это важно:
Используется такой код:

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

     
    function collect(var workingTable: Type$LsTab; subject: comp; periodBeginning: date): integer;
   {
      clearBuffer(#Tables);
      Tables.cLsch := workingTable.cLschet;
      Tables.Month := workingTable.MesN;
      Tables.Year := workingTable.YearN;
       insert current Tables;
   }

   procedure proc;
   {
      delete all Tables;

      mCount := bDate;
      while (mCount <= eDate) {
         bindEvent(collect, WTLF.collectTable);
         WTLF.refreshTableListExt(0, cPodr, mCount, validator);
         unBindEvent(collect, WTLF.collectTable);
         mCount := add_months(mCount, 1);
      }

      _loop Tables {
           //....
      }
  }

WTLF - это штатный объект типа WorkingTableListFunctions, который в refreshTableListExt просматривает табеля по подразделению cPodr и для каждого табеля вызывает мою функцию collect. Для одних подразделений всё проходит верно, но по некоторым cPodr не работает _loop. Как я выяснил, из-за того, что в Tables нет записей. Смотрю отладчиком - все строки функции collect отрабатывают верно, insert возвращает 0. Поэтому я попробовал getFirst (как в первом примере) - он возвращает 4.

Ged
корпорация
Сообщения: 76
Зарегистрирован: Вс, 16/09/2007 10:23
Имя Фамилия: Леонид Поликутин
Откуда: Галактика СПб
Контактная информация:

Re: Нет записей в таблице сразу после успешной вставки

Сообщение Ged » Чт, 20/10/2011 14:19

Ограничение

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

   and (
             (StaffStruct.dClose = date(0,0,0)
         or  StaffStruct.dClose >= eDate)
         and StaffStruct.dInput <= eDate
         and (Appointments.DismissDate = date(0,0,0)
         or  eDate <= Appointments.DismissDate)
       )

ложится на всю логическую таблицу

Сделайте так

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

Create view vDop
As select * from Tables;
....
      vDop.Tables.cLsch := workingTable.cLschet;
      vDop.Tables.Month := workingTable.MesN;
      vDop.Tables.Year := workingTable.YearN;

      message((vDop.insert current Tables), cmOk);
      message ((vDop.getFirst Tables), cmOk);

или

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

create view
   var
      cPodr : comp;
      bDate : date;
      eDate : date;
      WTLF : WorkingTableListFunctions;
      avSum : double;
      motherVac : integer;
   as select *
   from
      StaffStruct,
      ExtCatLinks,
      Tables
   where ((
          11 == ExtCatLinks.ObjType
      and 1 == ExtCatLinks.ModType
      and cPodr == ExtCatLinks.ExtCat
      and ExtCatLinks.StaffCat == StaffStruct.Department
      and StaffStruct.nRec == Appointments.StaffStr
     and (
             (StaffStruct.dClose = date(0,0,0)
         or  StaffStruct.dClose >= eDate)
         and StaffStruct.dInput <= eDate
         and (Appointments.DismissDate = date(0,0,0)
         or  eDate <= Appointments.DismissDate)
       )
   ))
   ;

Kefiro
Сообщения: 22
Зарегистрирован: Чт, 08/09/2011 17:13
Имя Фамилия: Андрей Пеньков

Re: Нет записей в таблице сразу после успешной вставки

Сообщение Kefiro » Пт, 21/10/2011 10:14

Леонид, спасибо. Я понял Вашу мысль.
Правда, оба варианта не удалось реализовать: первый меняет поведение других частей интерфейса, а второй валится с ошибкой превышения границы коллекции. Я выделил работу с временной таблицей в отдельный интерфейс, где в логической таблице только Tables.


Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя