Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Синхронизация БД  [new]
MARGARITA23
Member

Откуда:
Сообщений: 55
Здравствуйте, подскажите пожалуйста как лучше организовать синхронизацию 2 БД.
Есть две одинаковы по структуре БД в foxpro и oracle. Нужно из БД на oracle перекинуть все данные в БД foxpro. Приложение пишется в foxpro. Создала курсорадаптеры для таблиц и вывела в Grid. Теперь нужно все измененные данные в Grid-е для оракловской БД сохранить и в БД в foxpro и в oracle. Как это можно сделать?
14 мар 10, 21:39    [8476390]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Также. Создаете CursorAdapter к таблицам Oracle и копируете данные.

Только, непонятно, зачем Вам дубль хранилища в виде DBF-таблиц? Почему не работаете напряму. с Oracle.
14 мар 10, 22:21    [8476474]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
MARGARITA23
Member

Откуда:
Сообщений: 55
Я создала CursorAdapter к таблицам Oracle и вывожу данные таблиц в Grid. Я не знаю как сохранять измененые в Grid-е данные. При этом чтоб они сохранялись и в БД на oracle и в аналогичной на foxpro. Может посоветуете что-нибудь
15 мар 10, 05:35    [8476882]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
прошелмимо
Member [заблокирован]

Откуда: Из Курска понаехал
Сообщений: 10363
автор
При этом чтоб они сохранялись и в БД на oracle и в аналогичной на foxpro. Может посоветуете что-нибудь


ага, ну вот как раз и есть задача репликации.

вначале читайте про репликацию и что это такое.
(со стороны фокспро для фокса придется руками городить "городуху",
изв. за каламбур)
не знаю, возможно ли со стороны оракл работать с табличками фокспро,
если да, то организовать репликацию со стороны сервера.

может Вам проще после
изменений в оракловой табличке
просто переначитать в фокс заново все записи из этой таблички?
(пересоздать фоксовую табличку)?
15 мар 10, 09:33    [8477181]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
MARGARITA23
Я создала CursorAdapter к таблицам Oracle и вывожу данные таблиц в Grid. Я не знаю как сохранять измененые в Grid-е данные

В смысле? Как настроить CursorAdapter таким образом, чтобы изменения сделанные в Grid автоматически сбрасывались в Oracle? Для этого надо настроить 4 реквизита (свойства) CursorAdapter

- Tables
- KeyFieldList
- UpdatableFieldList
- UpdateNameList

Сделайте поиск на этом сайте по любому из этих ключевых слов. Найдете много интересного.

MARGARITA23
При этом чтоб они сохранялись и в БД на oracle и в аналогичной на foxpro

Смысл? Еще раз. Зачем Вам дубль данных в виде DBF-таблиц? При корректной настройке CursorAdapter изменения сделанные в Grid будут автоматически "сбрасываться" в Oracle. Т.е. вообще БЕЗ постоянных таблиц DBF

Можете объяснить, какова цель наличия дубля данных в виде DBF-таблиц?
15 мар 10, 20:30    [8482447]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
MARGARITA23
Member

Откуда:
Сообщений: 55
ВладимирМ,
Передо мной стоит задача: осуществить синхронизацию 2-х БД, одна из них на оракле, другая-на фоксе( БД имеют аналогичную структуру). При этом данные из одной БД должны выводиться в один Grid , а другой -во 2 Grid для просмотра. Синхронизация должна осуществляться при нажатии на кнопку "Синхронизировать".
Т.е. при изменении данных в таблице на оракле должны быть изменены данные в аналогичной таблице на фоксе при нажатии на кнопку "Синхронизировать"
Для таблиц обеих БД я создала курсорадаптеры, которые я затем использую для вывода в один грид оракловскую таблицу, а в другой - аналогичную фокспрошную.Курсорадаптеры я настроила, т.е. если я изменяю данные в гриде, то эти изменения автоматически сохраняются.
Что мне сделать, чтобы в случае, если я изменяю данные в гриде для оракловской таблицы, эти изменения сохранялись и в аналогичной таблице на фоксе?
15 мар 10, 21:57    [8482724]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
прошелмимо
Member [заблокирован]

Откуда: Из Курска понаехал
Сообщений: 10363
автор
Что мне сделать


Вам были даны советы:

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


как вариант отказаться от дбф-ки совсем.
она для чего?
я так понимаю рассадник приложений?
может модифицировать "старые" прилож-я и обращаться к единому источнику?
16 мар 10, 09:04    [8483432]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
ВладимирМ
MARGARITA23

