Обновление данных в browse

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Обновление данных в browse

Сообщение Marisha_P »

если меняю запрос - то пишет, что нужен ключ cmatpropusk для таблицы spmatpropusk :(
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Обновление данных в browse

Сообщение Den »

Значит нужно добавить такой ключ
Пока, воспользуйтесь хинтом (noindex)
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Обновление данных в browse

Сообщение Marisha_P »

спасибо большое за помощь! наконец-то стали правильно отображаться привязанные данные! подскажите еще, пожалуйста, как правильно передавать данные из одного интерфейса в другой? т.е. как при попытке вставки записи в привязанном фейсе получить тип накладной из основного?
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Обновление данных в browse

Сообщение Marisha_P »

у меня не получается избежать дублирования ключа:( Если с нуля заполняю таблицу строчками, всё отлично. Если закрываю свой интерфейс и потом загружаю заново- новые строчки уже не добавляются:(
вставку делаю так:

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

 cmInsertRecord:{
       Case (CurTable) Of
         #matpropusk:{
           ResetTableSpec();
           insert current matpropusk;
            _loop Pick Where ((22==Pick.wList))
               {
                If GetFirst KatSopr Where ((Pick.cRec==KatSopr.nrec)) = tsOk
                 {
                   spmatpropusk.npp:= GetSpPropuskNppNext(matpropusk.nrec);
                   spmatpropusk.ckatsopr:=pick.crec;
                   spmatpropusk.cmatpropusk:=matpropusk.nrec;
                   insert current spmatpropusk;
                   ClearBuffer (#spmatpropusk);
                   delete all pick;
                };
              };
           rescanpanel(#spmatpropusk);
        }
       end;
   }             
При инициализации очистку делаю

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

Cminit: {
    delete all pick;
}; 
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Обновление данных в browse

Сообщение m0p3e »

clearbuffer делается перед заполнением записи!

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

Назначение
Очищает буфер записей для таблицы iTable с записью в буфер текущих ограничений на таблицу.
Описание
procedure ClearBuffer(iTable: integer);
Параметры
iTable: integer - номер таблицы.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Обновление данных в browse

Сообщение Marisha_P »

я именно так и думала, но если ставлю его до вставки, то вылетает ошибка при компиляции : нет такой функции, поля или метода
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Обновление данных в browse

Сообщение m0p3e »

Marisha_P писал(а):я именно так и думала, но если ставлю его до вставки, то вылетает ошибка при компиляции : нет такой функции, поля или метода
Должно быть так и никак иначе:

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

                   ClearBuffer (#spmatpropusk); //или ClearBuffer (tnspmatpropusk);
                   spmatpropusk.npp:= GetSpPropuskNppNext(matpropusk.nrec);
                   spmatpropusk.ckatsopr:=pick.crec;
                   spmatpropusk.cmatpropusk:=matpropusk.nrec;
                   insert current spmatpropusk;
Таблица SpMatPropusk в селекте присутствует?
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Обновление данных в browse

Сообщение Marisha_P »

Заработало! Спасибо огромное:) как находясь на строчке вспомогательного интерфейса получить nrec позиции из главного?
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Обновление данных в browse

Сообщение Marisha_P »

Опять проблема с обновлением данных... На вкладке хочу обработать событие

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

cmDefault:{
   matpropusk.ctranspr:=transp.nrec;
   matpropusk.CMARPUNKTPR:=marpunkt.nrec;
   matpropusk.CMARPUNKTPR1:=marpunkt1.nrec;
   if (matpropusk.ctidkpr=201 or matpropusk.ctidkpr=521 or matpropusk.ctidkpr=600 or matpropusk.ctidkpr=602)
       then matpropusk.CEXPEDITORDOVPR:=dovfio.nrec
   else matpropusk.CEXPEDITORVODPR:=kndriver.nrec;

   update current matpropusk;
   rereadrecord(#matpropusk);
 }   
Чтобы при возврате в основной browse эти данные отобразились. Он как раз построен по таблице matpropusk. Но обновления не происходит при вовзрате на строку. Надо с ней уйти и только потом..Как сделать обновление сразу по возврату? данные в табличку записывают еще при нахождении на вкладке..
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Обновление данных в browse

Сообщение edward_K »

rereadrecord(#matpropusk); должно быть не в дочернем фейсе, а в основном после вызова дочернего. В дочке хватит ReScanPanel(#matpropusk) - это чутка быстрее.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Обновление данных в browse

Сообщение Marisha_P »

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

 
cmChangeTabbedSheetFormat:{
        ResetTableSpec();
        rereadrecord(#matpropusk);

  }         
здесь нужно обновлять?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Обновление данных в browse

Сообщение edward_K »

а. у вас встроенный. Тогда нужно связывать события и запускать из дочки. В основном тогда в событии rereadrecords.
Самое простое отправить Notify в дочке а в родителе обработать cmNotify - но так не правильно :).

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

в дочке
       Notify(cmTableChanged, word(26009)); // укажите номер вашей таблы или неиспользуемый
в родителе
    cmTableChanged:
   {   if (word(GetNotificationInfoPtr) = 26009) 
      { ReReadRecord(#table)
      }
  }
сложнее завязать события

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

в родителе 
procedure OnDataChanged;
{ ReReadRecord(#table)
} // procedure OnDataChanged
в cmInit
  BindEvent(OnDataChanged, DCN.OnDataChanged);
в vih дочки
event procedure OnDataChanged;
в записи данных
    OnDataChanged;
чутка сложнее. чтобы обмен был двухстороний. Для этого нужен дополнительный объект который бы юзался и там и там и связывался и там и там.
Ответить