Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Update поля с датой типа DateTime, редактирование записи 
:(
    Опции темы
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   Вверх
Страницы: (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.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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