Chargement dynamique des alias Nous avons rappelé dans la note Localisation des objets Paradox dans les alias l'importance d'utiliser des alias et précisé quelques règles permettant de répartir les objets Paradox dans ceux-ci. Nous nous préoccupons ici de la gestion proprement dite de ceux-ci. 
Définition des alias dans le fichier de configuration: La première solution est de définir les alias dans le fichier (idapi.cfg) de configuration du BDE (alias public). Nous avons déjà évoqué le rôle de ce fichier dans la note technique relative au paramétrage de l'IDAPI. La solution consiste à utiliser le même fichier de configuration pour l'ensemble des postes devant accéder à l'environnement Paradox et à définir dans le fichier idapi.cfg (ou le nom que vous lui donnerez) les chemins associés aux alias. Un inconvénient, sensible si vous prévoyez de déployer votre application dans un environnement que vous ne connaissez pas, est la nécessité de définir des chemins absolus pour chaque alias. 
Définition des alias dans une table: La solution que nous développons ici repose sur une gestion totalement dynamique des alias par l'application elle-même. Pour cela, nous allons définir une table, que nous appelerons par exemple ALIAS.DB dans laquelle nous allons indiquer nos différents alias et leur localisation. Un script de démarrage de l'application (nous appelerons ce script DEBUT.SSL) aura pour fonction de charger en mémoire les alias. Un des avantages de cette solution est de pouvoir travailler avec des chemins relatifs (par rapport au répertoire où se trouve le script alias par exemple).
Nous évoquerons en fin de cette note quelques autres possibilités offertes par cette solution. 
Structure de la table ALIAS.DB: | Id_Alias | A10 ;Nom de l'alias | | Chemin_Alias | A64 ;Chemin relatif ou absolu de localisation de l'alias | | Description_Alias | F0 Texte documentaire | | Alias_Local | L Indicateur précisant que l'alias est local au poste de travail |

Dans l'exemple que nous allons prendre, les chemins relatifs seront exprimés par rapport à la localisation du script DEBUT (la table ALIAS est située dans le même répertoire que le script DEBUT). Nous préférons en effet cette solution à l'utilisation de l'alias TRAVAIL en raison du changement de nom de ce dernier selon les versions de Paradox (TRAVAIL ou WORK pour Paradox 10, les paris sont ouverts!). De la même façon, nous allons créer un alias que nous appelerons -MAITRE et correspondant à cette localisation de départ. Nous utiliserons systématiquement l'alias -MAITRE en lieu et place de TRAVAIL ou WORK pour éviter toute mauvaise surprise.
Remarque: Nous aimons bien commencer nos noms d'alias par un "-" car les alias ainsi nommés ne peuvent pas être créés autrement que par programmation; cela garantie des noms d'alias qui ne peuvent entrer en conflit avec un nom d'alias public (défini dans le fichier idapi.cfg de configuration du BDE).
Notre script va tout d'abord créer l'alias -MAITRE. 
; récupération du répertoire d'où est lancé le script
splitFullFileName(getFileName(), UniteST, CheminST, FichierST, ExtensionST) PathMaitreST = UniteST + CheminST CheminAliasST = getAliasPath(":-MAITRE:")+"\"
if CheminAliasST.isblank() then IF NOT addProjectAlias(":-MAITRE:", "STANDARD", PathMaitreST) THEN msgStop("Démarrage - Erreur de répertoire",
"L'alias :-MAITRE: n'a pu être créé sur le répertoire '"
+ PathMaitreST +"'.\nDémarrage impossible.") Return ENDIF else if not (CheminAliasST = PathMaitreST) then
if not setAliasPath(":-MAITRE:",PathMaitreST) then
msgStop("Démarrage - Erreur de répertoire",
"L'alias :-MAITRE: est déjà affecté et ne peut être modifié '"
+ CheminAliasST +"'.\nDémarrage impossible.")
Return
endif
endif endif

