Рассмотрим использование подзапросов на примере запроса Счета (рис. 2.3.16).
В данном запросе нужна возможность отфильтровывать неоплаченные счета пациентов. Так как у счета нет признака "Оплачен", для поиска неоплаченных счетов настраивается подзапрос nopaid, в котором анализируется задолженность пациентов.
Основной запрос строится по таблице Счета, к которой присоединяются необходимые дополнительные таблицы. У основного запроса условие в секции WHERE выглядит следующим образом:
(FM_INVOICE.FM_INVOICE_ID in ([nopaid]) and :nopaid=%ParseLangStringDef('#fra#OUI#rus#ДА#eng#YES') and FM_INVOICE.INVOICE_STATE <>'D')
Если задан параметр Только неоплаченные счета (:nopaid ='ДА'), выбираются FM_INVOICE_ID (счета), принадлежащие множеству [nopaid], определяемому подзапросом, при этом статус счета (INVOICE_STATE) не должен быть "Отменен" ('D').
Рисунок 2.3.16. Запрос "Счета"
Для создания подзапроса нужно встать курсором на месте, где должен находиться подзапрос, и в меню кнопки Добавить или в контекстном меню выполнить команду Подзапрос. |
Откроется окно конструктора запросов (рис. 2.3.17). Для подзапроса необходимо указать имя и формулу связи с основным запросом. Для поиска неоплаченных счетов используется основная таблица Оплата по задолженностям за услуги (FM_PAYMENTS) и связанная с ней таблица Счет (Счета)(FM_INVOICE).
Имя подзапроса – nopaid, формула связи:
FM_INVOICE.FM_INVOICE_ID =FM_INVOICE00.FM_INVOICE_ID,
где FM_INVOICE00 — алиас таблицы FM_INVOICE. Таким образом, связь осуществляется по ID счета.
Опция SELECT DISTINCT позволяет исключить повторяющиеся одинаковые записи.
Рисунок 2.3.17. Создание подзапроса: выбор таблиц и задание условий
В секции WHERE прописывается условие, по которому отфильтровываются только счета пациентов:
FM_INVOICE00.PATIENTS_ID is not null
В секции HAVING условие
ISNULL( sum(case when FM_PAYMENTS.TRAN_AMOUNT> 0 then FM_PAYMENTS.TRAN_AMOUNT else 0 end), 0) < min(FM_INVOICE00.TOTAL_AMOUNT)
позволяет найти неоплаченные или частично оплаченные счета: считается сумма неотрицательных транзакций (TRAN_AMOUNT) и проверяется, меньше ли она выставленной по счету суммы к оплате (TOTAL_AMOUNT).
На закладке Запрашиваемые данные выбирается одно поле — FM_INVOICE_ID таблицы Счет (Счета), по которому устанавливается группировка (рис. 2.3.18).
Рисунок 2.3.17. Создание подзапроса: запрашиваемые данные
Таким образом, подзапрос возвращает множество FM_INVOICE_ID — неоплаченных счетов пациентов.
Далее в основном запросе Счета создается параметр NOPAID (рис. 2.3.18).
Таким образом, при выполнении запроса можно задать значение этого параметра, равным "ДА" — будут отобраны счета подзапросом nopaid, иначе будут отображены все счета.
Рисунок 2.3.18. Параметр NOPAID