Имя: Пароль:
1C
1C 7.7
v7: Черный запрос работает по-разному в DBF и SQL.
0 Drac0
 
03.08.11
15:07
Из-за небольшого косяка в учете приходится обрабатывать непроведенные документы за месяц. Для этого пишу следующий запрос:

       Нач = НачМесяца(ДатаАктуальности);
   Кон = КонМесяца(ДатаАктуальности);
   
   ТекстЗапросаПерем =
   "//{{ЗАПРОС(Запрос)
   |Период с Нач по Кон;
   |ОбрабатыватьДокументы Непроведенные;
   |Обрабатывать НеПомеченныеНаУдаление;
   |КадрПеремещение      = Документ.КадровоеПеремещение.ТекущийДокумент;
   |Начало        = Документ.КадровоеПеремещение.Начало;
   |СотрудникП     = Документ.КадровоеПеремещение.Сотрудник;
   |Подразделение = Документ.КадровоеПеремещение.Подразделение;
   |Функция Сч = Счётчик();
   |Условие(СотрудникП = Сотрудник);
   |Условие((Начало >Нач) И (Начало < Кон));
   |Условие(Подразделение=ВыбПодразделение);
   |"//}}ЗАПРОС
   ;
   
   Если ЗапросПерем.Выполнить(ТекстЗапросаПерем) = 0 Тогда
       Возврат 0;
   КонецЕсли;
   
   Если ЗапросПерем.Сч > 0 Тогда
       Возврат 1;
   КонецЕсли;


Смысл в следующем: ищутся непроведенные документы кадрового перемещения за месяц, в которых дата Начала действия приказа попадает в этот месяц и происходит перемещение в выбранное подразделение. В DBF версии все хорошо: когда надо счетчик равен 0, когда надо 1 или более. Но вот в SQL счетчик всегда возвращает 1. Что это такое и как можно это обойти? Заранее благодарен.
1 vde69
 
03.08.11
15:09
ЗапросПерем.ИспользоватьSQL(0)
2 Ёпрст
 
03.08.11
15:10
Всё правильно, у тебя всегда 1 запись будет, без группировки, в лучшем случае.
3 Drac0
 
03.08.11
15:11
Эту функцию планируется реализовать в скором времени.
4 Drac0
 
03.08.11
15:12
(2) Это для SQL, а для DBF такой запрос нормальный, получается?
5 palpetrovich
 
03.08.11
15:15
зачем тут вообще запрос?
6 Drac0
 
03.08.11
15:17
(5) Мне просто удобнее так условия накладывать.
7 Ёпрст
 
03.08.11
15:19
счетчик всего лишь считает, количество записей вошедших в выборку..
8 Drac0
 
03.08.11
15:19
Хотя с неработающим счетчиком и вправду, "зачем?" ...
9 Drac0
 
03.08.11
15:20
(7)Почему в DBF версии счетчик дает 0, если нет документов, удовлетворяющих условию?
10 Ёпрст
 
03.08.11
15:20
По идее, счётчик для данного запроса всегда 0 должен возвращать.
11 Ёпрст
 
03.08.11
15:21
+10 и это не зависит от формата ИБ.
12 Скользящий
 
03.08.11
15:21
В (1) дали ответ.
13 Drac0
 
03.08.11
15:22
(12) Отказаться от SQL только пока собираемся. Поэтому на текущий момент - не вариант.
14 Drac0
 
03.08.11
15:22
(11) Как оказалось, зависит.
15 Ёпрст
 
03.08.11
15:23
(14) это же не весь текст запроса ?
16 Drac0
 
03.08.11
15:24
(15) Весь :)
17 Ахиллес
 
03.08.11
15:29
Блин, а просто посмотреть, что в выборке возвращается?
18 Ёпрст
 
03.08.11
15:31
(17) в выборке ничего нет - у автора нет группировки.

а так, для этого запроса, ответ в (1)
19 Ёпрст
 
03.08.11
15:32
хотя, и так должен возвращать правильное значение.
20 Drac0
 
03.08.11
15:34
(19) Платформа 27, MSSQL 2000, ЗиК типовая на 100%. Можете проверить на демобазе.
21 Ёпрст
 
03.08.11
15:36
(19) я проверил, всё правильно возвращает, правда, скуль 2008.
22 Ёпрст
 
03.08.11
15:37
+21
//*******************************************
Процедура Сформировать()
   ТекстЗапроса =
   "
   |Период с Начдата По КонДата;
   |Док = Документ.Реализация.ТекущийДокумент;
   |Функция Счётчик = Счётчик();
   |";
   Запрос = СоздатьОбъект("Запрос");
   Запрос.Выполнить(ТекстЗапроса);
   Сообщить("счётчик "+Запрос.Счётчик);
КонецПроцедуры
23 ado
 
03.08.11
15:38
А если таки добавить группировку по документу?
24 Drac0
 
03.08.11
15:40
(22) Тогда может от скуля зависит. А если с условиями на выборку?

(23) Тогда лучше выборку документов сделать. Чем сейчас и занят.
25 Ахиллес
 
03.08.11
16:02
Нач = НачМесяца(ДатаАктуальности);
   Кон = КонМесяца(ДатаАктуальности);
   
   ТекстЗапросаПерем =
   "//{{ЗАПРОС(Запрос)
   |Период с Нач по Кон;
   |ОбрабатыватьДокументы Непроведенные;
   |Обрабатывать НеПомеченныеНаУдаление;
   |КадрПеремещение      = Документ.КадровоеПеремещение.ТекущийДокумент;
   |Начало        = Документ.КадровоеПеремещение.Начало;
   |СотрудникП     = Документ.КадровоеПеремещение.Сотрудник;
   |Подразделение = Документ.КадровоеПеремещение.Подразделение;
   |Группировка ТекущийДокумент;
   |Условие(СотрудникП = Сотрудник);
   |Условие((Начало >Нач) И (Начало < Кон));
   |Условие(Подразделение=ВыбПодразделение);
   |"//}}ЗАПРОС
   ;
   
  ЗапросПерем.Выполнить(ТекстЗапросаПерем);

Пока ЗапросПерем.Группировка(1) = 1 Цикл
Возврат 1;
Конеццикла;

Возвтат 0;
26 Drac0
 
03.08.11
16:07
(25) Да, так явно лучше. Что-то я как баран уперся: либо счетчик, либо никак.