arquivos mensuais: Novembro 2007

Moss dime a miña columna Nome está reservado ou en uso … Pero non é

Actualización 12/04/07: Ver este Microsoft KB (http://support.microsoft.com/kb/923589) Para obter información sobre.

En realidade, verifícase que é, pero intelixente Moss tivo que fan difícil.

My customer does some development work on his MOSS site over the weekend. It’s a bit of a jumble as to what he actually did, pero o resultado final é este:

  • He tries to add a site column called "Quantity" e as respostas Moss: "The column name that you entered is already in use or reserved. Choose another name."
  • He attempts to add it to another environment and that works. Polo tanto, "Quantity" non é un nome reservado.
  • He tries to find an existing site column named "Quantity" in that site collection. He cannot find it.

Eu fixen algunhas investigación, and even some coding, encerado filosófica e, finalmente, descubriron que unha columna chamada Cantidade fixo, de feito, exist. It was in the "_Hidden" group. Hence, que non podería atopalo a través da interface de usuario do SharePoint.

Como foi parar alí? I do not know, pero eu teño unha teoría (ou como a miña muller ía chamalo, "blah blah blah"). Nalgún lugar ao longo da liña, un fabuloso modelo de corenta was added and probably activated at a site in the site collection. It was then deactivated (ou o lugar eliminado). The site column, con todo, remained but in the "_Hidden" group. If someone knows better, por favor me aviso vía e-mail ou engadir nos comentarios.

SharePoint was telling the truth. It’s hardly worth pointing out that that message is not as helpful as it could be. It would be nice to see that message fork into two different messages in the future: 1) Dicir que o nome da columna é reservada ou non é. 2) Se non está reservado, amosar o sitio web, ou, polo menos, o grupo, en que o nome da columna xa se utiliza.

</final>

Present OM Data Vía a Custom List (ou, Yet Another OM Datos Displayor [como Yacc, pero distinto])

Hoxe, I spent a handful of hours tracking down the root cause behind the message "The column name that you entered is already in use or reserved. Choose another name."

A columna en cuestión podería crear, apagados e recriados noutro ambiente, so I knew it wasn’t a reserved name. Con todo, Eu simplemente non podía atopar a columna en calquera lugar a través da interface de usuario por defecto do SharePoint en calquera sitio na colección web.

Eu postei a Foros de MSDN aquí eo indomável Andrew Woodward me apuntou na dirección dos datos do modelo subxacente obxecto.

Fun codeplex para atopar algunhas ferramentas que me axudarían a perscrutar os datos subxacentes OM e me axudar a atopar o problema.

Tente varias ferramentas e eles estaban moi legal e interesante, pero ao final, the UI wasn’t good enough for my purpose. I’m not criticizing them by any means, pero está claro que as ferramentas decisores non teñen o meu problema en mente cando creou a súa interface de usuario :). Most people seem to be investing a fair amount of time and effort in creating workstation / aplicacións cliente que ofrecen vistas de árbores, right-click context menus and so forth. These are nice and all, pero é unha chea de traballo para crear un principio de liña a experiencia do usuario que tamén é moi flexible.

Realmente precisaba unha resposta a este problema. Houbo-me que se eu puidese obter toda a columnas de sitio na colección sitio a unha lista personalizada, Eu podería filtrar, clasificar e crear exhibicións que ía me axudar a atopar esta columna supostamente existente (o que fixo, BTW). I went ahead and did that and an hour or two later, tiña todas as columnas do meu sitio cargado nunha lista personalizada con agrupación, sorting and so forth. I found my answer five minutes later.

E cando eu conseguir conquistar o mundo, I think I will decree that all SharePoint tools providers must seriously consider surfacing their object model data in a custom list. That way, Eu teño o poder para buscar todas as maneiras que quero (constrangido, claro, pola norma SharePoint características).

SharePoint Deseño de Fluxo de acción personalizada — Observación sobre <Campo Tipo de Deseño Tie =”StringBuilder” … />

Basta unha observación rápida, que hai unha diferenza moi importante entre estas dúas definicións:

<FieldBind Field="InParam1" DesignerType="StringBuilder" Id="2" Text="Input parameter #1"/>

contra:

<FieldBind Field="InParam1" Id="2" Text="Input parameter #1"/>

O primeiro mostra como este en SPD:

imaxe

mentres que o último amosa como este:

imaxe

