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 :

erreur lors de la suppression


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut erreur lors de la suppression
    Bonjour ;pour une gestion basic de stock sous [D7-Access2003] mon problème est le suivant :
    j'ai une table stock et une table ligne,
    l'opération suppression de la quantité ligne , cette dernière doit être restituée dans la table stock selon son ID.
    exemple :
    table lignes ( Qt = 200 ) quand je supprime cette ligne la table stock récupère cette quantité et l'ajoute a la quantité stock existante déjà a condition que les deux quantité ont le même ID
    lors de la suppression d'un enregistrement de la table lignes j'ai le message suivant voir image attachée :
    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
    rocedure Tfsujtcontact.btsupClick(Sender: TObject);
    var result,m1 : integer;
    begin
    sup:='sup';
     
    instruction de control .......   
     
    if (dm1.qtrtprev .RecordCount>0) then
        begin
        result:=0;
        if MessageDlg('Voulez-Vous vraiment supprimer cette quantité ' ,mtConfirmation,[mbYes,mbNo],1,)=mrYes  then
                  begin
                    dm1.tstok.Open; // mise à jour de la table stock
                    dm1.tstok.Locate('nstocprod',nstok.Text,[]);// localisation du produit
                    result:= strtoint(eqt.Text) + dm1.tstokQT.Value;// calcul de la nouvel valeurs du produit dans la table stock
                    dm1.tstok.edit;
                    dm1.tstokQT.Value:=result;
                    dm1.tstok.Post;
     
                    dm1.tlignes.Open; // suppression de la ligne quantité 
                    DM1.tlignes.Locate('nlin',nlin.Text,[]);
                    DM1.Tlignes.Delete;
     
                    MessageDlg('Traitement supprimé',mtInformation,[mbOK],0);
     
                    dm1.qafichprod.Active:=false;  // actualisé l'affichage des produit (table stock) 
                   dm1.qafichprod.Parameters.ParamByName('prod').Value:=emedic.Text;
                    dm1.qafichprod.active:=true;
     
                    dm1.qtrtprev.Close; // actualisé la table détenteur de produit
                    dm1.qtrtprev.Parameters.ParamByName('nsc').Value:=strtoint(ensc.Text);
                    dm1.qtrtprev.Open;
     
                    nlin.Text:='';
                    nstok.Text:='';
                    eqt.Text:='';
                    nmouv.Text:='';
                     exit;
                    end;
     
     
        end
    else
    begin
     beep();
     MessageDlg('Aucun enregistrement n''est disponible...',mtInformation,[mbOK],0);
    end;
     
    end;
    Images attachées Images attachées  

  2. #2
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    salut ; voila après plusieurs testes touts fonctionne bien sauf cette partie du code qui me pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     {  dm1.tlignes.Open;
                    DM1.tlignes.Locate('nlin',nlin.Text,[]); // nlin est un integer
                    DM1.Tlignes.Delete;
     
                    MessageDlg('Traitement supprimé',mtInformation,[mbOK],0);}
    sans cette opération la table stock est mis à jour mais la table lignes reste tel qu'elle est , et si j'exécute ce code l'enregistrement voulu par nlin.text n'est pas localisé et le dernier enregistrement de la table lignes est supprimé !!!!
    franchement j'ai pas pu identifié le problème

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @salut

    Ajoute un test sur le Locate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if DM1.tlignes.Locate('nlin',nlin.Text,[]) then ..

  4. #4
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    salut ; Buz meme avec le teste sa marche pas..!!!
    la méthode locate utilisé avec un champ numérique dans la table stock marche très bien ( nstock.text) ;
    mais dans la table lignes le locate ne fonctionne pas !!!!!!
    • 1 hypothèse peut être locate ne marche pas avec les champs numérique ? mais sa n'empeche qu'il marche dans la table stock...;
    • 2 hypothèse : problème dans les composants ADO ; j'ai refait touts a nouveau..;
    • hypothèse 3 : problème dans la table access ; j'ai crée les tables de nouveau.;



  5. #5
    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 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Pourquoi ne pas faire l'ensemble de ces opérations par SQL ? , cela éviterait bien des ouvertures de tables complètes et serait certainement plus sur et plus rapide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                   dm1.tstok.Open; // mise à jour de la table stock
                    dm1.tstok.Locate('nstocprod',nstok.Text,[]);// localisation du produit
                    result:= strtoint(eqt.Text) + dm1.tstokQT.Value;// calcul de la nouvel valeurs du produit dans la table stock
                    dm1.tstok.edit;
                    dm1.tstokQT.Value:=result;
                    dm1.tstok.Post;
    ceci est remplacé par un

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE STOCK SET QT=QT+:Q WHERE NSTOCKPROD=:N
    ou param['Q'] =StrToInt(eqt.Text) et Param['N']=StrToInt(nstok.Text)

    et un
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM LIGNE WHERE NLIN=:N

    Avec une SGBDR comme Firebird c'est encore plus facile , pas de code dans le programme , un simple Trigger BEFORE DELETE (événement déclenché dans la base) ferait les deux
    Existe t-il ma même chose dans access (<< buzz sait combien j'aime pas)
    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 habitué
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Points : 134
    Points
    134
    Par défaut
    Je pense qu'il ya un strtoint qui manque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dm1.tlignes.Open;
                    DM1.tlignes.Locate('nlin',strtoint(nlin.Text),[]); // nlin est un integer
                    DM1.Tlignes.Delete;
     
                    MessageDlg('Traitement supprimé',mtInformation,[mbOK],0);
    Tu devrais t'habituer aussi avec les instructions try pour gérer les exceptions!

    ______________________________________________________________________________________________
    L'ignorence est suspect!Surtout s'il resulte d'un choiw conscient!

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par redoran Voir le message
    salut ; Buz meme avec le teste sa marche pas..!!!
    la méthode locate utilisé avec un champ numérique dans la table stock marche très bien ( nstock.text) ;
    ?? c'est pas trés claire ta réponse, si ton locate abouti tu aura ton delete qui se fera, sinon il se passera rien à ce niveau,.
    Ce qu'il faut savoir c'est "est-ce que le locate fonctionne vraiment bien" ? regarde apres le test du locate sur quel recno tu est par rapport à ta base.
    Au pire isole ton delete.
    Ah oui je pense que tu a regardé, mais tu es bien en readWrite sur ta connexion ? et ton adotable ?

    Sinon essai le inttostr MStreatBoy

    Et evidement je l'ai pas cité mais les requetes direct @Sergio ce serais vachement plus claire pour toi.

    @Sergio...
    Je sais que t'aime pas access mais tu te débrouille pourtant bien avec... lol

  8. #8
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    salut , même avec le strtoint sa me posé ce problème , après vérification j'ai trouvé l'origine de l'erreur :
    j'ai oublié de désactivé le filtre que j'ai utilisé sur la table lignes en désactivant le filtre touts est rentrée dans l'ordre.
    @ sergio vous avez raison je vais me mettre sur le SQL

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Petite remarque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      dm1.tstok.Open; // mise à jour de la table stock
      dm1.tstok.Locate('nstocprod',nstok.Text,[]);/
    L'utilisation d'une table pour aller mettre à jour 1 enregistrement est fortement déconseillé.
    Je m'explique, imaginons qu'il y a 5000 enregistrements dans la table. Quand tu fais un Open, le temps de récupération des données va prendre (c'est un exemple hein ) 3s.
    Donc à chaque rafraichissement de la table, on doit attendre, au moins, 3s avant que le traitement soit fait.
    La table grossie au cours du temps, passe a 10000 enregistrements et à un temps de 6s à chaque ouverture.
    Etc ...

    L'utilisation d'un TxxxTable est bien dans le cas de table statique dont les enregistrements n'évolueront pas ou très peu dans le temps.
    Dès qu'une table dépasse un certain nombre d'enregistrement (cela dépendra du SGBD) et qui augmente ce nombre au cours du temps, il vaut mieux passer par des requêtes avec des paramètres.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Bonjour rayek ; excuse de ne pas avoir répondu plutôt faute de connexion !
    je vous remercie pour votre intervention pertinente ;

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

Discussions similaires

  1. Erreur lors de la suppression de lignes vides
    Par Lechette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/04/2008, 10h56
  2. Erreur lors de la suppression du fichier
    Par kynri dans le forum C
    Réponses: 5
    Dernier message: 19/01/2008, 15h03
  3. ERREUR lors de la suppression d'un projet
    Par dev09 dans le forum Maven
    Réponses: 6
    Dernier message: 20/09/2007, 13h57
  4. Msg erreur lors de la suppression d'un fichier
    Par saidiweb dans le forum Windows XP
    Réponses: 3
    Dernier message: 20/05/2007, 17h02
  5. Réponses: 14
    Dernier message: 04/05/2006, 07h40

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