Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

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

Так как же очистить дату в БД (передать из Delphi в Firebird пустое значение даты, которое сможет затереть предыдущее значение даты) ?!
Ответить с цитированием
  #2  
Старый 29.07.2011, 19:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

я же уже писал как это сделать:
Код:
Table1.FieldByName('date1').Clear; // очищаем значение поля
вот тут:
http://www.delphisources.ru/forum/sh...58&postcount=7
а вот что в справке написано:
Цитата:
Clear method (TField)

Sets the value of the field to NULL.

Delphi syntax:

procedure Clear;

C++ syntax:

virtual void __fastcall Clear(void);

Description

Call the Clear method to give the field a blank value (a NULL value in SQL terms).
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 29.07.2011, 19:35
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Да, Clear для полей. Или иногда (привет стандарты) ValueClear. В том примере Вы писали про обработку существующей даты. А тут задача в другом - нужно передать из программы в БД ПУСТОЕ значение даты, чтобы в БД затереть предыдущее значение даты и сделать поле БД пустым!

Но это не поля, а атрибут(переменная) процедуры. Вызываю процедуру из другого юнита и передаю значение всех требуемых атрибутов - если значение атрибута DataSobitiya не указана или указана как null - Delphi выдаёт ошибку.
Пробовал указывать для процедуры в месте объявления значение по-умочланию =null также, работает только с =0, но это увы уже даёт дату 1899года, мля.
Ответить с цитированием
  #4  
Старый 29.07.2011, 19:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

и на этот вопрос в той теме был ответ:
Цитата:
Сообщение от NumLock
естествено можно Variant использовать.
Код:
procedure CounterStrike(date1: Variant);
begin
  if not VarIsNull(date1) then ShowMessage(DateToStr(date1))
  else ShowMessage('Null');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CounterStrike(Now);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  CounterStrike(Null);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 29.07.2011, 19:48
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Пропустил мб. Нифига се, то есть variant может быть и датой и нулл работает и дату передаёт правильно?! а для даты нулл уже не работает?! Опять - Привет стандарты!
Ответить с цитированием
  #6  
Старый 29.07.2011, 20:52
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Говорят Variant работает в разы медленнее чем точно определённые классы типа Date/Integer... неужели настолько медленно?!

Последний тупой вопрос на сегодня - при передачи из Delphi через Dataset в БД значения Variant:=null передаются как "null" или не передаются вообще? БД воспринимает их как "нужно записать null" или как "ничего не передали, значит это поле перезаписывать не будем".

PS Если все эти действия приводят к записи в БД значения null, тогда вопрос - как при вызове процедуры указать один из атрибутов пустым, чтобы в БД данное поле НЕ было перезаписано?! Конструкция типа procedure Dannie(1,2,,,5) вызывает в Delphi ошибку... Delphi очень хочет, чтобы каждый параметр был указан и написан!

Последний раз редактировалось delphicoding, 29.07.2011 в 21:04.
Ответить с цитированием
  #7  
Старый 29.07.2011, 22:53
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Закрыто.////
Ответить с цитированием
  #8  
Старый 30.07.2011, 00:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
FieldByName('MyDate').Value := null;
ParamByName('MyDate').Value := null;
Ответить с цитированием
  #9  
Старый 30.07.2011, 09:39
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

lmikle
Вы часто отвечаеет не вчитываясь в вопрос - написано при передаче атрибутов процедуры, а не при постинге полей в БД.
==============================================

Увы, проблема получила продолжение... замечательный тип Variant тоже оказался недоделанным, тк не позволяется ему устанавливать значение по-умолчанию: [DCC Error] uForm.pas(92): E2268 Parameters of this type cannot have default values.
Почему?! Какой в этом смысл?! и какая нахер тогда это вообще универсальная переменная, ежели нельзя по-умолчанию присвоить значение... ппц идиотизм.
PS Дополнительным бредом является жёсткое ограничение на указание типов атрибутов процедуры - если указан тип со значением по-умолчанию, все следующие за ним - также обязаны быть со значением по-умочланию - бредятина! это может и удобно разработчикам Delphi, но это совершенно неудобна разработчикам В Delphi! Приходится подгонять порядок атрибутов вместо удобного и отвечающего чему-то в программе, по значениям по-умочланию. Тупизна какая.
Ответить с цитированием
  #10  
Старый 01.08.2011, 02:33
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

А если указатели использовать?
Код:
procedure CounterStrike(date1: Pointer = nil);
begin
  if date1 <> nil then
    ShowMessage(DateToStr(TDateTime(date1^)))
  else
    ShowMessage('Null');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d: TDateTime;
begin
  d:= Now;
  CounterStrike(@d);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  CounterStrike;
end;
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025