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

Delphi Discussion :

[D5] Créer dynamiquement des variables dans une fonction


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut [D5] Créer dynamiquement des variables dans une fonction
    Dans mon appli, je dois mettre à jour une Bdd sur feuille excel avec une extraction d’une autre Bdd sous forme d’une autre feuille excel.
    La base de donnée originale (celle à partir de laquelle je fais des extractions) est purgée régulièrement des données que son concepteur juge périmées.
    Hors mon processus intervenant « tardivement » il arrive que les données aient été purgées lorsque j’en ai besoin.
    Pour palier le problème, je fais des extractions hebdomadaires.
    Mais comme la base de donnée originale continue à vivre, il y a des données à mettre à jour sur ma base pour des enregistrements existants (j’espère que je suis clair jusque là !).
    Les extractions étant paramétrées manuellement, lors de l’intégration dans ma base je souhaite contrôler un minimum de choses, entre autres la présence des champs nécessaires (la base de donnée originale étant composée de plus de 200 champs et je n’en ai besoin que de 22).
    J’ai donc créer une fonction du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function VerifPresenceChamps(Liste: TStrings; Table: Variant; NbCol: Byte): Boolean;
    Dont les entrées sont :
    un TStrings contenant la liste des champs à recevoir.
    Un Variant contenant la ligne 1 de ma table excel (la liste des champs reçus)
    Un byte contenant le nombre de colonnes utilisées dans la table excel en entrée
    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
    Function VerifPresenceChamps(Liste: TStrings; Table: Variant; NbCol: Byte): Boolean;
    Var
       CptListe, CptTable : Byte;
       Trouve : Boolean;
       ChTbl, ChIEP : String;
    Begin
      Trouve := False;
      For CptListe := 0 to Liste.Count -1 do
      Begin
        ChTbl := Liste.Strings[CptListe];
        For CptTable := 1 to NbCol do
        Begin
          ChIEP := VarToStr(Table[1,CptTable]);
          If AnsiPos(ChTbl, ChIEP) <> 0 then  // Chaîne trouvée
          Begin
            Trouve := True;
            Break;
          End;
          If ((CptTable = NbCol) and  (Not Trouve)) Then
          Begin
            VerifPresenceChamps := False;
            Break;
          End;
        End;
      End;
      if Trouve then VerifPresenceChamps := True;
    End;
    Et la question ?
    J’y viens.
    Ma fonction est un TOR (Tout Ou Rien) et ne me satisfait pas.
    S’il manque un ou plusieurs champs elle me dit qu’il manque quelque chose mais sans préciser quoi.
    Voici donc ma question :
    Est t’il possible de créer dynamiquement autant de variables booléennes que nécessaire (dont le nombre est donné par Liste.count) et dans ce cas, au lieu de retourner un booléen, ma fonction renverra une liste afin de passer l’info sur ce qui manque.
    Précisions complémentaires :
    1-le contenu de liste est chargé depuis un fichier texte afin de palier aux variations de libellés de la base de donnée originale (je me suis déjà fais avoir) sans avoir à toucher au code.
    2-Je suis quasiment débutant (mais tout le monde s’en est déjà rendu compte).
    Merci.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par défaut
    un TBooleanDynArray (unit Types) pour faire l'affaire non ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut
    Citation Envoyé par ShaiLeTroll
    un TBooleanDynArray (unit Types) pour faire l'affaire non ?
    Je regarde dans F1 (je n'ai jamais utilisé çà), je fais quelques essais et je te rends compte
    Merci en attendant.

  4. #4
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Je te propose de passer en paramêtre non pas 1 mais 2 TstringList (à passer en VAR).
    Celle que tu as déja (Liste) et une autre où tu mets les résultats ('0' si pas OK et '1' si OK par exemple).
    DOnc du coup si ton resultat est à false tu vas voir dans ta TStringList d'où vient le pb.
    ....
    Je suis clair ?

  5. #5
    Membre éclairé Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut
    Citation Envoyé par philnext
    Je te propose de passer en paramêtre non pas 1 mais 2 TstringList (à passer en VAR).
    Celle que tu as déja (Liste) et une autre où tu mets les résultats ('0' si pas OK et '1' si OK par exemple).
    DOnc du coup si ton resultat est à false tu vas voir dans ta TStringList d'où vient le pb.
    ....
    Je suis clair ?
    Je répondais à ShaiLeTroll et ton message est arrivé entre temps.
    Je modifie la 2eme liste et je la retourne ensuite en lieu et place du booléen c'est bien çà?
    Je n'y aurais pas pensé, c'est simple et çà doit fonctionner.
    Quelques tests et je posterai résolu.
    Merci.

  6. #6
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Oui, j'aurais dit 'en plus' du boolean.
    L'avantage des tStringList c'est que tu peux aussi stocker des choses plus précises que '0' ou '1'. Notamment les pbs de changements de formats.

    D'autre part pour simplifier ton code tu as la Méthode IndexOf pour une tStringList.
    te renvoie -1 si Toto fait partie de la TStringList ou son index sinon.

  7. #7
    Membre éclairé Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut
    Citation Envoyé par philnext
    Oui, j'aurais dit 'en plus' du boolean.
    L'avantage des tStringList c'est que tu peux aussi stocker des choses plus précises que '0' ou '1'. Notamment les pbs de changements de formats.

    D'autre part pour simplifier ton code tu as la Méthode IndexOf pour une tStringList.
    te renvoie -1 si Toto fait partie de la TStringList ou son index sinon.
    Je ne connais pas cette méthode "IndexOf('Toto')" elle va m'interresser.
    Je viens de voir le "j'aurais dit 'en plus' du boolean" Un fonction peut retourner plus d'un Objet? comment fait-on?

    Je viens de tester la méthode que tu m'as indiqué plus tôt, et elle fonctionne parfaitement pour le renvoi et la récupération mais je ne peux libérer la mémoire. j'ai le message d'erreur suivant lorsque le compilateur arrive sur la ligne en rouge.
    EAccessViolation Violation d'accès à l'adresse 00000000. Lecture de l'adresse 00000000
    Voici mon code d'appel de la fonction
    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
    Try
      LChpsIE := Tstringlist.Create;
      LChpsIE := VerifPresenceChamps(LChamps, LChamps, vRangeIEP, NbCol);
      For CptTable := 0 to LChpsIE.Count -1 do
        If AnsiPos('=Absent', LChpsIE.Strings[CptTable]) <> 0 then  // Chaîne trouvée
          Memo1.Lines.Add('Dans la table Export : ' + LChpsIE.Strings[CptTable])
        Else Memo1.Lines.Add('Le champs : ' + LChpsIE.Strings[CptTable] +
                ' est présent dans la table Export');
    finally
      vXLClasTbl.Close;   
      vXLClasIEP.Close;  
      vMSExcel.DisplayAlerts := True ;               // message d'alerte en route
      vMSExcel.Quit;                                      // Ferme Excel
      VarClear(vMSExcel);                               // Variant effacé
      VarClear(vXLClasseurs);                          // Variant effacé
      VarClear(vXLClasTbl);                             // Variant effacé
      VarClear(vXLClasIEP);                             // Variant effacé
      VarClear(vFeuilTbl);                                // Variant effacé
      VarClear(vFeuilIEP);                                // Variant effacé
      LChamps.Free;                                       // Libération de la mémoire
      LChpsIE.Free; // Libération de la mémoire

  8. #8
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Euh..comme tout ton code n'est pas présent ce n'est pas évident...mais ce ne serait pas plutot sur le free de la ligne précédente qu'il y aurait le pb ? (on ne voit pas le create associé...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation des variables dans une fonction
    Par DeLorbe dans le forum Débuter
    Réponses: 6
    Dernier message: 05/02/2010, 10h50
  2. Utiliser des variables dans une fonction
    Par zugolin dans le forum Langage
    Réponses: 7
    Dernier message: 10/04/2009, 15h11
  3. déclaration des variables dans une fonction
    Par kawther dans le forum Débuter
    Réponses: 4
    Dernier message: 22/10/2008, 01h17
  4. Passer des variables dans une fonction
    Par Herlece dans le forum PL/SQL
    Réponses: 11
    Dernier message: 11/07/2008, 14h18
  5. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50

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