Есть документ "Заявка на расходование средств" на его основании можно создать документ, например "Платежное поручение", как получить все заявки, на основании которых не было создано никаких документов?
Если касается только Заявок на расходование средств" то
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВложенныйЗапрос.ЗаявкаНаРасходование,
ВложенныйЗапрос.СуммаВзаиморасчетовПриход,
ВложенныйЗапрос.СуммаВзаиморасчетовКонечныйОстаток
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗаявкиНаРасходованиеСредствОстаткиИОбороты.ЗаявкаНаРасходование КАК ЗаявкаНаРасходование,
СУММА(ЗаявкиНаРасходованиеСредствОстаткиИОбороты.СуммаВзаиморасчетовПриход) КАК СуммаВзаиморасчетовПриход,
СУММА(ЗаявкиНаРасходованиеСредствОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК СуммаВзаиморасчетовКонечныйОстаток
ИЗ
РегистрНакопления.ЗаявкиНаРасходованиеСредств.ОстаткиИОбороты КАК ЗаявкиНаРасходованиеСредствОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ЗаявкиНаРасходованиеСредствОстаткиИОбороты.ЗаявкаНаРасходование) КАК ВложенныйЗапрос
ГДЕ
ВложенныйЗапрос.СуммаВзаиморасчетовПриход = ВложенныйЗапрос.СуммаВзаиморасчетовКонечныйОстаток
ВЫБРАТЬ Заявки.Ссылка
ИЗ Документ.ЗаявкаНаРасходованиеСредств КАК Заявки
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ ПлатежноеПоручение.ДокументОснование КАК Заявка
ИЗ Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ СписаниеСРасчетногоСчета.ДокументОснование КАК Заявка
ИЗ Документ.СписаниеСРасчетногоСчета КАК СписаниеСРасчетногоСчета
//тут подобные запросы на остальные документы, которые можно ввести на основании.
//Эту секцию можно формировать программно по метаданным
) КАК Документы
ПО Документы.Заявка = Заявки.Ссылка
ГДЕ Документы.Заявка IS NULL
В MS SQL Server2000 нет операции MINUS, как в ORACLE. Поэтому приходится изощряться, чтобы получить тот же результат:
С помощью обычного подзапроса:
SELECT FName FROM #A
WHERE
FName NOT IN(SELECT FName FROM #B)
Пояснение: вначале выполняется подзапрос. Затем выполняется основной запрос, который ищет и выводит все строки таблицы #A, отсутствующие в таблице #B.
С помощью коррелированного подзапроса:
SELECT * FROM #A
WHERE
NOT EXISTS (SELECT * FROM #B WHERE #B.FName = #A.FName)
Пояснение: Каждая строка из таблицы #A по одной передаётся в подзапрос. Там ищется, есть ли такая запись в таблице #B. Если нет, то соответствующая строка из таблицы #A будет приобщена к результату.
С помощью LEFT OUTER JOIN:
SELECT #A.FName FROM
#A LEFT OUTER JOIN #B ON (#A.FName = #B.FName)
WHERE
#B.FName IS NULL
ВЫБРАТЬ
Заявки.Ссылка,
Заявки.Номер,
Заявки.Дата,
Заявки.КурсДокумента,
Заявки.ВалютаДокумента,
Заявки.СуммаДокумента,
Заявки.Контрагент,
Заявки.Комментарий,
Заявки.Организация,
Заявки.ДатаРасхода,
Заявки.Состояние
ИЗ
Документ.ЗаявкаНаРасходованиеСредств КАК Заявки
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ПлатежноеПоручениеИсходящее.ДокументОснование КАК Заявка
ИЗ
Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручениеИсходящее) КАК Документы
ПО (Документы.Заявка = Заявки.Ссылка)
ГДЕ
Документы.Заявка ЕСТЬ NULL
И Заявки.Проведен = &Проведен
И Заявки.ДатаРасхода >= &ДатаНачала
Показать
Всё работает но есть проблема: Если платежное поручение создано и проведено раньше ДатыРасхода, то такая заявка попадает в отчет, не смотря на то, что на её основании уже есть платежка. Как решить эту проблему?
(18) tango,
Вами выбрана неправильная картинка. Текущему запросу соответствует картинка чуть ниже (where b.key is null).
Это же такой же как и Ваш запрос из (8):
SELECT #A.FName FROM
#A LEFT OUTER JOIN #B ON (#A.FName = #B.FName)
WHERE
#B.FName IS NULL
Запрос должен работать правильно. Как я и писал
Единственное, что я могу предположить, что в таком поручении не заполено поле ДокументОснование.
3762515,
в Вашей платежке (которая ранее даты расхода) документ основание заполнен?
(11) 3762515,
Ну с одним видом документов можно было без подзапроса (хотя это не важно):
ВЫБРАТЬ
...
ИЗ Документ.ЗаявкаНаРасходованиеСредств КАК Заявки
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручениеИсходящее
ПО ПлатежноеПоручениеИсходящее.ДокументОснование = Заявки.Ссылка
ГДЕ ПлатежноеПоручениеИсходящее.ДокументОснование ЕСТЬ NULL
По поводу вопроса: если текст запроса такой, то дата платежного поручения не задействована в запросе и не имеет никакого значения. Единственное, что я могу предположить, что в таком поручении не заполено поле ДокументОснование.
Если касается только Заявок на расходование средств" то
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВложенныйЗапрос.ЗаявкаНаРасходование,
ВложенныйЗапрос.СуммаВзаиморасчетовПриход,
ВложенныйЗапрос.СуммаВзаиморасчетовКонечныйОстаток
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗаявкиНаРасходованиеСредствОстаткиИОбороты.ЗаявкаНаРасходование КАК ЗаявкаНаРасходование,
СУММА(ЗаявкиНаРасходованиеСредствОстаткиИОбороты.СуммаВзаиморасчетовПриход) КАК СуммаВзаиморасчетовПриход,
СУММА(ЗаявкиНаРасходованиеСредствОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК СуммаВзаиморасчетовКонечныйОстаток
ИЗ
РегистрНакопления.ЗаявкиНаРасходованиеСредств.ОстаткиИОбороты КАК ЗаявкиНаРасходованиеСредствОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ЗаявкиНаРасходованиеСредствОстаткиИОбороты.ЗаявкаНаРасходование) КАК ВложенныйЗапрос
ГДЕ
ВложенныйЗапрос.СуммаВзаиморасчетовПриход = ВложенныйЗапрос.СуммаВзаиморасчетовКонечныйОстаток