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

QlikView Discussion :

Suppression d'enregistrement à partir d'une liste


Sujet :

QlikView

  1. #1
    Membre à l'essai
    Homme Profil pro
    Gestionnaire Analyste Base de Données
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gestionnaire Analyste Base de Données

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 20
    Points
    20
    Par défaut Suppression d'enregistrement à partir d'une liste
    Bonjour,

    Je souhaiterais supprimer dans une table certaines lignes que j'ai isolées dans une autre table.
    Avec un exemple c'est plus facile:

    Table1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Clé	Année	Mois
    A	2011	1
    B	2012	1
    C	2012	2
    Table2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Clé	Année	Mois
    A	2011	1
    Résultat:
    Table1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Clé	Année	Mois
    B	2012	1
    C	2012	2
    Je souhaiterai supprimer tous les enregistrement de la Table1 présents dans la Table2: Ici uniquement l'enregistrement A mais il y a bien plus de ligne en réalité...

    Une petite idée ? (Je sens une solution simple mais j'ai le cerveau à l'arrêt aujourd'hui...)
    Merci d'avance.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Gestionnaire Analyste Base de Données
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gestionnaire Analyste Base de Données

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 20
    Points
    20
    Par défaut Idée un peu lourde
    J'ai eu une idée et je souhaite la partager pour avoir vos remarques:

    Je pourrai charger la Table1 en ajoutant dans la clause WHERE: Clé <> "Clé de chaque ligne de la Table2"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Table_Finale:
    LOAD *
    FROM Table1
    WHERE 
    BOUCLE générant pour chaque ligne de la table2 ceci:
       Clé <> A 
       AND Clé <> ...
       AND Clé <> ...
    FIN BOUCLE
    ;
    Je trouve cette solution un peu lourde. Qu'en pensez-vous ?
    Merci de vos retours

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    Compliquée ta solution ...
    Je n'ai pas la syntaxe exacte en tête, mais on doit pouvoir faire un load where not exists()
    Regarde par là ...
    Désolé de ne pas aider plus, mais je ne suis pas au bureau, là ...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Gestionnaire Analyste Base de Données
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gestionnaire Analyste Base de Données

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 20
    Points
    20
    Par défaut Arf
    Pour ma solution:
    Encore faudrait-il pouvoir mettre une boucle For dans une clause WHERE...

    Merci FORMULARY, je regarde de ce côté

  5. #5
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 649
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 649
    Points : 2 529
    Points
    2 529
    Billets dans le blog
    6
    Par défaut
    Soit la source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Table_Source:
    LOAD * INLINE [
    S.Clé, S.Année, S.Mois
    A, 2011, 1
    B, 2012, 1
    C, 2012, 2
    ];

    et la table d'exclusion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Table_Exclusion:
    LOAD * INLINE [
    X.Clé
    A
    ];
    (on n'a besoin que des clés, étant donné que c'est l'identifiant unique)

    On pourra alors faire un chargement de toutes les lignes de la source sauf celles que l'on veut exclure avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Table_Resultat:
    LOAD 
    	S.Clé AS Clé, 
    	S.Année AS Année,
    	S.Mois AS Mois
    RESIDENT Table_Source
    WHERE not Exists(X.Clé, S.Clé);

  6. #6
    Membre à l'essai
    Homme Profil pro
    Gestionnaire Analyste Base de Données
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gestionnaire Analyste Base de Données

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 20
    Points
    20
    Par défaut Merci !
    Merci pour vos deux réponses.
    J'ai appliqué la méthode du 'WHERE NON EXISTS" et cela fonctionne très bien.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur en études décisionnelles
    Inscrit en
    Février 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en études décisionnelles

    Informations forums :
    Inscription : Février 2013
    Messages : 134
    Points : 351
    Points
    351
    Par défaut Suppression d'enregistrements avec une clé multiple
    Bonjour à tous,

    Excusez-moi d'up ce sujet, mais j'ai une question sur le même problème, avec une clé multiple. Je pense donc que créer un nouveau sujet n'est pas pertinent car c'est la suite de celui-ci ; mais si vous pensez que c'est plus opportun, je laisse un modérateur le scinder. Je vous explique le problème :


    Voici ma source : (avec une requête SQL très simplifiée par rapport à ce que j'ai normalement, mais c'est pour que vous compreniez l'idée). Les champs sont renommés avec un tag "SANS_INFO" pour éviter une jointure non voulue avec un autre champ défini plus haut dans mon script.

    Ici, ma clé est composée de (NUM_ETT, NUM_CAI, NUM_TIC, DAT_VTE)

    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
    TABLE_SOURCE:
    LOAD "NUM_ETT" as NUM_ETT_SANS_INFO,
    	 "NUM_CAI" as NUM_CAI_SANS_INFO, 
    	 "NUM_TIC" as NUM_TIC_SANS_INFO, 
    	 "DAT_VTE" as DAT_VTE_SANS_INFO, 
    	 "NUM_MODPAICAI",
    	 "NUM_CARTE"
    ;
    SQL SELECT distinct L.NUM_ETT, L.NUM_CAI, L.NUM_TIC, L.DAT_VTE, 
    	   P.NUM_MODPAICAI,
    	   NUM_CARTE
    FROM  T_FAI_VTE_LIGTICCAI L
     
    INNER JOIN T_FAI_VTE_PAITICCAI P
    ON L.NUM_ETT=P.NUM_ETT
    AND L.NUM_CAI=P.NUM_CAI
    AND L.NUM_TIC=P.NUM_TIC
    AND L.DAT_VTE=P.DAT_VTE
     
    where L.DAT_VTE between '2013-01-01' and '2013-01-05'
    ;
    J'ai une table d'exclusion (un fichier facture, en réalité) qui se définit ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FICHIER_FACTURE:
    LOAD mag as NUM_ETT_FACT, 
         datevente as DTE_VTE_FACT, 
         numcais as NUM_CAI_FACT, 
         numtick as NUM_TIC_FACT
    FROM
    [E:\Workspace\extraction facture.xls]
    ;

    A partir de tout ça je définis ma table en m'inspirant du script indiqué dans les messages précédents de ce topic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TABLE_RESULTAT:
    LOAD *
    RESIDENT TABLE_SOURCE
    WHERE not exists(NUM_ETT_FACT,NUM_ETT_SANS_INFO) 
    AND not exists(NUM_CAI_FACT,NUM_CAI_SANS_INFO) 
    AND not exists(NUM_TIC_FACT,NUM_TIC_SANS_INFO)
    AND not exists(DAT_VTE_FACT,DAT_VTE_SANS_INFO)
    ;
    A la fin du script, la table n'est pas définie, il n'y a aucune donnée.

    Si je comprends bien, le souci est que QV recherche la valeur de NUM_ETT_SANS_INFO dans toutes les valeurs de NUM_ETT_FACT. Une fois qu'il l'a trouvée, il recherche la valeur de NUM_CAI_SANS_INFO dans toutes les valeurs de NUM_CAI_FACT, même si ce n'est pas sur la même ligne que le test précédent. Ce qui n'est, évidemment, pas le comportement souhaité.

    Ce que j'aimerais c'est rechercher les lignes de FICHIER_FACTURE dans TABLE_SOURCE pour les exclure dans TABLE_RESULTAT. Est-ce possible de faire ça ?

    Merci d'avance de votre aide.

  8. #8
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 649
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 649
    Points : 2 529
    Points
    2 529
    Billets dans le blog
    6
    Par défaut
    Dans votre post, vous dites :
    Ici, ma clé est composée de (NUM_ETT, NUM_CAI, NUM_TIC, DAT_VTE)
    Donc ce que je comprends, c'est que vous voulez exclure les lignes en vous basant sur cette clé, c'est bien ça ?


    A ce moment là, le plus simple est de formaliser votre clé composite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TABLE_SOURCE:
    LOAD "NUM_ETT" AS NUM_ETT_SANS_INFO,
    	 "NUM_CAI" AS NUM_CAI_SANS_INFO, 
    	 "NUM_TIC" AS NUM_TIC_SANS_INFO, 
    	 "DAT_VTE" AS DAT_VTE_SANS_INFO, 
    	 "NUM_MODPAICAI",
    	 "NUM_CARTE",
    NUM_ETT & '|' & NUM_CAI & '|' & NUM_TIC & '|' & DAT_VTE AS CLE_SANS_INFO
    ;
    ...

    Ainsi, au lieu de faire 4 "where not exists" sur 4 champs différents, vous n'en faites qu'un seul, sur votre champ CLE.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur en études décisionnelles
    Inscrit en
    Février 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en études décisionnelles

    Informations forums :
    Inscription : Février 2013
    Messages : 134
    Points : 351
    Points
    351
    Par défaut
    Bonjour, c'est exactement ce que je demandais. Pour ma méthode :

    J'ai formalisé dans FICHIER_FACTURE un champ défini ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mag & '|' & numcais & '|' & numtick & '|' & datevente AS CLE_EXCLUSION_FACT
    Et j'ai rajouté cette ligne dans TABLE_SOURCE une clause définie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE not exists(CLE_EXCLUSION_FACT, NUM_ETT & '|' & NUM_CAI & '|' & NUM_TIC & '|' & DAT_VTE)
    Puisque je n'ai pas besoin de la table source, je ne m'embête pas à recréer une table résultat. Merci beaucoup pour votre aide PhunkyBob.

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

Discussions similaires

  1. [Batch] Suppression de repertoire à partir d'une liste
    Par liondu75 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/03/2011, 09h12
  2. [MySQL] Afficher des enregistrements à partir d'une liste
    Par ljuboja78 dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 13/02/2009, 00h03
  3. Réponses: 3
    Dernier message: 12/01/2009, 10h56
  4. Réponses: 30
    Dernier message: 09/01/2009, 09h20
  5. Enregistrement à partir d'une liste modifiable
    Par guymar dans le forum Access
    Réponses: 2
    Dernier message: 23/12/2006, 17h45

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