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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2018, 12:36   #1
BROOKHUT
 
Регистрация: 08.06.2012
Сообщений: 8
По умолчанию Stringreplace в запросе

Можно в запросе сделать замену названия поля по которому работает условие отбора?
например исходный запрос:
Код:
select * from tbl1
where idf1=:idf1
измененный запрос:
Код:
select * from tbl1
where idf2=:idf2
попробовал сделать с помощью stringreplace:
Код:
dm.qrtwo.Close;
dm.qrtwo.SQL.Clear;
DM.qrtwo.SQL.Add(StringReplace(dm.qrtwo.SQL.Text, '[@WHERE]',
       'where idcard=:idcard', [rfReplaceAll, rfIgnoreCase]));
        dm.qrtwo.Open;
получаю ошибку : no SQL statement provided
запрос использую в гриде, и грид пустеет (
BROOKHUT вне форума Ответить с цитированием
Старый 29.05.2018, 12:59   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
dm.qrtwo.SQL.Clear;
у вас больше нет запроса.
Код:
... (StringReplace(dm.qrtwo.SQL.Text, '[@WHERE]',
и больше нечего заменять.
Код:
ShowMessage(dm.qrtwo.SQL.Text);
и все станет ясно.


StringReplace теперь поддерживает(использует) регулярные выражения ?
поскольку в исходном запросе нет запрошенной строки '[@WHERE]'
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.05.2018, 13:02   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от BROOKHUT Посмотреть сообщение
получаю ошибку : no SQL statement provided
а что Вы хотите:

Цитата:
Сообщение от BROOKHUT Посмотреть сообщение
Код:
dm.qrtwo.SQL.Clear;
команда полностью очищает строку с запросом.

а потом в пустой строке хотите что-то заменить

Цитата:
Сообщение от BROOKHUT Посмотреть сообщение
Код:
DM.qrtwo.SQL.Add(StringReplace(dm.qrtwo.SQL.Text, '[@WHERE]',
       'where idcard=:idcard', [rfReplaceAll, rfIgnoreCase]));
а там ничего нет, получаете в результате пустую строку.
Пустая строка не может быть нормальным SQL запросом, о чём Вам и говорит сообщение об ошибке.

храните исходную строку с шаблоном запроса в какой-нибудь константе.
хотя, конечно, не понятно, зачем что-то заменять, если Вы знаете, что в данном месте Вам надо 'where idcard=:idcard'.
Так и подставляйте это условие в строку запроса, без всяких замен.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.05.2018, 13:10   #4
BROOKHUT
 
Регистрация: 08.06.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
dm.qrtwo.SQL.Clear;
у вас больше нет запроса.
Код:
... (StringReplace(dm.qrtwo.SQL.Text, '[@WHERE]',
и больше нечего заменять.
Код:
ShowMessage(dm.qrtwo.SQL.Text);
и все станет ясно.



StringReplace теперь поддерживает(использует) регулярные выражения ?
поскольку в исходном запросе нет запрошенной строки '[@WHERE]'
Код:
dm.qrtwo.Close;
DM.qrtwo.SQL.Add(StringReplace(dm.qrtwo.SQL.Text, 'WHERE idmain=:idmain',
       'where idcard=:idcard', [rfReplaceAll, rfIgnoreCase]));
        dm.qrtwo.Open;
showmessage(dm.qrtwo.SQL.Text)  ;
получаю ошибку, впервые такую вижу( скрин приложил
Изображения
Тип файла: jpg Screenshot_3.jpg (20.1 Кб, 79 просмотров)
BROOKHUT вне форума Ответить с цитированием
Старый 29.05.2018, 13:14   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
ShowMessage(dm.qrtwo.SQL.Text);
и все станет ясно.
Код:
qr.SQL.Clear;
qr.SQL.Add(...
qr.SQL.Text:=StringReplace(qr.SQL.Text...);
Код:
DM.qrtwo.SQL.Add(StringReplace(dm.qrtwo.SQL.Text, 'WHERE idmain=:idmain',
       'where idcard=:idcard', [rfReplaceAll, rfIgnoreCase]));
-- а что будем делать при второй замене
когда у нас уже в запросе (iidcard) и мы захотим ВЕРНУТЬСЯ к исходному(idmain)

--напишем еще одну замену.
--а как программа будет определять что менять и на что.
--разные кнопки
--итого нужна будет "матрица" кнопок NxN (N-число возможных вариантов запросов) (и замен!!!)
при N=2 нормально; N=3 тоже; N=4 так-сяк; а дальше?

Код:
case N of
0: qr.SQL.Text:='select ... where idmain=...';
1: qr.SQL.Text:='select ... where idcard=...';
....
99: qr.SQL.text:=...
else ShowMessage('что ты делаешь!!!');
end;
а еще лучше
Код:
qrfiltermain.SQL.text:='select ... where idmain=...';
qrfiltercard.SQL.Text:='select ... where idcard=...';
....
// и сделать это НЕ В КОДЕ программы(как показано)
а во время конструирования (проектирования) формы
добавить нужное число правильно поименованных(чтобы не путаться какой и что делает) Query c оттестированными(проверенными) запросами
и после переключать DataSource на нужный.
Код:
DataSource1.DataSet.Close;// закроем именно тот, который БЫЛ активным
case N of
0: DataSource1.DataSet:=qrfiltermain;
1: DataSource1.DataSet:=qrfiltercard;
...
end;
DataSource1.DataSet.Open;//откроем именно тот, который ХОТИМ сделать активным
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.05.2018 в 13:45.
evg_m вне форума Ответить с цитированием
Старый 29.05.2018, 13:34   #6
BROOKHUT
 
Регистрация: 08.06.2012
Сообщений: 8
По умолчанию

Код:
dm.qrtwo.Close;
DM.qrtwo.SQL.Text:=StringReplace(dm.qrtwo.SQL.Text, 'WHERE idmain=:idmain',
       'where idcard=:idcard', [rfReplaceAll, rfIgnoreCase]);
        dm.qrtwo.Open;
спасибо за подсказку поправил код, но теперь проблема в том , что у меня не редактируются данные, а добавляется новая строка с новыми данными
Код:
dm.qrtwo.Edit;
BROOKHUT вне форума Ответить с цитированием
Старый 29.05.2018, 13:38   #7
BROOKHUT
 
Регистрация: 08.06.2012
Сообщений: 8
По умолчанию

Цитата:
-- а что будем делать при второй замене
когда у нас уже в запросе (iidcard) и мы захотим ВЕРНУТЬСЯ к исходному(idmain)
--напишем еще одну замену.
--а как программа будет определять что менять и на что.
--разные кнопки
--итого нужна будет "матрица" кнопок NxN (N-число возможных вариантов запросов) (и замен!!!)
при N=2 нормально; N=3 тоже; N=4 так-сяк; а дальше?
надо подумать )
BROOKHUT вне форума Ответить с цитированием
Старый 29.05.2018, 13:49   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
что у меня не редактируются данные
Код:
...Edit; +Post;
Цитата:
, а добавляется новая строка с новыми данными
Код:
...Insert; +Post;
чтобы добавить вовсе не надо читать что либо, достаточно(я бы даже сказал необходимо) воспользоваться SQL
Код:
qrIns.SQL.Text:='insert into .... values(... )';
qrIns.ExecSQL;
и использовать для этого ОТДЕЛЬНЫЙ компонент(вполне возможно это будет ADOCommand)
правильно именованный(чтобы было понятно зачем он нужен глядя только на его имя) и сразу содержащий(заданный при конструировании) ПРОВЕРЕННЫЙ(!!!) SQL text.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.05.2018 в 13:58.
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringReplace проблема с регуляркой :( FleXik Общие вопросы Delphi 5 14.09.2013 22:36
Вопрос по StringReplace Lauri Общие вопросы Delphi 1 08.02.2013 19:15
StringReplace Painkiller_13 Общие вопросы Delphi 11 24.12.2012 22:25
StringReplace s1s1s1 Общие вопросы Delphi 12 28.03.2011 16:26
Не заменяет StringReplace Alex Cones Общие вопросы Delphi 2 03.09.2009 21:00