Имя: Пароль:
1C
 
Проверка на пустое значение поля DBF
0 admin1s
 
05.01.11
23:22
Подскажите, не получается проверить на пустое значение поле DBF файла, и при нахождении пустого значения-удалить строку. Проверялись разные поля на равенство = ''. Поле имеет тип ДАТА. первый код не работает, если стоит равенство (= ''), когда ставишь неравенство (<> ''), работает. Что не так? Спасибо заранее

Код 1: (не работает как надо)

Процедура ДБФПациент()
   ДБФ  = СоздатьОбъект("xBase");
   ДБФ.ОткрытьФайл(ПутьДБ,,0); // на форме выбор файла
   ДБФ.КодоваяСтраница(0);        
   ДБФ.Первая();
          Пока ДБФ.ВКонце() = 0 Цикл
       Если ДБФ.Date_pricr = '' Тогда
           Сообщить("Пустое значение поля - "+ДБФ.NAME);
       КонецЕсли;
       КО = ДБФ.КодОшибки();
       ДБФ.Следующая();
   КонецЦикла;    
КонецПроцедуры

Код 2. При не равенстве пустому значению, выдает данные

Процедура ДБФПациент()
   ДБФ  = СоздатьОбъект("xBase");
   ДБФ.ОткрытьФайл(ПутьДБ,,0);
   ДБФ.КодоваяСтраница(0);        
   ДБФ.Первая();
          Пока ДБФ.ВКонце() = 0 Цикл
       Если ДБФ.Date_pricr <> '' Тогда      
           Сообщить("не Пустое значение поля - "+ДБФ.NAME);
       КонецЕсли;
       КО = ДБФ.КодОшибки();
       ДБФ.Следующая();
   КонецЦикла;    
КонецПроцедуры
1 fly7
 
05.01.11
23:29
Приведи к строке
Строка(ДБФ.Date_pricr) = ""
или возможно Строка(ДБФ.Date_pricr) = "  .  .    "
не помню точно
2 Злобный Йожег
 
05.01.11
23:29
Если ПустоеЗначение(ДБФ.Поле1) = 1 Тогда
//удаляем
КонецЕсли;
3 VasilyKushnir
 
05.01.11
23:52
(2) А если поля Поле1 нет? (смайлик подмигивания )
4 Злобный Йожег
 
05.01.11
23:56
(3) тады пусть переводит мне бабки за то, чтобы появилось...
5 VasilyKushnir
 
06.01.11
00:03
(4) +100 :-)))))
6 sidalexsandr
 
06.01.11
01:43
(0)
1) Может в поле есть пробелы. Попробуй:
Если ПустоеЗначение(СокрЛП(ДБФ.Date_pricr)) = 1 Тогда

   // Значит пустое поле

КонецЕсли;

2)А ты не думаеш о том что удаляя строку ты можеш нарушить процесс выборки строк. Помойму нашел первую строку с пустым полем удалил и потом заново сначала стал читать файл.
7 admin1s
 
06.01.11
10:00
(1) В строку и в число форматировал! не помогло!
' .  .  ' - пробовал!

(6)1 Пробелы убирал - тоже не работает!
(6)2 этот код вообще не сообщает о пустых значениях ((
8 andrewks
 
06.01.11
10:05
Если ДБФ.Date_pricr = ПолучитьПустоеЗначение("Дата") Тогда
9 Denizzz
 
06.01.11
10:08
посмотри что там в пустом значении
Сообщить("/" + ДБФ.Date_pricr + "/");
10 admin1s
 
06.01.11
10:13
(9) странно, но код ничего не выдал в сообщить!
11 andrewks
 
06.01.11
10:14
(10) не верю! (c)
12 Denizzz
 
06.01.11
10:15
(10) ничего не выдал или выдал "//" ?
13 Ork
 
06.01.11
10:15
(0) Если поле "Date_pricr" имеет тип Дата - не нужно ничего никуда переводить. Достаточно такой проверки:
ПустоеЗначение(ДБФ.Date_pricr)
14 admin1s
 
06.01.11
10:16
(10) вообще пусто, то и странно!
15 KRV
 
06.01.11
10:17
(0) а само поле какой тип?
16 andrewks
 
06.01.11
10:17
(13) +1
17 Ork
 
06.01.11
10:18
(15) +100500. Вот вот. И я о том же.
18 andrewks
 
06.01.11
10:18
(14) развоТ
19 KRV
 
06.01.11
10:18
+(15) количество знаков в году? может ищешь не то? :))
20 KRV
 
