SetPrepareSelectFunction

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

SetPrepareSelectFunction

Сообщение Andrew™ »

собственно появилась вот такая subj функция, параметром для которой выставляется адрес процедуры, прототип которой - это процедура с одним параметром (MAVSelect)

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

тут партировал с 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

в результате не меняя ничего в работающей программе я переопределил получение данных из SQL View в SQL Table, независимо какие при этом сложные запросы формировались, результирующий SELECT получается правильным

я уже когда то рассказывал - как перехватывать вызовы RTL функций, для таких таблиц я перехватываю и MAVUPDATE, MAVINSERT, MAVDELETE функции и так же переопределяю запросы на SQL таблицы. Короче круто получилось, кода минимум, результат максимум, заказчик доволен.
Ответить