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 :

[ADO][Access] Première ligne saute


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut [ADO][Access] Première ligne saute
    Bonjour tout le monde,
    j'utilise les composants ADO pour me connecter à une base Access.

    J'ai 2 problèmes qui ont la même cause, la méthode First plante et commence à la seconde ligne, je dois donc travailler sans faire adoQuery.First, ce qui me plaît moyen car je ne suis pas sûr qu'un adoQuery.Open garantit qu'on commence à la première ligne. Ceci est dans le cadre d'utilisation d'un adoQuery avec un simple adoConnection pour travailler sur des requêtes en ligne de commande.

    Mon second problème est quand je veux afficher le résultat de la requête dans un DBGrid.
    Voici la suite des composants :
    adoQuery relié à un DataSetProvider relié à un ClientDataSet relié à un DataSource relié à un DBGrid.
    DataSetProvider.DataSet := adoQuery
    ClientDataSet.ProviderName := DataSetProvider
    DataSource.DataSet := ClientDataSet
    DBGrid.DataSource := DataSource

    Si je fais un adoQuery.First, je perds la première ligne à l'écran.
    Quand je souhait compter le nombre de lignes, l'adoQuery.RecordCount retourne toujours -1.
    Je passe ainsi pour compter le nombre de lignes :
    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
     
          nbLigne := 0;
     
          adoQuery.Close;
          adoQuery.Open;
     
          while not adoQuery.Eof do
          begin
            nbLigne := nbLigne + 1;
            adoQuery.Next;
          end;
     
          adoQuery.Close;
          adoQuery.Open;
          ShowMessage( IntToStr( nbLigne ) );
    Je retrouve le bon nombre de ligne si je ne commence pas par un First mais je perds quand même la première ligne.

    Comment puis-je faire pour arriver à garder la première ligne à l'écran dans le DBGrid ?
    Y-a-t-il un moyen pour ne plus avoir le bug avec le .First qui commence à la seconde ligne ?
    Est-ce que ce bug est connu ?
    Merci pour votre aide, je suis paumé.

  2. #2
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    J'ai trouvé comment garder la première ligne, ça ne venait pas de mon code, ça vient du fait qu'après mon code, je fermais et rouvrais le ClientDataSet.

    Pourquoi le fait de réinitialiser le ClientDataSet me retire la première ligne, je n'en sais rien, mais maintenant ça marche.

    Je suis toujours à la quête d'informations du bug des composants ADO qui buguent sur la méthode First et qui retirent régulièrement la première ligne, j'aimerais arriver à trouver pourquoi ça le fait pour être sûr que je ne tomberai pas dans ce bug une fois future.
    Je cherche sur le net et pour l'instant ne trouve pas de cause.

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le ClientDataSet est comme une "Copie" de ta requete et à son propre curseur.
    Quand tu "joues" avec les composants c'est avec le ClientDataset que tu dois faire tes actions si tu veux qu'elle se répercute dans la DbGrid.

    Rajoute un deuxieme Clientdataset et connecte le à un autre DataSource et une autre DBGrid tu verras que quand tu sélectionnes un élément de la première DbGrid, la deuxieme ne bougera pas.

    Pour le RecordCount il faut parfois faire un Last avant de le lire (Dans 99% des cas ca resout le problème de resultat à -1)

  4. #4
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je vais essayer de faire un Last pour voir ce que ça donne et te tiens au courant.

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par WebPac
    Je vais essayer de faire un Last pour voir ce que ça donne et te tiens au courant.
    Sinon pourquoi utilises tu un ClientDataSet ?
    Est il vraiment nécessaire ?

  6. #6
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Quand je fais un adoQuery.Last, j'ai ce message d'erreur :
    L'ensemble de lignes ne prend pas en charge les récupérations arrière
    Et ça ne marche pas.


    C'est dommage car ta méthode avait des chances d'être plus rapide que la mienne.

  7. #7
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Citation Envoyé par Malatar
    Citation Envoyé par WebPac
    Je vais essayer de faire un Last pour voir ce que ça donne et te tiens au courant.
    Sinon pourquoi utilises tu un ClientDataSet ?
    Est il vraiment nécessaire ?
    Je ne sais pas du tout, c'est du code qui était déjà existant, avec tous ces objets utilisés pour se connecter à une base de donnée, je m'y perds.
    J'ai besoin de pouvoir afficher le résultat de la requête dans un DBGrid en lecture seule, la requête étant mise dans un adoQuery ou un sqlQuery.

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par WebPac
    Quand je fais un adoQuery.Last, j'ai ce message d'erreur :

    Et ça ne marche pas.


    C'est dommage car ta méthode avait des chances d'être plus rapide que la mienne.
    Mouarf, les composants sont configurés en Unidirectionnel (c'est surement pour cela qu'il utilise les DataSetProvider et ClientDataSet )

    Au lieu de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AdoQuery.Last;
      nbLigne := AdoQuery.RecordCount;
    fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     nbLigne := 0;
     
    adoQuery.Close;
    adoQuery.Open;
    ClientDataSet.Open;
    ClientDataSet.Last;
    nbLigne := ClientDataSet.RecordCount;
    ShowMessage( IntToStr(nbLigne  ) );

  9. #9
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je teste et te dit si ça marche.

  10. #10
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Salut Malatar, je viens de tester ton code et je n'obtiens pas le bon nombre de valeurs, il en manque 1.

    On revient sur le bug énoncé au dessus qui oublie la première ligne.

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Quel version de Delphi as tu ? (Car j'ai jamais eu ce problème avec Ado sur D5,D7 et D2005)

    Sinon faudrait vérifier la configuration du AdoQuery :
    • CursorType : s'il est a ctOpenFowardOnly le faire passer à ctKeySet (Ca enlèvera l'unidirectionnalité du composant)
    • CursorLocation : Met le à clUseClient
    • ExecuteOptions : Rien ne doit être à vrai.


    Après reteste ta requete et le recordcount

  12. #12
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci beaucoup pour ces indications, maintenant ça marche sans bug (plus de première ligne qui saute).

    Mes paramétrages étaient :
    CursorLocation = clUseServer
    CursorType = ctOpenForwardOnly
    ExecuteOption tout à FAUX

    C'est un collègue qui avait défini l'adoQuery, je vais lui demander pourquoi il avait modifié les propriétés puisque ce ne sont pas les propriétés par défaut qu'il y avait.

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par WebPac
    Merci beaucoup pour ces indications, maintenant ça marche sans bug (plus de première ligne qui saute).

    Mes paramétrages étaient :
    CursorLocation = clUseServer
    CursorType = ctOpenForwardOnly
    ExecuteOption tout à FAUX

    C'est un collègue qui avait défini l'adoQuery, je vais lui demander pourquoi il avait modifié les propriétés puisque ce ne sont pas les propriétés par défaut qu'il y avait.
    Maintenant tu n'as plus vraiement besoin des composants DataSetProvider et ClientDataSet, qui à mon avis étaient la surtout pour le problème d'unidirectionnalité que la configuration du CursorType générer.
    Maintenant tu dois pouvoir faire un Last sans que cela te génère d'erreur ^^

  14. #14
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    En fait, je dois quand même garder le DataSetProvider et le ClientDataSet car nativement, je travaille avec dbExpress et les composants TSQLQuery.
    Ce n'est que depuis peu que dans le code sont rajoutés les composants ADO.

    Le LAST doit marcher en effet, je n'ai pas encore testé.

  15. #15
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par WebPac
    J'ai trouvé comment garder la première ligne, ça ne venait pas de mon code, ça vient du fait qu'après mon code, je fermais et rouvrais le ClientDataSet.
    +
    Citation Envoyé par Malatar
    Mouarf, les composants sont configurés en Unidirectionnel (c'est surement pour cela qu'il utilise les DataSetProvider et ClientDataSet )
    Normal que ta première ligne saute, tu as dû fermer adoquery pas le tclientset, car après son l'ouverture de ado le tclientset lis les données et quant tu ferme et tu ouvre et comme ton ado est en lecture son curseur passe au 2éme ligne directement
    Pour le recordcount avec ado pas la peine de faire last si il est en lecture écriture il donne toujours le nombre exacte (au moins pour moi j'ai jamais eu de problème avec)

  16. #16
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je comprends, je ne dois pas fermer le query mais le clientdataset quand je désire reprendre la requête à 0.

    Maintenant que ça marche, je vais rester ainsi quelques temps et garde toutes vos remarques constructives en réserve pour le moment où j'aurai le temps de tout reprendre car je m'en sers dans d'autres endroits aussi.

  17. #17
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par WebPac
    Je comprends, je ne dois pas fermer le query mais le clientdataset quand je désire reprendre la requête à 0.
    Nooooooooooooon, Soit l'ado soit les 2,
    Fermeture de clientset fermeture de ado et réouverture puis ouverture de TClientdataset,
    Normalement j'ai jamais fermer le TClientdataset, en plus si ma mémoire est bon quand en relit un Tclientdataset à un ado pas la peine d'ouvrir ce dernier il sufi de le bien renseigné (command SQL, base, et tout) à vérifier

    Je vois que j'ai mal expliqué,

  18. #18
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Citation Envoyé par Malatar
    Sinon faudrait vérifier la configuration du AdoQuery :

    * CursorType : s'il est a ctOpenFowardOnly le faire passer à ctKeySet (Ca enlèvera l'unidirectionnalité du composant)
    * CursorLocation : Met le à clUseClient
    * ExecuteOptions : Rien ne doit être à vrai.
    Citation Envoyé par WebPac
    Merci beaucoup pour ces indications, maintenant ça marche sans bug (plus de première ligne qui saute).

    Mes paramétrages étaient :
    CursorLocation = clUseServer
    CursorType = ctOpenForwardOnly
    ExecuteOption tout à FAUX
    J'ai des infos, les propriétés de l'adoQuery ont été modifiées car sinon impossible de visualiser les données avec la base de données de Sage 500 Modulaire propriétaire. Après plusieurs tests, ce n'était que ces propriétés qui fonctionnaient.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2013, 10h28
  2. Réponses: 2
    Dernier message: 18/08/2010, 15h56
  3. delete la premire ligne de ma base de donnees access
    Par skillipo dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 05/12/2007, 19h02
  4. [ODBC] [Access] odbc_result fait sauter la première ligne de odbc_result_all
    Par maraly dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/06/2007, 11h58
  5. Lenteur de connexion(ADO+ACCESS(40 000 lignes)) + ADOComand
    Par hugobob dans le forum Bases de données
    Réponses: 5
    Dernier message: 08/03/2006, 20h14

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