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

Bases de données Delphi Discussion :

J'ai besoin de mettre numérotation dans le composant DBGrid selon certaines conditions


Sujet :

Bases de données Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut J'ai besoin de mettre numérotation dans le composant DBGrid selon certaines conditions
    bonjour
    version utilisé delphi7 avec base de donnee absolute database
    J'ai une table se compose de Sept Champs
    Ils sont comme suit
    art de type string et indexée
    chp de type string et indexée
    cde de type smallint
    nom de type string
    prenom de type string
    MT1 de type float
    MT2 de type float

    Numérotation dans le champ de 'Cde'
    Changé chaque fois que la valeur du champ 'chp' changé
    Chaque fois qu'un champ du changement 'chp' commencer la numérotation de 1 à une autre valeur qui est le champ de l'art et le champ de chp
    Si le champ de l'art et le nombre récurrente champ chp est nécessaire dans le champ de Cde reproduire n'importe laquelle de la même figure que dans l'image
    N.B:
    Doit être l'un des deux champs MT1 et MT2 contiennent à une valeur supérieure à 0

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 664
    Points : 25 458
    Points
    25 458
    Par défaut
    Aurais-tu déjà du code à nous proposer ?

    Comme cela dépend de l'ordre, difficile de faire confiance a des champs calculés, j'ignore si leur calcul est toujours dans le même ordre !
    Tu pourras le faire en ajoutant un champ non lié à la DB (comme un champ calculé), une boucle qui le modifie, par contre, tu pourras pas expédier les données (faudra peut-être utilisé un TClientDataSet rempli manuellement)

    Idem pour OnGetText, Draw ... l'ordre étant imprévisible, impossible de leur faire confiance



    Avec MySQL, cela pourrait être possible avec une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET @Compteur = 0;
    SET @ValeurPrecedent = "";
     
    SELECT 
      @Compteur := CASE WHEN ValeurPrecedent = chp 
      THEN @Compteur 
      ELSE @Compteur + 1 END,
      @ValeurPrecedent := chp
    FROM table_name;

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Aurais-tu déjà du code à nous proposer ?

    Comme cela dépend de l'ordre, difficile de faire confiance a des champs calculés, j'ignore si leur calcul est toujours dans le même ordre !
    Tu pourras le faire en ajoutant un champ non lié à la DB (comme un champ calculé), une boucle qui le modifie, par contre, tu pourras pas expédier les données (faudra peut-être utilisé un TClientDataSet rempli manuellement)

    Idem pour OnGetText, Draw ... l'ordre étant imprévisible, impossible de leur faire confiance



    Avec MySQL, cela pourrait être possible avec une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET @Compteur = 0;
    SET @ValeurPrecedent = "";
     
    SELECT 
      @Compteur := CASE WHEN ValeurPrecedent = chp 
      THEN @Compteur 
      ELSE @Compteur + 1 END,
      @ValeurPrecedent := chp
    FROM table_name;
    Merci cher frère, mais où dois-je mettre ce code dans un palier sur le bouton événement ou ce qui
    Et si possible s'il vous plaît préciser le code plus parce que je n'ai jamais utilisé et que la composante TClientDataSet

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 664
    Points : 25 458
    Points
    25 458
    Par défaut
    Citation Envoyé par medreg Voir le message
    où dois-je mettre ce code dans un palier sur le bouton événement
    un palier ???

    Ce code est exemple SQL pour MySQL !
    Je ne connais pas Absolute Database, je sais que cela remplace le BDE,
    il te faut consulter leur documentation sur les possibilité SQL 92 comme CASE WHEN et le SQL avancé comme les variables !

    D'ailleurs en MySQL, dans une clé primaire composé, le champ AutoInc est relatif au premier champ de la clé, voir l'équivalent en ABS

    Si ce ABS n'est pas assez évolué pour fournir un SQL avancé, il te faut le coder manuellement !

    Pour le TClientDataSet, tu pourrais chercher :
    Home > Delphi/C++ Components > Absolute Database > Client Dataset Delphi Example


    C'est un DataSet tout à fait classique que l'on peut gérer manuellement en mémoire

    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
      ClientDataSet.Close();
      ClientDataSet.FieldDefs.Clear();
      ClientDataSet.FieldDefs.Add('Champ1', ftInteger);
      ClientDataSet.FieldDefs.Add('Champ2', ftString, 10);
      ClientDataSet.FieldDefs.Add('Champ3', ftBoolean);
      ClientDataSet.FieldDefs.Add('Champ4', ftDateTime);
      ClientDataSet.FieldDefs.Add('Champ5', ftWideString, 10);
      ClientDataSet.CreateDataSet();
     
      ClientDataSet.Append();
      ClientDataSet.FieldByName('Champ1').AsInteger := ClientDataSet.RecordCount + 1;
      ClientDataSet.FieldByName('Champ2').AsString := '->' + IntToStr(ClientDataSet.FieldByName('Champ1').AsInteger);
      ClientDataSet.FieldByName('Champ3').AsBoolean := Odd(ClientDataSet.FieldByName('Champ1').AsInteger);
      ClientDataSet.FieldByName('Champ4').AsDateTime := Now();
      ClientDataSet.Post();
    un code vite fait, je te laisse adapter et corriger les fautes
    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
    for i := 0 to ABS.FieldDefs.Count - 1 do
      CDS.FieldDefs.Add(ABS.FieldDefs[i].FieldName, ABS.FieldDefs[i].DataType);
    CDS.FieldDefs.Add('cde', ftInteger);
    CDS.CreateDataSet();
     
    ABS.First();
    while not ABS.EOF do
    begin
      CDS.Append();
     
      for i := 0 to CDS.Fields.Count - 1 do
        CDS.Fields[i].Value := ABS.Fields[i].Value;
     
      if CDS.FieldByName('chp').AsString = chpprecedent then
        Inc(Compteur);  
      else
        Compteur := 1;
     
      CDS.FieldByName('cde').AsInteger := Compteur;
      chpprecedent := CDS.FieldByName('chp').AsString;     
     
      CDS.Post();
     
      ABS.Next();
    end;

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 82
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    un palier ???

    Ce code est exemple SQL pour MySQL !
    Je ne connais pas Absolute Database, je sais que cela remplace le BDE,
    il te faut consulter leur documentation sur les possibilité SQL 92 comme CASE WHEN et le SQL avancé comme les variables !

    D'ailleurs en MySQL, dans une clé primaire composé, le champ AutoInc est relatif au premier champ de la clé, voir l'équivalent en ABS

    Si ce ABS n'est pas assez évolué pour fournir un SQL avancé, il te faut le coder manuellement !

    Pour le TClientDataSet, tu pourrais chercher :
    Home > Delphi/C++ Components > Absolute Database > Client Dataset Delphi Example


    C'est un DataSet tout à fait classique que l'on peut gérer manuellement en mémoire

    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
      ClientDataSet.Close();
      ClientDataSet.FieldDefs.Clear();
      ClientDataSet.FieldDefs.Add('Champ1', ftInteger);
      ClientDataSet.FieldDefs.Add('Champ2', ftString, 10);
      ClientDataSet.FieldDefs.Add('Champ3', ftBoolean);
      ClientDataSet.FieldDefs.Add('Champ4', ftDateTime);
      ClientDataSet.FieldDefs.Add('Champ5', ftWideString, 10);
      ClientDataSet.CreateDataSet();
     
      ClientDataSet.Append();
      ClientDataSet.FieldByName('Champ1').AsInteger := ClientDataSet.RecordCount + 1;
      ClientDataSet.FieldByName('Champ2').AsString := '->' + IntToStr(ClientDataSet.FieldByName('Champ1').AsInteger);
      ClientDataSet.FieldByName('Champ3').AsBoolean := Odd(ClientDataSet.FieldByName('Champ1').AsInteger);
      ClientDataSet.FieldByName('Champ4').AsDateTime := Now();
      ClientDataSet.Post();
    un code vite fait, je te laisse adapter et corriger les fautes
    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
    for i := 0 to ABS.FieldDefs.Count - 1 do
      CDS.FieldDefs.Add(ABS.FieldDefs[i].FieldName, ABS.FieldDefs[i].DataType);
    CDS.FieldDefs.Add('cde', ftInteger);
    CDS.CreateDataSet();
     
    ABS.First();
    while not ABS.EOF do
    begin
      CDS.Append();
     
      for i := 0 to CDS.Fields.Count - 1 do
        CDS.Fields[i].Value := ABS.Fields[i].Value;
     
      if CDS.FieldByName('chp').AsString = chpprecedent then
        Inc(Compteur);  
      else
        Compteur := 1;
     
      CDS.FieldByName('cde').AsInteger := Compteur;
      chpprecedent := CDS.FieldByName('chp').AsString;     
     
      CDS.Post();
     
      ABS.Next();
    end;
    merci j'ai essai et je te rapel

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 664
    Points : 25 458
    Points
    25 458
    Par défaut
    Tu n'es pas obligé de "citer" les réponses à chaque fois !
    Cela encombre inutilement le sujet

    Surtout pour juste rajouter
    merci je vais essa et je vous rappelle

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2013, 15h21
  2. Réponses: 1
    Dernier message: 23/03/2013, 08h51
  3. Apparence dans un composant DBGrid
    Par rivierebruno22 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 01/02/2013, 10h18
  4. Réponses: 12
    Dernier message: 12/04/2010, 17h27

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