powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBDataSet.RefreshSQL для нескольких баз
17 сообщений из 17, страница 1 из 1
IBDataSet.RefreshSQL для нескольких баз
    #40033028
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток формчане.

В IBDataSet.SelectSQL есть такой рабочий запрос:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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 
          q.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



Вопрос:
Каким образом его можно запихнуть в IBDataSet.RefreshSQL? (P.S. конечно с одним ключевым полем EQUIPMENT.ID)
Т.к. много входных параметров в вложенных процедурах
И можно ли это вообще сделать? Просто не охота всевремя переоткрывать IBDataSet

Спасибо за ответ
(FireBird 3.0)
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033030
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kos-2010,

в EB добавь входной параметр "EQUIPMENT_ID integer" и в "from EQUIPMENT eq where" добавь соотв условие ч/з and "eq.id = :EQUIPMENT_ID", и всё.
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033051
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
....
в EB добавь входной параметр "EQUIPMENT_ID integer" и в "from EQUIPMENT eq where" добавь соотв условие ч/з and "eq.id = :EQUIPMENT_ID", и всё.


Добавил:
авторEXECUTE BLOCK (EQUIPMENT_ID integer = :ID) RETURNS (...
и
авторwhere ARCHIVE in (1) and PASSPORT = 1 and ID = :EQUIPMENT_ID

и это работает в IbExpert,
но когда этот запрос вставляешь в IBDataSet.RefreshSQL и ставишь IBDataSet.Active = true
начиннает валиться ошибка
ErrorDynamic SQL Error
SQL error code = -104
Token unknown - line 6, column 164
?.

на следющий выходной параметр (т.е с двоеточием) в запросе
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033054
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя в источнике написано, что "Инструкция EXECUTE BLOCK поддерживается в TIBDataSet.InsertSQL, TIBDataSet.ModifySQL, TIBDataSet.DeleteSQL, в TIBQuery, в TIBStoredProc"

но может с тех пор, что-то изменилось?...
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033056
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi и IBX какого розлива?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033066
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi 10.2
и
InterBaseXE7
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033068
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010написано, что "Инструкция EXECUTE BLOCK поддерживается в TIBDataSet.InsertSQL,
TIBDataSet.ModifySQL, TIBDataSet.DeleteSQL, в TIBQuery, в TIBStoredProc"

И в каком месте этого списка ты видишь RefreshSQL?..


PS: Я уже не говорю, что этот источник - для совершенно левого форка, который ты не факт, что используешь.
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033070
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

И в каком месте этого списка ты видишь RefreshSQL?..

Я и имел ввиду, что я не нашел RefreshSQL , и поэтому переспрросил.
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033071
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

PS: Я уже не говорю, что этот источник - для совершенно левого форка, который ты не факт, что используешь.


Да, с "источником" - я лажанулся...

А как по-другому эту сутуацию с обновлением одной записи решить и с таким "select"?
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033082
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010А как по-другому эту сутуацию с обновлением одной записи решить и с таким "select"?

Использовать мозг и хранимую процедуру не предлагать?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033086
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov


Использовать мозг и хранимую процедуру не предлагать?..


Та честно говоря, я от нее две недели назад отказался, а теперь не помню почему.

Ну ладно если по-другому ни как, то буду в этом направлении работать.
(P.S. может вспомню почему я от нее отказался)
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033099
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Использовать мозг и хранимую процедуру не предлагать?..


В общем я оставляю все как есть, т.е. IBDataSet.SelectSQL , IBDataSet.InsertSQL , IBDataSet.ModifySQL , IBDataSet.DeleteSQL .

Но при этом копирую запрос из IBDataSet.SelectSQL в хранимую процедуру, добавляю к ней входной параметр (ключевое поле ID )
А в IBDataSet.RefreshSQL делаю запрос к этой хранимой процедуре.

Так?
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033100
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хранимка не умеет вытаскивать ровно
одну строку - это ужасная архитектура.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033120
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УРААААААААА!!!!
ПОЛУЧИЛОСЬ!!!
ВСЕМ ЕЩЕ РАЗ СПАСИБО!!!
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033141
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

база эта тут у же не первый раз. И в этом посте SelectSQL настолько ужасен, что напрочь отпадает желание что-то тут советовать или оптимизировать.
Тем не менее, считаю, что надо бы всё это безобразие переделать. Не читать надо связанные таблицы из on external каждый раз, а база plan.fdb должна доставлять сертификаты и лаборатории при их изменениях в текущую базу. Чтобы при запросах не надо было никуда больше лазить.
Как минимум, хоть plan.fdb и локальная база, если она брякнется, или коннекта к ней не будет, то вообще никаких данных получить будет нельзя.
Так что сейчас ситуация выглядит как табуретка с тремя ногами (без четвертой).
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033313
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Kos-2010,

... Не читать надо связанные таблицы из on external каждый раз, а база plan.fdb должна доставлять сертификаты и лаборатории при их изменениях в текущую базу. Чтобы при запросах не надо было никуда больше лазить....


я разделяю вашу точку зрения (мне тоже не очень нравится общение с двумя базами) и вижу всего лишь 2 пути:
1) сделать каким- либо образом VIEW к plan.fdb из "centertest.fdb", хотя view не поддерживает такой технологии я не встречал
2) сделать в БД " centertest.fdb " две таблицы дубли " LABORATORY " и " CERTIFICATE " таблиц из plan.fdb (чего бы я не очень хотел бы делать: одно слово "дубли")

или есть другие способы? я бы с удовольствием их рассмотрел
...
Рейтинг: 0 / 0
IBDataSet.RefreshSQL для нескольких баз
    #40033516
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

пункт 2 норм.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBDataSet.RefreshSQL для нескольких баз
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]