Имя: Пароль:
1C
1C 7.7
v7: 1SQLite: как получить пустую дату в запросе, как пустое значение?
,
0 Zhuravlik
 
21.02.13
18:17
Здравствуйте. Делаю запрос из поставщика, по справочнику. Если в элементе справочника типа "Дата" указано пустое значение, то типизация $Дата возвращает строку "  .  .  ". И на ПустоеЗначение() она не проходит, а как сделать чтоб проходило?
Сейчас пользуюсь функцией:

//======================================================================
Функция ПроверкаПустойДатыЗапроса(дт)
   //Пустые даты запрос возвращает как "  .  .  ". Чтобы определить, что дата пуста
   //ввел эту функцию
   Возврат Найти("0123456789", Лев(дт, 1));
КонецФункции // ВернутьДату
1 viktor_vv
 
21.02.13
18:28
Скуль ?
2 orefkov
 
21.02.13
18:30
А если сравнить с Дата(0) ?
3 viktor_vv
 
21.02.13
18:31
Там пустая дата, это 1 января 1753 года .
Можешь через case прверять в запросе и заменять.
Хотя может это с типизацией как-то связано.
4 Zhuravlik
 
21.02.13
18:31
(1) SQLite
(2) В см. с ПолучитьПустоеЗначение("Дата")? Но это же все-равно функция, а я прямо из запроса хотел получать...
5 Zhuravlik
 
21.02.13
18:32
(3) Ушел курить case)
6 viktor_vv
 
21.02.13
18:36
(4) База на чем ?
Хотя я уже не помню почему, но отказался в запросе это делать, подменял при выводе строки.
И это для Табличного поля из 1С++.
Что-то типа такого
//        |    Case When $ДокЛого.СрокИзмененный=Convert(DateTime,'01.01.1753',104) Then '' Else $ДокЛого.СрокИзмененный End as [ДатаВыходаИзм $Дата],
7 viktor_vv
 
21.02.13
18:37
(6) И мне просто надо было в поле выводить две точки.
8 vinogradъ
 
21.02.13
18:39
(6) просто $ДокЛого.СрокИзмененный = '17530101'
9 КонецЦикла
 
21.02.13
18:40
10 Zhuravlik
 
21.02.13
18:43
(6) ДБФ
11 Zhuravlik
 
21.02.13
18:44
(7) Так они и так выводятся? Это я сегодня решил попробовать переписать консоль с поставщикаТЗ на поставщик SQLite, а так в тз если задаю дату как "", то точки выводятся нормально.
12 viktor_vv
 
21.02.13
18:46
(8) Ну в приципе одно и тоже, отказался по другой причине, кажетя 1С++ не приводил пустую дату к виду "  .  .  " , сейчас уже не помню.
13 viktor_vv
 
21.02.13
18:48
(11) Ну так в том=то и дело, что в ТЗ оно уже типизировано по одинэсовскому стандарту, а через поставщик Запрос получается геммор.
14 orefkov
 
21.02.13
18:52
(4)
В запросе сравнивай с 8ю пробелами, вроде так.
15 orefkov
 
21.02.13
18:54
Вообще лучше бы текст запроса привел и что не так получается.
16 Zhuravlik
 
21.02.13
18:55
(14) Ну да, вы мне говорили что проверка на пустую дату в запросе - это 8 пробелов. Это мне в запросе с CASE просто проверять? Если 8 пробелов, то дату не типизирую?
Наверно околесицу несу...
Буду курить дома, а то мне бежать пора, автобус едет.
Спасибо за советы)
17 orefkov
 
21.02.13
19:05
Я бы смог помочь лучше, видя текст запроса.
18 viktor_vv
 
21.02.13
19:29
(12)+ Вспомнил в чем там проблема была, как раз с типизацией

Вот на такую конструкцию

       |    Case When $ДокТранспорт.СрокИзмененный=Cast('17530101' as DateTime) Then '  .  .  ' Else $ДокТранспорт.СрокИзмененный End as [ДатаВыходаИзм $Дата],

В поставщике данных ТП  ПоставщикДанныхODBC MSSQL
ругался на некоректные входные данные для конвертации.

А на такую

       |    Case When $ДокТранспорт.СрокИзмененный=Cast('17530101' as DateTime) Then '' Else $ДокТранспорт.СрокИзмененный End as [ДатаВыходаИзм $Дата],

В пустой дате выводил 01.01.01
Я так понял типизация к дате скульными средствами выполнялась.
19 КонецЦикла
 
21.02.13
19:58
(16) Блин, снова автобус мешает работе!
20 viktor_vv
 
21.02.13
20:11
(19) И не говори, уже второй раз съезжает :)).
21 КонецЦикла
 
21.02.13
20:13
(20) и это только то, что мы успели заметить :)
22 Zhuravlik
 
21.02.13
23:07
(17)
Вот, например. Есть справочник "Тест", в нем один реквизит - "дтФильтр", типа "Дата". В нем всего два элемента, один с пустой датой - другой с '01.01.01'.
Выполняю такой код:

   база = СоздатьОбъект("SQLiteBase");
   база.Открыть(":memory:");
   Запрос = База.НовыйЗапрос();    
   тз = Запрос.ВыполнитьЗапрос("
   |SELECT
   |    TRIM(спр.DESCR) as [Наименование],
   |    спр.дтФильтр as [дтФильтр $Дата]
   |FROM
   |    [Справочник.Тест] as [спр]
   |");
   
   тз.ВыбратьСтроки();
   Пока тз.ПолучитьСтроку() = 1 Цикл        
       Сообщить(тз.Наименование + ": " +ПустоеЗначение(тз.дтФильтр));
   КонецЦикла;


И он мне сообщает:
Первый: 0
Второй: 0

Хотя в "Первый" - дата пустая, а во втором - нет.

(18) Сейчас буду пробовать что-нибудь изобрести с CASE у себя, спасибо)
(19)(20)(21) А что ж поделать) Если на автобус не попаду - пешочком через лес зимним вечером. И курсы прогуляю по аглицкому, деваться некуда)))
23 Zhuravlik
 
21.02.13
23:11
+ Все очень просто решилось)))
   тз = Запрос.ВыполнитьЗапрос("
   |SELECT
   |    TRIM(спр.DESCR) as [Наименование],
   |/*Просто обрезаю :)))*/
   |    TRIM(спр.дтФильтр) as [дтФильтр $Дата]
   |FROM
   |    [Справочник.Тест] as [спр]
   |");

Сообщает все как надо)

Первый: 1
Второй: 0
24 Туц
 
22.02.13
07:30
Как-то так.
   база = СоздатьОбъект("SQLiteBase");
   база.Открыть(":memory:");
   Запрос = База.НовыйЗапрос();
   Запрос.Подставлять("ПустаяДата",ПолучитьПустоеЗначение("Дата"));  
   тз = Запрос.ВыполнитьЗапрос("
   |SELECT
   |    TRIM(DESCR) Наименование,
   |    дтФильтр [дтФильтр $Дата]
   |FROM
   |    Справочник.Тест
   |WHERE дтФильтр <> :ПустаяДата
   |");
   
   тз.ВыбратьСтроки();
   Пока тз.ПолучитьСтроку() = 1 Цикл        
       Сообщить(тз.Наименование + ": " +ПустоеЗначение(тз.дтФильтр));
   КонецЦикла;