quarta-feira, 25 de março de 2009

Fazer Download de documentos do Sharepoint 2003 usando WS nativos e sem usar OM

Olá Amigos,

Abaixo um pequeno código, que demotra como podemos baixar documentos de uma document library do SharePoint 2003.



public void DownloadFilesFromDocumentLibrary(string url, string documentLibraryName){
Lists.Lists proxy = new Lists.Lists();//set url and credentials on proxy
proxy.Url = url + "_vti_bin/lists.asmx";
proxy.Credentials = CredentialCache.DefaultCredentials;//call get list items to retrieve document library
XmlNode elm = proxy.GetListItems(documentLibraryName, null, null, null, null, null);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(elm.OwnerDocument.NameTable);
nsMgr.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
nsMgr.AddNamespace("z", "#RowsetSchema");
if (elm != null){
XmlNode dataNode = elm.SelectSingleNode("rs:data", nsMgr);
int itemCount = Convert.ToInt32(dataNode.Attributes.GetNamedItem("ItemCount").Value);
if (itemCount == 0){
Console.WriteLine("Nothing to download");
}else{
foreach (XmlNode row in dataNode.SelectNodes("z:row", nsMgr))
{
//Response.Write(row.Attributes.GetNamedItem("ows_LinkFilename").Value+"
");
DownLoadFile(url, documentLibraryName, row.Attributes.GetNamedItem("ows_LinkFilename").Value);
}
}
}
}



public void DownLoadFile(string url, string documentLibraryName, string fileName){
//string downloadPage = url + "/download.aspx";
HttpWebRequest request = null;
HttpWebResponse response = null;
Stream responseStream = null;
FileStream fs = null;
try{
//request = (HttpWebRequest) HttpWebRequest.Create(downloadPage + "?SourceUrl=" + documentLibraryName + "/" + fileName);
request = (HttpWebRequest)HttpWebRequest.Create(SharePointHost + documentLibraryName + "/" + fileName);
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 6000;
response = (HttpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();//write to filesystem
fs = new FileStream(fileName, FileMode.Create);
byte[] buffer = new byte[1024];
int count = responseStream.Read(buffer, 0, buffer.Length);
while (count > 0)
{
fs.Write(buffer, 0, buffer.Length);
count = responseStream.Read(buffer, 0, buffer.Length);
}
}
finally{
if(fs != null)
fs.Close();
if(responseStream != null)
responseStream.Close();
if(response!=null)
response.Close();
}
}

sexta-feira, 12 de dezembro de 2008

FormatDateTime - Mostrar hora no formato 24 horas

Olá Amigos,

Dica idiota, mas me custou alguns minutos da minha vida =]

Eu estava usando o código, para formatar a hora no formato 12 horas

<xsl:value-of select="ddwrt:FormatDateTime(string(@EventDate) ,1046,'hh:mm')" />

Precisava mostrar no formato 24 horas, para isso, foi só trocar a mascara de 'hh:mm' p/ 'HH:mm'

<xsl:value-of select="ddwrt:FormatDateTime(string(@EventDate) ,1046,'HH:mm')" />

Abraços,
Leonardo

sexta-feira, 22 de agosto de 2008

Lendo dados de uma View (SPView) (Exibição)

Olá PessoALL,

Faz tempão que não posto e ainda por cima vou aparecer hoje por aqui para dar uma dicazinha bem simples =]

Criar views (exibições) em listas do SharePoint é uma tarefa muito simples e bem poderosa. Conseguimos fazer diversas funcionalidades (agrupamento, ordenação, limitar itens) usando apenas o mouse.

Então por que ao criarmos uma WebPart precisamos fazer tudo de novo? Na verdade não precisamos ^^
Podemos ler itens diretamente de uma View (Exibição)

Bem, chega de chalálá e vamos ao código:

SPListItemCollection coll = spWeb.Lists["ListName"].GetItems(spWebInstance.Lists["ListName"].Views["ViewName"]);

Toda malandragem envolvida neste código, está em passar a view por parâmetro para o método GetItems, se não pudéssemos fazer isso, seria necessário escrever um baita CAML para alcançar as funcionalidades (agrupamento, ordenação, limitar itens) desejadas

Maca espera ter sido útil =]

Abraços,
Leonardo Macanudo

terça-feira, 27 de maio de 2008

Collection was modified; enumeration operation may not execute

