IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

HyperFileSQL Discussion :

Interface Delphi - HF7


Sujet :

HyperFileSQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je suis actuellement en train de travailler sur un projet devant réaliser l'interface entre une base de donnée HF7 (sous windev) et l'utilisateur en utilisant
    Delphi6 comme moyen de communication avec la base de donnée.
    Ce projet permet de remplacer une interface développé en pascal permettant la communication avec une base de donnée HF3.


    Pour y parvenir, j'ai donc repris la philosophie du projet développé en Pascal. Cependant, j'ai un problème lorsque j'utilise
    les fonctions hlit, hajoute... fournies par les biblio de delphi. Le problème est que l'utilisation de la fonction hlit semble modifier la valeur
    du pointeur contenant l'adresse du fichier dans lequel l'enregistrement va être placé.

    De plus, une fois cette procédure exécutée, Les procédures suivantes ne le sont plus.
    (procédure permettant de recopier l'enregistrement dans un fichier temporaire).

    Voici mon code source. (je n'ai pas fait figurer le code permettant l'initialisation a la base générée par windev lors de la génération
    de l'analyse.)

    D'avance Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    program test_Hlit;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils,
      wdhf;
     
     
    type
     
    TypeED=record //  Type venant du fichier "EDIT.pas"
        case byte of
        0:(
             hactif: char;
             rang: integer;
             ecretmin: real;
             ecretmax: real;
             unites:array [1..4] of byte;
             coeff:array [1..4] of real;
             optioned:array [1..4] of byte;
             optiontx:array [1..4] of integer;
             valusu1: real;
             valusu2: real;
             edchamps1: string[12];
             edchamps2: string[12];
             edchamps3: string[12];
             edchamps4: string[12];
         );
    end;
     
    //------------------------------------------------//
     
    var
        recordFile : file;       // fichier recevant l'enregistrement
        size : integer;          // taille de l'enregistrement
        ptrRecord : pointer;     // pointeur contenant l'adresse du recordFile
        recno : integer;         // numéro d'enregistrement
        ED: TypeED;              // type d'enregistrement utilisé
        ficTransfert : string;   // nom du fichier de transfert
    const
    nomficTransfert = 'trans.bin';
    nomfic = 'EDIT'; // fichier dans lequel on va récupérer les informations (edit.fic)
    //------------------------------------------------//
     
     
    (* --------------------------------------------------------------------------
     *  function SetRecordParam
     *                          renvoie true si la table demandée est valide.
     *
     *  Description : cette fonction affecte la taille du record, ainsi qu'un
     *                pointeur vers ce record suivant la table demandée
     *  Entrees     : nomfic : nom du fichier de la base (= nom de la table)
     *  Sorties     : size : taille de la structure de donnée associée à la table
     *                ptrRecord : pointeur vers le record associé à la table
     *
      --------------------------------------------------------------------------- *)
     
    function setRecordParam(nomfic : string;
                             var size : integer;
                             var ptrRecord : pointer): boolean;
    var fichierConnu : boolean;
    begin
    fichierconnu:=true;
         if (nomfic='EDIT') then
         begin
            size:= sizeof(typeED);
            ptrRecord := Addr(ED);
         end
         else
         begin
             fichierConnu := false;
         end;
         SetRecordParam := fichierConnu;
    end;
     
     
     
    (* --------------------------------------------------------------------------
     *  procedure ReadAndCopyToRecord
     *
     *  Description : Ouvre le fichier recordFile, en lit le contenu, l'écrit dans
     *                ptrRecord^ puis ferme le fichier.
     *  Entrees     : RecordFile : fichier utilisé pour transmettre un record
     *                ptrRecord : pointeur vers le record associé à la table
     *                size : taille de la structure de donnée associée à la table
     *
      --------------------------------------------------------------------------- *)
    procedure ReadAndCopyToRecord(VAR RecordFile : File; ptrRecord : pointer; size : integer);
     
    var
       i : integer;
    const
       ntentative = 10;
    begin
         i := 1;
       {$IOChecks Off}
        repeat                        {on essaye d'ouvrir le fichier plusieurs fois}
              sleep(1);               {avec un delai, car il faut que le fichier   }
              Reset(RecordFile,size); {soit crée par l'executable dos              }
              Inc(i);
        until (IOResult = 0) or (i > ntentative);
       {$IOChecks On}
        if(i > ntentative) then
        begin
             writeln('erreur ouverture du fichier de transfert');
        end;
    //begin
     
        Reset(RecordFile,size);
        BlockRead(recordFile,ptrRecord^,1);
        Close(recordFile);
     
    end;
     
    //---------------------------------------------------------------------------//
    //---------------------------------------------------------------------------//
     
     
    procedure GeneriqueLectureHF(VAR recordFile : file;
                                 ptrRecord : pointer;
                                 size : integer );
     
     
    begin
    recno:=1;
     
    hlit(nomfic+'.fic',recno);
         //permet de se positionner dans la base pour y effectuer la lecture.
     
         // le problème se situe ici ou le programme n'exécute pas la fonction ReadAndCopyToRecord
         // la valeur de ptrRecord est nil depuis que l'on a utilisé la fonction wdhf.hlit
    ReadAndCopyToRecord(recordFile,ptrRecord,size); {copie du résultat dans le record corrrespondant}
     
    end;
     
     
    //---------------------------------------------------------------------------//
    //---------------------------------------------------------------------------//
     
    ///// PROGRAMME PRINCIPAL /////
     
    begin
     
    fictransfert:=getcurrentdir+'\'+nomficTransfert;
    Assign(recordFile,ficTransfert);
    // on assigne le nomficTransfert (trans.bin) au fichier recordfile
     
    if(setRecordParam(nomfic,size, ptrRecord)) then
       begin
            GeneriqueLectureHF(recordFile, ptrRecord, size);
       end
       else
       begin
       writeln('nom de fichier inconnu');
       end;
    ;
    end.
    L'erreur ne vient pas uniquement de cette partie de code étant donné que depuis ce matin, j'ai découvert que l'utilisation de la biblio (.dll) fournie par windev n'est pas suffisante et qu'il faut ouvrir et initialiser la connexion avec la base pour parvenir à dialoguer avec celle-ci.

    WinDev propose de générer un fichier pascal/delphi permettant de réaliser cette connexion automatiquement à partir de l'analyse de la base qui est faite depuis windev (analyse --> génération avancée --> programmation avec un autre langage...) cette action permet ainsi de générer un fichier au format .pas ainsi qu'un fichier .h permettant d'initialiser la connexion a la base (fonction Hinit). Cependant, l'execution de ce programme (sans que j'y ajoute quoi que ce soit) me renvoie l'erreur :"Erreur d'initialisation du contexte HF".

    Quelqu'un a-t-il déja rencontré ce type d'erreur ?
    Comment y palier ?

    D'avance merci.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Orientez vous plutot vers un accès ODBC sur HyperFile (fourni sur le site de PCSoft).

  3. #3
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    En fait il y a deux techniques pour accéder à HF :
    - celle que vous utilisez : Langages Externes. Je l'ai utilisé en C mais pas de retour en delphi.
    - celle que vmolines préconise : ODBC. Si c'est de l'HF7 l'odbc était en lecture seule je pense.

    Maintenant une question :
    - Pourquoi développez en Delphi pour accèder à la base HF7 ? Sachant que vous avez une version de WD7 ?

    Le mieux serait Delphi - Autres SGBD (migration HF7 vers votre base obligatoire) ou WinDev - HF7 (plus besoin de Delphi alors)
    Emmanuel Lecoester
    => joomla addict.

Discussions similaires

  1. Interface Delphi 6 et BDD HF7 (windev)
    Par simplyDje dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/11/2008, 15h52
  2. Interfacer Delphi avec Prolog
    Par moi89 dans le forum Outils
    Réponses: 1
    Dernier message: 11/04/2008, 21h32
  3. Sauvegarde sur interface delphi
    Par Seuh.m dans le forum Delphi
    Réponses: 1
    Dernier message: 18/07/2007, 21h52
  4. problème utilisation interfaces delphi
    Par desperado dans le forum Delphi
    Réponses: 5
    Dernier message: 13/11/2006, 16h23
  5. Réponses: 2
    Dernier message: 30/03/2006, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo