|
|
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
Может я чего-нибудь не понял? 1) Есть свободная таблица (50 полей) 2) В таблице индекс (что, впрочем неважно) по первому полю, фомата N(9,0), в этом поле 6-значные номера 3) из первого поля селектом выделена подтаблица для поиска, (для опытов я просто взял первый десяток номеров) 4)И вот самое главное - выполняется только первый поиск в основной таблице. последующие поиски безуспешны поиск с форматом N(9,0) НЕ ИДЁТ!!! Только если использовать ROUND() или преобразование в строку. Я пробовал поиски SEEK и LOCATE - без разницы, значения из поисковой таблицы не найти в основной, т.е. как числа они не равны Помогает только переоткрытие основной таблицы Что это за хрень? может кто знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 17:04:59 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
1. reindex 2. дал бы "кусочек" данных и кода посмотреть, а то как-то не совсем понятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 17:13:24 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
1) Версия FoxPro включая Service Pack 2) Текущие настройки SET COLLATE CPCURRENT() CPDBF() - для твоей таблицы IDXCollate() - для твоего индекса по числовому полю 3) Что означают фраза "подтаблица для поиска", "выполняется поиск". Что именно ищется и где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 18:18:35 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
Hi Gamal Paperot! Скорее всего ошибка в коде... Давай сюда код. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 23:18:54 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
* вот этот кусок кода и не работает, а конкретно * поиск после обработки * образец записи в поисковом поле * EXFF.Nkwit=123456, tPRF.Nkwit=123456 * формат поля N(9,0) SELECT exff && обрабатываемая таблица SELECT tPRF && таблица в одно поле со списком нужных данных SCAN && перебираем записи iNkwit = tPRF.Nkwit SELECT exff *-- в этом строке пришлось поставить строки, иначе *-- непредсказуемо ищет - может найти, может не найти - загадка!!! *-- сначала стоял SEEK Nkwit, но с ним ещё хуже LOCATE FOR ALLTRIM(STR(Nkwit))=ALLTRIM(STR(iNkwit)) && критическое место IF !FOUND() LOOP ENDIF SELECT OTM_TOT LOCATE FOR OTM_TOT.Nkwit=iNkwit IF FOUND() REPLACE exff.STRAB WITH OTM_TOT.STRAB, ; exff.HOME WITH OTM_TOT.HOME, ; exff.NOTCHET WITH OTM_TOT.NOTCHET ENDIF SELECT exff DO WHILE exff.Nkwit = iNkwit DETKA = IIF(ISNULL(exff.partnumber),'',ALLTRIM(exff.partnumber)) IF SEEK(DETKA,'DETTOT',1) REPLACE exff.DESCRIPT WITH DETTOT.DESCRIPT, ; exff.specificat WITH DETTOT.specificat ENDIF SELECT ZAKTOT LOCATE FOR ZAKTOT.Nkwit = iNkwit AND ZAKTOT.ppartnum=DETKA AND exff.dolg<>1 IF FOUND() THEN REPLACE ; exff.PRICE WITH ZAKTOT.zpol, ; exff.INVOCE WITH ZAKTOT.nprice, ; exff.dprice WITH ZAKTOT.dprice, ; exff.SUMM WITH exff.kol*ZAKTOT.zpol, ; exff.DESCRIPT WITH ZAKTOT.DESCRIPT, ; exff.specificat WITH ZAKTOT.specificat ENDIF SELECT exff REPLACE exff.dolg WITH 1 && помечаем запись как обработанную SKIP && переходим к следующей записи ENDDO SELECT tPRF ENDSCAN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2005, 18:34:59 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
То, что ты переходишь в рабочие области по алиасам таблиц, а не по номерам - это хорошо. Но с индексами надо поступать также . Конструкция вида IF SEEK(DETKA,'DETTOT',1) Это плохо. Во-первых, никогда нельзя быть уверенным в том, что после очередной модификации структуры базы данных под номером 1 окажется нужный тебе индекс. А во-вторых, это крайне трудно редактировать. Надо каждый раз вспоминать, что же там за индекс под первым номером. А перед командой SEEK Nkwit просто обязательно надо ставить SET ORDER. Вообще во всем твоем коде нет указания на то, какой же индекс главный. По какому индексу будет работать данная команда? А перебор записей в DO WHILE? Лучше заменить команду SEEK, на функцию SEEK(). Что-то вроде Код: plaintext 1. 2. 3. 4. Ну, и еще, я бы заменил конструкцию Код: plaintext 1. 2. 3. 4. На такую Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2005, 19:34:04 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
На вопросы Владимира М 1) SET COLLATE --> MACHINE CPCURRENT() --> 1251, 866 CPDBF() --> 1251 IDXCollate() --> MACHINE Насчёт сервиспака ничего не могу сказать, этот код (с индексным поиском) не выполняется в 6,7,8 фоксах, то есть проблема в чём то другом 2) Спасибо за развёрнутый ответ, насчёт индекса - он всего один в данном случае, поэтому я не озабачивался его наименованием. Такой вариант поиска >iNkwit = tPRF.Nkwit >IF SEEK(iNkwit,'exff','Nkwit')=.F. > LOOP >ENDIF я пробовал, результат нулевой, т.е. поиск выполняется для первых двух записей, а потом NOT FOUND. Сама таблица EXFF.DBF создаётся из общей базы данных запросом SELECT, затем в ней создается индекс по полю Nkwit (один TAG в индексе CDX), таблица поиска tPRF - курсор и создана в свою очередь из EXFF запросом SELECT. И вот последовательным перебором tPRF я обрабатываю EXFF, объём данных очень велик, поэтому я озабочен скоростью обработки, тут бы индексный поиск был кстати, но почему он не работает(???). Я рассматривал индекс как текстовой файл и никаких чудес там не увидел (например дробной части или экспоненциальной записи) - обыкновенная строка символов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2005, 11:44:59 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
1. Твой NOT FOUND - в начале (сразу после LOCATE) или определяешь по полю exff.dolg? Какая бы там ни была причина "странностей", но смотри: а) LOCATE FOR ALLTRIM(STR(Nkwit))=ALLTRIM(STR(iNkwit)) б) DO WHILE exff.Nkwit = iNkwit В разных местах - по-разному... 2. Откуда вызывается код? Из какого "контрола"? 3. Вроде бы глупо, но всё же поставь везде алиасы: LOCATE FOR ALLTRIM(STR(exff.Nkwit))=ALLTRIM(STR(iNkwit)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2005, 12:23:55 |
|
||
|
Равенство числовых полей таблиц
|
|||
|---|---|---|---|
|
#18+
Hi Gamal Paperot! Индекс по полю типа N(9) никак не может быть "простой строкой символов" - число просто обязано преобразовываться в бинарный вид (подробности есть в хелпе по структуре индексных файлов). Для примера нужно не "образец записи" а полноценный скрипт - который создаст сами таблицы, индексы, и в цикле заполнит их какими-то "случайными" данными (например на базе того-же RAND() ну или из какого-то списка, если так подразумевает логика задачи). Неужели ты думаешь что кто-то станет всё это сам делать, при этом с большой долей вероятности получит вовсе не тот результат что имеется у тебя сейчас? Также критичны моменты открытия таблиц, установления ORDER, RELATION, FILTER или что там ещё может использоваться. В общем пока пример НЕЗАКОНЧЕННЫЙ сказать нечего. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2005, 19:45:21 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33244630&tid=1593568]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
221ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 565ms |

| 0 / 0 |
