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

Manipuler les données relatives aux widgets des utilisateurs

0000003151     -      05/04/2023

Les widgets, avec leur taille et leur position, sont stockés dans chaque profil utilisateur dans la colonne WIDGETS de la table USERS. Le contenu est une représentation XML d'un DataSet .net.

Pour appliquer les widgets de l'utilisateur A à l'utilisateur B, il suffit d'exécuter une requête de ce type

declare @widgets varchar(MAX)
select @widgets = widgets from USERS where id='..A...'
update USERS set widgets  = @widgets where id = '... B...'

 

Cette requête offre une lecture facile du contenu XML pour un enregistrement de la table USERS :

SELECT x.value('file[1]','VARCHAR(100)') AS [file],x.value('location[1]/X[1]','smallint') AS [location.X],x.value('location[1]/Y[1]','smallint') AS [location.Y],x.value('className[1]','VARCHAR(100)') AS className,x.value('size[1]/Width[1]','smallint') AS [size.Width],x.value('size[1]/Height[1]','int') AS [size.Height]
FROM @xml.nodes('/NewDataSet/Widgets') as T(x)

 

Cette autre requête permet de visualiser le contenu XML pour tous les enregistrements de la table USERS où ce contenu existe :

select id,nom,x.value('file[1]','VARCHAR(100)') AS [file],x.value('location[1]/X[1]','smallint') AS [location.X],x.value('location[1]/Y[1]','smallint') AS [location.Y],x.value('className[1]','VARCHAR(100)') AS className,x.value('size[1]/Width[1]','smallint') AS [size.Width],x.value('size[1]/Height[1]','int') AS [size.Height]
FROM (select id,nom,CAST(widgets as xml) as xmlcol from USERS where widgets<>'') txml
cross apply txml.xmlcol.nodes('/NewDataSet/Widgets') as T(x)

 

Dans le code C# ci-dessous, on montre comment modifier les widgets de l'utilisateur actif en modifiant le contenu XML de USERS.WIDGETS pour cet utilisateur.

Zoom
string widgets = MercatorUi.Globals.CurrentUserRecord.WIDGETS;
DataTable dt;
if (string.IsNullOrEmpty(widgets))
{
    dt = new DataTable("Widgets");
    dt.Columns.Add("file", typeof(string));
    dt.Columns.Add("location", typeof(System.Drawing.Point));
    dt.Columns.Add("className", typeof(string));
    dt.Columns.Add("size", typeof(System.Drawing.Size));
}
else
{
    DataSet ds = Api.DataSetFromXmlString(widgets);
    dt = ds.Tables[0];
}

// ici on effectue des modifications sur la DataTable dt

string widgetsNew;
if (dt.Rows.Count == 0)
    widgetsNew = "";
else
    widgetsNew = Api.DataTableToXmlString(dt);

using (SqlCommand cmd = new SqlCommand("update USERS set widgets = @widgetsNew where id = @id"))
{
    cmd.Parameters.AddWithValue("@widgetsNew", widgetsNew).SqlDbType = SqlDbType.VarChar;
    cmd.Parameters.AddWithValue("@id", Globals.UserId).SqlDbType = SqlDbType.Char;
    Api.SqlExec(MercatorUi.Globals.RepData, cmd);
}