Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 27.12.2020, 20:44   #1
KBO
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 500
По умолчанию IBDataSet.RefreshSQL для добавочных/новых полей в таблице не хочет работтать

Доброе время суток форумчане.

Есть «IBDataSet.SelectSQL», в нем есть сложный запрос (из нескольких БД).
Код:
EXECUTE BLOCK RETURNS (ID integer, NAME varchar(400), "TYPE" varchar(40), NUMBER varchar(25), NEMBER_INVENTORY varchar(10), PRODUCER varchar(200),  YEAR_BEGIN integer, NAME_TEST varchar(300),
REMARK varchar(2000), USER_ID integer, DEPARTMENT_ID integer,  TIME_EDIT timestamp, ARCHIVE integer, SPECIFICATION  blob(4096), DEVICE_DEPARTMENT_ID integer,  TYPE_SERIES integer, DISLOCATION  varchar(50),
  TYPE_EQUIP integer, PASSPORT integer, HOST_LABORATORY integer, l_NAME_SHORT_LAB varchar(20), c_NUMBER_CERT varchar(25), c_DATE_OUT date, HOST_USER varchar(30), COUNT_CERT integer,
    c_CALIBRATION_INTERVAL integer, CONTROL_MIN_DATE timestamp)  
     AS  declare variable ID_EQUIP integer; declare variable LAB_ID integer; declare variable CALIBR_INT integer;  
 
        declare procedure RECIEVE_LAB(LAB_ID integer) RETURNS(ID integer, NAME_SHORT_LAB varchar(20))  
            as  begin for execute statement ' SELECT ID, NAME_SHORT FROM LABORATORY where ID = '||LAB_ID  on external 'D:\Database\Plan.fdb'
      AS USER 'SYSDBA' PASSWORD ''   into :ID, :NAME_SHORT_LAB do suspend; end   

     declare procedure LAST_CERT(ID_EQUIP integer) returns(NUMBER_CERT varchar(25), DATE_OUT date, DEVICE_ID_CL integer, CALIBRATION_INTERVAL integer) 
         as  begin for execute statement 'SELECT ce.NUMBER_CERT, ce.DATE_OUT, ce.DEVICE_ID_CL, ce.CALIBRATION_INTERVAL FROM CERTIFICATE ce
       where ce.DISPLAY = 1 and ce.DEVICE_ID_CL = '||ID_EQUIP  on external 'D:\Database\Plan.fdb' AS USER 'SYSDBA' PASSWORD ''   into :NUMBER_CERT, :DATE_OUT, :DEVICE_ID_CL,
        :CALIBRATION_INTERVAL do suspend; end   

        begin for select eq.ID, eq.HOST_LABORATORY from EQUIPMENT eq where ARCHIVE in (1)   and PASSPORT = 1 and eq.HOST_LABORATORY = 5  order by eq.NAME, eq.TYPE,
        eq.NUMBER, eq.NEMBER_INVENTORY  into :ID_EQUIP, :LAB_ID do 
     
      for select eq.ID, eq.NAME, eq."TYPE", eq.NUMBER, eq.NEMBER_INVENTORY, eq.PRODUCER, eq.YEAR_BEGIN, eq.NAME_TEST, eq.REMARK, eq.USER_ID,
         eq.DEPARTMENT_ID, eq.TIME_EDIT, eq.ARCHIVE, eq.SPECIFICATION, eq.DEVICE_DEPARTMENT_ID, eq.TYPE_SERIES, eq.DISLOCATION, eq.TYPE_EQUIP, eq.PASSPORT,  eq.HOST_LABORATORY, eq.HOST_USER,
    eq.COUNT_CERT, rl.NAME_SHORT_LAB, (case when lc.NUMBER_CERT = '-1' then '' else lc.NUMBER_CERT end),  lc.DATE_OUT, lc.CALIBRATION_INTERVAL, eq.CONTROL_MIN_DATE from EQUIPMENT eq
    left join RECIEVE_LAB(:LAB_ID) rl on rl.id = eq.HOST_LABORATORY  left join LAST_CERT(:ID_EQUIP) lc on lc.DEVICE_ID_CL = eq.ID where eq.ID = :ID_EQUIP   into ID, NAME, "TYPE", NUMBER, NEMBER_INVENTORY,
     PRODUCER, YEAR_BEGIN, NAME_TEST, REMARK, USER_ID, DEPARTMENT_ID, TIME_EDIT, ARCHIVE,  SPECIFICATION, DEVICE_DEPARTMENT_ID, TYPE_SERIES, DISLOCATION, TYPE_EQUIP, PASSPORT, HOST_LABORATORY, HOST_USER,
      COUNT_CERT, l_NAME_SHORT_LAB, c_NUMBER_CERT,  c_DATE_OUT, c_CALIBRATION_INTERVAL, CONTROL_MIN_DATE do suspend; END
– работает отлично.
В основную таблицу "EQUIPMENT" (к которой я провожу JOIN), добавляю новое поле ("CONTROL_MIN_DATE").
Сразу добавляю его в «IBDataSet.SelectSQL», и в свойство «IBDataSet.RefreshSQL».
Код:
Select 
  ID,
  NAME,
  TYPE,
  NUMBER,
  NEMBER_INVENTORY,
  PRODUCER,
  YEAR_BEGIN,
  NAME_TEST,
  REMARK,
  USER_ID,
  DEPARTMENT_ID,
  TIME_EDIT,
  ARCHIVE,
  DEVICE_DEPARTMENT_ID,
  TYPE_SERIES,
  DISLOCATION,
  TYPE_EQUIP,
  PASSPORT,
  HOST_LABORATORY,
  HOST_USER,
  COUNT_CERT,
  SPECIFICATION,
  CONTROL_MIN_DATE
from EQUIPMENT 
where
  ID = :ID
Открывая запрос, т.е. запускаю программу – все отлично, данные отображаются во всех полях и в поле поле ("CONTROL_MIN_DATE").
Но после выполнения «IBDataSet.RefreshSQL» («обновить» в dbnavigator) в этом поле в «IBDataSet» данные пропадают.
Тут же пробовал запрос «IBDataSet.RefreshSQL» выполнять в IBQuery, в нем данные по новому полю появляются.

В чем может быть заковыка.
Заранее спасибо за ответ.

P.S.
- Delphi 10.2

Последний раз редактировалось KBO; 27.12.2020 в 22:35.
KBO вне форума Ответить с цитированием
Старый 29.12.2020, 01:28   #2
KBO
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 500
По умолчанию

Разобрался на половину.
оказалось новое поле "CONTROL_MIN_DATE timestamp" нужно в блоке RETURNS добавить не в конец, а в начало блока... и будет обновление записи
а вот почему??? загадка
KBO вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить в sql запрос вывод новых полей ?! hz_x3mal Microsoft Office Access 3 04.10.2020 15:28
Что устанавливает ограничение в таблице на добавление новых столбцов ROM710 SQL, базы данных 1 17.04.2019 11:18
Добавление новых полей к форме Gennady_fr Microsoft Office Access 6 09.05.2010 13:38
Каскадное обновление взаимосвязанных полей со списком и добавление новых значений AlEx_IB Microsoft Office Access 12 11.09.2009 15:55
Слияние шаблона с данными из таблице, и как подсичтать значение количества полей в таблице n4ela Microsoft Office Access 3 07.03.2009 12:04


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS