Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2011, 19:08   #1
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
Вопрос Date = Null - КАК ???

Я охреневаю над этой проблемой, что Дата не может быть пуста в Delphi... это ужас какой-то, что делать хз...
Вот есть таблица в БД, есть там данные, вот с данными происходит некоторое событие - устанавливаем в соответствующее поле результат событий, а в соседнее поле - дату событий. Потом вдруг понадобилось очистить предыдущее действие - поле результата событий очищается без проблем, но как очистить дату?! ведь передать Date=null через Delphi никак не получается!
PS Чтобы не было воплей "дата не может быть null" - откройте БД, посмотрите сами - там чётко поле пустое или в спецрадкторах типа IBExpert написано NULL!

Так как же очистить дату в БД (передать из Delphi в Firebird пустое значение даты, которое сможет затереть предыдущее значение даты) ?!
delphicoding вне форума Ответить с цитированием
Старый 29.07.2011, 19:19   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

в делфи не используется NULL, используется nil
ZuBy вне форума Ответить с цитированием
Старый 29.07.2011, 19:25   #3
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

в Базах данных используют специальный маркер, null значение для того, чтобы если б мы не ввели информацию то поле этой записи имело пустое значение.
Представте себе такую ситуацию, когда мы заполняем данные о чем нить и у нас нет определенной ситуации, то как нам помечать пустоту значения, например для даты?
Для делфи, поскольку дата это Integer, то пустое значение нет возможности предоставить. Если нужно, то можно создать свой тип данных, у которого в качестве маркера пустоты будет использовано булевое поле.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 29.07.2011, 19:27   #4
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

ZuBy
Врядли получится использовать nil:
Код:
vat DataSobitya:Tdate;
   DataSobitya:=nil;
[DCC Error] uBForm.pas(29): E2010 Incompatible types: 'TDate' and 'Pointer'
chertovich
Цитата:
Представте себе такую ситуацию, когда мы заполняем данные о чем нить и у нас нет определенной ситуации, то как нам помечать пустоту значения, например для даты?
Подобные вопросы просто поражают! Ответ прост - никак! Есть тело файла БД, там указываются спец символы, есть спец символы обрамляющие значения типа {значение} - ну так просто не писать там НИХРЕНА! Это невероятно сложно?!

Короче ппц какой-то - как очищать поле даты в БД ?!

Последний раз редактировалось delphicoding; 29.07.2011 в 19:30.
delphicoding вне форума Ответить с цитированием
Старый 29.07.2011, 19:38   #5
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Код:
DataSet.FieldByName('FieldName').Clear
Если после этого, функция DataSet.FieldByName('FieldName').Is Null возвращает False, то удалите свои компоненты БД. Я вам сразу сказал в чем ошибка, еще в др. теме.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 29.07.2011 в 19:40.
chertovich вне форума Ответить с цитированием
Старый 29.07.2011, 19:44   #6
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Да нет же, нельзя это сделать!

Есть ФормаА с таблицей с данными. Нажали кнопочку ОК - вызывается специальная процедура обработки из ФормыБ в которую передаётся значение "1,2,3,4,ДАТАСЕГОДНЯ", процедура в программе вызывает хранимую процедуру в БД и передаёт туда значения, значения записываются в БД. Всё ок.
Нажали кнопку ОТМЕНА в той же ФормеА - вызывается ТА ЖЕ процедура обработки из ФормыБ в которую надо передать значение "1,2,3,4,null", процедура в программе вызывает процедуру в БД и передаёт туда значения, чтобы в БД поле стало NULL!
Ошибка возникает при попытке вызвать из ФормыА в ФормеБ процедуру с атрибутами "1,2,3,4,null"...
delphicoding вне форума Ответить с цитированием
Старый 29.07.2011, 19:46   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ZuBy
в делфи не используется NULL, используется nil
Путаете. используется.
смотрите, например,
модуль System:
Цитата:
Код:
var
  Unassigned: Variant;    { Unassigned standard constant }
  Null: Variant;          { Null standard constant }

delphicoding, к словам chertovich добавлю.
А ещё можно так присвоить:
Код:
  Adoquery1.FieldByName('ВашеПоле').Value := null;
Дык, в Delphi, если нужно передавать NULL в качестве параметра,
используйте тип Variant
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.07.2011, 19:49   #8
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Я уже написал, что передавать значение поля через тип TDate нельзя. Необходимо создать свой тип данных с маркером либо попробывать передавать тип TField.
А вообще, зачем передавать данные через процедуру, если можно добавить форму, содержащую компонент БД в uses формы и использовать данные сразу из записи?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 29.07.2011 в 19:54.
chertovich вне форума Ответить с цитированием
Старый 29.07.2011, 20:00   #9
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
А вообще, зачем передавать данные через процедуру, если можно добавить форму, содержащую компонент БД в uses формы и использовать данные сразу из записи?
Затем, что я сильно упростил пример, в реальности на каждом шаге происходит сложная обработка, поэтому прямой post в БД невозможен.
Цитата:
Дык, в Delphi, если нужно передавать NULL в качестве параметра, используйте тип Variant
Ура, заработало! Только я никогда не смогу понять логику разработчиков Delphi, которые решили упразднить для переменных классов Date,Integer,итд значение <ПУСТО> - имхо это свинство и ихняя халява - им так проще - либо чётко проверять integer на число, либо юзай variant мы его вообще проверять не будем никак... глупое решение с их стороны конечно, данная тема тому пример.
delphicoding вне форума Ответить с цитированием
Старый 29.07.2011, 20:03   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Только я никогда не смогу понять логику разработчиков Delphi, которые решил упразднить для переменных классов Date,Integer,итд значение <ПУСТО> - имхо это свинство и ихняя халява - им так проще - либо чётко проверять integer на число, либо юзай variant мы его вообще проверять не будем никак... глупость конечно, данная тема тому пример
напишите свой универсальный тип, получите тоже самое.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перевести integer в Date demiancz Общие вопросы Delphi 11 17.02.2011 23:08
КАк сделать JOIN в Access с объединением по NULL Izhic Помощь студентам 1 09.02.2011 11:18
FireBird. Как конвертировать Integer в Date и обратно? BeJIuKuu_Hexo4yxa SQL, базы данных 5 25.10.2010 10:10
как сравнить c null? MigelCNB Общие вопросы Delphi 4 22.09.2010 15:06
Как сделать подобие NOT NULL в DataGridView? C# Sparkman Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 18.08.2010 11:07