5

Ho alcuni rapporti SQL che ha prestazioni molto lenta, così abbiamo trasformato tutti in FetchXML, ma tutti i rapporti di SQL ha tutte le condizioni facoltative, qualcosa di simile:Come fare un Condizione Extra in FetchXML

SELECT 
    ... 
FROM ... 
WHERE (@operator   = 'All' OR Operator   = @operator) 
    AND (@new_gen_comp_name = 'All' OR new_gen_comp_name = @new_gen_comp_name) 
    ... 

Nei valori dei parametri, c'è un valore All se l'utente seleziona questo valore, la condizione verrà ignorata e quindi otterrà tutti i valori da quel campo.

Ora voglio farlo in FetchXML, ho provato a mettere due condizioni con filtro or tra di loro, uno per il valore e un altro per includere i valori nulli come questo:

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true"> 
    <entity name="incident"> 
     ... 
     ... 
     <filter type="and"> 
     <filter type="and"> 
      <condition attribute="createdon" operator="on-or-after" value="@StartDate" /> 
      <condition attribute="createdon" operator="on-or-before" value="@EndDate" /> 
     </filter> 
     <filter type="or"> 
      <condition attribute="new_gen_comp_type" operator="in" value="@new_gen_comp_type" /> 
      <condition attribute="new_gen_comp_type" operator="null" /> 
     </filter> 
     </filter> 

     ... 
     ... 
    </entity> 
</fetch> 

Questo ha funzionato bene solo se l'utente seleziona tutti i valori per il parametro @new_gen_comp_type, ma il problema è se l'utente seleziona solo valori specifici, includerà anche i valori nulli e ciò è sbagliato.

Quindi, esiste un modo per rendere opzionali queste condizioni nel caso in cui l'utente selezioni select all per i valori del parametro come in SQL?

+0

Hai trovato una soluzione per questo problema? – Moy

+0

@MoisesCardenas Sì, vedere la mia risposta qui sotto. –

risposta

3

Dato che lo stai facendo in SSRS, non hai la possibilità di modificare il recupero dell'XML che è quello che devi veramente fare. (Se l'utente seleziona "TUTTI", non includere un vincolo su new_gen_comp_type)

L'unica opzione che posso pensare è una specie di stupido, ma dovrebbe funzionare. Crea un nuovo attributo su Incident new_all predefinito su "TUTTI" ed esegui un'istruzione di aggiornamento per popolare tutti gli incidenti esistenti su "TUTTI". Quindi modificare il filtro FetchXML a:

<filter type="or"> 
    <condition attribute="new_gen_comp_type" operator="eq" value="@new_gen_comp_type" /> 
    <condition attribute="new_all" operator="eq" value="@new_gen_comp_type" /> 
</filter> 

Se l'utente seleziona "ALL" la seconda affermazione sarà vera e tutto sarà restituito. Se l'utente seleziona qualcosa oltre ALL, la seconda istruzione sarà sempre falsa e la prima dichiarazione restituirà solo ciò che corrisponde.

Si noti che l'attributo operator="in" non funziona con più valori. Hai bisogno di fare un tag valore di bambino con ogni valore ...

Dal XSD:

L'attributo "Valore" è usato per tutti gli operatori che mettono a confronto per un singolo valore (ad esempio, eq). L'elemento "valore" viene utilizzato per operatori che si confrontano con più valori (ad esempio, in). Alcuni operatori non richiedono né l'attributo "valore" né l'elemento "valore" (ad esempio, null).

+0

Grazie per la tua risposta, ma non c'è alcun valore 'ALL' nei valori dei parametri, c'è comunque una casella di controllo' seleziona tutto' (dato che ho impostato tutti i parametri per consentire più valori), se ho selezionato tale casella il valore del parametro diventa tutti i valori in esso separati da virgola, quindi come posso sapere se l'utente seleziona tutti i valori o no? Penso di poter confrontare il conteggio dei valori selezionati di un parametro 'Parametri! New_gen_comp_type.Value.Count' con il conteggio dei valori nel set di dati che i valori dei parametri sono stati popolati da destra? –

+0

