21 décembre 2020
publié par 

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) // Dans le nom sFichier on pourrait extraire la date pour filtrer
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
]

// Construction d'un code SQL regroupant en UNION ALL
// tous les SELECT pour chaque fichier physique
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 :

< Retour

Publier un commentaire : 
Votre adresse email ne sera pas publiée