Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Nouveaux accesseurs typés de Mercator 10.1

0000002734     -      09/08/2019

Mercator 10.1 contient des nouveaux accesseurs, qui vont considérablement alléger la programmation de customizers. Ces accesseurs permettent d'utiliser des classes typées, correspondant à la structure de la base de données SQL de Mercator, à la place de certaines DataTables et DataRows.

1. System.Data.DataRow -> MercatorDatabase.Record

Zoom
// avant
billingEngine.PIEDS["VCS"] = "+++604/3557/70761+++";
double d = Convert.ToDouble(billingEngine.PIEDS["TOT_TTC_DV"]);
// après
billingEngine.PiedsVRecord.VCS = "+++604/3557/70761+++";
double d = billingEngine.PiedsVRecord.TOT_TTC_DV;

Ceci permet un codage plus rapide :

  • Intellisense peut proposer directement le nom des colonnes. Il ne faut donc plus connaître ces noms de colonnes ou les types.
  • Les cast ou conversions ne doivent plus être appliqués.
  • La frappe de [" "] est économisée.

Les nouveaux records sont disponibles à ces endroits :

  • MercatorUi.Globals.CurrentUserRecord : utilisateur en cours
  • SigForm :
    • AnaRecord : enregistrement du compte analytique si le signalétique en cours est celui des comptes analytiques
    • CliRecord : enregistrement du client si le signalétique en cours est celui des clients
    • DestRecord : enregistrement du destinataire (4ème signalétique) si le signalétique en cours est celui des destinataires (4ème signalétique)
    • FouRecord : enregistrement du fournisseur si le signalétique en cours est celui des fournisseurs
    • GenRecord : enregistrement du compte général si le signalétique en cours est celui des comptes généraux
    • ImmRecord :  enregistrement de l'immobilisé si le signalétique en cours est celui des immobilisés
    • ProjRecord :  enregistrement du projet si le signalétique en cours est celui des projets
    • StockRecord :  enregistrement de l'article si le signalétique en cours est celui des articles
    • TactRecord :  enregistrement du contact si le signalétique en cours est celui des contacts
    • XleadRecord : enregistrement du prospect si le signalétique en cours est celui des prospects
    • YprestRecord :  enregistrement du prestataire si le signalétique en cours est celui des prestataires
  • BillingEngine :
    • PiedsVRecord : enregistrement du pied, si le document est une vente
    • CliRecord : enregistrement du client, si le document est une vente
    • CliLivRecord : enregistrement du client de livraison, si le document est une vente
    • PiedsARecord : enregistrement du pied, si le document est un achat
    • FouRecord : enregistrement du fournisseur, si le document est un achat
    • SequencRecord : enregistrement de la séquence du document en cours
  • BookingEngine :
    • PiedsCRecord : enregistrement du pied
    • CliRecord : enregistrement du client, si l'écriture est une vente
    • FouRecord : enregistrement du fournisseur, si l'écriture est un achat
    • SequencRecord : enregistrement de la séquence de l'écriture en cours
  • TransferEngine :
    • PiedsDRecord : enregistrement du pied
    • SequencRecord : enregistrement de la séquence du transfert de dépôt en cours
  • InventoryEngine :
    • PiedsDRecord : enregistrement du pied
    • SequencRecord : enregistrement de la séquence de l'inventaire en cours
  • ActionEngine :
    • ActionsRecord : enregistrement de la table ACTIONS pour l'action en cours
    • ActtemplRecord : enregistrement du modèle pour l'action en cours
    • AnaRecord : enregistrement du compte analytique si l'action est associée à un compte analytique
    • CliRecord : enregistrement du client si l'action est associée à un client
    • DestRecord : enregistrement du destinataire (4ème signalétique) si l'action est associée à un destinataire (4ème signalétique)
    • FouRecord : enregistrement du fournisseur si l'action est associée à un fournisseur
    • GenRecord : enregistrement du compte général si l'action est associée à un compte général
    • ImmRecord : enregistrement de l'immobilisé si l'action est associée à un immobilisé
    • ProjRecord : enregistrement du projet si l'action est associée à un projet
    • StockRecord : enregistrement de l'article si l'action est associée à un article
    • TactRecord : enregistrement du contact si l'action est associée à un contact
    • XleadRecord : enregistrement du prospect si l'action est associée à un prospect
    • YprestRecord : enregistrement du prestataire si l'action est associée à un prestataire
  • Dans la plupart des EventArgs, pour des propriétés correspondant à des enregistrements de signalétiques, de pieds ou de lignes.

Utilisation de ces classes dans d'autres situations

Si on souhaite utiliser une classe typée pour accéder au contenu d'une DataRow, il suffit de l'instancier soi-même, en lui passant en paramètre cette DataRow, contenant tous les champs qui seront utilisés par la suite.

Zoom
DataSet ds = Api.Zselect(MercatorUi.Globals.RepData, "select top 1 * from CLI order by c_id");
if ((ds != null) && (ds.Tables[0].Rows.Count >= 1))
{
    Api.TrimEndDataTable(ds.Tables[0]);
    MercatorDatabase.CLI cli = new MercatorDatabase.CLI(ds.Tables[0].Rows[0]);
    string nom = cli.C_NOM;
    ...
}

 

