Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Discussion: Type Record avec Case

  1. #1
    Membre Expert Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : août 2008
    Messages : 1 527
    Points : 1 024
    Points
    1 024

    Par défaut Type Record avec Case

    Bonsoir à tous,

    je cherche un moyen de regrouper la partie InRecord, je voudrais pouvoir mettre autant de param et de type que je veux.

    comment le déclarer ?
    comment l'exploiter ensuite ?

    Code :
    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
    Type
      EnumTravaux=(CreateTable, CreateChamp, EditChamp, RecordSupprimer, RecordModifier, RecordInsert);
      EnumPriorite=(Obligatoire, Recommandé, Information);
      EnumOperation=(InTable,InChamp,InRecord);
     
    type
      TTravaux = Record
        Travaux       : EnumTravaux;
        Priorite      : EnumPriorite;
        MessageTravaux: String;
        Case Operation : EnumOperation of
          InTable:(
              NomDeLaTable: String[255];
              RequeteCreatetable: String[255]
                  );
          InChamp:(
              NomDuChamp: String[255];
              RequeteCreateChamp: String[255];
              RequeteEditChamp: String[255]
                  );
          InRecord:(
              RequeteRecord : String[255];
              TypeParam1    : TFieldType;
              Params1       : Variant;
              TypeParam2    : TFieldType;
              Params2       : Variant;
              TypeParam3    : TFieldType;
              Params3       : Variant;
              TypeParam4    : TFieldType;
              Params4       : Variant;
                   );
     
      End;
    @Merci pour vos remarques.

  2. #2
    Membre Expert Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : août 2008
    Messages : 1 527
    Points : 1 024
    Points
    1 024

    Par défaut

    Bon j'en suis là

    Code :
    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
    Type
      EnumTravaux=(CreateTable, CreateChamp, EditChamp, RecordSupprimer, RecordModifier, RecordInsert);
      EnumPriorite=(Obligatoire, Recommandé, Information);
    //  EnumOperation=(InTable,InChamp,InRecord);
     
    type
      TTravaux = Record
    //    Travaux       : EnumTravaux;
        Priorite      : EnumPriorite;
        MessageTravaux: String;
     
        TypeParamValue1 : TFieldType;
        ParamsValue1    : Variant;
        TypeParamValue2 : TFieldType;
        ParamsValue2    : Variant;
     
        TypeParamWhere3 : TFieldType;
        ParamsWhere3    : Variant;
        TypeParamWhere4 : TFieldType;
        ParamsWhere4    : Variant;
        Case Travaux : EnumTravaux of
          CreateTable:(
              NomDeLaTable: String[255];
              RequeteCreatetable: String[255]
                  );
          CreateChamp,EditChamp:(
              NomTable: String[255];
              NomChamp: String[255];
              RequeteCreateChamp: String[255];
              RequeteEditChamp: String[255];
                  );
          RecordSupprimer, RecordModifier, RecordInsert:(
              RequeteRecord : String[255];
                   );
     
      End;

  3. #3
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 544
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 544
    Points : 15 826
    Points
    15 826

    Par défaut

    je n'ai pas bien compris mais pourquoi pas un Array[0..MaxParam] of TTypeParam;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  4. #4
    Membre émérite Avatar de Montor
    Homme Profil pro
    Inscrit en
    avril 2008
    Messages
    863
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : avril 2008
    Messages : 863
    Points : 891
    Points
    891

    Par défaut

    la finalisation est obligatoire

  5. #5
    Membre Expert Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : août 2008
    Messages : 1 527
    Points : 1 024
    Points
    1 024

    Par défaut

    Citation Envoyé par Paul TOTH Voir le message
    je n'ai pas bien compris mais pourquoi
    Je suis en train de faire mon utilitaire de maintenance pour mes bases de données.

    Donc en partant de cela

    Code :
    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
    Type
      EnumTravaux=(CreateTable, CreateChamp, EditChamp, RecordSupprimer, RecordModifier, RecordInsert);
      EnumPriorite=(Obligatoire, Recommandé, Information);
    //  EnumOperation=(InTable,InChamp,InRecord);
     
    type
      TTravaux = Record
    //    Travaux       : EnumTravaux;
        Priorite      : EnumPriorite;
        MessageTravaux: String;
     
        TypeParamValue1 : TFieldType;
        ParamsValue1    : Variant;
        TypeParamValue2 : TFieldType;
        ParamsValue2    : Variant;
     
        TypeParamWhere1 : TFieldType;
        ParamsWhere1    : Variant;
        TypeParamWhere2 : TFieldType;
        ParamsWhere2    : Variant;
        Case Travaux : EnumTravaux of
          CreateTable:(
              NomDeLaTable: String[255];
              RequeteCreatetable: String[255]
                  );
          CreateChamp,EditChamp:(
              NomTable: String[255];
              NomChamp: String[255];
              RequeteCreateChamp: String[255];
              RequeteEditChamp: String[255];
                  );
          RecordSupprimer, RecordModifier, RecordInsert:(
              RequeteRecord : String[255];
                   );
     
      End;
    Et de cela :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    var
      FControlBase: TFControlBase;
      aTravaux      : Array of TTravaux;
      CompteurDeTravaux: Integer;
     
    implementation
     
    Uses
    Voici un exemple de travaux à faire après lecture d'un champs spécifique :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
                      Inc(CompteurDeTravaux);
                      SetLength(aTravaux,CompteurDeTravaux);
                      LogPlg( ' # Erreur [CodeTiers inexistant] - Table : '+Tbl.TableName+
                              ' - Enregistrement : '+ Tbl.FieldByName('NumeroLigne').AsString+
                              ' - Travaux : ' + GetEnumName(TypeInfo(EnumTravaux),integer(RecordModifier))+
                              ' - Priorité : ' + GetEnumName(TypeInfo(EnumPriorite),integer(Obligatoire)));
                      With aTravaux[CompteurDeTravaux-1] do
                      begin
                        Priorite        := Obligatoire;
                        MessageTravaux  := '';
                        Travaux         := RecordModifier;
                        RequeteRecord   := 'Update DOC Set CodeTiers= :xValue1, TypeTiers= :xValue1 Where (CodeTiers= :xWhere1) And (TypeTiers= :xWhere2) ';
                        TypeParamValue1 := ftString;
                        ParamsValue1    := '';
                        TypeParamValue2 := ftString;
                        ParamsValue2    := '';
     
                        TypeParamWhere1 := ftString;
                        ParamsWhere1    := Tbl.FieldByName('CodeTiers').AsString;
                        TypeParamWhere2 := ftString;
                        ParamsWhere2    := Tbl.FieldByName('TypeTiers').AsString;
    Donc je mémorise les travaux à faire, pour ensuite les réaliser tous ou non.
    Mais cela m'ennuie d'écrire :
    TypeParamValue1 := ftString;
    ParamsValue1 := '';
    TypeParamValue2 := ftString;
    ParamsValue2 := '';


    J'aurai aimé un truc du genre
    Code :
    1
    2
    TypeParamValue := [fttring,ftString];
    ParamsValue : =['',''];
    Mais même si je fais cela, lorsque je vais lancer réellement les travaux, je dois arriver à lire le nombre de param genre TypeParamValue.Count, pour ensuite les remplacer dans RequeteRecord

    Pour ta proposition, je vois pas l'intérêt dans mon cas, à moins que je me trompe.

    En claire, est-ce que je peux simplifier ?

    Merci

  6. #6
    Membre Expert Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 299
    Points
    1 299

    Par défaut

    pourquoi ne pas travailler avec un objet ?
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Membre Expert Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : août 2008
    Messages : 1 527
    Points : 1 024
    Points
    1 024

    Par défaut

    Citation Envoyé par Dr.Who Voir le message
    pourquoi ne pas travailler avec un objet ?
    Salut Who, tout simplement car je ne sais pas comment le faire...

    J'ai mis en place ce que j'ai décris si dessus, et je viens de me rendre compte que :

    NomDeLaTable: String[255]; et NomTable: String[255];, prennent exactement la même valeur que RequeteRecord : String[255]; !!! bizzard... alors que je ne valorise que RequeteRecord...


  8. #8
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 544
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 544
    Points : 15 826
    Points
    15 826

    Par défaut

    Citation Envoyé par BuzzLeclaire Voir le message
    Salut Who, tout simplement car je ne sais pas comment le faire...

    J'ai mis en place ce que j'ai décris si dessus, et je viens de me rendre compte que :

    NomDeLaTable: String[255]; et NomTable: String[255];, prennent exactement la même valeur que RequeteRecord : String[255]; !!! bizzard... alors que je ne valorise que RequeteRecord...

    ça n'est pas bizarre, c'est le but de Record avec Case les différents cas se superposent en mémoire, comme tu les commences tous par un String[255] la chaîne est en fait la même sous trois nom différents. Tu pourrais tout aussi bien sortir la chaîne du CASE

    dans l'exemple ci-dessous la structure occupe 4 octets car Integer est la structure la plus large et elle fait 4 octets, AsByte occupe le premier octet de AsInteger, AsWord les deux premiers...on peut d'ailleurs aussi utiliser des array (cas 4 et 5)
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
      TNumber = record
        case Byte of
           1 : AsByte: Byte;
           2 : AsWord: Word;
           3 : AsInteger: Integer; 
           4 : AsBytes: array[0..3] of Byte;
           5 : AsWords: array[0..1] of Word;
           6 : record a, b, c, d : Byte end;
        end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •