Créer des éléments de données d’état et leurs propriétés

Effectué

Créer une conception logique pour un état signifie définir le modèle de données, ce qui implique également de définir le mode de collecte des données de l’état, notamment :

  • les tables utilisées par l’état en définissant des éléments de données ;

  • les relations entre les éléments de données si l’état utilise plusieurs tables ;

  • la clé, l’ordre de tri et les filtres à utiliser avec les éléments de données ;

  • les éléments que l’utilisateur peut modifier au moment de l’exécution ;

  • le regroupement des données ;

  • le calcul des sous-totaux et des totaux.

En général, les éléments de données et les colonnes correspondent aux champs d’une table. Lors de l’exécution de l’état, chaque élément de données est itéré pour tous les enregistrements de la table sous-jacente, des filtres sont appliqués et le jeu de données est créé. Lorsqu’un état est basé sur plusieurs tables, vous devez définir des relations entre les éléments de données afin de pouvoir extraire et organiser les données.

Vous pouvez créer le jeu de données d’état à partir d’éléments de données et de colonnes. Un élément de données est une table. Une colonne peut être l’une des entités suivantes :

  • Un champ d’une table

  • Une variable

  • Une expression

  • Une constante texte

Vous pouvez définir un modèle de données en ajoutant des éléments de données et ainsi indiquer les tables lues par l’état. Toute table répertoriée est lue intégralement lors de l’exécution de l’état. Vous pouvez associer et filtrer des éléments de données pour limiter le nombre d’enregistrements lus par l’état et déterminer comment les tables sont jointes.

Un élément de données a la structure suivante :

        dataitem(DataItemName; SourceTableName)
        {

        }

La valeur SourceTableName est le nom de la table et la valeur DataItemName est le nom que vous donnez à l’élément de données. La valeur DataItemName doit être un nom compatible CLS (Common Language Specification). Autrement dit, elle ne peut pas contenir de caractères spéciaux, à l’exception du trait de soulignement.

Un état peut lire une même table à plusieurs reprises si elle est répertoriée plusieurs fois. Par exemple, vous pouvez configurer un état pour lire les enregistrements client à deux reprises : d’abord, les clients non bloqués, puis les clients bloqués.

Les tables répertoriées deviennent des éléments de données dans l’état. Les éléments de données sont des variables d’enregistrement qui permettent à l’état d’accéder aux données de table en utilisant du code. L’ordre dans lequel les éléments de données sont répertoriés est celui dans lequel l’état lit les données des tables.

Lorsque vous ajoutez deux éléments de données l’un après l’autre, les tables sont concaténées au jeu de données dans les colonnes correspondantes de chaque élément de données.

L’exemple suivant illustre un jeu de données contenant deux éléments de données. Le premier élément de données est associé à la table Client, et le deuxième à la table Fournisseur :

    dataset
    {
        dataitem(Customer;Customer)
        {

        }
        dataitem(Vendor;Vendor)
        {

        }
    }

Si un élément de données est indenté sous un autre élément de données (l’élément de données parent), l’état lit chaque enregistrement de l’élément de données parent et tous les enregistrements de l’élément de données indenté, y compris tout filtre ou lien. Dans ce cas, les tables sont jointes.

L’exemple suivant illustre un jeu de données contenant deux éléments de données imbriqués. Le premier élément de données est associé à la table Client, et le deuxième à la table Ligne vente :

    dataset
    {
        dataitem(Customer;Customer)
        {
            dataitem("Sales Line";"Sales Line")
            {
                DataItemLinkReference = Customer;
                DataItemLink =  "Bill-to Customer No." = field("No.");
            }
        }
    }

Ce concept ressemble à une boucle FOR imbriquée. Par exemple, si la table Ligne vente est ajoutée en tant qu’élément de données dans l’élément de données de la table Client, l’état lit le premier client, puis les informations ligne vente pertinentes pour ce client, avant de passer au client suivant.

Les propriétés DataItemLinkReference et DataItemLink sont associées à chaque élément de données. Elles définissent une relation principale/détaillée entre deux tables.

Dans la propriété DataItemLinkReference d’un élément de données, sélectionnez l’élément de données parent à associer (l’élément de données doit faire partie de l’élément de données parent). Après avoir indiqué la valeur DataItemLinkReference, utilisez la propriété DataItemLink pour indiquer un champ de chaque élément de données sur lequel baser le lien. Dans la propriété DataItemLink de l’élément de données indenté, indiquez un lien pour cet élément de données en mettant en correspondance les champs de cet élément de données avec les champs de l’élément de données parent.

