Certaines applications utilisent des fichiers HFSQL classic en local lorsqu'elles ne sont pas connectées aux données de la base centrale de l'application. Le plus souvent ces données locales sont synchronisées avec le serveur par la réplication.
Ces données HFSQL classic sont parfois "découpées" en de multiple fichiers d'une même structure, par exemple un fichier par mois, par semaine, voir par jour. Par exemple pour un logiciel de caisse on pourra avoir choisi de créer un fichier (inaltérable) de tickets par jour :
HChangeNom(TICKET, "TICKET_"+DateSys())
Si ce choix offre certains avantages comme un espace de stockage minimal, il a part contre l'inconvénient pour le développeur de ne pas faciliter les interrogations lorsque l'on veut par exemple trouver une donnée pouvant être dans plusieurs fichiers physiques. Dans l'exemple de la caisse avec un fichier de tickets par jour, on pourrait vouloir trouver les tickets d'un certain montant créés entre deux dates, et cela depuis le logiciel de caisse, donc avant d'avoir remonté l'ensemble des données dans la base centrale.
C'est là que le type source de données s'avère des plus pratiques, puisqu'il peut s'utiliser comme un tableau. On peut donc à partir d'une liste de fichiers énumérés sur disque dans le dossier local des données, créer un tableau de source de données :
TabSource est un tableau de Source de Données POUR TOUTE chaîne sFichier de fListeFichier(fRepExe()+[fSep]+"TICKET_*.FIC") SEPAREE PAR RC Ajoute(TabSource) HDéclareExterne(sFichier,TabSource[TabSource..Occurrence])
Trace(fExtraitChemin(sFichier,fExtension+fFichier)+" "+ ... HNbEnr(TabSource[TabSource..Occurrence])+" enregistrements." ) FIN
Comme le montre la trace ci-dessus avec la récupération du nombre d'enregistrement, les éléments du tableau permettent donc d'accéder directement à l'un des fichiers sur disque. On peut donc avoir tout type de traitement utilisant ces fichiers...
Recherches directes dans les fichiers :
POUR n = 1 _À_ TabSource..Occurrence SI HLitRecherche(TabSource[n],"MONTANT",mMontantRecherchée) ALORS Trace("Montant trouvé dans "+TabSource[n]..NomPhysique) FIN FIN
Création d'un interrogation via une UNION ALL d'une requête SQL :
mMontantRecherchée est un monétaire = 17508 ReqRecherche est une Source de Données sSQL_UNION est une chaîne sSQL_SELECT est une chaîne = [ SELECT %1.IDTicket AS IDTICKET, '%2' AS Origine FROM %1 WHERE %1.MONTANT = %3 ]
POUR n = 1 _À_ TabSource..Occurrence sSQL_UNION += [RC+"UNION ALL"+RC]+ChaîneConstruit(sSQL_SELECT, TabSource[n]..Nom, "Trouvé dans "+TabSource[n]..NomPhysique, mMontantRecherchée) FIN // Exécution de la requête qui va chercher dans toutes les tables SI HExécuteRequêteSQL(ReqRecherche, sSQL_UNION) ALORS POUR TOUT ReqRecherche Trace(">>"+HEnregistrementVersChaîne(ReqRecherche)) FIN FIN
Autres billets sur le thème source de données :
|