Нулевое значение в DateEdit

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Нулевое значение в DateEdit

Сообщение Teodorih » 31.01.2014 18:29:34

Ребят, обнаружилась проблема, которая меня немного удивила. Подскажите, при заполнение таблицы с помощью SQL запроса нулевые значения String'овых полей и интовых добавляются в таблицу как нулевые. Однако поля с типом Date со значением null оперировать упорно не хотят. По дефолту выводит минимальную дату в календаре. Можно изменить, чтобы дефолт был нынешней датой, однако я так и не нашёл нигде в инете, как можно передать в таблицу null из поля типа date.
Версия лазаруса - 1.0.12, СУБД - SQLite3, ОС - winxp

Непосредственно код, как происходит у меня процесс заполнения.
Код: Выделить всё
begin
     // Преобразование даты с  Lasarus для SQLite
     datestr1:=datetostr(DateEdit1.Date);
     day1:=copy(datestr1,1,2);
     month1:=copy(datestr1,4,2);
     year1:=copy(datestr1,7,4);
     datestr1:=year1+'-'+month1+'-'+day1;
     datestr2:=datetostr(DateEdit3.Date);
     day2:=copy(datestr2,1,2);
     month2:=copy(datestr2,4,2);
     year2:=copy(datestr2,7,4);
     datestr2:=year2+'-'+month2+'-'+day2;
     
      q := TSQLQuery.Create(self);
      q.DataBase := Form1.SQLite3Connection1;
      q.Transaction := Form1.SQLTransaction1;

    form1.SQLQuery1.Active:=false;
     form1.SQLQuery2.Active:=false;
    form1.SQLQuery3.Active:=false;



     q.SQL.Add('INSERT INTO magazine(DateJoin, urg, calcurg, calcmin, FIO, Place, DateBurn, dep, matherial, Dia, desc, Answer, Date, FIODoc) VALUES("'+datestr1+'",'+inttostr(flagint)+','+inttostr(flagurg)+','+inttostr(flagmin)+',"'+edit1.text+'","'+edit2.Text+'","'+inttostr(Spinedit3.Value)+'","'+inttostr(form2.ComboBox1.ItemIndex)+'","'+memo1.Text+'","'+memo2.Text+'","'+memo3.Text+'","'+memo4.Text+'","'+datestr2+'","'+edit3.text+'");');

     q.ExecSQL;
     form1.SQLQuery1.Active:=true;
     form1.SQLQuery2.Active:=true;
     form1.SQLQuery3.Active:=true;
     form1.SQLQuery1.ApplyUpdates;
     form1.SQLQuery2.ApplyUpdates;     


Пробовал заполнять поля таблицы через fieldbyname, но результат точно такой же.
Возможно, проблема в процессе перевода типа даты, но если без перевода, то SQLite3 откажется воспринимать дату как таковую
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00

Re: Нулевое значение в DateEdit

Сообщение ZeUsM » 31.01.2014 18:44:33

Случайно не ваш случай?
Аватара пользователя
ZeUsM
новенький
 
Сообщения: 57
Зарегистрирован: 08.11.2010 13:55:35
Откуда: Нерезиновая

Re: Нулевое значение в DateEdit

Сообщение ssadragon » 31.01.2014 19:47:05

Заместо всего вот этого
Teodorih писал(а): datestr1:=datetostr(DateEdit1.Date);
     day1:=copy(datestr1,1,2);
     month1:=copy(datestr1,4,2);
     year1:=copy(datestr1,7,4);
     datestr1:=year1+'-'+month1+'-'+day1;
     datestr2:=datetostr(DateEdit3.Date);

лучше вот так
DateFormat := DefaultFormatSettings.ShortDateFormat; // запоминаем в переменную старый формат
DefaultFormatSettings.ShortDateFormat := 'yyyy.MM.dd'; // в вашем случае получается вроде так 'yyyy-MM-dd'
datestr1:=datetostr(DateEdit1.Date);
DefaultFormatSettings.ShortDateFormat := DateFormat; // вернем обратно старый формат


На счет этого -
Teodorih писал(а): Date со значением null

