Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > БД в Delphi
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 21.05.2015, 23:28   #1
Dux
Delphi Master
Участник клубаФорумчанин
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 810
Репутация: 165
По умолчанию В БД тип поля Дата/Время - как исключить ошибку ввода неправильной даты?

На форме есть компонент DBEdit, который связан со столбцом Date в таблице базы данных (тип данных в таблице установлен "Дата/Время"). Когда пользователь вводит в DBEdit дату, но, к примеру пишет 01.01.15 вместо 01/01/15 - появляется ошибка - неправильный формат. Как так сделать, чтобы независимо от того какой символ стоит "-","." или "/" между числами программа автоматически переводила в системный формат (как установлено в windows)?

Вот скриншот ошибки:


Как сделать, чтобы она не появлялась, а в ячейке DBEdit автоматически дата исправлялась системный формат, т.е. с разделителя "." на разделитель "/"?
Dux вне форума   Ответить с цитированием
Старый 21.05.2015, 23:34   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,855
Репутация: 6688
По умолчанию

Ну я бы не использовал DBEdit для ввода даты. А если уж использовать, то у фиелда есть событие OnSetText, в нем и проверил/заменил или вообще отфутболил, если дата введена коряво
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 21.05.2015, 23:45   #3
Dux
Delphi Master
Участник клубаФорумчанин
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 810
Репутация: 165
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну я бы не использовал DBEdit для ввода даты. А если уж использовать, то у фиелда есть событие OnSetText, в нем и проверил/заменил или вообще отфутболил, если дата введена коряво
Работаю с базой данных, что тогда использовать если не DBEdit? События OnSetText в DBEdit и DBGrid не нашел
Dux вне форума   Ответить с цитированием
Старый 22.05.2015, 00:21   #4
xxbesoxx
Профессионал
 
Аватар для xxbesoxx
 
Регистрация: 10.08.2010
Адрес: Грузия Рустави
Сообщений: 1,340
Репутация: 719
Отправить сообщение для xxbesoxx с помощью Yahoo
По умолчанию

Цитата:
Работаю с базой данных,
понятно
Цитата:
что тогда использовать если не DBEdit?
DateTimePicker есть на в кладке Win32. Интересно почему вы выбрали DBEdit ?
Код:
//Сохранить дата из DateTimePicker
 with ADoquery do
 begin
   insert
     FieldByName('Имя_поля').Asdatetime := DateTimePicker.date;
   post;
 end;
если почитат из таблици , тогда
Код:
  DateTimePicker.date:= ADoquery.FieldByName('Имя_поля').Asdatetime;
Это самый простой способ для понимание , зачем DBEdit
__________________
E_MAIL: rijgvina7@yahoo.com

Последний раз редактировалось xxbesoxx; 22.05.2015 в 00:33.
xxbesoxx вне форума   Ответить с цитированием
Старый 22.05.2015, 07:33   #5
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,855
Репутация: 6688
По умолчанию

Цитата:
События OnSetText в DBEdit и DBGrid не нашел
OnSetText у TField и потомков
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 22.05.2015, 23:52   #6
Dux
Delphi Master
Участник клубаФорумчанин
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 810
Репутация: 165
По умолчанию

Да нет, DateTimePicker не в тему. Его нельзя привязать к БД как DBEdit. У меня этих ячеек с датой планируется около сотни, так что нужно придумать как-то автоматическую обработку.

У меня на работе есть программа (тоже работает с базами данных), так там никаких заморочек - вводишь корявую дату (с любым разделителем) - и при переходе на следующую ячейку в предыдущей все автоматом исправляется. Т.е. это сделать можно, но как?

А по поводу OnSetText у TField - так и не понял, в каком компоненте искать эти свойства?
Dux вне форума   Ответить с цитированием
Старый 23.05.2015, 19:57   #7
иванлеон
Пользователь
 
Регистрация: 04.01.2012
Сообщений: 31
Репутация: 10
По умолчанию

Цитата:
Сообщение от Dux Посмотреть сообщение
Да нет, DateTimePicker не в тему. Его нельзя привязать к БД как DBEdit. У меня этих ячеек с датой планируется около сотни, так что нужно придумать как-то автоматическую обработку.

У меня на работе есть программа (тоже работает с базами данных), так там никаких заморочек - вводишь корявую дату (с любым разделителем) - и при переходе на следующую ячейку в предыдущей все автоматом исправляется. Т.е. это сделать можно, но как?

А по поводу OnSetText у TField - так и не понял, в каком компоненте искать эти свойства?
А разве вот так не решается эта проблема?

Код:

procedure TForm1.dbedtdateKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9','.':;
else
 key := Chr(0);
end;   // до кучи запретить лишние символы (??????)
end;

procedure TForm1.dbedtdateChange(Sender: TObject);
var
  s:string;
begin

s:=Form1.dbedtdate.Text;

if pr(s) then begin     // проверка ввода полной даты и верной даты - робота со строкой copy, delete и т.п.

zamena(s);   // процедура замены на нужные разделители, тоже текст

Form1.dbedtdate.Text:=s;

end;

end;
иванлеон вне форума   Ответить с цитированием
Старый 23.05.2015, 20:38   #8
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,855
Репутация: 6688
По умолчанию

Цитата:
А по поводу OnSetText у TField - так и не понял, в каком компоненте искать эти свойства?
У любого датасета после открытия на выборку есть поля, обычно контейнер Fields, содержащий массив полей, имеющих общего предка TField. Для конкретного поля это может быть TIntegerField, TStringField и прочая лобуда. Событие TField.OnSetText отрабатывает при записи текста из DB-компонента ссылающегося на поле непосредственно в датасет. Вот пример небольшой

Код:
procedure TForm1.CDSWorkVesTraSetText(Sender: TField; const Text: String);
var xVes: Real;
begin
  xVes:=RoundTo(StrToFloatDef(Text,0),-3);
  if xVes<-0.0001 then ShowMessage('Ввод отрицательного веса запрещен')
  else if xVes>500.0001 then ShowMessage('Максимальное значение веса = 500')
  else TFloatField(Sender).AsFloat:=xVes;
end;
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.05.2015 в 20:42.
Аватар на форуме   Ответить с цитированием
Старый 25.05.2015, 22:31   #9
SunnyCrash
Пользователь
 
Регистрация: 13.02.2011
Адрес: Kiev
Сообщений: 45
Репутация: 10
Радость

скачай EHlib и будет тебе счастье
SunnyCrash вне форума   Ответить с цитированием
Старый 03.06.2015, 11:14   #10
Dux
Delphi Master
Участник клубаФорумчанин
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 810
Репутация: 165
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну я бы не использовал DBEdit для ввода даты.
Подскажите пожалуйста, как сделать так, чтобы по умолчанию в DateTimePicker - если пользователь дату еще не выбирал - это поле было пустым?

Последний раз редактировалось Dux; 03.06.2015 в 12:01.
Dux вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DateTimePicker1 -как получит дата и время одно времено ? АНЯ_17 БД в Delphi 6 18.09.2014 08:02
Тестовое поле, тип дата, формат даты Ципихович Эндрю Microsoft Office Word 15 08.04.2012 21:26
Как посчитать в базе данных Access дата/время? Юрий_Комышанский Microsoft Office Access 4 01.05.2010 10:56
Как создать маску ввода даты в TextBox? AnnNet Microsoft Office Excel 6 24.07.2008 10:42


07:58.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru