DateEdit. Сохранение не тех значений.

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

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

DateEdit. Сохранение не тех значений.

Сообщение Teodorih » 03.02.2014 16:29:00

Какая-то глупейшая ошибка, однако не могу разобраться. У меня в БД 2 поля типа datetime, на форме 2 DateEdit. Одно работает правильно. 2ое - нет. При добавлении записей все происходит правильно. Однако при изменении в БД заносится не то, что в форме. В независимости какая дата выбрана, при первом сохранение появляется дата 06.03.1905. Дальше при изменении сохраняется зеркальная дата. Т.е. если выбрано 07.03.1905, то в БД записывает 05.03. По вертикали так же. Казалось бы проблема точно во мне, однако найти ошибку я не могу, т.к. оба dateedit реализованы одинаково.

Код добавления
Код: Выделить всё
procedure TForm2.Button1Click(Sender: TObject);
var min,max, i, buf:integer;
  datestr1,year1,month1,day1,datestr2,year2,month2,day2:string;
  flagbool:boolean;
  flagint,flagurg,flagmin, urg:integer;
  q:TSQLQuery;
  q1:array[1..60] of TSQLQuery;
begin
     // Преобразование даты с SQLite для Lasarus
     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;

     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;             


Код изменения
Код: Выделить всё
procedure TForm4.Button1Click(Sender: TObject);
var  q:TSQLQuery;
  min,max, i, buf, flag:integer;
  flagbool:boolean;
  flagint,flagurg,flagmin, urg, flagid:integer;
  datestr2,year2,month2,day2,datestr3,year3,month3,day3:string;
  q1,q2:TSQLQuery;
  q3:array[1..60] of TSQLQuery;
begin
     flag:=form1.Datasource1.DataSet.RecNo;

     datestr2:=datetostr(DateEdit3.Date);
     day2:=copy(datestr2,1,2);
     month2:=copy(datestr2,4,2);
     year2:=copy(datestr2,7,4);
     datestr2:=year2+'-'+month2+'-'+day2;
// Вот здесь, вроде как, начинается ошибка
     datestr3:=datetostr(DateEdit2.Date);
     day3:=copy(datestr3,1,2);
     month3:=copy(datestr3,4,2);
     year3:=copy(datestr3,7,4);
     datestr3:=year3+'-'+month3+'-'+day3;
//
         q := TSQLQuery.Create(self);
     q.DataBase := Form1.SQLite3Connection1;
     q.Transaction := Form1.SQLTransaction1;
       q2 := TSQLQuery.Create(self);
      q2.DataBase := Form1.SQLite3Connection1;
      q2.Transaction := Form1.SQLTransaction1;

     
     form1.SQLQuery1.Active:=false;
     form1.SQLQuery2.Active:=false;
     form1.SQLQuery3.Active:=false;
     
     q.SQL.Add('UPDATE magazine SET DateJoin='+datestr3+',calcurg='+inttostr(flagurg)+', calcmin='+inttostr(flagmin)+', urg='+inttostr(flagint)+', FIO="'+edit1.text+'", Place="'+edit2.Text+'", DateBurn="'+inttostr(Spinedit3.Value)+'", dep="'+inttostr(form4.ComboBox1.ItemIndex)+'", matherial="'+memo1.Text+'", Dia="'+memo2.Text+'", desc="'+memo3.Text+'", Answer="'+memo4.Text+'", Date="'+datestr2+'", FIODoc="'+edit3.text+'" WHERE magazine.id='+inttostr(flagid)+';');
   
     q.ExecSQL;
   
     form1.SQLQuery1.Active:=true;
     form1.SQLQuery2.Active:=true;
     form1.SQLQuery3.Active:=true;         


Как видите, исполнено всё одинаково. Добавлял другие формы, переписывал в ручную код...всё одно и то же. Надеюсь, что сможете показать, где я слеп.
Lasarus 1.0.12, sqlite3 expert, ОС - winxp
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00

Re: DateEdit. Сохранение не тех значений.

Сообщение ssadragon » 03.02.2014 20:36:18

Teodorih писал(а):"'+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+'");

с параметрами будет красивее смотреться и в экран влезать, да и главное читабельнее будет

Добавлено спустя 6 минут 38 секунд:
Teodorih писал(а):// Вот здесь, вроде как, начинается ошибка
     datestr3:=datetostr(DateEdit2.Date);
     day3:=copy(datestr3,1,2);
     month3:=copy(datestr3,4,2);
     year3:=copy(datestr3,7,4);
     datestr3:=year3+'-'+month3+'-'+day3;
//

а что в переменных, если через отладчик прогнать?
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: DateEdit. Сохранение не тех значений.

Сообщение Teodorih » 03.02.2014 23:16:11

ssadragon писал(а):а что в переменных, если через отладчик прогнать?

Через отладчик всё классно. Во время всего жизненного цикла показывает те значения, которые должны быть. А сохраняет абсолютно другое.
Оба поля date те значения, который в dateedit. Однако в dateedit2 после сохранения не те данные.
Всегда появляется 1905 год. Что за бред?)
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00

Re: DateEdit. Сохранение не тех значений.

Сообщение Padre_Mortius » 03.02.2014 23:23:49

Вместо
Код: Выделить всё
datestr3:=datetostr(DateEdit2.Date);
     day3:=copy(datestr3,1,2);
     month3:=copy(datestr3,4,2);
     year3:=copy(datestr3,7,4);
     datestr3:=year3+'-'+month3+'-'+day3;


лучше писать
Код: Выделить всё
datestr3 := FormatDateTime('YYYY-MM-DD', DateEdit2.Date);


P.S. исправил, т.к. перепутал местами параметры
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: DateEdit. Сохранение не тех значений.

Сообщение Teodorih » 03.02.2014 23:45:06

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

Re: DateEdit. Сохранение не тех значений.

Сообщение Padre_Mortius » 03.02.2014 23:57:32

Teodorih, для банальной проверки сохраните полученный SQL-запрос в файл. Возможно это даст ответ на ваш вопрос. Мой совет не эстетика, а уменьшение количества багов, т.к. я, например, не в курсе, что вернет на вашей машине функция datetostr.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: DateEdit. Сохранение не тех значений.

Сообщение Teodorih » 06.02.2014 19:36:16

Ошибку нашёл, спасибо за помощь, ребят. Как я и думал, проблема оказалось банальной. Я забыл кавычки в sql запросе выставить в 1 из полей.
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru