powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VPF9 Поиск слова
13 сообщений из 13, страница 1 из 1
VPF9 Поиск слова
    #38467042
m134n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане,здравствуйте!
Необходима консультация по следующему вопросу.
Есть таблица,по интересующему нас полю из этой таблицы,содержимым которого являются коды(один или два),нужно провести поиск части кода,в идеале полного кода.Если начать с простого,то части кода будет достаточно,в свою очередь она является первыми двумя цифрами.Коды в каждой ячейке разные,из себя могут представлять следующее:
1)12.32.42,44.33.44
2)45.43;23.33
3)31.33.12;22.33 или 4)22.43;22.31.32
Разделители между кодами могут быть как ",",так и ";".
Тип поля character.Cлово(часть кода),которое мы ищем,получаем из textbox.
Предпринимались следующие попытки
1)thisform.AddProperty("cod[1,100]")
select field from mytable into array thisform.cod
for i=1 to alen(thisform.cod)
if at(thisform.text1.value,thisform.cod[i])>0
? Нашли
endif
endfor
Результата нет,ничего не выводит,пробовал at(subst(alltrim(thisform.text1.value),1),(subst(alltrim(thisform.cod[i]),1)),но тщетно. Подозреваю,что проблема в моей неверной интерпретации преобразования типа данных на каком-то этапе.
2)Пробовал occurs
for i=1 to alen(thisform.cod)
if occurs(thisform.text1.value,thisform.cod[i])>0
? Нашли
endif
endfor
Результат схожий.
Буду очень признателен за помощь.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467057
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m134nУважаемые форумчане,здравствуйте!
Необходима консультация по следующему вопросу.Привет.Есть таблица,по интересующему нас полю из этой таблицы,содержимым которого являются коды(один или два)Два кода в одном поле? Уже бардак.,нужно провести поиск части кода,в идеале полного кода.Если начать с простого,то части кода будет достаточно,в свою очередь она является первыми двумя цифрами.Коды в каждой ячейке Нет в базах данных ячеек. Есть записи, разделенные на поля. разные,из себя могут представлять следующее:
1)12.32.42,44.33.44
2)45.43;23.33
3)31.33.12;22.33 или 4)22.43;22.31.32Оформите сие как скрипт создания таблицы и наполнения ее этими данными. Дабы было что рассматривать практически, а не только чисто умозрительно.Разделители между кодами могут быть как ",",так и ";".Прелестно. Бардак растет.Тип поля character.Cлово(часть кода),которое мы ищем,получаем из textbox.
Предпринимались следующие попытки
1)thisform.AddProperty("cod[1,100]")
select field from mytable into array thisform.cod
for i=1 to alen(thisform.cod)
if at(thisform.text1.value,thisform.cod[i])>0
? Нашли
endif
endfor
Результата нет,ничего не выводит,пробовал at(subst(alltrim(thisform.text1.value),1),(subst(alltrim(thisform.cod[i]),1)),но тщетно. Подозреваю,что проблема в моей неверной интерпретации преобразования типа данных на каком-то этапе.
2)Пробовал occurs
for i=1 to alen(thisform.cod)
if occurs(thisform.text1.value,thisform.cod[i])>0
? Нашли
endif
endfor
Результат схожий.
Буду очень признателен за помощь.1. Зачем для поиска информации в таблице копировать эту информацию в массив? Не читали про locate, seek? Про индексы?
2. Не пробовали просто в командном окне посмотреть результат ?at(thisform.text1.value,thisform.cod[i]) или ?occurs(thisform.text1.value,thisform.cod[i]) ? При чем для тех записей, в которых точно находятся искомые коды? Мне почему-то кажется, что сие зрелище может оказаться очень впечатляющим.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467269
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov Бардак

Необъятность ваших познаний просто ошеломляет удачно подобранная характеристика. Осталось совсем малость - добавить к ним еще ALLTRIM(), т.к. сравнение обычно выполняется без пробелов.

m134n
Обратите внимание на наличие в SELECT опции WHERE, где и определяются условия фильтра.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467286
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Sergey Sizov Бардак Необъятность ваших познаний просто ошеломляет удачно подобранная характеристика.Что-то мне подсказывает, что крайний отвечающий снова забыл расставить знаки препинания в этой фразе... :)

А по теме - это задача из разряда тех, которую решает "полнотекстовый поиск". Поэтому (как бы ни хотелось sg12 доказать обратное) Sergey Sizov прав: либо надо менять структуру хранения данных, либо жертвовать ресурсами и производительностью...
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467311
m134n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Sizov Два кода в одном поле? Уже бардак.
Согласен,но такими были предоставлены исходные данные.
Sergey SizovНет в базах данных ячеек. Есть записи, разделенные на поля.
Всё верно,извиняюсь.Зря использовал этот термин,хотел немного наглядней описать ситуацию.
Sergey Sizov Оформите сие как скрипт создания таблицы и наполнения ее этими данными. Дабы было что рассматривать практически, а не только чисто умозрительно.
CREATE TABLE test (id C(6), cod C(17))
INSERT INTO test (id, cod) VALUES ("1","12.32.42,44.33.44")
INSERT INTO test (id, cod) VALUES ("2","45.43;23.33")
INSERT INTO test (id, cod) VALUES ("3","31.33.32;12.33")
INSERT INTO test (id, cod) VALUES ("4","22.43;22.31.32")
Sergey Sizov Прелестно. Бардак растет.
С разными разделителями справился,используя STRTRAN(thisform.cod[i],",",";")
Sergey Sizov 1. Зачем для поиска информации в таблице копировать эту информацию в массив? Не читали про locate, seek? Про индексы?
Читал,но создание массива вызвано необходимостью сравнения номера элемента с элементом другого массива.
Sergey Sizov 2. Не пробовали просто в командном окне посмотреть результат ?at(thisform.text1.value,thisform.cod[i]) или ?occurs(thisform.text1.value,thisform.cod[i]) ? При чем для тех записей, в которых точно находятся искомые коды? Мне почему-то кажется, что сие зрелище может оказаться очень впечатляющим.
Использовать thisform. в командной строке на сколько я знаю не предоставляется возможным,но если я вас правильно понял,то
STORE '33.45.31;23.52.34' TO cod
STORE '33' TO slovo
?AT(slovo,cod) возвращает 1,всё как надо.Отсюда ранее поставленный вопрос,почему этого не происходит в программе
if at(thisform.text1.value,thisform.cod[i])>1
?at(thisform.text1.value,thisform.cod[i]) безрезультатно.
sg12 Обратите внимание на наличие в SELECT опции WHERE, где и определяются условия фильтра.
Это не совсем подходит,т.к. условие которое мы задаём из textbox может быть частью содержимого записи поля.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467314
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
* Тестовые данные
create cursor test (f1 C(50))
insert into test (f1) values ('12.32.42,44.33.44')
insert into test (f1) values ('45.43;23.33')
insert into test (f1) values ('31.33.12;22.33')
insert into test (f1) values ('22.43;22.31.32')

* Что ищем
Local lcValue
lcValue = '33'

* Собственно поиск
select test
locate for at(m.lcValue, f1) > 0
if found()
    ?'Нашли'
else
    ?'Ничего нет'
endif



В принципе, "перекачка" данных из таблицы в массив может быть оправдана, если на рабочую область, где открыта таблица накладываются различные ограничения (SET FILTER, SET KEY). Но в этом случае вместо LOCATE для поиска следует использовать Select-SQL

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
* Что ищем
Local lcValue
lcValue = '33'

* Собственно поиск
Local laResult(1)
laResult = 0

select count(*) ;
from test ;
where f1 like '%' + m.lcValue + '%' ;
into array laResult

if laResult[1] > 0
    ?'Нашли'
else
    ?'Ничего нет'
endif
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467319
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m134n?AT(slovo,cod) возвращает 1,всё как надо.Отсюда ранее поставленный вопрос,почему этого не происходит в программе
if at(thisform.text1.value,thisform.cod[i])>1
?at(thisform.text1.value,thisform.cod[i]) безрезультатно.
Одной из причин может являться то, что, по умолчанию, TextBox будет дополнять введенное значение концевыми пробелами. Ну, или пользователь ввел текст не с первого символа, а, скажем, со второго. Т.е. надо не забыть отсечь возможные ведущие и концевые пробелы у значения, введенного в TextBox

Код: sql
1.
2.
3.
4.
Local lcSlovo
lcSlovo = AllTrim(thisform.text1.value)

?at(m.lcSlovo,thisform.cod[i]) 
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467345
m134n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMА по теме - это задача из разряда тех, которую решает "полнотекстовый поиск". Поэтому (как бы ни хотелось sg12 доказать обратное) Sergey Sizov прав: либо надо менять структуру хранения данных, либо жертвовать ресурсами и производительностью...
AndreTM,спасибо.Давно пора поближе познакомиться с "полнотекстовым поиском".
ВладимирМВ принципе, "перекачка" данных из таблицы в массив может быть оправдана, если на рабочую область, где открыта таблица накладываются различные ограничения (SET FILTER, SET KEY). Но в этом случае вместо LOCATE для поиска следует использовать Select-SQL
"Перекачка" как раз и вызвана наличием сложного фильтра.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
* Тестовые данные
create cursor test (f1 C(50))
insert into test (f1) values ('12.32.42,44.33.44')
insert into test (f1) values ('45.43;23.33')
insert into test (f1) values ('31.33.12;22.33')
insert into test (f1) values ('22.43;22.31.32')

* Что ищем
Local lcValue
lcValue = '33'

* Собственно поиск
select test
locate for at(m.lcValue, f1) > 0
if found()
    ?'Нашли'
else
    ?'Ничего нет'
endif


ВладимирМ,за решение и за разъяснение неполадки с textbox,большое спасибо!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
*Выбираем элемент массива с кодом(-и),при этом уже имеется часть кода из textbox
    a=thisform.cod[1]            
    c= GETWORDCOUNT(a,".;") 
    thisform.AddProperty("cod[1,c]")
    FOR i=1 TO c 
         thisform.cod[i] = GETWORDNUM(a,i,'.;')
         IF thisform.cod[i]=ALLTRIM(thisform.text1.Value)
           ?'Нашли'
         ELSE
           ?'Нет ничего'
          ENDIF
    ENDFOR



Всем участникам обсуждения,большое спасибо за оказанное внимание к возникшей проблеме и помощь.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467346
m134n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В свою очередь тоже нашёл выход,код добавил в конец предыдущего сообщения.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467354
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m134nИспользовать thisform. в командной строке на сколько я знаю не предоставляется возможным,Таки возможно, правда с некоторыми плясками. Зато еще один повод таки использовать текстбокс не сам по себе, а привязанный к переменной, которую уже можно смотреть без заморочек.но если я вас правильно понял,то
STORE '33.45.31;23.52.34' TO cod
STORE '33' TO slovo
?AT(slovo,cod) возвращает 1,всё как надо.Отсюда ранее поставленный вопрос,почему этого не происходит в программе
if at(thisform.text1.value,thisform.cod[i])>1
?at(thisform.text1.value,thisform.cod[i]) безрезультатно.То есть команда таки работает правильно? Отсюда вывод - то,что Вы тут ввели в переменные совсем не то, что находится в сравниваемых объектах в программе. Ищите разницу.sg12 Обратите внимание на наличие в SELECT опции WHERE, где и определяются условия фильтра.
Это не совсем подходит,т.к. условие которое мы задаём из textbox может быть частью содержимого записи поля.Запись поля - это что? Поле записи знаю, запись поля не знаю. :) В любом случае это ничего не меняет, в том числе и применимость select для выборки только нужных данных.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467365
m134n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vm134nно если я вас правильно понял,то
STORE '33.45.31;23.52.34' TO cod
STORE '33' TO slovo
?AT(slovo,cod) возвращает 1,всё как надо.Отсюда ранее поставленный вопрос,почему этого не происходит в программе
if at(thisform.text1.value,thisform.cod[i])>1
?at(thisform.text1.value,thisform.cod[i]) безрезультатно.
То есть команда таки работает правильно? Отсюда вывод - то,что Вы тут ввели в переменные совсем не то, что находится в сравниваемых объектах в программе. Ищите разницу.
Разницу уже нашёл,с подсказки ВладимирМ'а,необходим был alltrim(thisform.text1.value)
авторЗапись поля - это что? Поле записи знаю, запись поля не знаю. :) В любом случае это ничего не меняет, в том числе и применимость select для выборки только нужных данных.
Каюсь,нужно работать над терминологическим знанием рабочей области и по поводу selecta ваша правда :)
До недавнего времени был знаком только с применением where как:
Код: sql
1.
select fieldname from mytable where fieldname=requireelement


В свою защиту могу сказать,что совсем недавно начал работать с БД и реализацией приложений для работы с БД,наш курсовой проект на семестр,сейчас нахожусь на одном из заключительных этапов реализации.Не спорю,незнание не освобождает от ответственности :)Будем работать!
Если честно испытываю определённое удовольствие работая над проектом и решением такого рода задач.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467415
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m134nvпропущено...

То есть команда таки работает правильно? Отсюда вывод - то,что Вы тут ввели в переменные совсем не то, что находится в сравниваемых объектах в программе. Ищите разницу.
Разницу уже нашёл,с подсказки ВладимирМ'а,необходим был alltrim(thisform.text1.value)Из чего следует, что проблема не возникла бы если бы в настройках текстбокса было настроено убирание концевых пробелов. Почему-то подавляющее большинство о таких настройках даже не догадывается, что приводит к просто дикому количеству alltrim() в коде.
...
Рейтинг: 0 / 0
VPF9 Поиск слова
    #38467452
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizovm134nпропущено...

Разницу уже нашёл,с подсказки ВладимирМ'а,необходим был alltrim(thisform.text1.value)Из чего следует, что проблема не возникла бы если бы в настройках текстбокса было настроено убирание концевых пробелов. Почему-то подавляющее большинство о таких настройках даже не догадывается, что приводит к просто дикому количеству alltrim() в коде.

Необъятное не объять - действительно, надо еще додуматься до форматирования из-за лишнего ALLTRIM().
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VPF9 Поиск слова
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]