Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Слияние DBF'ников с заменой / 13 сообщений из 13, страница 1 из 1
09.06.2010, 09:09
    #36676977
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
Есть 2 DBF файла(списоки людей) с одинаковыми полями. (OT_PER, CODE_LPU, MSK_OT, SERIES, NUMBER, CODE_MSK, FAM, IM, OT, BIRTHDAY, SEX, OKATO_NAS, A_RN, A_NAS, A_STREET, A_DOM, A_KORP, A_STROEN, A_KV)
Надо соединить 2 этих списка т.е. что бы в первый файл добавились люди из второго, причём если в этом списке есть одинаковые люди ( Ключ я думаю FAM, IM, OT, BIRTHDAY ) то что бы в первом файле обновлялись SERIES и NUMBER из второго файла , а MSK_OT всегда был равен 46.

В программировании не силён поэтому нужна ваша помощь.
USE GETFILE()
COPY TO "C:\baza_1.dbf"
Use "C:\baza_1.dbf" in 0 alias t1

USE GETFILE()
COPY TO "C:\baza_2.dbf"
Use "C:\baza_2.dbf" in 0 alias t2

update t1 set t1.msk_ot="46", t1.SERIES=t2.SERIES, t1.NUMBER=t2.NUMBER from t1 inner join t2 on t1.fam=t2.fam and t1.im=t2.im and t1.ot=t2.ot AND t1.BIRTHDAY=t2.BIRTHDAY
CLOSE ALL


Так правильно?
...
Рейтинг: 0 / 0
09.06.2010, 09:14
    #36676992
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
Сдаётся мне что люди не добавляются ... а только обновляются одинаковые (FAM,IM,OT,BIRTHDAY)... как правильно сделать то ?
...
Рейтинг: 0 / 0
09.06.2010, 10:20
    #36677180
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
hellydeya,

Используй SELECT с UNION, но без ALL
...
Рейтинг: 0 / 0
09.06.2010, 11:18
    #36677431
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
Знать бы что это...
можно прям на этом примере ?
...
Рейтинг: 0 / 0
09.06.2010, 11:31
    #36677480
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
igorbikhellydeya,

Используй SELECT с UNION, но без ALL

Каким образом ?!?

USE GETFILE()
COPY TO "C:\baza_1.dbf"
Use "C:\baza_1.dbf" in 0 alias t1

USE GETFILE()
COPY TO "C:\baza_2.dbf"
Use "C:\baza_2.dbf" in 0 alias t2

update t1 set t1.msk_ot="46", t1.SERIES=t2.SERIES, t1.NUMBER=t2.NUMBER from t1 inner join t2 on t1.fam=t2.fam and t1.im=t2.im and t1.ot=t2.ot AND t1.BIRTHDAY=t2.BIRTHDAY

SELECT * FROM t1

UNION
SELECT * FROM t2 where t2.FAM<>t1.FAM and, t2.IM<>t1.IM and t2.OT<>t1.OT and t2.Birthday<>t1.Birthday


так ?
...
Рейтинг: 0 / 0
09.06.2010, 11:45
    #36677540
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
Пробовал просто

update t1 set t1.msk_ot="46", t1.SERIES=t2.SERIES, t1.NUMBER=t2.NUMBER from t1 inner join t2 on t1.fam=t2.fam and t1.im=t2.im and t1.ot=t2.ot AND t1.BIRTHDAY=t2.BIRTHDAY

SELECT * FROM t2, t1 where t2.FAM<>t1.FAM and t2.IM<>t1.IM and t2.OT<>t1.OT and t2.Birthday<>t1.Birthday;

но учитывая то что в файлах по 50000 человек ... он их обрабатывать должен год))) да и потом выдаёт ошибку что слишком большой размер временного файла получается...
...
Рейтинг: 0 / 0
09.06.2010, 12:11
    #36677676
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
не ужели тут никто не знает как сделать? :'(
...
Рейтинг: 0 / 0
09.06.2010, 13:00
    #36677865
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
hellydeya,
Не заметил условие, что у совпадающих людей нужно переписать 2 поля.
Я бы попытался сделать так:

1) переписал серии и номера у совпадающих людей путем сканирования первого файла и поиска во втором

SELECT TABLE1

SCAN
SCATTER MEMVAR
SELECT TABLE2
LOCATE FOR (здесь условие совпадения)
* вместо LOCATE лучше бы SEEK, но нужен индекс
IF FOUND()
SCATTER MEMVAR FIELDS SERIES, NUMBER
SELECT TABLE1
GATHER MEMVAR FIELDS SERIES, NUMBER
ENDIF

ENDSCAN

2) делаем выборку несовпадающих людей.
Если поля одинаковые, то примерно так:
SELECT * FROM TABLE1 ;
WHERE MSK_OT = 46 ;
UNION ;
SELECT * FROM TABLE2 ;
WHERE MSK_OT = 46 ;
INTO CURSOR NEW1

Остальное смотри в Хелпе.
...
Рейтинг: 0 / 0
09.06.2010, 14:26
    #36678211
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
igorbikhellydeya,
Не заметил условие, что у совпадающих людей нужно переписать 2 поля.
Я бы попытался сделать так:

1) переписал серии и номера у совпадающих людей путем сканирования первого файла и поиска во втором

SELECT TABLE1

SCAN
SCATTER MEMVAR
SELECT TABLE2
LOCATE FOR (здесь условие совпадения)
* вместо LOCATE лучше бы SEEK, но нужен индекс
IF FOUND()
SCATTER MEMVAR FIELDS SERIES, NUMBER
SELECT TABLE1
GATHER MEMVAR FIELDS SERIES, NUMBER
ENDIF

ENDSCAN

2) делаем выборку несовпадающих людей.
Если поля одинаковые, то примерно так:
SELECT * FROM TABLE1 ;
WHERE MSK_OT = 46 ;
UNION ;
SELECT * FROM TABLE2 ;
WHERE MSK_OT = 46 ;
INTO CURSOR NEW1

Остальное смотри в Хелпе.


Толи я не понимаю что это за бред ... то ли вы не понимаете что мне надо сделать...
Итак по новой:
надо соединить 2 DBF файла. ( это списки людей )
Люди в этих списках могут совпадать (FAM, IM, OT, BIRTHDAY) и если таковое случилось то надо что бы программа брала (SERIES, NUMBER (*хотя это и не принципиально-можно что бы заменялись все поля)) из второй таблицы.
При всём этом в новом соединённом списке значение поля MSK_OT (не важно чему оно было равно в предыдующих 2ух списках) должно стать 46
...
Рейтинг: 0 / 0
09.06.2010, 14:33
    #36678242
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
select distinct - убирает задвоенные значения по полю, есть ли возможность сделать составной ключ, по нужным мне полям, в моём случае (FAM, IM,OT,Birthday) ?
...
Рейтинг: 0 / 0
09.06.2010, 15:20
    #36678392
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
Помоему проще так...только правильно ли ?

Код: plaintext
1.
2.
3.
4.
5.
GETFILE()
GETFILE()
update t1 ....from t1 inner join t2 on t1.fam=t2.fam and t1.im=t2.im and t1.ot=t2.ot AND t1.BIRTHDAY=t2.BIRTHDAY
Append FROM t2
SELECT distinct * FROM t1 
...
Рейтинг: 0 / 0
09.06.2010, 16:07
    #36678553
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
hellydeya
При всём этом в новом соединённом списке значение поля MSK_OT (не важно чему оно было равно в предыдующих 2ух списках) должно стать 46
Если должно _стать_ 46, а не должно _быть_ 46, то после ENDSCAN нужно написать

SELECT * FROM TABLE1 ;
UNION ;
SELECT * FROM TABLE2 ;
INTO CURSOR NEW1 READWRITE

REPLACE ALL MSK_OT WITH 46

Если это снова "бред", то
1) при помощи хелпа попробуй разобраться, что же и зачем написано в коде
2) если этот "бред" работает не так, то нужно прислать сюда 3 таблицы: 2- как исходные, а 3-ю - как результат слияния. Достаточно по 5 записей в первых 2-х таблицах.
3) в любом случае поблагодарить за участие и извиниться за грубость.
...
Рейтинг: 0 / 0
09.06.2010, 19:44
    #36679143
hellydeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние DBF'ников с заменой
igorbikhellydeya
При всём этом в новом соединённом списке значение поля MSK_OT (не важно чему оно было равно в предыдующих 2ух списках) должно стать 46
Если должно _стать_ 46, а не должно _быть_ 46, то после ENDSCAN нужно написать

SELECT * FROM TABLE1 ;
UNION ;
SELECT * FROM TABLE2 ;
INTO CURSOR NEW1 READWRITE

REPLACE ALL MSK_OT WITH 46

Если это снова "бред", то
1) при помощи хелпа попробуй разобраться, что же и зачем написано в коде
2) если этот "бред" работает не так, то нужно прислать сюда 3 таблицы: 2- как исходные, а 3-ю - как результат слияния. Достаточно по 5 записей в первых 2-х таблицах.
3) в любом случае поблагодарить за участие и извиниться за грубость.

Спасибо. Всё сделал. Не хотел никого обидеть , наверное это просто одно из моих любимых выражений которое случайно вырвалось при виде Кода который к моей программе не подходил , учитывая то, что я сам не правильно пояснил задание - каюсь :) Ваш вариант опробывал , всё тоже работает, поэтому спасибо вдвойне и даже втройне на том, что вы единственный кто мне тут помогал
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Слияние DBF'ников с заменой / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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