L'une des compagnies aériennes que j'utilise pourrait faire son profit des fonctions scalaires SQL. Ou plutôt, les clients de cette compagnie aérienne devraient en profiter ! Je vais démontrer comment par le récit d'une mésaventure et des exemples de l'une de mes fonctions scalaires favorites, Soundex, ajoutée dans la V4R5.
» à‡a ressemble à … » n’est pas simplement pour des charades
![» à‡a ressemble à … » n’est pas simplement pour des charades » à‡a ressemble à … » n’est pas simplement pour des charades](https://www.itpro.fr/wp-content/uploads/2015/05/b7349e4d83e9cc034d20ac79d69e90ea.jpg)
Récemment, je me suis rendu à l’aéroport pour prendre possession d’un billet que j’avais réservé. Malheureusement, l’agent au comptoir des billets n’a pas pu trouver ma réservation parce que l’agent de réservation avait mal orthographié mon nom. Il pouvait m’accepter sur le vol, mais pas au prix de la réservation : il m’en coûterait 3.000 francs de plus. Finalement, après avoir palabré avec l’agent et son supérieur pendant une heure et demi, j’ai obtenu mon billet (et gardé les 3.000 francs dans mon chéquier). Soundex aurait pu me faire gagner beaucoup de temps au comptoir des billets. C’est l’un des nombreux algorithmes qui créent une valeur de contrôle (hash) phonétique à partir d’une chaîne donnée. Dans le cas de Soundex, le » hash » est une valeur de quatre octets et les chaînes ayant un son similaire produisent la même valeur hash. Un simple
Select * From Reserves
Where Soundex(LastName) =Soundex("Guthrie")
aurait fourni toutes les réservations dans lesquelles le nom patronymique ressemblait phonétiquement à Guthrie. Si l'agent de réservation avait orthographié mon nom de manière assez proche, cette requête aurait trouvé ma réservation. L'algorithme Soundex suit un ensemble complet de règles pour obtenir la valeur hash. On pourrait certes écrire l'algorithme en RPG, mais au prix de centaines de lignes de code. La quantité et la complexité du code seraient source d'erreurs. Mais vous pouvez facilement mettre en oeuvre une recherche phonétique dans vos applications en utilisant les techniques que nous avons examinées. Vous pouvez appliquer Soundex dans vos applications en utilisant plusieurs méthodes. Par exemple, vous pouvez utiliser SQL pour l'application d'I/O ou utiliser l'I/O natif avec les méthodes décrites précédemment. Je montrerai une implémentation qui utilise DDS pour les définitions de bases de données et l'I/O natif, pour démontrer qu'il n'est pas indispensable de réécrire complètement les applications pour bénéficier des fonctions scalaires SQL.
La figure 3A montre DDS pour un exemple de fichier maître client, Customer. Cela représente le type de fichier que vous risquez de rencontrer dans vos applications. Je vais garder l'exemple Soundex simple et fournir des moyens de recherche phonétique par le nom patronymique uniquement. La figure 3B montre DDS mis à jour pour le fichier maître client. En A, j'ai ajouté le champ LastSound pour contenir la valeur hash que Soundex créera pour le nom. Bien entendu, vous devez modifier votre (vos) programme(s) de maintenance pour peupler ce nouveau champ. Cependant, les changements sont minimes. Insérez simplement le code de la figure 3C dans votre ou vos programme(s) de maintenance avant d'écrire dans le fichier Customer. Avec le hash phonétique stocké dans la base de données, vous pouvez facilement ajouter une recherche phonétique aux applications. Commencez par créer un fichier logique comme celui de la figure 3D. Notez que le fichier logique CustomerL1 a comme clé LastSound, LastName et FirstName. Dans la séquence phonétique, cette vue classe les enregistrements alphabétiquement par nom (last name), puis par prénom (first name). Aux fins de démonstration, j'ai inclus une routine de recherche phonétique légère. Mais, vous ne coderez pas votre routine de production de la même manière.
Le code fait plusieurs suppositions qui ne valent pas pour un environnement de production. Ainsi, le programme charge le sous-fichier entier. C'est bien si le sous-fichier ne contient que quelques enregistrements, mais s'il en contient davantage, attendez-vous à des performances médiocres. Le programme suppose également qu'une recherche trouvera toujours un enregistrement au moins. S'il ne trouve pas un enregistrement, le programme essaie d'afficher un sous-fichier vide et se " crashe ". Dans un enregistrement de production, il faut concevoir le programme de manière appropriée et ajouter une logique de traitement d'erreurs. La figure 3E montre DDS pour le fichier écran CustSrch, qui affiche les enregistrements trouvés par la recherche phonétique. Le programme CustSrch (figure 3F) exécute la recherche phonétique. Il accepte un paramètre d'entrée unique : le nom patronymique à rechercher phonétiquement. La section principale du code définit la clé partielle CustKey, que le programme utilise pour lire le fichier logique CustomerL1 pour extraire les enregistrements présentant une correspondance phonétique sur le nom. Ensuite, le programme utilise la fonction scalaire Soundex pour stocker la valeur hash phonétique du nom (last name) fournie comme un paramètre d'entrée dans la variable hôte LastSound. Notons que cette variable constitue la clé partielle CustKey. Après quoi, le programme efface le sous-fichier, fait une boucle dans les enregistrements clients avec la valeur hash calculée, et les charge dans le sous-fichier. Une fois qu'il a chargé tous les enregistrements clients appropriés, il affiche le sous- fichier. Le programme continue à afficher le sous-fichier jusqu'à ce que l'utilisateur appuie sur F3 pour sortir.
Téléchargez cette ressource
![Guide inmac wstore pour l’équipement IT de l’entreprise](https://www.itpro.fr/wp-content/uploads/2024/04/Guide-inmac-wstore-Juillet-2024.jpg)
Guide inmac wstore pour l’équipement IT de l’entreprise
Découvrez les dernières tendances et solutions IT autour des univers de Poste de travail, Affichage et Collaboration, Impression et Infrastructure, et notre nouveau dossier thématique sur l’éco-conception et les bonnes pratiques à adopter pour réduire votre impact environnemental.