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 :

BD peuplée mais affiche zéro enregistrements


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut BD peuplée mais affiche zéro enregistrements
    Salut;

    cette procédure est appelée lors d'un clic sur un TreeViw, le hic c'est qu'elle retourne zéro enregistrements rien que dans une partie alors qu'elle retourne le nombre exacte d'enregistrements dans les autres endroits.

    voici tout le code peut-être que quelqu'un verra ce que je ne vois pas !

    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
    procedure TfmListe.tvObjetClick(Sender: TObject);
    begin
      with qbeneficiaire do
      begin
        SQL.Clear;
     
        // si c'est un noeud parent alors selectionner le premier noeud fils
        if (tvObjet.Selected.HasChildren) then
           tvObjet.Select(tvObjet.Items[tvObjet.Selected.AbsoluteIndex + 1]);
     
        // Bénéficiaire
        // retourne zéro enregistrements pour cette partie
        if (tvObjet.Selected.HasAsParent(tvObjet.Items[0])) then
        begin
          //ShowMessage(inttostr(tvObjet.Selected.Index));
          case tvObjet.Selected.Index of
            // tout
            0 : Texte := 'SELECT * FROM Benef_Cat_Fam';
            // actif
            1 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=True';
            // inactif
            2 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=False';
          end;
        end;
     
        // Contrat
        if tvObjet.Selected.HasAsParent(tvObjet.Items[4]) then
        begin
          Texte := 'SELECT Contrat.Fin_Contrat, Benef_cat_fam.Nom, '
                   + 'Benef_cat_fam.Prenom, Benef_cat_fam.Date_Naissance, '
                   + 'Benef_cat_fam.Num_Identite, Benef_cat_fam.Num_Securite_Sociale, '
                   + 'Benef_cat_fam.Num_Dossier, Benef_cat_fam.Actif, Benef_cat_fam.Archivage '
                   + 'FROM Benef_Cat_Fam Benef_cat_fam '
                   + 'LEFT OUTER JOIN Contrat Contrat '
                   + 'ON  (Contrat.code_beneficiaire = Benef_cat_fam.code_beneficiaire) ';
     
          case tvObjet.Selected.Index of
            // contrat expiré
            0 : Texte := Texte + 'WHERE  Contrat.Fin_Contrat = FALSE';
            // contrat en cours
            1 : Texte := Texte + 'WHERE  Contrat.Fin_Contrat = TRUE';
            // sans contrat
            2 : Texte := 'SELECT DISTINCT Contrat.Fin_Contrat, Beneficiare.Nom, '
                       + 'Beneficiare.Prenom, Beneficiare.Date_Naissance, Beneficiare.Lieu_Naissance, '
                       + 'Beneficiare.Num_Identite, Beneficiare.Num_Securite_Sociale, '
                       + 'Beneficiare.Num_Dossier, Beneficiare.Actif, Beneficiare.Archivage, Contrat.date_Entree '
                       + 'FROM Contrat Contrat '
                       + 'RIGHT OUTER JOIN Beneficiare Beneficiare '
                       + 'ON  (Beneficiare.code_beneficiaire = Contrat.code_beneficiaire) '
                       + 'WHERE  Contrat.Code_Contrat IS NULL '
                       + 'ORDER BY Contrat.Fin_Contrat';
          end
        end;
     
        // Archive
        if (tvObjet.Selected.HasAsParent(tvObjet.Items[8])) then
        begin
          case tvObjet.Selected.Index of
            0 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Archivage=True';
            1 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Archivage=True AND Actif=TRUE';
            2 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Archivage=True AND Actif=FALSE';
          end
        end;
     
        // Groupe
        if tvObjet.Selected.HasAsParent(tvObjet.Items[12]) then
        begin
          tvObjet.Selected.SelectedIndex := 16;
          Texte := 'SELECT * FROM Benef_Cat_Fam '
                 + 'WHERE Categorie=' + QuotedStr(tvObjet.Selected.Text);
        end;
     
        // Activité
        if tvObjet.Selected.HasAsParent(tvObjet.Items[pos_noeud-1]) then
        begin
          tvObjet.Selected.SelectedIndex := 16;
          Texte := 'SELECT * FROM Benef_Cat_Fam '
                 + 'WHERE Famille=' + QuotedStr(tvObjet.Selected.Text);
        end;
     
       // Traitement en Mode SQL
       if (texte <> '') then
       begin
         qbeneficiaire.SQL.Text := texte;
         qbeneficiaire.Open;
         case qbeneficiaire.RecordCount of
            -1,0 : sbInfo.Panels[0].Text := 'Aucun enregistrement';
               1 : sbInfo.Panels[0].Text := '1 enregistrement trouvé';
            else sbInfo.Panels[0].Text := IntToStr(qbeneficiaire.RecordCount)
                                          + ' enregistrements trouvés';
         end
       end;
      end;
    end;
     
    Toues les parties de ce code me rendent le nembre d'enregistrements exacat sauf cette partie 
     
        // Bénéficiaire
        if (tvObjet.Selected.HasAsParent(tvObjet.Items[0])) then
        begin
          //ShowMessage(inttostr(tvObjet.Selected.Index));
          case tvObjet.Selected.Index of
            // tout
            0 : Texte := 'SELECT * FROM Benef_Cat_Fam';
            // actif
            1 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=True';
            // inactif
            2 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=False';
          end;
        end;

    je ne trouve pas le problème, une idée, une piste.

    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut court circuiter le message "violation de clé"
    Salut;

    en bref, je transfert des données d'une base vers une autre mais y ' a des fois où l'enregistrement en cours de transfert pose problème de clé car il est double ce qui est une violation, j'aimerais quand même continuer à transférer les autres données sans interruption, comment dois-je procéder ?

    pour pouvoir m'aider je poste le code de transfert dans son intégralité :

    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
    procedure TForm1.btCopierClick(Sender: TObject);
    var
      nEnr : integer;
      taux_entier : integer;
    begin
      dmData.DB.Connected := True;
      dmData.tbSource.Active := True;
      dmData.tbDestinationBeneficiaire.Active := True;
      dmData.tbDestinationContrat.Active := True;
      lbModule.Visible := True;
      pbModule.Visible := True;
     
      dmData.tbSource.First;
      nEnr := dmData.tbSource.RecordCount;
      while not(dmData.tbSource.Eof) do
      with dmData do begin
        try
          // Partie Bénéficaire
          tbDestinationBeneficiaire.Append;
          tbDestinationBeneficiairecode_beneficiaire.Value := code_benef;
          tbDestinationBeneficiaireMatricule.Value := tbSourceMATRICULE.Value;
          tbDestinationBeneficiaireNomLatin.Value := UpperCase(tbSourceNOM.Value);
          tbDestinationBeneficiairePrenomLatin.Value := UpperCase(tbSourcePRENOM.Value);
          tbDestinationBeneficiaireNom.Value := tbSourceNOM.Value;
          tbDestinationBeneficiairePrenom.Value := tbSourcePRENOM.Value;
          tbDestinationBeneficiaireDate_Naissance.Value := tbSourceDATENAIS.Value;
          tbDestinationBeneficiaireNum_Securite_Sociale.Value := tbSourceNUMIMMAT.Value;
          tbDestinationBeneficiaireActif.Value := (tbSourceTYPBENEF.AsInteger = 1);
     
          // Partie contrat
          tbDestinationContrat.Append;
          tbDestinationContratcode_beneficiaire.Value := code_benef;
          tbDestinationContratCode_Contrat.Value := IntToStr(code_contrat) + '/2008';
          tbDestinationContratdate_Entree.Value := tbSourceDATEPRISE.Value;
          if (tbSourceDATEFPRISE.AsString <> '') then
            tbDestinationContratdate_Sortie.Value := tbSourceDATEFPRISE.Value
          else tbDestinationContratdate_Sortie.AsString := '';
          tbDestinationContratFin_Contrat.Value := (tbSourceDATEFPRISE.AsString <> '');
     
          // passer au suivant
          tbSource.Next;
          Application.ProcessMessages;
     
          // poster
          taux_entier := round((code_benef / nEnr)*100);
          //taux_entier := round(taux);
          lbModule.Caption := Format('avancement %d %%', [taux_entier] );
          pbModule.Position := code_benef;
     
          sbInfo.Panels[1].Text := Format('%d élément(s) dans la table contrat',
                                      [tbDestinationContrat.RecordCount]);
          sbInfo.Panels[1].Text := Format('%d élément(s) dans la table bénéficiaire',
                                      [tbDestinationBeneficiaire.RecordCount]);
          Application.ProcessMessages;
        except
          on E: Exception do begin
                               ShowMessage('CODE Erreur ' + E.Message);
                               Abort; end;
        end;
      end;
    end;
    Merci d'avance.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    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 606
    Par défaut
    Salut,

    Juste comme cela.
    Tu est sur que True ou False à l'intérieur d'un SQL.text c'est bien compris ? et pas pris pour une chaine ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        begin
          //ShowMessage(inttostr(tvObjet.Selected.Index));
          case tvObjet.Selected.Index of
            // tout
            0 : Texte := 'SELECT * FROM Benef_Cat_Fam';
            // actif
            1 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=True';
            // inactif
            2 : Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=False';
          end;
    Quand je travail sur DB access je mets pas true ou false mais 0 ou -1 voir 1 dans certain cas.

  4. #4
    rsc
    rsc est déconnecté
    Membre émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Par défaut
    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=True';
    ne te ramène pas d'enregistrement,
    mais que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Archivage=True AND Actif=TRUE';
    t'en ramène, comme tu sembles le dire, à mon humble avis, le problème ne vient pas de la requête ! Vérifie plutôt en pas à pas si ton programme passe bien là où il faut.

    A moins qu'il n'y ait effectivement un problème de casse sur TRUE ou True, mais je ne vois pas...Sous quel SGBQ es-tu ? Il faut toujours le préciser, ça aide

  5. #5
    rsc
    rsc est déconnecté
    Membre émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Par défaut
    Pour ton problème de violation de clé, c'est normal que ta procédure s'arrête, puisque tu redéclenches une exception (Abort) dans le except !

    Si tu veux que tes erreurs de violation de clé soient passées sous silence, mais que les autres arrêtent la procédure, tu complètes ton code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    on E: Exception do
      if not((E is EDBEngineError) 
      and (EDBEngineError(E).Errors[0].ErrorCode = DBIERR_KEYVIOL)) then
    ...
    PS : Evite de poster sur deux sujets différents dans le même thread.

  6. #6
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Salut;

    merci pour vos réponses.

    1. c'est pas moi qui a posté deux sujets différents sur le même thread d'ailleurs je ne comprends pas comment cela est arrivée, j'aurais aimé avoir chaque sujet dans un espace, peut-être qu'un des modo lira ma réponse et prendra la remarque en considération.

    2. pour la requête elle est juste car j'ai suivi ça au pas à pas est le true est bien pris en compte.

    3. je travaille avec access version 2003.

    4. arc, je donnerais suite à ta suggestion une fois testé.

  7. #7
    rsc
    rsc est déconnecté
    Membre émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Par défaut
    Je t'avais envoyé cette réponse :
    Citation Envoyé par rsc Voir le message
    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Actif=True';
    ne te ramène pas d'enregistrement,
    mais que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte := 'SELECT * FROM Benef_Cat_Fam WHERE Archivage=True AND Actif=TRUE';
    t'en ramène, comme tu sembles le dire, à mon humble avis, le problème ne vient pas de la requête ! Vérifie plutôt en pas à pas si ton programme passe bien là où il faut.

    A moins qu'il n'y ait effectivement un problème de casse sur TRUE ou True, mais je ne vois pas...Sous quel SGBQ es-tu ? Il faut toujours le préciser, ça aide
    1/ Tu ne nous as toujours pas dit sous quel SGBD tu travaillais.
    2/ Tu ne nous as pas dit ce que donnait le parcours pas à pas, et si ton code passait bien dans les requêtes qui "ne te renvoient rien".
    Si tu ne réponds pas aux questions, ne t'étonne pas trop que plus personne ne s'occupe de ton problème

  8. #8
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Salut rsc et merci pour le suivi.

    Primo j'ai pas de problème de syntaxe ou du genre car mon DBGrid (ou lampe témoin) affiche bien les données concernées.

    Secondo, il s'agit du célèbre MSAcces 2003.


    et merci encore, mais ma solution est tellement horrible que je compte poursuivre mes recherches peut-être que je tomberais sur une meilleure alternative.

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/10/2005, 15h05
  2. Réponses: 1
    Dernier message: 07/09/2005, 10h25
  3. Afficher un enregistrement selon un critère saisie.
    Par pegase23 dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 10h54
  4. [MySQL] Afficher un enregistrement de façon aléatoire
    Par guy2004 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/02/2005, 19h36
  5. Afficher les enregistrements si le count() vaut 0
    Par j14z dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/04/2004, 09h51

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