I’m not sure how helpful these screen shots are but I put in the effort to make them so you have to view them 🙂

A observación é este: StringBuilder permite que constrúe unha secuencia de (obviamente) pola mestura de cadeas e datos de fluxo de traballo (via the "Add Lookup" botón na parte inferior esquerda). When you use the Add Lookup button, it inserts a token in the form "[%% Símbolo]". When SharePoint invokes your custom action, (Código C # no meu caso), SharePoint pasa o token-se, not the value of the token. If you use the default designer type (O segundo tipo), SharePoint amplía o sinal e pasa o valor real do token para a súa acción.

StringBuilder = BAD, tipo de deseño default = BO.

Por suposto, that’s not what I really mean. Just don’t try and pass a parameter to your custom action when the designer type = StringBuilder. Use the default designer type and chain a StringBuilder to it up front if you need to build complex strings in your workflow (que, de feito, é o que se fai para crear un tema dinámico para a acción de correo-e, pero iso é asunto para outro blog, foi).

</ Comezo>

Prematura activación de fluxo de traballo — Unha solución non médica

Actualización: Vexa este fío MSDN, especialmente a entrada do último: http://forums.microsoft.com/MSDN/showpost.aspx?postid=2631057&siteid=1. It describes a condition that may short circuit this whole thing. En resumo, pode ser tan sinxelo como facer polo menos un dos campos obrigatorios.

Eu teño unha biblioteca de documentos que soporta oito tipos de contido.

I have a SharePoint Designer workflow that wants to calculate and assign a "reminder date" simplemente subtraindo 30 día a partir de outra columna, "due date". This should only happen for one of the content types, "Insurance". The business objective is to produce a KPI that shows two categories of insurance documents: "about to expire" and "expired." (Podes ler máis sobre este tipo de KPI e máis substancial Drill-down aquí).

I have configured the workflow to fire when a new item is created and when an item is modified. The idea is that when an insurance document is uploaded, we calculate a "warning date" based on the expiration date. A pair of views work in connection with a KPI List to highlight these conditions when users hit their home page.

Esta estratexia non funciona cando cargar un documento.

I upload the document and I am presented with the meta data entry screen. Neste punto, I’m already in trouble. SharePoint has already, prematuramente da miña perspectiva, fired the workflow. I haven’t had a chance to pick the correct content type nor assign a due date. Á vez, the workflow does not fire when I hit the submit button at this time. There’s some built-in logic that "believes" that first submit is part of the "create" event. Así … meu traballo foi accionado e cando se executa, it was passed default meta data values.

The best work-around I know of is to insert a "pause until" activity in the workflow. I have the workflow pause for 1 minute. While it’s pausing, Seleccionar o tipo de contido correcto, enter the meta data and submit. The pause completes and the workflow proceeds as needed. (Teña en conta que no meu ambiente, timer workflow activities from SPD do not work out of the box. You may have the same trouble. Ver aquí para máis detalles).

I don’t like "magic delay" work-around. What happens if the user uploads a document and the phone rings and the ensuing conversation outlasts the pause? I can make the pause longer, pero eu non me gusta.

Eu escribín sobre iso no foro MSDN aquí: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2430725&SiteID=1

SharePoint Seguridade Primer Fundamentos / Evitar as trampas comúns

Actualización 12/18/07: Ver o artigo de Paul Liebrand para algunhas consecuencias técnicas de eliminar ou modificar os nomes de grupos estándar (ver o seu comentario a continuación, así).

Visión global:

SharePoint security is easy to configure and manage. Con todo, it has proven to be difficult for some first-time administrators to really wrap their hands around it. Not only that, I have seen some administrators come to a perfect understanding on Monday only to have lost it by Friday because they didn’t have to do any configuration in the intervening time. (Eu admite a ter este problema me). This blog entry hopefully provides a useful SharePoint security primer and points towards some security configuration best practices.

Nota importante:

This description is based on out of the box SharePoint security. My personal experience is oriented around MOSS so there may be some MOSS specific stuff here, but I believe it’s accurate for WSS. I hope that anyone seeing any errors or omissions will point that out in comments or enviar correo-e me. I’ll make corrections post haste.

Fundamentos:

Aos efectos da presente Resumo, existen catro aspectos fundamentais para a seguridade: usuarios / grupos, obxectos que poden ser protexidos, niveis de permisos e de herdanza.

Usuarios e Grupos quebran-se en:

  • Os usuarios individuais: Tirado do Active Directory ou creado directamente no SharePoint.
  • Grupos: Mapped directly from active directory or created in SharePoint. Groups are a collection of users. Groups are global in a site collection. They are never "tied" a un obxecto específico protexido.

Obxectos que poden ser protexidos romper a polo menos:

  • Sitios
  • As bibliotecas de documentos
  • Elementos individuais en listas e bibliotecas de documentos
  • Cartafois
  • Varias opcións BDC.

Existen outros obxectos que poden ser protexidos, pero comeza a foto.

Os niveis de permiso: Un feixe de granular / low level access rights that include such things as create/read/delete entries in lists.

Herdanza: By default entities inherit security settings from their containing object. Sub-sites inherit permission from their parent. Document libraries inherit from their site. So on and so forth.

Usuarios e grupos se relacionan con obxectos que poden ser protexidos a través de niveis de permiso e de herdanza.

Os máis importantes Normas de Seguridade para entender, Ever 🙂 :

  1. Os grupos son simplemente coleccións de usuarios.
  2. Grupos son globais dentro dun conxunto de sitios web (i.e. non hai tal cousa como un grupo definido a nivel local).
  3. Nome do grupo non resistir, grupos non facer, en si, have any particular level of security.
  4. Groups have security in the context of a specific securable object.
  5. Pode asignar niveis de permiso diferentes para o mesmo grupo para cada obxecto protexido.
  6. Aplicación web políticas trunfo todo isto (mira abaixo).

Os administradores de seguridade perdidas nun mar de grupo e lista de usuarios poderá contar con estes axiomas para xestionar e entender a súa configuración de seguridade.

Problemas comúns:

  • Os nomes dos grupos implicar falsamente permiso: Fóra da caixa, SharePoint defines a set of groups whose names imply an inherent level of security. Consider the group "Contributor". One unfamiliar with SharePoint security may well look at that name and assume that any member of that group can "contribute" to any site/list/library in the portal. That may be true but not because the group’s name happens to be "contributor". This is only true out of the box because the group has been provided a permission level that enables them to add/edit/delete content at the root site. Through inheritance, the "contributors" group may also add/edit/delete content at every sub-site. One can "break" the inheritance chain and change the permission level of a sub-site such that members of the so-called "Contributor" grupo non pode contribuír en todo, pero só ler (por exemplo). This would not be a good idea, obviamente, xa que sería moi confuso.
  • Os grupos non son definidos a nivel local. It’s easy to be confused by the user interface. Microsoft provides a convenient link to user/group management via every site’s "People and Groups" ligazón. It’s easy to believe that when I’m at site "xyzzy" and I create a group through xyzzy’s People and Groups link that I’ve just created a group that only exists at xyzzy. That is not the case. I’ve actually created a group for the whole site collection.
  • Grupos de adhesión non varía pola web (i.e. é a mesma en todas partes do grupo se usa): Consider the group "Owner" e dous locais, "HR" and "Logistics". It would be normal to think that two separate individuals would own those sites — an HR owner and a Logistics owner. The user interface makes it easy for a security administrator to mishandle this scenario. If I didn’t know better, Eu podería acceder as persoas e con grupos a través da web de RH, select the "Owners" group and add my HR owner to that group. A month later, Logistics comes on line. I access People and Groups from the Logistics site, add pull up the "Owners" group. I see the HR owner there and remove her, thinking that I’m removing her from Owners at the Logistics site. En realidade, I’m removing her from the global Owners group. Hilarity ensues.
  • Deixar de citar grupos baseados en papel específico: The "Approvers" group is a perfect example. What can members of this group approve? Where can they approve it? Do I really want people Logistics department to be able to approve HR documents? Of course not. Always name groups based on their role within the organization. This will reduce the risk that the group is assigned an inappropriate permission level for a particular securable object. Name groups based on their intended role. In the previous HR/Logistics scenario, Eu debería crear dous novos grupos: "HR Owners" and "Logistics Owners" e asignar niveis de permiso por cada cordas e ao importe mínimo esixido para os usuarios fagan o seu traballo.

Outras referencias útiles:

Se chegou aquí:

Please let me know your thoughts via the comments or email me. If you know other good references, faga o mesmo!

Technorati Tags:

Fácil e rápida: Crear un Data View web Part (DVWP)

Hai unha gran riqueza de información sobre o WSS 3.0 Data View web Part (DVWP) on the web from several sources. Con todo, I found it to be surprisingly difficult to find information on this first very basic step. Here is another article in the "quick and easy" serie para afrontalo lo.

Siga estes pasos para crear un Data View web Part (DVWP). They are based on an "Announcements" parte da web, pero se aplican á maioría das listas.

  1. Crear unha peza web Anuncios e engadila a un sitio web.
  2. Abre o sitio web no SharePoint Design.
  3. Abre default.aspx web.
  4. Select the Announcements web part and right-click.
  5. No menú contextual, select "Convert to XSOT Data View".

SharePoint Deseño avisa que esta web é agora personalizado a partir da súa definición de sitio. Iso non é necesariamente malo, pero non son importantes implicacións (execución, mellorar, outros) which are beyond the scope of this little "Quick and Easy" entrada. To get more information on this subject, Recomendo os dous libros aquí así como o seu favorito de procura en Internet.

Confirmar que fixo correctamente:

  1. Pechar e reabrir o navegador web (to avoid accidentally re-posting the original "add a new web part").
  2. Select the web part’s arrow drop-down and choose "Modify Shared Web Part" desde o menú.
  3. O panel de ferramentas abre á dereita.
  4. O panel cambiou das súas opcións habituais para este conxunto:
imaxe

“Non se pode ver a lista de propiedade de columna de esquema da lista do SharePoint” — descrición / traballo-around

Esta semana, finalmente reproducido un problema que fora informar por un usuario remoto: Cando tentou exportar o contido dunha lista de Excel, as cousas parecen comezar a traballar, pero entón Excel debería aparecer un erro: "Cannot get the list schema column property from the SharePoint list". She was running office 2003, windows XP and connecting to MOSS.

Eu procurei as Internets e vin algunhas especulacións pero nada 100% definitive. Hence, este post.

O problema: Exportando unha vista a Excel que contén unha data (data = o tipo de datos da columna).

O que funcionou para nós: Convert the date to a "single line of text". Entón, convertelo-lo para unha data.

That solved it. It was nice to see that the conversion worked, na realidade. It was quite nervous that converting things this way would fail, but it did not.

Este erro foi lanzada unha sombra enorme sobre o tipo de datos data en mente do cliente, entón nós imos estar buscando unha resposta definitiva de Microsoft e espera que eu vou publicar e actualizar aquí o próximo período curto de tempo coa súa resposta oficial e Información do hotfix.

Outras referencias:

http://www.kevincornwell.com/blog/index.php/cannot-get-the-list-schema-column-property-from-the-sharepoint-list/

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2383611&SiteID=1

<final>

Rexístrate para o meu blog.

Technorati Tags: ,

Rápido e sinxelo: Mande unha mensaxe co link incorporado a partir de fluxo de traballo do SharePoint Design

Unha ou dúas veces por mes, alguén publicar unha pregunta foro: "How do I include hyperlinks to URL’s that are clickable from a SharePoint Designer email?"

Presentado sen comentario: (ben, Realmente non hai máis comentarios despois da imaxe):

imaxe

Becky Isserman segue-se con unha explicación útil sobre como inserir unha ligazón a un artigo do correo electrónico: http://www.sharepointblogs.com/mosslover/archive/2007/11/20/addition-to-paul-galvin-s-post-about-sending-an-e-mail-with-hyperlinks-in-spd.aspx

Nova versión: Fluxo de traballo do SharePoint Design Extensións (Funcións de manexo de cadeas)

Actualización: Aquí tes os meus pensamentos sobre a comercialización deste proxecto: http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!569.entry

Eu estiven ocupado traballando no meu proxecto CodePlex, que está enfocada na subministración de extensións de manipulación de cadea para fluxos de traballo creados vía SharePoint Design.

Aquí tes información:

Proxecto de casa: http://www.codeplex.com/spdwfextensions

Solte: https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=spdwfextensions&ReleaseId=8280

Versión 1.0 inclúe os seguintes novas características:

Función Descrición (se non mesmo. función Net)
Nun-entradas() Volta o número "entradas" in a string as per a specified delimiter.

Por exemplo: Num-entries in a string "a,b,c" with delimiter "," = 3.

Entrada() Returns the nth token in a string as per a specified delimiter.
Lonxitude String.length
Substituír() String.Replace()
Contén() String.Contains()
Returns the word "true" or the word "false".
Substring(comezar) String.substring(comezar)
Substring(comezar,lonxitude) String.substring(comezar,lonxitude)
ToUpper() String.toupper()
ToLower() String.ToLower()
StartsWith() String.StartsWith()
Returns the word "true" or the word "false".
EndsWith() String.EndsWith()
Returns the word "true" or the word "false".

Un erro de execución BDC explicou

Eu causou un erro BDC esta semana que se manifestou sobre a interface de usuario e no 12 colmea rexistro en tempo de execución.

Primeiro, este apareceu na interface de usuario:

Non se atopou campos para introducir todos os valores identificador para realizar correctamente unha MethodInstance SpecificFinder con nome … Asegúrese de parámetros de entrada teñen TypeDescriptors asociados con cada identificador definido para esta entidade.

Aquí está unha captura de pantalla:

clip_image001

Eu podería causar esta mensaxe sexa exhibida na 12 rexistro colmea a gusto (using my patented high-tech-don’t-try-this-at-home "mysterious errors" método):

11/14/2007 09:24:41.27 w3wp.exe (0x080C) 0x0B8C SharePoint Portal Server Business Data 6q4x High Exception in BusinessDataWebPart.OnPreRender: System.InvalidOperationException: O valor Identificador ”, de tipo ”, non é válido. Expected Identifier value of Type ‘System.String’. en Microsoft.Office.Server.ApplicationRegistry.MetadataModel.Entity.FindSpecific(Obxecto[] subIdentifierValues, LobSystemInstance LobSystemInstance) en Microsoft.SharePoint.Portal.WebControls.BdcClientUtil.FindEntity(Entidade entidade, Obxecto[] userValues, LobSystemInstance LobSystemInstance) en Microsoft.SharePoint.Portal.WebControls.BusinessDataItemBuilder.GetEntityInstance(Ver desiredView) en Microsoft.SharePoint.Portal.WebControls.BusinessDataDetailsWebPart.GetEntityInstance() en Microsoft.SharePoint.Portal.WebControls.BusinessDataDetailsWebPart.SetDataSourceProperties()

Procurei ao redor e atopar algunhas pistas no MSDN foro, but they weren’t enough for me to understand what I was doing wrong. I watched a webcast by Ted Pattison que a miña compañía ten squirreled afastado nun servidor e veu a entender o meu problema.

Na miña ADF, Estou me conectando a un banco de datos SQL como se mostra:

            <Propiedade Nome="RdbCommandText" Tipo="System.String">
              <![CDATA[
                Seleccione
                      , CARRIER_ID, EFFDT, DESCR, EFF_STATUS, TAXPAYER_ID, Network_id, FRT_FORWARD_FLG, ALT_NAME1, ALT_NAME2, LANGUAGE_CD,
                      PAÍS, Endereço1, Endereço2, Endereço3, ADDRESS4, CIDADE, NUM1, NUM2, HOUSE_TYPE, ADDR_FIELD1, ADDR_FIELD2, ADDR_FIELD3,
                      County, ESTADO, Postal, GEO_CODE, IN_CITY_LIMIT, Country_code, TELÉFONO, MEDIDA, FAX, LAST_EXP_CHK_DTTM, FREIGHT_VENDOR,
                      INTERLINK_DLL, TMS_EXCLUDE_FLG
                 (nolock)
                ONDE
                  (SetId <> 'Compartir') e
                  (descargar(CARRIER_ID) >= Menor(@ MinID)) e
                  (descargar(CARRIER_ID) <= Menor(@ MaxId)) e
                  (descargar(DESCR) COMO menor(@ InputDescr))
                ]]>
            </Propiedade>

Eu estaba sempre que o SQL dunha persoa dBA e estou dado a entender que é un especial view they created just for me. The unique key there is CARRIER_ID.

Aquí é a erro eu introducir:

      <Identificadores>
        <Identificar Nome="CARRIER_ID" TypeName="System.String" />
        <Identificar Nome="DESCR" TypeName="System.String" /> 
</Identificadores>

Nalgún lugar ao longo da liña, Eu conseguira confundir-me sobre o significado de <Identificadores> and added DESCR even though it’s not actually an identifier. I took DESCR out of the identifiers set and presto! Todo funcionou.

I hope this saves someone some grief 🙂

Technorati Tags: , , ,