Ho provato a confrontare il conteggio dei valori selezionati di un parametro con i valori del set di dati per sapere se l'utente ha selezionato tutti i valori o meno, ma c'era un errore che non posso utilizzare un aggregato in un campo calcolato. Come superare questo problema per provare la soluzione? Inoltre ho un sacco di condizioni in quel rapporto su 10 condizioni, ho bisogno di aggiungere un'altra entità per ogni condizione o questo nuovo attributo 'new_all' funzionerà correttamente e restituirà tutti i valori? –

+0

Inoltre sei sicuro del punto in cui l'attributo operator = "in" non funzionerà con più valori. Perché sta funzionando bene con me e ho controllato di nuovo e funziona bene. E la frase che hai citato dice che l'operatore "in" dovrebbe funzionare bene con più valori "L'elemento" valore "è usato per operatori che si confrontano con più valori (ad esempio, in)." –

4

Ho trovato una soluzione per questo utilizzando i filtri del set di dati, ho rimosso tutte le condizioni dal fetchxml (ho lasciato solo quelle condizioni che non sono facoltative). Poi ho reso tutti i parametri multi-valutati, se l'utente seleziona più di un valore valga il parametro facoltativo, altrimenti se seleziona un valore cercherà con esso.

ho aggiunto un filtro per ogni condizione, per esempio se si dispone di una condizione in xml prendere in questo modo:

<condition attribute="attribute1" operator="in" value="@a1" /> 
... 
... 

Poi ho aggiunto un filtro per ogni condizioni in questo modo:

  • Fare clic con il pulsante destro del set di dati da cui la tabella sta leggendo.
  • Fare clic sulle proprietà.
  • Scegli la scheda dei filtri.
  • Fare clic sul pulsante Aggiungi.
  • Nell'espressione scegliere la coppia [attribute1].
  • Per l'operatore scegliere in.
  • Per il valore, fare clic sul pulsante funzione fx e immettere la seguente espressione =IIf(Parameters!a1.Count>1,Fields!attribute1.Value,Parameters!a1.Value).

Quindi, se l'utente seleziona un solo valore per i valori dei parametri, la condizione sarà falsa allora il campo attribute1 viene confrontato con il valore di parametri, pertanto verrà applicata la condizione altrimenti il ​​valore del campo verrà confrontato il suo valore, che è sempre vero, in modo che la condizione sia sempre vera e ignorata.

Il problema con thi soluzione è che l'utente non può selezionare valori multipli e verificare con loro, sarà trattata come seleziona tutti i valori, ho cercato di superare questo:

  • Controllando se i valori selezionati per i valori dei parametri sono uguali al conteggio dei valori totali del set di dati dal quale viene popolato il parametro o se non viene popolato da un set di dati, confrontare invece i valori totali con il conteggio totale di tutti i valori di controllare se il conteggio è maggiore di 1, ma non potrei essere in grado di farlo. Ho ricevuto un errore che non è stato possibile utilizzare un aggregato nelle espressioni dei filtri.

  • Tentativo di includere un valore nullo nei valori dei parametri (non è stato possibile farlo nel mio caso perché i valori dei parametri sono stati compilati da un set di dati), in modo che sia possibile verificare se il valore selezionato è nullo, quindi ignorare il valore condizione, qualcosa del genere: =IIf(Parameters!a1.value = nothing,Fields!attribute1.Value,Parameters!a1.Value).

Se è possibile eseguire uno di questi lavori, questa soluzione funzionerà correttamente.

Si noti che, potrebbe essere necessario utilizzare Parameters!a1.Label invece di Parameters!a1.Value se quel campo ha un'etichetta attribute1name e un valore attribute1, questo è il modo in cui funziona FetchXML. Quindi utilizzare l'etichetta parametro per ottenere il nome per confrontarlo con attribute1name o utilizzare il valore del parametro per confrontarlo con attribute1.

0

Sebbene sia un presupposto, vedo che stai tentando un rapporto basato su FetchXML in CRM. In questo caso si consiglia di utilizzare CRM default filters. La query non richiede condizioni e ha solo colonne selezionate.

Ciò consentirebbe di avere parametri opzionali.

[Nota: Filtri/I parametri sono applicabili solo di entità/entità collegate interrogato]