powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Равенство числовых полей таблиц
9 сообщений из 9, страница 1 из 1
Равенство числовых полей таблиц
    #33244122
Gamal Paperot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я чего-нибудь не понял?
1) Есть свободная таблица (50 полей)
2) В таблице индекс (что, впрочем неважно) по первому полю,
фомата N(9,0), в этом поле 6-значные номера
3) из первого поля селектом выделена подтаблица для поиска,
(для опытов я просто взял первый десяток номеров)
4)И вот самое главное - выполняется только первый поиск в основной таблице.
последующие поиски безуспешны
поиск с форматом N(9,0) НЕ ИДЁТ!!! Только если использовать ROUND() или преобразование в строку.
Я пробовал поиски SEEK и LOCATE - без разницы, значения из поисковой таблицы не найти в основной, т.е. как числа они не равны
Помогает только переоткрытие основной таблицы
Что это за хрень? может кто знает?
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33244146
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. reindex
2. дал бы "кусочек" данных и кода посмотреть, а то как-то не совсем понятно...
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33244340
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Версия FoxPro включая Service Pack
2) Текущие настройки

SET COLLATE
CPCURRENT()
CPDBF() - для твоей таблицы
IDXCollate() - для твоего индекса по числовому полю

3) Что означают фраза "подтаблица для поиска", "выполняется поиск". Что именно ищется и где?
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33244630
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Gamal Paperot!

Скорее всего ошибка в коде... Давай сюда код.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33246998
Gamal Paperot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
* вот этот кусок кода и не работает, а конкретно
* поиск после обработки
* образец записи в поисковом поле
* 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
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33247099
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что ты переходишь в рабочие области по алиасам таблиц, а не по номерам - это хорошо. Но с индексами надо поступать также . Конструкция вида

IF SEEK(DETKA,'DETTOT',1)

Это плохо.

Во-первых, никогда нельзя быть уверенным в том, что после очередной модификации структуры базы данных под номером 1 окажется нужный тебе индекс.

А во-вторых, это крайне трудно редактировать. Надо каждый раз вспоминать, что же там за индекс под первым номером.

А перед командой

SEEK Nkwit

просто обязательно надо ставить SET ORDER. Вообще во всем твоем коде нет указания на то, какой же индекс главный. По какому индексу будет работать данная команда? А перебор записей в DO WHILE?

Лучше заменить команду SEEK, на функцию SEEK(). Что-то вроде

Код: plaintext
1.
2.
3.
4.
iNkwit = tPRF.Nkwit
IF SEEK(iNkwit,'exff','Nkwit')=.F.
	LOOP
ENDIF

Ну, и еще, я бы заменил конструкцию

Код: plaintext
1.
2.
3.
4.
SELECT exff
DO WHILE exff.Nkwit = iNkwit
...
	SKIP && переходим к следующей записи 
ENDDO

На такую

Код: plaintext
1.
2.
3.
SELECT exff
SCAN WHILE exff.Nkwit = iNkwit
...
ENDSCAN
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33247892
Gamal Paperot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На вопросы Владимира М
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, объём данных очень велик, поэтому я озабочен скоростью обработки, тут бы индексный поиск был кстати, но почему он не работает(???). Я рассматривал индекс как текстовой файл и никаких чудес там не увидел (например дробной части или экспоненциальной записи) - обыкновенная строка символов.
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33248050
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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))
...
Рейтинг: 0 / 0
Равенство числовых полей таблиц
    #33249991
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Gamal Paperot!

Индекс по полю типа N(9) никак не может быть "простой строкой символов" -
число просто обязано преобразовываться в бинарный вид (подробности есть в
хелпе по структуре индексных файлов).
Для примера нужно не "образец записи" а полноценный скрипт - который создаст
сами таблицы, индексы, и в цикле заполнит их какими-то "случайными" данными
(например на базе того-же RAND() ну или из какого-то списка, если так
подразумевает логика задачи).
Неужели ты думаешь что кто-то станет всё это сам делать, при этом с большой
долей вероятности получит вовсе не тот результат что имеется у тебя сейчас?
Также критичны моменты открытия таблиц, установления ORDER, RELATION, FILTER
или что там ещё может использоваться. В общем пока пример НЕЗАКОНЧЕННЫЙ
сказать нечего.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Равенство числовых полей таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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