none
Desarrollo web en sharepoint 2007 RRS feed

  • Pregunta

  •  

    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/library/ms465611.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:\n" + ex.Message + "\nDetail:\n" +
          ex.Detail.InnerText + "\nStackTrace:\n" + 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:\n" + ex.Message + "\nDetail:\n" +

    //ex.Detail.InnerText + "\nStackTrace:\n" + 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:\n" + ex.Message + "\nDetail:\n" +

    ex.InnerException + "\nStackTrace:\n" + ex.StackTrace;

    }

    }

    }

    }

     

     


    Y efectivamente mi programita funciona, pero funciona mal Sad,  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.

    jueves, 17 de abril de 2008 15:40