Olá Amigos,

Tenho duas listas relacionadas (tópicos,respostas), preciso remover todas as respostas relacionadas a um determinado tópico.

O primeiro código que vem a cabeça é fazer um for each e deletar item por item.

Como no exemplo abaixo:

SPQuery q = new SPQuery();
q.Query = "<Where><Eq><FieldRef Name='Topico' /><Value Type='Lookup'>" + sTopico + "</Value></Eq></Where>";

SPList listRespostas = SPContext.Current.Web.Lists["Respostas"];
SPListItemCollection itensTopicos = listRespostas.GetItems(q);

foreach (SPListItem itemResposta in itensTopicosFake)
{
itemResposta.Delete();
}

Porém quando executamos este código, nos deparamos com o seguinte erro.

Collection was modified; enumeration operation may not execute

Este erro acontece porque a collection que eu estou usando no for each, está sendo modificada dentro dele mesmo.

Para resolver este problema substitui o for each pelo while abaixo.

while (itensTopicos.Count > 0)
itensTopicos[0].Delete();

Abraços,
Leonardo

sexta-feira, 23 de maio de 2008

SharePoint Data View Permissão de Usuários

Olá Amigos,

Para verificar o nível de permissão de um usuário quando estamos dentro de um XSL, devemos utilizar a função "ddwrt:IfHasRights(codigoDaPermissao)".

Exemplo (Exclusão de itens):

<xsl:if test="ddwrt:IfHasRights(8)">
...
</xsl:if>

Abaixo as permissões e seus respectivos "códigos"

ViewListItems - 1
AddListItems - 2
EditListItems - 4
DeleteListItems - 8
ApproveItems - 16
OpenItems - 32
ViewVersions - 64
DeleteVersions - 128
CancelCheckout - 256
PersonalViews - 512
ManageLists - 2048
ViewFormPages - 4096
Open - 65536
ViewPages - 131072
AddAndCustomizePages - 262144
ApplyThemeAndBorder - 524288
ApplyStyleSheets - 1048576
ViewUsageData - 2097152
CreateSSCSite - 4194314
ManageSubwebs - 8388608
CreateGroups - 16777216
ManagePermissions - 33554432
BrowseDirectories - 67108864
BrowseUserInfo - 134217728
AddDelPrivateWebParts - 268435456
UpdatePersonalWebParts - 536870912
ManageWeb - 1073741824
UseRemoteAPIs - 137438953472
ManageAlerts - 274877906944
CreateAlerts - 549755813888
EditMyUserInfo - 1099511627776
EnumeratePermissions - 4611686018427387904
FullMask - 9223372036854775807

É um script curto, porém esta função ainda vai salvar sua vida.

Abraços,
Leonardo

segunda-feira, 19 de maio de 2008

XSL formatar data no formato DD/MM

Olá Amigos,

Corrigindo este POST =]

Abaixo vocês vão ver toda uma choradeira de minha parte e uma baita gambiarra.
Porém existe um forma elegante sim de resolver este problema.

É essa:

<xsl:value-of select="ddwrt:FormatDateTime(string(@Data),1046,'dd/MM')"/>

Abaixo uma pequena gambiarra criada por mim para exibir a data no formato DD/MM, tive que fazer isto, pois a função nativa do SharePoint (ddwrt:FormatDate) não oferece este formato.

Abraços,
Leonardo

<xsl:choose>
<xsl:when test="number(substring-before(@_DCDateCreated,'/')) <= 9">0<xsl:value-of select="substring-before(@_DCDateCreated,'/')"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring-before(@_DCDateCreated,'/')"/></xsl:otherwise>
</xsl:choose>
/
<xsl:choose>
<xsl:when test="number(substring-before(substring-after(@_DCDateCreated,'/'),'/')) <= 9">0<xsl:value-of select="substring-before(substring-after(@_DCDateCreated,'/'),'/')"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring-before(substring-after(@_DCDateCreated,'/'),'/')"/></xsl:otherwise>
</xsl:choose>

quinta-feira, 15 de maio de 2008

Evitar os cabelos brancos gerados CAML

Olá Amigos,


No link abaixo vocês vão encontrar um aplicativo que torna visual a criação das querys caml.

http://www.u2u.info/SharePoint/U2U%20Community%20Tools/Forms/AllItems.aspx


Abraços,
Maca