Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 помогите с поиском с заменой  [new]
vbhnv
Guest
по индексному ключу ишу в таблице fl_Ut данные и заменяю в первой таблице- fl_ поле l_1 значением второй таблицы полем l_1....но в первой таблице все равно поле остается пустым, хотя по индексу находит одинаковые ключи...почему пусто это поле - fl_.l_1, объясните пжалста!
 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
12 сен 11, 14:11    [11263947]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv
по индексному ключу ишу в таблице fl_Ut данные и заменяю в первой таблице- fl_ поле l_1 значением второй таблицы полем l_1....но в первой таблице все равно поле остается пустым, хотя по индексу находит одинаковые ключи...почему пусто это поле - fl_.l_1, объясните пжалста!
 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
12 сен 11, 14:23    [11264050]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
vbhnv
Guest
да все равно и так и так делал...все равно по индексам находит а в таблицу не записывает данные
12 сен 11, 14:37    [11264141]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv,

Тип полей одинаковый?
fl_.l_1 и fl_Ut.l_1
12 сен 11, 14:41    [11264172]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
vbhnv
Guest
да и там и там Character и длина одинаковая....
12 сен 11, 14:44    [11264192]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv
по индексному ключу ишу в таблице fl_Ut данные и заменяю в первой таблице- fl_ поле l_1 значением второй таблицы полем l_1....но в первой таблице все равно поле остается пустым, хотя по индексу находит одинаковые ключи...почему пусто это поле - fl_.l_1, объясните пжалста!
 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


Попробуй так и посмотри на результат
12 сен 11, 14:44    [11264198]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv,

Кстати, fl_ случайно не запрос?
12 сен 11, 14:45    [11264207]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
vbhnv
Guest
wait IIF(FOUND(), "Найден", "Не найден") window
и
wait fl_Ut.l_1 window

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

IgorNG
Кстати, fl_ случайно не запрос?

нет это алиас таблицы так же как и fl_Ut
12 сен 11, 14:58    [11264300]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv,

Попробуй еще после команды REPLACE поставь
wait fl_.l_1 window
12 сен 11, 15:09    [11264376]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
vbhnv
Guest
тоже выводит те же данные
уже не знаю в чем дело.... %)
12 сен 11, 15:20    [11264441]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv,

Что означает "те же данные"? Те, которые нужны или такие же как и в другой таблице? Чудес на свете не бывает. Еще раз скопируй свой код.
12 сен 11, 15:23    [11264460]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
vbhnv
Guest
данные поля fl_Ut.l_1
и после REPLACE
fl_.l_1 одинаковые

то есть в fl_.l_1 попадают данные - ALLTRIM(fl_Ut.l_1)...но таблица пуста....
12 сен 11, 15:34    [11264548]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv,

А как ты определяешь, что таблица пустая? Поставь после команды REPLACE BROWSE
12 сен 11, 15:39    [11264588]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
vbhnv
Guest
ну да я ее открываю и смотрю есть ли данные в поле fl_.l_1
12 сен 11, 15:42    [11264614]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
IgorNG,

Кстати, а какое выражение в индексе?
12 сен 11, 15:42    [11264619]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
vbhnv
Guest
в таблице fl_Ut такое выражение = ALLTRIM(i_sl)

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

т.к. в fl_Ut в одно поле входят значения fl_.p и fl_.c
12 сен 11, 15:52    [11264696]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
vbhnv
данные поля fl_Ut.l_1
и после REPLACE
fl_.l_1 одинаковые

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


Может, не в той таблице смотришь? Даже и не знаю что еще можно посоветовать. Все говорит о том, что код работает. Видимо, причина именно в просмотре.
12 сен 11, 16:00    [11264783]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
В индексном выражении тега idut тоже alltrim()? (где Вы такой ужасный код откопали?)
12 сен 11, 22:59    [11266611]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
SSn888
Member

Откуда:
Сообщений: 340
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")"
13 сен 11, 13:31    [11269008]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
SSn888
Member

Откуда:
Сообщений: 340
опечатка

читать не

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

а

"set relation to ALLTRIM(fl_.p) + ALLTRIM(fl_.c) into fl_Ut"
13 сен 11, 13:33    [11269022]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
SSn888

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

SELECT fl_  
REPLACE FOR SEEK(ALLTRIM(fl_.p) + ALLTRIM(fl_.c),"fl_Ut","idut") ;  
  	fl_.l_1 WITH ALLTRIM(fl_Ut.l_1)

Идея заключается в том, что SEEK() автоматически перейдет на ту запись, которую нашел. Причем в указанной рабочей области. Останется просто прочитать найденное значение и записать в текущее же поле основной таблицы.
13 сен 11, 13:56    [11269229]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
vbhnv

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

Именно по этой причине в выражениях индекса не следует использовать функции отсечения пробелов. Выражение индекса должно использовать значения полей "как есть". Если же критически важным является отсутствие ведущих пробелов, то их отсечение должно выполняться на этапе ввода.
13 сен 11, 14:04    [11269304]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
SSn888
Member

Откуда:
Сообщений: 340
ВладимирМ,

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

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

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

Сама постановка вопроса достаточно неоднозначна - если мы пихаем в поле А нечто из полей Б и В другой таблицы - получаем просто (нужное ли?) дублирование данных в пределах одной базы. Что есть нарушение принципов нормализации.
Но - "хозяин - барин" :) ;)
(vbhnv, просьба не обижаться)
13 сен 11, 14:16    [11269402]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
SSn888,

Никакие из вариантов TRIM() для индексов по нескольким полям использовать нельзя... И пример, приведенный Владимиром, имеено об этом и говорит.
Варианты для уменьшения "длины" индексного выражения - либо LEFT(); либо хэш поля, при этом хэш-функция реализуется как можно более низкоуровнево.
14 сен 11, 04:05    [11272958]     Ответить | Цитировать Сообщить модератору
 Re: помогите с поиском с заменой  [new]
SSn888
Member

Откуда:
Сообщений: 340
AndreTM,

можно :);)
если обрезается последнее в выражени по типу str1+rtrim(str2) и индекс с условием.. поверьте - пару раз такой изврат спасал при обработке больших массивов
но, полагаю - тут уж это слишком большой отход от темы :)
14 сен 11, 13:33    [11275181]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить