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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    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
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 073
    Points : 41 032
    Points
    41 032
    Billets dans le blog
    62
    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
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 246
    Points : 535
    Points
    535
    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 : 66
    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
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  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 : 55
    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
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 246
    Points : 535
    Points
    535
    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 à 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.

  8. #8
    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 : 55
    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

    @+

  9. #9
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    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
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  10. #10
    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