Имя: Пароль:
1C
1C 7.7
v7: Условие в прямых запросах
,
0 Альбатрос
 
25.04.13
09:11
Всем привет!

Есть 2 реквизита с типом "Дата":
1. ДатаДок
2. ДатаПлатежа.
Есть Период с НачДата по КонДата.

Нужно реализовать в прямом запросе такое условие:

Выбрать документы, в которых ДатаДок между НачДата и Кондата, но при этом ДатаПлатежа не заполнен, и те документы, в которых ДатаПлатежа заполнен и попадает в период между НачДата и Кондата.

Вопрос номер 1: Как проверить на заполненность ДатаПлатежа?
Вопрос номер 2: Каков должен быть синтаксис условия?

Пробовал вот так:

   |WHERE
       |((Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND ДатаПлатежа < :НачДата) OR (ДатаПлатежа  BETWEEN :НачДата AND :КонДата~)
1 Wobland
 
25.04.13
09:13
пустая дата - 1е января 1753 г.
2 Wobland
 
25.04.13
09:14
давно бы уж сделал select date from your_docs where date<19810101 да посмотрел бы на пустоту
3 zak555
 
25.04.13
09:15
(( НачДата < = ДатаДок ) и (ДатаДок <= КонДата)) И (ПустоеЗначение(ДатаПлатежа)=0 И (( НачДата < = ДатаПлатежа ) и (ДатаПлатежа <= КонДата)))
4 Альбатрос
 
25.04.13
09:17
(3) Чо так можно в прямом запросе? =)
5 Wobland
 
25.04.13
09:17
(4) нет
6 Альбатрос
 
25.04.13
09:18
(2) То есть во так надо:
       |WHERE
       |((Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND ДатаПлатежа = :ПустДата) OR (ДатаПлатежа  BETWEEN :НачДата AND :КонДата~)
   глЗапросSQL.УстановитьТекстовыйПараметр("ПустДата", '01.01.1753');
7 Альбатрос
 
25.04.13
09:24
или не так? =)
8 viktor_vv
 
25.04.13
09:27
Судя по твоему условию

(Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND (ДатаПлатежа = :ПустДата OR (ДатаПлатежа  BETWEEN :НачДата AND :КонДата~))
9 Альбатрос
 
25.04.13
09:33
(8) Нееет. Так ведь получается, что если датаПлатежа заполнено и попадает в период, а ДатаДок не попадает в период, то такие док-ты не выбираются. А должны=)
10 Ёпрст
 
25.04.13
09:36
(0)
более чем достаточно

|WHERE Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
11 Ёпрст
 
25.04.13
09:37
для выполнения следующего условия
>>>
Выбрать документы, в которых ДатаДок между НачДата и Кондата, но при этом ДатаПлатежа не заполнен, и те документы, в которых ДатаПлатежа заполнен и попадает в период между НачДата и Кондата.
12 Альбатрос
 
25.04.13
09:41
(10) Недостаточно. Если ДатаПлатежа заполнен и меньше, чем конДата, то такие Док-ты не должны попадать, даже если ДатаДок попадает в период выборки.
13 Альбатрос
 
25.04.13
09:41
+(12) Очепятка: Если ДатаПлатежа заполнен и меньше, чем НачДата
14 Ёпрст
 
25.04.13
09:44
(12)
|WHERE (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
and (ДатаПлатежа = :ПустДата OR ДатаПлатежа  <:НачДата)
15 Альбатрос
 
25.04.13
09:48
(14) В таком случае не попадут док-ты, у которых ДатаДок не попал в период выборки, ДатаПлатежа попал =). Такие должны выбираться
16 Ёпрст
 
25.04.13
09:48
(15) ты сам себе противоречишь
17 Ёпрст
 
25.04.13
09:49
Сформулируй условие по-человечьи, а не меняй его по-ходу пьесы
18 Альбатрос
 
25.04.13
09:52
(16) Почему? совсем нет. Попробую еще раз объяснить:
Должны выбираться документы:
1. Если ДатаПлатежа не заполнен, то те, у которых ДатаДок попал в период выборки.
+
2. Если ДатаПлатежа заполнен, то те документы, у которых заполненный ДатаПлатежа попадает в период выборки, независимо от того, попадает ли в эту выборку ДатаДок
19 ADirks
 
25.04.13
09:53
типа того?  и обрати внимание на модификаторы (~~)

((Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND ДатаПлатежа = :ПустДата~~)

OR

(ДатаПлатежа  BETWEEN :НачДата~~ AND :КонДата~~)
20 Альбатрос
 
25.04.13
10:00
(19) Ага, результат получен, но вроде не верный, щая проверю, отпишусь
21 Альбатрос
 
25.04.13
10:21
Всем огромное спасибо!!! Особенно (19), условие в точку.
П.С. почему в (19) два модификатора? Какое у них назначение? В справочном материале, который я чита, написано вот так:
"Модификатор параметра КонДата. Он необходим для того, чтобы в выборку попали документы за последний день. Поле Date_Time_IDDoc, отвечающее за дату, содержит значения вида '20030731767WS0  1O6P   '. Соответственно параметр НачДата будет выглядеть как ‘20030701’, а КонДата с модификатором - ‘20030731Z’"
22 Mikeware
 
25.04.13
10:33
В тексте запроса модификаторы обозначаются символами “~” или “*” после имени
параметра. Количество символов “~” после имени параметра определяет номер
модификатора. Если после имени параметра не указан модификатор, то номер
модификатора равен 0. Так как типом «Неопределенный» (char(23)) можно выразить
любой тип 1С, для этого существует специальный модификатор, обозначаемый
символом “*”, который определен для любого передаваемого типа 1С. Его номер 20.
Модификаторы определены для следующих типов 1С:
Строка
0: char() - строка как есть;
1: char(23) - должна быть передана позиция документа, из которой будет
сформирована строка в формате date_time_iddoc;
Дата
0: char(8) - каноническое представление даты;
1: char(9) - каноническое представление даты + символ “Z” (используется для
обозначения момента времени конца этой даты);
2: datetime.
Агрегатные типы (Перечисление, Справочник, Документ, ВидРасчета, Счет)
       0: char(9) - внутренний идентификатор объекта (короткая строка 6+3);
       1: char(13) - внутренний идентификатор объекта с видом (длинная строка 4+6
+3);
       2: char(15) - внутренний идентификатор объекта с видом и типом (2+4+6+3)
(на самом деле такой тип нигде в 1С не используется, модификатор существует
исключительно для обратной совместимости);
ВидРасчета
Кроме 0 и 1, которые работают как для всех агрегатных типов, 2-й определен особо:
2: Зависит от формата ИБ.
SQL: int - идентификатор вида расчета;
DBF: char(4) - 36-й идентификатор вида расчета;

Примеры:

Передано значение типа число
:ФлагУчастияВРасчетах = 1
:ФлагУчастияВРасчетах * = 'N                     1'

Передано значение типа дата
:ДатаНачала = '20030613'
:ДатаКонца ~ = '20030613Z'
:ДатаКонца ~~ = {d '2003-06-13'}

Передано значение типа Справочник.Контрагенты
:Контрагент = '    H6   '
:Контрагент ~ = '  1W    H6   '
:Контрагент * = 'B1  1W    H6           '
23 Альбатрос
 
25.04.13
10:37
(22) Спасибо!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс