Objectif
On souhaite afficher les activités de personnes sur 1 semainier et on dispose pour cela de 2 tables:
La table "T_Personne" avec le numéro de la personne et son nom :
Et la table "T_Planning" contenant 10 champs :
Pour atteindre notre objectif, on va réaliser une requête paramétrée avec en lignes les informations concernant les personnes, en colonnes les jours de la semaine, et à l'intersection les activités.
Cette requête sera alors facilement exploitable comme source d'un formulaire.
Marche à suivre
1) Création de la requête paramétrée
L'étape suivant consiste à créer une requête "R_Plan", basée sur la table "T_Planning", qui affiche les activités des jours de la semaine identifiée par les paramètres [Forms]![F_Planning]![Annee] et [Forms]![F_Planning]![NumSemaine], qui sont en fait des références aux contrôles situés sur le formulaire "F_Planning" :
PARAMETERS [Forms]![F_Planning]![Annee] Value, [Forms]![F_Planning]![NumSemaine] Value;
SELECT NumPersonne, Annee, NumSemaine, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche
FROM T_Planning
WHERE ((Annee=[Forms]![F_Planning]![Annee]) AND (NumSemaine=[Forms]![F_Planning]![NumSemaine]));
2) Afficher toutes les personnes
Cette étape consiste à afficher toutes les personnes en en-têtes de lignes, y compris celles qui n'ont pas eu d'activité au cours de la période. On crée donc une requête "R_Planning" basée sur la table "T_Personne" et sur la dernière requête "R_Plan" et qui réalise une jointure gauche entre la table "T_Personne" et la requête "R_Plan" sur le champ "NumPersonne" :
SELECT T_Personne.NumPersonne, T_Personne.NomPersonne, R_Plan.*
FROM T_Personne LEFT JOIN R_Plan ON T_Personne.NumPersonne = R_Plan.NumPersonne
ORDER BY T_Personne.NumPersonne;
3) Création du sous-formulaire "SF_Planning"
Ce formulaire en mode continu ou feuille de données possède comme source la requête "R_Planning".
Il affiche en ligne les personnes et en colonnes les jours de la semaine.
Il est intégré au formulaire principal.
Pour mettre à jour les champ [Annee] et [NumSemaine] on ajoutera, sur l'évènement Avant MAJ, le code suivant :
Private Sub Form_BeforeUpdate(Cancel As Integer)
[Annee] = Forms!F_Planning!Annee
[NumSemaine] = Forms!F_Planning!NumSemaine
End Sub
4) Création du formulaire principal "F_Planning"
Ce formulaire contiendra, en plus du sous-formulaire, les contrôles (zones de texte ou listes déroulantes) nommés "Annee" pour l'année, et "NumSemaine" pour le numéro de semaine.
On ajoutera une commande pour rafraichir le sous formulaire sur l'évènement Après MAJ des 2 contrôles :
Private Sub Annee_AfterUpdate()
Me!SF_Planning.requery
End Sub
Private Sub NumSemaine_AfterUpdate()
Me!SF_Planning.requery
End Sub
Conclusion
Vous pouvez facilement adapter cet exemple à votre cas en changeant au besoin les noms des champs et des contrôles.
Notez que les données peuvent être directement mise à jour sur le planning.
Vous devez être identifié pour poster un commentaire.
Objectif
On souhaite afficher les activités de personnes sur 1 planning et on dispose pour cela de 2 tables :
La table "T_Personne" avec le numéro de la personne et son nom :
Et la table "T_Planning" contenant 4 champs :
Pour atteindre notre objectif, on va réaliser une requête analyse croisée avec en en-têtes de lignes les informations concernant les personnes, en en-têtes de colonnes les indices des jours et à l'intersection les activités.
Cette requête sera alors facilement exploitable comme source d'un formulaire.
Marche à suivre
1) Définition des indices de colonnes
Tout d'abord, il nous faut définir le nombre de colonnes, le nombre de jours à afficher dans la requête analyse croisée, normalement 31.
Pour cela, on doit créer une table "T_Jour" contenant les indices des 31 jours (1,2,3...31).
2) Génération des 31 dates
Puis, il nous faut générer les dates correspondant aux 31 indices partant d'une date entrée en paramètre d'une requête.
On crée donc une requête paramétrée "R_Jour", basée sur la table précédente et qui affiche les 31 jours à partir du jour [Jour1] passé en paramètre.
PARAMETERS [Jour1] DateTime;
SELECT T_Jour.Jour, [Jour1]+[Jour]-1 AS DateJ
FROM T_Jour;
Notez que le paramètre [Jour1] peut aussi bien être un contrôle dans un formulaire.
3) Générer les jours intermédiaires entre les dates de début et de fin
L'étape suivant consiste à créer une requête "R_Plan", basée sur la requête "R_Jour" et la table "T_Planning", qui affiche tous les jours à planifier, y compris les jours intermédiaires entre les dates de début et de fin :
SELECT T_Planning.*, R_Jour.DateJ
FROM R_Jour, T_Planning
WHERE (R_Jour.DateJ BETWEEN [DateDebut] AND [DateFin]);
4) Afficher toutes les personnes
L'avant dernière étape consiste à afficher toutes les personnes, y compris celles qui n'ont pas eu d'activité au cours de la période. On crée donc une requête "R_Planning" basée sur la table "T_Personne" et sur la dernière requête "R_Plan" et qui réalise une jointure gauche entre la table "T_Personne" et la requête "R_Plan" sur le champ "NumPersonne" :
SELECT T_Personne.NumPersonne, T_Personne.NomPersonne, R_Plan.[DateJ] AS Jour, R_Plan.Activite AS Activite
FROM T_Personne LEFT JOIN R_Plan ON T_Personne.NumPersonne = R_Plan.NumPersonne
ORDER BY T_Personne.NumPersonne;
5) Créer la requête analyse croisée
Enfin, on va réaliser une requête croisée basée sur la table "T_Personne" et sur la dernière requête "R_Planning" et qui affiche, en lignes les informations des personnes, et en colonnes les indices des 31 jours partant du 1er jour passé en paramètre :
TRANSFORM First(Activite) AS Activite
SELECT NumPersonne, NomPersonne
FROM R_Planning
GROUP BY NumPersonne, NomPersonne
ORDER BY NumPersonne
PIVOT DateDiff("d",[Jour1],[Jour])+1 In (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);
La clause Pivot désigne les en-têtes de colonnes et l'opérateur In permet de fixer les colonnes : Ici, la requête comportera 31 colonnes (1,2..31).
L'expression DateDiff("d",[Jour1],[Jour])+1 renvoie l'indice du jour partant du 1er jour passé en paramètre.
Conclusion
Vous pouvez facilement adapter cet exemple à votre cas et utiliser le résultat dans un formulaire en mode continu.
Vous devez être identifié pour poster un commentaire.
Vous êtes encore confronté à du SharePoint 2007 existant qui doit évoluer ou simplement vous n'avez pas migré vers SharePoint 2010. Si c'est le cas, ce blog peut vous être utile. Attention, la démarche décrite ci-dessous n'est pas portable vers SharePoint 2010.
Il ne s’agit pas ici d’expliquer comment faire une colonne personnalisée mais uniquement de discuter des interactions entres champs dans les écrans de saisie SharePoint..
Le cas le plus typique et le plus souvent demandé est la cascading dropdown. Il existe sur internet une solution gratuite que nous avons-nous même utilisé jusqu’au jour où il m’a été demandé de lui ajouter des caractéristiques plus avancées (parents multiples, choix multiples)
J’avais alors le choix soit de partir de cette classe, soit de partir sur une nouvelle conception. Vous l’aurez compris, c’est cette deuxième solution que j’ai choisi. Pourquoi, d’une part il n’était pas aisé d’inclure les nouvelles caractéristiques dans le concept existant. D’autre part, je n’ai jamais aimé le principe d’avoir une colonne parent également personnalisée. Toutefois, pour partie, les deux solutions sont basées sur le même concept. L’idée de base est d’abonner le contrôle de la colonne personnnalisée à un événement du contrôle de rendu d’une autre colonne, personnalisée ou non. Pour mon cas concret, je suis parti sur l’élément « SelectedIndexChange » mais le principe fonctionne sur n’importe quel événement. Evidemment l’événement choisi va déterminer les types de contrôles qui pourront être connectés.
Vous devez être identifié pour poster un commentaire.
Voici un petit truc assez pratique. J'ai un fichier Excel avec des macros qui me génère une feuille à partir des données entrées. Je voulais créer un bouton qui m'emmène directement dans la vue impression en backstage.
J'ai trouvé différentes méthodes pour imprimer en vba mais malheureusement aucune pour aller directement dans cette vue. Cette vue est très pratique puisqu'on dispose d'un aperçu et d'une grande majorité d'options d'impression. La solution pour accéder directement à cette vue depuis un bouton est simple : il suffit de simuler un appui sur les touches Ctrl+F2.
Sur l'événement Click du bouton, mettez le code suivant :
SendKeys "^{F2}"
La touche Ctrl est représentée par "^" comme indiqué sur la page suivante : SendKeys Class.
Cela a été testé avec Excel 2010 SP1 (32 bits) sur Windows 7 (64 bits).
Vous devez être identifié pour poster un commentaire.
, Jérôme Lambert [Si vous faites partie des nombreuses personnes n'ayant pas eu l'occasion d'assister aux TechDays'12 ou que tout simplement vous n'aviez pas la faculté d'assister à plusieurs sessions en même temps, rassurez-vous car le contenu intégral des 3 jours de sessions, soit plus de 300 sessions techniques ainsi que les conférences plénières, vient d'être publié par Microsoft sur son site officiel.
Vous devez être identifié pour poster un commentaire.
, laurentvalente [
L'idée est la suivante :
- J'ai une liste de cours qui contient le nom du cours et le nombre de place disponible dans ce cours.
- J'ai une liste participant qui contient le nom du participant et le nom du cours auquel il veut participer (champ lookup qui pointe sur le nom du cours de la liste cours, on associera le nombre de places disponibles pour une meilleure lisibilité).
- Quand j'inscris un participant à un cours je veux que le nombre de place disponibles dans ce cours diminue de 1.
Vous devez être identifié pour poster un commentaire.
, bertrandv [J’ai donc voulu créer mon blog sur SharePoint Online étant donné que je me suis spécialisé cette année dans le développement SharePoint. Mais je me suis confronté à un léger souci, lorsque j’ai créé un site de type « Blog » sur SharePoint Online, il s’avère que les permissions héritent du site parent et que le site parent ne possède pas d’accès anonyme.
Il n’est pas non plus possible via l’interface d’activer l’accès anonyme, n’ayant pas accès à l’administration centrale !
Par exemple, pour un blog, si l’utilisateur clique sur un billet en page d’accueil pour y accéder, il est redirigé directement vers la page d’authentification. Idem pour les catégories et commentaires.
Du coup, et grâce à cet article de Martin Hatch, j’ai créé une webpart permettant de lister toutes les listes du site courant et de permettre d’activer l’accès anonyme en lecture seule ou en modification/écriture.
Ainsi, j’ai activé l’accès anonyme pour la liste des billets, des commentaires et des catégories. De plus, j’ai activé l’ajout d’item pour la liste des commentaires afin que tout utilisateur puisse ajouter un commentaire.
Voici, le code utilisé pour activer l’accès anonyme :
La permission SPBasePermissions.ViewFormPages n’est pas effective. Il suffit de l’ajouter sur le masque de permissions AnonymousPermMask64 de la liste.
SPList list = SPContext.Current.Web.Lists[listId];
if (list != null)
{
if (!list.HasUniqueRoleAssignments)
{
list.BreakRoleInheritance(true);
}
list.WriteSecurity = 2;
list.AnonymousPermMask64 |= (SPBasePermissions.Open | SPBasePermissions.OpenItems
| SPBasePermissions.ViewListItems | SPBasePermissions.AddListItems);
list.Update();
this.gridViewLists.DataBind();
}
Pour activer l’ajout d’items dans la liste des commentaires, il suffit d’ajouter la permission SPBasePermissions.AddListItems.
list.AnonymousPermMask64 |= (SPBasePermissions.AddListItems);
Vous pouvez trouver le code source de la webpart ici: http://bertrandvergnault.sharepoint.com/blog/PublicDocuments/ModifyListsPermissionsWebPart/Office365.ModifyListsPermissions.zip
Ou télécharger directement le fichier solution WSP pour l'ajouter directement dans votre environnement:
http://bertrandvergnault.sharepoint.com/blog/PublicDocuments/ModifyListsPermissionsWebPart/Office365.ModifyListsPermissions.wsp
Vous devez être identifié pour poster un commentaire.
, bertrandv [Voici une liste de liens utiles et tips pour les développeurs SharePoint.
Cet article a plutôt un but personnel puisqu'il me permet de garder sous le coude les infos que je ne retiens pas forcément
Niveaux de permissions dans SharePoint : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbasepermissions.aspx
Custom actions locations and IDs : http://msdn.microsoft.com/en-us/library/bb802730.aspx
ID des types de listes natives SharePoint : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splisttemplatetype.aspx
ID des Content types : http://msdn.microsoft.com/fr-fr/library/aa543822.aspx
Guid des features natives de SharePoint : http://blogs.msdn.com/b/mcsnoiwb/archive/2010/01/07/features-and-their-guid-s-in-sp2010.aspx
Liste des contentclass utilisable pour la recherche: http://www.rtsmedia.com/SharePoint/contentclass.aspx
Activer/Désactiver le developer dashboard :
stsadm -o setproperty -pn developer-dashboard -pv On|Off|OnDemand
Cet article sera amené à grossir... ![]()
Vous devez être identifié pour poster un commentaire.
, bertrandv [Lors de l’utilisation de la recherche et plus particulièrement d’une requête FullText, j’ai été confronté à une erreur pas vraiment explicite ![]()
Voici la requête que j’ai exécutée :
SearchServiceApplicationProxy proxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(site)); FullTextSqlQuery myQuery = new FullTextSqlQuery(proxy); myQuery.ResultsProvider = SearchProvider.Default; myQuery.ResultTypes = ResultType.RelevantResults; myQuery.QueryText = "SELECT Title FROM SCOPE() where \"scope\"='All Sites' AND MyManagedProperty LIKE ‘%test%’”;
Voici maintenant le libellé de l’erreur en question au moment du myQuery.Execute() :
HRESULT E_FAIL has been returned from a call to a COM component
Après des recherches sur Google je suis tombé sur ce post m’indiquant la marche à suivre.
http://msdn.microsoft.com/fr-fr/library/microsoft.sharepoint.search.query.query.hint(v=office.12).aspx
Il suffit de spécifier la propriété Hint avec la valeur QueryHint.OptimizeWithPropertyStore.
myQuery.Hint = QueryHint.OptimizeWithPropertyStore;
Sur la msdn, il n’y a aucune information permettant de savoir réellement quel est l’impact de cette propriété. Cependant, il n’y a plus d’erreur et les résultats que me retourne la recherche sont ceux attendus
Vous devez être identifié pour poster un commentaire.
, bertrandv [Un Control Adapter permet de modifier l’apparence de contrôles en récupérant le flux HTML généré par celui-ci.
Dans le cadre de SharePoint on peut du coup l’utiliser pour venir modifier l’apparence de certains contrôles natifs.
Pour cela, il faut créer une classe qui héritera de la classe ControlAdapter (dans l’espace de noms System.Web.UI.Adapters) et venir redéfinir la méthode Render :
public class InputFormDropDownListAdapter : ControlAdapter
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb));
base.Render(htw);
string stringToWrite = sb.ToString();
//Modifier la chaine "stringToWrite" à écrire dans le rendu du contrôle...
writer.Write(stringToWrite);
}
}
Il faut maintenant mettre en place la prise en compte de ce ControlAdapter par le navigateur.
Pour cela, il faut se placer dans le constructeur de la masterPage
qui sera utilisée par SharePoint :
public SiteMaster()
{
var adapters = HttpContext.Current.Request.Browser.Adapters;
var key = typeof(Microsoft.SharePoint.Portal.WebControls.InputFormDropDownList).AssemblyQualifiedName;
if (!adapters.Contains(key))
{
var adapter = typeof(InputFormDropDownListAdapter).AssemblyQualifiedName;
adapters.Add(key, adapter);
}
}
La clé de l’entrée du dictionnaire correspond au nom de l’assembly du type du contrôle dont
on viendra modifier l’apparence.
La valeur de l’entrée du dictionnaire correspond au nom de l’assembly du controlAdapter
que l’on a développé plus haut.
Il est ainsi possible de modifier l’apparence des contrôles natifs de SharePoint…
Vous devez être identifié pour poster un commentaire.
A première vue, une page contenant des webpart peut ne plus pouvoir être éditée si l’une des webparts contenue dedans plante.
Dans ces cas-là, un raccourci très simple permet d’éditer le contenu de la page via le menu d’administration de celle-ci. Pour cela, il suffit d’ajouter à l’URL le querystring suivant : ?contents=1
Exemple : http://mysharepointsite.com/mywebpartpage.aspx?contents=1
Voici l’affichage que vous obtiendrez :

A vous ensuite de faire les modifications qui s’imposent pour que la page soit à nouveau fonctionnelle…
Vous devez être identifié pour poster un commentaire.
, Pierre Fauconnier [Bonjour.
Je viens de mettre en ligne une nouvelle vidéo qui détaille les étapes à réaliser pour vérifier l'existence d'éléments dans une liste grâce à la mise en forme conditionnelle (durée: 14'23").
Au départ d'une plage de données, vous verrez comment créer un tableau 2010, puis vous aborderez la création de la formule conditionelle qui permettra la comparaison.
Vous devez être identifié pour poster un commentaire.
Copyright © 2000-2012 - www.developpez.com