Topic: Апостроф

Здравствуйте! Есть вопрос по апострофу:
1. Если в скрипте перед закрывающим апострофом находится буква я, то окрашивается синим весь последующий скрипт, причем, если букв я две или больше - последующий скрипт не синеет (например: посинеет - 'запрос ...  я', не посинеет - 'запрос ...  яяяя').
2. Имеем Edit с подключенным SQL-поиском по всем полям. Если у клиента фамилия' с апострофом получаем ошибку: near "'%'": syntax error. И соответственно ошибочний запрос с нашим "лишним" апострофом:

(CASE WHEN '{фамилия}' <> '' THEN klientprizvimja LIKE '%{фамилия'}%'  ELSE 1=1 END) OR

Очень хочется побороть ошибку.
Заранее благодарю.

2 (edited by iacovlogica 2018-03-27 07:10:33)

Re: Апостроф

Проблема в стороннем компоненте , который Дмитрий полагаю в будущем заменит .
апостроф Вы зря вписали , уберите его а на то что скрипт синеет просто не обращайте внимания он полностью работоспособен .
Вид скрипта ,конечно, необычен но на работу не влияет . Как временное решение можете добавить пробел после буквы Я(или временно поставить другую букву) , а в окончательной версии его уберёте(замените букву) .(как я делал)

п.с. Не рекомендую использовать русские буквы в названиях компонентов ( ...правда это очень удобно )

Re: Апостроф

Все-таки надеемся на исправление, пока что вместо апострофа в фамилии используем двойные кавычки. В коде выше приведена выдержка из сообщения с ошибкой, а там имя компонента заменяется введенным текстом (как по мне так для компонентов нет лучше, чем стандартные имена:)). А синенькое решается дополнительным пробелом, просто, несколько, отвлекает.

Re: Апостроф

collagen wrote:

2. Имеем Edit с подключенным SQL-поиском по всем полям. Если у клиента фамилия' с апострофом получаем ошибку: near "'%'": syntax error. И соответственно ошибочний запрос с нашим "лишним" апострофом:

(CASE WHEN '{фамилия}' <> '' THEN klientprizvimja LIKE '%{фамилия'}%'  ELSE 1=1 END) OR

Очень хочется побороть ошибку.
Заранее благодарю.


Спасибо за найденую ошибку, исправил, скачайте пожалуйста последнюю версию
https://www.dropbox.com/s/5x7vjreoju45z … a.zip?dl=0

Dmitry.

Re: Апостроф

Чето половина таблиц стала ругаться после этого обновления, посыпались ошибки, где предыдущую версию можно скачать

Re: Апостроф

http://myvisualdatabase.com/download/myvisualdb.exe

Re: Апостроф

При компилировании в последней версии стала выпадать ошибка (см. вложение).
(в предыдущей версии такой ошибки небыло)
скорее всего по другому стал определятся код в редакторе.

кодом формировал условие WHERE в текстовом поле и подствлял в SQL запросе по заполнению таблицы.
код такой

procedure All_koresp_Button10_OnClick (Sender: string; var Cancel: boolean);  // В зависимости от введенных данных в поиске формируем условие WHERE в SQL запросе
begin
     All_koresp.Edit11.Text := '';
     if All_koresp.ComboBox1.Text <> '' Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'kan_grup.id_kan_tip= {ComboBox1} AND ';
     if All_koresp.ComboBox2.Text <> '' Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.id_kan_grup= {ComboBox2} AND ';
     if All_koresp.ComboBox3.Text <> '' Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.id_organization={ComboBox3} AND ';
     if All_koresp.Edit6.Text <> '' Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.god_docum LIKE ''{Edit6}'' AND '; 
     if All_koresp.Edit8.Text <> '' Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.Reg_nom LIKE ''%{Edit8}%'' AND ';
     if All_koresp.Edit7.Text <> '' Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.kr_soder LIKE ''%{Edit7}%'' AND ';
     if All_koresp.Edit9.Text <> '' Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.Reg_nom_otprav LIKE ''%{Edit9}%'' AND ';

     if All_koresp.CheckBox1.State = cbChecked Then
     begin
     All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.Ob_prosm=1'
     end;

     if All_koresp.CheckBox1.State = cbUnchecked Then
     begin
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text <> '') Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + '((documentiki.DP1 LIKE ''{Edit3}'' AND documentiki.DP2 LIKE ''{Edit4}'') OR (documentiki.PP1 LIKE ''{Edit3}'' AND documentiki.PP2 LIKE ''{Edit4}''))';
     if (All_koresp.Edit3.Text = '') and (All_koresp.Edit4.Text = '') Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + '1=1';
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text = '') Then All_koresp.Edit11.Text := All_koresp.Edit11.Text + '(documentiki.DP1 LIKE ''{Edit3}'' OR documentiki.PP1 LIKE ''{Edit3}'')';
     end;
end;

Ругается скорее всего по текстовым полям кавычки стоят, может теперь по другому надо использовать

Post's attachments

Attachment icon er2.rar 80.73 kb, 315 downloads since 2018-03-29 

Re: Апостроф

Evgeniy D
Не смог найти ошибку, приложите пожалуйста ваш проект, протестирую.

Dmitry.

Re: Апостроф

DriveSoft wrote:

Evgeniy D
Не смог найти ошибку, приложите пожалуйста ваш проект, протестирую.

ссылка на проект https://yadi.sk/d/jmAVXvO-3TsiDE
Вряд ли поможет, проект большой, база на MySQL.
Форма - All_koresp
Кнопка формирования условия - Button10
Кнопка SQL запроса - Button9

Можно ли раннюю версию программы еще раз выложить которую здесь давали http://myvisualdatabase.com/forum/viewtopic.php?id=4155

Re: Апостроф

С апострофом заметил следующее
допустим условие WHERE для SQL запроса формируется у меня так:

All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.god_docum LIKE ''{Edit6}'' AND ';

Потом в SQL запросе подставляю сформированное условие:

WHERE {Edit11} 

после SQL условие выглядит так:

WHERE documentiki.god_docum LIKE ''2018''

Тоже самое сделал с кнопкой поиск и посмотрел каким SQL запросом сформирована таблица показало такое условие

WHERE `documentiki`.`god_docum` LIKE '2018'

т.е. разница в двух кавычках, это после обновления программы так стало. Может это и является проблемой? Подскажите как поправить можно в моем формировании условия:

All_koresp.Edit11.Text := All_koresp.Edit11.Text + 'documentiki.Reg_nom LIKE ''%{Edit8}%'' AND ';

Re: Апостроф

попробуйте так

procedure All_koresp_Button10_OnClick (Sender: string; var Cancel: boolean);  // В зависимости от введенных данных в поиске формируем условие WHERE в SQL запросе
var
    s, sWhere: string;
begin
     sWhere := '';
     if All_koresp.ComboBox1.Text <> '' Then sWhere := sWhere + 'kan_grup.id_kan_tip= {ComboBox1} AND ';
     if All_koresp.ComboBox2.Text <> '' Then sWhere := sWhere + 'documentiki.id_kan_grup= {ComboBox2} AND ';
     if All_koresp.ComboBox3.Text <> '' Then sWhere := All_koresp.Edit11.Text + 'documentiki.id_organization={ComboBox3} AND ';
     if All_koresp.Edit6.Text <> '' Then sWhere := sWhere + 'documentiki.god_docum LIKE ''{Edit6}'' AND ';
     if All_koresp.Edit8.Text <> '' Then sWhere := sWhere + 'documentiki.Reg_nom LIKE ''%{Edit8}%'' AND ';
     if All_koresp.Edit7.Text <> '' Then sWhere := sWhere + 'documentiki.kr_soder LIKE ''%{Edit7}%'' AND ';
     if All_koresp.Edit9.Text <> '' Then sWhere := sWhere + 'documentiki.Reg_nom_otprav LIKE ''%{Edit9}%'' AND ';

     if All_koresp.CheckBox1.State = cbChecked Then
     begin
         sWhere := sWhere + 'documentiki.Ob_prosm=1'
     end;

     if All_koresp.CheckBox1.State = cbUnchecked Then
     begin
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text <> '') Then sWhere := sWhere + '((documentiki.DP1 LIKE ''{Edit3}'' AND documentiki.DP2 LIKE ''{Edit4}'') OR (documentiki.PP1 LIKE ''{Edit3}'' AND documentiki.PP2 LIKE ''{Edit4}''))';
     if (All_koresp.Edit3.Text = '') and (All_koresp.Edit4.Text = '') Then sWhere := sWhere + '1=1';
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text = '') Then sWhere := sWhere + '(documentiki.DP1 LIKE ''{Edit3}'' OR documentiki.PP1 LIKE ''{Edit3}'')';
     end;

     s := All_koresp.Button9.dbSQL;
     s := ReplaceStr(s, '{Edit11}', sWhere);
     All_koresp.Button9.dbSQL := s;
end;
Dmitry.

Re: Апостроф

DriveSoft wrote:

попробуйте так

procedure All_koresp_Button10_OnClick (Sender: string; var Cancel: boolean);  // В зависимости от введенных данных в поиске формируем условие WHERE в SQL запросе
var
    s, sWhere: string;
begin
     sWhere := '';
     if All_koresp.ComboBox1.Text <> '' Then sWhere := sWhere + 'kan_grup.id_kan_tip= {ComboBox1} AND ';
     if All_koresp.ComboBox2.Text <> '' Then sWhere := sWhere + 'documentiki.id_kan_grup= {ComboBox2} AND ';
     if All_koresp.ComboBox3.Text <> '' Then sWhere := All_koresp.Edit11.Text + 'documentiki.id_organization={ComboBox3} AND ';
     if All_koresp.Edit6.Text <> '' Then sWhere := sWhere + 'documentiki.god_docum LIKE ''{Edit6}'' AND ';
     if All_koresp.Edit8.Text <> '' Then sWhere := sWhere + 'documentiki.Reg_nom LIKE ''%{Edit8}%'' AND ';
     if All_koresp.Edit7.Text <> '' Then sWhere := sWhere + 'documentiki.kr_soder LIKE ''%{Edit7}%'' AND ';
     if All_koresp.Edit9.Text <> '' Then sWhere := sWhere + 'documentiki.Reg_nom_otprav LIKE ''%{Edit9}%'' AND ';

     if All_koresp.CheckBox1.State = cbChecked Then
     begin
         sWhere := sWhere + 'documentiki.Ob_prosm=1'
     end;

     if All_koresp.CheckBox1.State = cbUnchecked Then
     begin
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text <> '') Then sWhere := sWhere + '((documentiki.DP1 LIKE ''{Edit3}'' AND documentiki.DP2 LIKE ''{Edit4}'') OR (documentiki.PP1 LIKE ''{Edit3}'' AND documentiki.PP2 LIKE ''{Edit4}''))';
     if (All_koresp.Edit3.Text = '') and (All_koresp.Edit4.Text = '') Then sWhere := sWhere + '1=1';
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text = '') Then sWhere := sWhere + '(documentiki.DP1 LIKE ''{Edit3}'' OR documentiki.PP1 LIKE ''{Edit3}'')';
     end;

     s := All_koresp.Button9.dbSQL;
     s := ReplaceStr(s, '{Edit11}', sWhere);
     All_koresp.Button9.dbSQL := s;
end;

Помогло для первой сортировки, при дальнейшем выборе критериев сортировки в коде

s := All_koresp.Button9.dbSQL;
     s := ReplaceStr(s, '{Edit11}', sWhere);
     All_koresp.Button9.dbSQL := s;

'{Edit11}' уже нет в тексте полученным

s := All_koresp.Button9.dbSQL;

а содержит уже предыдущее значение s

Re: Апостроф

Точно. Можно запомнить SQL запрос, затем восстановить его первоначальный вид после исполнения запроса

procedure All_koresp_Button10_OnClick (Sender: string; var Cancel: boolean);  // В зависимости от введенных данных в поиске формируем условие WHERE в SQL запросе
var
    s, sWhere: string;
    sSQL: string;
begin
     sSQL := All_koresp.Button9.dbSQL;
     sWhere := '';
     if All_koresp.ComboBox1.Text <> '' Then sWhere := sWhere + 'kan_grup.id_kan_tip= {ComboBox1} AND ';
     if All_koresp.ComboBox2.Text <> '' Then sWhere := sWhere + 'documentiki.id_kan_grup= {ComboBox2} AND ';
     if All_koresp.ComboBox3.Text <> '' Then sWhere := All_koresp.Edit11.Text + 'documentiki.id_organization={ComboBox3} AND ';
     if All_koresp.Edit6.Text <> '' Then sWhere := sWhere + 'documentiki.god_docum LIKE ''{Edit6}'' AND ';
     if All_koresp.Edit8.Text <> '' Then sWhere := sWhere + 'documentiki.Reg_nom LIKE ''%{Edit8}%'' AND ';
     if All_koresp.Edit7.Text <> '' Then sWhere := sWhere + 'documentiki.kr_soder LIKE ''%{Edit7}%'' AND ';
     if All_koresp.Edit9.Text <> '' Then sWhere := sWhere + 'documentiki.Reg_nom_otprav LIKE ''%{Edit9}%'' AND ';

     if All_koresp.CheckBox1.State = cbChecked Then
     begin
         sWhere := sWhere + 'documentiki.Ob_prosm=1'
     end;

     if All_koresp.CheckBox1.State = cbUnchecked Then
     begin
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text <> '') Then sWhere := sWhere + '((documentiki.DP1 LIKE ''{Edit3}'' AND documentiki.DP2 LIKE ''{Edit4}'') OR (documentiki.PP1 LIKE ''{Edit3}'' AND documentiki.PP2 LIKE ''{Edit4}''))';
     if (All_koresp.Edit3.Text = '') and (All_koresp.Edit4.Text = '') Then sWhere := sWhere + '1=1';
     if (All_koresp.Edit3.Text <> '') and (All_koresp.Edit4.Text = '') Then sWhere := sWhere + '(documentiki.DP1 LIKE ''{Edit3}'' OR documentiki.PP1 LIKE ''{Edit3}'')';
     end;

     s := All_koresp.Button9.dbSQL;
     s := ReplaceStr(s, '{Edit11}', sWhere);
     All_koresp.Button9.dbSQL := s;
     All_koresp.Button9.Click;
     All_koresp.Button9.dbSQL := sSQL;
end;
Dmitry.

Re: Апостроф

ОК, Сенкс заработало. Немного комбобоксы по другому стали отрабатывать, но вполне нормально.