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 :

RecNo : différence entre paradox et mysql ?


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut RecNo : différence entre paradox et mysql ?
    Re-bonjour,

    Voilà que je me heurte à un truc bizarre.
    Dans l'application que je suis en train de migrer, j'ai l'habitude de changer la couleur de fond de la dbgrid une ligne sur deux pour une meilleure lisibilité.
    Le code est relativement simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm3.DBGrid1DrawcolumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
     
    begin
    if odd(dbgrid1.datasource.dataset.RecNo) then
       begin
       if  not (gdfocused in state) then       
          begin
          dbgrid1.Canvas.Brush.color:=vertamande;
          end;
       end;
     
    etc ...
    Donc, normalement quand RecNo est impair la ligne est sur fond vert, sinon c'est le fond normal.

    Cela fait 20 ans que ça marche avec les tables paradox, mais lorsque j'essaye avec une base mysql, RecNo est toujours égal à 1 ....
    Est ce que je n'utilise pas la bonne méthode ? Comment récupérer le numéro d'un enregistrement dans une base Mysql ?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 229
    Points : 35 949
    Points
    35 949
    Billets dans le blog
    54
    Par défaut
    Bonjour,

    tombé du lit, ce post m'interpelle.
    Cela fait tellement longtemps que je n'utilise plus VCL pour les nouveaux programmes que mon premier reflexe a été "utiliser la propriété alternatingrowbackground".
    De plus j'ai toujours été très frileux avec recno.

    Du coup j'ai voulu tenter l'expérience tout d'abord avec une table MySQL comme demandé, avec constatation du même résultat. Ce n'est qu'après avoir défiler dans la grille que j'ai l'attendu !
    Puis avec une table Firebird en me disant que j'allais d'abord vérifier mon code. Même résultat au démarrage

    Du coup je me suis penché sur la version de Delphi. Comme je savais que c'était avec la version 10.4 grâce à , non pas ma boule de cristal mais, la mémoire de la discussion précédente.
    (N.B. Il est bon de rappeller ça à chaque nouvelle discussion)
    la version 10.3 donne le résultat conforme aux espérances , la 11 aussi j'en déduit qu'il y a une régression quelque part, malheureusement je n'ai pas les 10.4.0, 10.4.1 pour vérifier quand celle-ci a eu lieu

    Bon, alors en attendant une putative correction comment s'en sortir ?

    Après avoir constaté qu'il s'agit bien d'un problème de recno, peut-être due à une "amélioration" non lue dans les notes de versions et tester que sur une colonne entiere de la base le problème ne se posait pas je suggère d'oublier les FDTables (de toute façon c'était déjà plus ou moins écrit par ShaiLeTroll sur la discussion "migration") et de les remplacer par des FDQuerys exprimés ainsi
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *,row_number() OVER () AS RECNO FROM <table>
    bien sûr * sera remplacé par le nom des colonnes voulues, si un order by est indiqué il faudra aussi l'indiquée dans OVER (enfin il me semble que)
    et le test se fera sur le champ ainsi obtenu
    MySQL 8.0 et + sinon lire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Odd(TDBGrid(Sender).DataSource.DataSet.FieldByName('Recno').AsInteger) then ....
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Merci pour ces tests et la solution que je vais essayer de ce pas.
    Si tu n'utilises plus la vcl, tu utilises quoi ? J'ai dû louper un truc ...

    si ça marche sur la 10.3 je vais essayer ;o) et je te dirai

    c'est quoi la propriété alternatingrowbackground ?

    Comment signaler cette anomalie à embarcadero ?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 229
    Points : 35 949
    Points
    35 949
    Billets dans le blog
    54
    Par défaut
    Bonjour
    Citation Envoyé par navyg Voir le message
    Si tu n'utilises plus la vcl, tu utilises quoi ?
    Je suis passé à FMX (multi-plateforme) , même pour des programmes windows. A mon avis (mais après beaucoup d'efforts et un changement assez radical d'habitudes VCL) c'est mieux que VCL

    J'ai dû louper un truc ...
    le ciblage multi-plateforme, un petit truc de rien

    c'est quoi la propriété alternatingrowbackground ?
    une propriété de FMX.TGrid qui sans une once de code de notre part permet d'avoir l'effet recherché (alternance de couleur) selon le style (apparance) utilisé
    si ça marche sur la 10.3
    j'ai fait l'essai avec 10.3.2 donc oui, je n'ai pas mis d'image pour le prouver

    Comment signaler cette anomalie à embarcadero ?
    pour l'instant j'ai signalé le fait à Patrick (pprem) qui est MVP Embarcadero. Je serai bien en peine d'indiquer ce bogue sur le portail Qualité de manière efficace, en général Patrick a plus d'écoute que moi sur ce portail. Les signalements que j'ai pu faire sont le plus souvent restés lettre morte (même en indiquant quelques fois comment solutionner)
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    alors je viens d'essayer en 10.3.3 et ça ne marche pas non plus, cela veut dire qu'il y a peut-être une configuration particulière pour que ça fonctionne ???

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 229
    Points : 35 949
    Points
    35 949
    Billets dans le blog
    54
    Par défaut
    Pourtant

    Nom : Capture.PNG
