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

Développement SQL Server Discussion :

Retourner des enregistrements qui n'existent pas


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Points : 63
    Points
    63
    Par défaut Retourner des enregistrements qui n'existent pas
    Bonjour à tous,

    Je réalise une requête qui liste pour chaque commande tous les lots de stocks qui y sont associés via les entrées de marchandises.

    En somme : Commande <- Entrée de marchandise <- Lot

    Je peux recevoir partiellement une commande. Mon problème c'est que je souhaite rajouter à ma liste pour chaque commande ayant des lots associés, une ligne vide correspondant au Reste à Livrer de la commande.

    En gros je voudrais ça :
    N° de Commande | Article | N° de Lot | Quantité du lot
    CMD 01 | Article 01 | Lot 01 | 2
    CMD 01 | Article 01 | Lot 02 | 3
    CMD 01 | Article 01 | NULL | NULL ou 0

    C'est cette dernière ligne qui me manque.

    Pour l'instant voici ma requête :
    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
    SELECT 
    t0.DocNum AS 'N° CMD', --
    t1.ItemCode
    t1.Dscription AS 'Libellé (ou service)',
    ISNULL(t4.BatchNum, '') AS 'Lot',
     
     
    FROM [base].dbo.OPOR t0 --Table des commandes
    INNER JOIN [cryospace_test5].dbo.POR1 t1 ON --Table des lignes de commandes
    t0.docentry = t1.docentry
     
    LEFT JOIN [base].dbo.PDN1 t2 ON --Table des lignes d'entrée de marchandise
    t2.baseentry=t1.docentry and t2.baseline=t1.linenum
     
    LEFT JOIN [base].dbo.OPDN t3 ON --Table des entrée de marchandise 
    t3.docentry = t2.docentry
     
    LEFT JOIN [base].dbo.IBT1 t4 ON --Table des lots
    t2.docentry = t4.baseentry and t4.basetype=20
     
    WHERE t0.Docnum < 800000 
    AND t0.DocStatus <> 'C'
    AND t1.LineStatus <>'C'
     
    Order by 1
    Peut être que la réponse est évidente mais impossible de la trouver.
    Merci d'avance pour vos indications !

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    quelque chose comme ceci :
    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
    WITH cte as (
    	SELECT 
    		t0.DocNum AS 'N° CMD', --
    		t1.ItemCode,
    		t1.Dscription AS 'Libellé (ou service)',
    		ISNULL(t4.BatchNum, '') AS 'Lot',
    		ROW_NUMBER() OVER (PARTITION BY t0.DocNum ORDER BY t1.ItemCode) as rownum
    	FROM [base].dbo.OPOR t0 --Table des commandes
    	INNER JOIN [cryospace_test5].dbo.POR1 t1 ON --Table des lignes de commandes
    		t0.docentry = t1.docentry
    	LEFT JOIN [base].dbo.PDN1 t2 ON --Table des lignes d'entrée de marchandise
    		t2.baseentry=t1.docentry AND t2.baseline=t1.linenum
    	LEFT JOIN [base].dbo.OPDN t3 ON --Table des entrée de marchandise 
    		t3.docentry = t2.docentry
    	LEFT JOIN [base].dbo.IBT1 t4 ON --Table des lots
    		t2.docentry = t4.baseentry AND t4.basetype=20
    	WHERE t0.Docnum < 800000 
    	AND t0.DocStatus <> 'C'
    	AND t1.LineStatus <>'C'
    )
    SELECT [N° CMD], ItemCode, [Libellé (ou service)], [Lot]
    FROM cte
    UNION ALL   
    SELECT [N° CMD], ItemCode, NULL, NULL
    FROM cte
    WHERE rownum = 1
    ORDER BY 1;
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Points : 63
    Points
    63
    Par défaut
    Bonjour Rudib,

    Je n'ai pas réussi à manipuler cette ligne avec le reste de ma requête (cad tout ce que je n'ai pas collé dans mon poste initial)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ROW_NUMBER() OVER (PARTITION BY t0.DocNum ORDER BY t1.ItemCode) AS rownum"
    Cependant ton post m'a bien aidé car j'ai repris le principe du UNION pour rajouter une ligne si je trouvais des lots. C'est peut-être moins rentable en terme de ressources.


    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    --1ère Partie
    SELECT 
    t0.DocNum AS 'N° CMD',
    CASE 
    	WHEN t1.ItemCode NOT LIKE 'HA-%' THEN t1.ItemCode
    	ELSE ''
    END AS 'Article',
    CASE 
    	WHEN t1.ItemCode LIKE 'HA-%' THEN t1.ItemCode
    	ELSE ''
    END AS 'Catégorie d''Approvisionnement',
    t1.Dscription AS 'Libellé (ou service)',
    '' AS 'Configuration',
    '' AS 'Taille',
    '' AS 'Couleur',
    'LMX' AS 'Site',
    '' AS 'Entrepôt',
    ISNULL(t4.BatchNum, '') AS 'Lot',
    '' AS 'Numéro Série',
    '' AS 'Numéro Palette',
    '' AS 'Fabricant',
    '' AS 'Projet',
    ISNULL(t1.OpenCreQty, 0) AS 'Quantité',
    t1.Price AS 'Prix unitaire',
    t1.ShipDate AS 'Date de livraison',
    t1.Rate AS 'Taux de change',
    t1.Currency AS 'Devise'
     
    FROM [Base].dbo.OPOR t0 --Commande
    INNER JOIN [Base].dbo.POR1 t1 ON --Ligne de commande
    t0.docentry = t1.docentry
     
    LEFT JOIN [Base].dbo.PDN1 t2 ON --Ligne d'entrée de marchandise
    t2.baseentry=t1.docentry and t2.baseline=t1.linenum
     
    LEFT JOIN [Base].dbo.OPDN t3 ON --Entrée de marchandises
    t3.docentry = t2.docentry
     
    LEFT JOIN [Base].dbo.IBT1 t4 ON --Lot
    t2.docentry = t4.baseentry and t4.basetype=20 and t2.LineNum = t4.BaseLinNum
     
    ---- Facture si réception de marchandise
    LEFT JOIN [Base].dbo.PCH1 T6 ON T2.DocEntry = T6.BaseEntry -- Facture
    	  AND T2.linenum = T6.BaseLine
    	  AND T2.ObjType = T6.BaseType
     
    ---- Facture si aucune réception de marchandise
    LEFT JOIN [Base].dbo.PCH1 T7 ON T1.DocEntry = T7.BaseEntry -- Facture
    	  AND T1.LineNum = T7.BaseLine
    	  AND T1.ObjType = T7.BaseType
     
    WHERE t0.Docnum < 800000 
    AND t0.DocStatus <> 'C'
    AND t1.LineStatus <>'C'
    --AND isnull(t5.DPCNSTOPHY, 0) <> 0
     
    --Sans facture du tout
    AND t7.DocEntry is null
    AND t6.DocEntry is null
     
    UNION ALL
     
    --Seconde partie
     
    SELECT 
    t0.DocNum AS 'N° CMD', 
    CASE 
    	WHEN t1.ItemCode NOT LIKE 'HA-%' THEN t1.ItemCode
    	ELSE ''
    END AS 'Article',
    CASE 
    	WHEN t1.ItemCode LIKE 'HA-%' THEN t1.ItemCode
    	ELSE ''
    END AS 'Catégorie d''Approvisionnement',
    t1.Dscription AS 'Libellé (ou service)',
    '' AS 'Configuration',
    '' AS 'Taille',
    '' AS 'Couleur',
    'LMX' AS 'Site',
    '' AS 'Entrepôt',
    '' AS 'Lot',
    '' AS 'Numéro Série',
    '' AS 'Numéro Palette',
    '' AS 'Fabricant',
    '' AS 'Projet',
    t1.OpenCreQty AS 'Quantité',
    t1.Price AS 'Prix unitaire',
    t1.ShipDate AS 'Date de livraison',
    t1.Rate AS 'Taux de change',
    t1.Currency AS 'Devise'
     
    --Ici j'ai remplacé les LEFT JOIN par des INNER JOIN pour ne voir que les cas où j'ai des lots.
     
    FROM [Base].dbo.OPOR t0
    INNER JOIN [Base].dbo.POR1 t1 ON
    t0.docentry = t1.docentry
     
    INNER JOIN [Base].dbo.PDN1 t2 ON
    t2.baseentry=t1.docentry and t2.baseline=t1.linenum
     
    INNER JOIN [Base].dbo.OPDN t3 ON
    t3.docentry = t2.docentry
     
    INNER JOIN [Base].dbo.IBT1 t4 ON 
    t2.docentry = t4.baseentry and t4.basetype=20 and t2.LineNum = t4.BaseLinNum
     
    ---- Facture si réception de marchandise
    LEFT JOIN [Base].dbo.PCH1 T6 ON T2.DocEntry = T6.BaseEntry -- Facture
    	  AND T2.linenum = T6.BaseLine
    	  AND T2.ObjType = T6.BaseType
     
    WHERE t0.Docnum < 800000 
    AND t0.DocStatus <> 'C'
    AND t1.LineStatus <>'C'
     
    --Sans facture du tout
    AND t6.DocEntry is null
    --Ligne pour n'ajouter qu'une ligne en plus dans le recordset si je trouve des lots
    Group by t0.DocNum, t1.ItemCode, t1.Dscription, t1.OpenCreQty, t1.Price, t1.ShipDate, t1.Rate, t1.Currency
    En tout cas problème résolu, merci Rudib.

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

Discussions similaires

  1. insertion des numéros qui n'existe pas dans la base de données
    Par cisco.nat dans le forum Général Java
    Réponses: 5
    Dernier message: 09/07/2013, 12h39
  2. Réponses: 1
    Dernier message: 11/05/2011, 14h38
  3. [MySQL] extraire des données d'1 table t1 qui n'existent pas dans la table t2
    Par z_ahlam dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/11/2010, 18h07
  4. La vue all_synonym contient des synonymes qui n'existent pas
    Par bankette dans le forum Administration
    Réponses: 11
    Dernier message: 30/12/2009, 17h13
  5. Réponses: 7
    Dernier message: 15/03/2009, 16h07

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