Topic: разделить текст пр помощи SUBSTRING SQL

Приветствую Вас .
Прошу помочь с данным вопросом  по разделению текста , на две части.
В Form2.Edit8.Text:= находится следующий текст.

ГОСТ Р 50444-92 Приборы, аппараты и оборудование медицинские. Общие технические условия (принят в качестве межгосударственного стандарта ГОСТ 20790-93) (с Изменениями N 1, 2).

При открытии формы Form2_OnShow
необходимо из  Form2.Edit8.Text:
добавить в Form2.Edit9.Text:= только данное значение  ГОСТ Р 50444-92
как понимаю это можно сделать при помощи SUBSTRING .

Очень прошу помочь и решить данный вопрос.
Заранее благодарен Владимир...

Re: разделить текст пр помощи SUBSTRING SQL

Ну, как я понимаю, это вам не только для этого ГОСТа надо, но и для других тоже. Если запись вида "ГОСТ Р 50444-92" строго фиксирована по длине символов и не может быть длинее или короче, то это субстрингом решаемо элементарно, но если у вас шифр ГОСТов разный от ГОСТа к ГОСТу - то тут лучше задуматься над другим способом... Например, SplitString. Разбить строку на слова и собрать в кучу первые три или четыре слова (сколько надо по необходимости).

Re: разделить текст пр помощи SUBSTRING SQL

В том-то и дело, что запись вида "ГОСТ Р 50444-92" не фиксирована . кол-во символов разная по длине. 
по идеи скрипт должен работать но где то напортачил .
подскажите где ошибка .
SQLExecute ('SELECT SUBSTRING('+Form2.Edit9.Text+', '-', 1)');
?????
может  есть пример как построить данный скрипт ????
Заранее благодарен .

4 (edited by m.prokhachev 2018-07-26 10:56:19)

Re: разделить текст пр помощи SUBSTRING SQL

SUBSTRING('+Form2.Edit9.Text+', '-', 1):
1) первый параметр - строка, в которой производится поиск-выделение
2) второй параметр - это порядковый номер символа в строке
3) третий параметр - это длина "вырезаемого" куска из строки
Вы пытаетесь найти дефис в строке и уже от него оттолкнутся далее при поиске - эта функция так не работает.
Кроме того, вы пытаетесь применить SQL-команду не к записи в базе данных, а к компоненту на форме вашего приложения. Это неверно и некорректно. Либо вы используете SQL-команду для конкретного поля в какой-либо таблице вашей БД, либо используете функции-аналоги, но уже из скрипта MVD.
Вообще, пример использования этой функции в SQL-команде выглядит так:

SELECT name, SUBSTRING(name, 2, LEN(name)) FROM Ships;
SELECT name, SUBSTRING(name, 2, 3) FROM Ships;

первый SELECT выдаст вам name и "укороченный" спереди на 1 символ этот же name
второй SELECT выдаст вам name и 3 символа из name, начиная со второго символа
функция LEN(name) в данном случае возвращает длину строки в количестве символов
Вам строку "порезать" надо при выводе данных из БД на форму в компонент EditText?

Re: разделить текст пр помощи SUBSTRING SQL

Вам строку "порезать" надо при выводе данных из БД на форму в компонент EditText?
до совершенно верно

Re: разделить текст пр помощи SUBSTRING SQL

Приведите тогда свой кусок кода, где это происходит, например, всю procedure, в которой все это происходит

Re: разделить текст пр помощи SUBSTRING SQL

procedure Form2_OnShow (Sender: TObject; Action: string; Key: Char);
begin
     
    Form2.Edit9.Text:= Copy (Form2.Edit3.Text,1,12); // с позиции 1 копировать 3 символа

    SQLExecute ('SELECT SUBSTRING('+Form2.Edit9.Text+', 1, 1)');

end;

Re: разделить текст пр помощи SUBSTRING SQL

Понятно всё с вами)

Правильно ли я понимаю, что при открытии-показе формы в Edit'ах находятся уже данные записи из таблицы БД?

в таком случае, назовите мне Edit'ы (или строковые переменные), в котором есть исходный текст и в какой надо вывести результат substring'а

Re: разделить текст пр помощи SUBSTRING SQL

в Edit'ах находятся данные записи из таблицы БД - Да
база данных :Him
берется из столбца : Naim_Metodica  и выводится в  Form2.Edit3.Text полный длинный текст

В  Form2.Edit9.Text -необходимо вывести только часть текста из  Form2.Edit3.Text - но только та часть которая мне нужна, например первая ГОСТ Р 50444-92.
Надеюсь щас Вас не запутал.

Re: разделить текст пр помощи SUBSTRING SQL

Тогда давайте сделаем так... У нас формат шифра ГОСТа такой: ГОСТ <Р> <ИСО|МЭК> <циферный шифр> <полное наименование документа>.
Собственно наша задача в простейшем виде - это выделить первые два-четыре блока "блока" из длинной строки - ГОСТ <Р> <ИСО|МЭК> <циферный шифр>.
Наша задача несколько облегчается тем, что все слова/буквы/шифры разделяются пробелом. Идея моя такова, что надо тупо порезать длинную строку на слова, а взять в работу только первые два-четыре "слова", которые и будут соответствовать нашим "блокам".
Задача несколько осложняется тем, что буква Р может быть в строке, а может и не быть. Например, сравни: "ГОСТ Р 7.0.6-2008 Международный стандартный номер издания музыкального произведения (ISMN). Издательское оформление и использование" и "ГОСТ 7.85-2003 Международный стандартный номер технического отчета". Также, насколько я успел изучить формирование шифра ГОСТов, возможны приставки к «ГОСТ Р» слов «ИСО» или «МЭК», означающие, что данный нормативный документ является переводом стандарта соответствующей международной организации. Но это тоже можно учесть при "резке" строки, так как такие приставки имеют фиксированную позицию относительно других слов-"блоков".
Такая постановка задачи вас устроит?

Re: разделить текст пр помощи SUBSTRING SQL

Итак, исходя из поставленной задачи, у меня получилось так:

procedure Form2_OnShow (Sender: TObject; Action: string; Key: Char);
var
  arrString: array of string; // динамический массив строк, куда мы разберем по словам, используя пробелы как разделители, большую длинную строку
  flag_R, flag_ISOorMKE: boolean; // логические переменные-флаги по наличию буквы Р и ИСО/МКЭ в длинной строке
begin
    flag_R := false;
    flag_ISOorMKE := false;
...
   arrString := SplitString(Form2.Edit3.Text,' '); // разбиваем длинную строку на слова (отдельнная буква, с двух сторон у которой пробел - тоже будет считаться словом)
   // начинаем формировать шифр ГОСТа
   Form2.Edit9.Text := arrString[0]; // первое слово ГОСТ будет всегда и в принципе; нумерация в динамическом массиве идет с 0, а не с 1
   // пошла серия проверок
   if (pos('Р', Form2.Edit3.Text) > 0) and (pos('Р', Form2.Edit3.Text) < 7) // проверяем наличие буквы Р в первых 6 символах большой строки, так как Р должно идти сразу за ГОСТ
     then flag_R := true;
   if ((pos('ИСО', Form2.Edit3.Text) > 0) and (pos('ИСО', Form2.Edit3.Text) < 11)) or ((pos('МКЭ', Form2.Edit3.Text) > 0) and (pos('МКЭ', Form2.Edit3.Text) < 11)) // проверяем наличие ИСО или МКЭ в первых 11 символах большой строки, так как они должны идти сразу за ГОСТ Р
     then flag_ISOorMKE := true;
   // циферный код ГОСТа имеется всегда в документе и будет либо вторым, либо третьим, либо четвертым словом-блоком
   // теперь отрабатываем варианты
   if (not flag_R) and (not flag_ISOorMKE) // нет ни Р, ни ИСО/МКЭ
     then Form2.Edit9.Text := Form2.Edit9.Text + ' ' + arrString[1]; // дополняем Edit9 циферным кодом
   if flag_R and (not flag_ISOorMKE) // есть Р, нет ИСО/МКЭ
     then Form2.Edit9.Text := Form2.Edit9.Text + ' ' + arrString[1] + ' ' + arrString[2]; // дополняем Edit9 буквой Р и циферным кодом
   if flag_R and flag_ISOorMKE // есть Р, есть ИСО/МКЭ
     then Form2.Edit9.Text := Form2.Edit9.Text + ' ' + arrString[1] + ' ' + arrString[2] + ' ' + arrString[3]; // дополняем Edit9 буквой Р, ИСО/МКЭ и циферным кодом
   // всё, в Edit9.Text сформированный шифр ГОСТа
end;

в Form2.Edit3.Text у нас исходная строка, в  Form2.Edit9.Text - отработанная (нужная)

Re: разделить текст пр помощи SUBSTRING SQL

Огромное спасибо !!!!!!!!
уже опробовал   сам так не написал бы...
Еще раз огромное спасибо и низкий поклон.