Creazione degli elementi di dati di un report e relative proprietà
Creare una progettazione logica per un report significa definire il modello di dati nonché il modo in cui vengono raccolti i dati per il report, tra cui:
Tabelle usate dal report definendo elementi di dati.
Relazioni tra elementi di dati se il report utilizza più tabelle.
Chiave, ordinamento e filtri da usare con gli elementi di dati.
Elementi che l'utente può modificare al runtime.
Raggruppamento di dati.
Calcolo di subtotali e totali.
In genere, le colonne e gli elementi di dati corrispondono ai campi in una tabella. Quando si esegue il report, viene eseguita l'iterazione di ogni elemento di dati per tutti i record nella tabella sottostante, si applicano i filtri e viene creato il set di dati. Quando un report si basa su più tabelle, è necessario definire le relazioni tra gli elementi di dati in modo da poter recuperare e organizzare i dati.
È possibile creare il set di dati del report a partire da elementi dati e colonne. Un elemento dati è una tabella. Una colonna può essere una delle seguenti entità:
Un campo di una tabella
Una variabile
Un'espressione
Una costante di testo
È possibile definire un modello di dati aggiungendo elementi di dati, che specificano le tabelle lette dal report. Qualsiasi tabella elencata viene letta completamente all'esecuzione del report. È possibile collegare e filtrare gli elementi di dati per limitare il numero di record che il report legge e per determinare la modalità di unione delle tabelle.
Un elemento di dati presenta il seguente costrutto:
dataitem(DataItemName; SourceTableName)
{
}
SourceTableName è il nome della tabella e DataItemName è il nome assegnato all'elemento di dati. DataItemName deve essere un nome conforme alle specifiche CLS (Common Language Specification), il che significa che non può contenere caratteri speciali, ad eccezione del carattere di sottolineatura.
Un report può leggere la stessa tabella più volte se la tabella è elencata più volte. Ad esempio, è possibile impostare un report affinché legga i record cliente due volte: dapprima i clienti che non sono bloccati e quindi quelli bloccati.
Le tabelle elencate diventano elementi di dati nel report. Gli elementi di dati sono variabili di record che consentono al report di accedere ai dati della tabella usando codice. L'ordine in cui gli elementi di dati sono elencati è quello in cui il report legge i dati nelle tabelle.
Quando si aggiungono due elementi di dati uno dopo l'altro, le tabelle vengono concatenate al set di dati nelle colonne corrispondenti di ogni elemento di dati.
L'esempio seguente mostra un set di dati che contiene due elementi di dati. Il primo elemento di dati si collega alla tabella Cliente e il secondo elemento di dati si collega alla tabella fornitori:
dataset
{
dataitem(Customer;Customer)
{
}
dataitem(Vendor;Vendor)
{
}
}
Se un elemento di dati risulta rientrato sotto un altro elemento di dati (l'elemento di dati padre), il report legge ogni record dell'elemento di dati padre e tutti i record dall'elemento di dati rientrato, inclusi eventuali filtri o collegamenti. In tal caso, le tabelle vengono unite.
L'esempio seguente mostra un set di dati che contiene due elementi di dati nidificati. Il primo elemento di dati si collega alla tabella Cliente e il secondo elemento di dati si collega alla tabella righe vendita:
dataset
{
dataitem(Customer;Customer)
{
dataitem("Sales Line";"Sales Line")
{
DataItemLinkReference = Customer;
DataItemLink = "Bill-to Customer No." = field("No.");
}
}
}
Questo concetto è simile a un ciclo FOR nidificato. Ad esempio, se la tabella Righe vendita viene aggiunta come elemento di dati all'elemento di dati della tabella Cliente, il report legge il primo cliente e quindi le informazioni sulla riga di vendita ad esso relative e quindi passa al cliente successivo.
Ogni elemento di dati include le proprietà DataItemLinkReference e DataItemLink. Queste proprietà definiscono una relazione master/dettagli tra due tabelle.
Nella proprietà DataItemLinkReference di un elemento di dati, selezionare l'elemento di dati padre a cui collegarsi (l'elemento di dati deve essere una parte dell'elemento di dati padre). Dopo aver specificato il valore DataItemLinkReference, usare la proprietà DataItemLink per specificare un campo di ogni elemento di dati su cui basare il collegamento. Nella proprietà DataItemLink dell'elemento di dati rientrato, specificare un collegamento per questo elemento di dati abbinando i campi in tale elemento di dati ai campi dell'elemento di dati padre.
L'esempio precedente illustra come usare questa proprietà. Nell'esempio ci sono due elementi di dati: padre e figlio. L'elemento di dati padre è un elenco di clienti, denominato Clienti. L'elemento di dati figlio contiene un record di tutti gli ordini vendita. Nella tabella Cliente, la chiave primaria è il numero cliente, memorizzato nel campo N.. Nella tabella contenente i dati sulle vendite, ogni record contiene questo numero cliente come chiave esterna nel campo Fatturare a - Nr. cliente. È possibile impostare il valore della proprietà DataItemLinkReference nell'elemento di dati figlio sull'elemento di dati padre. Inoltre, è possibile impostare la proprietà DataItemLink dell'elemento di dati figlio sul valore seguente:
"Bill-to Customer No." = field("No.");
Ora si ha un filtro sui record nell'elemento di dati figlio. Questo filtro visualizza solo i record relativi al record cliente attualmente selezionato.
Se si omette la proprietà DataItemLink, le due tabelle verranno collegate usando un cross join, il che significa che tutti i record del primo elemento di dati saranno collegati a tutti i record del secondo elemento di dati. Si deve cercare di evitare questa situazione poiché collegherà i record di entrambe le tabelle che non sono correlate da un punto di vista aziendale.
La proprietà PrintOnlyIfDetail specifica se stampare i dati in un report per l'elemento di dati padre quando l'elemento di dati figlio non genera output (non è correlato a un inner join o a un left join)
Questa proprietà non ha effetto su un elemento di dati che non ha elementi di dati figlio. Se questa proprietà è false e non esiste alcun record nell'elemento di dati figlio che corrisponde al record corrente nell'elemento di dati padre, il report stamperà i dati del record corrente nell'elemento di dati padre, anche se non esistono dati per l'elemento di dati figlio. Se questa proprietà è true e non esiste alcun record nell'elemento di dati figlio che corrisponde al record corrente nell'elemento di dati padre, il report non stamperà i dati del record corrente nell'elemento di dati padre. Se esistono più di due elementi di dati, il report eseguirà l'iterazione in ogni relazione padre-figlio nello stesso modo.
Nell'esempio seguente, la proprietà PrintOnlyIfDetail è stata impostata sull'elemento di dati Cliente:
dataitem(Customer; Customer)
{
PrintOnlyIfDetail = true;
dataitem("Sales Line"; "Sales Line")
{
DataItemLinkReference = Customer;
DataItemLink = "Bill-to Customer No." = field("No.");
}
}
Di conseguenza, quando un record cliente viene recuperato dalla tabella Cliente, il record cliente non verrà aggiunto al set di dati se non esistono righe vendita correlate per questo cliente. Si può prendere in considerazione l'impostazione della proprietà PrintOnlyIfDetail su true, che equivale all'implementazione di un INNER JOIN in una query SQL. In alternativa, l'impostazione della proprietà PrintOnlyIfDetail su false, ovvero il valore predefinito, è simile all'implementazione di un LEFT OUTER JOIN in una query SQL.
La proprietà DataItemTableView imposta la chiave in base alla quale eseguire l'ordinamento, l'ordinamento e i filtri per l'elemento di dati. Spesso questa proprietà viene usata per applicare un filtro all'elemento di dati.
Ad esempio, se il set di dati non deve includere tutti i record della tabella Cliente ma solo i clienti non bloccati, usare il seguente filtro:
dataitem(Customer; Customer)
{
PrintOnlyIfDetail = true;
DataItemTableView = where(Blocked=filter(false));
}
La proprietà DataItemTableView influisce sulle seguenti situazioni:
Se si imposta una chiave, l'elemento di dati non ha una Scheda dettaglio nella pagina Richiesta e gli utenti non possono selezionare una chiave per l'ordinamento, l'ordinamento o i filtri per l'elemento di dati.
Se si imposta un ordinamento, questo viene usato per il report, indipendentemente dall'ordinamento selezionato dall'utente nella pagina Richiesta.
Se si imposta un filtro, questo filtro non viene visualizzato nella pagina Richiesta, ma viene usato insieme agli eventuali filtri specificati dall'utente nella pagina Richiesta.
L'impostazione di un ordinamento, di un filtro o di entrambi non impedisce agli utenti di selezionare un campo di ordinamento nella pagina Richiesta.
È possibile usare la scelta rapida da tastiera CTRL+BARRA SPAZIATRICE in Visual Studio Code per ottenere una panoramica delle proprietà per elementi di dati disponibili.
