powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите с поиском с заменой
25 сообщений из 28, страница 1 из 2
помогите с поиском с заменой
    #37436140
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по индексному ключу ишу в таблице fl_Ut данные и заменяю в первой таблице- fl_ поле l_1 значением второй таблицы полем l_1....но в первой таблице все равно поле остается пустым, хотя по индексу находит одинаковые ключи...почему пусто это поле - fl_.l_1, объясните пжалста!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 SELECT fl_
 SELECT fl_Ut
 SET ORDER TO idut 
 DO WHILE NOT EOF('fl_')
 s = ALLTRIM(fl_.p) + ALLTRIM(fl_.c)
  SELECT fl_Ut
  SEEK s
   IF FOUND() THEN
     SELECT fl_
     REPLACE fl_.l_1 WITH ALLTRIM(fl_Ut.l_1)
   ENDIF  
 SELECT fl_
 SKIP 
 ENDDO
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436181
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnvпо индексному ключу ишу в таблице fl_Ut данные и заменяю в первой таблице- fl_ поле l_1 значением второй таблицы полем l_1....но в первой таблице все равно поле остается пустым, хотя по индексу находит одинаковые ключи...почему пусто это поле - fl_.l_1, объясните пжалста!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 SELECT fl_
 SELECT fl_Ut
 SET ORDER TO idut 
 DO WHILE NOT EOF('fl_')
 s = ALLTRIM(fl_.p) + ALLTRIM(fl_.c)
  SELECT fl_Ut
  SEEK s
   IF FOUND() THEN
     SELECT fl_
     REPLACE fl_.l_1 WITH ALLTRIM(fl_Ut.l_1)
   ENDIF  
 SELECT fl_
 SKIP 
 ENDDO


Перед DO WHILE неплохо бы вставить
SELECT fl_
GO TOP
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436222
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да все равно и так и так делал...все равно по индексам находит а в таблицу не записывает данные
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436231
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnv,

Тип полей одинаковый?
fl_.l_1 и fl_Ut.l_1
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436239
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да и там и там Character и длина одинаковая....
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436241
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnvпо индексному ключу ишу в таблице fl_Ut данные и заменяю в первой таблице- fl_ поле l_1 значением второй таблицы полем l_1....но в первой таблице все равно поле остается пустым, хотя по индексу находит одинаковые ключи...почему пусто это поле - fl_.l_1, объясните пжалста!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 SELECT fl_
 SELECT fl_Ut
 SET ORDER TO idut 
[color=red]
SELECT fl_
GO TOP
[/color]
 DO WHILE NOT EOF('fl_')
 s = ALLTRIM(fl_.p) + ALLTRIM(fl_.c)
  SELECT fl_Ut
  SEEK s

[color=red]
wait IIF(FOUND(), "Найден", "Не найден") window
[/color]
   IF FOUND() THEN
     SELECT fl_
[color=red]
wait fl_Ut.l_1 window
[/color]
     REPLACE fl_.l_1 WITH ALLTRIM(fl_Ut.l_1)
   ENDIF  
 SELECT fl_
 SKIP 
 ENDDO


Попробуй так и посмотри на результат
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436245
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnv,

Кстати, fl_ случайно не запрос?
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436284
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
wait IIF(FOUND(), "Найден", "Не найден") window
и
Код: plaintext
wait fl_Ut.l_1 window

показывали Найден и данные с таблицы fl_Ut.l_1

IgorNGКстати, fl_ случайно не запрос?
нет это алиас таблицы так же как и fl_Ut
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436315
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnv,

Попробуй еще после команды REPLACE поставь
wait fl_.l_1 window
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436345
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тоже выводит те же данные
уже не знаю в чем дело.... %)
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436352
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnv,

Что означает "те же данные"? Те, которые нужны или такие же как и в другой таблице? Чудес на свете не бывает. Еще раз скопируй свой код.
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436374
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
данные поля fl_Ut.l_1
и после REPLACE
fl_.l_1 одинаковые

то есть в fl_.l_1 попадают данные - ALLTRIM(fl_Ut.l_1)...но таблица пуста....
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436388
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnv,

А как ты определяешь, что таблица пустая? Поставь после команды REPLACE BROWSE
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436400
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну да я ее открываю и смотрю есть ли данные в поле fl_. l_1
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436402
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNG,