[quot MARGARITA23]При этом чтоб они сохранялись и в БД на oracle и в аналогичной на foxpro

Смысл? Еще раз. Зачем Вам дубль данных в виде DBF-таблиц? При корректной настройке CursorAdapter изменения сделанные в Grid будут автоматически "сбрасываться" в Oracle. Т.е. вообще БЕЗ постоянных таблиц DBF

Можете объяснить, какова цель наличия дубля данных в виде DBF-таблиц?

Cинхронизация БД на oracle и БД Vfp приходится делать мне. Это вызвано тем ,что министерство нашего предприятия решило ,за счет инновационного фонда внедрить "передовой" програмный продукт
с БД на oracle.После внедрения этого продукта ,некоторые задачи решаемые в БД Foxpro могли оказаться погребенными (учет мбп,матотчеты цехов и др.) Поэтому пришлось создать программу для синхронизации БД:

OPEN DATABASE F:\BUX1\MAG9\SKLAD 
*******************************
DATAN={^2010-01-01} &&        *
DATAK={^2010-12-31} &&        *
*******************************
DATNT=DTOT(DATAN)
DATKT=DTOT(DATAK)
oper=0
IDSK=0
*IF .T.
lnConn = SQLSTRINGCONNECT('DRIVER={Microsoft ODBC for Oracle};Server=ORA9I;Uid=LIDA;Pwd=LIDA;')
	WAIT WINDOW "КРАХ SQLCONNECT" 
	RETURN
ENDIF	
TEXT TO lcSQLSelectString TEXTMERGE NOSHOW  
SELECT DOC.CSSN,DOC.POPE,DOC.DDOC,DOC.NDOC,DOC.DTTN,DOC.COPE,NVL(MOL.NTAB,DOC.CPOL) CPOL,DOC.TPOL,
	NVL(ORG.IORG,'')||NVL(SPO.ISPO,'')||NVL(MOL.IFIO,' ') КОНТРАГЕНТ,
	NVL(MOL.NTAB,00000) TAB ,
    NVL(MAT.nmat,' ') nmat, NVL(MAT.kedi,0) kedi, NVL(SEI.iedi,' ') iedi,
    DOC.cdmat, DOC.cdoc,  DOC.noms, DOC.cmat, 
    MAT.SCH cshs,MAT.SSCH csshs, DOC.anal,
    DOC.qkol, 
    DOC.qcen,  DOC.qsum,
    NVL(DOC.qcenv, 0) qcenv, NVL(DOC.qsumv, 0) qsumv, NVL(DOC.qstvk, 0) qstvk,
    NVL(DOC.qnds, 0)   qnds,  NVL(DOC.qndsv, 0) qndsv,
    NVL(MAT.kshifr,0) kshifr, NVL(SHIFR.ishifr,' ') ishifr
