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

SQL Firebird Discussion :

Suppression des derniers mouvements


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut Suppression des derniers mouvements
    Bonjour,

    je vous pose un petit problème qui ne devrait pas trop vous poser de difficultés. Je suis sous FireBird 1.5 et donc pas de sous requêtes dans la clause from.
    j'ai 2 tables une article et une mouvement.
    Dans mouvement j'ai des champs: IdMvt, IdArticle, DateMvt, QteStock. Je simplifie les tables et les champs.

    J'aimerai supprimer de la table Article tous les articles qui ont leur dernier mouvement avec une quantité = 0 et la date du mouvement < :dateParam

    Je précise qu'il y a une clé étrangère sur la table mouvement sur l'IdArticle avec un delete cascade.

    Tout cela dans une procedure stoquée.

    j'ai déjà testé avec un in (select ...) mais c'est très long

    la table contient 450000 enregistrements

    Si vous avez une idée

    merci

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    As-tu 1 index que Quantité ?
    et sur la date ?

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 219
    Points
    41 219
    Billets dans le blog
    63
    Par défaut
    en bref supprimer les "Rossignols" d'un stock .
    je vais rester dans la théorie et ne donner qu'un canevas de réponse , je n'ai pas le temps de tester .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FOR (SELECT A.ART FROM MOUVEMENT M JOIN ARTICLES A
             ON A.ART=M.ART
           WHERE A.QTE=0
           GROUP BY ART
           HAVING MAX(DATE_MVT)<:DATE  
           INTO ARTICLEASUPPRIMER 
          )
    DO DELETE FROM ARTICLES WHERE ART=ARTICLEASUPPRIMER
    La jointure est certainement à travailler, la syntaxe aussi , mais je pense que l'idée générale est là

  4. #4
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut
    LOL, je ne connaissais pas l'expression des "rossignols" mais je pense que c'est çà.

    Donc pour qi130, je n'ai pas d'index sur la quantité, mais j'en ai rajouter un sur la date.

    Je pense qu'il serait plus judicieux de prendre l'idmouvement qui est unique et dans l'ordre de creation (je ne modifie pas les lignes de mouvement). Je peux avoir plusieurs fois la même date (ajout de 2 lignes dans la même milliseconde).

    Pour SergioMaster, c'est à peu prêt çà que je veux faire sauf que la quantité à 0 est celle du dernier mouvement et non celle dans l'article. Je ne me rappelais plus de l'utilisation de "for do". Comme tu le dis, l'idée est bien là.

    merci.

    je teste çà.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 219
    Points
    41 219
    Billets dans le blog
    63
    Par défaut
    Si la quantité est dans mouvements alors c'est encore plus simple (pas de JOIN)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FOR (SELECT ART FROM MOUVEMENT 
                       WHERE QTE=0
                       GROUP BY ART
                       HAVING MAX(DATE_MVT)<:DATE  
                       INTO ARTICLEASUPPRIMER 
                      )
    DO DELETE FROM ARTICLES WHERE ART=ARTICLEASUPPRIMER
    du fait qu'il y ai groupage , si index il y a besoin ce serait sur qte , mais sera t'il pertinent ?

    NB . Si si , on dit bien des rossignols pour les articles 'morts'

  6. #6
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut
    Désolé, mais cela ne fonctionne pas.
    le having filtre sur le résultat du select et si j'ai des mouvement dont le stock = 0 avant la date et d'autre <> 0 après la date, la requête me les ramène.

    J'ai fait une autre qui me satisfait qu'a moitié (pas encore testée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FOR (select Art from mouvement mv1
          where mv1.Qte = 0
            and mv1.DateMvt= (select max(mv2.DateMvt)
                                       from mouvement mv2
                                       where mv1.Art = mv2.Art)
      and mv1.DateMvt < :Date
      INTO ARTICLEASUPPRIMER )
    DO DELETE FROM ARTICLES WHERE ART=ARTICLEASUPPRIMER
    NB: En argot, un rossignol est un article ou un objet de peu de valeur, voire défectueux. L'origine de cet usage vient, par analogie, du fait que l'oiseau est haut perché dans les arbres et que ces objets invendables (et invendus) sont généralement placés sur les plus hautes étagères dans un magasin hors de portée de la main puisqu'il faut un escabeau pour les atteindre (Wikipedia)

Discussions similaires

  1. Suppression des derniers doublons
    Par sara21 dans le forum Requêtes
    Réponses: 0
    Dernier message: 01/11/2009, 04h18
  2. Réponses: 3
    Dernier message: 31/01/2005, 23h18
  3. [Lisp] Suppression des parenthèses dans une liste
    Par bourdaillet dans le forum Lisp
    Réponses: 3
    Dernier message: 19/12/2004, 21h02
  4. [Tomcat] Suppression des espaces
    Par bluefox_du_974 dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 16/12/2004, 21h54
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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