Кстати, а какое выражение в индексе?
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436425
vbhnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в таблице fl_Ut такое выражение = ALLTRIM(i_sl)

связываю в таблице fl_ два поля = ALLTRIM(fl_.p) + ALLTRIM(fl_.c)

т.к. в fl_Ut в одно поле входят значения fl_.p и fl_.c
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37436458
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnvданные поля fl_Ut.l_1
и после REPLACE
fl_.l_1 одинаковые

то есть в fl_.l_1 попадают данные - ALLTRIM(fl_Ut.l_1)...но таблица пуста....

Может, не в той таблице смотришь? Даже и не знаю что еще можно посоветовать. Все говорит о том, что код работает. Видимо, причина именно в просмотре.
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37437123
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В индексном выражении тега idut тоже alltrim()? (где Вы такой ужасный код откопали?)
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37437924
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnv,

ИМХО - не стоит крутить записи циклом напрямую

Предлагаю Вам попробовать нечто вроде

SELECT fl_Ut
SET ORDER TO idut
SELECT fl_
set relation to
set relation to ALLTRIM(fl_.p) + ALLTRIM(fl_.c) into fl_
* То есть - завязали веревкой, то что Вы ищете сиком

replace all fl_.l_1 WITH ALLTRIM(fl_Ut.l_1)

set relation to

Надеюсь - Вам это поможет :)


Да, еще, вдогонку - SEEK() позволяет указывать параметром не только что ищем, но и где
Что позволит избежать явных прыганий по таблицам
То есть - не
" SEEK s
IF FOUND() THEN"
а
"IF SEEK(s, "fl_Ut", "idut")"
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37437926
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опечатка

читать не

"set relation to ALLTRIM(fl_.p) + ALLTRIM(fl_.c) into fl_"

а

"set relation to ALLTRIM(fl_.p) + ALLTRIM(fl_.c) into fl_Ut"
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37438006
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSn888

Relation в данной схеме - лишний. Вполне достаточно SEEK()

Код: plaintext
1.
2.
3.
SELECT fl_  
REPLACE FOR SEEK(ALLTRIM(fl_.p) + ALLTRIM(fl_.c),"fl_Ut","idut") ;  
  	fl_.l_1 WITH ALLTRIM(fl_Ut.l_1)

Идея заключается в том, что SEEK() автоматически перейдет на ту запись, которую нашел. Причем в указанной рабочей области. Останется просто прочитать найденное значение и записать в текущее же поле основной таблицы.
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37438037
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbhnv

Предположим, у Вас есть две записи, у которых в полях fl_.p и fl_.c первой записи записано "1 " и "11", а во второй записи "11" и "1 ". Выражение ALLTRIM(fl_.p) + ALLTRIM(fl_.c) в обоих случаях вернет строку "111". Т.е. две разные записи получат одинаковое занчение ключа. Вы не сможете отличить одну запись от другой, несмотря на то, что по одтельности поля разные.

Именно по этой причине в выражениях индекса не следует использовать функции отсечения пробелов. Выражение индекса должно использовать значения полей "как есть". Если же критически важным является отсутствие ведущих пробелов, то их отсечение должно выполняться на этапе ввода.
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37438069
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,

Дело вкуса :)
Но, по эффективности - прогните ради интереса через оба алгоритма пару баз по десятку тыщ записей и посмотрите на разницу во времени обработки

Насчет некорректности полного отсечения пробелов - целиком Вас поддерживаю.
Как компромисный вариант можно наверно рассмотреть RTRIM()
Как понимаю - полная обрезка в приведенном коде вызвана разностью разрядности полей (например стр 10 + стр 10 сравнивается опять-таки с стр10) или что-то вроде.

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

Сама постановка вопроса достаточно неоднозначна - если мы пихаем в поле А нечто из полей Б и В другой таблицы - получаем просто (нужное ли?) дублирование данных в пределах одной базы. Что есть нарушение принципов нормализации.
Но - "хозяин - барин" :) ;)
(vbhnv, просьба не обижаться)
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37439234
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSn888,

Никакие из вариантов TRIM() для индексов по нескольким полям использовать нельзя... И пример, приведенный Владимиром, имеено об этом и говорит.
Варианты для уменьшения "длины" индексного выражения - либо LEFT(); либо хэш поля, при этом хэш-функция реализуется как можно более низкоуровнево.
...
Рейтинг: 0 / 0
помогите с поиском с заменой
    #37439923
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,

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


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