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

SharePoint .NET Discussion :

SharePoint Designer - Workflow : comment créer un élément dans une liste d'une autre collection de site


Sujet :

SharePoint .NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut SharePoint Designer - Workflow : comment créer un élément dans une liste d'une autre collection de site
    Bonjour,

    Tout est dans le titre mais voici plus de détails:
    J'ai un site d'une collection de site : site1
    J'ai un autre site d'une autre collection de site : site2
    Dans site1, j'ai une liste dans laquelle les utilisateurs peuvent venir créer des éléments: liste1 (colonnes: Titre, Description)
    Dans site2, j'ai une autre liste à laquelle seuls les admins ont accès: liste2 (colonnes: Titre, Demandeur, Date de la demande, Titre de la demande, Description de la demande)

    Je veux que, lorsqu'un utilisateur créé un élément dans liste1, cela aille créer un élément dans liste2 avec le mapping suivant:
    Colonne Valeur
    Titre "Nouvelle demande"
    Demandeur Créé par, de l'élément de liste1
    Date de la demande Créé, de l'élément de liste1
    Titre de la demande Titre, de l'élément de liste1
    Description de la demande Description, de l'élément de liste1


    Pour mettre en place cela, j'ai compris qu'il fallait utiliser les web services HTTP et la méthode POST, comme expliqué dans cet article: http://mysharepointinsight.blogspot....ices-from.html
    Je me suis également documenté sur cette page officielle: https://msdn.microsoft.com/fr-fr/lib.../dn567558.aspx (et la version anglaise est là: https://msdn.microsoft.com/en-us/lib.../dn567558.aspx )

    Cependant, je ne comprends toujours pas ce qui est attendu dans le champ URL exactement pour ce que je veux faire, et je ne comprends toujours pas non plus le rôle des dictionnaires et ce qu'il faut mettre dedans.

    Du coup, forcément, je suis bloquée.

    J'imagine que c'est quelque chose de très connu dans le monde SharePoint (parce que ça me semble assez basique comme besoin), mais impossible de trouver un endroit où tout est vraiment bien expliqué point par point, genre collection "Pour les nuls".

    Un coup de main serait plus qu'apprécié! Merci à tous par avance!

  2. #2
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Ton besoin n'est pas basique, car tu veux effectuer des actions entre différentes collections de site, ce qui n'est pas une action courante dans SharePoint.
    Pourquoi dupliquer l'information dans une seconde collection de site ? Est-ce que les "admins" ne peuvent pas récupérer l'information directement sur le site en question ?

    Dans ton cas, l'utilisation des WebServices n'est pas forcément la meilleur solution, si le but est simplement d'afficher des informations déjà présente sur un autre site, la recherche semble plus évidente.
    L'utilisation des WebServices via SharePoint Designer (workflow) est une solution d'ouverture pour faciliter le travail des développeurs, ce qui explique ta difficulté à comprendre ce qu'il faut passer comme information. Si je peux résumer, l'url est le point d'accès à ta fonction (récupération/création/mise à jour/suppression...) et le dictionnaire représente les informations nécessaires à cette fonction pour faire son travail.

    Je t'invite donc fortement à regarder si tu ne peux pas utiliser la recherche plutôt que de dupliquer l'information. La duplication est très rarement la bonne solution...
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    Merci de ce retour!

    Malheureusement, la "duplication" est obligée pour moi car la réalité est bien plus complexe que l'exemple que je donne dans ce post.
    J'ai pris un exemple simplifié à l’extrême pour que l'on comprenne bien ce que je souhaite faire, mais le vrai cas sur lequel je bosse nécessite vraiment de dupliquer des informations.
    Par exemple: Dans mon vrai cas, les "admins" ne doivent pas pouvoir voir toutes les colonnes de la "demande", et de plus la création d'un nouvel item dans leur liste2 permet de déclencher des workflows dont ils ont besoin.
    Donc, dans tous les cas, il faut bien que je créé un élément dans une liste d'une autre collection de site.

    Ok, j'ai compris que l'URL mène à la fonction qu'on souhaite utiliser.

    Mais ce sont plutôt les détails techniques qui me manquent:

    Comment je sais comment s’appelle la fonction dont j'ai besoin?
    Comment s'écrit l'URL qui mène à cette fonction?
    De quels paramètres elle a besoin?
    Et comment j'intègre ces paramètres dans mon dictionnaire, avec quelle syntaxe?

    Si quelqu'un peut me trouver ces détails là, je suis sauvée!

  4. #4
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Je t'invite à regarder cet article qui expliquer les différentes méthodes disponibles par l'API REST : https://msdn.microsoft.com/en-us/lib...3.aspx#bk_List
    Pour ton besoin, il faudra supprimer SP.AppContextSite(@target) des urls.
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    Aaah, en effet, ça m'a permis de trouver des choses très intéressantes!

    NB: le lien que tu m'as donné indique plutôt comment créer une liste, mais j'ai pu trouver dans la même page un lien pour créer un élément dans une liste : https://msdn.microsoft.com/en-us/lib...equestExamples

    Du coup, voici ce que je comprends :

    Action dans mon Workflow dans SharePoint Designer:
    Call this HTTP web service with request (ResponseContente to response | ResponseHeaders to responseHeaders | ResponseStatusCode to Variable: responseCode )

    Dans this :
    URL <URL de l'app web>/_api/SP.AppContextSite(@target)/web/lists(guid'a290086b-2d43-4151-add4-893474a930a9')/items?@target='<URL du site SharePoint qui contient la liste2>'
    >> De ce que je crois avoir compris, si on a pas le GUID de la liste, on peut remplacer toute la partie en orange par :
    /lists/getbytitle('<nom de la liste>')
    >> Tu confirmes, ludojojo?
    >> J'ai également pas mal de doutes sur la valeur de @target...
    HTTP Method HTTP POST

    Dans request:
    var_dictionnaire_parametres : Nouveau dictionnaire à créer avant, cf. ci-dessous.

    Dans response:
    var_dictionnaire_reponse : Nouvelle variable dictionnaire vierge à créer, pour que le workflow écrive le résultat de l'action.

    Dans responseHeaders:
    var_dictionnaire_headers : Nouveau dictionnaire à créer avant, cf. ci-dessous.

    Dans Variable: responseCode:
    C'est une nouvelle variable pour le code réponse (format String), donc je laisse tel quel.

    Dans var_dictionnaire_parametres:
    __metadata Dictionnary var_dictionnaire_metadata
    Title String Nouvel item
    Colonne1 <Format colonne1> <Valeur colonne1>

    Dans var_dictionnaire_headers:
    Accept String application/json; odata=verbose
    Content-Type String application/json; odata=verbose

    Dans var_dictionnaire_metadata:
    type String <ListItemEntityTypeFullName de la liste2>
    >> Du coup, question subsidiaire: où trouve t-on le "ListItemEntityTypeFullName" de la liste?

    Surtout, n'hésitez pas à me corriger si je me trompe car je vois cela comme un "post tutoriel" pour ceux qui voudront/devront tenter les web services sur SPD.
    Histoire que d'autres "débutants" en SharePoint Designer puissent profiter de ma petite expérience.

  6. #6
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Kael_004 Voir le message
    >> De ce que je crois avoir compris, si on a pas le GUID de la liste, on peut remplacer toute la partie en orange par :
    /lists/getbytitle('<nom de la liste>')
    >> Tu confirmes, ludojojo?
    >> J'ai également pas mal de doutes sur la valeur de @target...
    Oui je confirme c'est exactement ça !
    Par contre il faut que tu supprimes de ton URL SP.AppContextSite(@target) car c'est spécifique au contexte du développement d'Apps (Add-in).

    Citation Envoyé par Kael_004 Voir le message
    >> Du coup, question subsidiaire: où trouve t-on le "ListItemEntityTypeFullName" de la liste?
    Il dépend de ta liste... Exemple, si ma liste s'appel "Test", la valeur sera SP.Data.TestListItem
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    Mmmmmmmmokay!

    Donc du coup, si j'ai bien tout suivi:
    _ URL = <URL de l'app web>/_api/web//lists/getbytitle('<nom de la liste>')/items
    _ ListItemEntityTypeFullName = SP.Data.<nom de la liste>ListItem

    J'ai tout bon ?

    En attendant la réponse, je vais aller faire quelques tests, comme ça, pour voir... ^^

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    J'étais en train de préparer mon petit test, mais là je me rends compte d'un souci de taille dans l'URL :

    URL que j'ai suggéré:
    <URL de l'app web>/_api/web//lists/getbytitle('<nom de la liste>')/items

    Problème:
    Notre app web contient sans doute plusieurs collections de site, qui contiennent sans doute elles même plusieurs sites.
    Et parmi tout ça, y'a une possibilité (forte) que plusieurs listes aient le même nom!
    Du coup, avec juste l'URL de l'app web au début, et la fonction getbytitle(), je vois mal comment indiquer exactement de quelle liste on parle.

    Y a t-il quelque chose que j'aurais mal compris?

    Merci d'avance!

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    Bon, petit résultat de mes tests:
    Que ce soit en mettant l'URL de l'app web ou l'URL du site contenant ma liste2, l'appel du web service me renvoie le "ResponseCode" suivant: Unauthorized.

    Je ne comprends pas trop d'où ça pourrait venir, une idée?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    Oulah, je crois que je viens de voir une erreur dans ce que j'ai écris:
    Le dictionnaire var_dictionnaire_headers n'est pas à mettre dans "responseHeaders", mais à mettre dans clic droit sur l'action Call HTTP service -> properties -> RequestHeaders.
    Je viens de voir ça en relisant avec attention l'article déjà mentionné de My SharePoint Insight : http://mysharepointinsight.blogspot....ices-from.html
    Du coup, pour ResponseHeaders, c'est un peu comme pour toutes les autres variables "response" (oui, j'aurais pu m'en douter plus tôt ): Il faut juste mettre une nouvelle variable dictionnaire vierge.

    Malheureusement, mon WF ne marche toujours pas.
    Je n'ai plus le ResponseCode "Unauthorized" mais il bloque sur l'appel du web service, et le WF finit par s'annuler tout seul, sans avoir réussi à aller plus loin.

    Au cas où, voici le message d'erreur lié à l'annulation de mon WF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RequestorId : bf267318-1d61-7c66-d09c-f281d7431ec0. Détails : System.ApplicationException: HTTP 500 {"Transfer-Encoding":["chunked"],"X-SharePointHealthScore":["0"],"SPClientServiceRequestDuration":["35"],"SPRequestGuid":["2fed28fd-5002-45cb-a68d-c80d74f261d9"],"request-id":["2fed28fd-5002-45cb-a68d-c80d74f261d9"],"X-FRAME-OPTIONS":["SAMEORIGIN"],"MicrosoftSharePointTeamServices":["15.0.0.4763"],"X-Content-Type-Options":["nosniff"],"X-MS-InvokeApp":["1; RequireReadOnly"],"Cache-Control":["max-age=0, private"],"Date":["Tue, 06 Dec 2016 15:21:13 GMT"],"Server":["Microsoft-IIS\/8.5"],"X-AspNet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"]} à Microsoft.Activities.Hosting.Runtime.Subroutine.SubroutineChild.Execute(CodeActivityContext context) à System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) à System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)
    L'erreur HTTP 500 étant "erreur interne du serveur", ça m'inquiète un peu...

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    Petit up!

    Personne n'a donc jamais fait de workflow qui, suite à la création ou modification d'un item d'une liste va aller créer un item dans une autre liste d'un autre site??

    Ou même: quelqu'un aurait une petite idée à proposer?

    Help! C'est trop horrible d'échouer alors que je sens que je suis si près du but!!

  12. #12
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par Kael_004 Voir le message
    Petit up!

    Personne n'a donc jamais fait de workflow qui, suite à la création ou modification d'un item d'une liste va aller créer un item dans une autre liste d'un autre site??

    Ou même: quelqu'un aurait une petite idée à proposer?

    Help! C'est trop horrible d'échouer alors que je sens que je suis si près du but!!

    Bonjour,

    le problème que vous risquez de rencontrer c'est que les Wkfs sont exécutés avec les privilèges de l'utilisateur courant, il faut être sur que l'utilisateur qui le lance a des droits d'écriture sur l'autre site.

    Personnellement j'aurai opté pour un Event receiver (mais ça sous entend du développement C#)
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    Désolée du délai de réponse, me revoilà quand même!

    Ok, les WF sont exécutés avec les droits de l'utilisateur qui a initié le WF.
    Mais il n'y a pas une option permettant de donner un compte avec lequel le WF doit s’exécuter, quel que soit l'initiateur? (Il me semble avoir vu ça une fois...)

    Event receiver, j'aurais bien voulu, mais comme je n'ai que de très lointains souvenirs du dev sur C#, ça va me prendre un temps colossal! (Et en plus, on a pas Visual Studio ici, et on ne l'aura pas avant l'année 2186 à mon avis.)
    Donc sauf si tu as un code tout prêt à me fournir et que tu te sens de m'expliquer comment l'adapter et le mettre en place... (ce que j'apprécierai beaucoup, c'est sûr, mais bon... )

    Sinon, je devrais sans doute continuer avec mes Web Services, et je suis toujours donc preneuse de quelqu'un qui saurait m'expliquer où je me trompe, cf. mes messages précédent. ^^

    Thx in advance!

  14. #14
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Avec mon équipe on a cherché l'année dernièer la manière "d'impersonnifier" un worflow pour lui donner des droits plus étendus mais sans succès.

    Pour l'event receiver dans Visual Studio je pense que c'est mission impossible hélas.

    Bon courage pour la suite.
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 70
    Points
    70
    Par défaut
    M'abandonnez pas tout de suite, on peut s'arranger!

    Si jamais je mets mes 2 sites dans la même collection de site, et que je m'arrange pour que les utilisateurs aient les droits suffisants sur la liste source comme sur la liste cible, ça pourrait être plus "faisable", non?

    Je veux bien connaître la technique à base de Event Receiver, faudrait juste me donner un exemple du code que ça demanderait, et m’expliquer comment le mettre en place. Je devrais m'en sortir.
    Je vais essayer de trouver une version d'essai de VS...

    Aux grands maux...

  16. #16
    Membre chevronné

    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2004
    Messages : 758
    Points : 2 084
    Points
    2 084
    Par défaut
    Pourtant l’élévation de privilège existe en SPD WF : http://www.learningsharepoint.com/20...2010-workflow/

Discussions similaires

  1. ignorer des éléments dans le parcours d'une liste
    Par yugure dans le forum Général Python
    Réponses: 15
    Dernier message: 30/10/2016, 22h52
  2. Réponses: 0
    Dernier message: 18/10/2014, 17h51
  3. Réponses: 4
    Dernier message: 04/04/2011, 11h46
  4. Réponses: 4
    Dernier message: 25/03/2009, 17h19
  5. champ d'une liste lié à une liste dans un autre site
    Par guintolli dans le forum SharePoint
    Réponses: 8
    Dernier message: 08/07/2008, 14h51

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