Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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


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

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

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

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

Последний раз редактировалось xxbesoxx; 21.05.2015 в 23:33.
xxbesoxx вне форума Ответить с цитированием
Старый 22.05.2015, 06:33   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

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

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

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

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

Цитата:
Сообщение от 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, 19:38   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
А по поводу 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 в 19:42.
Аватар вне форума Ответить с цитированием
Старый 25.05.2015, 21:31   #9
SunnyCrash
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 45
Радость

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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