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.
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);
}