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 :

Récupérer le transaction ID avec le TFDTransaction


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut Récupérer le transaction ID avec le TFDTransaction
    Bonjour ou re-bonjour

    J'ai besoin de récupérer la valeur du champ MON$TRANSACTION_ID de ma transaction (ou une autre information me permettant d'identifier ma transaction ) dans la table MON$TRANSACTIONS de Firebird.
    Alors, dans ma grande naïveté, je me suis dis que j'allais gérer moi-même ma transaction en utilisant un TFDTransaction pour récupérer le ID de la transaction
    Bah non, pas de "id transaction" dans le composant.

    Quelqu'un pourrait-il m'expliquer comment récupérer cette info, svp ?
    Merci beaucoup d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Le moins que l'on puisse dire après nos différents échanges est que votre approche est pour le moins étrange (un coup questions sur le forum firebird, un coup delphi) et tout ça sans vraiment une description pertinente de ce qui est voulu si l'on excepte l'insertion de beaucoup de lignes au sein d'une même transaction.

    Je présume que la valeur MON$TRANSACTION_ID est voulue pour récupérer les statistiques Firebird tel que demandé ici

    Je m'interroge vraiment sur la manière d'aborder le problème mal défini. Au fil des lectures, j'ai cru comprendre que les diverses instructions d'un BLOCK au sens firebird du terme étaient générées via du code, mais beaucoup d'interrogations demeurent sur le comment.

    Sachant que firedac peut remonter beaucoup d'informations pour peu d'utiliser les bons composants.
    Par exemple :
    • Le TFDBatchMove (sans même parler du log) permet d'obtenir les readcount,updatecount,writecount et deletecount ce qui est je crois le but recherché.
    • Le TFDMoniCustomClientLink permet de monitorer l'activité d'une session
    • rien que le FDQuery a des propriétés comme RowsAffected


    Pour moi, une définition claire du problème et non des demandes partielles comme ( Exécuter un gros bloc d'ordres avec "Execute block" et Problème d'exécution d'un TFDQuery.) serait nécessaire
    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 du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Le moins que l'on puisse dire après nos différents échanges est que votre approche est pour le moins étrange (un coup questions sur le forum firebird, un coup delphi)
    Ben, à moi, ça me paraît simple, une question concernant l'administration Firebird dans le forum Administration Firebird,
    puis cette question sur des composants Delphi dans le forum composants Delphi
    Citation Envoyé par SergioMaster Voir le message
    et tout ça sans vraiment une description pertinente de ce qui est voulu si l'on excepte l'insertion de beaucoup de lignes au sein d'une même transaction.
    Et aucun rapport avec les EXECUTE BLOCK.
    Citation Envoyé par SergioMaster Voir le message
    Je présume que la valeur MON$TRANSACTION_ID est voulue pour récupérer les statistiques Firebird tel que demandé ici
    carrément oui.

    Ce que j'essaie de faire est de récupérer le nombre d'enregistrements modifiés par une transaction dans une base Firebird.
    Au vu des informations stockées dans les tables systèmes, il m'a semblé comprendre qu'il me faut absolument la référence de la transaction exécutée pour pouvoir exploiter les stats...
    La transaction en question étant celle exécutée par l'application Delphi avec les composants Firedac.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Pour obtenir MON$TRANSACTION_ID à partir de l'application il faudrait faire une query pendant que la transaction est "ouverte" (mon$state=1)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T.MON$TRANSACTION_ID
    FROM MON$ATTACHMENTS r JOIN MON$TRANSACTIONS T on T.MON$ATTACHMENT_ID=R.MON$ATTACHMENT_ID
    WHERE r.MON$SYSTEM_FLAG=0 AR r.MON$STATE=1 AND r.MON$REMOTE_PROCESS=:application_name

    où :application_name est le nom (chemin inclus) de l'application qui a utilisé la transaction
    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

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    [*]Le TFDMoniCustomClientLink permet de monitorer l'activité d'une session
    Ah ben merci, je vais me pencher la-dessus.
    Citation Envoyé par SergioMaster Voir le message
    [*]rien que le FDQuery a des propriétés comme RowsAffected
    Ce n'est pas l'information retournée par les composants que je voudrais, mais celles existant dans la base de données.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Pour obtenir MON$TRANSACTION_ID à partir de l'application il faudrait faire une query pendant que la transaction est "ouverte" (mon$state=1)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T.MON$TRANSACTION_ID
    FROM MON$ATTACHMENTS r JOIN MON$TRANSACTIONS T on T.MON$ATTACHMENT_ID=R.MON$ATTACHMENT_ID
    WHERE r.MON$SYSTEM_FLAG=0 AR r.MON$STATE=1 AND r.MON$REMOTE_PROCESS=:application_name
    Magnifique ! Je vais plutôt essayer ça. Franchement, ça ne s'invente pas
    Encore merci Sergio.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Franchement, ça ne s'invente pas
    ça se travaille via les documents fournis.

    P.S. le FDMonitoring n'est pas la solution pour obtenir l'id de la transaction
    P.P.S. il existe bien un FDTransaction.TransactionIntf.SerialId mais ne correspond pas au mon$transaction_id
    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
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    ça se travaille via les documents fournis.
    Ah ben quand j'aurai travaillé le sujet, ça ira mieux
    Sinon, ça sert à quoi d'avoir des forums si c'est pour arriver après avoir travaillé le sujet

    Quand on sait poser une question parfaitement, c'est qu'on a déjà la réponse .

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Ah ben quand j'aurai travaillé le sujet, ça ira mieux
    Sinon, ça sert à quoi d'avoir des forums si c'est pour arriver après avoir travaillé le sujet

    Quand on sait poser une question parfaitement, c'est qu'on a déjà la réponse .
    personnellement je pose deux types de questions:

    1) je n'ai jamais travaillé sur tel sujet, existe il des solutions toutes faites ou une documentation explicite ?
    2) j'ai bossé le sujet, mais il y a un truc que je comprend pas, qui ne fonctionne pas, qui peux m'expliquer ?

    mais je pose rarement des questions en fait.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Ah ben quand j'aurai travaillé le sujet, ça ira mieux
    Sinon, ça sert à quoi d'avoir des forums si c'est pour arriver après avoir travaillé le sujet
    Cela sert à montrer qu'on a fait des efforts pour trouver la solution plutôt que de se dire que quelqu'un fera cela ta place.
    Cf. les règles du forum : http://club.developpez.com/regles/#LIV-N

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    D'ailleurs, FireDAC ce n'est pas de la VCL, donc autant déplacer le sujet dans section Forum > Environnements de développement > Delphi > Bases de données

    Une question select current_transaction from rdb$database c'est peut-être plus léger que MON$TRANSACTIONS ?
    Je n'ai jamais fait de firebird mais il y a la doc : https://firebirdsql.org/refdocs/lang...ansaction.html
    D'ailleurs MON$TRANSACTIONS ne renvoient toutes les connexions, comment gérer la bonne transaction avec le chemin de l'exe avec le même exe lancé plusieurs fois ou avec du multithread ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    C'est confirmé par le code source de FireBirdSQL : https://github.com/FirebirdSQL/fireb...ing_tables#L35
    Par exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT MON$ISOLATION_MODE
            FROM MON$TRANSACTIONS
            WHERE MON$TRANSACTION_ID = CURRENT_TRANSACTION
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    D'ailleurs, FireDAC ce n'est pas de la VCL, donc autant déplacer le sujet dans section Forum > Environnements de développement > Delphi > Bases de données
    Ce que je viens de faire, j'avais eu la flemme hier

    Une question select current_transaction from rdb$database c'est peut-être plus léger que MON$TRANSACTIONS ?
    Pas sûr que cela donne le bon résultat, bonne idée, il faudra que je fasse un test

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    var t : string;
    begin
    FDConnection1.Connected:=True;
    t:=fdConnection1.ExecSQLScalar('Select CURRENT_TRANSACTION From RDB$DATABASE');
    Memo1.Lines.Add('ExecSQlScalar 1 = '+t);
    fdQuery1.SQL.Clear;
    fdquery1.SQL.Add('EXECUTE BLOCK AS BEGIN');
    fdquery1.SQL.Add('DELETE FROM TEST;');
    fdquery1.SQL.Add('INSERT INTO TEST (ID, NOM)  VALUES (''1'',''nom'');');
    fdquery1.SQL.Add('INSERT INTO TEST (ID, NOM)  VALUES (''2'',''nom2'');');
    fdquery1.SQL.Add('END');
    try
    fdquery1.Transaction:=FDtransaction1;
    t:=fdConnection1.ExecSQLScalar('Select CURRENT_TRANSACTION From RDB$DATABASE');
    Memo1.Lines.Add('ExecSQlScalar 2 = '+t);
    fdTransaction1.StartTransaction;
    try
     fdquery1.ExecSQL;
     Showmessage(fdQuery1.RowsAffected.ToString);
     FDTransaction1.Commit;
    except
     on e:Exception do
      begin
        showmessage(e.Message);
        FDTransaction1.Rollback;
      end;
    end;
    finally
     fdquery1.Transaction:=nil;
    end;
    FDConnection1.Connected:=False;
    en bleu les vérifications par l'obtention de CURRENT_TRANSACTION
    Citation Envoyé par Monitoring + vérification
    >> StartTransaction [ConnectionDef=""]
    << StartTransaction [ConnectionDef=""]
    >> Open [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    << Open [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Fetch [ATable="RDB$DATABASE", Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Fetched
    . Var [N=0, Type=SQL_INT64, Prec=0, Scale=0, Size=8, Data=486]
    << Fetched
    << Fetch [ATable="RDB$DATABASE", Command="Select CURRENT_TRANSACTION From RDB$DATABASE", RowsAffected=1]
    . Eof reached [ATable="RDB$DATABASE", Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Close [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Commit [ConnectionDef="", Retaining=False]
    << Commit [ConnectionDef="", Retaining=False]
    << Close [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    ExecSQlScalar 1 = 486
    >> Open [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> StartTransaction [ConnectionDef=""]
    << StartTransaction [ConnectionDef=""]
    << Open [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Fetch [ATable="RDB$DATABASE", Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Fetched
    . Var [N=0, Type=SQL_INT64, Prec=0, Scale=0, Size=8, Data=487]
    << Fetched
    << Fetch [ATable="RDB$DATABASE", Command="Select CURRENT_TRANSACTION From RDB$DATABASE", RowsAffected=1]
    . Eof reached [ATable="RDB$DATABASE", Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Close [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    >> Commit [ConnectionDef="", Retaining=False]
    << Commit [ConnectionDef="", Retaining=False]
    << Close [Command="Select CURRENT_TRANSACTION From RDB$DATABASE"]
    ExecSQlScalar 2 = 487
    >> StartTransaction [ConnectionDef=""]
    << StartTransaction [ConnectionDef=""]
    >> Execute [Command="EXECUTE BLOCK AS BEGIN
    DELETE FROM TEST;
    INSERT INTO TEST (ID, NOM) VALUES ('1','nom');
    INSERT INTO TEST (ID, NOM) VALUES ('2','nom2');
    END", ATimes=0, AOffset=0]
    << Execute [Command="EXECUTE BLOCK AS BEGIN
    DELETE FROM TEST;
    INSERT INTO TEST (ID, NOM) VALUES ('1','nom');
    INSERT INTO TEST (ID, NOM) VALUES ('2','nom2');
    END", ATimes=1, AOffset=0, RowsAffected=0, RowsAffectedReal=True, ErrorAction=5]
    >> Commit [ConnectionDef="", Retaining=False]
    << Commit [ConnectionDef="", Retaining=False]
    Cela semble bon, mais c'est pour le programme en cours, pas forcément donc, pour vérifier ce qui a été fait par un utilisateur, un autre programme, une certaine période, etc.
    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

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    J'ai supposé que l'idée était de récupérer la transaction en cours, celle que l'on utilise à l'instant T.
    Je ne crois pas que l'idée est de faire une sorte de journal de transaction pour un outil de monitoring, c'est plus simple comme question.

    C'est vrai que donner le contexte et la raison de vouloir récupérer le numéro de la transaction aiderait pour apporter une réponse voire une autre approche
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    personnellement je pose deux types de questions:

    1) je n'ai jamais travaillé sur tel sujet, existe il des solutions toutes faites ou une documentation explicite ?
    2) j'ai bossé le sujet, mais il y a un truc que je comprend pas, qui ne fonctionne pas, qui peux m'expliquer ?

    mais je pose rarement des questions en fait.
    Salut Paul. Si je pose ces questions, on va me répondre par une question
    Toujours à la Réunion ?

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Merci ShaiLeTroll,
    Je vais tester les deux solutions et je ferai un retour.

    Citation Envoyé par ShaiLeTroll Voir le message
    J'ai supposé que l'idée était de récupérer la transaction en cours, celle que l'on utilise à l'instant T.
    Je ne crois pas que l'idée est de faire une sorte de journal de transaction pour un outil de monitoring, c'est plus simple comme question.
    C'est tout à fait ça.
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est vrai que donner le contexte et la raison de vouloir récupérer le numéro de la transaction aiderait pour apporter une réponse voire une autre approche
    Comme quoi, ce n'était pas forcément utile. Tu as parfaitement compris

    Merci encore.

  17. #17
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par popo Voir le message
    Cela sert à montrer qu'on a fait des efforts pour trouver la solution plutôt que de se dire que quelqu'un fera cela ta place.
    Cf. les règles du forum : http://club.developpez.com/regles/#LIV-N
    Oui Popo

  18. #18
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Bonjour à tous.tes,

    La version de Sergio a l'immense avantage d'être liée à l'application.
    Donc ça marche nickel, il me renvoi bien le numéro de la transaction d'après le nom de l'application.

    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
          QryNumTr := TFDQuery.Create(nil);
     
          with QryNumTr, SQL do
          begin
            Connection := Qry.Connection;
            Text       := 'SELECT t.MON$TRANSACTION_ID ' +
                          'FROM MON$TRANSACTIONS t JOIN MON$ATTACHMENTS a ON t.MON$ATTACHMENT_ID = a.MON$ATTACHMENT_ID  ' +
                          'WHERE a.MON$STATE = 1 AND a.MON$REMOTE_PROCESS = ' + QuotedStr(Application.ExeName)      //a.MON$SYSTEM_FLAG = 0 AND
                          ;
          end;
     
          with Qry, SQL do
          begin
            try
              QryTr.StartTransaction;
              QryNumTr.Open;
     
              ShowMessage(IntToStr(QryNumTr.Fields[0].AsInteger));
     
              ExecSQL;
    Mais est-il possible de faire la même chose avec le "numéro de l'instance" de l'application, au cas où plusieurs instances de cette application seraient actives ?
    En demandant gentiment ?
    Merci d'avance.

    P.S. je n'ai pas trouvé MON$SYSTEM_FLAG dans les tables. Est ce que c'est important ?

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par DOliv Voir le message
    P.S. je n'ai pas trouvé MON$SYSTEM_FLAG dans les tables. Est-ce que c'est important ?
    pas si la version Firebird est la 2.5

    'WHERE a.MON$STATE = 1 AND a.MON$REMOTE_PROCESS = ' + QuotedStr(Application.ExeName)
    NON,NON et NON c'est carrément mal compris ! En plus, OMG, ces create sans try finally, ces with de quoi planter !

    Si j'ai mis un paramètre à la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T.MON$TRANSACTION_ID
    FROM MON$ATTACHMENTS r JOIN MON$TRANSACTIONS T on T.MON$ATTACHMENT_ID=R.MON$ATTACHMENT_ID
    WHERE r.MON$SYSTEM_FLAG=0 AR r.MON$STATE=1 AND r.MON$REMOTE_PROCESS=:application_name
    ce n'est pas pour rien et autant l'utiliser !

    Query1.ParamByName('application_name').asString:=Application.exename; ou Query1.Open('',[Applcation.exename]);Et ce paramètre n'est là que pour indiquer un nom d'application, pas forcément le programme en cours





    S'il s'agit de l'application en cours, autant passer par le code que j'ai proposé suite à la réflexion de ShaileTroll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FDConnection1.Connected:=True;
    t:=fdConnection1.ExecSQLScalar('Select CURRENT_TRANSACTION From RDB$DATABASE');
    Memo1.Lines.Add('ExecSQlScalar 1 = '+t);
     
    fdquery1.Transaction:=FDtransaction1;
    FdTransaction1.StartTransaction;
    fdQuery1.open('Select CURRENT_TRANSACTION From RDB$DATABASE');
    Memo1.Lines.Add('Query transaction= '+fdQuery1.FiedByName('CURRENT_TRANSACTION').asString);

    Mais est-il possible de faire la même chose avec le "numéro de l'instance" de l'application, au cas où plusieurs instances de cette application seraient actives ?
    C'est là où ça coince, on l'avait bien souligné plusieurs fois, et c'est bien pour cela qu'il faut étudier à fond la structure des tables de monitoring.
    Il y a bien la colonne MON$REMOTE_PID de la Table MON$ATTACHMENTS mais cela n'a certainement pas grand-chose à voir avec le "numéro de l'instance"
    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

  20. #20
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    ces create sans try finally, ces with de quoi planter !
    Remets toi Sergio, bien sûr qu'il y a des try finally
    Quant à la légende des with qui créeraient des bugs, j'attends toujours qu'on me montre un cas concret ...

    Citation Envoyé par SergioMaster Voir le message
    Et ce paramètre n'est là que pour indiquer un nom d'application, pas forcément le programme en cours

    S'il s'agit de l'application en cours, autant passer par le code que j'ai proposé suite à la réflexion de ShaileTroll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FDConnection1.Connected:=True;
    t:=fdConnection1.ExecSQLScalar('Select CURRENT_TRANSACTION From RDB$DATABASE');
    Memo1.Lines.Add('ExecSQlScalar 1 = '+t);
    Oui, ça me semble intéressant.
    Citation Envoyé par SergioMaster Voir le message
    C'est là où ça coince, on l'avait bien souligné plusieurs fois, et c'est bien pour cela qu'il faut étudier à fond la structure des tables de monitoring.
    Il y a bien la colonne MON$REMOTE_PID de la Table MON$ATTACHMENTS mais cela n'a certainement pas grand-chose à voir avec le "numéro de l'instance"
    Ok merci pour ces précisions, je me mets dessus dès que possible.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [FTP] Récupérer un ficher distant avec ftp_get
    Par boteha dans le forum Langage
    Réponses: 6
    Dernier message: 25/03/2010, 09h41
  2. Réponses: 6
    Dernier message: 27/12/2005, 13h48
  3. Récupérer tous les champs avec un DISTINCT
    Par Le Mérovingien dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/11/2005, 23h58
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35

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