Pergunta

Preciso usar o CQWP com mais de três filtros, por isso vou usar o QueryOverride com uma consulta CAML como descrito aqui.Não consigo fazer isso funcionar ao implantar a instância da web part usando Elements.xml, ou seja,AllUsersWebPart e CDATA.

A maneira como fiz isso com filtros normais foi a seguinte (de Elements.xml)

<AllUsersWebPart ID="FindingsCQWP" WebPartZoneID="Middle" WebPartOrder="1" >
          <![CDATA[
            <webParts>
              <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
                <metaData>
                  <type name="Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart, Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
                  <importErrorMessage>Cannot import this Web Part.</importErrorMessage>
                </metaData>
                <data>
                  <properties>
                    <property name="GroupBy" type="string" />
                    <property name="FilterValue2" type="string">Draft</property>
                    ... and so forth...

No entanto QueryOverride requer o uso de CDATA também.O problema é que não acho que elementos CDATA 'aninhados' sejam permitidos.eu tentei Codificação HTML o CAML como uma solução/abordagem alternativa, mas sem sucesso.

Qual é a solução aqui?Acho que poderia escrever algum código receptor de recurso, mas gostaria de evitar isso, se puder.

Foi útil?

Solução 2

A resposta de @Andrey me indicou a resposta a esta pergunta.A consulta precisa ser codificada.Tentei isso na minha abordagem inicial, mas devo ter perdido alguma coisa.

Eu tinha esse CAML que queria ter no meu QueryOverride

<Where>
  <And>
     <And>
        <Or>
           <Eq>
              <FieldRef Name='Status' />
              <Value Type='Choice'>Not Started</Value>
           </Eq>
           <Eq>
              <FieldRef Name='Status' />
              <Value Type='Choice'>Not Closed</Value>
           </Eq>
        </Or>
        <Leq>
           <FieldRef Name='TargetImplDate' />
           <Value Type='DateTime'>
              <Today />
           </Value>
        </Leq>
     </And>
     <Eq>
        <FieldRef Name='Category' />
        <Value Type='Choice'></Value>
     </Eq>
  </And>
</Where>
<OrderBy>
  <FieldRef Name='ProcessChoice' />
  <FieldRef Name='TargetImplDate' />
</OrderBy>

Usar CDATA quando adicionei a web part à galeria de web parts, adicioná-la à página e exportá-la posteriormente obteve o resultado

<property name="QueryOverride" type="string">&lt;Where&gt;&lt;And&gt;&lt;And&gt;&lt;Or&gt;&lt;Eq&gt;&lt;FieldRef Name='Status' /&gt;&lt;Value Type='Choice'&gt;Not Started&lt;/Value&gt;&lt;/Eq&gt;&lt;Eq&gt;&lt;FieldRef Name='Status' /&gt;&lt;Value Type='Choice'&gt;Not Closed&lt;/Value&gt;&lt;/Eq&gt;&lt;/Or&gt;&lt;Leq&gt;&lt;FieldRef Name='TargetImplDate' /&gt;&lt;Value Type='DateTime'&gt;&lt;Today /&gt;&lt;/Value&gt;&lt;/Leq&gt;&lt;/And&gt;&lt;Eq&gt;&lt;FieldRef Name='Category' /&gt;&lt;Value Type='Choice'&gt;&lt;/Value&gt;&lt;/Eq&gt;&lt;/And&gt;&lt;/Where&gt;&lt;OrderBy&gt;&lt;FieldRef Name='ProcessChoice' /&gt;&lt;FieldRef Name='TargetImplDate' /&gt;&lt;/OrderBy&gt;</property>

que funcionou como esperado.Obrigado @Andrey

Outras dicas

Uma espécie de solução alternativa, mas ainda assim:implantar CQWP sem essa propriedade em uma página, definir a propriedade programaticamente e exportar a webpart para .webpart arquivo.

Prevejo algum tipo de pesadelo de codificação HTML dupla como resultado.

P.S.Não testado.

P.S.S.Se você não conseguir exportar a webpart do navegador, tente usar a abordagem programática (ExportarWebPart método de SPLimitedWebPartManager).

Por favor, tenha em mente que

<where> or &lt;Where&gt;

tag deve ficar na mesma linha com

<property name="QueryOverride" type="string">

assim

 <property name="QueryOverride" type="string">&lt;Where&gt;
        &lt;Or&gt;
          &lt;Eq&gt;
            &lt;FieldRef Name="AssignedTo"/&gt;
            &lt;Value Type="User"&gt;
              &lt;UserID/&gt;
            &lt;/Value&gt;
          &lt;/Eq&gt;
          &lt;Membership Type="CurrentUserGroups"&gt;
            &lt;FieldRef Name="AssignedTo"/&gt;
          &lt;/Membership&gt;
        &lt;/Or&gt;
      &lt;/Where&gt;</property>

e NÃO assim

 <property name="QueryOverride" type="string">
     &lt;Where&gt;
        &lt;Or&gt;
          &lt;Eq&gt;
            &lt;FieldRef Name="AssignedTo"/&gt;
            &lt;Value Type="User"&gt;
              &lt;UserID/&gt;
            &lt;/Value&gt;
          &lt;/Eq&gt;
          &lt;Membership Type="CurrentUserGroups"&gt;
            &lt;FieldRef Name="AssignedTo"/&gt;
          &lt;/Membership&gt;
        &lt;/Or&gt;
      &lt;/Where&gt;
</property>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top