собственно сделана эта функция под свои нужды, но может кому и пригодится, теперь рассказываю для чего она мне понадобилась:
тут партировал с TPS на SQL большую складскую программу, в TPS на каждый склад был свой файл, Склад01.tps, Склад02.tps и т д, и куча других файлов, которые зависят от номера склада, в SQL я все файлы объеденил в один, добавив поле - номер склада.
далее при входе в программу запрашивается в каком складе хотим работать, в одной "глобальной" табличке регистрируется текущая сессия - одна запись с двумя полями НомерСессии,НомерСклада
на складские таблицы была сделана SQL View с JOINом на "глобальную" табличку по номеру сесии и номеру скада
INSERT,UPDATE на SQL View - великолепно штатно работает, DELETE пришлось триггерок замещаемый написать.
всё заработало так как задумывалось, но если делать в File Schematic'е JOINHы по нескольким файлам из DCT, которые в свою очередь ссылаются вот на такие SQL view, это приводило к тормозам получения данных (ну в моём понимании всё должно летать)
спрашивается, что сделать так, не меняя программы, но чтобы SELECT запросы генерились не к SQL View, а к SQL Table с добавлением соответсвующих WHERE конструкций, вот для этого была и создана такая subj процедура, которая вызывается перед выполнением SELECT запроса через MAVSelect объект
в словаре на каждую таблицу складскую я создаю клона
Склад01
Склад01_T - тот же набор полей + добавочное поле НомерСклада
и вот что я делаю в этой своей процедуре:
Код: Выделить всё
HOOK:MAVPREPARESELECT PROCEDURE(MAVSelect cursor)
I LONG
file &GROUP
CODE
LOOP I = 1 TO RECORDS(cursor.QRec)
GET(cursor.QRec,I)
CASE cursor.QRec.File
OF MAVADDRESS(PAVAD)
file &= PAVAD_T ; Do FillRec
cursor.Where(PAVAD_T:FIRM_NR,FIRM_NR)
cursor.Where(PAVAD_T:BASE_NR,WINLATS:NOLIK_NR)
OF MAVADDRESS(NOLIK)
file &= NOLIK_T ; Do FillRec
cursor.Where(NOLIK_T:FIRM_NR,FIRM_NR)
cursor.Where(NOLIK_T:BASE_NR,WINLATS:NOLIK_NR)
END
END
FillRec ROUTINE
cursor.QRec.File = MAVADDRESS(file)
cursor.QRec.pFile &= file
PUT(cursor.QRec)
IF MAVOPENFILE(file,cursor.Db.GetDbName())
MAVSHOWERROR
HALT
END
я уже когда то рассказывал - как перехватывать вызовы RTL функций, для таких таблиц я перехватываю и MAVUPDATE, MAVINSERT, MAVDELETE функции и так же переопределяю запросы на SQL таблицы. Короче круто получилось, кода минимум, результат максимум, заказчик доволен.