Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите, пожалуйста / 6 сообщений из 6, страница 1 из 1
28.09.2003, 18:26
    #32277658
mary_l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйста
Есть две таблицы, в 1-й слова и указатель на мемо-поле, в котором находяться шифры через пробел. А во 2-й - шифры и описания шифров. Необходимо задать поиск, в котором бы по слову, выходили бы шифры и описания. Возможно ли такое?
...
Рейтинг: 0 / 0
28.09.2003, 21:33
    #32277689
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйста
Если речь идет о запросе, то для этого хотелось бы иметь дело с нормализованной структурой бд:

Код: plaintext
1.
2.
3.
4.
5.
** таблица слов
create table word (wordid i primary key, word c( 30 ))
** таблица шифров
create table code (codeid i primary key, code c( 10 ), desc m)
** таблица перекресных ссылок
create table cross (wordid i references word, codeid i references code, primary key bintoc(wordid,  4 ) + bintoc(codeid,  4 ) tag key)


Тогда запрос запишется естественным для реляционной базы образом:

Код: plaintext
1.
2.
3.
4.
select code, desc ;
from word ;
    inner join cross on work.wordid = cross.wordid;
        inner join code on cross.codeid = code.codeid;
where word like ?pcWord


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
* get desc
lparameters tcWord

local i, lnCode
local array laCode( 1 )

select word
locate for word = m.tcWord
if !found()
   return
endif
lnCount = alines(laCode, strtran(word.desc, chr( 32 ), chr( 13 )))
select code
for i =  1  to m.lnCount
     locate for code = laCode[m.i]
     if found()
     * куда-то сохраняем результат
     endif
endfor
...
Рейтинг: 0 / 0
29.09.2003, 13:09
    #32278177
mary_l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйста
Все бы хорошо, да только слов в таблице около двух тысяч, а шифров более 30 тысяч! И средствами SQL поиск слова будет занимать очень много времени. А это не приемлемо. :(
...
Рейтинг: 0 / 0
29.09.2003, 14:43
    #32278368
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйста
Я не совсем понял задачу. Нельзяли по паре строк из каждой таблицы привести и показать что именно должно быть на выходе.

А вообще-то 30 тыс х 2 тыс = 60 млн. - это не так уж и много. Вы забываете, что есть такое понятие как "оптимизация". Так что в случае нормализованной структуры всегда (ну или почти всегда :) ) можно так оптимизировать запрос, что время выполнения будет относительно невелико.
...
Рейтинг: 0 / 0
29.09.2003, 18:13
    #32278750
mary_l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйста
первая таблица выглядит так:

слово вхождения
земляные memo
разработка memo

мемо поля выглядят так:
Е51-1-2 Е51-1-3 Е51-1-4 Е51-1-5 Е51-1-6 Е51-1-7 Е51-2-1 Е51-2-2 Е51-2-3 Е51-2-4 Е51-5-1 Е51-5-2 Е51-1-1 Е01-01-001-2 Е01-01-001-3 Е01-01-001-4

вторая таблица:
шифр наименование ед. измерения оплата
Е51-1-2 Разработка грунта 100 м.куб. 100 руб
Е51-1-3 Изменение уровня 100 м.куб. 200 руб

в конечном итоге нужно, сравнить слово из запроса пользователя со словами из 1-й таблицы, выгрести из мемо-полей шифры в столбец, с обозначением. что они означают.
...
Рейтинг: 0 / 0
29.09.2003, 18:39
    #32278780
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйста
При такой организации структуры хранения через запрос ничего не получится. Но все не так плохо. Начиная с 6 версии FoxPro появилась такая функция ALINES(), так что можно слегка модифицировать код приведенный Анатолием примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
* Создаю временную таблицу, которая будет содержать
* найденные шифры из мемо-поля
CREATE CURSOR shifr (Shifr C( 50 ))
INDEX ON Shifr TAG Shifr

* Сканирую первую таблицу на предмет поиска слов по условию
LOCAL laCode( 1 ), lnI
select word
SCAN FOR word = m.tcWord
     * Загоняю все шифры из мемо-поля найденных записей
     * во временную таблицу
     FOR lnI= 1  TO alines(laCode, strtran(word.desc, chr( 32 ), chr( 13 )))> 0 
          INSERT INTO shifr (shifr) VALUES (laCode(m.lnI))
     ENDFOR
ENDSCAN

* Ну и теперь выполняю запрос к таблице содержащей расшифровку
* шифров объединяя ее с временной таблицей shifr

SELECT DISTINCT a.* FROM code a INNER JOIN shifr b ON a.code=b.shifr


Разумеется, размерность поля Shifr во временной таблице, должна быть такой же как и размерность поля code в таблице содержащей расшифровку.

Но строго говоря, очень неразумная организация базы данных. По крайней мере я вижу 2 приницпиальные ошибки, которые приведут к большим проблемам в будущем:

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


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