Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Update поля с датой типа DateTime, редактирование записи 
:(
    Опции темы
lenyska
Дата 18.3.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



У меня БД в SQL Server, а приложение в Delphi. Для доступа пользуюсь компанентами ADO.
При попытке сделать Update поля с датой типа DateTime выдается ошибка: Дополнительная возможность не реализованна.
Код:
ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd=smile where id=5');
ADOQuery8.Parameters [0].Value := Edit1.Text ;
ADOQuery8.ExecSQL;

Помогите, пожалуйста. Подскажите, где я ошибаюсь.
Заранее спасибо!!!
PM MAIL   Вверх
Vit
Дата 18.3.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Код

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd= :MyParam where id=5');
ADOQuery8.Parameters.ParseSQL(ADOQuery8.SQL.text, true);
ADOQuery8.Parameters.ParamByName('MyParam').Value := Edit1.Text ;
ADOQuery8.ExecSQL;


Но лучше дату передавать как дату, это позволит избежать проблем если национальные установки клиента и сервера разные:

Код

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd= :MyParam where id=5');
ADOQuery8.Parameters.ParseSQL(ADOQuery8.SQL.text, true);
ADOQuery8.Parameters.ParamByName('MyParam').Value := StrToDateTime(Edit1.Text);
ADOQuery8.ExecSQL;




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 18.3.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



он все равно пишет ошибку: Project1.exe raised exception class EConverError with message "a ' is not a valid date and time'.Process stopped.
независимо от того как вводишь дату: с помощью точек, слешей или запятых.

HELP ME, PLEASE

PM MAIL   Вверх
Vit
Дата 19.3.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



По видимому в моём коде такую ошибку может генерить только StrToDateTime, каклй у вас формат даты установлен на компьютере? Попробуйте выполнить следующую строку:

Showmessage(datetimetostr(now))

и посмотрите на то в каком формате будет выведена дата, в таком же формате попробуйте ввести её в edit. Кроме того хотелось бы знать в каком именно месте происходит ошибка, видоизмените код:

Код

Var t:TDateTime

try
  t:=StrToDateTime(Edit1.Text);
except
  on e:exception do Showmessage('Error convertion string ->date'+#13#10+e.message);
end;

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd= :MyParam where id=5');
ADOQuery8.Parameters.ParseSQL(ADOQuery8.SQL.text, true);
try
  ADOQuery8.Parameters.ParamByName('MyParam').Value := t;
except
  on e:exception do Showmessage('Error assigning parameter'+#13#10+e.message);
end;

try
  ADOQuery8.ExecSQL;
except
  on e:exception do Showmessage('Error executing query'+#13#10+e.message);
end;
 



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 19.3.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет




У меня формат даты: дд.мм.гггг

Изменила код на предложенный вами, но все равно вылетает та же ошибка: Project1.exe raised exception class EConverError with message "a ' is not a valid date and time'.Process stopped.

Что еще можно попробывать?
PM MAIL   Вверх
Vit
Дата 20.3.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(lenyska @ 19.3.2006, 10:21 Найти цитируемый пост)
Изменила код на предложенный вами, но все равно вылетает та же ошибка: Project1.exe raised exception class EConverError with message "a ' is not a valid date and time'.Process stopped.


Такого не бывает потому что не бывает никогда! Я специально добавил в код несколько try..except с подробным описанием ошибки, чтобы идентифицировать строку которая генерит ошибку, если вы это описание в ввиде сообщения не получили, а получили голое сообщение о системной ошибке, значит:

1. Вы не заменили код
или
2. Ошибку генерит вовсе не приведенный код
или
3. Вы запускаете в режиме отладки с перехватом дебуггером дельфи всех ошибок и вместо того чтобы привести сообщение об ошибке которое генерит код указываете мне сообщение об ошибке которое выдаёт дебуггер (в этом случае при появлении ошибки нажмите Ok, затем F9 в Дельфи, когда программа продолжит работу она выдаст сообщение которое я генерю - вот его-то и надо привести здесь, иначе очень трудно понять чего у вас там происходит)



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 20.3.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



У меня третий вариант.

Выскакивает ошибка:
Error executing query
[Microsoft][ODBC SQL Server Driver] Дополнительная возможность не реализованна

Собственно, это тоже самое, что у меня было вначале.
Это хорошо или плохо? И что с этим вообще делать?

PM MAIL   Вверх
Vit
Дата 20.3.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Хм... очень странно, а вот так работает:

Код

Var t:TDateTime

try
  t:=StrToDateTime(Edit1.Text);
except
  on e:exception do Showmessage('Error convertion string ->date'+#13#10+e.message);
end;

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd='''+FormatDateTime('yyyy-mm-dd', t)+ ''' where id=5');

try
  ADOQuery8.ExecSQL;
except
  on e:exception do Showmessage('Error executing query'+#13#10+e.message);
end;


Кстати какого типа поле day_rojd в таблице?



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 20.3.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



АААААААА!!!!!!!

СУПЕР
Все работает
Спасибо вам ОГРОМЕННОЕ, вы мне очень помогли
smile smile smile
PM MAIL   Вверх
Vit
Дата 20.3.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Хм... я то почти и не сомневался что так работает, настараживает тот факт что предыдущий вариант не работал... Очень странно...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 21.3.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



А меня уже ничего не удивляет.
Главное, что работает! И я этому безумно рада
PM MAIL   Вверх
Vit
Дата 21.3.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(lenyska @ 21.3.2006, 02:06 Найти цитируемый пост)
меня уже ничего не удивляет.
Главное, что работает! И я этому безумно рада



Я рад что Вы рады... но обойдя одни грабли случайно стороной не гарантирует шишки следующий раз. Дело Ваше, но желательно разбираться до конца... Это помогает в будущем, по существу вопроса:

Дата в формате yyyy-mm-dd hh:nn:ss является стандартом для MS SQL Server и при ЛЮБОЙ локализации клиента и сервера строка в таком формате конвертируется в дату правильно


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 21.3.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



если это является стандартом, почему же тогда в таблицах SQL Serverа он выводит дату как dd.mm.yyyy? и в приложение он выводит дату в таком же формате
У меня что, нестандартные настройки в SQL Serverе стоят? но как это может быть, если я ничего не меняла?
PM MAIL   Вверх
Vit
Дата 21.3.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



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

1) MS SQL Server сам по себе хранит дату в ввиде дробного числа, где целая часть это число дней пошедших с 30 декабря 1899 года, а дробная - это части дня. Попробую объяснить при помощи псевдокода:

если у вас есть в поле дата "21 марта 2006 года, 21:10:00" то
- если взять целую часть от даты то будет "21 марта 2006 года"
- если взять дробную часть от даты то будет "30 декабря 1899 года, 21:10:00"
- один час равен 1/24 единицы в том поле
- одна минута равна 1/(24*60)

2) Когда вы вставляете в запрос дату в кавычках, то сервер вначале конвертирует её в своё представление в ввиде дробного числа, а потом оперирует им. НО! Конвертация зависит от используемых национальных установок, вы пишете на дельфи например StrToDateTime('01/02/03') и на вашем компьютере стоят национальные установки российские, то эта функция вернёт дату "01 февраля 2003" года, а если у вас стоят американские установки то эта эе функция вернёт "02 января 2003" года. Обычно при работе с обычным приложением вам на это наплевать, главное что дата всегда конвертируется в пределах вашего приложения одинаково, соответственно вашим национальным установкам. А вот когда начинаем работать с сервером возникают проблемы: у вас может быть русская локаль, а на сервере - американская и строка даты '01/02/03' для сервера и клиента означают РАЗНЫЕ даты! То что я пытался сделать вначале - это послать дату в формате даты, а не строки параметром и предоставить серверу самому интерпретировать её... и был очень удивлён что у Вас это не работает.

3. Когда вы выводите информацию из базы данных, например в грид, то клиентское приложение естественно пытается конвертировать дату из дробного числа в строку, которая была бы понятна для вас, так как вряд ли вы сможете оперировать легко и наглядно с датами записанными как 36263.21312. Даже когда вы просматриваете базу данных используя Query Analyser или MS SQL Server Enterprise Manager - они являются обычными клиентскими программами, такими же как и ваше приложение. Они при показе даты будут и производить конвертацию дробного числа с сервера в строку. Причём существует 4 вида алгоритма конвертации:
- Использовать какой-то стандартный, зашитый формат
- Использовать формат даты/времени установленный на компьютере где стоит сервер
- Использовать формат даты/времени установленный на компьютере где стоит клиент
- Не заморачиваться и показывать как бог на душу пошлёт... как многие программисты и делают, даже в MS. Итого: выводит дату в формате dd.mm.yyyy КЛИЕНТСКОЕ приложение а не сервер, формируя её по видимому с учётом ваших локальных клиентских установок, а вот когда вы формируете запрос в таком формате, то сервер получив такую строку и (по-видимому) имея какие-то другие настройки просто не способен её переварить.

Итого то что показывает грид - к реальности имеет весьма отдалённое отношение.

4. Программисты из MS предвидели проблемы с конвертацией строк с датой в данные типа "дата-время", поэтому выработали стандарт который позволяет при любых национальных раскладках интерпретировать строку формата YYYY-MM-DD HH:NN:SS всегда правильно. Например у меня стоит американская раскладка и запросы

Код

Select * From t where f='2006-01-02'

и
Код

Select * From t where f='01/02/06'


Для моего MS SQL Server абсолютно идентичные, хотя на вашем сервере с русской нацинализацией, только первый мой запрос будет правильным, второй для вас надо будет менять на

Код

Select * From t where f='02/01/06'


Пока вы работаете в пределах одной и той же локалицации вы можете использовать оба запроса, но предпочтителен вариант '2006-01-02' - так как именно он будет гарантировать выполняемость запроса при любых установках сервера


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 24.3.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



Спасибки!
Объяснения знающего человека всегда воспринимаются легче, чем текст какой-нибудь книги. Да и не в любой книге найдешь нужную информацию.

PM MAIL   Вверх
Veniamin
Дата 24.5.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Помогите пожалуйста. База данных в Access, соединена с программой в Delphi через ADO. В таблицу при добавлении записей типа текст проблем нет, но в БД в Access добавил поле с типом дата, как мне добавлять дату? В таком формате: 
Код

    DM.MainTable.FieldByName('дата заявки').AsDateTime:=StrToDateTime(Editdatezajavka.Text);
? А как выводить дату в Edit при редактировании? Компилятор ругается на строчку: 
Код

 FormModifyData.Editdatezajavka.Text:=Text:=DM.MainTableDSDesigner28.AsString;

PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Veniamin @  24.5.2008,  13:55 Найти цитируемый пост)
FormModifyData.Editdatezajavka.Text:=Text:=DM.MainTableDSDesigner28.AsString;

А зачем 2 раза "text" ? smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Данкинг Опечатался, исправил, теперь не ругается. А нет, всё работает. Разобрался. Теперь как запрос составить на вывод записей по диапазону дат заявок? Есть ли разница у SQL-Server-а и MS Access?

Это сообщение отредактировал(а) Veniamin - 24.5.2008, 13:18
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Veniamin @  24.5.2008,  14:13 Найти цитируемый пост)
Теперь как запрос составить на вывод записей по диапазону дат заявок?

В общем случае:
Код

select pole from base where pole1>=data_start and pole1<=data_end

(только в твоём случае всякие конвертации типов нужны, разумеется)

Цитата(Veniamin @  24.5.2008,  14:13 Найти цитируемый пост)
Есть ли разница у SQL-Server-а и MS Access?

Конкретно не сравнивал, но разницы между диалектами SQL никто не отменял... smile 



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Разница всё-таки есть: в SQL-е дата пишется в одинарных кавычках, а в Access-е нужно вместо них писать решётки - #. Сделал следующим образом:
Код

SELECT заявка, [статус заявки],[дата заявки] FROM [главная таблица]
WHERE [дата заявки] BETWEEN #1-01-2008# AND #31-12-2008#

В ADOQuery запрос написать немудрено. Теперь как бы это Edit забить? smile  На форме два Edit-а, пользователь вводит в них даты, а уже по ним чтоб выводился запрос, описанный выше. 
Пробовал вот так, компилятор ругается:
Код

  QZajavka.Active:=false;
  QZajavka.SQL.Clear;
  QZajavka.SQL.Add('SELECT заявка, [статус заявки],[дата заявки] FROM [главная таблица]');
{ QZajavka.SQL.Add('WHERE [дата заявки] BETWEEN '+StrToDate(Edit1.Text)); }
  QZajavka.SQL.Add('WHERE [дата заявки] BETWEEN '+Edit1.Text);
{  QZajavka.SQL.Add('AND '+StrToDate(Edit2.Text));}
  QZajavka.SQL.Add('AND '+Edit2.Text);
  QZajavka.Active:=true;
  frxReport1.LoadFromFile(extractfilepath(application.ExeName)+'\Zajavka.fr3');

Вариант в фигурных скобках тоже не работает.

Это сообщение отредактировал(а) Veniamin - 24.5.2008, 14:16
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Понятно, что ругается: в фигурных скобках ты к текстовой строке (т.е. свойство AdoQuery SQL) пытаешься добавить переменную типа "дата".  Ну, строчки без скобок понятны: ты дату с текстом сравниваешь. А чтобы Access'у передать переменную типа "дата" попробуй нечто вроде этого:

Код

QZajavka.SQL.Add('WHERE [дата заявки] BETWEEN cdate('+Edit1.Text+')' );



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Попробовал с cdate вот:
Код

  QZajavka.SQL.Add('SELECT заявка, [статус заявки],[дата заявки] FROM [главная таблица]');
  QZajavka.SQL.Add('WHERE [дата заявки] BETWEEN cdate('+Edit1.Text+')');
  QZajavka.SQL.Add('AND cdate('+Edit2.Text+')');


Выводится такая ошибка:
user posted image

Получилось!!! Сделал! Вот как нужно было:
Код

  QZajavka.SQL.Add('SELECT заявка, [статус заявки],[дата заявки] FROM [главная таблица]');
  QZajavka.SQL.Add('WHERE [дата заявки] BETWEEN cdate('''+Edit1.Text+''')');
  QZajavka.SQL.Add('AND cdate('''+Edit2.Text+''')');

Большое Вам Спасибо за помощь Данкинг!

Это сообщение отредактировал(а) Veniamin - 24.5.2008, 14:45
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Да не за что. smile Да, про кавычки забыл.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



После того как поменял типы данных у даты ремонта и даты заявки в базе Аксеса с текстового на дата/время с условием укороченный, т.е. дата в формате 1.01.2008, вообще перестали добавлятся записи в таблицу и редактироватся пустые. Если редактировать уже существующие с заполнеными полями типа дата, то проблем нет. 
Может что-то здесь неправильно?
Код

DM.MainTable.FieldByName('дата заявки').AsDateTime:=StrToDateTime(Editdatezajavka.Text);

При попытки добавить запись или редактировать пустое поле выводится ошибка:
user posted image
 , после чего программа виснет. Может всё из-за того, что я ввожу дату в кратком формате? Пробовал менять StrToDate - тот же результат.


Это сообщение отредактировал(а) Veniamin - 24.5.2008, 17:47
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Вообще-то подобный код и не должен выполняться, так как пустое значение действительно не может быть датой.
Ну, попробуй (хотя маловероятно, что получится):

Код

DM.MainTable.Fieldvalues['дата заявки']:=StrToDate(Editdatezajavka.Text);


Но я бы просто поставил исключение на это дело:

Код

try
DM.MainTable.FieldByName('дата заявки').AsDateTime:=StrToDateTime(Editdatezajavka.Text);
except
end;



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Данкинг 
У меня как раз поля на форме для редактирования/добавления записей таким образом и заполняются - с помощью конструкции try...except, и иногда выводится сообщение, которое записано в обработке except: "Невозможно выполнить.", но чаще просто выводится ошибка и программа виснет. На предложенный Вами код - аналогичная реакция. Как тогда лучше сделать заполнение пустых полей в БД Access с типом дата/время?

Это сообщение отредактировал(а) Veniamin - 24.5.2008, 20:24
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Veniamin @  24.5.2008,  21:17 Найти цитируемый пост)
На предложенный Вами код - аналогичная реакция.

Что-то странное: я обычно так и делаю, т.е. вешаю исключение на могущие быть пустыми поля. smile Ну,можно сделать функцию проверки, является ли передаваемый ей параметр (т.е. дата) верной датой. Если она возвратит истину, то делать добавление этой даты в БД.

Это сообщение отредактировал(а) Данкинг - 24.5.2008, 21:33


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Вот код, который написан у меня на добавление записи в таблицу:
Код

procedure TFormModifyData.ButtonAddClick(Sender: TObject);
begin
  try
    DM.ADOConnection1.BeginTrans;
    DM.MainTable.Insert;
    ... {заполнение полей типа текст}
    DM.MainTable.FieldByName('дата ремонта').AsDateTime:=StrToDateTime(Editdaterepair.Text);
    DM.MainTable.FieldByName('исполнитель').AsString:=Editexecutor.Text;
    DM.MainTable.FieldByName('выполненный ремонт').AsString:=Editexecutedrepair.Text;
    DM.MainTable.FieldByName('заявка').AsString:=Editzajavka.Text;
    DM.MainTable.FieldByName('статус заявки').AsString:=ComboBox1.Text;
    DM.MainTable.FieldByName('дата заявки').AsDateTime:=StrToDateTime(Editdatezajavka.Text);
    DM.MainTable.Post;
    FormModifyData.Close;
    DM.ADOConnection1.CommitTrans;
  except
    DM.ADOConnection1.RollbackTrans;
    ShowMessage('Невозможно выполнить! Повторите.');
  end;
end;


При попытке добавить или редактировать пустые поля дата ремонта и дата заявки ругается, при редактировании же уже существующих - всё выполняется. Про код я имел ввиду с Fieldvalues.

Это сообщение отредактировал(а) Veniamin - 24.5.2008, 22:25
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Не, я имел в виду, что TRY надо поставить перед конкретно оператором заполнения даты!


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



А можно использовать вложенную конструкцию try...except, т.е. я просто строчку на добавление даты заключил в эту конструкцию? И всё равно - выводится та же ошибка.
Код

procedure TFormModifyData.ButtonAddClick(Sender: TObject);
begin
  try
    DM.ADOConnection1.BeginTrans;
    DM.MainTable.Insert;
    ... {заполнение полей типа текст}
    DM.MainTable.FieldByName('дата ремонта').AsDateTime:=StrToDateTime(Editdaterepair.Text);
    DM.MainTable.FieldByName('исполнитель').AsString:=Editexecutor.Text;
    DM.MainTable.FieldByName('выполненный ремонт').AsString:=Editexecutedrepair.Text;
    DM.MainTable.FieldByName('заявка').AsString:=Editzajavka.Text;
    DM.MainTable.FieldByName('статус заявки').AsString:=ComboBox1.Text;
    try
    DM.MainTable.FieldByName('дата заявки').AsDateTime:=StrToDateTime(Editdatezajavka.Text);
    except end;
    DM.MainTable.Post;
    FormModifyData.Close;
    DM.ADOConnection1.CommitTrans;
  except
    DM.ADOConnection1.RollbackTrans;
    ShowMessage('Невозможно выполнить! Повторите.');
  end;
end;


Это сообщение отредактировал(а) Veniamin - 24.5.2008, 22:49
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Ну а если StrToDateTime заменить на StrToDate ?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Не получается :( . Та же самая ошибка. А может быть причина в коде при создании самой формы для редактирования? Т.е. если редактирую, чтоб выводились уже существующие поля в Edit-ы.
Вот:
Код

procedure TMainForm.N5Click(Sender: TObject);
begin
  FormModifyData:=TFormModifyData.Create(self);
  FormModifyData.ButtonEdit.Enabled:=true;
 ...
  FormModifyData.EditStatus.Text:=DM.MainTableDSDesigner17.Value;
  FormModifyData.Editdaterepair.Text:=DM.MainTableDSDesigner18.AsString; {дата ремонта}
  FormModifyData.Editzajavka.Text:=DM.MainTableDSDesigner26.Value;
  FormModifyData.ComboBox1.Text:=DM.MainTableDSDesigner27.Value;
  FormModifyData.Editdatezajavka.Text:=DM.MainTableDSDesigner28.AsString; {дата заявки}

  FormModifyData.ShowModal;
end;


Это сообщение отредактировал(а) Veniamin - 24.5.2008, 23:22
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Тогда функций проверки сделай, как я говорил.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 24.5.2008, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Отредактировал пост выше, может в создании формы причина, когда передаю значение формата дата в Edit как строку (AsString)?

Это сообщение отредактировал(а) Veniamin - 24.5.2008, 23:21
PM MAIL   Вверх
Данкинг
Дата 24.5.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Veniamin @  25.5.2008,  00:21 Найти цитируемый пост)
когда передаю значение формата дата в Edit как строку (AsString)?

Так ошибка-то на какой строке вылезает? smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 25.5.2008, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Код во втором посте сверху этой страницы привёл как возможную причину, а ошибка вылазит при попытке добавить дату ремонта или дату заявки в коде на предыдущей странице. А стрелка появляется сразу же после ошибки возле строки: FormModifyData.ShowModal; , которая приведена выше во втором посте на этой странице. 

p.s. Действительно ерунда какая-то происходит. Попробовал создать в Access-е базу с единственной таблицей, в которой поля счётчик да дата типа дата. В Delphi кинул на форму всё что нужно для ADO соединения, отобразил таблицу, добавил кнопку на которой событие - добавление записи формата время из Edit1.Text, который находится на этой же форме. Не забыл всё это включить в конструкцию  try...except. Запустил... всё добавляется smile 

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

Это сообщение отредактировал(а) Veniamin - 25.5.2008, 00:27
PM MAIL   Вверх
Данкинг
Дата 25.5.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



В общем, разберись с кодом, где-то там косяк. Кстати, не понял, зачем форму создавать динамически, когда вроде как можно создать обычным способом.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 25.5.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Там столько перелопачивать. smile, а из-за ерунды заново писать код - смерти подобно, время не позволяет. А писал по книге, подобно.  Т.е. динамически создавать форму? У меня все формы так создаются, которые не появляются изначально при запуске программы.

Это сообщение отредактировал(а) Veniamin - 25.5.2008, 00:31
PM MAIL   Вверх
Данкинг
Дата 25.5.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Не заново писать, а разобраться только с тем, где происходит добавление даты (если всё же функцию проверки писать не хочешь).

Цитата(Veniamin @  25.5.2008,  01:30 Найти цитируемый пост)
У меня все формы так создаются, которые не появляются изначально при запуске программы.

А смысл-то в этом какой? Уменьшение размера программы? Дело твоё, конечно, просто это лишняя причина для ошибки.




--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 25.5.2008, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Может быть и в этом причина. На Delphi с базами мало опыта в программировании. :( А Вы можете посмотреть код пожалуйста?
PM MAIL   Вверх
Данкинг
Дата 25.5.2008, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Могу, только завтра, сейчас уже в код врубаться неохота. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 25.5.2008, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Хорошо, спасибо. smile smile 
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.