Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование полей в 2.5 / 5 сообщений из 5, страница 1 из 1
04.08.2011, 17:19
    #37381066
laraison
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование полей в 2.5
Здравствуйте, поправте начинающего, пожалуйста. Есть база 1 - образец, с которой мы сверяем базу 2. По коду и результату, думаю, все понятно, как оно работает. Теперь надо при несовпадении автоматически исправлять поля в базе 2, как они есть в базе 1. Пробовал команду replace, но так и не получилось :-0


База 1:
Record# POLE1 POLE2 POLE3 POLE4
1 10000 20000 30000 40000
2 11000 22000 23000 24000
3 11100 22200 33300 44400


База 2:
Record# POLE5 POLE6 POLE7 POLE8
1 10000 20000 30000 40000
2 10000 20000 30000 40000
3 11000 22000 23003 24000
4 10000 20002 30000 40000
5 11100 22200 33300 44400

авторКод:
close databases
set century on
set talk off
set safety off

select 1
use 2
go top

do while !EOF()

perpole5=pole5
perpole6=pole6
perpole7=pole7

select 2

use 1

locate for perpole5=pole1
f=found()
if f==.F.
?'wrong'
else
?'ok'
endif

perpole1=pole1
perpole2=pole2
perpole3=pole3

if perpole2==perpole6
?'ok'
else
?'pole2!=pole6'
endif

if perpole3==perpole7
?'ok'
?''
else
?'pole3!=pole7'
?''
endif

endif

select 1
skip
enddo

Результат:
http://savepic.ru/2898450.jpg
...
Рейтинг: 0 / 0
04.08.2011, 17:42
    #37381111
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование полей в 2.5
laraisonТеперь надо при несовпадении автоматически исправлять поля в базе 2, как они есть в базе 1. Пробовал команду replace, но так и не получилось
Плохо пробовал. Как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
if perpole2==perpole6
   ?'ok'
else
   ?'pole2!=pole6'
   sele  1 
   repl pole6 with perpole2
endif
И таблицы не надо цифрами называть. В коде каша полная. Даже если оно так и есть, то использовать ALIAS:
Код: plaintext
1.
2.
3.
4.
select  1 
use  2  alias t2
... далее так писать:
sele t2
if t2.Pole6 == ...
...
Рейтинг: 0 / 0
04.08.2011, 17:55
    #37381141
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование полей в 2.5
Код: 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  1 
use  1  alias tab1

select  2 
use  2  alias tab2

* Организуем цикл перебора всех записей "главной" таблицы
select tab1
go top
SCAN

    * Для каждой записи "главной" таблицы ищем "не правильные" записи подчиненной таблицы
    select tab2
    go top
    SCAN FOR tab2.pole5 = tab1.pole1 AND (tab2.pole6 <> tab1.pole2 OR tab2.pole7 <> tab1.pole3)

        * Если попали сюда, то эту запись таблицы tab2 надо менять
        REPLACE pole6 WITH tab1.pole2, pole7 WITH tab1.pole3

    select tab2
    ENDSCAN

select tab1
ENDSCAN

Поскольку речь идет о FP2.5, то в цикле SCAN..ENDSCAN необходимо подстраховываться через принудительный возврат в сканируемую рабочую область непосредственно перед командой ENDSCAN. Ну, и GO TOP тоже для страховки
...
Рейтинг: 0 / 0
14.08.2011, 17:51
    #37394653
laraison
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование полей в 2.5
Спасибо большое! И еще можно один момент узнать. Как правильно сравнивать два символьных поля (или переменных) на предмет из различия, например, при сравнении "Петров Иван Иванович" и "Петров Иван И ы анович"
...
Рейтинг: 0 / 0
14.08.2011, 19:42
    #37394723
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование полей в 2.5
laraisonИ еще можно один момент узнать. Как правильно сравнивать два символьных поля (или переменных) на предмет из различия, например, при сравнении "Петров Иван Иванович" и "Петров Иван И ы анович"
Это называется "Алгоритм Левенштейна". В общем случае, довольно не тривиальная вещь. Если действительно интересно, поищите в интернете. Есть много ссылок, в том числе и на реализацию в FoxPro

Владимир Иосифович Левенштейн (родился в 1935 году) - российский ученый, доктор физико-математических наук. Окончил Московский Государственный Университет им. М.В. Ломоносова, Механико-математический факультет МГУ, в 1958 г. После окончания Университета работает ведущим научным сотрудником в 10 отделе Института Прикладной Математики имени Мстислава Всеволодовича Келдыша РАН, Российская Федерация. Благодаря введенному им в 1965 году понятию дистанции редактирования, названной его именем, доктор Левенштейн стал известен всему миру.

Дистанция Левенштейна (также функция Левенштейна или алгоритм Левенштейна) в теории информатики и компьютерной лингвистики является мерой разницы двух последовательностей символов (строк) относительно минимального количества операций Вставки, Удаления и Замены, необходимых для перевода одной строки в другую.
Пример:
Чтоб перевести слово Конь в слово Кот необходимо совершить одно удаление и одну замену, соответственно дистанция Левенштейна составляет 2:
1. Конь
2. Коть (Заменяем н на т)
3. Кот (Удаляем ь)
Практическим применением дистанции Левенштейна является определение похожести последовательностей символов, к примеру в коррекции орфографии или при поиске дубликатов.

В 2006 году VLADIMIR I. LEVENSHTEIN, Leading Scientific Researcher, Keldysh Institute for Applied Mathematics, Moscow, Russia получил медаль Хэмминга (IEEE Richard W. Hamming Medal) за вклад в теорию кодов с исправлением ошибок и теорию информации (For contributions to the theory of error-correcting codes and information theory, including the Levenshtein distance). Подробнее на сайте www.ieee.org

Домашняя страница: www.keldysh.ru
Адрес E-mail: leven@keldysh.ru
Рабочий телефон: +7 (495) 250-78-34
Научные интересы: комбинаторная оптимизация
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование полей в 2.5 / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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