SQLite, ZEOS 6.6.6, типы полей

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

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

SQLite, ZEOS 6.6.6, типы полей

Сообщение maleficmax » 02.02.2011 18:48:45

Привет всем! Помогите пожалуйста решить небольшую проблему.
Итак, имеется:
Таблица:
Код: Выделить всё
"id" INTEGER PRIMARY KEY  NOT NULL ,
"ord_date" DATETIME NOT NULL  DEFAULT (CURRENT_DATE),
"client" INTEGER NOT NULL,
"work" INTEGER,
"maket" INTEGER,
"count" INTEGER NOT NULL,
"paper_format" INTEGER,
"print_type" INTEGER,
"paper_dens" INTEGER,
"colors" VARCHAR,
"price" DOUBLE NOT NULL ,
"prepayment" DOUBLE,
"payed" BOOL,
"comments" VARCHAR,
"ord_expire" DATETIME,
...


Форма (с комментами):
http://habreffect.ru/files/387/9c2432e2e/Безымянный.png

Помогите пожалуйста вставить:
- DBLookupCombobox (значение ключевого поля) в "client" INTEGER
- DateEdit в "ord_expire" DATETIME
- Текущую дату и время в еще один DATETIME
- Значение Memo в "comments" VARCHAR

Сейчас я делаю так (и не пашет):
Код: Выделить всё
DataModule1.ZMakAdd.SQL.Text:='INSERT INTO orders (client, ord_date, work, maket, count, price, prepayment, comments, ord_expire) VALUES ("'+DBLookupComboBox1.KeyValue+'","'+Date+'",4,"'+DBLookupComboBox2.KeyValue+'","'+Edit2.Text+'","'+Edit1.Text+'",0,"'+Memo1.Lines.Text+'","'+DateEdit1.Date+'")';
maleficmax
незнакомец
 
Сообщения: 6
Зарегистрирован: 16.11.2010 12:40:12

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение Vadim » 03.02.2011 07:13:45

maleficmax писал(а):и не пашет

"Не пашет" - слишком растяжимое понятие и ответ на свой вопрос Вы будете ждать, с таким описанием, как раз до конца света. :D Нужны максимальные подробности - например, какие ошибки вылетают, что происходит\не происходит при работе этого кода и т.п.
По поводу дат. Если Вы вставляете дату не из компонента, который предназначен для работы с полями БД, то 100% у Вас неправильный формат даты. Нужный формат - "ГГГГ-ММ-ДД". Приведите свою дату к этому формату и всё будет нормально записываться.
По поводу МЕМО. Судя по коду, должно записываться в базу нормально.
DBLookupCombobox. Его значение в кавычки брать не надо. В кавычки берут только строковые значения и значения даты, всё остальное и так нормально проходит.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение maleficmax » 03.02.2011 11:33:39

Да, простите, что-то я тупанул как маленький.
Вот эррор:
http://habreffect.ru/files/f29/b877cc71f/Безымянный2.png
И при ошибке открывается dblookup.ini с курсором на первой из этих строк:
Код: Выделить всё
  if FListField.AsString=AListFieldValue then
  begin
    result := TField(FKeyFields[0]).Value;
    exit;
  end;

Но я еще не внес предложеных вами изменений, так что о новых результатах сообщу чуть позже :)
maleficmax
незнакомец
 
Сообщения: 6
Зарегистрирован: 16.11.2010 12:40:12

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение Vadim » 03.02.2011 12:26:34

maleficmax
По Вашей ссылке открывается только:
Forbidden

You don't have permission to access /files/f29/b877cc71f/ on this server.

;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение maleficmax » 03.02.2011 12:31:05

Vadim писал(а):maleficmax
По Вашей ссылке открывается только:
Forbidden

You don't have permission to access /files/f29/b877cc71f/ on this server.

;)


Скопируйте полностью строку и вставьте в поле браузера (с кириллицей). Форум почему-то не преобразовал кириллицу в ссылку, а обрезал ее раньше.
:roll:

Кстати, вы говорили об одинарных кавычках - что они лишние? Двойные же обязательны, я так понимаю.

Добавлено спустя 1 час 32 минуты 2 секунды:
Спотыкается на DBLookupComboBox1.KeyValue. Но я не пойму, что именно его не устраивает :?
maleficmax
незнакомец
 
Сообщения: 6
Зарегистрирован: 16.11.2010 12:40:12

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение Vadim » 03.02.2011 14:03:42

maleficmax писал(а):Кстати, вы говорили об одинарных кавычках - что они лишние? Двойные же обязательны, я так понимаю.

Нет, я говорил, что для числовых полей кавычки лишние. Любые.

Добавлено спустя 40 минут 26 секунд:
maleficmax
А у Вас Lazarus и FrePascal какой версии?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение maleficmax » 03.02.2011 17:12:01