FROM  (
............................
ENDTEXT
lnReturn = SQLEXEC(lnConn, lcSQLSelectString, "CDOKS")
IF lnReturn <= 0
	WAIT WINDOW "КРАХ SQLEXEC" 
ENDIF	
TEXT TO lcSQLSelectString TEXTMERGE NOSHOW  
    SELECT MAT.cmat,MAT.nmat,MAT.kedi,NVL(SEI.iedi,' ') iedi,
    MAT.SCH*100+MAT.SSCH SCET,
    NVL(MAT.kshifr,0) kshifr, NVL(SHIFR.ishifr,' ') ishifr
  FROM LIDA.NSI_MAT MAT  
  LEFT JOIN LIDA.NSI_SHIFR  SHIFR ON SHIFR.kshifr  = MAT.kshifr
  LEFT JOIN LIDA.NSI_SEI    SEI   ON SEI.kedi      = MAT.kedi
ENDTEXT


lnReturn = SQLEXEC(lnConn, lcSQLSelectString, "CSTOV")
IF lnReturn <= 0
	WAIT WINDOW "КРАХ SQLEXEC" 
ENDIF	
= SQLDISCONNECT(lnConn)	 


wait wind nowait "*ОБНОВЛЕНИЕ СПРАВОЧНИКА ПРЕДПРИЯТИЙ"

SELECT DISTINCT CDOKS.CPOL KOD_P,CDOKS.КОНТРАГЕНТ NAIM_P FROM cdoks WHERE tpol=1 AND cpol NOT in ;
	(SELECT KOD_P FROM SP_AG WHERE kod_p>0) INTO CURSOR POST
INSERT INTO SP_AG (kod_p,nam) SELECT * FROM post

wait wind nowait "*ОБНОВЛЕНИЕ СПРАВОЧНИКА ЦЕХОВ ОТДЕЛОВ"
SELECT DISTINCT CDOKS.CPOL KOD_OTD,CDOKS.КОНТРАГЕНТ NAIM1 FROM cdoks WHERE tpol=3 AND cpol NOT in ;
	(SELECT KOD_OTD FROM SP_AG WHERE KOD_OTD>0) INTO CURSOR POST
INSERT INTO SP_AG (KOD_OTD,nam) SELECT * FROM post

wait wind nowait "*ОБНОВЛЕНИЕ СПРАВОЧНИКА ФАМИЛИЙ"
SELECT DISTINCT CDOKS.tab,CDOKS.КОНТРАГЕНТ NAM FROM cdoks WHERE tpol=2 AND TAB NOT in ;
	(SELECT TAB FROM SP_AG WHERE TAB>0) INTO CURSOR POST
INSERT INTO SP_AG (TAB,nam) SELECT * FROM post

wait wind nowait "*ДОБАВЛЕНИЕ СПРАВОЧНИКА ТОВАРОВ"
SELECT DISTINCT cmat KOD_T,nmat NAIM_T2,iedi ED_IZM,SCET,DATE() DATA_V,0 SRI,ishifr shifr ;
	FROM CSTOV WHERE CMAT NOT IN ;
	(SELECT KOD_T FROM SP_TOV WHERE KOD_T>0) INTO CURSOR CTV
INSERT INTO SP_TOV (KOD_T,NAIM_T2,ED_IZM,SCET,DATA_V,SRI,shifr) SELECT * FROM CTV

*ПРОВЕРКА НАИМЕНОВАНИЯ,СЧЕТА,ЕДИНИЦЫ ИЗМЕРЕНИЯ,ШИФРА В СПРАВОЧНИКЕ ТОВАРОВ

*СОЗДАЕМ КУРСОР КОРРЕКТУРЫ
sele 0
create cursor ckr ;
(ID I(4),D_DOK D(8),D_OTC D(8),D_NEK D(8),OTP I(4),POL I(4),K_DOK C(3),N_DOK C(10),KOD_T N(6),;
CENA N(16,8),CENA_POK N(16,8),KOL N(15,3),SUMA N(18,2),D_KOR N(5),P_NDS N(5,2),S_NDS N(15,2),GOD N(4))

wait wind nowait "* Копирование таблицы SDOK в курсор CKR"
INSERT INTO CKR ;
SELECT 1,TTOD(ddoc),TTOD(ddoc),TTOD(ddoc),INT(IIF(POPE=0,ORG.ID_AGN,SKL.ID_AGN)),INT(IIF(POPE=0,SKL.ID_AGN,ORG.ID_AGN)),CDOKS.COPE, ;
 NDOC,CMAT,QCEN,0,QKOL,QSUM,0,QSTVK,qnds,9999 FROM CDOKS,SP_AG SKL,SP_AG ORG ;
 WHERE SKL.KOD_OTD=CSSN AND CPOL=ICASE(TPOL=1,ORG.KOD_P,TPOL=2,ORG.TAB,TPOL=3,ORG.KOD_OTD)

*ENDIF


*ФОРМИРОВАНИЕ ТАБЛИЦЫ ПО ДОКУМЕНТАМ ИЗ БАЗЫ ORACLE
SELECT * FROM CKR  ORDER BY D_DOK,K_DOK,N_DOK,OTP,POL,KOD_T,GOD,CENA,KOL INTO CURSOR CDKS 

SELECT DIST D_DOK,K_DOK,N_DOK,OTP,POL FROM CDKS ORDER BY 1,2,3,4,5 INTO CURSOR CPR1

SELECT *,RECNO() AS ID_DKS FROM CPR1 INTO CURSOR CPRI

SELECT CDKS.*,CPRI.ID_DKS FROM CDKS,CPRI WHERE CPRI.D_DOK=CDKS.D_DOK AND CPRI.K_DOK=CDKS.K_DOK AND ;
	CPRI.N_DOK=CDKS.N_DOK AND CPRI.OTP=CDKS.OTP AND CPRI.POL=CDKS.POL ;
	ORDER BY CPRI.ID_DKS,KOD_T,GOD,CENA,KOL INTO CURSOR CPRS

IF TYPE("DATN")="D"
	NDAT=DATN
	KDAT=DATK
ENDIF	
DATN=DATAN
DATK=DATAK
*ФОРМИРОВАНИЕ ТАБЛИЦЫ ПО ДОКУМЕНТАМ ИЗ БАЗЫ VFP

SELECT Dok.id_dok, Dok.d_dok, Dok.otp, Dok.pol, Dok.k_dok, Dok.n_dok,;
  Dok.suma AS sumdok, Doks.id_str, Doks.d_otc, Doks.d_nek, Doks.id_tov,;
  Doks.cena, Doks.cena_pok, Doks.kol, Doks.suma, Sp_tov.kod_t, Doks.p_nds,;
  Doks.s_nds, Doks.god;
 FROM ;
     sklad!dok ;
    INNER JOIN  sklad!doks ;
    INNER JOIN sklad!sp_tov ;
   ON  Doks.id_tov = Sp_tov.id_tov ;
   ON  Dok.id_dok = Doks.id_dok;
 WHERE  Dok.d_dok BETWEEN datn AND datk;
   AND  VAL(Dok.k_dok) < 100 ;
 ORDER BY Dok.id_dok INTO CURSOR DKTV


SELECT * FROM DKTV WHERE IIF(IDSK=0,.T.,OTP=IDSK OR POL=IDSK) ;
	ORDER BY D_DOK,K_DOK,N_DOK,OTP,POL,KOD_T,GOD,CENA,KOL INTO CURSOR CDKN

IF TYPE("NDAT")="D"
	DATN=NDAT
	DATK=KDAT
ENDIF	


SELECT DIST D_DOK,K_DOK,N_DOK,OTP,POL,ID_DOK FROM CDKN ORDER BY 1,2,3,4,5 INTO CURSOR CPRW
*ВЫБЕРЕМ  ДОКУМЕНТЫ ,БЕЗ ПОВТОРЕНИЙ
SELECT  D_DOK,K_DOK,N_DOK,OTP,POL,MIN(ID_DOK) AS ID_DOK FROM CPRW GROUP BY 1,2,3,4,5 ;
  INTO CURSOR CPRN
*ВЫБЕРЕМ И УДАЛИМ ЛИШНИЕ
SELECT ID_DOK FROM CPRW WHERE NOT EXISTS (SELECT  * FROM CPRN WHERE CPRN.ID_DOK=CPRW.ID_DOK) ;
	INTO CURSOR CUD
SCAN
	DOK_ID=CUD.ID_DOK
	DELETE FROM SKLAD!DOK WHERE ID_DOK=DOK_ID
ENDSCAN

*НОВЫЕ ДОКУМЕНТЫ(ДЛЯ ВСТАВКИ)
SELECT  D_DOK,K_DOK,N_DOK,OTP,POL,ID_DKS FROM CPRI WHERE NOT EXISTS ;
	(SELECT * FROM CPRN WHERE CPRN.D_DOK=CPRI.D_DOK AND CPRN.K_DOK=CPRI.K_DOK AND ;
	CPRN.N_DOK=CPRI.N_DOK AND CPRN.OTP=CPRI.OTP AND CPRN.POL=CPRI.POL) ;
	INTO CURSOR CDKW

SCAN
	DKS_ID=CDKW.ID_DKS
	SELECT CPRS.*,SP_TOV.ID_TOV FROM CPRS,SP_TOV WHERE SP_TOV.KOD_T=CPRS.KOD_T AND ;
		CPRS.ID_DKS=DKS_ID INTO CURSOR CDT
	SELE CDT
	GO TOP
	SCAN
			INSERT INTO SKLAD!DOKS (D_OTC,D_NEK,ID_TOV,CENA,CENA_POK,KOL,D_KOR,P_NDS,S_NDS,ID_DOK,GOD) ;
				VALUES (CDT.D_OTC,CDT.D_NEK,CDT.ID_TOV,CDT.CENA,CDT.CENA_POK,CDT.KOL,CDT.D_KOR,CDT.P_NDS,CDT.S_NDS,DOK_ID,CDT.GOD)
			STR_id=DOKS.ID_STR
	ENDSCAN

ENDSCAN

*УДАЛЁННЫЕ ДОКУМЕНТЫ(В СТАРОЙ БАЗЕ НЕТ)
SELECT * FROM CPRN WHERE NOT EXISTS ;
	(SELECT * FROM CPRI WHERE CPRN.D_DOK=CPRI.D_DOK AND CPRN.K_DOK=CPRI.K_DOK AND ;
	CPRN.N_DOK=CPRI.N_DOK AND CPRN.OTP=CPRI.OTP AND CPRN.POL=CPRI.POL) ;
	INTO CURSOR CDKU
SCAN
	DOK_ID=CDKU.ID_DOK
	DELETE FROM SKLAD!DOK WHERE DOK.ID_DOK=DOK_ID
ENDSCAN

*ДОКУМЕНТЫ КОТОРЫЕ ЕСТЬ В ОБЕИХ БАЗАХ
SELECT ID_DKS,ID_DOK FROM CPRI,CPRN WHERE CPRN.D_DOK=CPRI.D_DOK AND CPRN.K_DOK=CPRI.K_DOK AND ;
	CPRN.N_DOK=CPRI.N_DOK AND CPRN.OTP=CPRI.OTP AND CPRN.POL=CPRI.POL ;
	INTO CURSOR CDKK

SELE CDKK
GO TOP
SCAN
	DKS_ID=CDKK.ID_DKS
	SELECT * FROM CPRS WHERE ID_DKS=DKS_ID INTO CURSOR CST
	KZS=_TALLY
	DOK_ID=CDKK.ID_DOK
	SELECT * FROM CDKN WHERE ID_DOK=DOK_ID INTO CURSOR CNW
	KZN=_TALLY
	DO KRDOK
ENDSCAN


CLOS TABL ALL

PROC KRDOK
KLS=STR(999999,6)+STR(9999,4)+str(9999999.99999999,16,8)
KLN=STR(999999,6)+STR(9999,4)+str(9999999.99999999,16,8)
I=0
J=0
=NARI()
=NARJ()

DO WHILE NOT (  KLN=STR(999999,6)+STR(9999,4)+str(9999999.99999999,16,8) AND KLS=STR(999999,6)+STR(9999,4)+str(9999999.99999999,16,8) )


*замена кол,ндс,GOD
DO WHILE KLS=KLN AND KLN < STR(999999,6)+STR(9999,4)+str(9999999.99999999,16,8)
IF NOT (CST.KOL=CNW.KOL AND CST.P_NDS=CNW.P_NDS AND CST.S_NDS=CNW.S_NDS AND CST.GOD=CNW.GOD)
	STR_ID=CNW.ID_STR
	KOLK=CST.KOL
	P_NDSK=CST.P_NDS
	S_NDSK=CST.S_NDS
	GODK=CST.GOD
	UPDATE SKLAD!DOKS SET KOL=KOLK,P_NDS=P_NDSK,S_NDS=S_NDSK,GOD=GODK WHERE ID_STR=STR_ID
ENDIF
=NARI()
=NARJ()
ENDDO

*ВСТАВКА 
DO WHILE KLS<KLN
	T_KOD=CST.KOD_T
	SELECT SP_TOV.ID_TOV FROM SP_TOV WHERE KOD_T=T_KOD INTO CURSOR CID
	TOV_ID=CID.ID_TOV
	USE IN CID 
	INSERT INTO SKLAD!DOKS (D_OTC,D_NEK,ID_TOV,CENA,CENA_POK,KOL,D_KOR,P_NDS,S_NDS,ID_DOK,GOD) ;
		VALUES (CST.D_OTC,CST.D_NEK,TOV_ID,CST.CENA,CST.CENA_POK,CST.KOL,CST.D_KOR,CST.P_NDS,CST.S_NDS,DOK_ID,CST.GOD)
	=NARI()	
ENDDO
*УДАЛЕНИЕ
DO WHILE KLS>KLN
	STR_ID=CNW.ID_STR
	DELETE FROM SKLAD!DOKS WHERE ID_STR=STR_ID
	=NARJ()
ENDDO

ENDDO

FUNCTION NARI
I=I+1
IF I>KZS
	KLS=STR(999999,6)+STR(9999,4)+str(9999999.99999999,16,8)
ELSE
	SELE CST
	GO I
	KLS=STR(CST.KOD_T,6)+STR(CST.GOD,4)+str(CST.CENA,16,8)
ENDIF
ENDFUNC

FUNCTION NARJ
J=J+1
IF J>KZN
	KLN=STR(999999,6)+STR(9999,4)+str(9999999.99999999,16,8)
ELSE
	SELE CNW
	GO J
	KLN=STR(CNW.KOD_T,6)+STR(CNW.GOD,4)+str(CNW.CENA,16,8)
ENDIF
ENDFUNC
16 мар 10, 10:14    [8483808]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация БД  [new]
MARGARITA23
Member

Откуда:
Сообщений: 55
LUCIAN, огромное спасибо, выручили
18 мар 10, 06:11    [8495200]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить