HDAPI en C/C++


Présentation Générale

Utilisation d'HDAPI en : [C/C++] [ Delphi] [Visual Basic]


///////////////////////////////////////////////////////////////////////////
// HD_export
///////////////////////////////////////////////////////////////////////////
// 16/04/2002
//
// Copyright (c) 2002, E. Ravon (Bat)
//
// Auteur : manu_bat_manu@yahoo.fr
//
// Export simple des données d'HD
//
// Ce code est un exemple d'accès en C aux données du logiciel HelloDOC
// Il utilise la bibliothèque HDAPI.
//
// Ce code a été développé pour HelloDOC Étendu 4.56.116
// Ainsi que pour la version d'hdapi.h associée.
//
// Il a été testé avec HD 4.56 étendu et HDES
// Son fonctionnement n'est pas garanti avec des versions plus récentes d'HD
//
//
// HelloDOC est développé par Imagine Éditions.
// Windows est une marque de Microsoft Corporation
////////////////////////////////////////////////////////////////////////////


Export de l'agenda, des recettes, des biologies.
Exemple d'import/export des posologies (corrigé le 15/07/03)
Nouveau => exemple d'export des dossiers

Version
Fichier(source + exécutable)
HD v 4.56-v 4.57 HD_Export4.5.zip
HD v 5.0.6862 min HD_Export.zip

 


Comment compiler HD_Export ?


Version exécutable (HD_Export.exe)

HD_Export.exe - Fenêtre principale

  • Au lancement, il prend le dernier cabinet ouvert.
  • On peut changer de chemin/cabinet par le bouton "choisir".
  • Les paramètres du cabinet sont sauvegardés en BDR (sauf le mot de passe), il sont donc repris à l'ouverture suivante.
  • Un bouton "Exporter Agenda" qui réalise l'export (dans le fichier agenda.exp.txt) de la manière suivante :
    • Export des enregistrements (rendez-vous) de l'utilisateur en cours.
    • L'export commence à la date du jour et se poursuit jusqu'à la fin de l'agenda.
    • Une ligne par enregistrement d'Agenda
    • Format de la ligne
      • JJ/MM/AAAA HH:MM [V] Nom_Patient Prénom_Patient Texte
      • [V] est présent si il s'agit d'une visite
  • En lançant avec le paramètre '/A' l'export est automatique.
  • Un bouton "Exporter Recettes" qui réalise un export (dans le fichier recette.exp.txt) de toute les recettes du cabinet (demande de confirmation avant de continuer). L'ensemble des éléments de chaque recette est détaillé. Quelques commentaires sont ajoutés
  • Un bouton "Exporter Biologies" qui réalise un export (dans le fichier biologie.exp.txt) des biologies du patient donné par 'Nom' et 'Prénom'. Cet exemple montre comment retrouver le N° de fiche du patient puis comment extraire les données des enregistrements à longueur variable.
  • Un bouton "Exporter Posologies" qui réalise un export (dans le fichier posologie.exp.txt) des posologies de chaque médicament, au format suivant :
    • N°CIP;nom_du_médicament;posologie
    • Cet exemple montre un interfaçage (extrêmement basique) avec le Vidal (VCD ou TVS). Cet interfaçage n'utilise pas le Kit de développement Vidal.
  • Un bouton "Importer Posologies" qui réalise un import (depuis le fichier posologie.imp.txt) des posologies. Cet import crée dans le répertoire courant les fichiers HDPosologies.hdi et HDPosologies.hdd qui peuvent ensuite être recopiés dans HelloDOC
  • Un bouton "Importer Posologies dans HD" qui réalise un import (depuis le fichier posologie.imp.txt) des posologies. Cet import est effectué directement dans les fichiers d'HelloDOC

Sources

  • main.c
  • process.c
  • config.c

    main.c,main.h

    • Point d'entrée WinMain
    • Callback Main_Dlg appelé à chaque événement (appui sur un bouton, création de la boite, etc).
    • aff_config qui affiche la configuration dans les trois zones de texte.
    • aff_erreur qui affiche les erreurs.
      • A noter dans WinMain : HDOpenSession(TRUE) et HDCloseSession()

      A faire avant tout accès aux données HD. Le paramètre TRUE sert à dire "ouverture en mode réseau". Ce qui permet d'accéder aux données en même temps qu'HD est ouvert.

config.c et config.h

    • Contiennent les données de configuration (typdef struct {...}CONFIG)
    • Fonctions pour lire (lit_config()) et écrire (ecrit_config()) en BDR (Base De Registre)
    • open_fic,close_fic,read_line, sont 3 fonctions basiques permettant de lire un fichier texte ligne par ligne.

