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.
Кстати 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 |
|