C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Снятие фильтра
pn2
Отправлено: 01.03.2005, 18:13


Ученик-кочегар

Группа: Участник
Сообщений: 20



База MySQL, компонент TQuery.
Применяю фильтр примерно такой:


{ char sql[256];
char tab[] = "vaucher";
char fld[] = "pax";
char val[16];

if (Form1->Edit1->Text != "") strcpy(val, Form1->Edit1->Text.c_str());
else strcpy(val, "0");
Query1->Close();
Query1->SQL->Clear();

sprintf(sql, "SELECT * FROM %s WHERE %s=%s", tab, fld, val);

Query1->SQL->Add(sql);
try
{ Query1->Open();
}

А вот как снять этот фильтр никак не получается.
Guest
Отправлено: 01.03.2005, 18:22


Не зарегистрирован







Изменить текст запроса на
SELECT * FROM %s
(без ненужных where)
и закрыть, открыть Query1
pn2
Отправлено: 02.03.2005, 11:07


Ученик-кочегар

Группа: Участник
Сообщений: 20



QUOTE (Guest @ 01/03/2005, 18:22)
Изменить текст запроса на
SELECT * FROM %s
(без ненужных where)
и закрыть, открыть Query1

SELECT * FROM %s WHERE %s=%s", tab, fld, val;

Так я фильтрую по полю fld со значением val, не просто открываю всю таблицу.

Query1->Close();
Query1->Open();
Не проходит.
AVC
Отправлено: 02.03.2005, 11:34


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

А вот как снять этот фильтр никак не получается.
...
Так я фильтрую по полю fld со значением val, не просто открываю всю таблицу

Отмена фильтра и есть показ всей таблицы. Если это не то, чего вы хотите — сформулируйте вопрос иначе.

QUOTE

Query1->Close();
Query1->Open();
Не проходит.

Естественно. Это нужно делаеть после изменения текста запроса.
pn2
Отправлено: 02.03.2005, 13:07


Ученик-кочегар

Группа: Участник
Сообщений: 20



Сорри, просто я не так понял ответ, всё нормально работает.
pn2
Отправлено: 02.03.2005, 14:20


Ученик-кочегар

Группа: Участник
Сообщений: 20



А вот как в том же самом фильтре установить не строковую переменную, а паременную типы "DATE". Вообщем, что бы можно было фильтровать по полю с датой. Ни как не могу с типами переменных разобраться....

{ char sql[256];
char tab[] = "vaucher";
char fld[] = "pax";
char val[16];

if (Form1->Edit1->Text != "") strcpy(val, Form1->Edit1->Text.c_str());
else strcpy(val, "0");
Query1->Close();
Query1->SQL->Clear();

sprintf(sql, "SELECT * FROM %s WHERE %s=%s", tab, fld, val);

Query1->SQL->Add(sql);
try
{ Query1->Open();
}

Вместо Edit1 у меня DateEdit1
AVC
Отправлено: 02.03.2005, 15:16


Ветеран

Группа: Модератор
Сообщений: 1583



Для этого у вас есть два пути.
Первый — сконструировать полностью завершенный текст запроса на клиенте и отдать его серверу. То, что вы делаете сейчас. Например у вас задан период в переменных типа TDateTime datbeg и datend. Тогда запрос можно сформировать например так
Query1->SQL->Text = AnsiString("") +
"Select * From Test Where dat between '" +
FormatDateTime("yyyy-mm-dd", datbeg) + "' and '" +
FormatDateTime("yyyy-mm-dd", datend) + "'";

Второй путь — использовать параметризованный запрос. Например так
Query1->SQL->Text = "Select * From Test Where dat between :pDatBeg and :pDatEnd";
и заполнять параметры перед каждым октрытием.
pn2
Отправлено: 02.03.2005, 16:35


Ученик-кочегар

Группа: Участник
Сообщений: 20



QUOTE (AVC @ 02/03/2005, 15:16)
Для этого у вас есть два пути.
Первый — сконструировать полностью завершенный текст запроса на клиенте и отдать его серверу. То, что вы делаете сейчас. Например у вас задан период в переменных типа TDateTime datbeg и datend. Тогда запрос можно сформировать например так
Query1->SQL->Text = AnsiString("") +
"Select * From Test Where dat between '" +
FormatDateTime("yyyy-mm-dd", datbeg) + "' and '" +
FormatDateTime("yyyy-mm-dd", datend) + "'";

Второй путь — использовать параметризованный запрос. Например так
Query1->SQL->Text = "Select * From Test Where dat between :pDatBeg and :pDatEnd";
и заполнять параметры перед каждым октрытием.

Что-то я не пойму, как преобразовать дату в строку...
Guest
Отправлено: 02.03.2005, 16:50


Не зарегистрирован







FormatDateTime("yyyy-mm-dd", datbeg)
и обратите внимание на строку формата — она должна удовлетворять требованиям сервера.
pn2
Отправлено: 02.03.2005, 17:09


Ученик-кочегар

Группа: Участник
Сообщений: 20




как всё это применять к моему коду, меняя только переменную data?
Да и вместо Edit1 идёт календарь DateEdit1
т.е поменять только char fld[] = "pax"; на переменную в формате даты (в mysql она идёт как 0000-00-00)

CODE
char sql[256];
char tab[] = "vaucher";
char fld[] = "pax";
char val[16];

if (Form1->Edit1->Text != "") strcpy(val, Form1->Edit1->Text.c_str());
else strcpy(val, "0");
Query1->Close();
Query1->SQL->Clear();

sprintf(sql, "SELECT * FROM %s WHERE %s=%s", tab, fld, val);
AVC
Отправлено: 02.03.2005, 18:02


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

как всё это применять к моему коду, меняя только переменную data?


Предпологается, что вы работаете в среде Builder'а
так
CODE

char *tab = "vaucher";
char *fld = "pax";

Query1->SQL->Text = AnsiString("") +
"SELECT * FROM " + AnsiString(tab) + " WHERE " + AnsiString(fld) + " = " +
FormatDateTime("yyyy-mm-dd", date)

или так
AnsiSting tab = "vaucher";
AnsiSting fld = "pax";
Query1->SQL->Text = AnsiString("") +
"SELECT * FROM " + tab + " WHERE " + fld + " = " +
FormatDateTime("yyyy-mm-dd", date)

или так
Один раз заполнить текст запроса
Query1->SQL->Text = AnsiString("") +
"SELECT * FROM " + tab + " WHERE " + fld + " = :pDate"
при изменении даты
Query1->Active = false;
Query1->ParamByName("pDate")->Value = date;
Query1->Active = true;

pn2
Отправлено: 04.03.2005, 16:04


Ученик-кочегар

Группа: Участник
Сообщений: 20



Записал так
CODE
char *tab = "vaucher";
char *fld = "data";

Query1->SQL->Text = AnsiString("") +
"SELECT * FROM " + AnsiString(tab) + " WHERE " + AnsiString(fld) + " = " +
FormatDateTime("yyyy-mm-dd", date);


Пишет: Undefined symbol date
avc*
Отправлено: 04.03.2005, 16:14


Не зарегистрирован







Ну так переменную с названием data надо определить или подставить вместо неё то, что имеет тип TDateTime и которое хранит нужную вам дату (например TDateTimePicker->Date / DateTime)/
Gedeon
Отправлено: 04.03.2005, 16:16


Ветеран

Группа: Модератор
Сообщений: 1742



Date().FormatString("yyyy-mm-dd");
AVC
Отправлено: 04.03.2005, 16:32


Ветеран

Группа: Модератор
Сообщений: 1583



Не. data у него это переменная, это я допустил описку, назвав её date. biggrin.gif

Кстати pn2
а почему сразу не писать From vaucher? Или имя таблицы/поля параметры?

Отредактировано AVC — 04/03/2005, 15:35
pn2
Отправлено: 10.03.2005, 12:15


Ученик-кочегар

Группа: Участник
Сообщений: 20



Что-то не выходит... никак не фильтруется по полю формата DateTime.
Подставляю я в переменную data в ручную дату в формате yyyy-mm-dd

Можно показать простой пример фильтрации в таблице по полю дата(формата TDateTime)?
По всем другим полям фильтруется без проблем, а это TDateTime достал уже...


AVC
Отправлено: 10.03.2005, 13:58


Ветеран

Группа: Модератор
Сообщений: 1583



CODE

// связь BDE — ODBC на удаленную MySql
// TQuery* Query1
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
if (Query1->Active) Query1->Active = false;
AnsiString table_name = "test";
AnsiString field_name = "dat";
TDateTime field_value = TDateTime(1996, 1, 31);

Query1->SQL->Text = AnsiString("") + "\
Select * From " + table_name + " \
Where " + field_name + " = '" +
FormatDateTime("yyyy-mm-dd",field_value) + "'\
";
//Memo1->Lines->Text = Query1->SQL->Text; // проверка
Query1->Active = true;
}

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

А еще можно так
CODE

Query1->SQL->Text = AnsiString("") + "\
Select * From " + table_name + " \
Where " + field_name + " = :filter_value ";
Query1->ParamByName("filter_value")->Value = FormatDateTime("yyyy-mm-dd",field_value);
// параметр как DateTime у меня передаваться не хочет,
// приходится строкой


Отредактировано AVC — 10/03/2005, 13:54

Вернуться в Работа с базами данных в C++Builder