Implementazione degli oggetti query e del generatore di query
In Dynamics 365, è possibile usare gli oggetti query nella piattaforma di sviluppo per creare istruzioni SQL. È possibile usare queste query per eseguire il rendering dei dati in moduli, report, viste e altro ancora. Inoltre, è possibile scrivere istruzioni SQL usando query di selezione. L'oggetto query consente di creare istruzioni SQL in modo dinamico durante il runtime.
Si consiglia di usare gli oggetti query nei moduli anziché usare direttamente le tabelle. Usando gli oggetti query è possibile selezionare quali campi visualizzare nel form, ciò non è possibile con le tabelle. Questo approccio consente di ridurre le dimensioni dell'istruzione SQL in esecuzione dietro al modulo e aiuta a migliorare le prestazioni. La stessa nozione si applica anche a report e viste.
Classe QueryBuildDataSource
La classe QueryBuildDataSource è il blocco predefinito per la creazione della query. Definisce l'origine dati da aggiungere alla query. Può specificare i campi della tabella da aggiungere, l'ordinamento dei record e così via. Inoltre, può stabilire la relazione applicando join tra le origini dati.
Esempio
È presente una tabella TrainingMaster con due campi: TrainingID e TrainingDate. È necessario visualizzare entrambi i campi in ordine crescente di TrainingID costruendo un oggetto query. Il modello di codice è il seguente:
class TrainingMasterQuery
{
public static void main(Args _args)
{
QueryBuildDataSource qbds;
Query query = new Query();
qbds = query.addDataSource(tableNum(TrainingMaster));
qbds.addSortField(fieldNum(TrainingMaster, TrainingID), SortOrder::Ascending);
QueryRun queryRun = new QueryRun(query);
while (queryRun.next())
{
TrainingMaster trainingMaster = queryRun.get(tableNum(TrainingMaster));
info(strFmt("%1, %2", trainingMaster.TrainingID, date2Str(trainingMaster.TrainingDate, 123, DateDay::Digits1or2, DateSeparator::Hyphen, DateMonth::Digits1or2, DateSeparator::Hyphen, DateYear::Digits4)));
}
}
}
Classe QueryBuildRange
La classe QueryBuildRange definisce il filtro per i record recuperati dall'origine dati.
Esempio
Nella tabella TrainingMaster è stato aggiunto un nuovo campo denominato TrainingType. Questo nuovo campo presenta due valori: Online e Classroom. È necessario filtrare tutti i corsi online creando un oggetto query. Il modello di codice è il seguente:
class TrainingMasterQuery
{
public static void main(Args _args)
{
Query query = new Query();
QueryBuildDataSource qbds = query.addDataSource(tableNum(TrainingMaster));
qbds.addSortField(fieldNum(TrainingMaster, TrainingID), SortOrder::Ascending);
QueryBuildRange qbr = qbds.addRange(fieldNum(TrainingMaster, TrainingType));
qbr.value(queryValue(TrainingType::Online));
QueryRun queryRun = new QueryRun(query);
while (queryRun.next())
{
TrainingMaster trainingMaster = queryRun.get(tableNum(TrainingMaster));
info(strFmt("%1, %2", trainingMaster.TrainingID, date2Str(trainingMaster.TrainingDate, 123, DateDay::Digits1or2, DateSeparator::Hyphen, DateMonth::Digits1or2, DateSeparator::Hyphen, DateYear::Digits4)));
}
}
}
Sintassi di query avanzata
Sono disponibili diverse sintassi di query avanzate per i campi stringa, numerici e data. Per i campi stringa, è possibile filtrare in base alle opzioni uguale a, non uguale a, intervallo, carattere jolly e così via. Per i campi numerici, le opzioni di filtro possono essere uguale a, non uguale a, maggiore di, minore di e così via. Per i campi dati, le opzioni di filtro possono essere in base a giorno, intervallo di giorni, intervallo di mesi, intervallo di anni, maggiore/minore di date e così via.
Esempio
Un nuovo campo denominato NoofDays è stato aggiunto alla tabella TrainingMaster. Verrà applicato un filtro avanzato alla query per mostrare tutti i corsi di formazione che hanno un numero di giorni maggiore di 2. Il modello di codice è il seguente:
class TrainingMasterQuery
{
public static void main(Args _args)
{
Query query = new Query();
QueryBuildDataSource qbds1 = query.addDataSource(tableNum(TrainingMaster));
qbds1.addSortField(fieldNum(TrainingMaster, TrainingID), SortOrder::Ascending);
QueryBuildRange qbr1 = qbds1.addRange(fieldNum(TrainingMaster, NoofDays));
qbr1.value(queryValue(">2"));
QueryRun queryRun = new QueryRun(query);
while (queryRun.next())
{
TrainingMaster trainingMaster = queryRun.get(tableNum(TrainingMaster));
info(strFmt("%1, %2", trainingMaster.TrainingID, date2Str(trainingMaster.TrainingDate, 123, DateDay::Digits1or2, DateSeparator::Hyphen, DateMonth::Digits1or2, DateSeparator::Hyphen, DateYear::Digits4)));
}
}
}
Creazione di un query che include una tabella relazionale
Usando un oggetto query, è possibile creare una query che includa tabelle correlate. È possibile definire tutti i tipi di join come richiesti dalla query.
Esempio
È stata creata una nuova tabella denominata TrainerTable con tre campi: TrainerID, TrainerName e TrainerType (valori di enumerazione: Functional, Technical e Softskill). Inoltre, il campo TrainerID è stato aggiunto alla tabella TrainingMaster stabilendo una relazione di chiave esterna tra le tabelle. È necessario filtrare tutti i corsi di formazione online forniti dagli istruttori tecnici creando un oggetto query.
Il modello di codice è il seguente:
class TrainingMasterQuery
{
public static void main(Args _args)
{
Query query = new Query();
QueryBuildDataSource qbds1 = query.addDataSource(tableNum(TrainingMaster));
qbds1.addSortField(fieldNum(TrainingMaster, TrainingID), SortOrder::Ascending);
QueryBuildRange qbr1 = qbds1.addRange(fieldNum(TrainingMaster, TrainingType));
qbr1.value(queryValue(TrainingType::Online));
QueryBuildDataSource qbds2 = qbds1.addDataSource(tableNum(TrainerTable));
qbds2.relations(true);
qbds2.joinMode(JoinMode::ExistsJoin);
QueryBuildRange qbr2 = qbds2.addRange(fieldNum(TrainerTable, TrainerType));
qbr2.value(queryValue(TrainerType::Technical));
QueryRun queryRun = new QueryRun(query);
while (queryRun.next())
{
TrainingMaster trainingMaster = queryRun.get(tableNum(TrainingMaster));
info(strFmt("%1, %2", trainingMaster.TrainingID, date2Str(trainingMaster.TrainingDate, 123, DateDay::Digits1or2, DateSeparator::Hyphen, DateMonth::Digits1or2, DateSeparator::Hyphen, DateYear::Digits4)));
}
}
}
Ulteriori informazioni
Per altre informazioni sugli oggetti query e sul generatore di query, vedere i siti seguenti:
La sezione Modello di oggetto query della libreria di classi X++