Affichages : 70
Taille : 36,7 Ko

    bon ok, c'est avec une query et firebird. Je vais rapidement changer le programme pour MySQL et une table

    effectivement "il y a quelque chose de pourri au royaume du Danemark" en utilisant TTable
    Nom : Capture_1.PNG
Affichages : 69
Taille : 9,8 Ko

    mais avec une requête c'est ok (sans même jouer avec la fonction de fenêtrage ROW_NUM)

    du coup j'ai fait le test suivant (un affichage avec un TTable, l'autre avec TQuery)
    Nom : Capture.PNG
Affichages : 66
Taille : 43,4 Ko

    du coup mon mail à Patrick est peut-être un peu moins bien rapporté.
    Je l'ai dit je suis de moins en moins à l'aise avec VCL et Table, cela se confirme !
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    alors la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *,row_number() OVER () AS RECNO FROM <table>
    ça ne marchait pas car je suis sur un mariadb 5 et que row_number n'apparaît que dans mariadb10

    donc j'ai mis mariadb 10 en route sur le nas, j'ai testé (non sans quelques difficultés car l'interprétation de la chaine SQL dans le query change selon que je saute à la ligne après *, ou pas ... va comprendre)

    donc, ça pourrait fonctionner comme ça, sauf que je ne voudrai pas que la colonne apparaisse dans le dbgrid mais on doit pouvoir filtrer ?
    je vais tester aussi avec un query sans row_number

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Bon effectivement ça marche sans le row_number sur une query et pas sur une table ... Etonnant non ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Bon je vais abandonner FDtable et tout faire en FDQuery ....
    Ca va pas simplifier mais il faut ce qu'il faut ...

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 229
    Points : 35 949
    Points
    35 949
    Billets dans le blog
    54
    Par défaut quand il y a un os je le ronge
    Bonjour,
    Citation Envoyé par navyg Voir le message
    Bon, je vais abandonner FDtable et tout faire en FDQuery
    Même si c'est ce que je recommande ne serait-ce que pour utiliser la puissance des SGBD relationelles, cette bizarrerie me gênait.

    Après avoir "dormi dessus", j'étais persuadé qu'il s'agissait d'un problème d'option (c'est vrai qu'avec Firedac c'est pas ce qui manque).
    Au fil des versions plusieurs Fetchoptions par défaut ont changées. Pour ce qui est des récents, je ne me souviens que d'un article de Marco Cantu concernant les transactions Firebird (pas si rénet que ça) mais je me souviens aussi de mes galères du début et de mon échange avec Dmitry sur l'option LiveWindowParanoic naguère false par défaut et maintenant true.

    En tatonnant un peu dans l'aide pas très claire au niveau des FetchOptions j'ai fini par identifier l'option "coupable" (ou du moins celle qui fait le job) : cursorkind

    Nom : Capture.PNG