process.c et process.h

    • Fonction pour choisir le cabinet (hd_conf_cabinet(..))
    • Fonction pour exporter l'agenda (hd_export_agenda(...))
    • Fonction pour exporter les recettes (hd_export_recette(...))
    • Fonction pour exporter les biologies (hd_export_biologie(...))
    • Fonction pour exporter les posologies (hd_export_posologie(...))
    • Fonction pour importer les posologies (hd_import_recette(...))

     

La fonction "hd_export_agenda(...)"

    Elle commence par ouvrir le fichier Agenda : OpenAgendas(NULL);

    Cette fonction retourne un "handle" sur une zone mémoire. Cette zone mémoire n'est pas fixe, c'est à dire que Windows peut la bouger à loisir (la mettre sur le disque, la déplacer, etc). Il est donc nécessaire d'obliger Windows à la fixer (locker) par GlobalLock();
    De même une fois fini, il sera nécessaire de lui dire qu'il peut recommencer à en faire ce qu'il en veut par GlobalUnlock();

    La fonction fait de même avec le fichier Patients, car celui ci sera nécessaire par la suite.
    La fonction ferme enfin les fichiers : CloseAgendas(...); , ...

Si toutes les ouvertures sont correctement réalisées, la fonction "traite_agenda(...)" est appelée

Elle ouvre un fichier sur le disque CreateFile(...)
Elle crée ensuite une clé d'accès (MakeAgendas1Key(...)). Cette clé d'accès va permettre de 'parcourir' (lire les éléments les uns après les autres), dans l'ordre souhaité.
Cette clé est de type AGENDAS1X, le premier paramètre est le nom d'utilisateur, suvi de la date de l'élément dans l'agenda suivi de l'heure.
Cette clé indique qu'on va parcourir le fichier Agenda, selon l'ordre des utilisateurs, puis ensuite l'ordre des dates, puis l'ordre des heures.

Exemple de parcours suivant utilisateur-date

  • [Utilisateur] [Date] [Heure]
  • Pierre 05/04 13:15
  • Pierre 05/04 18:15
  • Pierre 15/04 13:15
  • Vincent 02/04 11:00

En utilisant un autre type de clé, on aurait pu parcourir le fichier selon d'autres critères.
On construit cette clé en indiquant l'utilisateur actuel, la date du jour et l'heure 00:00.
On parcourt ensuite le fichier par HDBrowseKey(...), on lui indique le type de clé (type AGENDA1X) et la clé elle même. La fonction va retourner une position dans le fichier.

Il est à noter que l'enregistrement [utilisateur] [date du jour] 00:00 n'existe probablement pas. HDBrowseKey(...)va prendre l'enregistrement suivant disponible. On aurait utilisé HDFindKey(...), cette fonction aurait recherché un enregistrement exact et n'aurait rien retourné si il n'existait pas.

On part ensuite dans une boucle, qui va durer tant que l'on trouve des données correctes.

while (index){
}

On lit l'enregistrement par HDReadRec(...);
On vérifie que cet enregistrement appartient toujours au bon utilisateur. Il ne faut pas oublier que l'on parcourt le fichier dans l'ordre des utilisateurs, puis des dates puis des heures. Une fois l'ensemble des heures écoulées pour une journée, on passe à la journée suivante. De même une fois l'ensemble des journées écoulées on passe à l'utilisateur suivant. Il faut donc s'arrêter à temps. On teste que le nom de l'utilisateur est toujours le bon, si il n'est pas bon, on a fini et donc, on met index à 0, ce qui fera sortir de la boucle.

Si l'enregistrement est correct, on enregistre les données dans un fichier (wsprintf(...) et WriteFile(...) ).
On ne dispose pas du nom du patient, mais de son N° de fiche. C'est pour cela qu'il était nécessaire d'ouvrir le dossier Patients aussi.

Faut-il recréer une clé de recherche sur le patient (MakePatientsxKey) en chercher la représentation exacte (HDFindKey(...)) et ensuite lire l'enregistrement ?
Non il y'a plus simple dans ce cas : ReadPatients (...)
Cette fonction va lire un enregistrement Patient, selon un critère (ici PATIENTS_BY_REC), c'est à dire qu'elle va retourner l'enregistrement correspondant au N° de fiche donné en entrée.

On a alors toutes les informations nécessaires, il ne reste plus qu'à se déplacer à la clé suivante par HDNextKey(...);