Hola muchachos,
Tengo el siguiente Problema, al crear un nuevo evento en la lista "Calendar"
de mi sitio Sharepoint, puedo asociarle a este evento un "Workspace", cuando
termino de hacer esta asociacion efectivamente el evento me aparece en el
"Workspace" deseado. Hasta el momento todo marcha bien. El problema Surge
cuando desde el calendario borro el evento, al eliminar este evento el
desaparece de mi lista "Calendar", pero al ir a ver en el "Workspace",
todavia aparece el link que me comunicaba con el contenido de mi evento, pero
ahora aparece un signo de admiracion rojo y este mensaje de error:
"This meeting date was canceled from your calendar and scheduling program.
To specify what you want to do with the associated information in the
workspace, do the following: In the Meeting Series pane, point to the meeting
date, and in the drop-down list, click Keep, Delete, or Move.".
Yo puedo eliminar este link desde el mismo Sharepoint, dando clic en el menu
que aparece al posicionar el mouse encima del link y escogiendo la opcion
"Delete". Lo que yo necesito hacer es que al borrar el evento desde la lista
"Calendar" cuando doy clic en la opcion "Delete Item" se borre al mismo
tiempo el evento del "Workspace".
Para esto decidi documentarme e indagar, en este proceso me encontre con el
siguiente codigo en MSDN:
http://msdn2.microsoft.com/en-us/li...65611.aspx
Code Snippet/*Create necessary objects and set credentials.*/
Web_Reference.Meetings meetObj =
new Web_Reference_Folder_Name.Meetings();
meetObj.Credentials = System.Net.CredentialCache.DefaultCredentials;
Web_Reference.Lists listObj =
new Web_Reference.Lists();
listObj.Credentials = System.Net.CredentialCache.DefaultCredentials;
/*Get Meeting Workspace URL.*/
Console.Write("Enter the URL of the Meeting Workspace: ");
string baseURL = Console.ReadLine();
/*Set URL properties for both objects.*/
listObj.Url = baseURL + "/_vti_bin/lists.asmx";
meetObj.Url = baseURL + "/_vti_bin/meetings.asmx";
/*Get meeting InstanceID.*/
Console.Write("Enter the InstanceID of the meeting: ");
string InstanceID = Console.ReadLine();
XmlDocument xmlDoc = new XmlDocument();
XmlNode ndQuery =
xmlDoc.CreateNode(XmlNodeType.Element,"Query", "");
XmlNode ndViewFields =
xmlDoc.CreateNode(XmlNodeType.Element,"ViewFields","");
XmlNode ndQueryOptions =
xmlDoc.CreateNode(XmlNodeType.Element,"QueryOptions","");
// Create query to filter based on the InstanceID provided.
ndQuery.InnerXml =
@"" +
InstanceID + "";
try
{
/*Call GetListItems Web service to get meeting UID.*/
XmlNode ndResult =
listObj.GetListItems("Meeting Series", "", ndQuery,
ndViewFields, "0", ndQueryOptions);
XmlNode MainNode = ndResult.ChildNodes.Item(1);
MainNode = MainNode.ChildNodes.Item(1);
XmlNode eventUID =
MainNode.Attributes.GetNamedItem("ows_EventUID");
string UID = eventUID.InnerText;
/*Call RemoveMeeting Web service to cancel meeting.
NOTE: You might need to increase the sequence number depending
on how many updates have already been made to the meeting.*/
meetObj.RemoveMeeting(0, UID, 0, DateTime.Now, true);
Console.WriteLine("Meeting canceled successfully.");
}
catch (System.Web.Services.Protocols.SoapException ex)
{
Console.WriteLine("Message:" + ex.Message + "Detail:" +
ex.Detail.InnerText + "StackTrace:" + ex.StackTrace);
}
La verdad la primera vez que vi el codigo lo vi como complicado, pero pues
MSDN lo recomienda, me puese en la tarea de hacer funcionar este codigo y fue
casi imposible, tuve que modificarlo para completarlo, y le agrege mas codigo
para que funcionara y el programa me quedo de la siguiente manera:
Code Snippet
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SharePoint;
using System.Xml;
namespace Console_12
{
class Program
{
static void Main(string[] args)
{
try
{
// Console.ReadLine();
SPSecurity.RunWithElevatedPrivileges(delegate()
{
//Guid gu = new Guid("{3AA5007E-71A0-441F-AD55-2526684E7607}");
using (SPSite siteLocal = new SPSite("
http://pb11dev01:12384"))
{
siteLocal.AllowUnsafeUpdates = true;
using (SPWeb webLocal = siteLocal.OpenWeb())
{
webLocal.AllowUnsafeUpdates = true;
// Get the custom list
Guid id = new Guid("8e51942a-da23-4bd1-bbf2-cda123274e39");
SPList list = webLocal.Lists[id];
SPListItemCollection item = list.Items;
string[] split = null;
string[] serv = null;
SPListItem nro1 = null;
foreach (SPListItem nro in item)
{
string a = nro["Workspace"].ToString();
split = a.Split(new Char[] {','});
nro1=nro;
}
localhost_01.Meetings meetObj = new localhost_01.Meetings();
meetObj.Credentials = System.Net.CredentialCache.DefaultCredentials;
localhost_02.Lists listObj = new localhost_02.Lists();
listObj.Credentials = System.Net.CredentialCache.DefaultCredentials;
serv = split[0].ToString().Split(new Char[] { '?' });
string baseURL = serv[0];
listObj.Url = baseURL + "/_vti_bin/lists.asmx";
meetObj.Url = baseURL + "/_vti_bin/meetings.asmx";
Uri dir = new Uri(split[0].ToString());
string[] spl= dir.Query.ToString().Split(new Char[] { '=' });
string InstanceID = nro1.ID.ToString();//spl[1].ToString();
XmlDocument xmlDoc = new XmlDocument();
XmlNode ndQuery
xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
XmlNode ndViewFields
xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
XmlNode ndQueryOptions
xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");
ndQuery.InnerXml = @"" +
InstanceID + "";
localhost.SiteData siteDataWS = new localhost.SiteData();
siteDataWS.UseDefaultCredentials = true;
localhost._sWebMetadata webMetaData;
localhost._sWebWithTime[] arrWebWithTime;
localhost._sListWithTime[] arrListWithTime;
localhost._sFPUrl[] arrUrls;
string roles;
string[] roleUsers;
string[] roleGroups;
Uri uc = new Uri(baseURL);
siteDataWS.Url = baseURL + "/_vti_bin/sitedata.asmx";
uint i = siteDataWS.GetWeb(out webMetaData, out arrWebWithTime, out
arrListWithTime, out arrUrls, out roles, out roleUsers, out roleGroups);
Guid g = new Guid(webMetaData.WebID);
string web = webMetaData.Title;
SPSite siteLocal1 = new SPSite(baseURL);
SPWeb webLocal1 = siteLocal1.OpenWeb();
SPWeb meet = siteLocal1.AllWebs["Meeting_Space"];
SPListItem spli = meet.Lists["Meeting Series"].Items[5];
spli.Delete();
try
{
XmlNode ndResult = listObj.GetListItems(webLocal1.Lists["Meeting
Series"].ID.ToString(), "", ndQuery, ndViewFields, "0", ndQueryOptions,
webLocal1.Lists["Meeting Series"].ID.ToString());
XmlNode MainNode = ndResult.ChildNodes.Item(1);
MainNode = MainNode.ChildNodes.Item(1);
XmlNode eventUID = MainNode.Attributes.GetNamedItem("ows_EventUID");
string UID = eventUID.InnerText;
meetObj.RemoveMeeting(0, UID, 0, DateTime.Now, true);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
// properties.Cancel = true;
//properties.ErrorMessage = properties.ListItem["Workspace"].ToString() + "
" + properties.WebUrl + " " + properties.ListId.ToString() + " " +
"Message:" + ex.Message + "Detail:" +
//ex.Detail.InnerText + "StackTrace:" + ex.StackTrace;
}
catch(Exception ex)
{
}
}
}
});
}
catch (Exception ex)
{
}
}
}
}
Y efectivamente tampoco funciono, nunca me acepto el Guid del "Worksapace",
totalmente desilucionado me dedique a llorar un rato y luego hice el
siguiente programa para que volviera la risa a mi rostro:
Code Snippetusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
namespace Meeting_EventHandler
{
public class MeetingEventHandler : SPItemEventReceiver
{
public override void ItemDeleting(SPItemEventProperties properties)
{
base.ItemDeleting(properties);
string url = properties.ListItem["Workspace"].ToString();
string[] split = url.Split(new Char[] { ',' });
string[] serv = null;
serv = split[0].ToString().Split(new Char[] { '?' });
string baseURL = serv[0].ToString();
Uri dir = new Uri(split[0].ToString());
string[] spl = dir.Query.ToString().Split(new Char[] { '=' });
int InstanceID = Convert.ToInt16(spl[1].ToString());
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite siteLocal = new SPSite(baseURL))
{
siteLocal.AllowUnsafeUpdates = true;
using (SPWeb webLocal = siteLocal.OpenWeb())
{
webLocal.AllowUnsafeUpdates = true;
SPWeb meet = siteLocal.AllWebs[split[1].ToString()];
if (meet.Lists["Meeting Series"].Items.Count != 0)
{
SPListItem spli = meet.Lists["Meeting Series"].GetItemById(InstanceID);
spli.Delete();
}
}
}
}
);
}
catch (Exception ex)
{
properties.Cancel = true;
properties.ErrorMessage = "Message:" + ex.Message + "Detail:" +
ex.InnerException + "StackTrace:" + ex.StackTrace;
}
}
}
}
Y efectivamente mi programita funciona, pero funciona mal :(, mi programa
es un eventhandler que utiliza el evento de borrado de la lista "Calendar" y
se extiende para borrar el link del "Workspace". Al probar mi programa en mi
sitio Sharepoint y luego de dar clic en el boton de la lista "Calendar",
"Delete Item" me genera el siguiente error:
Code Snippet
Changes to the event were saved, but they could not be communicated to the
Meeting Workspace associated with the event. For more information, contact
the server administrator.
Lo bueno de todo esto es que a pesar del error que me genera voy y reviso la
lista "Calendar", y efectivamente el evento ya no existe, viendo esto me
dirijo emocionado al "Workspace" y me doy cuenta que efectivamente tambien el
link de este evento ha sido borrado. Maravilla, sharepoint funciona, pero por
que ese mensaje de error.
Queridos compañeros Acudo a ustedes que son fuente de conocimiento para
lograr obtener alguna ayuda de su gran experiencia.
Muchisimas gracias, por su ayuda.
PDT.
Una preguntica adicional, en el ultimo programa que posteo para conseguir
los miembros de una lista utilizo la siguiente instruccion:
Code Snippetproperties.ListItem["Workspace"].ToString();
el nombre dela propiedad queda como una cadena, existe alguna manera de no
dejarlo como cadena, alguna constante o algo parecido, por que mi sitio
funciona en varios idiomas, y dependiendo del usuario el idioma varia, y esta
instruciion solo me serviria para los usuarios Norteamericanos, pero los
Suecos y Alemanes me demandan que les funcione igual.
Gracias de nuevo
Jorge.
Leer las respuestas