L’exemple précédent illustre l’utilisation de cette propriété. Dans l’exemple se trouvent deux éléments de données : parent et enfant. L’élément de données parent est une liste de clients appelée Client. L’élément de données enfant comporte un enregistrement de toutes les commandes vente. Dans la table Client, la clé primaire est le numéro client stocké dans le champ . Dans la table contenant les données de vente, chaque enregistrement comporte ce numéro client en tant que clé étrangère dans le champ N° client facturé. Vous pouvez définir la valeur de la propriété DataItemLinkReference de l’élément de données enfant sur l’élément de données parent. De plus, vous pouvez définir la propriété DataItemLink de l’élément de données enfant sur la valeur suivante :

"Bill-to Customer No." = field("No.");

Vous disposez désormais d’un filtre sur les enregistrements de l’élément de données enfant. Ce filtre affiche uniquement les enregistrements relatifs à l’enregistrement client actuellement sélectionné.

Si vous omettez la propriété DataItemLink, les deux tables sont associées à l’aide d’une jointure croisée. Autrement dit, tous les enregistrements du premier élément de données sont associés à tous les enregistrements du second. Tentez d’éviter cette situation, car elle associera les enregistrements des deux tables qui ne sont pas liés d’un point de vue commercial.

La propriété PrintOnlyIfDetail indique s’il faut imprimer les données dans un état pour l’élément de données parent lorsque l’élément de données enfant ne génère pas de sortie. (correspond à une jointure gauche ou interne)

Cette propriété n’a aucun effet sur un élément de données qui n’a aucun élément de données enfant. Si cette propriété est false et qu’aucun enregistrement n’existe dans l’élément de données enfant correspondant à l’enregistrement actuel dans l’élément de données parent, l’état imprime les données de l’enregistrement actuel dans l’élément de données parent, même s’il n’existe aucune donnée pour l’élément de données enfant. Si cette propriété est true et qu’aucun enregistrement n’existe dans l’élément de données enfant correspondant à l’enregistrement actuel dans l’élément de données parent, l’état n’imprime pas les données de l’enregistrement actuel dans l’élément de données parent. S’il existe plus de deux éléments de données, l’état itère dans chaque relation parent-enfant de la même manière.

Dans l’exemple suivant, la propriété PrintOnlyIfDetail a été définie sur l’élément de données Client :

        dataitem(Customer; Customer)
        {
            PrintOnlyIfDetail = true;
            dataitem("Sales Line"; "Sales Line")
            {
                DataItemLinkReference = Customer;
                DataItemLink = "Bill-to Customer No." = field("No.");
            }
        }

Par conséquent, lorsqu’un enregistrement client est extrait de la table Client et s’il n’existe aucune ligne vente associée pour ce client, l’enregistrement client n’est pas ajouté au jeu de données. Vous pouvez envisager de définir la propriété PrintOnlyIfDetail sur true, ce qui est similaire à l’implémentation d’une JOINTURE INTERNE dans une requête SQL. Vous pouvez également définir la propriété PrintOnlyIfDetail sur false, qui est la valeur par défaut, ce qui est similaire à l’implémentation d’une JOINTURE EXTERNE GAUCHE dans une requête SQL.

La propriété DataItemTableView définit la clé sur laquelle trier, l’ordre de tri et les filtres pour l’élément de données. Cette propriété est souvent utilisée pour appliquer un filtre sur l’élément de données.

Par exemple, si vous ne souhaitez pas tous les enregistrements de la table Client dans le jeu de données, mais uniquement les clients non bloqués, vous pouvez utiliser le filtre suivant :

        dataitem(Customer; Customer)
        {
            PrintOnlyIfDetail = true;
            DataItemTableView = where(Blocked=filter(false));
        }

La propriété DataItemTableView affecte les situations suivantes :

  • Si vous définissez une clé, l’élément de données n’a pas de raccourci sur la page Requête et les utilisateurs ne peuvent pas sélectionner une clé pour le tri, l’ordre de tri ou les filtres pour l’élément de données.

  • Si vous définissez un ordre de tri, il est utilisé pour l’état, quel que soit l’ordre de tri sélectionné par l’utilisateur sur la page Requête.

  • Si vous définissez un filtre, il ne s’affiche pas sur la page Requête, mais il est utilisé avec tout filtre indiqué par l’utilisateur sur la page Requête.

  • La définition d’un ordre de tri, d’un filtre ou des deux n’empêche pas les utilisateurs de sélectionner un champ de tri sur la page Requête.

Vous pouvez utiliser le raccourci clavier Ctrl+Espace dans Visual Studio Code pour bénéficier d’une vue d’ensemble des propriétés d’élément de données disponibles.

Capture d’écran des propriétés des éléments de données client disponibles.