2. System.Data.DataTable -> MercatorDatabase.RecordsCollection

Zoom
// avant
double d1 = 0;
foreach (DataRow dr in billingEngine.LIGNES.Select("sel=1"))
    d1 += Convert.ToDouble(dr["q"]);
// après
double d1 = billingEngine.LignesVRecords.Where(l => l.SEL).Sum(l => l.Q);

Tous les avantages du point 1 sont aussi disponibles ici, puisque le code utilise une collection d'éléments typés, tels que décrits ci-dessus. Par ailleurs, toutes les classes dérivées de MercatorDatabase.RecordsCollection implémentent l'interface IEnumerable<T>. Ceci rend l'utilisation de Linq directement possible.

Les nouvelles RecordsCollections sont disponibles à ces endroits :

  • BillingEngine : 
    • LignesVRecords : les lignes du document en cours
    • LignesV2Records : les lignes du/des documents antérieurs
    • StockRecords : les articles du document en cours
  • BookingEngine : 
    • LignesCRecords : les lignes de la comptabilité générale de l'écriture en cours
    • LignesCanaRecords : les lignes de la comptabilité analytique de l'écriture en cours
  • TransferEngine : 
    • LignesDRecords : les lignes du transfert de dépôt en cours
    • LignesD2Records : les lignes du/des transferts de dépôt antérieurs
  • InventoryEngine : 
    • LignesDRecords : les lignes de l'inventaire en cours
    • LignesD2Records : les lignes du/des inventaires antérieurs

 

3. System.ComponentModel.BindingList<DataRow> -> MercatorDatabase.RecordsCollection2

Dans le prolongement du point 2, les propriétés contenant les pieds des documents d'origine, peuvent être avantageusement exploitées via les nouveaux accesseurs de type MercatorDatabase.RecordsCollection2.

Ceci concerne :

  • BillingEngine : 
    • PiedsV2Records : les pieds du/des documents antérieurs s'il s'agit d'une vente
    • PiedsA2Records : les pieds du/des documents antérieurs s'il s'agit d'un achat
  • TransferEngine : 
    • PiedsD2Records : les pieds du/des transferts de dépôt antérieurs
  • InventoryEngine : 
    • PiedsD2Records : les pieds du/des inventaires antérieurs

Prise en compte de la personnalisation de la base de données de Mercator

Chaque Mercator, ou presque, dispose d'une base de données dont la structure lui est propre. En effet, celle-ci varie selon les options de Mercator, l'ajout de champs optionnels ou personnels, ... En conséquence, il est nécessaire d'adapter les classes contenues dans l'espace de nom MercatorDatabase, afin que ces classes reflètent la structure réelle de la base de données.

Cela se fait via les outils avancés de Mercator : Base de Données SQL / Mettre à Jour Schéma.

Il est donc nécessaire d'exécuter ce point de menu après toute modification de structure de la base de données de Mercator. Du moins, si on souhaite utiliser un accesseur qui pointe vers une colonne nouvellement ajoutée. Une attention particulière sera apportée aux changements de type de colonne ainsi qu'à leur suppression éventuelle, ce qui requiert aussi l'exécution de ce point de menu.

Cette fonctionnalité produit un assembly MercatorDatabase.dll, qui est stocké dans les fichiers SQL / Assemblies. Sa version est automatiquement incrémentée lors de chaque compilation. Son stockage dans les fichiers SQL permet d'automatiser sa distribution. Il sera installé automatiquement lors du prochain démarrage de Mercator.

Le code-source de cet assembly est visible dans l'éditeur de code de Mercator / Onglet C# / "Ouvrir de Base de Données" / "Database". Il n'est cependant pas modifiable et ni compilable à cet endroit.

Remarque importante concernant la gestion multi-dossiers de Mercator : la technologie .net ne permet pas le déchargement d'un assembly de l'AppDomain. Or, lorsqu'un utilisateur change de dossier, il le fait au sein du même AppDomain. Dès lors, il n'est pas possible d'avoir des classes différentes en termes de contenu, mais identiques quant aux noms, dans l'espace de nom MercatorDatabase. En conséquence, si la gestion multi-dossiers est utilisée, il faut appliquer une de ces solutions :

  • harmoniser les structures des bases de données des différents dossiers,
  • générer MercatorDatabase.dll au départ du dossier ayant la base de données la plus complète,
  • utiliser l'ancienne notation, en tout ou en partie.

Il est essentiel de noter que les outils présentés ici ont pour objectif de rendre la programmation autour de Mercator plus confortable et plus rapide. En aucun cas, elle n'est obligatoire. Toutes les anciennes notations restent disponibles sans aucune modification. Il n'est dès lors aucunement nécessaire de réécrire d'anciens customizers.

Si ce type de notation est utilisée en dehors de Mercator (typiquement dans Visual Studio), il est nécessaire d'ajouter une référence vers MercatorDabase.dll, en prenant bien en compte que cette DLL est différente entre chaque dossier.

 

Ajoutez une référence vers MercatorDatabase.dll dans vos projets sous Visual Studio !