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

Installer une relation supplémentaire dans la base de données

0000002931     -      09/09/2019

La base de données de Mercator est ouverte. Dès lors, il est possible de la modifier afin de satisfaire à des besoins métiers non prévus en standard ; ceux-ci requérant par exemple des contraintes supplémentaires. Nous montrons ici comment ajouter une relation (foreign key) entre LIGNES_V (lignes de vente de la gestion commerciale) et DEST (4ème signalétique).

Par défaut, cette relation LIGNES_V.ID_DESTIN -> DEST.D_ID n'existe pas dans la base de données de Mercator. Cela signifie que LIGNES_V.ID_DESTIN pourra être vide ou contenir une valeur qui n'existe pas en tant qu'identifiant dans la table DEST. Ce comportement doit être modifié afin que Mercator utilise null lors de la sauvegarde d'un document de la gestion commerciale pour toutes les lignes qui ne contiennent pas une valeur dans LIGNES_V.ID_DESTIN.

Ce script SQL met en place cette relation.

exec SP_ALTER_COLUMN 'LIGNES_V','ID_DESTIN','char(10) null'
exec SP_ALTER_COLUMN_DROP_DEFAULT 'LIGNES_V','ID_DESTIN'
update LIGNES_V set id_destin=null where id_destin=''
/* update LIGNES_V set id_destin=null where not exists(select * from DEST where d_id=id_destin) */
alter table dbo.LIGNES_V add constraint FK_LIGNES_V_DEST FOREIGN KEY (id_destin) references dest (d_id)

L'avant-dernière ligne est en commentaire. Elle sert à supprimer les valeurs sans correspondance.

Lors de la sauvegarde d'un document, Mercator détectera dans la structure de la base de données SQL que le champ ID_DESTIN accepte null, qu'il est de type caractère et qu'il n'est pas associé à une valeur par défaut. Comme ces trois conditions sont remplies, Mercator remplacera automatiquement les valeurs vides par null.

Remarque importante : il est important de modifier les requêtes des rapports éventuels qui feraient référence à cette relation et qui utiliseraient ce type de syntaxe :

where lignes_v.id_destin = '' 

car cette condition n'est pas équivalente à

where lignes_v.id_destin is null

 

A ce stade du développement, seuls les champs de LIGNES_V/A sont remplacés automatiquement par null lorsque les 3 conditions décrites ci-dessus sont satisfaites.