Affichages : 52
Taille : 58,6 Ko

    Ici j'ai modifié au niveau de FDTable et non directement de la connexion qui aurait tout aussi bien fait le job toutefois l'aide/docwiki, le paragraphe qui donne la piste sous le tableau

    Pour TFDTable, ckAutomatic active la fenêtre Données dynamiques, lorsqu'une table comporte des champs d'identification unique. ckDynamic active la fenêtre Données dynamiques sans condition, et une exception est déclenchée si une table de base de données ne comporte pas de clé unique. Les autres types de curseur désactivent le mode Fenêtre Données dynamiques et définissent TFDTable en mode standard, lorsqu'elle agit comme TFDQuery.
    mais je ne sais pas si c'est une bonne idée que de la mettre au niveau connexion.

    Du coup je me suis penché sur la structure de la table que j'ai utilisé. Avais-je un identifiant unique : OUI (que soit soit mon test Firebird ou MySQL) à noter que pour MySQL il s'agissait d'un auto incrément. Donc cela ctivait "la fenêtre Données dynamiques" FDTable n'était donc pas en mode standard maintenant que veux dire cette "fenêtre en mode dynamique" telle est la question du jour
    pour ceux qui en ont le courage, la lecture de https://docwiki.embarcadero.com/RADS...able_(FireDAC)


    Néanmoins cette fois ci je pense que c'est vraiment
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Alors là, je suis sur le c.l !
    Je n'aurai jamais cherché aussi loin dans les options et de toute façon même en cherchant je ne crois pas que j'aurai trouvé.
    j'avais bien vus cette rubrique FetchOptions, mais je ne savais pas du tout à quoi ça correspondait donc j'avais abandonné devant le nombre d'options possible ...
    Merci, ça va me faciliter la vie ;o)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Bon, comme je suis curieux, j'ai essayé les différentes options :

    ckAutomatic RecNo ne fonctionne pas
    ckDefault RecNo fonctionne
    ckDynamic RecNo ne fonctionne pas
    ckStatic RecNo fonctionne
    ckForwardOnly RecNo fonctionne

    Je pense que je vais utiliser ckDefault

    J'ai regardé le réglage pour les query, c'est ckAutomatic, et RecNo fonctionne ... pourquoi ? je ne suis pas assez calé pour le dire ...

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 229
    Points : 35 949
    Points
    35 949
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par navyg Voir le message
    J'ai regardé le réglage pour les query, c'est ckAutomatic, et RecNo fonctionne ... pourquoi ? je ne suis pas assez calé pour le dire ...
    Parce que en fait ce n'est pas comme cela qu'il faut interpréter le truc.
    Il n'y a pas un fetchoption spécial selon le composant dataset (Table ou Query) sauf si on le re-spécifie bien sur.

    Il faut plutôt comprendre, ckautomatique, si c'est une table et que le SGBD le permet ckDynamic sera utilisé sinon ce sera ckDefault
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Et depuis mon dernier message, j'ai découvert que, en édition, ça ne marche plus et recno n'est plus discriminant, quelle que soit la valeur de cursorkind ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/07/2020, 19h39
  2. Trouver différence entre 2 tables mysql
    Par zoocoral dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/10/2016, 21h48
  3. [MySQL-5.5] Différence entre Round() sous MySQL et PHP
    Par alainyvan dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/01/2015, 13h28
  4. différence entre paradoxe et les autres
    Par sofianoo dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/03/2007, 16h31
  5. [pb MD5 MySql et C#]Différence entre les chaines
    Par ludovic85 dans le forum C#
    Réponses: 1
    Dernier message: 31/01/2007, 22h11

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