то я делаю так
If Deleted = 0 Then // Deleted: TDateTime;
Query.ParamByName('deleted').IsNull
Else
Query.ParamByName('deleted').AsDateTime := Deleted;

Правда у меня FireBird
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Нулевое значение в DateEdit

Сообщение ZeUsM » 03.02.2014 12:00:25

Обработку значений null принято отдавать на сторону БД, снимет множество проблем.
Аватара пользователя
ZeUsM
новенький
 
Сообщения: 57
Зарегистрирован: 08.11.2010 13:55:35
Откуда: Нерезиновая

Re: Нулевое значение в DateEdit

Сообщение Teodorih » 03.02.2014 12:45:34

В том-то и проблема, что во всех типах данных со значениями нуля работает sqlite, а с date - не хочет.

Добавлено спустя 19 минут 1 секунду:
ZeUsM писал(а):If Deleted = 0 Then // Deleted: TDateTime;
Query.ParamByName('deleted').IsNull
Else
Query.ParamByName('deleted').AsDateTime := Deleted;

Немного не понимаю, что такое deleted. У вас написано, что это дата. Условие тогда понятно. Но тогда я немного не понимаю, что такое paramByName. И к тому же, в аргументах к нему написан тип string. А у вас тип deleted - datetime.

Добавлено спустя 3 минуты 37 секунд:
ZeUsM писал(а):Случайно не ваш случай?

Я так понял, там пытаются через SQL запрос создания таблиц создать datestamp...
Мне не это требуется. + хотелось бы реализовать это на паскале, т.к. код образования таблиц лежит в SQLite и редактировать его там достаточно проблематично.
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00

Re: Нулевое значение в DateEdit

Сообщение ZeUsM » 03.02.2014 13:22:47

В примере при создании таблицы устанавливается constraint (правило) на поле с типом Дата, что в случае, если ему не передается значение (null - ничего), то будет передаваться значение по умолчанию, в данном случае текущая дата.

Добавлено спустя 9 минут 8 секунд:
Teodorih писал(а):В том-то и проблема, что во всех типах данных со значениями нуля работает sqlite, а с date - не хочет.

Добавлено спустя 19 минут 1 секунду:
ZeUsM писал(а):If Deleted = 0 Then // Deleted: TDateTime;
Query.ParamByName('deleted').IsNull
Else
Query.ParamByName('deleted').AsDateTime := Deleted;

Немного не понимаю, что такое deleted. У вас написано, что это дата. Условие тогда понятно. Но тогда я немного не понимаю, что такое paramByName. И к тому же, в аргументах к нему написан тип string. А у вас тип deleted - datetime.


Не знаю - это не я писал. Я сам с трудом понимаю, что тут написано, попытка выставить в поле с датой значение null если в переменную приходит 0. null != 0.
Teodorih писал(а):
ZeUsM писал(а):Случайно не ваш случай?

Я так понял, там пытаются через SQL запрос создания таблиц создать datestamp...
Мне не это требуется. + хотелось бы реализовать это на паскале, т.к. код образования таблиц лежит в SQLite и редактировать его там достаточно проблематично.


Каждый тип может принимать свои значения по умолчанию, для строк это пробел, для чисел 0, для даты - дата, как не странно. Вам нужно в общем случае посмотреть в каком формате воспринимается дата в вашей таблице и в этом формате её передавать.
Аватара пользователя
ZeUsM
новенький
 
Сообщения: 57
Зарегистрирован: 08.11.2010 13:55:35
Откуда: Нерезиновая

Re: Нулевое значение в DateEdit

Сообщение Teodorih » 03.02.2014 13:54:20

Я понял глупость того, что написал...
Т.е. получается, что в поле date значение null я записать же не смогу...это просто должна быть какая-нибудь дата... даже например 0000-00-00.
Ребят, а подскажите тогда, как можно решить задачу, когда у пользователя может быть ситуация, когда при заполнение таблицы он не знает дату. Единственное логичное решение записывать в поле даты сегодняшнее число?

Добавлено спустя 14 минут 12 секунд:
Ребят, спасибо большое, вы мне просто на жизнь открыли глаза :D Буду делать дефолтную - текущую. Однако, если у кого-нибудь были использованы другие решения, то напишите. Мне будет интересно почитать.
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00

Re: Нулевое значение в DateEdit

Сообщение *Rik* » 03.02.2014 14:41:41

А TField.Clear и TParam.Clear не пробовали для даты?
DataSet.FieldByName('DATA').Clear
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Нулевое значение в DateEdit

Сообщение ssadragon » 03.02.2014 20:32:35

Teodorih писал(а):что такое deleted.

это переменная Deleted: TDateTime;
ZeUsM писал(а):null != 0

я ж написал
ssadragon писал(а):Правда у меня FireBird
там вроде можно любому типу ставить Null!!!
Teodorih писал(а):что такое paramByName

вот простой пример
Query.SQL.Add('INSERT INTO USER (DATE_BIRTHDAY, FIO ...) VALUES (:DATE_BIRTHDAY, :NAME ...)');
If DATE_BIRTHDAY= 0 Then
Query.ParamByName('DATE_BIRTHDAY').IsNull // В базу запишется нулевое значение
Else
Query.ParamByName('DATE_BIRTHDAY').AsDateTime := DATE_BIRTHDAY; // DATE_BIRTHDAY - Переменная типа TDateTime
Query.ParamByName('NAME').AsString := Name; // Name - Переменная типа String
...
Query.ExecSQL;

ZeUsM писал(а): Я сам с трудом понимаю, что тут написано

Теперь надеюсь понятно :?
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Нулевое значение в DateEdit

Сообщение Deimos » 03.02.2014 23:44:16

Teodorih писал(а):Т.е. получается, что в поле date значение null я записать же не смогу...


Я не уверен по поводу sqlite, но в MySql в поле таблицы с типом дата точно можно записать NULL. Для TSQLQuery не могу сказать навскидку, но думаю что глобальной разницы нет.Если не разберетесь сами, то постараюсь потратить время и помочь...

Связка Zeos+MySql:
Код: Выделить всё
if paydate.Date=strtodate('30.12.1899')
then bquery.ParamByName('payddate').Value:=NULL
else bquery.ParamByName('payddate').AsDate:=Paydate.Date;


paydate - TDateEdit (вкладка Misc).
30.12.1899 - дата, которую возвращает компонент. (Начальная дата по умолчанию)

Не претендую ни на правильность, ни на истину в данном вопросе. Просто кусочек рабочего кода...

Добавлено спустя 3 минуты 57 секунд:
ssadragon писал(а):ssadragon » 03.02.2014 20:32:35



Ответ прочитал после того, как написал свой. Мой практически идентичен и, благодаря "ssadragon" утратил актуальность.
Deimos
постоялец
 
Сообщения: 174
Зарегистрирован: 17.01.2010 00:31:30

Re: Нулевое значение в DateEdit

Сообщение alexs » 04.02.2014 20:23:50

1.
Deimos писал(а):bquery.ParamByName('payddate').Value:=NULL

Зачем так страшно?
Код: Выделить всё
bquery.ParamByName('payddate').Clear;

2. Почему не пользоваться DB версиями компонент?
3. Почему не создаются объекты полей? Двойной щелчек по bquery и создать в нём поля через правую кнопку мышки. Конструкция bquery.ParamByName('payddate'). - лишний тормоз.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Нулевое значение в DateEdit

Сообщение Deimos » 05.02.2014 13:10:27

alexs писал(а):1.Зачем так страшно?
Код: Выделить всё
bquery.ParamByName('payddate').Clear;


Согласен. Принято
alexs писал(а):2. Почему не пользоваться DB версиями компонент?

По привычке использую другой подход, не претендуя на правильность.
alexs писал(а):3. Почему не создаются объекты полей? Двойной щелчек по bquery и создать в нём поля через правую кнопку мышки. Конструкция bquery.ParamByName('payddate'). - лишний тормоз.

bquery - создается в рантайме, вот и не заморачивался. Огромными массивами данных не оперирую, но спасибо за наводку.
Deimos
постоялец
 
Сообщения: 174
Зарегистрирован: 17.01.2010 00:31:30


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 217

Рейтинг@Mail.ru