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 :

Problème de mise à jour automatique de mes requêtes SQL [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut Problème de mise à jour automatique de mes requêtes SQL
    Bonjour,
    J'ai un petit souci : je dois effectuer plusieurs requêtes pour l'enregistrement d'un client. Les requêtes SQL se déroulent bien, je le vois dans mon SGBD .En revanche, si je reste sur l'application, je ne vois pas les mises à ajour effectuées : je suis obligé de fermer l'application et de la rouvrir...
    Voici le code employé :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
     
    procedure Tfrm_pec_det_dde.btn_enregClick(Sender: TObject);
    var id_badge:integer;
         heure_arrive:String;
         date_arrive:STRING;
         nom_badge:String;
     
                      id_pers:integer;
                      nom:String;
                      prenom:String;
                      naissance:String;
                      lieu:String;
                      immat:String;
                      societe:String;
                      unite:String;
                      motif:String;
                      statut:String;
           vsql:string;
    begin
        heure_arrive:= TimetoStr(now);
       date_arrive:= FormatDateTime('dd/mm/yyyy',now);
     
     
       if lst_badge.Enabled=false then
            begin
               ShowMessage('Veuillez sélectionner un badge , pour ce faire choississez une unité .')
            end
               else
                  begin
                      id_badge:=lst_badge.KeyValue;
                      nom_badge:=lst_badge.text;
     
                      nom:=vnom;
                      prenom:=vprenom;
                      naissance:=v_dt_naissance;
                      lieu:=v_lieu_naissance;
                      immat:=txt_immat.text;
     
                      societe:=db_societe.Text;
                      unite:=db_unite.Text;
                      motif:=db_motif.Text;
     
                         id_pers:=0;
                        sql_req.close;
                      sql_req.sql.text:='select id_pers from accueil2_personnes where nom_pers="'+vnom+'" and prenom="'+vprenom+'" and naissance="'+v_dt_naissance+'"';
     
                      sql_req.open;
                      if sql_req.RecordCount>0 then
                         begin
                         id_pers:=strtoint(sql_enreg.Fields[0].asstring);
     
                         end;
                       sql_req.close;
     
                         if id_pers>0 then
                          begin
                              sql_enreg.SQL.text:='update accueil2_personnes set badge="'+nom_badge+'" where id_pers='+inttostr(id_pers);
                              sql_enreg.ExecSQL;
                             sql_enreg.close;
                              sql_transac.Commit;
                           end
                         else
                        begin
                          vsql:='insert into accueil2_personnes ( statut,nom_pers,prenom,naissance,lieu,badge,immatriculation)';
                          vsql:=vsql+' values("0","'+nom+'","'+prenom+'","'+naissance+'","'+lieu+'","'+nom_badge+'","'+immat+'")';
                          sql_enreg.SQL.text:=vsql;
                          sql_enreg.ExecSQL;
                           sql_enreg.close;
                           sql_transac.Commit;
     
     
                             sql_req.sql.text:='select auto_increment from information_schema.tables where table_schema="accueil2" and table_name="accueil2_personnes"';
                               sql_req.open;
                                showmessage( sql_req.fields[0].asstring);
                              id_pers:=strtoint(sql_req.fields[0].asstring)-1;
                              sql_req.close;
                         end;
     
                       sql_enreg.SQL.text:='update accueil2_lp set etat=2 where id='+inttostr(id_badge);
                      sql_enreg.ExecSQL;
     
                      sql_enreg.close;
                      sql_transac.Commit;
     
                      vsql:='insert into arrivee(id_personne,nom_personne,prenom_personne,naissance_personne,lieu_personne,immat_personne,badge_personne,societe_personne,';
                      vsql:=vsql+' unite_personne,motif_personne,heure_arrivee,date_arrivee,statut) values';
                      vsql:=vsql+ '("'+Inttostr(id_pers)+'","'+nom+'","'+prenom+'","'+naissance+'","'+lieu+'","'+immat+'","'+nom_badge+'","'+societe+'","'+unite+'","'+motif+'","'+heure_arrive+'","'+date_arrive+'","prevu")';
                      sql_enreg.SQL.text:=vsql;
                       sql_enreg.ExecSQL;
                         sql_enreg.close;
                          sql_transac.Commit;
     
                          ShowMessage('Enregistrement effectué');
                           ModalResult:=mrOk;
     
     
                     end;
    end;
    Ma transaction a cette propriété-là : sql_transac : Action à CaCommit
    le sql_enreg a comme option : sqoAutoCommit à true
    le sql_enreg et sql_req n'ont pas la même transaction.

    Si quelqu'un avait une idée...
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par wwilly17 Voir le message
    j ai un peitit souci , je dois effectuée plusieurs requetes pour l enregistrement d un client .Les requetes sql se deroulent bien je le vois dans mon sgbd .En revanche si je reste sur l' application je ne vois pas les mises a ajour effectuées, je suis oblige de fermer l' application et de la réouvrir...
    Ces mises à jour apparaissent dans des grilles gérées par d'autres ensembles de données ?
    Peut-être faut-il demander un rafraichissement de ces ensembles de données une fois les mises à jour faites...

    Au demeurant, quel SGBD ? quels composants ?
    Philippe.

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par FOCUS77 Voir le message
    En fait tu as deux possibilités de régler ton problème:
    C'est osé comme affirmation...

    Citation Envoyé par FOCUS77 Voir le message
    1. Copie isc_tpb_read_committed dans le 'Dialogue d'éditeur de chaînes' (SQLTransaction1/params) de toutes les transactions.
    Etes vous certain que wwilly17 utilise Interbase ou Firebird comme SGBDR ?
    En quoi utiliser le niveau d'isolation de transaction "Lecture de données validées" dans toutes les transactions serait la panacée ? Même si ce mode convient généralement, on peut aisément supposer que certains de ses traitements pourraient s’accommoder d'une "lecture sale" (niveau d'isolation plus faible) alors que d'autres nécessiterait une "sérialisation" (niveau plus élevé) !

    Citation Envoyé par FOCUS77 Voir le message
    2. Ou la meilleure méthode, est d'utiliser une seule transaction par application et toutes les SqlQueries seront reliées à elle.
    Il faudrait ordonnancer avec une extrême minutie le traitement des requêtes dans l'application. Or c'est impossible avec une programmation évènementielle et multi process.
    De plus, suivant le type de requêtes à exécuter (select vs insert par exemple), vous n'allez pas avoir besoin du même niveau d'isolation.
    Enfin rattacher toutes les requêtes à un seul objet transaction va amener à des imbrications de transactions dans les traitements et une belle pagaille en perspective pour les données (suite à un rollback intermédiaire par exemple).

    Il est préférable d'utiliser plusieurs transactions, de prendre suivant la requête associée le niveau d'isolation le moins élevé possible qui garantit la cohérence des traitements.
    Il est également essentiel de réduire le plus possible la durée de vie d'une transaction en particulier pour celles utilisant un niveau d'isolation élevé; on réduit voire on évite les risque de contentions ou de blocages.
    Philippe.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    bien que n'ayant pas tout compris aux derniers messages, je tenais à vous remercier pour votre réponse, mais sachez que j'ai trouvé le souci... En fait il venait bien d'un problème de rafraîchissement de mes DBgrid, dont la transaction dont il dépendait était par défaut à active=true...
    Une fois désactivé le active=true, ils se mettaient bien à jour en direct.
    Encore merci pour vos réponses.

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

    Tu dis que les 2 requêtes ne sont pas liées à la même transaction mais on ne voit dans ton code un commit que pour une seule transaction. Même si la transaction de la requête en lecture est auto-commit, le commit ne devrait se faire automatiquement que juste après le SELECT, donc avant les modifications.

    Donc, si la transaction de la requête de lecture n'est pas fermée après les modifications, et qu'on est dans un mode "isolation" (par défaut ?), il est tout à fait normal qu'elle ne voie pas les modifications réalisées par la requête liée à l'autre transaction qui exécute un commit. Le close de la requête n'est pas suffisant.

    C'est comme ça que ça doit fonctionner, Lazarus n'y est pour rien et tu obtiendras la même chose avec 2 requêteurs SQL ouverts simultanément.

    Si ton programme ne fait que ce que tu montres et ne demande pas des ressources énormes, il est, à mon humble avis, plus simple de n'avoir qu'une seule transaction... au moins pour commencer.
    Et si c'est un programme interactif, pas un serveur, j'aurais aussi tendance à te conseiller ZeosLib avec lequel la gestion des transactions est plus simple (on peut les ignorer).
    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.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Bonjour,
    J'ai rencontré à peu de chose près le même type de problème, après une mise à jour en FPC 2.6.4.
    L'Autocommit ne fonctionne plus depuis cette version, il faut forcer le Commit après l'exécution de la requête.
    Vérifie également que tu n'as pas - comme moi - utilisé 2 transactions différentes dans ton appli.
    Cordialement,

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

Discussions similaires

  1. probleme de mise a jour automatique de windows
    Par faniette dans le forum Windows XP
    Réponses: 5
    Dernier message: 13/05/2010, 09h31
  2. Réponses: 5
    Dernier message: 22/06/2009, 14h45
  3. probleme de mise a jour automatique de windowd XP
    Par blandinais dans le forum Windows XP
    Réponses: 4
    Dernier message: 25/12/2005, 23h39
  4. Réponses: 15
    Dernier message: 30/06/2005, 16h35
  5. [] [Install] Problème de mise à jour des dll
    Par pepper dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 23/01/2003, 22h34

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