Par défaut, en ce qui concerne les signalétiques, MercatorPenguin ne peut modifier que le record de la table de base du signalétique. Il n'a pas la possibilité d'agir sur les tables enfants (TARCLi, ARTFOU, TACTSIG, ...) Il est toutefois simple de contourner cette limite. Dans l'exemple qui suit, nous montrons comment associer trois contacts à une fiche de prospect. Ces contacts seront bien stockés dans le signalétique des contacts et liés à la fiche du prospect. Les données de contact sont limitées au nom et à l'adresse email. Le principe peut toutefois être étendu à davantage de contacts et d'autres colonnes de la table TACT.
L'accès vers les prospects en modification se fait au départ d'un bundle repris dans le fichier zip ci-dessous : Liste des prospects.pngb.
Le paramétrage de l'écran de modification des prospects se fait via "Outils / Ecrans Signalétiques / Penguin / Prospects". Il faut y coller le contenu de prospects.xaml. Il faut noter que ce paramétrage fait référence à des champs t_nom1, t_email1, t_nom2, t_email2, t_nom3 et t_email3 qui ne font pas partie de la table XLEAD. Ces colonnes sont en effet ajoutées par le customizer SigXlead repris ci-dessous.
Ce customizer implémente tout d'abord l'interface MercatorUi.ICustomizers.IStringUpdater afin de modifier la requête SQL qui sera exécutée par Mercator pour sélectionner les données de la fiche qui va être envoyée vers l'application mobile. Cette modification de requête SQL va s'appliquer 3 fois :
- lors de la lecture des données qui doivent être mises à disposition de MercatorPenguin
- au moment de la sauvegarde,
- s'il s'agit d'un prospect existant, afin de reprendre les données de cette fiche
- s'il s'agit d'un nouveau prospect, afin d'obtenir une DataRow vide.
A cette requête est toujours passé le paramètre SQL @idSig contenant l'ID de la fiche du prospect en cours de modification ou une chaîne vide s'il s'agit d'un nouveau prospect en cours de création.
Ce customizer implémente aussi MercatorUi.ICustomizers.ISqlCommandUpdaterWithContextInfo, ceci afin d'agir sur la commande SQL de sauvegarde proprement dite. Notez que l'objet d'information de contexte contient la DataRow complète que MercatorPenguinServer s'apprête à sauvegarder dans la table XLEAD. Cette SqlCommand dispose de tous les paramètres SQL correspondant à la structure complète de la table XLEAD (@x_id, @x_nom, @x_cle1, ...) ainsi que @isNew, type bit (boolean) indiquant si on crée une nouvelle fiche ou pas.
Le code de la méthode SqlCommandUpdateWithContextInfo permet d'ajouter les enregistrements nécessaires dans les tables TACT et TACTSIG, correspondant aux informations de contacts contenues dans les colonnes n'existant pas dans la table XLEAD.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
namespace SigXlead
{
public class Customizer : MercatorUi.ICustomizers.IStringUpdater, MercatorUi.ICustomizers.ISqlCommandUpdaterWithContextInfo
{
public string StringUpdate(string s)
{
if (MercatorUi.Globals.IsMercatorPenguinServer)
{
s = @"declare @t_nom1 char(50),@t_nom2 char(50),@t_nom3 char(50)
declare @t_email1 char(50),@t_email2 char(50),@t_email3 char(50)
select top 1 @t_nom1=isnull(t_nom,''),@t_email1=isnull(t_email,'') from TACT inner join TACTSIG on (module='XLEAD') and (id_tact=t_id) where (id_sig=@idSig) order by t_nom
select @t_nom2=isnull(t_nom,''),@t_email2=isnull(t_email,'') from TACT inner join TACTSIG on (module='XLEAD') and (id_tact=t_id) where (id_sig=@idSig) order by t_nom OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
select @t_nom3=isnull(t_nom,''),@t_email3=isnull(t_email,'') from TACT inner join TACTSIG on (module='XLEAD') and (id_tact=t_id) where (id_sig=@idSig) order by t_nom OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
"
+ s.Replace(" from ", ",@t_nom1 as t_nom1,@t_email1 as t_email1,@t_nom2 as t_nom2,@t_email2 as t_email2,@t_nom3 as t_nom3,@t_email3 as t_email3 from ");
}
return s;
}
public void SqlCommandUpdateWithContextInfo(System.Data.SqlClient.SqlCommand cmd, object contextInfo)
{
if (MercatorUi.Globals.IsMercatorPenguinServer)
{
DataRow drSig = (DataRow)contextInfo;
cmd.CommandText += @"
if @isNew=0 delete TACT from TACTSIG where (module='XLEAD') and (id_tact=t_id) and (id_sig=@x_id)
if @t_nom1<>''
begin
declare @t_id1 char(10)
set @t_id1=right(newid(),10)
insert into TACT (t_id,t_nom,t_email,t_langue) values (@t_id1,@t_nom1,@t_email1,'F')
insert into TACTSIG (id_tactsig,module,id_tact,id_sig) values (right(newid(),10),'XLEAD',@t_id1,@x_id)
end
if @t_nom2<>''
begin
declare @t_id2 char(10)
set @t_id2=right(newid(),10)
insert into TACT (t_id,t_nom,t_email,t_langue) values (@t_id2,@t_nom2,@t_email2,'F')
insert into TACTSIG (id_tactsig,module,id_tact,id_sig) values (right(newid(),10),'XLEAD',@t_id2,@x_id)
end
if @t_nom3<>''
begin
declare @t_id3 char(10)
set @t_id3=right(newid(),10)
insert into TACT (t_id,t_nom,t_email,t_langue) values (@t_id3,@t_nom3,@t_email3,'F')
insert into TACTSIG (id_tactsig,module,id_tact,id_sig) values (right(newid(),10),'XLEAD',@t_id3,@x_id)
end";
}
}
}
}
Les écrans dans MercatorPenguin se présentent comme ceci :
A télécharger :
0000002836.zip (4 Kb - 17/02/2020)