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

Lazarus Pascal Discussion :

Lazarus, Zeos, MySql et les champs autoincrémentés


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut Lazarus, Zeos, MySql et les champs autoincrémentés
    Bonjour,

    J'écris ici, mais le problème concerne peut-être seulement Zeos et donc aussi Delphi.

    Soit une table définie sous MySql avec une clef primaire autoincrémentée sur le premier champ.

    Quand je veux créer un enregistrement par du code, je ne remplis pas le champ autoincrémenté, et les enregistrements se créent en le calculant, c'est parfait.

    Mais comment savoir quelle valeur a été donnée à la clef juste après création de l'enregistrement (après le .post), pour créer des enregistrements dans une table fille ?

    En récupérant LaTable.Fields[0].Value, on a parfois la bonne valeur, mais souvent le champ reste égal à zéro. Ça semble assez aléatoire. J'ai essayé Refresh et ApplyUpdates sans succès...

    Est-ce que ça dépend d'une propriété de la table ou du champ ? Ou bien il ne faut pas espérer utiliser les champs autoincrémentés par le SGBD ?

    Merci pour toute suggestion !

    Cordialement,
    Tintinux

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 163
    Points : 41 346
    Points
    41 346
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par tintinux Voir le message
    Est-ce que ça dépend d'une propriété de la table ou du champ ? Ou bien il ne faut pas espérer utiliser les champs autoincrémentés par le SGBD ?
    avec MySQL , je ne sais pas , mais avec firebird j'ai toujours préféré récupéré la valeur du dernier autoincrement en interrogeant directement le compteur par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT GEN_ID(GEN_MON_GENERATEUR,0) FROM RDB$DATABASE
    avec ZEOSDBO il y a également la possibilité d'utiliser le composant TZSequence cependant cela implique de ne pas utiliser de trigger pour l'autoincrement (est-ce possible avec mySQl ?) et de bien l'indiquer à la création de l'enregistrement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 248
    Points : 538
    Points
    538
    Par défaut
    Bonjour,
    Citation Envoyé par SergioMaster Voir le message
    avec firebird j'ai toujours préféré récupéré la valeur du dernier autoincrement en interrogeant directement le compteur par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT GEN_ID(GEN_MON_GENERATEUR,0) FROM RDB$DATABASE
    Pas très sûre la méthode en environnement multi-utilisateurs, car rien ne garantit qu'un autre utilisateur n'ait inséré un nouvel enregistrement entre-temps. Dans des cas comme celui-là je préfère incrémenter le générateur de 1 (GEN_MON_GENERATEUR,1) et utiliser la valeur pour l'INSERT. Mais on ne parle plus de champ autoincrémenté...
    Depuis la v2.1 de Firebird il y a bien le [RETURNING <column_list> [INTO <variable_list>]] dans une requête INSERT, UPDATE ou DELETE qui permettrait de retourner la valeur du champ, mais je ne sais pas quels composants de Lazarus l'acceptent?

    André

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bon, merci pour vos suggestions, mais cela ne m'aide pas beaucoup.

    Je confirme alanglet : l'auto-increment est le plus efficace, en théorie, pour ne pas avoir de conflits en environnement multi-utilisateur.

    Sinon il faut passer par une table supplémentaire de compteurs qu'on verrouille rapidement, mais c'est pas terrible.

    Cordialement,

    tintinux

  5. #5
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    C'est pourtant simple de chercher ce genre d'info
    La réponse est sur mon site ici

    je repars Qt mes choux

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 248
    Points : 538
    Points
    538
    Par défaut
    Bonjour,
    Citation Envoyé par chris37 Voir le message
    C'est pourtant simple de chercher ce genre d'info
    La réponse est sur mon site ici
    Si tu veux parler de "--Dernier auto-inc ajouter
    SELECT DISTINCT LAST_INSERT_ID() FROM 'MATABLE'" qui je pense est l'équivalent Firebird "SELECT GEN_ID(GEN_MON_GENERATEUR,0) FROM RDB$DATABASE" proposé par SergioMaster, il a le même inconvénient. Es-tu sûr qu'un autre utilisateur n'a pas fait un autre INSERT entre-temps?
    C'est tout l'intérêt du RETURNING de Firebird (par exemple si la clé est fournie par un trigger before insert, méthode équivalente à un autoincrément).
    Le "SELECT GEN_ID(GEN_MON_GENERATEUR,1) FROM RDB$DATABASE" fournissant une nouvelle clé unique avant de faire l'INSERT avec la clé obtenue ou dans le trigger before insert me semble aussi sûr que l'autoincrément.

    André

  7. #7
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Bonsoir,

    Ces fonctions sont justement faites de façons à travailler à plusieurs en isolement total et donc de récupérer uniquement le dernier ID ajouté par TON dernier Insert et non celui du petit copain (Lors de la session active évidement ). La bidouille se voulant d'utiliser des Trigger ou autres mécanismes de gestion de compteurs pour l'autoinc à la sauvage est à proscrire totalement. (Perte de perf et peu fiable en cas de crash de la base)

    C'est là toute la puissance de la chose sinon nombre d'applis de ce monde seraient un peu bancales

    Voilu

  8. #8
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par Chris37
    La réponse est sur mon site ici
    Je suis désolé, mais je ne vois pas la réponse, ou alors ce n'est pas une réponse à ma question initiale.

    Ma question était de récupérer le dernier Id inséré après un ZdbTable.Insert (dans un dbGrid).

    Je ne parlais pas d'utiliser des TZQuery supplémentaires, ce qui reste faisable, effectivement dans une transaction isolée, mais me parait un peu plus lourd dans le cas qui m'occupe.

    Merci,
    Tintinux

  9. #9
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Hello,

    C'est pourtant simple de faire un
    SELECT DISTINCT LAST_INSERT_ID() FROM 'MATABLE'
    Je ne sais plus si Zeos a une méthode appelant directement le lastinsertid (voir la doc) car sinon c'est la requête du dessus qu'il faut utiliser.

    Pour infos, il est aussi déconseiller d'utiliser des composant tables (Trop de charge mémoire et ca ne sert à rien de monter tous les records d'une table en mémoire). Mieux vaut privilégier les query car c'est plus facile pour filtrer les données et faire de belles jointures

    @+

  10. #10
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour,

    Je me répète : Je sais faire avec des Query avec SELECT. Ma question c'était avec les types TTable.

    Donc la conclusion provisoire est qu'il n'est pas possible de récupérer le LAST_INSERT_ID de MySql de cette manière, du moins de manière fiable (comme indiqué, ça marche parfois, je crois que c'est prévu mais bogué - à creuser).

    On ne pourrait donc pas toujours utiliser les TTable, avec Lazarus et Zeos ?
    Pour info, j'ai des vieilles applis avec gros volumes et accès concurrents qui fonctionnent parfaitement ainsi avec Delphi 5 et BDE. En tous cas c'est quand même plus simple pour des besoins simples (données de base, par exemple).

    Il y a quand même un inconvénient de l'utilisation d'un TQuery pour récupérer le dernier Id inséré : la syntaxe du SELECT dépend du SGBD et ce n'est apparemment pas normalisé.

    Cordialement,
    Tintinux

  11. #11
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Bonjour

    Je vous comprend,

    Celle que je vous ai donné est celle de mysql mais il est simple de l'implémenter dans une classe qui donne la bonne syntaxe en fonction du pilote utilisé. Par contre concernant zeos, ca me surprend qu'il n'y ai pas une méthode qui traine....

    J'avais demandé à Luis de l'implémenter dans le code en natif de Lazarus mais je crois que c'est resté en carafe comme le reste des fonctions SGDB . Une des raisons de mon arrêt de Lazarus.

    Cordialement,

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 163
    Points : 41 346
    Points
    41 346
    Billets dans le blog
    63
    Par défaut
    Salut Chris

    Citation Envoyé par chris37 Voir le message

    J'avais demandé à Luis de l'implémenter dans le code en natif de Lazarus mais je crois que c'est resté en carafe comme le reste des fonctions SGDB . Une des raisons de mon arrêt de Lazarus.
    je pense que tu parles de TZSequence (qui fonctionne très bien d'ailleurs)
    cependant cela nécessite de gérer ce champ dans le programme et non comme posé
    Quand je veux créer un enregistrement par du code, je ne remplis pas le champ autoincrémenté, et les enregistrements se créent en le calculant, c'est parfait.
    et donc surtout pas de trigger (là je pense firebird) pour remplir le champ,
    (quoique avec un test sur la nullité du champ dans le trigger ???? , je vais tester .... mais pas forcément Lazarus que moi aussi je met de coté de puis l'annonce Codegear plus d'infos apres le codeway Nantes de la semaine prochaine )

  13. #13
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Salut vieux Pirate

    Je ne parlais pas de ZEOS mais directement des classes TSQLQuery et TSQLScript auquelles il manquent des fonctions.
    Tout comme la classe TSQLConnection qui n'est pas finie malgré les pach que j'ai fourni il y a 2 ans déjà et qui n'ont jamais été implémenté.

    Il commence a y a avoir du monde en moins sur Lazarus car Laurent (wile64) ne fournit plus de code au projet initial et un des principaux développeurs a également arrêté.

    Souhaitons que l'équipe se ressaisisse vite et que les Français se bouge un peu plus...

    @+

  14. #14
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Numéro d'enregistrement
    Bonjour,
    Je viens du monde windev et j'ai migré vers Linux parce que franchement marre de win. Je suis développeur pro en fin de carrière. Je ne veux pas perdre la main et je voudrai faire dans l'open. Voila pour le pédigrée.
    J'ai cherché parmi beaucoup de possibilités pour faire du développement (y compris ada!). Eric4 et autres Geany ne sont pas fiables. Impossible de travailler avec. Mais j'ai découvert et (presque ?) adopté Lazarus. Pour moi, Pascal est un langage inédit et un peu lourd (une forêt de begin-end et points virgules à profusion) mais facile à apprendre et ,ce que je cherche surtout, compilé. Avec l'IDE en prime qui me rappelle windev. Mais avant de me lancer j'ai lu les divers messages dont celui-ci (et les doutes des développeurs en production ...)
    Sous windev (que je connais depuis la version 1 mais abandonné à la 7) j'ai eu le même problème (autoincrément et le récupérer ensuite) et je l'ai résolu bêtement en passant par les numéros d'enregistrements, ce que permet windev via son hyperfile.
    Donc, peut-être question bête et naïve (ou début de réponse ?), il n'est pas possible de faire ça avec les gestionnaires de db style sqllite et autre MySql ?

    Pour Chris37 : tu es semble-t-il un futur ex-utilisateur de Lazarus. Me le conseillerais-tu quand même de l'utiliser ou est-ce que je risque d'investir du temps pour rien selon ton expérience ? Merci d'avance pour la réponse.

    Cordialement.

  15. #15
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Bon, nous allons être un peu hors sujet ici mais je vais répondre à votre question. Les modo me pardonneront

    -Concernant Windev, je suis avec ce produit depuis le tout début et actuellement en version 12 avec mysql en base de données qui gère toute la boite. Je n'ai AUCUN soucis avec les champs autoincrémentés....

    -J'ai un robot de services pour le back office qui tourne en Lazarus avec mysql et Je n'ai AUCUN soucis avec les champs autoincrémentés.... (Faut juste dériver la classe de base et lui ajouté 2 ou 3 petites bricoles)

    -Idem pour SQLite que j'ai testé, il y a des meta fonctions qui renvoi bien le dernier numéro d'enregistrement

    -Idem pour PostGreSQL

    En conclusion et si l'on prend le temps d'apporter les petites modifications nécessaires, ca fonctionne au poil.

    Voir mon site pour plus d'information sur tout cela

    @+

  16. #16
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour,

    Je te rassure, on toujours récupérer la valeur de l'auto-incrément, si elle est retournée par le SGBD, avec un TQuery et comme expliqué par Chris.

    Le sujet de ce message est que cela semble aléatoire, pour l'instant, avec des TZTable. Mais ce n'est pas la seule manière de se connecter à une base de données, et dès que les choses deviennent pointues ce n'est sans doute pas la meilleure, pour bien d'autres raisons.

    Sinon, moi ça va faire bientôt 30 ans que j'ai découvert pascal, ce langage inédit comme tu dis !

    Lazarus étant open source, on ne sera plus promenés par les éditeurs qui, pour des raisons purement commerciales, pour avoir l'air au goût du jour, font une fois du Win32, puis du .net pour ensuite passer à QT et je ne sais quoi encore, ou bien 4 ou 5 composants d'accès aux bases de données, tous ne différant finalement que par leurs bugs. Les errements de Borland et CodeGear dans les années passées m'ont couté cher en temps ou en perte de clients qui ne veulent pas payer pour des migrations techniques.

    Bon mais je crois que ça part en vrille ce sujet, et qu'il faudrait mieux débattre ailleurs de l'avenir de Lazarus.

    Cordialement,
    Tintinux

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Tintinux qui écrit :
    "Sinon, moi ça va faire bientôt 30 ans que j'ai découvert pascal, ce langage inédit comme tu dis ! "

    J'ai dû manquer de clarté : J'ai vu ce langage à l'oeuvre en 1977. Donc pas inédit. Mais je n'ai jamais travaillé avec sauf maintenant, ça c'est inédit

    J'ai l'impression que je peux investir dans Lazarus si je comprends entre les lignes ... et je n'ai pas peur de le modifier si il le faut.

    Cordialement.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/08/2008, 09h49
  2. [MYSQL] Commentaires sur les tables et les champs
    Par luc2verga dans le forum Requêtes
    Réponses: 10
    Dernier message: 29/05/2007, 23h49
  3. j'arrive pas a selectionner les champ d'un tableau a mysql
    Par ghita269 dans le forum Administration
    Réponses: 3
    Dernier message: 04/07/2006, 12h38
  4. Mysql : choix des types pour les champs entre :
    Par Thierry8 dans le forum Administration
    Réponses: 3
    Dernier message: 14/06/2006, 08h22
  5. Afficher tous les champs d'une table avec dbexpress et MySQL
    Par LHT dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/06/2004, 17h11

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