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

Administration Firebird Discussion :

Vérifier le nombre de lignes insérées, updatées ou deletées.


Sujet :

Administration Firebird

  1. #21
    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
    Salut Sergio.

    Sehr simple :
    Avec un Query QryNumTr, je voudrais récupérer le numéro de transaction généré dans la base par un query dont l'objet transaction s'appelle QryTr.
    J'ai donc retiré l'autostart de QryTr afin de :
    1- démarrer la transaction de QryTr
    2- lancer QryNumTr pour récupérer le numéro de transaction généré par le 1-
    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
            QryTr.StartTransaction;   //transaction de Qry
     
            //récupération du numéro de transaction
     
            QryNumTr := TFDQuery.Create(nil);
     
            with QryNumTr, SQL do
            begin
              Connection := Qry.Connection;
              Text          := 'SELECT CURRENT_TRANSACTION FROM RDB$DATABASE';
              Open;
     
              NumTransac := Fields[0].AsString;
            end;
     
            //
     
            with Qry, SQL do
            begin
              ExecSQL;
    Mais, du coup, je dois sûrement récupérer le numéro de transaction de QryNumTr que je lance, de toute façon, après QryTr Quel boulet (ou pas ? )

  2. #22
    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
    b) Qu'il est temps de changer de version de Firebird pour avoir les évolutions du monitoring
    D'accord, mais c'est pas moi le boss Trop passé de temps avec les filles pour monter ma boîte Ah celles là !

  3. #23
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Mais, du coup, je dois sûrement récupérer le numéro de transaction de QryNumTr que je lance, de toute façon, après QryTr Quel boulet (ou pas ? )

    Déjà un beau mélange de genre puisque sur le forum Firebird alors que c'est plus du Delphi qu'autre chose (en plus ce code est mal écrit)

    //transaction de QryNB. une transaction de Query ?! peut être un FDTransaction différent de celui de la connexion donc ce n'est pas explicite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FDConnection.StartTransaction;  
    NumTransac:=FdConnection.ExecSQLScalar( 'SELECT CURRENT_TRANSACTION FROM RDB$DATABASE');
    et voilà déjà 8 lignes supprimées
    quant à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       with Qry, SQL do
            begin
              ExecSQL;
    ça ne nous amène à rien d'explicite et pourquoi ne pas passer directement par le fdConnexion puisque c'est un ExecSQL sans retour de résultat ?


    et je ne comprends toujours pas le besoin ! Et, ce malgré ce qui a pu être écrit dans la discussion Delphi
    https://www.developpez.net/forums/d2...fdtransaction/
    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

  4. #24
    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
    Euh oui, je crois qu'on est pas du tout sur la même longueur d'onde
    Le code SQL de Qry n'est pas là.
    Le code présenté est juste pour présenter le déroulement de la manip.
    Si j'enlève les lignes que tu as retirées, ça risque pas de marcher

  5. #25
    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
    En fait, je pense avoir la soluce, mais pas tout à fait.
    Effectivement, en faisant comme ça, je ramène le numéro de transaction de la transaction que je lance pour le récupérer
    Du coup, il faut juste que je récupère le numéro précédent.
    Mais comment être sûr qu'une transaction n'a pas été lancée sur la base dans l'intervalle ?
    Du coup, c'est ce numéro que je récupérerais.

  6. #26
    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

    Déjà un beau mélange de genre puisque sur le forum Firebird alors que c'est plus du Delphi qu'autre chose
    Mais oui, en fait le sujet est le même.

    Je veux récupérer le numéro de transaction pour récupérer les info de la table MON$RECORD_STATS (<- Mais c'est pas facile d'expliquer ça. )
    Donc, du coup c'est, de fait, un mélange de genres

    Dès que j'ai la solution que je cherche je publierai mon magnifique code

    Merci pour ton temps et tes pistes, je n'aurais jamais pu trouver tout seul les endroits où intervenir. Sauf à lire la doc Firebird en entier (avant de poser une question dont j'aurai eu, du coup, la réponse avant de poster cette question, qui n'en aurait plus été une, sur un forum ).

    Ich liebe dich

  7. #27
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Euh oui, je crois qu'on est pas du tout sur la même longueur d'onde
    Entièrement, ta faute, car le problème n'est pas/est mal exposé.
    Là, on est dans le forum Firebird pas dans Delphi
    Citation Envoyé par DOliv Voir le message
    Si j'enlève les lignes que tu as retirées, ça risque pas de marcher
    Il suffit de rajouter la manip suivante avant de clore la transaction, je n'ai fait que réduire une partie code permettant d'éviter de nombreuses erreurs, je n'ai pas relevé les divers with ou le Create sans Free.
    Tant qu'à faire de mettre du code Delphi pour demander des explications autant écrire quelque chose de correct (ce qui est rarement ton habitude)
    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. #28
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Mais oui, en fait le sujet est le même.
    Autant alors rester Delphi
    Je veux récupérer le numéro de transaction pour récupérer les info de la table MON$RECORD_STATS
    c'est là où le bât blesse : L'utilité de cette démarche car si je me souviens bien (c'est le problème de jongler entre les 2 forums et 3 discussions) le départ, c'était d'utiliser un script contenant un ensemble d'instructions SQL. Ce décompte/contrôle n'est venu qu'après car tu étais incapable d'utiliser ou n'a pas voulu utiliser FDScript et persisté en un EXECUTE BLOCK
    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

  9. #29
    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
    Autant alors rester Delphi

    c'est là où le bât blesse : L'utilité de cette démarche car si je me souviens bien (c'est le problème de jongler entre les 2 forums et 3 discussions) le départ, c'était d'utiliser un script contenant un ensemble d'instructions SQL.
    Non Sergio. Ca, c'était la solution que tu avais proposée. Et que j'ai testée.
    Citation Envoyé par SergioMaster Voir le message
    ou n'a pas voulu utiliser FDScript et persisté en un EXECUTE BLOCK
    Exactement.

    C'est cette solution qui a été retenue.
    Et quand j'aurai fini, je ne sais pas quand, mais bientôt, je publierai la solution pour ceux qui ne veulent pas utiliser un Script à cause du temps d'exécution

  10. #30
    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
    Donc, ce code écrit en Delphi correct, aéré et lisible, nonobstant les légendes créées par les pisseurs de code (qui ne maîtrisent donc pas leur code )
    je mets à jour plus de 5.000 lignes en 17 sec dans une base Firebird sur réseau local, en construisant dynamiquement 150 blocs d'inserts exécutés dans autant d'EXECUTE BLOCKs.
    Tout en créant un rapport précis au block près.
    C'est un bon rapport rapidité / précision.

    Sauf erreur de retranscription :

    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
    32
    33
    34
     
    try
      QryTr.StartTransaction;   //(transaction de Qry)
     
      //récupération du numéro de transaction
     
      QryNumTr := TFDQuery.Create(nil);
     
      with QryNumTr, SQL do
      begin
        Connection := Qry.Connection;
        Text          := 'SELECT CURRENT_TRANSACTION FROM RDB$DATABASE';
        Open;              //c'est là que je compte sur le fait que le numéro de transaction créé sera le numéro de transaction de QryTr + 1. Si c'est pas ça, j'ai vraiment du bol, jusqu'à présent !
     
        NumTransac := Fields[0].AsInteger - 1;
      end;
     
      with Qry, SQL do
      begin
        if DebugHook > 0 then 
    	   SaveToFile(ExtractFilePath(Application.ExeName) + 'SQL.txt');
     
        ExecSQL;  //exécute ce qu'il a à exécuter. Par exemple EXECUTE BLOCK.. ..
     
        CheckResult; (dont le code suivant)
        QryTr.Commit;
      end;
    except
      QryTr.Rollback;
      tResult.Lines.Add('L''opération a échoué : ' + Qry.SQL.Text);
      tResult.Update;
     
      Inc(Echecs);
    end;
    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
     
            with QryResult, SQL do
    		try
              Connection := Qry.Connection;
              Text       := 'SELECT              ' +
                            'MON$RECORD_INSERTS, ' +
                            'MON$RECORD_UPDATES, ' +
                            'MON$RECORD_DELETES, ' +
                            'MON$RECORD_BACKOUTS ' +
                            'FROM                ' +
                            'MON$ATTACHMENTS a JOIN MON$RECORD_STATS r ON a.MON$STAT_ID       = r.MON$STAT_ID       ' +
                            '                  JOIN MON$TRANSACTIONS t ON a.MON$ATTACHMENT_ID = t.MON$ATTACHMENT_ID ' +
                            'WHERE               ' +
                            'LOWER(MON$REMOTE_PROCESS) LIKE LOWER(' + QuotedStr(Application.ExeName)       + ') AND ' +
                            't.MON$STATE = 1 AND    ' +
                            't.MON$TRANSACTION_ID = ' + IntToStr(NumTransac)
                            ;
              if DebugHook > 0 then
                 SaveToFile(ExtractFilePath(Application.ExeName) + '\SQLResult.txt');
     
              Open;
            finally
    		  //finalize what you have to
            end;
    Ben, pis faut pas oublier de tout détruire après. Vandales
    Dans l'absolu, je ne sais pas dans quelle mesure une transaction ne pourrait pas être lancée dans l'intervalle. Prenant le numéro NumTransac -1
    Du coup, je me retrouverais à tester les résultats d'une autre transaction exécutée par une autre instance de l'appli (M'en f..., dirai qu'c'est bizarre)

  11. #31
    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
    Oui alors euh, non.
    Se fier au numéro de transaction est trop risqué. Trop difficile à choper le bon.
    Je l'ai remplacé par l'adresse IP du poste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                            //'t.MON$TRANSACTION_ID = ' + IntToStr(NumTransac)                                + ' AND ' +
                            'LEFT(MON$REMOTE_ADDRESS, ' + IntToStr(Length(AdrIPLoc)) + ') LIKE ' + QuotedStr(GetAddIP)
                            ;
    avec GetIP =
    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
     
            function GetAddIP: String;
            var
              LstAddr : TIdStackLocalAddressList;
              Addr    : TIdStackLocalAddress;
              i       : Integer;
     
            begin
              LstAddr := TIdStackLocalAddressList.Create;
     
              try
                GStack.GetLocalAddressList(LstAddr);
     
                Addr   := LstAddr[LstAddr.count-1];
                Result := Addr.IPAddress;
     
              finally
                LstAddr.Free;
              end;
            end;
    Merci à "a l'heure du déjeuner" entr'autre. Encore un qui a dû déceder .

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [MySQL] PDO Afficher le nombre de lignes insérées dans la base
    Par nicoreims dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/01/2016, 12h41
  2. compter le nombre de ligne traitées update
    Par batou22003 dans le forum DB2
    Réponses: 2
    Dernier message: 01/08/2012, 08h34
  3. [Oracle 10g] export datapump : vérifier le nombre de lignes
    Par nico1973 dans le forum Import/Export
    Réponses: 5
    Dernier message: 10/10/2010, 10h53
  4. Récupérer le nombre de lignes impactées : update/delete
    Par romano62880 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 18/05/2010, 19h23
  5. Vérifier le nombres de lignes et colonnes utilisé
    Par derin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/09/2008, 15h22

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