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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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