U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Manipuleren van gebruikerswidget-gegevens

0000003151     -      05-04-2023

De widgets, met hun grootte en positie, worden in elk gebruikersprofiel opgeslagen in de kolom WIDGETS van de tabel USERS. De inhoud is een XML-weergave van een .net DataSet.

Om de widgets van gebruiker A toe te passen op gebruiker B, hoef je alleen maar een verzoek van dit type uit te voeren

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

 

Met deze query kan de XML-inhoud van een record in de tabel USERS gemakkelijk worden gelezen:

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)

 

Deze andere query geeft de XML-inhoud weer voor alle records in de tabel USERS waar die inhoud bestaat:

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)

 

In de onderstaande C#-code laten we zien hoe we de widgets van de actieve gebruiker kunnen wijzigen door de XML-inhoud van USERS.WIDGETS voor die gebruiker aan te passen.

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];
}

// hier brengen we wijzigingen aan in de 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);
}