Vadim писал(а):А у Вас Lazarus и FrePascal какой версии?

лазарь последний с 2.4.2

Добавлено спустя 1 минуту 11 секунд:
Vadim, спасибо, что уделяеете внимание моему вопросу)

Добавлено спустя 51 минуту 5 секунд:
пробую по другому
добавил ZTable
Код: Выделить всё
ZTable1.Open;
ZTable1.Insert;
ZTable1.FieldByName('client').Value:=DBLookupComboBox1.KeyValue;
ZTable1.FieldByName('ord_date').Value:=FormatDateTime('YYYY-MM-DD',Date);
ZTable1.FieldByName('work').Value:=4;
ZTable1.FieldByName('maket').Value:=DBLookupComboBox2.KeyValue;
ZTable1.FieldByName('count').Text:=Edit2.Text;
ZTable1.FieldByName('price').Text:=Edit1.Text;
ZTable1.FieldByName('prepayment').Value:=0;
ZTable1.FieldByName('comments').Text:=Memo1.Lines.Text;
ZTable1.FieldByName('ord_expire').Value:=FormatDateTime('YYYY-MM-DD',DateEdit1.Date);
ZTable1.Post;

Имею:
Project bla.exe raised exception class 'EConvertError' with message:
"2011-02-03" is not a valid date format

нажимаю Continue и
Project bla.exe raised exception class 'EVariantError' with message:
Invalid variant type cast

И еще
Invalid value for field 'ord_date'
maleficmax
незнакомец
 
Сообщения: 6
Зарегистрирован: 16.11.2010 12:40:12

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение Mr.Smart » 03.02.2011 18:21:38

Код: Выделить всё
ZTable1.FieldByName('ord_date').AsDateTime:=Date;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение Vadim » 03.02.2011 18:36:37

maleficmax
Всё смешалось в доме Обломских. :D
Теперь Вы применяете мой совет в ситуации, где всё наоборот. В данной ситуации у Вас должен быть как раз тип дата-время, как Вам показал Mr.Smart. Этот тип внесения данных расчитан на те типы, которые применяются в языке программирования. Я же Вам давал совет для ситуации, когда Вы заносите данные, основываясь на способе SQL-команд.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение maleficmax » 03.02.2011 19:01:14

Я реально запутался, да. Занимаюсь по жизни вовсе не программированием :cry: А тут такая вот лажа, и, чувстувую, это не последняя проблема.
Спасбо за наводки, сейчас буду пробовать последовать какому-то из советов.
Ну а какой способ правильней, первый или второй?
maleficmax
незнакомец
 
Сообщения: 6
Зарегистрирован: 16.11.2010 12:40:12

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение Vadim » 03.02.2011 19:51:39

maleficmax писал(а):Ну а какой способ правильней, первый или второй?

Без разницы. И тот и другой способ ведут к одинаковому результату. Надо только понимать, что Вы делаете.
Вот смотрите:
1. Если Вы решили пользоваться SQL-командами для занесения данных в базу, то Вы должны посылать базе данные в понятном ей формате, т.е. числа - они и в Африке числа, только с учётом того, что в запросе посылается строка. :) Строковые данные и даты дополнительно обрамляются кавычками. Даты дополнительно переводятся в формат, принятый для стандарта SQL, т.е. "ГГГГ-ММ-ДД".
2. Если Вы всё же хотите оставить типы данных теми, которыми Вы пользуетесь при программировании, то нужно привести поле, куда Вы заносите данные, к тому типу данных, которые вы туда заносите. Т.е. если данные строковые, то нужно тип поля привести к строковому типу (FieldByName('Какое-то строковое поле').AsString:='Строка'. FieldByName('Какое-то поле типа дата').AsDate:=Now. FieldByName('Какое-то целочисленное поле').AsInteger:=Число и т.п.). Почему нужно, в этом случае, приводить поля к определённому типу? Компилятор Вам подсказал в сообщении об ошибке - тип данных поля по умолчанию - Variant.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SQLite, ZEOS 6.6.6, типы полей

Сообщение maleficmax » 04.02.2011 13:16:38

Yes!
Спасибо, Vadim, поставили меня на путь истинный! Запись добавлена, ошибок не наблюдается :)

Добавлено спустя 43 минуты 39 секунд:
Странная проблема возникла. Поля DOUBLE DBGrid показывает через Е, тоесть
"2E2" вместо "200",
"5.2E2" вместо "517"

Даже не пойму проблему. Если что - поле для отображения денежных чисел в формате 00000.00

Добавлено спустя 2 часа 14 минут 18 секунд:
Решено.
В том столбце DisplayFormat нужно было выставить в 0.00. Вычислено методом научного тыка.
maleficmax
незнакомец
 
Сообщения: 6
Зарегистрирован: 16.11.2010 12:40:12


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru