Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VPF9 Поиск слова / 13 сообщений из 13, страница 1 из 1
15.11.2013, 22:51
    #38467042
m134n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
Уважаемые форумчане,здравствуйте!
Необходима консультация по следующему вопросу.
Есть таблица,по интересующему нас полю из этой таблицы,содержимым которого являются коды(один или два),нужно провести поиск части кода,в идеале полного кода.Если начать с простого,то части кода будет достаточно,в свою очередь она является первыми двумя цифрами.Коды в каждой ячейке разные,из себя могут представлять следующее:
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
15.11.2013, 23:24
    #38467057
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
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
16.11.2013, 13:51
    #38467269
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
Sergey Sizov Бардак

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

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

А по теме - это задача из разряда тех, которую решает "полнотекстовый поиск". Поэтому (как бы ни хотелось sg12 доказать обратное) Sergey Sizov прав: либо надо менять структуру хранения данных, либо жертвовать ресурсами и производительностью...
...
Рейтинг: 0 / 0
16.11.2013, 15:59
    #38467311
m134n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
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
16.11.2013, 16:07
    #38467314
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
Код: 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
16.11.2013, 16:12
    #38467319
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
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
16.11.2013, 17:03
    #38467345
m134n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
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
16.11.2013, 17:05
    #38467346
m134n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
В свою очередь тоже нашёл выход,код добавил в конец предыдущего сообщения.
...
Рейтинг: 0 / 0
16.11.2013, 17:18
    #38467354
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
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
16.11.2013, 17:46
    #38467365
m134n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
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
16.11.2013, 19:20
    #38467415
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VPF9 Поиск слова
m134nvпропущено...

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

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

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


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