![]() |
![]() |
![]() |
|
Проверка на пустое значение поля 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); КонецЕсли; Точно работает, проверял |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |