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

MS SQL Server Discussion :

procedure curseur et update


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut procedure curseur et update
    bonjour à tous,

    J'ai un problème que je n'arrive pas à resoudre.
    Je vais essayer de l'expliquer le plus clairement possible.
    J'ai une première table AccountBase que je souhaite modifier en fonction d'une autre F_COMPTET.
    Quand quelqu'un modifie F_COMPTET, AccountBase qui contient a peu de chose prés les même données sera elle aussi modifiée.
    Pour une raison x je ne peut pas utiliser de triggers.
    Je créé un curseur sur F_COMPTET qui me permet de savoir si un de ces champs à été modifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	DECLARE un_curseur cursor FOR
    	select cbMarq,CT_Num,CT_NumPayeur,CT_Intitule,CT_Contact,CT_Adresse,CT_Complement,CT_CodePostal,CT_Ville,CT_Pays,CT_Telephone,CT_Telecopie,CT_EMail,CT_Site,N_CatCompta,CT_Type,N_CatTarif,RE_No from GAMIELEC.dbo.F_COMPTET
    	where @id_client=0 and CT_Intitule not like'%*%'
    	and DATEPART(year,CBModification) = DATEPART(year,GETDATE()) AND
    	DATEPART(month,CBModification) = DATEPART(month,GETDATE()) AND
    	DATEPART(day,CBModification) = DATEPART(day,GETDATE())
    Ensuite après avoir effectuer les instructions open puis fetch du curseur j'effectue des updates sur la table AccountBase :

    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
     
    Update AMIELEC_MSCRM.dbo.AccountBase
    SET AccountCategoryCode=@catcomptaInt,TerritoryId=@conv_pays,DefaultPriceLevelId=@id_tarif,
    OwningUser=@id_utilisateur,AccountNumber=@numpayeur,Description=@intitule,WebSiteURL=@site,EMailAddress1=@mail,
    Telephone1=@telephone,Fax=@fax,ParentAccountId=@idnom_parent,StatusCode=1,StateCode=0,DeletionStateCode=0
    FROM AMIELEC_MSCRM.dbo.AccountBase CRM JOIN un_curseur
    ON CRM.Name=un_curseur.CT_Num 
     
    Update AMIELEC_MSCRM.dbo.CustomerAddressBase
    SET Name=@adresse,Line1=@complement,PostalCode=@code_postal,City=@ville,ObjectTypeCode=1,DeletionStateCode=0,AddressNumber=1
    FROM AMIELEC_MSCRM.dbo.CustomerAddressBase CRM JOIN un_curseur
    ON CRM.ParentId=un_curseur.AccountId
     
    Update AMIELEC_MSCRM.dbo.AccountExtensionBase
    SET New_Identifiant=@identifiant_client,New_TypePersonne=@type_pers_char,New_categorie_comptable=@catcomptaChar,
    New_representant=@un_representant,New_contacts=@contact,New_societe=@num,New_descriptif=@intitule
    FROM AMIELEC_MSCRM.dbo.AccountExtensionBase CRM JOIN un_curseur
    ON CRM.New_societe=un_curseur.CT_Num
    Le problème ce que lorsque j'execute ma procédure l'objet un_curseur ne semble pas être reconnu. Je pense que ma syntaxe n'est pas bonne dans mes from!
    Comment faire pour joindre le curseur que j'ai crée dans mes update???

    Jespere avoir été clair, merci d'avance a ceux qui pourront me répondre.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Le plus simple est de récupérer la clé de la ligne que tu veux mettre à jour lors de la déclaration de ton curseur. Puis de faire tes updates par rapport à cette clé.
    Il vaut mieux que tu parcours l'ensemble de ton curseur avec les instructions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Declare monCurseur CURSOR FOR SELECT CLE,CH FROM maTable WHERE Clauses
    OPEN monCurseur 
    FETCH NEXT FROM monCurseur INTO @cle,@var
    WHILE @@FETCH_STATUS=0
    BEGIN
               UPDATE autreTable SET CH=@var WHERE cle=@cle 
               FETCH NEXT FROM monCurseur INTO @cle,@var
    END
    CLOSE monCurseur 
    DEALLOCATE monCurseur
    Je pense que cette méthode est plus appropriée. Il te faut juste adapter ce morceau de code à ton cas.

    Tiens moi au courant de l'évolution de ton problème.

    Bon courage.
    @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    Merci de m'avoir répondu si vite!

    Dans ton code a quoi correspond CH?

    et le problème c'est que les cléf des deux tables sont différentes...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    CH identifie un champ ou la liste des champs que tu souhaites récupérer de ta table.
    Si tes clés sont différentes tu peux utiliser une somme de champ dans la clause where de ton update qui puisse rendre unique le champ à modifier.

    Exemple:
    Table1
    id ch1 ch2 ch3=champ à modifier
    1 a b 1
    2 a d 5
    3 b b 6

    Table2
    id ch1 ch2 ch3=champ à modifier
    4 a b 2
    5 a d 5
    6 b b 6

    requête d'update

    UPDATE Table2 SET ch3=@var_ch3 WHERE ch1=@var_ch1 and ch2=@var_ch2

    N'oublies pas de dire si ça a fonctionné.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    Alors je viens de tester et au miracle ca marche dans deux des trois update.
    Il me semblait pourtant avoir essayer cette solution avant et l'update c'était fait sur la table entière enfin bref...

    J'ai toujours un problème sur mon deuxième update.
    En effet celui ci concerne une table adresse qui est secondaire, tous les champs de cette table peuvent être succeptible d'être modifié sauf la clé primaire appele parentid qui est créér lors de la création du champs lui meme.
    En fait la clé primaire n'est pas présente das le curseur mias créé plus tard.
    Je en sais pas comment faire dans ce cas la?

    tu as une idée?

    sinon merci beaucoup pour ton aide tu ne peut pas savoir depuis combien de temps je cherche une solution a ce problème

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Il faut juste que ta clé parentid soit clé étrangère de ta table principale. De cette mainière pour chaque champ à mettre à jour relative à ta table principale tu pourras modifier le bon champ de ta table secondaire ADRESSE.

    Fais attention à lier toutes tes tables dans ton modèle conceptuel de données.
    C'est plus efficace pour effectuer des modifications lors que l'ensemble de tes tables ont des informations de liaisons.

    Il faut aussi que tu vois les différentes dépendances fonctionnelles de tes tables.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    J'ai oublié de te préciser que je ne peut pas créer d'autre champs dans mes tables Account... Ca serait trop facile! lol
    Ces tables sont intégré dans un logiciel c'est pour ca!
    Par contre ma table AccountBase(principale) et sa clé primaire est lié a la table D'adresse(secondaire) par la clé etrangére ParentId.
    toutefois Je ne vois toutefois pas coment l'utilisé dans mon cas puisque ParentId n'apparait pa dans mon curseur?

  8. #8
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    tu peux utiliser les tables virtuelles. ex:


    UPDATE AMIELEC_MSCRM.dbo.AccountBase
    SET AccountCategoryCode=@catcomptaInt,TerritoryId=@conv_pays,DefaultPriceLevelId=@id_tarif,
    OwningUser=@id_utilisateur,AccountNumber=@numpayeur,Description=@intitule,WebSiteURL=@site,EMailAddress1=@mail,
    Telephone1=@telephone,Fax=@fax,ParentAccountId=@idnom_parent,StatusCode=1,StateCode=0,DeletionStateCode=0
    FROM AMIELEC_MSCRM.dbo.AccountBase CRM JOIN
    (SELECT cbMarq,CT_Num,CT_NumPayeur,CT_Intitule,CT_Contact,CT_Adresse,CT_Complement,CT_CodePostal,CT_Ville,CT_Pays,CT_Telephone,CT_Telecopie,CT_EMail,CT_Site,N_CatCompta,CT_Type,N_CatTarif,RE_No FROM GAMIELEC.dbo.F_COMPTET
    WHERE AND CT_Intitule NOT LIKE'%*%'
    AND DATEPART(year,CBModification) = DATEPART(year,GETDATE()) AND
    DATEPART(month,CBModification) = DATEPART(month,GETDATE()) AND
    DATEPART(day,CBModification) = DATEPART(day,GETDATE()))
    un_curseur
    ON CRM.Name=un_curseur.CT_Num

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    oui c'est vrai que l'on pouvait faire comme ca!
    Mais l'autre méthode que j'uilise maitenant semble plus rapide!

    J'ai maintenant un autre probleme, que j'ai expliqué dans mon post précédent?

    Je ne sais pas si j'ai été clair das mon dernier post?

    Merci pour ta réponse serge!

  10. #10
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    si j'ai compris

    l'id de l'adresse est dans la table principale:
    table principale champs clefs que l'on nommera
    id_client et id_client_adresse

    table adresse
    id_adresse

    ta jointure est
    id_adresse=id_client_adresse

    OU le contraire
    l'id du client est dans la table secondaire (adresse)
    table principale champs clefs que l'on nommera
    id_client et id_adresse

    table adresse
    id_client_adresse

    ta jointure est
    id_adresse=id_client_adresse

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    Bon en fait dans ma table client j'ai une clé primaire AccountId.
    Dans la table adresse jai la clé étrangéré qui référence les clients : AccountId; j'ai aussi un champs CustomerAdressId qui avec AccountId constitue la clé primaire de la table adresse.

    Je ne peut pas créér d'autres champs dans ces tables...

    Est ce que mon update est possible dans se cas.
    Sachant que l'update doit porter sur le résultat de mon curseur et que dans se curseur il n'y a ni le champs AccountId ni le champs CustomerAdressId car ceux ci sont créée plus tard dans ma procédure.

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Tu dois simplement rajouter dans les champs à sélectionner dans ton curseur le champ clé étrangère de ta table principale.
    SELECT clé_primaire,...,clé_étrangère FROM AccountID Where clauses

    "clé_étrangère" est fait partie de ton couple de clé primaire de ta table adresse et de ta table principale AccountID. Don tu pourras récupérer sa valeur.

    Voilà.

    Essaie de mettre des structures simplifiées de tes tables, ça aiderait à comprendre plus rapidement.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 61
    Par défaut
    Je ne peut pas mon curseur porte sur la table F_Comptet! Celle ci ne contient et ne peut pas contenir les champs AccountId ou ParentId.
    Les modifications elles se font sur une autre table AccountBase.

    Mais ce n'est pa grave ma mise à jour marche sur mes tables principales c'est déjà bien. Voila deja une semaine presque que je planche sur ce probleme.
    Si je continu je vais me pendre, je suis encore jeune je veux pas mourrir tout de suite!

    Merci beaucoup à vous deux pour vos réponse et votre aide précieuse!

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Tu peux faire faire de l'inclusion de curseur c'est-à-dire définir un curseur à partir des informations renvoyer par un curseur l'englobant.

    exemple :

    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
     
    DECLARE cursor1 CURSOR FOR ...
    OPEN cursor1 
    FETCH NEXT FROM cursor1 INTO @var
    WHILE @@FETCH_STATUS=0
    BEGIN 
        ...................
        DECLARE cursor2 CURSOR FOR ... WHERE ch=@var
        OPEN cursor2 
        FETCH NEXT FROM cursor2 INTO @var2
        WHILE @@FETCH_STATUS=0
        BEGIN
        ...........
        FETCH NEXT FROM cursor2 INTO @var2
        END
        CLOSE cursor2
        DEALLOCATE cursor2
        FETCH NEXT FROM cursor1 INTO @var 
    END
    CLOSE cursor2
    DEALLOCATE cursor2
    C'est juste de l'imbrication de boucles. Je te conseillerai de définir ton algorithme de traitement en pseudo-langage puis d'essayer de le traduire en SQL.

    Tu verras tu trouveras beaucoup de solutions à tes problèmes de mise à jour.

    @+

Discussions similaires

  1. [MySQL-5.6] Procedure SQL to update table
    Par fbmhm dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 30/05/2013, 16h16
  2. Gridview avec procedure stocké pour update
    Par Schnain dans le forum ASP.NET
    Réponses: 7
    Dernier message: 22/10/2010, 22h18
  3. problème avec curseur "for update"
    Par funkyjul dans le forum Développement
    Réponses: 3
    Dernier message: 21/01/2009, 11h55
  4. Procedure stockée + insert update
    Par chouchou83 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/06/2008, 13h51
  5. Procedure Curseur table en paramètre?
    Par ploubi dans le forum SQL
    Réponses: 2
    Dernier message: 18/06/2007, 09h30

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