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 :

Zeos-Nb items de dblookupcombox<>recordCount


Sujet :

Bases de données Delphi

  1. #1
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut Zeos-Nb items de dblookupcombox<>recordCount
    Bonjour,

    J'essaie de piloter via 1 lookupcombobox l'affichage des données détail du datasource pointant sur 1 TZquery.
    Outre les colonnes de la table (sous FB2.5), je ramène dans le SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Prenom || ' ' || Nom) as PrenomNom
    Le lookupcombo "pointant" sur PrenomNom.

    Lors du FormShow, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    zQuery.Open;
    sQuery.First;
    et les données détail de la 1ère ligne de la table sont affichées ... Mais le lookupcombo, bien que correctement alimenté par tous les PrenomNom, n'affiche rien.

    J'ai l'impression qu'il y a une occurrence fantôme car
    - la table contient 5 lignes
    - le zQuery.recordcount est bien à 5
    lorsque j’utilise le dbnavigator (next,next,...) je ne peux afficher les données de la 5ème ligne :
    l'ensemble de données n'est pas en mode Edition ou Insertion
    Autres problèmes du dbnavigator
    • son utilisation ne fait pas évoluer l'affichage de la lookupcombo: est-ce possible?
    • dans le contexte du FormShow, les touches [First] et [Prev] sont grisées (normal=>1ère ligne), je fais [next] elles deviennent Enable, puis [Prev] (je reviens sur la 1ère ligne) elles restent Enable


    Je précise quand même qu'il n'y a pas de DBGrid dans le circuit : pas de place compte tenu des 80 colonnes de la table.

    Bref, qu'est-ce que je ne fais pas correctement?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet :resolu: - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    bien que je pense qu'une petite erreur se soit glissée dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    zQuery.Open;
    sQuery.First;
    c'est certainement Zquery.First qui d'ailleurs me semble inutile

    Je pense que c'est tout simplement un problème de dataset et datasource de ton lookupcombo. D'ailleurs ne serait-ce pas plutôt un tdbLookupcombox ?

    Autres problèmes du dbnavigator
    1. son utilisation ne fait pas évoluer l'affichage de la lookupcombo: est-ce possible?
    2. dans le contexte du FormShow, les touches [First] et [Prev] sont grisées (normal=>1ère ligne), je fais [next] elles deviennent Enable, puis [Prev] (je reviens sur la 1ère ligne) elles restent Enable
    au 1 je réponds : normal
    au 2 je répondrai : bogue connu, que j'ai pu rencontré de temps en temps pas forcément avec ZEOS d'ailleurs, c'est le dbnavigator le coupable
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Merci Sergio pour ta réponse.
    D'ailleurs ne serait-ce pas plutôt un tdbLookupcombox ?
    Effectivement
    Le paramétrage est le suivant:
    DataField et DataSource : vide
    KeyField : la PK de la table
    ListField : PrenomNom
    ListSource : le datasource dont le dataset est zQuery.

    Un espoir que le DBLookupcombobox fasse ce que je souhaite?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet :resolu: - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Bon, je change mon fusil d'épaule en utilisant 1 dbgrid qui n'affiche que les prénoms et Noms (les autres champs sont masqués).
    J'ai retiré la concaténation du SQL du zQuery ainsi que la dblookupcombobox.

    Mais, pas de miracle: quand je clique sur la dernière ligne du grid ou si j'y accède via la touche "down" du clavier, j'ai toujours
    l'ensemble de données n'est pas en mode Edition ou Insertion
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet :resolu: - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Bon zeosdbo était installé sur ma version 12.2 donc utilisation. NB. tu n'as pas indiqué ta version.

    Je ne me suis pas "embêté" avec un base Firebird (j'aurais certainement meiux fait) mais j'ai pris pour commencer une base SQLite fournie dans les exemples (la célèbre employees, enfin employees.s3db est loin d'être une copie de la base employees Interbase ou Firebird ). Mal m'en a pris car les colonnes texte sont des memos et non des varchars (niveau grille de vérification c'est plutôt rapé) mais peu importe.

    Suite à tes explications j'ai donc commencé par poser un TDBLookupCombobox mais pour cause de référence circulaire j'ai du ajouter un nouveau datasource pointant sur une autre query
    Tout ça pour me rendre compte qu'un tDBLookupCombobox et un cblob ne font pas bon ménage

    Du coup j'ai triché comme tu pourras le constater sur ce design
    Nom : Capture.png
Affichages : 107
Taille : 95,1 Ko
    Trop habitué à Firemonkey, j'ai utilisé un combobox et un peu de livebindings

    CONCLUSION DE CET ESSAI : si quelqu'un sait comment faire en sorte que les colonnes TEXT soient considérées comme des colonnes VARCHAR avec ZEOS je serai ravi d'avoir une explication (mes tentatives de CASTSELECT CAST( NAME AS VARCHAR(40)) vName FROM employee n'ont pas abouties)

    Avec Firebird (version 5 sur ce poste) plus de problème de blobs la BDD employees et sa table me fourni le bon jeu d'essai (et la possiblité de grille )

    toujours avec le combobox
    Nom : Capture.png
Affichages : 106
Taille : 30,6 Ko

    P.S.
    c'est le dbnavigator le coupable
    après navigation je suis revenu en arrière jusqu'au premier enregistrement (id=2 dans la table) malgré que l'on soit au premier le bouton "prior" ainsi que le bouton "first" ne sont pas désactivés, ce qui, si l'on clique une seconde fois sur "prior" se fait. La cause même si l'on était sur la première ligne on n'était pas en début de fichier (BOF),
    Idem d'ailleurs pour la fin de fichier.
    J'ai fouillé pour l'explication, j'ai cru l'avoir signalé comme bogue à Embarcadero QP (mais si j'en ai eu l'intention et j'ai laissé tombé faute de solution à proposer).

    Je reprends désormais avec un TDBLookupCombobox pour finaliser ma réponse
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Vue ne postant ma réponse du matin
    Citation Envoyé par qi130 Voir le message
    Mais, pas de miracle: quand je clique sur la dernière ligne du grid ou si j'y accède via la touche "down" du clavier, j'ai toujours
    Logique pour moi, tu dois ajouter un TZUpdateSQL, le lier à ton TZquery (propriété UPdateObject de celle-ci) et indiquer les SQL à faire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Voilà, comment te passer des Livebindings et utiliser le DBLookupCombobox.

    Tout d'abord tu dois avoir une nouvelle source de données (Zquery2, Datasource2)
    puis indiquer les propriétés suivantes au DBLookupComboxbox
    DataField = EMP_NO
    Datasource = Datasource1
    NE PAS TENIR COMPTE DE CES DEUX LIGNES, c'était un essai, j'ai repris ce qu'il y avait sur l'image
    Key_Field = EMP_NO
    List_Field = FULL_NAME
    ListSource = DataSource2
    Ainsi tu n'auras la synchronisation souhaitée qu'avec quelques lignes de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm2.DBLookupComboBox1CloseUp(Sender: TObject);
    begin
    ZQuery1.Locate('EMP_NO',VarArrayOf(DBLookupComboBox1.KeyValue),[]);
    end;
     
    procedure TForm2.ZQuery1AfterScroll(DataSet: TDataSet);
    begin
    DBLookupComboBox1.KeyValue:=ZQuery1EMP_NO.asInteger;
    end;
    (tu peux même faire en sorte d'avoir un tri alphabétique dans ta liste, en changeant ton SQL avec ORDER BY )

    Nom : Capture.png
Affichages : 104
Taille : 151,0 Ko
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Vue ne postant ma réponse du matin

    Logique pour moi, tu dois ajouter un TZUpdateSQL, le lier à ton TZquery (propriété UPdateObject de celle-ci) et indiquer les SQL à faire
    C'est déjà le cas, avec 1 Ztransaction dédiée... d'ailleurs, la génération des SQL est plutôt bien faite.

    Cependant, en quoi l'absence de ce TZUpdateSQL empêcherait d'atteindre la dernière ligne dès lors qu'aucune modif n'est faite?

    En marge, je note l'astuce pour le dblookupcombobox. J'avais vaguement exploré la même piste, il ne me manquait que le code des 2 évènements

    PS: j'utilise la v8 de Zeos avec mon Berlin Starter
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet :resolu: - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  9. #9
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut Euréka !
    Concernant l’impossibilité d'accéder à la dernière occurrence:

    Il se trouve que parmi les champs, j'ai beaucoup de booléens qui sont restitués via des DBCheckbox:
    Nom : Capture.PNG
Affichages : 70
Taille : 10,1 Ko
    et la même chose pour l'onglet "En cours"
    Chaque DBCheckbox "Rien de particulier" avait son event OnClick branché sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for i := 0 to tsPast.ControlCount-1 do begin
             if LeftStr(tsPast.Controls[i].Name,2)='DB' then begin
                if (tsPast.Controls[i] is TDBCheckBox) and chkP_RAS.Checked then
                   zDiverQr.FieldByName((tsPast.Controls[i] as TDBCheckBox).DataField).AsInteger:=0
                   else
                   if tsPast.Controls[i] is TDBMemo then
                      if chkP_RAS.Checked then
                         zDiverQr.FieldByName((tsPast.Controls[i] as TDBMemo).DataField).Clear; // raz du champ
                tsPast.Controls[i].Enabled:=not chkP_RAS.Checked;
             end;
    (ici, tsPast = tabsheet "Antécédents")

    Sur 1 des occurrences intermédiaires j'ai coché et décoché plusieurs fois "Rien de particulier". Du coup, au changement d'occurrence suivant, bingo!
    l'ensemble de données n'est pas en mode Edition ou Insertion
    Après désactivation des gestionnaires OnClick, le problème a disparu

    En outre, je constate que cette séquence déclenche le OnDataChange du dataset, lequel contient déjà:
    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
    // S'assurer que le dataset est actif et pas vide
         if not zDiverQr.Active or zDiverQr.IsEmpty then
         begin
              PhotoDiver.Picture := nil;
              Exit;
         end;
     
         // Vérifier si le champ BLOB est non null
         if not zDiverQr.FieldByName('DIVER_PHOTO').IsNull then
         begin
              BlobStream := zDiverQr.CreateBlobStream(zDiverQr.FieldByName('DIVER_PHOTO'), bmRead);
              jp:=TJPEGImage.Create;
           try
             jp.LoadFromStream(BlobStream);
             PhotoDiver.Picture.Assign(jp);
           finally
             BlobStream.Free;
             jp.Free;
           end;
         end
         else
           PhotoDiver.Picture := nil;
    car les BLOB graphiques fournis par Zeos ne sont pas compatibles avec 1 DBImage (PhotoDiver est 1 TImage - images de la DB en jpg - je n'ai pas essayé avec un BMP)

    AMHA, le fait d'activer la séquence OnClick doit saturer quelque chose, occasionnant la fermeture du Query ?

    Maintenant, comment conserver cette facilité sur les DBCheckBox ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet :resolu: - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

Discussions similaires

  1. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  2. Réponses: 5
    Dernier message: 09/12/2002, 22h23
  3. Comment effacer des Items d'un TListView ?
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/11/2002, 10h19
  4. Recuper les items de ListBox d'une autre application [API?]
    Par Shamanisator dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h32
  5. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49

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