06.01.11
10:19
(18) неа.. Новый год был.. :))
21 1Сергей
 
06.01.11
10:19
сейчас окажется что ДБФ-ка ваще не открыта
22 admin1s
 
06.01.11
10:20
Снова код привожу на суд форумчан, может чего пропустил, глаз типа замылился:

Пока ДБФ.ВКонце() = 0 Цикл
Если ПустоеЗначение(ДБФ.Date_pricr) = 1 Тогда      
// Сообщить("Пустое значение поля - "+ДБФ.NAME);
  Сообщить("/" + ДБФ.Date_pricr + "/");
// ДБФ.Удалить();
КонецЕсли;
КО = ДБФ.КодОшибки();
Состояние("Выполняется обработка "+ДБФ.NAME);
ДБФ.Следующая();
КонецЦикла;
23 1Сергей
 
06.01.11
10:21
(22) дык... условие-то убери, если оно не срабатывает
24 andrewks
 
06.01.11
10:22
Пока ДБФ.ВКонце() = 0 Цикл
Сообщить("/" + ДБФ.Date_pricr + "/");
ДБФ.Следующая();
КонецЦикла;

а так? как выглядят пустые значения?
25 KRV
 
06.01.11
10:22
(22) семдесятьчетырнацатьиещедвараза: поле как записато?
26 Denizzz
 
06.01.11
10:22
Вынеси Сообщить из условия
27 Denizzz
 
06.01.11
10:23
если тип Int то проверять на 0 вроде... хотя хз)
28 admin1s
 
06.01.11
10:25
(19) тип дата: ДД.ММ.ГГГГ
29 Ork
 
06.01.11
10:27
(28) Дата в ДБФ вот так "ДД.ММ.ГГГГ" не выглядит.
30 andrewks
 
06.01.11
10:29
(28) хде ответ на (24)?
31 admin1s
 
06.01.11
10:30
(30) жду... идет обработка, там 183000 записей
32 Denizzz
 
06.01.11
10:32
(31) и ни разу сообщение не выдало?!
33 admin1s
 
06.01.11
10:32
(24) выдает даты списком: /01.01.72/  и пустые значения в конце: /  .  .  /
34 1Сергей
 
06.01.11
10:33
(33) скорее всего строчный тип
35 admin1s
 
06.01.11
10:33
Отойти надо на часок...
36 Denizzz
 
06.01.11
10:34
Если Строка(ДБФ.Date_pricr) = "  .  .  " Тогда
37 andrewks
 
06.01.11
10:34
(33) та-а-а-ак,
Если Строка(ДБФ.Date_pricr)="  .  .  "
38 admin1s
 
06.01.11
10:35
(29) открывал FieldWin выдвал именно так. ДД.ММ.ГГГГ почему показывает как ДД.ММ.ГГ

(34) надо проверить на Тип, может правда строка...
39 1Сергей
 
06.01.11
10:36
(34)+
Если СокрЛП(Строка(ДБФ.Date_pricr)) = ".  ." Тогда
40 Denizzz
 
06.01.11
10:37
(39) ога, так наверняка)
41 andrewks
 
06.01.11
10:38
+(37) Если СтрЗаменить(Строка(ДБФ.Date_pricr)," ","")=".."
:-)
42 Ork
 
06.01.11
10:38
(0) Пилят. Неужели так тяжело посмотреть тип поля?
43 andrewks
 
06.01.11
10:39
(42) ога. лучче мистян напрячь :-)
44 KRV
 
06.01.11
10:40
(задумавшись).. не поможет..
45 admin1s
 
06.01.11
10:41
(39) не работает
46 Denizzz
 
06.01.11
10:41
(42) видимо таким образом автор и пытается вычислить тип поля)
47 admin1s
 
06.01.11
10:42
(42)(43) тип дата, как я и писал (0)
48 KRV
 
06.01.11
10:44
(47) количество знаков в годе?! у тебя вылетает за возможный период!
49 smaharbA
 
06.01.11
10:44
а чо там про 1899 год, к дбф это не относится ?
50 Ork
 
06.01.11
10:44
(47) Тогда проверка на пустое значение - наше фсе.
51 smaharbA
 
06.01.11
10:45
(48) в полях дбф всегда 8 знаков (типа дата)
52 KRV
 
06.01.11
10:50
(51) ога. а потом налетаем на дату, которая за началом рабочего столетия :))
53 KRV
 
06.01.11
10:50
(51) не спорю. в текст приходилось писать взрослых :))
54 orefkov
 
06.01.11
11:23
(52)
Непосредственно в файле лежат 8 символов: YYYYMMDD, без всяких точек. А уж как 1С преобразует поле даты, в котором 8 пробелов - хз.
Можно попробовать так:
Если ДБФ.Date_pricr = '..' Тогда
55 Denizzz
 
06.01.11
11:33
Или уж условие если меньше какой-нибудь определенной старой даты
56 admin1s
 
06.01.11
16:08
(42)(43)(46)
Используя функцию ТипЗначения()

Сообщить("Пустое значение поля - "+ДБФ.NAME+" Тип Значения: "+ТипЗначения(ДБФ.Date_pricr));

Возвращает - 3, т.е. ДАТА, как и писалось впрочем.
57 admin1s
 
06.01.11
16:30
(48) DBF смотрелся двумя способами FieldWin - ДД.ММ.ГГГГ, FoxPro используя Data Session Windows показывает в DBF дату как ДД.ММ.ГГГГ. Файл вообще создан в FoxPro 8 или 9 версии...
58 viktor_vv
 
06.01.11
16:31
Так ты посмотри не как показывает, а в свойствах какой тип пишет.
59 medved_kot
 
06.01.11
19:37
Если Не(ДБФ.Date_pricr <> '') Тогда      
   Сообщить("Пустое значение поля - "+ДБФ.NAME);
КонецЕсли;
60 Песец
 
06.01.11
20:46
(0) Если ПустоеЗначение(Дата(ДБФ.Date_pricr)) = 1 тогда //пустая дата
61 NS
 
06.01.11
21:18
Если Дата(ДБФ.Date_pricr)<'01.01.1900' Тогда
62 admin1s
 
06.01.11
23:21
(60) не то!
63 admin1s
 
06.01.11
23:41
(61) что это даст, если дата в поле будет меньше указаной даты? ничего! тк формат у вашей даты ГГГГ а у меня ГГ, то выдает просто все даты. Не работает!
64 Cthulhu
 
07.01.11
00:38
(63): см.(54)
Если ДатаГод(Дата(ДБФ.Date_pricr))=0 Тогда // пустая дата
65 admin1s
 
07.01.11
23:01
(64) не сработало!
66 admin1s
 
07.01.11
23:02
(54) не сработало!
67 NS
 
07.01.11
23:30
(66) Ты издеваешься? Или на полном серьезе?
Уже миллион раз мог сделать сообщить(строка(ДБФ.Date_pricr)), и проверять на полученную строку.
68 NS
 
07.01.11
23:38
А вообще,
если (лев(сокрлп(ДБФ.Date_pricr))>="0")и(лев(сокрлп(ДБФ.Date_pricr))<="9") тогда не пустая дата.
69 Torquader
 
08.01.11
01:44
Пустая дата может быть в виде пробелов, а может быть датой вида 00.00.0000 (то есть все нули). Как записала программа, которая создаёт DBF-файл, знает только она сама.
Если открыть DBF-файл в Far-е по F3 и посмотреть, что там, то можно быстро понять, как обозначается пустая дата.
70 NS
 
08.01.11
01:47
(69) Простой сообщить() в 1С покажет в каком виде записана дата. И это в этой ветке есть.
71 Torquader
 
08.01.11
02:03
(70) Не факт, так как драйвер DBF будет транслировать дату во что-то более похожее на дату (он определяет тип по заголовку DBF-файла). Если то, что найдено в поле, в дату преобразовать нельзя, то 1С предполагает пустую дату.
72 NS
 
08.01.11
02:25
(71) Не понял о чем вы говорите.
Строка(ДБФ.Date) дает то что ему нужно проверять.
73 admin1s
 
08.01.11
12:01
(67)ни в коем разе, а то что выдает функция собщить я уже описывал в (33) а именно: ДД.ММ.ГГ или - 12.08.48
74 admin1s
 
