Bonjour à tous,

voilà,
j'ai tellement galéré à mettre au point ma réplication universelle,
j'ai tellement eu de mal à trouver du code sur internet,
que je voulais en faire profiter la communauté.


une bonne vidéo :
http://www.pcsoft-windev-webdev.com/.../replica1.html

La réplication s'effectue en 3 temps :
Donc 3 boutons :
1. Création du réplica maitre.
2. Création du réplica abonné.
Ces 2 premiers boutons ne sont à lancer qu'une seule et unique fois, à l'initialisation de la réplication,
ensuite on cliquera uniquement sur le bouton 3... pour toutes les autres réplications.
3. Réplication dans les 2 sens. C'est ce bouton qu'on lance à chaque fois qu'on veut synchroniser les bases.


1. Déclarations globales de la fenêtre REPLICATION :
------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sNom_replica_maitre,sNom_replica_abonne est une chaîne
 
sRéplicaMaitre,gsRepertoireMaitre	est une chaîne
sRéplicaAbonné,gsRepertoireAbonne	est une chaîne
sRéplicaTRansportable,gsRepertoireTransfert	est une chaîne
gsDonnéesMaitre, gsDonneesAbonné est une chaîne
gsRepSauvegardeAbonne, gsRepSauvegardeMaitre,sRepSauvegarde est une chaîne
sIdentifiantAbonné est une chaîne
Test_copie est un booléen
 
sIdentifiantAbonné = "Le prénom du médecin sert d'identifiant de connexion pour l'abonné"
 
gsDonnéesMaitre = "M:\DonneesM\"   // sur un serveur par exemple.
gsDonneesAbonné = "C:\DonneesA\"
 
gsRepertoireMaitre = "M:\DonneesM\rplmaitre\"
gsRepertoireAbonne = "C:\DonneesA\rplabonne\"
gsRepertoireTransfert = "M:\DonneesM\transfert\"
 
sIdentifiantAbonné = INILit("LASTVALUES","util","","C:\Program files\Prog\param.INI")
 
sRéplicaMaitre = gsRepertoireMaitre + "ReplicaMaitre.RPM"
sRéplicaAbonné = gsRepertoireAbonne + "Replica_"+sIdentifiantAbonné+".RPL" // un fichier .ini permet de définir l'abonné.

2. Code Bouton-Création-Réplica-Maitre :
------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Multitâche(20)
Sablier(Vrai)
HGèreIntégrité("*","*",hCardinalité+hEnModification+hEnSuppression,Faux)
//-----------------------------------------------
// création des connexions aux bases de données
//-----------------------------------------------
HGèreRéplication(rplRéplicationUniverselle)
HDécritConnexion("ConnexionMaitre", "", "", gsDonnéesMaitre, "", hAccèsHF7)
HDécritConnexion("ConnexionAbonne", "", "", gsDonneesAbonné, "", hAccèsHF7)
 
//-----------------------------------------------
// création du réplica maitre
//-----------------------------------------------
HOuvreConnexion("ConnexionMaitre")
HChangeConnexion("*","ConnexionMaitre")
HCréeRéplicaMaître(gsRepertoireMaitre)
 
Sablier(Faux)

3. Code Bouton-Création-Réplica-Abonné :
-----------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
sListeTables est une chaîne
 
Multitâche(20)
Sablier(Vrai)
HGèreIntégrité("*","*",hCardinalité+hEnModification+hEnSuppression,Faux)
// on se fout de l'ordre des tables
 
//-----------------------------------------------
// création des connexions aux bases de données	-
//-----------------------------------------------
HGèreRéplication(rplRéplicationUniverselle)
HDécritConnexion("ConnexionMaitre", "", "", gsDonnéesMaitre, "", hAccèsHF7)
HDécritConnexion("ConnexionAbonne", "", "", gsDonneesAbonné, "", hAccèsHF7)
 
 
//-----------------------------------------------
// création du réplica abonné					-
//-----------------------------------------------
HOuvreConnexion("ConnexionAbonne")
HChangeConnexion("*","ConnexionAbonne")
 
HCréation(T_table 1)
HCréation(T_table 2)
HCréation(T_table 3)
...
HCréation(T_table n)
 
// éventuellement :
HPasse("T_table i","******")
 
// Liste complète des tables, l'ordre n'a pas d'importance car l'intégritée est sur Faux
 
sListeTables ="T_table 1 " + RC + "T_table 2 " + RC + ... + RC + "T_table n"
 
Multitâche(20)
 
HCréeRéplicaAbonné(gsRepertoireMaitre,gsRepertoireAbonne,sIdentifiantAbonné,0,sListeTables)
 
Multitâche(-500)
 
//***************************************************************************************
// PREMIERE SYNCHRO																		*
// créer réplica Transportable à partir du maître pour stocker les données sur l'abonné	*
// puis synchro																			*
//***************************************************************************************
HOuvreConnexion("ConnexionMaitre")
HChangeConnexion("*", "ConnexionMaitre")	
SI HCréeRéplicaTransportable(sRéplicaMaitre,sIdentifiantAbonné,"") ALORS
 
	HOuvreConnexion("ConnexionAbonne")
	HChangeConnexion("*", "ConnexionAbonne")	
	sRéplicaTRansportable = gsRepertoireMaitre + RPL.Fichier
 
	// synchronisation du réplica
	SI HSynchroniseRéplica(sRéplicaTRansportable, sRéplicaAbonné,rplVersAbonné) ALORS
