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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2013, 23:09   #1
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию Автофильтр по определенному столбцу DBGrid

Есть две таблицы Excel. Они загружаются в два DBGrid на форме.
Общего у этих двух таблиц только колонки: "ФИО", "Должность", "Номер телефона", "Дата уведомления"
Нужно сделать автофильтр, что бы при нажатии на кнопку, фильтровалась в обоих таблицах колонка "Дата уведомления" и оставались только даты равные текущему дню и те что ему предшествуют. Затем результаты автофильтра первой и второй таблиц объединить по сходным колонкам "ФИО", "Должность", "Номер телефона", "Дата уведомления" и записать в отдельную таблицу.
Делаю так
1. Текущую дату записываю в Edit
Код:
Date := TdateTime(now);
Edit1.Text := DateToStr(Date);
2. В DBGrid1 и DBGrid переношу данные из Excelя так
Код:
// Включаем первое соединение и загружаем первую таблицу нужно принимать
ADOConnection1.ConnectionString := Edit1.Text;
ADOConnection1.Connected:=true;
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.Active:=True;

// Включаем второе соединение и загружаем вторую таблицу
ADOConnection2.ConnectionString := Edit2.Text;
ADOConnection2.Connected:=true;
ADOQuery2.Active:=False;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery2.Active:=True;
У обоих таблиц название Лист1 одинаковое, но количество колонок и записей разное и в любой момент количество записей может измениться.
3. Пытаюсь фильтровать по нажатию на кнопку
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.SQL.Add('WHERE ADOQuery1Dateofevent LIKE ''%'+Edit1.Text+'%''');
ADOQuery1.Active:=true;
end;
Здесь ADOQuery1Dateofevent это имя колонки "Дата уведомления" и вот в этом коде и ошибка. Делаю не правильно. А как правильно не знаю.
Помогите пожалуйста отфильтровать и результат того что получиться записать в отдельную таблицу.
Смотреть фильмы HD Фильмы для планшетов

Последний раз редактировалось demiancz; 30.11.2013 в 23:11.
demiancz вне форума Ответить с цитированием
Старый 30.11.2013, 23:34   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Date := TdateTime(now);
Edit1.Text := DateToStr(Date);
now уже есть TdateTime, поэтому все эти перегоны лишние..

like к дате применять бессмысленно
eval вне форума Ответить с цитированием
Старый 30.11.2013, 23:40   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ADOQuery1Dateofevent - что за имя колонки? Вроде речь шла о Дата уведомления
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.11.2013, 23:43   #4
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
now уже есть TdateTime, поэтому все эти перегоны лишние..

like к дате применять бессмысленно
Подскажите как правильно сделать. Если не трудно.

Цитата:
Сообщение от Аватар Посмотреть сообщение
ADOQuery1Dateofevent - что за имя колонки? Вроде речь шла о C
В ADOQuery1 свойсто Name именно ADOQuery1Dateofevent, а DisplayLabel - Дата уведомления.
просто я пытаюсь по имени колонки, а не по отражаемому имени искать.
Смотреть фильмы HD Фильмы для планшетов

Последний раз редактировалось Stilet; 01.12.2013 в 13:05.
demiancz вне форума Ответить с цитированием
Старый 30.11.2013, 23:59   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Подскажите как правильно сделать. Если не трудно.
каким форматом лежат данные в поле?
eval вне форума Ответить с цитированием
Старый 01.12.2013, 00:04   #6
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
каким форматом лежат данные в поле?
В поле Дата уведомления так 01.12.2013
Я уже думаю может добавить вычисляемое поле и сравнивать текущую дату с полем "Дата уведомления". Если текущая дата <= "Дата уведомления", то поставить '1', если нет - '0'. Ну а потом фильтровать это вычисляемое поле и отобрать все записи в которых есть '1'.
Завтра буду думать-гадать.
Буду благодарен если кто поможет решить задачу.
Смотреть фильмы HD Фильмы для планшетов

Последний раз редактировалось demiancz; 01.12.2013 в 00:08.
demiancz вне форума Ответить с цитированием
Старый 01.12.2013, 00:09   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если упрощенно, то примерно так
Код:
  ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\1.xls;Mode=Read;Extended Properties="Excel 8.0;HDR=No"';
  ADOQuery1.SQL.Text:='SELECT * FROM [Лист1$] WHERE F2>=:MyDate';
  ADOQuery1.Parameters.ParamByName('MyDate').Value:=Date();
  ADOQuery1.Open;
HDR=No - чтобы и данные 1-ой строки тянула
Дата во 2-ой колонке в формате дата (дд.мм.гггг)
Колонки именуются автоматически F1,F2,...

ADD

Вставил в 1-ую строку названия колонок, обратился так, тоже работает
Код:
  ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\1.xls;Mode=Read;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"';
  ADOQuery1.SQL.Text:='SELECT * FROM [Лист1$] WHERE [дата]>=:MyDate';
  ADOQuery1.Parameters.ParamByName('MyDate').Value:=Date();
  ADOQuery1.Open;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.12.2013 в 00:18.
Аватар вне форума Ответить с цитированием
Старый 01.12.2013, 01:10   #8
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

У меня в строке
Код:
ADOQuery1.Parameters.ParamByName('MyDate').Value:=Date();
ошибка
[dcc32 Error] Unit1.pas(101): E2066 Missing operator or semicolon

Сделал так
Код:
ADOQuery1.Parameters.ParamByName('MyDate').Value:=Date;
Вроде бы работает. Пробую.

Возникла проблема со второй таблицей. Если в первой таблице EXecel есть колонка "Дата уведомления" и все работает, то во второй таблице этой колонки нет. Она создана как вычисляемое поле.
Отсюда вопрос. Как сделать автофильтр по вычисляемому полю?

Есть таблица Excel с полями "Фамилия", "Имя", "Год рождения", "Количество дней". Эта таблица загружается в DBGrid. В ADOQuery создается вычисляемое поле "Дата уведомления" в котором выводится дата (суммируются Год рождения и Количество дней). Теперь надо отфильтровать по полю "Дата уведомления". Если текущая дата равна той что в "Дата уведомления", то показать запись.
Помогите пожалуйста. Если вычисляемые поля то запрос такой?
Если обращаться к Excel то запрос был бы такой
Код:
ADOQuery2.SQL.Text:='SELECT * FROM [Лист1$] WHERE [Дата уведомления]<=:MyDate';
но в данном случае это ничего не даст, так как в Excel колонки Дата уведомления нет.
Смотреть фильмы HD Фильмы для планшетов

Последний раз редактировалось Stilet; 01.12.2013 в 13:10.
demiancz вне форума Ответить с цитированием
Старый 01.12.2013, 03:20   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
так как в Excel колонки Дата уведомления нет.
есть, можно фильтровать по
Цитата:
Год рождения и Количество дней
eval вне форума Ответить с цитированием
Старый 01.12.2013, 11:36   #10
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
есть, можно фильтровать по
А если количество дней тоже вычисляемое поле?
Смотреть фильмы HD Фильмы для планшетов
demiancz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
limit по определенному полю Pamparam SQL, базы данных 3 04.07.2012 09:22
И снова суммирование по определенному условию alexsampler Microsoft Office Excel 5 09.08.2011 16:44
Узнать даты по дням и вывести сумму по определенному столбцу Droid SQL, базы данных 6 02.12.2010 16:16
Удаление строк по определенному критерию Franck Microsoft Office Excel 4 16.02.2009 11:27
добавить к опред столбцу DbGrid данные furstenberg Компоненты Delphi 4 27.02.2008 20:15