2013-08-01 21 views
8

Esiste un modo per creare tale query?Ricerca avanzata - associa l'entitie con OR

enter image description here

ho bisogno di dati da Indirizzo e contatto Indirizzo, normalmente posso solo combinarli con Combine OR, ma non in questo caso.

Immagino di dover scrivere un nuovo plug-in con il metodo PreExecute(), ottenere la mia query, analizzare i dati e quindi ottenere manualmente uguale indirizzo O ci sono altri modi?

+0

Si sta tentando di creare una vista o si sta tentando di accedere ai dati tramite l'SDK? – Daryl

+0

Non importa. Ho solo bisogno di visualizzare i dati per l'utente in vista. Mi interessava la possibilità che il sistema rappresentasse per lo sviluppatore. E scopri che l'unico modo per farlo - scrivi un plugin. –

risposta

2

Ho risolto il problema.

  • Creare Plugin per la pre-validazione con Execute() metodo e qualche metodo per l'analisi dei dati.
  • Nella vista delle entità aggiungere un campo con GUID.
  • Se il plugin ha trovato guid nella visualizzazione, verrà visualizzata la query fetchxml per l'entità e l'entità seconda query per mostrare la visualizzazione predefinita.
  • Dati di analisi per ciò che si desidera visualizzare per l'utente.
  • Registra il tuo plug-in.
  • Profitto.

PS Aggiungo le sorgenti in un giorno o due dopo il refactoring e l'approvazione da parte del cliente.

Edit:

Prima di tutto - y deve creare nuove GUID e aggiungere campo stringa per vedere con che guid per visualizzare (E 'meglio per nasconderlo da parte dell'utente). Creare plugin con RetrieveMultiple azione e Post convalida (in Pre azione si rischia di perdere le modifiche)

In plugin: metodo main RetrieveMultiple che otterrà il contesto e il servizio dal quale si avrà interrogazione, allora avete bisogno di ottenere FetchXML e controllo se ci sono i tuoi GUID.

  string fetchXml = string.Empty; 
      var query = context.InputParameters["Query"] as QueryExpression; 
      var fetchQuery = context.InputParameters["Query"] as FetchExpression; 

       if (query == null) 
       { 
        if (fetchQuery == null) 
        { 
        return; 
        } 
       fetchXml = fetchQuery.Query; 
       } 

       // Convert query to a fetch expression for processing and apply filter 
       else 
       { 
        fetchXml = 
         ((QueryExpressionToFetchXmlResponse) 
          service.Execute(new QueryExpressionToFetchXmlRequest {Query = query})).FetchXml; 
       } 

       if (fetchXml.Contains(OpportunityFilterGuid)) 
      { 
        ApplyFilter(context, service, query); 
       } 
      } 

nel metodo ApllyFilter è necessario: interrogazione

  1. ottenere da utente (può aggiungere alcuni nuovi Campi).

  2. Elimina il campo con GUID.

  3. Esegui query.

  4. Elimina campi, che possono entrare in conflitto con l'istruzione OR.

  5. Aggiungi link-entity per interrogare.

  6. Esegui query.

  7. Aggiungere le entità ricevute dalla seconda query al primo.

  8. Utilizzando LINQ selezionare le entità che non vengono ripetute.

    collectionOne.Entities.GroupBy(oppId => oppId.Id).Select(opp => opp.First()) 
    
  9. Inviare tali dati al client.

2

Non sono a conoscenza di alcun modo per fare quanto sopra.

Piuttosto che scrivere un plug-in, tuttavia, farei un report.

Il modo più semplice a cui riesco a pensare è quello di eseguire il tuo fetchXML senza filtri in questo modo.

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true"> 
    <entity name="account"> 
    <attribute name="name" /> 
    <attribute name="primarycontactid" /> 
    <attribute name="telephone1" /> 
    <attribute name="accountid" /> 
    <attribute name="address1_city" /> 
    <order attribute="name" descending="false" /> 
    <link-entity name="contact" from="parentcustomerid" to="accountid" alias="ac"> 
     <attribute name="address1_city" /> 
    </link-entity> 
    </entity> 
</fetch> 

quindi alterna visibilità di righe nel report utilizzando

=Fields!address1_city.Value="Sydney" Or Fields!ac_address1_city.Value="Sydney" 

Ovviamente si potrebbe sostituire Sydney con un parametro

+0

Ho bisogno di farlo per una delle viste delle entità. Quindi, come ti dico, dai una bella idea ma non per me. Sì? –

+0

Correggere quanto sopra non ti aiuterà con le viste delle entità. Scusate. – Campey

0

In parole povere, non c'è modo di fare ciò che si sta chiedendo attraverso avanzata trova.

La query di esempio che hai inserito ti mostrerà solo gli account in cui i contatti associati hanno l'indirizzo corrispondente (oltre ovviamente all'account con l'indirizzo corrispondente). Una volta che associ un'altra entità in una Ricerca avanzata, vedrai solo i genitori con i record associati - non c'è alcuna capacità di fare (ciò che è effettivamente) un join esterno.

Le tue uniche opzioni sono davvero creare qualcosa in Silverlight o HTML e aggiungerlo come risorsa web - una volta all'interno di quel codice puoi visualizzare praticamente tutto ciò che desideri. Come altri hanno suggerito, questo è possibile in una relazione.

+0

Nulla è impossibile nella programmazione. Ci sono sempre soluzioni. –