Multitâche(-500)		
		// Suppression du réplica transportable qui ne sera plus utilisé
		fSupprime(sRéplicaTRansportable)
 
	SINON
		FinProgramme("Echec de synchronisation.", ErreurInfo())
	FIN
SINON 
	Erreur("Echec de création du premier réplica Transportable",ErreurInfo())
 
FIN
Sablier(Faux)
4. Code Bouton Réplication dans les 2 sens (à chaque fois qu'on veut répliquer) :
-------------------------------------------------------------------------------

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Multitâche(-100)
HGèreIntégrité("*","*",hCardinalité+hEnModification+hEnSuppression,Faux)
 
//-----------------------------------------------
// création des connexions aux bases de données
//-----------------------------------------------
HPasse(T_table i ,"*****")
 
Sablier(Vrai)
HGèreRéplication(rplRéplicationUniverselle)
 
HDécritConnexion("ConnexionMaitre", "", "", gsDonnéesMaitre, "", hAccèsHF7)
HDécritConnexion("ConnexionAbonne", "", "", gsDonneesAbonné, "", hAccèsHF7)
 
//--------------------------------------------------
// création réplica transportable MAITRE -> ABONNE -
//--------------------------------------------------
HOuvreConnexion("ConnexionMaitre")
HChangeConnexion("*", "ConnexionMaitre")	
 
SI HCréeRéplicaTransportable(sRéplicaMaitre,sIdentifiantAbonné,"") ALORS
	Multitâche(-500)
	SI fCopieFichier(gsRepertoireMaitre+RPL.Fichier,gsRepertoireTransfert+RPL.Fichier) ALORS
		Sablier(Faux)
		Info("Fichier réplica MAITRE créé et copié dans \Transfert")
		Multitâche(-500)
	FIN
SINON 
	Sablier(Faux)	
	Erreur("Erreur lors de la creation du réplica transportable MAITRE : " + ErreurInfo())
FIN
 
//-----------------------------------------------------------
// synchronisation de l'ABONNE avec les données du MAITRE	|
//-----------------------------------------------------------
Sablier(Vrai)
HOuvreConnexion("ConnexionAbonne")
HChangeConnexion("*", "ConnexionAbonne")	
 
fListeFichier(gsRepertoireTransfert+"To_"+sIdentifiantAbonné+"_*.RPA",nom_replica_maitre)
sRéplicaTRansportable = gsRepertoireTransfert+sNom_replica_maitre
 
Multitâche(20)
 
SI fRep(sRéplicaTRansportable,frFichier) <> "" ALORS
	Multitâche(-500)  //entier négatif pour rendre la main à windows et lui laisser le temps de faire ses trucs (copie,...)
	SI HSynchroniseRéplica(sRéplicaTRansportable,sRéplicaAbonné,rplVersAbonné,rplPlusRécentPrioritaire) ALORS
		Sablier(Faux)
		Multitâche(-500)
	SINON
		Sablier(Faux)
		Erreur("Echec de la synchro des données du maitre",ErreurInfo())
		Multitâche(20)
	FIN
SINON
	Sablier(Faux)
	Info("Aucune synchro effectuée, le Réplica Transportable n'a pas été trouvé")
	Multitâche(20)
FIN
 
 
//--------------------------------------------------
// création réplica transportable ABONNE -> MAITRE 
//--------------------------------------------------
Sablier(Vrai)
HOuvreConnexion("ConnexionAbonne")
HChangeConnexion("*", "ConnexionAbonne")	
SI HCréeRéplicaTransportable(sRéplicaAbonné,sIdentifiantAbonné,"") ALORS
 
	Multitâche(-500)
 
	SI fCopieFichier(gsRepertoireAbonne+RPL.Fichier,gsRepertoireTransfert+RPL.Fichier) ALORS
		Sablier(Faux)
		Info("Fichier réplica ABONNE créé et copié dans \Transfert")
		Multitâche(-500)
	FIN
SINON 
	Sablier(Faux)	
	Erreur("Erreur lors de la creation du réplica transportable ABONNE : " + ErreurInfo())
FIN
 
 
//--------------------------------------------------
// synchronisation du MAITRE avec les données de l'ABONNE
//--------------------------------------------------
Sablier(Vrai)
HOuvreConnexion("ConnexionMaitre")
HChangeConnexion("*", "ConnexionMaitre")	
 
fListeFichier(gsRepertoireTransfert+"From_"+sIdentifiantAbonné+"_*.RPA",nom_replica_abonne)
sRéplicaTRansportable = gsRepertoireTransfert+sNom_replica_abonne
 
Multitâche(20)
 
SI fRep(sRéplicaTRansportable,frFichier) <> "" ALORS
	Multitâche(-500)
	SI HSynchroniseRéplica(sRéplicaMaitre,sRéplicaTRansportable,rplVersMaître,rplPlusRécentPrioritaire) ALORS
		Sablier(Faux)
		Multitâche(-500)
	SINON
		Sablier(Faux)
		Erreur("Echec de la synchro des données de l'abonné",ErreurInfo())
		Multitâche(20)
	FIN
SINON
	Sablier(Faux)
	Info("Aucune synchro effectuée, le Réplica Transportable n'a pas été trouvé")
	Multitâche(20)
FIN
Sablier(Faux)
Info("REPLICATION terminée avec succès")
 
Ferme()