Le script ouvre ensuite la table ALIAS.DB et parcourt cette table en créant pour chaque enregistrement l'alias correspondant. Vous constaterez qu'il constitue le nom physique complet du répertoire associé à l'alias. Dans le cas d'un alias local, les chemins sont relatifs au répertoire privé. Si le répertoire local n'existe pas le script se chargera de créer le répertoire. 
IF NOT aliasTC.open(":-MAITRE:ALIAS.DB") THEN msgStop("Démarrage - Erreur de répertoire", "Le répertoire '" + PathMaitreST + "' ne contient pas la table ALIAS.DB" +"\nDémarrage impossible.") Return ENDIF scan AliasTC: pathAliasST = aliasTC.Chemin_Alias Switch Case pathAliasST.isBlank() :
pathAliasST = PathMaitreST Case pathAliasST.match("@:..") :; Absolu avec lettre de lecteur Case pathAliasST.match("\..") :; Absolu UNC Otherwise :; Relatif if AliasTC.Alias_Local then; il s'agit d'un alias local
pathAliasST = PrivDir()+"\"+AliasTC.Id_Alias il n'est pas utile ici d'indiquer un chemin IF NOT isDir(pathAliasST) then IF not FS.makedir(pathAliasST) then
msgStop("Démarrage
impossible",ErrorMessage()) return endif
endif else pathAliasST = PathMaitreST + pathAliasST endif EndSwitch IF NOT pathAliasST.match("..\") then
pathAliasST = pathAliasST + "\" ENDIF --- on vérifie que le répertoire existe if not isDir(pathAliasST) then msginfo("Pb alias","L'alias " + aliasTC.Id_Alias + " ne peut pas être créé,"
+ " le chemin " + pathAliasST + " n'existe pas") return endif ;---
Retirer l'alias au cas où un alias public de même nom aurait
été déclaré ce qui empêche la création de l'alias de projet OldPathST = upper(getAliasPath(aliasTC.Id_Alias)) If OldPathST.isBlank() Then; Alias n'existe pas If Not addProjectAlias(aliasTC.ID_ALIAS, "Standard", pathAliasST) Then
ErrorShow() EndIf else Alias existe If OldPathST.subStr(OldPathST.size()) <> "\" Then OldPathST = OldPathST+ "\"
EndIf NewPathST = upper(pathAliasST) If NewPathST.subStr(NewPathST.size()) <> "\" Then NewPathST = NewPathST + "\" EndIf
If NewPathST <> OldPathST Then il faut effacer l'ancien TRY RemoveAlias(aliasTC.ID_ALIAS) ONFAIL ErrorShow() ENDTRY
TRY RemoveProjectAlias(aliasTC.ID_ALIAS) ONFAIL ErrorShow() ENDTRY If Not addProjectAlias(aliasTC.ID_ALIAS, "Standard", pathAliasST) Then
ErrorShow()
EndIf EndIf
EndIf endscan
AliasTC.Close()

Quelques extensions à la description des alias par table 1) Si vous localisez vous objets distribués dans des répertoires différents de ceux des sources, rien n'empêche de gérer dynamiquement ce paramètre dans le script. Par exemple, si l'extension du script est SSL, vous utilisez le répertoire indiqué dans la table, en revance si l'extension est SDL, vous pouvez utiliser un sous-répertoire fonction par exemple de la version de Paradox que vous utilisez (716 pour Paradox 7 16 bits, 732 pour Paradox 32 bits, 832 pour Paradox 8, 932 pour Paradox 9) ;
2) Si vous utilisez des bases de données autres que Paradox ou Dbase, vous pouvez ajouter une zone Pilote qui précisera le type la base de données, les paramètres de connexion de chaque alias étant précisés dans une seconde table ;
3) Si vous souhaitez diminuer la charge de votre réseau, vous pouvez dupliquer localement les répertoires non modifiables en exploitation (les programmes en particulier). Vous ajouterez dans ce cas un indicateur pour repérer ce type d'alias et un champ DateTime permettant de dater le répertoire du serveur. Au chargement, si le répertoire local n'existe pas où si la date du répertoire local (date qui sera mémorisée dans une table ou un fichier local au poste) est antérieure à la date du serveur, le contenu du répertoire du serveur sera recopié localement ;
4) Si des alias de sont utilisés qu'en développement, vous pouvez éviter de charger ceux-ci en ajoutant un indicateur ;
5) Vous pouvez vérifier que l'alias pointe vers le bon répertoire en contrôlant la présence d'un fichier témoin dans celui-ci ;
6) Vous pouvez gérer les alias de toutes vos applications dans une même table et filtrer selon l'application que vous lancez ;
et bien d'autres possibilités en fonction de votre environnement de travail, de votre application et de votre imagination ...
Si cette solution peut paraître un peu longue la première fois, vous profiterez dès votre seconde application de la souplesse qu'elle procure, alors n'hésitez pas, gérer vos alias en table...

|