powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Слияние DBF'ников с заменой
13 сообщений из 13, страница 1 из 1
Слияние DBF'ников с заменой
    #36676977
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 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
Слияние DBF'ников с заменой
    #36676992
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сдаётся мне что люди не добавляются ... а только обновляются одинаковые (FAM,IM,OT,BIRTHDAY)... как правильно сделать то ?
...
Рейтинг: 0 / 0
Слияние DBF'ников с заменой
    #36677180
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hellydeya,

Используй SELECT с UNION, но без ALL
...
Рейтинг: 0 / 0
Слияние DBF'ников с заменой
    #36677431
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знать бы что это...
можно прям на этом примере ?
...
Рейтинг: 0 / 0
Слияние DBF'ников с заменой
    #36677480
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Слияние DBF'ников с заменой
    #36677540
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал просто

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
Слияние DBF'ников с заменой
    #36677676
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не ужели тут никто не знает как сделать? :'(
...
Рейтинг: 0 / 0
Слияние DBF'ников с заменой
    #36677865
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Слияние DBF'ников с заменой
    #36678211
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Слияние DBF'ников с заменой
    #36678242
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select distinct - убирает задвоенные значения по полю, есть ли возможность сделать составной ключ, по нужным мне полям, в моём случае (FAM, IM,OT,Birthday) ?
...
Рейтинг: 0 / 0
Слияние DBF'ников с заменой
    #36678392
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помоему проще так...только правильно ли ?

Код: 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
Слияние DBF'ников с заменой
    #36678553
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Слияние DBF'ников с заменой
    #36679143
hellydeya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Слияние DBF'ников с заменой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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