Bonjour à toutes et tous,
Je partage avec vous une procédure de synchronisation de donnée, que j'utilise dans certains de mes projets.
Le contexte et le suivant :
nous avons plusieurs application cliente chacune avec leur base locale et les base locale sont sychronisée dans une base cenralisé distante.
Exemple :
Un utilisateur crée un Client, la ligne créee, est dans un premier temps enregistrée dans la base locale, puis est envoyée au serveur distant (même analyse avec connexions différentes)
Méthode :
J'ai ajouté à chaque fichier de mon analyse une rubrique qui joue le role d'un flag nommée "envoyé". Chaque fois que l'on ajoute ou que l'on modifie un enregistrement la rubrique "envoye" est mise à 0.
Le mécanisme de synchonisation récupere en local les lignes avec rubrique envoyé = 0 et les envoie une à une au serveur
Afin de faciliter la portabilité de ce traitement, j'ai ecris la procédure suivante qui prend en parametre le nom du fichier à syncrhoniser (fic)
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 PROCÉDURE SynchroniserUnFichierLocalVersServeur(Fic) PROCÉDURE INTERNE ConnexionFic(Fich,Cnx) HChangeConnexion(Fich,Cnx) HOuvreConnexion(Cnx) HCréationSiInexistant(Fich) FIN RubriqueCle est une chaîne= NomRubriqueCle(Fic) ConnexionFic(Fic,ConnexionLocale) R1 est une Source de Données //On récupére les ligne à envoyer CodeSQL est une chaîne = [ select * from %1 where envoye = 0 ] CodeSQL = ChaîneConstruit(CodeSQL,Fic) HExécuteRequêteSQL(R1,CodeSQL) Nb est un entier = HNbEnr(R1) SI Nb= 0 ALORS // s'il n y a aucune ligne à syncrhoniser, on sort, inutile d'ouvrir la connexion distante (suite) Trace("Aucune Ligne à syncrhoniser") RETOUR FIN //Suite HLitPremier(R1) // On bascule vers la connexion Distante pour synchoniser ConnexionFic(Fic,ConnexionDistante) Id est une chaîne TabId est un tableau de chaînes Code est une chaîne // On synchronise chaque ligne à envoyer TANTQUE PAS HEnDehors(R1) //Récuperer le Identifiant unique de la clé Code = "Id = R1."+RubriqueCle ExécuteCode(Code) TableauAjoute(TabId,Id)// on stock les id des lignes syncrhonisée afin de baisser le flag par la suite (*) HLitRecherchePremier(Fic,RubriqueCle,Id) SI HTrouve(Fic) ALORS //Si la ligne id existe deja : On est dans un cas de modif HCopieEnreg(Fic,R1) Code = Fic+".Envoye=1" ExécuteCode(Code) HModifie(Fic) SINON // Si la ligne n'existe pas on est dans un cas d'insertion HRAZ(Fic) HCopieEnreg(Fic,R1) Code = Fic+".Envoye=1" ExécuteCode(Code) HAjoute(Fic) FIN HLitSuivant(R1) FIN ConnexionFic(Fic,ConnexionLocale) //(*) on baisse les flags des ligne qui ont été syncrhonisée POUR TOUT Id DE TabId HLitRecherchePremier(Fic,RubriqueCle,Id) SI HTrouve(Fic) ALORS Code = Fic+".Envoye=1" ExécuteCode(Code) HModifie(Fic) FIN FIN
Je suis assez satisfait de cette procédure que j'ai integrée dans un composant ainsi que d'autre procédure de syncrhonisation.
L'inconvient est que cette procédure n'est pas utilisable sous android, et ce à cause de la fonction ExecuteCode qui n'est pas disponible en android:
Dans ce code, je récupére le Id de la ligne à syncrhoniser, information nécessaire pour mettre à jour les flags et aussi pour se positionner sur la bonne ligne en connexion distante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Code = "Id = R1."+RubriqueCle ExécuteCode(Code)
Auriez-vous des suggestion qui permettrai de contourner l'utilisation de la fonction ExecuteCode, même s'il faut revoir mon algo.
Merci pour toute réponse
Bien à vous.
Réda
PS/Je ne tiens pas à utiliser l'outil de repliation pcsoft.
Partager