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

Composants FMX Delphi Discussion :

Comment enregistrer un record dans un clientdataset dont le nombre de champs peut varier


Sujet :

Composants FMX Delphi

  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 212
    Par défaut Comment enregistrer un record dans un clientdataset dont le nombre de champs peut varier
    Bonjour,

    J'ai un clientdataset dont une partie des champs est fixe et une autre partie dont le nombre peut changer en fonction de la situation:

    exemple: ID, Nom, Prénom, adresse, droit1, droit2,..., droit i

    1. Au démarrage de l'app, je crée mon clientdataset en fonction du nombre de champ voulu

    2. Problème: Quand je veux y enregistrer un record en mettant une valeur par défaut avec un ClientDataser1.AppendRecord([...]

    Normalement, le code va avoir une forme du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClientDataser1.AppendRecord([ID, 'Toto', 'Marcel', 'Rue de la Gare', 'valeur droit1',...'valeur droit i']);
    Mais c'est pas dynamique! Je me suis donc dit: Tu fabriques un string en fonction du nombre variable de champ et tu l'insert dans la commande AppendRecord du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     str:='1, ''Toto'', ''Marcel'', ''Rue de la Gare'',1, 2,3, 4, 5, 6';
     ClientDataser1.AppendRecord([str];
    Pas de problème à la compilation mais cela plante au running: J'ai une exception " '1, 'Toto', 'Marcel', 'Rue de la Gare',1, 2,3, 4, 5, 6 " n'est pas une valeur valide pour {Nom du premier champ du clientdataset} "... Delphi prend mon string comme étant simplement la valeur du premier champ du record... A remarquer qu'il garde l'apostrophe au début du string mais ne prend pas en compte l'apostrophe qui termine le string?!?!?

    Est-ce que quelqu'un a une idée pour résoudre mon problème?

    Merci

  2. #2
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 453
    Par défaut
    En utilisant un tableau dynamique

    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
    var
      Values: array of Variant;
    begin
      // Dimensionner le tableau pour correspondre au nombre de champs du ClientDataSet
      SetLength(Values, ClientDataSet1.FieldCount);
     
      // Affecter les valeurs pour les champs fixes
      Values[0] := 1;                // Par exemple, champ ID
      Values[1] := 'Toto';           // Nom
      Values[2] := 'Marcel';         // Prénom
      Values[3] := 'Rue de la Gare'; // Adresse
      // Ect.......................
     
      // Insérer le record en une seule passe
      ClientDataSet1.AppendRecord(Values);
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 212
    Par défaut
    Citation Envoyé par XeGregory Voir le message
    En utilisant un tableau dynamique

    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
    var
      Values: array of Variant;
    begin
      // Dimensionner le tableau pour correspondre au nombre de champs du ClientDataSet
      SetLength(Values, ClientDataSet1.FieldCount);
     
      // Affecter les valeurs pour les champs fixes
      Values[0] := 1;                // Par exemple, champ ID
      Values[1] := 'Toto';           // Nom
      Values[2] := 'Marcel';         // Prénom
      Values[3] := 'Rue de la Gare'; // Adresse
      // Ect.......................
     
      // Insérer le record en une seule passe
      ClientDataSet1.AppendRecord(Values);
    end;
    1.
    Merci pour l'idée mais...en la testant, je constate que cela ne fonctionne pas: Delphi 12 indique à l'édition de la ligne "ClientDataSet1.AppendRecord(Values)": Types incompatibles: "Array of TVarRec" et "Dynamic Array"

    AppendRecord semble exiger comme paramètre un "Array of const"


    2. Je remplace la ligne de code par un "ClientDataSet1.AppendRecord(TValueArrayToArrayOfConst(myValues));" avec la variable myValues qui n'est plus un "Array of Variant" mais un "Array of TValue" >>> Delphi 12 accepte de compiler le code mais c'est au démarrage de l'application que cela plante avec comme message d'erreur "Transtypage de classe incorrect"

    3. Je passe d'une question à l'autre: Est-il possible de convertir un Dynamic Array en Array of TVarRec?

  4. #4
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 453
    Par défaut
    Utilise Append pour insérer dynamiquement un enregistrement dans un ClientDataSet, champ par champ, à partir d’un tableau dynamique

    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
     
    uses System.Variants;
     
    //......
     
    var
      i: Integer;
      Values: array of Variant;
    begin
      // Remplir dynamiquement le tableau avec les valeurs des champs
      SetLength(Values, ClientDataSet1.FieldCount);
      Values[0] := 1;
      Values[1] := 'Toto';
      Values[2] := 'Marcel';
      Values[3] := 'Rue de la Gare';
      // etc...
     
      ClientDataSet1.Append;
      for i := 0 to ClientDataSet1.FieldCount - 1 do
      begin
        if not VarIsEmpty(Values[i]) then
          ClientDataSet1.Fields[i].Value := Values[i];
      end;
      ClientDataSet1.Post;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 925
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je lis ici qu'un array of const est un array of TVarRec.

    Ça oblige à dimensionner le tableau et fixer le type de chaque élément, mais s'ils sont tous du même, ça n'alourdira pas trop le code.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    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 081
    Par défaut
    Pourquoi ne pas stocker un XML, un JSON ou un autre format pour la partie volatile ?
    Tu ne pourras pas avoir des enregistrements avec un nombre de colonne variable avec un DataSet

    Tu peux cependant crééer un TClientDataSet contenant une colonne binaire ou XML
    Cette colonne contient elle même un autre TClientDataSet


    Tu peux aussi voir ce que donne un TArrayField
    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

Discussions similaires

  1. [MFC/vs2005] Comment enregistrer un CString dans CFile?
    Par hiko-seijuro dans le forum MFC
    Réponses: 4
    Dernier message: 17/05/2006, 08h58
  2. Comment enregistrer une string dans un fichier
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/09/2005, 14h52
  3. Réponses: 12
    Dernier message: 27/06/2005, 19h06
  4. Réponses: 16
    Dernier message: 22/03/2005, 21h57

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