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 :

Microsoft Jet a arrêté le traitement parce que vous et un autre utilisateur tentez de modifier les mêmes donné


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut Microsoft Jet a arrêté le traitement parce que vous et un autre utilisateur tentez de modifier les mêmes donné
    Bonsoir,

    Je développe avec delphi7 et access 2007, j’ai une boucle et dans ma boucle je fais des modifications sur ma table (plusieurs requêtes sur la même table dans la même instructions de ma boucle),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    boucle
    begin
    req1;
    req2;
    req3
    end;
    il m’affiche un message d’erreur:
    Le moteur de base de données Microsoft Jet a arrêté le traitement parce que vous et un autre utilisateur tentez de modifier les mêmes données en même temps.
    Je pense que ma boucle est plus rapide que ma requête, la prochaine instruction arrivera et ma requête est en cours d’exécution.

    j'ai essayer d'utiliser les transactions mais ça na pas marché
    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
    boucle
    begin
    begin trans1
    req1;
    ADOConnection1.CommitTrans
    end trans1
    begin trans1
    req2;
    ADOConnection1.CommitTrans
    end trans1
    begin trans1
    req3;
    ADOConnection1.CommitTrans
    end trans1
    end;
    je ne sais pas est ce que je me trompe dans l'utilisation des transactions, j'ai même utilisé Requery de adotable et a chaque exécution de ma requête je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    adotable1.Active := true;
    adotable1.Open();
    adotable1.Requery();
    adotable1.close();
    adotable1.Active := false;
    par contre si je fais une exécution étape par étape tout marche bien.
    Merci.

  2. #2
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Notons que dans mes requêtes j'utilise la fonction
    Merci.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par kika10 Voir le message
    Je pense que ma boucle est plus rapide que ma requête, la prochaine instruction arrivera et ma requête est en cours d’exécution.
    Cela indiquerait un traitement asynchrone de la requête par ADO et ACCESS, peu crédible, sinon comment pourrait-on récupérer RowsAffected à la fin de l'execution !


    Citation Envoyé par kika10 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    adotable1.Active := true;
    adotable1.Open();
    adotable1.Requery();
    adotable1.close();
    adotable1.Active := false;
    Open() c'est la même chose que Active := True !
    Close() c'est la même chose que Active := False !
    Soit l'un soit l'autre, pas besoin des deux !
    Requery permet de rafraichir le DataSet, cela ne semble pas utile après un Open

    Peut-être que ton TADOTable pose un verrou sur la table ou sur le recordset interne

    Je serais toi, je bannirais totalement le TADOTable au profit de TADOQuery pour n'ouvrir les DataSet qu'au moment utile, cela évite ainsi les conflits, cela permet aussi de mieux gérer les mise à jour !
    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

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    j'ai supprimé TADOTable, mais toujours un message d'erreur, cette fois il m'affiche division par zéro par ce que il fait pas l'exécution d'une requête qui modifie une valeur sur la quelle je divise après.

    je sais pas comment faire, est ce que y'a pas un moyenne pour savoir l'état de ma requête (en cours d’exécution).

    Merci.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par kika10 Voir le message
    cette fois il m'affiche division par zéro par ce que il fait pas l'exécution d'une requête qui modifie une valeur sur la quelle je divise après.

    je sais pas comment faire, est ce que y'a pas un moyenne pour savoir l'état de ma requête (en cours d’exécution).
    Comment voulez vous que l'on réponde à ça sans même connaitre la/les requêtes ??????
    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

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    Bonjour,
    Voici mon code
    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
    while ann <= strtoint(rzcombobox40.Text) do
    begin
    
    //recalculer le rarn-1
    query2.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp');
    query2.ExecSQL;
    
    query2.SQL.Clear;
    query2.Active := false;
    
    adoquery1.SQL.Clear();
    adoquery1.Active := false;
    
    //recalculer le reliq_cp
    adoquery1.SQL.Add('UPDATE tot_Ap_tot_Cp SET reliq_cp = total_cp_N_1 -  IIf(dsum("CONSM_CP","Etat_f_PSD","');
    adoquery1.SQL.add(' NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann-1)+'''") is null,0,');
    adoquery1.SQL.add('dsum("CONSM_CP","Etat_f_PSD","NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann-1)+'''"))');
    adoquery1.ExecSQL;
    
    adoquery1.SQL.Clear;
    adoquery1.Active := false;
    
    //calculer le total_cp total_ap
    adoquery1.SQL.Add('UPDATE tot_Ap_tot_Cp SET total_cp = reliq_cp +  IIf(dsum("CRE_PAY","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''") is null,0,');
    adoquery1.SQL.add('dsum("CRE_PAY","Etat_f_PSD","NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''")),');
    adoquery1.SQL.Add('total_ap = RAR_N_1 +  IIf(dsum("AUT_PGRM","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''") is null,0,');
    adoquery1.SQL.add('dsum("AUT_PGRM","Etat_f_PSD","NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''"))');
    adoquery1.ExecSQL ;
    
    adoquery1.SQL.Clear;
    adoquery1.Active  := false;
    
    //calculer le rar
    adoquery1.SQL.Add('UPDATE tot_Ap_tot_Cp set rar = total_ap -  IIf(dsum("CONSM_CP","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''") is null,0,dsum("CONSM_CP","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''"))');
    adoquery1.ExecSQL ;
    adoquery1.SQL.Clear;
    adoquery1.Active  := false;
    
    ann := ann+1;
    end;
    
     query2.SQL.Add('SELECT  NOM_WILAYA, Sum(NB_operation) AS NB_op, Sum(RAR_N_1) AS RAR_1, Sum(Autorisations_programme_AP) AS AP,(AP+RAR_1)AS TOTALAP, sum(reliq_cp) as Reliquat_CP, ');
     query2.SQL.Add(' Sum(Cedits_paiements_CP) AS CP, (CP+Reliquat_CP) as [Total CP], Sum(Consommation_CP) AS Con_CP, Round(Con_CP *100 /[Total CP],2) AS T_Consom, Sum(RAR) AS RAR1');
    query2.SQL.Add('FROM tot_Ap_tot_Cp');
    query2.SQL.Add('GROUP BY NOM_WILAYA');
    Le problème se pose dans le calcule total_cp, pour l'affichage je récupère T_Consom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Round(Con_CP *100 /[Total CP],2) AS T_Consom
    Merci.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    a) Total CP semble être un alias de Champ , cela ne peut pas fonctionner ainsi
    b) Lorsque l'on met une division dans une requête , il est toujours bon de tester la valeur de l'operande (null ou 0)

    donc pour le a)
    Round(Con_CP *100 /(CP+Reliquat_CP),2) AS T_Consom

    pour le b) n'étant pas un fan de Access je ne saurais trop le faire :
    le COALESCE que je connais en FireBird est remplacé par NZ je crois
    Le CASE WHEN ELSE END ; je n'en ai aucune idée


    Mais , du coup , cette partie SQL du post devrait être
    - séparée du post principal (rien a voir avec le titre)
    - posée sur le forum Access ou SGBD/SQL car plus grand chose à voir avec Delphi (même BDD)
    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 régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    Pour le a) dans ma table il est bien calculer le [Total CP], même si j’exécute ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Round(Con_CP *100 /[Total CP],2) AS T_Consom
    directement sur Access ça marche, ce n'est pas un problème d'Access parce que j'ai testé mes requêtes sur Access tout marche bien, mais ce que m’inquiète c'est que si je fais une exécution étape par étape tout marche bien!!!!!!!!!!!!!!!!!

    désolée j'ai trompé dans le code dans la dernière requête ou je calcule le T_Consom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    query2.SQL.Add('SELECT  NOM_WILAYA, NOM_WILAYA, NOM_WILAYA, NOM_WILAYA, Sum(NB_operation) AS NB_op, Sum(RAR_N_1) AS RAR_1, Sum(Autorisations_programme_AP) AS AP,Sum(TOTAL_AP)AS TOTALAP, sum(reliq_cp) as Reliquat_CP, ');
    query2.SQL.Add('Sum(Cedits_paiements_CP) AS CP, sum(total_cp) as [Total CP], Sum(Consommation_CP) AS Con_CP,  Round(Con_CP *100 /[Total CP],2) AS T_Consom, Sum(RAR) AS RAR1');
    query2.SQL.Add('FROM tot_Ap_tot_Cp');
    query2.SQL.Add('GROUP BY NOM_WILAYA');
    c'est comme ShaiLeTroll dit : traitement asynchrone de la requête par ADO et ACCESS.

    Merci.

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut Impossible de mettre à jour; actuelement verrouillé(e)
    Bonjour,

    j'ai ajouté le code suivant a chaque exécution de ma boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    boucle
    begin
    ...
    ....
    adoquery1.SQL.add ('select * from tot_Ap_tot_Cp');
    adoquery1.ExecSQL ;
    adoquery1.Active := false;
     
    sleep(500);
    end boucle;
    des fois ça marche des fois il ma'affiche division par zéros et des fois
    Impossible de mettre à jour; actuelement verrouillé(e)
    Merci.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Il y a confusion des genres !
    avec un SELECT on mettra Open/Close ou Active:=True/False
    avec un UPDATE ou INSERT on pourra mettre un ExecSQL
    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

  11. #11
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    c'est vraiment compliquer, voila mon code :
    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
     
    //remplir la table cp_reliq
    with datamodule3 do
    begin
    //vider la table
    query2.SQL.Clear;
    query2.SQL.Add('delete from tot_Ap_tot_Cp');
    query2.ExecSQL;
    query2.SQL.Clear;
     
    query2.SQL.Add('insert into tot_Ap_tot_Cp(NOM_WILAYA,Nom_commune,ANN,INTITULE_SEC,sous_secteur,TRIMESTRE,NB_operation,RAR_N_1,Autorisations_programme_AP,total_ap,Consommation_CP');
    query2.SQL.Add(',Taux_consommation_CP,RAR,total_cp_N_1,Cedits_paiements_CP,total_cp,reliq_cp,rar_1_p,total_ap_p,total_cp_1_p,total_cp_p,reliq_cp_p)  select');
    query2.SQL.add(' NOM_WILAYA,null,ANN,null,null,null,sum(NB_operation),0,sum(Autorisations_programme_AP),0,sum(Consommation_CP),0,0,0,sum(Cedits_paiements_CP),0,0,0,0,0,0,0 from Etat_f_PSD_n_final where ANN='+'''' +RzComboBox40.Text+''' group by NOM_WILAYA,ann');
     
    query2.ExecSQL;
     
    ann := 1999;
     
    while ann <= strtoint(rzcombobox40.Text) do
    begin
    query2.SQL.Clear;
     
    //calculer le rarn-1
    query2.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp');
    query2.ExecSQL;
    query2.SQL.Clear;
     
    //calculer le reliq_cp
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('UPDATE tot_Ap_tot_Cp SET reliq_cp = total_cp_N_1 -  IIf(dsum("CONSM_CP","Etat_f_PSD","');
    adoquery1.SQL.add(' NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann-1)+'''") is null,0,');
    adoquery1.SQL.add('dsum("CONSM_CP","Etat_f_PSD","NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann-1)+'''"))');
    adoquery1.ExecSQL;
     
    /ecalculer le total_cp total_ap
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('UPDATE tot_Ap_tot_Cp SET total_cp = reliq_cp +  IIf(dsum("CRE_PAY","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''") is null,0,');
    adoquery1.SQL.add('dsum("CRE_PAY","Etat_f_PSD","NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''")),');
    adoquery1.SQL.Add('total_ap = RAR_N_1 +  IIf(dsum("AUT_PGRM","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''") is null,0,');
    adoquery1.SQL.add('dsum("AUT_PGRM","Etat_f_PSD","NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''"))');
    adoquery1.ExecSQL;
     
    //calculer le rar
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('UPDATE tot_Ap_tot_Cp set rar = total_ap -  IIf(dsum("CONSM_CP","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''") is null,0,dsum("CONSM_CP","Etat_f_PSD","');
    adoquery1.SQL.add('NOM_WILAYA = ''" & NOM_WILAYA & "'' and An = '+''''+inttostr(ann)+'''"))');
    adoquery1.ExecSQL;
     
    query2.SQL.Clear;
    query2.SQL.add ('select * from tot_Ap_tot_Cp');
    query2.Active := true;
    query2.Active := false;
    query2.SQL.Clear;
    sleep(500);
    ann := ann+1;
    end;
     
    query2.SQL.Add('SELECT  NOM_WILAYA, NOM_WILAYA, NOM_WILAYA, NOM_WILAYA, Sum(NB_operation) AS NB_op, Sum(RAR_N_1) AS RAR_1, Sum(Autorisations_programme_AP) AS AP,Sum(TOTAL_AP)AS TOTALAP, sum(reliq_cp) as Reliquat_CP, ');
    query2.SQL.Add('Sum(Cedits_paiements_CP) AS CP, sum(total_cp) as [Total CP], Sum(Consommation_CP) AS Con_CP,  Round(Con_CP *100 /[Total CP],2) AS T_Consom, Sum(RAR) AS RAR1');
    query2.SQL.Add('FROM tot_Ap_tot_Cp');
    query2.SQL.Add('GROUP BY NOM_WILAYA');
    query2.open();
     
    end;
    //affichage
    ....
    mais toujours des fois ça marche et des fois ça marche pas il m'affiche dans l'execution de la requête //calculer le rarn-1
    Key violation. [Microsoft][Pilote ODBC Microsoft Access] Impossible de mettre à jour ; actuellement verrouillé(e)
    , notons que query2 utilise
    ODBC Drivers
    et adoquery1
    Microsoft Jet 4.0 OLE DB Provider
    pour que ma requête
    Dsum
    marche il faut utiliser
    Microsoft Jet 4.0 OLE DB Provider
    si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    query2.SQL.Clear;
    //recalculer le rarn-1
    query2.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp');
    query2.ExecSQL;
    query2.SQL.Clear;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    adoquery1.SQL.Clear;
    //recalculer le rarn-1
    adoquery1.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp');
    adoquery1.ExecSQL;
    adoquery1.SQL.Clear;
    des dois ça marche et des fois message
    Le moteur de base de données Microsoft Jet a arrêté le traitement parce que vous et un autre utilisateur tentez de modifier les mêmes données en même temps.
    dans l’exécution de cette requête.

    Merci pour vous aide.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    des Update sans Where !! est-ce bien normal ?
    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

  13. #13
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Pour la requête
    calculer le rarn-1
    , c'est pour sauvegarder le RAR, et total_cp calculer, j'ai pas trouvé un critère pour ma requête, c'est pour ça j'ai modifié mon code à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //recalculer le rarn-1
    query2.SQL.Clear;  
    query2.sql.add('select * from tot_Ap_tot_Cp');
    req2:=query2.SQL.Text ;
    query2.Open();
    while not query2.Eof do
    begin
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp where NOM_WILAYA='+''''+query2.Fields[0].AsString+''' and ANN='+''''+query2.Fields[2].AsString+'''');
    adoquery1.ExecSQL;
    adoquery1.SQL.Clear;
     query2.Next;
    end;
    query2.Close();
    mais j'ai toujours des problèmes, par exemple si je mis
    rzcombobox40.Text
    à 1999 tout marche bien, si je le mis à 2006 pas de message d'erreur mais mon rar est faut, si je mis 2007 un message d'erreur
    Le moteur de base de données Microsoft Jet a arrêté le traitement parce que vous et un autre utilisateur tentez de modifier les mêmes données en même temps.
    dans l’exécution de ma requête
    //calculer le reliq_cp
    Ces problèmes arrivera si j’exécute 1999 après 2006 et 2007, mais j'ai essayé d’exécuter 2007 en premier ça marché et 2006 en deuxième ça donne le même message, apparemment la première exécution toujours marche!!!!

    Merci.

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    c'est vraiment compliqué
    oui , surtout que je ne comprend pas l'objectif de tout cela , j'arrive a peine a le deviner avec ces indications supplémentaires .

    et , par pitié
    - préférez les paramètres , au pire , des quotedStr a des quotes a répétition
    - ne prenez que les champs nécessaire dans une Query
    - ne mélangez pas les QueryBDE et ADO (c'est du moins l'impression que j'en tire)

    query2.SQL.Clear;
    query2.sql.add('select NOM_WILAYA,ANN from tot_Ap_tot_Cp');
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp where NOM_WILAYA=:NW and ANN=:A');
    query2.open;
    while not query2.Eof do
    begin
    Adoquery1.Parameters.ParamByName('NW').asString:=query2.Fields[0].AsString;
    Adoquery1.Parameters.ParamByName('A').asString:=query2.Fields[2].AsString;
    adoquery1.ExecSQL;
    query2.Next;
    end;
    adoquery1.SQL.Clear;
    Query2.Close;
    enfin
    c'est pour sauvegarder le RAR, et total_cp calcule
    c'est encore un peu vague .
    je préférerais , une structure de table simplifiée , car j'ai l'impression que tout peut se faire dans le
    insert into tot_Ap_tot_Cp ....
    simplement celui-ci est mal rédigé :
    par exemple les champs inutiles mis a null ou (Nom_commune,INTITULE_SEC,sous_secteur) etc ....

    c'est en relisant que je comprend le ANN est égal a l'année par exemple et uniquement parce que j'ai vécu au Maroc que je sais ce qu'est une WILAYA !!
    et entre-aperçoit ce que vous voulez faire!

    Donc :
    - simplifiez votre insert de départ , que bizarrement vous limitez avec un "Where ANN="
    - revoyez votre Update "adoquery1.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp", qui me semble inutile ou mal fait car si RAR_N-1 = RAR autant le faire directement dans le insert
    - Posez une question avec une table simplifiée , vous pourrez ensuite élargir a votre programme (on ne va pas le faire a votre place)

    exemple (si j'ai bien compris):
    TABLE DETAIL_PAIEMENT (
    WILAYA VARCHAR(30),
    COMMUNE VARCHAR(30),
    ANNEE INTEGER,
    MONTANT FLOAT)
    Vous désirez obtenir une Table
    PAIEMENTSPARWILAYA
    (WILAYA VARCHAR(30),
    ANNEE INTEGER,
    MONTANT_ANNEE FLOAT,
    MONTANT_ANNEE_1 FLOAT);

    pourrait s'obtenir en 3 passes comme ceci
    DELETE FROM PAIEMENTSPARWILAYA;
    INSERT INTO PAIEMENTSPARWILAYA(WILAYA,ANNEE,MONTANT_ANNEE) SELECT WILAYA,ANNEE,SUM(MONTANT) FROM DETAIL_PAIEMENT GROUP BY WILAYA,ANNEE;
    UPDATE PAIEMENTSPARWILAYA W SET W.MONTANT_ANNEE_1=(SELECT COALESCE(MONTANT_ANNEE,0.00) FROM PAIEMENTSPARWILAYA WHERE WILAYA=W.WILAYA AND ANNEE=W.ANNEE-1);

    P.S. . je pense que ceci pourrait s'obtenir en 2 voire une passe
    P.P.S dans le 3° SQL si COALESCE n'est pas supporté utiliser Nz(MONTANT_ANNEE,0.00)
    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

  15. #15
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Merci beaucoup @SergioMaster, j'ai réglé le problème avec les mêmes requêtes de la première fois, le problème n'est pas dans mes requêtes même avec des update sans where, ni dans la structure de ma table, ni dans des quotes a répétition,
    le problème c'est dans l'utilisation des
    QueryBDE et ADOQuery
    avec deux fournisseur différent le premier utilise l'ODBC et le deuxième utilise Microsoft Jet 4.0 OLE DB Provider.

    Merci.

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Il n'empêche , que vous pouvez faire certainement beaucoup plus simple
    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

  17. #17
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 254
    Points : 123
    Points
    123
    Par défaut
    simplement celui-ci est mal rédigé :
    par exemple les champs inutiles mis a null ou (Nom_commune,INTITULE_SEC,sous_secteur) etc ....
    c'est un cas ou je n'est pas besoin de nom_commune par exemple j'insère null, par contre y'a des cas ou j'ai besoin de toute mes champs. c'est pour utiliser une seul table pour mes états.
    revoyez votre Update "adoquery1.SQL.Add('update tot_Ap_tot_Cp set RAR_N_1 = RAR,total_cp_N_1 = total_cp", qui me semble inutile ou mal fait car si RAR_N-1 = RAR autant le faire directement dans le insert
    cette requête est dans une boucle, a chaque fois que j'augmente l'année je sauvegarde quelque données qui sont utiliser pour le calcule d'autre donnée de l'année prochaine, le RAR_N-1 = RAR, par exemple si j'ai besoin des données de l'année 2002, je suis obliger de démarre de 1999 jusqu'à 2002, on initialisant le rar_n_1 à zéro et on calculons le rar de 1999, et pour calculer le rar j'ai besoin de rar_n_1 et d'autres données.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/06/2010, 16h29
  2. Réponses: 1
    Dernier message: 23/06/2008, 16h48
  3. Réponses: 1
    Dernier message: 21/06/2008, 09h40
  4. Réponses: 11
    Dernier message: 19/04/2007, 14h37
  5. Problème avec Microsoft Jet
    Par LLaurent dans le forum XMLRAD
    Réponses: 2
    Dernier message: 12/10/2003, 11h04

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