08.01.11
12:31
При проверке в таком формате: '  .  .  ' и в таком '..' и в таком '' - ничего не дает, конвертация в Дата, Число, Строка тоже. Формат даты: ДД.ММ.ГГ
привожу код которы использовал при проверке поля Date_pricr (ДАТА):

Пока ДБФ.ВКонце() = 0 Цикл
Если ПустоеЗначение(Строка(СокрЛП(ДБФ.Date_pricr)))=1 Тогда
//Если ПустоеЗначение(Дата(ДБФ.Date_pricr)) = 1 Тогда
//Если Дата(ДБФ.Date_pricr)<'01.01.1900' Тогда
//Если ДатаГод(Дата(ДБФ.Date_pricr))=0 Тогда
//Если ДБФ.Date_pricr = '..' Тогда
//Если ДБФ.Date_pricr = ' . . ' Тогда
//Если ДБФ.Date_pricr = '' Тогда
   ДБФ.Удалить();
   Сообщить("Удален "+ДБФ.NAME+СимволТабуляции+ДБФ.Date_pricr);
   КонецЕсли;
   КО = ДБФ.КодОшибки();
   Состояние("Выполняется обработка "+ДБФ.NAME);
   ДБФ.Следующая();
КонецЦикла;                                          
ДБФ.Записать();
75 NS
 
08.01.11
13:58
(74) Круто, тратить три дня на такую фигню.
Точно рабочий варинат в (68)
Еще варианты -
стрдлина(сокрлп(строка(ДБФ.Date_pricr)))<3 Тогда
стрзаменить(сокрлп(строка(ДБФ.Date_pricr))," ","")="." тогда

и т.д.

И один вопрос - какого ... вы все проверки делаете в одинарных ковычках? Вам миллион раз написали - привести к строке, и соотвественно сравнивать с строкой! Строка заключается в двойные кавычки!!!
76 NS
 
08.01.11
13:59
имелось в виду.
стрзаменить(сокрлп(строка(ДБФ.Date_pricr))," ","")=".." тогда
77 Cthulhu
 
08.01.11
14:06
(65): ну, у меня работает причем не в одном месте.
дай тогда ДБФ то посмотреть.
78 Torquader
 
08.01.11
14:15
Вообще, проще всего тогда дату преобразовать в строку, проверить, чтобы строка была не пустой и преобразовать строку обратно в дату.
// ТестоваяДата - проверяемое значение
Если ТипЗначения(ТестоваяДата)=3 Тогда
// переводим в строку с заменой
// в принципе, замену можно не делать, так как мы потом обратно переводим в дату
ТестоваяСтрока=СокрЛП(Строка(ТестоваяДата));
// преобразуем полученную строку обратно в дату
// то есть мы уже получаем значение даты в 1С
// и там пустое значение получается однозначно
ВремДата=Дата(ТекстоваяСтрока);
// Проверяем стандартную для 1С переменную на значение даты
Если ПустоеЗначение(ВремДата)=0 Тогда
 // Проверяем, что у нас дата написана правильно и корректно
 // (Никто не мешает в DBF записать 99.99.99)
 Если ТестоваяДата=ВремДата Тогда
  Результат="Правильная дата";
 Иначе
  Результат="Неправильная дата";
 КонецЕсли;
Иначе
 Результат="Пустая дата";
КонецЕсли;
Иначе
Результат="НеДата";
КонецЕсли;
79 G-Re
 
08.01.11
15:19
Удивительно, сколько потрачено усилий на решение этого достаточно простого вопроса.

Предложение Автору: Вырежь из ДБФ десяток записей, среди которых есть "пустая дата" и отдай сообществу для рассмотрения, и не надо будет гадать что, где, когда. Ответы  и решения получишь через 5 минут. (Они уже, правда,  и так есть, но получишь оптимальное в твоем случае).
80 NS
 
08.01.11
15:57
(79) Да он уже миллион раз её в сообщить() вывел.
81 Cthulhu
 
08.01.11
17:25
(79): да говорили уже - ему похрен.
82 andrewks
 
08.01.11
18:47
вы всё еще кипятите? тогда мы идём к вам! (с)
83 medved_kot
 
12.01.11
13:03
Если ПустоеЗначение(СтрЗаменить(ДБФ.Date_pricr, ".", "")) = 1 Тогда      
   Сообщить("Пустое значение поля - "+ДБФ.NAME);
КонецЕсли;


Точно работает, проверял