|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
Есть 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 Так правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 09:09 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
Сдаётся мне что люди не добавляются ... а только обновляются одинаковые (FAM,IM,OT,BIRTHDAY)... как правильно сделать то ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 09:14 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
hellydeya, Используй SELECT с UNION, но без ALL ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 10:20 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
Знать бы что это... можно прям на этом примере ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 11:18 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
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 так ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 11:31 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
Пробовал просто 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 человек ... он их обрабатывать должен год))) да и потом выдаёт ошибку что слишком большой размер временного файла получается... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 11:45 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
не ужели тут никто не знает как сделать? :'( ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 12:11 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
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 Остальное смотри в Хелпе. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 13:00 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 14:26 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
select distinct - убирает задвоенные значения по полю, есть ли возможность сделать составной ключ, по нужным мне полям, в моём случае (FAM, IM,OT,Birthday) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 14:33 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
Помоему проще так...только правильно ли ? Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 15:20 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
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) в любом случае поблагодарить за участие и извиниться за грубость. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 16:07 |
|
Слияние DBF'ников с заменой
|
|||
---|---|---|---|
#18+
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) в любом случае поблагодарить за участие и извиниться за грубость. Спасибо. Всё сделал. Не хотел никого обидеть , наверное это просто одно из моих любимых выражений которое случайно вырвалось при виде Кода который к моей программе не подходил , учитывая то, что я сам не правильно пояснил задание - каюсь :) Ваш вариант опробывал , всё тоже работает, поэтому спасибо вдвойне и даже втройне на том, что вы единственный кто мне тут помогал ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2010, 19:44 |
|
|
start [/forum/topic.php?fid=41&msg=36677865&tid=1585207]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
258ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 385ms |
total: | 728ms |
0 / 0 |