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 :

Utilisation de plusieurs while


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 13
    Par défaut Utilisation de plusieurs while
    Bonjour,

    Je suis nouveau dans le monde sql server.

    Je souhaiterais utiliser un curseur avec deux boucles while et le @@fetch_status = 0 pour contrôler le parcours de la table avec fetch_next.

    Il semblerait qui ne soit pas possible d'utiliser deux while imbriqué avec 2 curseurs différents.

    Si ce n'est pas le cas avez des exemples?

    En vous remerciant.

    Cordialement,

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 669
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Les bases de données relationnelles sont conçues pour des requêtes ensemblistes, à ce titre les curseurs parcourus séquentiellement sont à éviter si on peut faire autrement.
    Quel est le but fonctionnel recherché ?
    Communiquez un exemple de jeu de données en entrée et de résultat attendu en sortie

  3. #3
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 13
    Par défaut
    Bonjour,

    Je vous communique le code et un jeu de données:

    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
    create table matchtab
    (
    ref_a varchar(2),
    ech_a int,
    ref_b varchar(2),
    ech_b int,
    )
     
    create table echeancier_b
    (
    ref_b varchar(2),
    ech_b int,
    qty_b int,
    datelivraison_b date
    )
     
    create table echeancier_a
    (
    ref_a varchar(2),
    ech_a int,
    qty_a int,
    datelivraison_a date
    )
     
    insert into echeancier_a (ref_a, ech_a,qty_a,datelivraison_a) values ('a',7,10,GETDATE())
    insert into echeancier_b (ref_b, ech_b,qty_b,datelivraison_b) values ('a',3,5,GETDATE()), ('a',8,4,'30/11/2021')
     
    declare ech_curs_a INSENSITIVE CURSOR FOR
    	select ref_a,ech_a,qty_a,datelivraison_a  
    	from echeancier_a
    declare ech_curs_b INSENSITIVE CURSOR FOR
    	select ref_b,ech_b,qty_b,datelivraison_b  
    	from echeancier_b
    open ech_curs_a
    open ech_curs_b
    Declare @ref varchar(2), @ech int, @qty int, @datelivraison date
    Declare @refar varchar(2), @echar int, @qtyar int, @datelivraisonar date
    Declare @cpta int, @cptb int, @i int, @j int, @EOF int
    set @cpta = (select count(*) from echeancier_a)
    set @cptb = (select count(*) from echeancier_b)
     
    --print concat('comteur a', @cpta)
    --print concat('comteur b', @cptb)
    set @j=0
    set @i=0
     
    Fetch ech_curs_a into @ref, @ech, @qty, @datelivraison                    
    while @@FETCH_STATUS = 0
    begin
    	--print concat('@i->',@i)
    	--print concat('Boucle echeancier_a->', @ref,'/', @ech,'/', @qty,'/', @datelivraison)
    	Fetch ech_curs_a into @ref, @ech, @qty, @datelivraison
    	while @@FETCH_STATUS = 0 
    		begin
    			--print concat('@j->',@j)
    			Fetch ech_curs_b into @refar, @echar, @qtyar, @datelivraisonar
    			insert into matchtab (ref_a, ech_a,ref_b, ech_b) values (@ref,@ech,@refar, @echar)
     
    			--print concat('Boucle echeancier_b->', @refar,'/', @echar,'/', @qtyar,'/', @datelivraisonar)
    			set @j = @j + 1
    			FETCH NEXT FROM ech_curs_b
    		end
    	set @i = @i + 1
    	FETCH NEXT FROM ech_curs_a
    end
    close ech_curs_a
    close ech_curs_b
    deallocate ech_curs_a
    deallocate ech_curs_b

  4. #4
    Membre chevronné Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 554
    Par défaut
    explique ce que tu veux faire, c'est probablement faisable en une requête sans curseur

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par artefact89 Voir le message
    Bonjour,

    Je vous communique le code et un jeu de données:

    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
    create table matchtab
    (
    ref_a varchar(2),
    ech_a int,
    ref_b varchar(2),
    ech_b int,
    )
     
    create table echeancier_b
    (
    ref_b varchar(2),
    ech_b int,
    qty_b int,
    datelivraison_b date
    )
     
    create table echeancier_a
    (
    ref_a varchar(2),
    ech_a int,
    qty_a int,
    datelivraison_a date
    )
     
    insert into echeancier_a (ref_a, ech_a,qty_a,datelivraison_a) values ('a',7,10,GETDATE())
    insert into echeancier_b (ref_b, ech_b,qty_b,datelivraison_b) values ('a',3,5,GETDATE()), ('a',8,4,'30/11/2021')
     
    declare ech_curs_a INSENSITIVE CURSOR FOR
    	select ref_a,ech_a,qty_a,datelivraison_a  
    	from echeancier_a
    declare ech_curs_b INSENSITIVE CURSOR FOR
    	select ref_b,ech_b,qty_b,datelivraison_b  
    	from echeancier_b
    open ech_curs_a
    open ech_curs_b
    Declare @ref varchar(2), @ech int, @qty int, @datelivraison date
    Declare @refar varchar(2), @echar int, @qtyar int, @datelivraisonar date
    Declare @cpta int, @cptb int, @i int, @j int, @EOF int
    set @cpta = (select count(*) from echeancier_a)
    set @cptb = (select count(*) from echeancier_b)
     
    --print concat('comteur a', @cpta)
    --print concat('comteur b', @cptb)
    set @j=0
    set @i=0
     
    Fetch ech_curs_a into @ref, @ech, @qty, @datelivraison                    
    while @@FETCH_STATUS = 0
    begin
    	--print concat('@i->',@i)
    	--print concat('Boucle echeancier_a->', @ref,'/', @ech,'/', @qty,'/', @datelivraison)
    	Fetch ech_curs_a into @ref, @ech, @qty, @datelivraison
    	while @@FETCH_STATUS = 0 
    		begin
    			--print concat('@j->',@j)
    			Fetch ech_curs_b into @refar, @echar, @qtyar, @datelivraisonar
    			insert into matchtab (ref_a, ech_a,ref_b, ech_b) values (@ref,@ech,@refar, @echar)
     
    			--print concat('Boucle echeancier_b->', @refar,'/', @echar,'/', @qtyar,'/', @datelivraisonar)
    			set @j = @j + 1
    			FETCH NEXT FROM ech_curs_b
    		end
    	set @i = @i + 1
    	FETCH NEXT FROM ech_curs_a
    end
    close ech_curs_a
    close ech_curs_b
    deallocate ech_curs_a
    deallocate ech_curs_b
    Les WHILEs imbriqués fonctionnent parfaitement. C'est votre logique qui est "spaghetti" et de plus, vous ne maitrisez pas la commande FETCH...
    FETCH NEXT ne sert a rien. FETCH suffit, mais surtout vous avez oublié la partie INTO !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 669
    Billets dans le blog
    10
    Par défaut
    J'insiste

    Citation Envoyé par escartefigue Voir le message
    Quel est le but fonctionnel recherché ?
    Communiquez un exemple de jeu de données en entrée et de résultat attendu en sortie
    Plutôt que de nos expliquer comment vous faites, dites-nous ce que vous voulez obtenir

  7. #7
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 13
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    J'insiste



    Plutôt que de nos expliquer comment vous faites, dites-nous ce que vous voulez obtenir
    Bonjour,

    Vious avez raison. Je vous partage les besoins fonctionnels.

    J'ai deux tables echeancier_a and echeancier_b dont le lien unique est ref_a et ref_b. Je voudrais utiliser un 3 ème table matchtab pour les associer afin de rélisezr la distribution de quantité de la table echeancier_b vers echeancier_a.

    Voici l'exemple, avec la table matchtab remplie:



    Table echeancier_a

    ref_a ech_a qty_a datelivraison_a
    a 7 10 09/06/2021
    a 11 5 11/06/2021

    Table echeancier_b

    ref_b ech_b qty_b datelivraison_b
    a 1 2 11/07/2021
    a 37 5 12/07/2021
    a 45 7 13/07/2021
    a 47 1 14/07/2021

    Table matchtab

    ref_a echa_b ref_b ech_b qty_a qty_b qty_allocated Commentaires
    a 7 a 1 10 2 2 2 qty_b allouées (ech_b=1) sur 10 qty_a (ech_a=7)
    a 7 a 37 10 5 5 5 qty_b allouées (ech_b=37) sur 8 qty_a (ech_a=7)
    a 7 a 45 10 7 3 3 qty_b allouées (ech_b=45) sur 3 qty_a (ech_a=7 est complétement allouée). Il reste 4 de la qté_b initialement égale à 7 de ech_b=45 à allouer à ech_a=11
    a 11 a 45 5 4 4 4 qty_b allouées (ech_b=45) sur 5 qty_a. Il reste 1 qty_a à allouer à allouer à l'ech_a=11
    a 11 a 47 5 1 1 1 qty_b allouées (ech_b=47) sur 1 qty_a. ech_a=11 est complétement allouée

    Merci pour votre aide

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 669
    Billets dans le blog
    10
    Par défaut
    "le lien unique est ref_a et ref_b. ", se traduit en SQL "le critère de jointure est echeancier_a.ref_a=echeancier_b.ref_b"

    Ceci étant dit, votre résultat attendu pose questions :
    • pour quelle(s) raison(s) matchtab associe-t-elle la valeur ech_a=7 aux valeurs ech_b=1, 377 et 45, mais pas à la valeur ech_b=47 ?
    • pour quelle(s) raison(s) matchtab associe-t-elle la valeur ech_a=11 aux valeurs ech_b=45 et 47, mais pas aux autres valeurs de ech_b 1 et 377 ?
    • quelle est la règle qui permet de calculer la colonne qty_allocated ?

  9. #9
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 13
    Par défaut
    pour quelle(s) raison(s) matchtab associe-t-elle la valeur ech_a=7 aux valeurs ech_b=1, 37 et 45, mais pas à la valeur ech_b=47 ?
    • Un tri croissant est fait sur ech_a et ech_b. Les allocations de quantité se font donc par ordre croissant pour une même référence. L'éch_a=7 a pour quantité 10, les quantités de l'ech_b=1, 37 et 45 sont complètement allouées à ech_a 7 avec un reste de 4 provenant de ech_b 45. Cette quantité de 4 sera allouée à ech_a=11

    pour quelle(s) raison(s) matchtab associe-t-elle la valeur ech_a=11 aux valeurs ech_b=45 et 47, mais pas aux autres valeurs de ech_b 1 et 37 ?
    • On alloue les quantités en fonction de ech_b et ech_a triées par ordre croissant. ech_a = 7 (pour une qté de 10) s'est vu allouée ladite qté de 10 par ech_b=1, 37 et une partie de 45. C'est pour cela que ech_a = 11 s'est vue assignée les quantités provenant uniquement de ech_b = 45 et 47.

    quelle est la règle qui permet de calculer la colonne qty_allocated ?
    • J'ai rajouté une colonne commentaires dans le table matchlab qui précise la règle

    En vous remerciant pour votre aide.

Discussions similaires

  1. Variable utilisée ds plusieurs pages asp
    Par zorba49 dans le forum ASP
    Réponses: 3
    Dernier message: 26/05/2005, 16h39
  2. [Servlet] Utilisation de plusieurs classes
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/05/2005, 10h43
  3. Application utilisable avec plusieurs SGBD - ADO ou DBX ?
    Par RamDevTeam dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 09h25
  4. [STRUTS] utilisation de plusieurs tags <html:subm
    Par Super Castor dans le forum Struts 1
    Réponses: 6
    Dernier message: 23/06/2004, 12h42
  5. [struts] utilisation de plusieurs fichiers de config
    Par Boosters dans le forum Struts 1
    Réponses: 4
    Dernier message: 25/03/2004, 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