USP_DATAFORMTEMPLATE_VIEW_DAILYSALEITEMBUTTONS_2
The load procedure used by the view dataform template "Daily Sale Item Buttons 2"
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | The input ID parameter used to load the fields defined on the form. |
@DATALOADED | bit | INOUT | Output parameter indicating whether or not data was actually loaded. |
@BUTTONS | xml | INOUT | BUTTONS |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_VIEW_DAILYSALEITEMBUTTONS_2
(
@ID uniqueidentifier,
@DATALOADED bit = 0 output,
@BUTTONS xml = null output
)
as
set nocount on;
set @DATALOADED = 1;
declare @CURRENTDATETIMEOFFSET datetimeoffset = sysdatetimeoffset();
declare @CONSTITUENTID uniqueidentifier = (select [CONSTITUENTID] from dbo.[SALESORDER] where [ID] = @ID);
declare @SALESMETHODID uniqueidentifier
select @SALESMETHODID = [ID]
from dbo.[SALESMETHOD]
where [TYPECODE] = 0
declare @CURRENCYSYMBOL nchar(1) = (select CURRENCYSYMBOL from dbo.CURRENCY where ISORGANIZATIONCURRENCY = 1);
/*
Button field description:
The first 5 fields (QUICKBUTTONID, TYPECODE, BUTTONTEXT, ISENABLED, ISGENERIC)
are common to all buttons despite their type.
The next 5 fields are generic string fields that can be used to bring back
any data specific to the function of a particular button type. This is done
to limit the number of fields passed down from a data form load call. The
field lengths are limited to 36 characters since the longest piece of data
is generally a guid. I don't see a case where the data would be anything
other than a byte, boolean, or guid, but if there is need, the field's max
length can be extended.
The last 2 fields (BUTTONORDER, BUTTONSUBORDER) are for ordering the list.
*/
declare @BUTTONTEMPTABLE table
(
QUICKBUTTONID uniqueidentifier,
TYPECODE tinyint,
BUTTONTEXT nvarchar(303),
ISENABLED bit,
ISGENERIC bit,
PARAM1 nvarchar(36),
PARAM2 nvarchar(36),
PARAM3 nvarchar(36),
PARAM4 nvarchar(36),
PARAM5 nvarchar(36),
BUTTONORDER integer,
BUTTONSUBORDER integer
)
-- BEGIN POPULATE TEMP TABLE
-- DAILY ADMISSION
insert into @BUTTONTEMPTABLE
select
[DAILYSALEITEM].[ID],
DAILYSALEITEM.TYPECODE,
dbo.UFN_DAILYSALEITEM_BUILDPROGRAMBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL),
1,
0,
null,
null,
null,
null,
null,
[DAILYSALEITEM].[BUTTONORDER],
null
from dbo.[DAILYSALEITEMPROGRAM]
inner join dbo.[DAILYSALEITEM]
on [DAILYSALEITEM].[ID] = [DAILYSALEITEMPROGRAM].[ID]
inner join dbo.[PROGRAM]
on [DAILYSALEITEMPROGRAM].[PROGRAMID] = [PROGRAM].[ID]
inner join dbo.[PRICETYPECODE]
on [DAILYSALEITEMPROGRAM].[PRICETYPECODEID] = [PRICETYPECODE].[ID]
inner join dbo.[PROGRAMPRICE]
on DAILYSALEITEMPROGRAM.PROGRAMID = [PROGRAMPRICE].[PROGRAMID] and
[DAILYSALEITEMPROGRAM].[PRICETYPECODEID] = [PROGRAMPRICE].[PRICETYPECODEID]
inner join
dbo.PROGRAMSALESMETHOD on PROGRAMSALESMETHOD.PROGRAMID = DAILYSALEITEMPROGRAM.PROGRAMID and PROGRAMSALESMETHOD.SALESMETHODID = @SALESMETHODID
left outer join
dbo.SALESMETHODEXCLUDEDPRICETYPE on SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID = DAILYSALEITEMPROGRAM.PRICETYPECODEID and SALESMETHODEXCLUDEDPRICETYPE.SALESMETHODID = @SALESMETHODID
where
[DAILYSALEITEM].[ISACTIVE] = 1
and [DAILYSALEITEMPROGRAM].[ISDAILYADMISSION] = 1
and [PROGRAM].[ISACTIVE] = 1
and SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID is null
and [PRICETYPECODE].[ACTIVE] = 1
-- DISCOUNT
union all
select
[DAILYSALEITEM].[ID],
DAILYSALEITEM.TYPECODE,
dbo.UFN_DAILYSALEITEM_BUILDDISCOUNTBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL),
1,
0,
null,
null,
null,
null,
null,
[DAILYSALEITEM].[BUTTONORDER],
null
from
dbo.[DAILYSALEITEMDISCOUNT]
inner join
dbo.[DAILYSALEITEM] on [DAILYSALEITEM].[ID] = [DAILYSALEITEMDISCOUNT].[ID]
inner join
dbo.[DISCOUNT] on [DAILYSALEITEMDISCOUNT].[DISCOUNTID] = [DISCOUNT].[ID]
inner join
dbo.DISCOUNTAVAILABILITY on DISCOUNTAVAILABILITY.DISCOUNTID = DAILYSALEITEMDISCOUNT.DISCOUNTID
inner join
dbo.DISCOUNTAVAILABILITYSALESMETHOD on DISCOUNTAVAILABILITYSALESMETHOD.DISCOUNTAVAILABILITYID = DISCOUNTAVAILABILITY.ID and DISCOUNTAVAILABILITYSALESMETHOD.SALESMETHODID = @SALESMETHODID
where
[DAILYSALEITEM].[ISACTIVE] = 1 and
[DISCOUNT].[ISACTIVE] = 1
-- DONATION
union all
select
[DAILYSALEITEM].[ID],
DAILYSALEITEM.TYPECODE,
dbo.UFN_DAILYSALEITEM_BUILDDONATIONBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL),
1,
0,
null,
null,
null,
null,
null,
[DAILYSALEITEM].[BUTTONORDER],
null
from dbo.[DAILYSALEITEMDONATION]
inner join dbo.[DAILYSALEITEM]
on [DAILYSALEITEM].[ID] = [DAILYSALEITEMDONATION].[ID]
inner join dbo.[DESIGNATION]
on [DAILYSALEITEMDONATION].[DESIGNATIONID] = [DESIGNATION].[ID]
where
[DAILYSALEITEM].[ISACTIVE] = 1 and
[DESIGNATION].[ISACTIVE] = 1
-- SCHEDULED PROGRAM
union all
select
[QUICKBUTTONID],
TYPECODE,
case SCHEDULEOPTIONTYPECODE
when 3 then BUTTONTEXTLINE1
else BUTTONTEXTLINE1 + char(10) + BUTTONTEXTLINE2 + char(10) + BUTTONTEXTLINE3
end,
ISONSALE,
0,
SCHEDULEOPTIONTYPECODE,
PROGRAMID,
EVENTID,
ISPREREGISTERED,
PRICETYPECODEID,
[BUTTONORDER],
row_number() over(partition by BUTTONORDER order by [EVENTTIME]) as BUTTONSUBORDER
from (
select
[DAILYSALEITEM].[ID] as [QUICKBUTTONID],
DAILYSALEITEM.TYPECODE,
case DESCRIPTIONFIELD1TYPECODE
when 2 then PROGRAM.NAME
when 3 then PRICETYPECODE.DESCRIPTION
when 4 then @CURRENCYSYMBOL + convert(nvarchar(19),EVENTAVAILABILITY.FACEPRICE)
when 13 then @CURRENCYSYMBOL + convert(nvarchar(19),EVENTAVAILABILITY.FACEPRICE) + ' (' + convert(nvarchar(10),EVENTAVAILABILITY.CAPACITY) + ')'
when 14 then substring(convert(varchar(20), EVENT.STARTDATETIMEWITHOFFSET, 9), 13, 5) + ' ' + substring(convert(varchar(30), EVENT.STARTDATETIMEWITHOFFSET, 9), 25, 2)
when 15 then convert(nvarchar(10),convert(integer,EVENTAVAILABILITY.CAPACITY))
when 16 then convert(nvarchar(10), EVENT.STARTDATE)
when 17 then EVENTAVAILABILITY.LOCATION
when 18 then EVENT.NAME
else DESCRIPTIONFIELD1
end BUTTONTEXTLINE1,
case DESCRIPTIONFIELD2TYPECODE
when 2 then PROGRAM.NAME
when 3 then PRICETYPECODE.DESCRIPTION
when 4 then @CURRENCYSYMBOL + convert(nvarchar(19),EVENTAVAILABILITY.FACEPRICE)
when 13 then @CURRENCYSYMBOL + convert(nvarchar(19),EVENTAVAILABILITY.FACEPRICE) + ' (' + convert(nvarchar(10),EVENTAVAILABILITY.CAPACITY) + ')'
when 14 then substring(convert(varchar(20), EVENT.STARTDATETIMEWITHOFFSET, 9), 13, 5) + ' ' + substring(convert(varchar(30), EVENT.STARTDATETIMEWITHOFFSET, 9), 25, 2)
when 15 then convert(nvarchar(10),convert(integer,EVENTAVAILABILITY.CAPACITY))
when 16 then convert(nvarchar(10), EVENT.STARTDATE)
when 17 then EVENTAVAILABILITY.LOCATION
when 18 then EVENT.NAME
else DESCRIPTIONFIELD2
end BUTTONTEXTLINE2,
case DESCRIPTIONFIELD3TYPECODE
when 2 then PROGRAM.NAME
when 3 then PRICETYPECODE.DESCRIPTION
when 4 then @CURRENCYSYMBOL + convert(nvarchar(19),EVENTAVAILABILITY.FACEPRICE)
when 13 then @CURRENCYSYMBOL + convert(nvarchar(19),EVENTAVAILABILITY.FACEPRICE) + ' (' + convert(nvarchar(10),EVENTAVAILABILITY.CAPACITY) + ')'
when 14 then substring(convert(varchar(20), EVENT.STARTDATETIMEWITHOFFSET, 9), 13, 5) + ' ' + substring(convert(varchar(30), EVENT.STARTDATETIMEWITHOFFSET, 9), 25, 2)
when 15 then convert(nvarchar(10),convert(integer,EVENTAVAILABILITY.CAPACITY))
when 16 then convert(nvarchar(10), EVENT.STARTDATE)
when 17 then EVENTAVAILABILITY.LOCATION
when 18 then EVENT.NAME
else DESCRIPTIONFIELD3
end BUTTONTEXTLINE3,
[EVENT].[STARTTIME] as [EVENTTIME],
-- It is on sale and it's not sold out
case EVENTAVAILABILITY.CAPACITY
when 0 then 0
else EVENTAVAILABILITY.ISONSALE
end as ISONSALE,
[DAILYSALEITEMPROGRAM].[SCHEDULEOPTIONTYPECODE],
PROGRAM.ID PROGRAMID,
EVENT.ID EVENTID,
[PROGRAM].[ISPREREGISTERED],
PRICETYPECODE.ID PRICETYPECODEID,
[DAILYSALEITEM].[BUTTONORDER]
from
dbo.UFN_DAILYSALEITEM_EVENT_GETAVAILABILITY_2(@CURRENTDATETIMEOFFSET, @SALESMETHODID) as EVENTAVAILABILITY
inner join
dbo.[DAILYSALEITEMPROGRAM] with (nolock) on DAILYSALEITEMPROGRAM.ID = EVENTAVAILABILITY.DAILYSALESITEMID
inner join
dbo.[DAILYSALEITEM] with (nolock) on [DAILYSALEITEM].[ID] = EVENTAVAILABILITY.DAILYSALESITEMID
inner join
dbo.[PROGRAM] with (nolock) on [DAILYSALEITEMPROGRAM].[PROGRAMID] = [PROGRAM].[ID]
inner join
dbo.[PRICETYPECODE] with (nolock) on [DAILYSALEITEMPROGRAM].[PRICETYPECODEID] = [PRICETYPECODE].[ID]
inner join
dbo.[EVENT] with (nolock) on EVENTAVAILABILITY.EVENTID = [EVENT].ID
where
[DAILYSALEITEMPROGRAM].[SCHEDULEOPTIONTYPECODE] in (1, 2) and -- One button for each time, One button for the next available time
[DAILYSALEITEM].[ISACTIVE] = 1 and
[PRICETYPECODE].[ACTIVE] = 1 and
[PROGRAM].[ISACTIVE] = 1
union all
select
[DAILYSALEITEM].[ID] as [QUICKBUTTONID],
DAILYSALEITEM.TYPECODE,
dbo.UFN_DAILYSALEITEM_BUILDPROGRAMBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL) BUTTONTEXTLINE1,
null as BUTTONTEXTLINE2,
null as BUTTONTEXTLINE3,
null as [EVENTTIME],
ISONSALETEST.ISONSALE,
3 [SCHEDULEOPTIONTYPECODE],
PROGRAM.ID PROGRAMID,
null as EVENTID,
[PROGRAM].[ISPREREGISTERED],
PRICETYPECODE.ID PRICETYPECODEID,
[DAILYSALEITEM].[BUTTONORDER]
from dbo.[DAILYSALEITEMPROGRAM]
inner join dbo.[DAILYSALEITEM]
on [DAILYSALEITEM].[ID] = [DAILYSALEITEMPROGRAM].[ID]
inner join dbo.[PROGRAM]
on [DAILYSALEITEMPROGRAM].[PROGRAMID] = [PROGRAM].[ID]
inner join dbo.[PROGRAMPRICE]
on [PROGRAM].[ID] = [PROGRAMPRICE].[PROGRAMID] and
[DAILYSALEITEMPROGRAM].[PRICETYPECODEID] = [PROGRAMPRICE].[PRICETYPECODEID]
inner join dbo.[PRICETYPECODE]
on [DAILYSALEITEMPROGRAM].[PRICETYPECODEID] = [PRICETYPECODE].[ID]
left outer join
dbo.SALESMETHODEXCLUDEDPRICETYPE on SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID = DAILYSALEITEMPROGRAM.PRICETYPECODEID and SALESMETHODEXCLUDEDPRICETYPE.SALESMETHODID = @SALESMETHODID
outer apply (
-- Bringing this query inline seems to keep from having index scans
select
case when exists (
select
*
from
dbo.EVENT
inner join
dbo.EVENTSALESMETHOD on EVENTSALESMETHOD.EVENTID = EVENT.ID and EVENTSALESMETHOD.SALESMETHODID = @SALESMETHODID
inner join
dbo.PROGRAMSALESMETHOD on PROGRAMSALESMETHOD.PROGRAMID = EVENT.PROGRAMID and PROGRAMSALESMETHOD.SALESMETHODID = @SALESMETHODID
where
EVENT.PROGRAMID = PROGRAM.ID
and EVENTSALESMETHOD.ONSALEDATETIMEWITHOFFSET <= @CURRENTDATETIMEOFFSET
and EVENT.STARTDATETIMEWITHOFFSET >
case PROGRAMSALESMETHOD.ONSALEENDTYPECODE
when 0 then -- Event start time
@CURRENTDATETIMEOFFSET
when 1 then -- Minutes before start
dateadd(minute, PROGRAMSALESMETHOD.ONSALEENDINTERVAL, @CURRENTDATETIMEOFFSET)
when 2 then -- Hours before start
dateadd(hour, PROGRAMSALESMETHOD.ONSALEENDINTERVAL, @CURRENTDATETIMEOFFSET)
when 3 then -- Minutes after start
dateadd(minute, -PROGRAMSALESMETHOD.ONSALEENDINTERVAL, @CURRENTDATETIMEOFFSET)
end
) then 1
else 0
end as ISONSALE
) as ISONSALETEST
where
[DAILYSALEITEMPROGRAM].[SCHEDULEOPTIONTYPECODE] = 3 and
[DAILYSALEITEM].[ISACTIVE] = 1 and
[PRICETYPECODE].[ACTIVE] = 1 and
SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID is null and
[PROGRAM].[ISACTIVE] = 1
) as [SCHEDULEDPROGRAMS]
-- EVENT REGISTRATION
insert into @BUTTONTEMPTABLE
select
[DAILYSALEITEM].[ID],
DAILYSALEITEM.TYPECODE,
dbo.UFN_DAILYSALEITEM_BUILDEVENTREGISTRATIONBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL),
1,
0,
EVENT.ID,
DAILYSALEITEMEVENTREGISTRATION.EVENTPRICEID,
null,
null,
null,
[DAILYSALEITEM].[BUTTONORDER],
null
from dbo.[DAILYSALEITEMEVENTREGISTRATION]
inner join dbo.[DAILYSALEITEM]
on [DAILYSALEITEM].[ID] = [DAILYSALEITEMEVENTREGISTRATION].[ID]
inner join dbo.[EVENT]
on [DAILYSALEITEMEVENTREGISTRATION].[EVENTID] = [EVENT].[ID]
where
[DAILYSALEITEM].[ISACTIVE] = 1 and [EVENT].[ISACTIVE] = 1
-- COMBINATION
union all
select
[DAILYSALEITEM].[ID],
DAILYSALEITEM.TYPECODE,
dbo.UFN_DAILYSALEITEM_BUILDCOMBINATIONBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL),
1,
0,
PRICETYPECODE.ID,
COMBINATION.ID,
null,
null,
null,
[DAILYSALEITEM].[BUTTONORDER],
null
from dbo.[DAILYSALEITEMCOMBINATION]
inner join dbo.[DAILYSALEITEM]
on [DAILYSALEITEM].[ID] = [DAILYSALEITEMCOMBINATION].[ID]
inner join dbo.[COMBINATION]
on [DAILYSALEITEMCOMBINATION].[COMBINATIONID] = [COMBINATION].[ID]
inner join dbo.[COMBINATIONPRICETYPE]
on [COMBINATION].[ID] = [COMBINATIONPRICETYPE].[COMBINATIONID]
inner join dbo.[PRICETYPECODE]
on [COMBINATIONPRICETYPE].[PRICETYPECODEID] = [PRICETYPECODE].[ID] and
[DAILYSALEITEMCOMBINATION].[PRICETYPECODEID] = [PRICETYPECODE].[ID]
left outer join
dbo.SALESMETHODEXCLUDEDPRICETYPE on SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID = [DAILYSALEITEMCOMBINATION].[PRICETYPECODEID] and SALESMETHODEXCLUDEDPRICETYPE.SALESMETHODID = @SALESMETHODID
where
[PRICETYPECODE].[ACTIVE] = 1 and
SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID is null and
-- Combination level check
[COMBINATION].[ISACTIVE] = 1 and
dbo.UFN_COMBINATION_AVAILABLEFORORDER([COMBINATION].[ID], @SALESMETHODID) = 1 and
dbo.UFN_COMBINATION_ELIGIBLEFORORDER([COMBINATION].[ID], @CONSTITUENTID) = 1 and
[DAILYSALEITEM].[ISACTIVE] = 1
-- MEMBERSHIP (User Configured)
union all
select
[DAILYSALEITEM].[ID],
[DAILYSALEITEM].[TYPECODE],
dbo.UFN_DAILYSALEITEM_BUILDMEMBERSHIPBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL),
1,
0,
--4.25.12 Activating pending memberships no longer exists in sales
'00000000-0000-0000-0000-000000000000' as INITIALMEMBERSHIPID,
[MEMBERSHIPPROGRAM].[ID],
[MEMBERSHIPLEVEL].[ID],
DAILYSALEITEMMEMBERSHIP.MEMBERSHIPLEVELTERMID,
coalesce(DAILYSALEITEMMEMBERSHIP.MEMBERSHIPLEVELTYPECODEID,'00000000-0000-0000-0000-000000000000'),
[DAILYSALEITEM].[BUTTONORDER],
null
from dbo.[DAILYSALEITEMMEMBERSHIP]
inner join dbo.[DAILYSALEITEM]
on [DAILYSALEITEM].[ID] = [DAILYSALEITEMMEMBERSHIP].[ID]
inner join dbo.[MEMBERSHIPPROGRAM]
on [DAILYSALEITEMMEMBERSHIP].[MEMBERSHIPPROGRAMID] = [MEMBERSHIPPROGRAM].[ID]
inner join dbo.[MEMBERSHIPLEVEL]
on [DAILYSALEITEMMEMBERSHIP].[MEMBERSHIPLEVELID] = [MEMBERSHIPLEVEL].[ID]
where
[DAILYSALEITEM].[ISACTIVE] = 1 and
[MEMBERSHIPPROGRAM].[ISACTIVE] = 1 and
[MEMBERSHIPLEVEL].[ISACTIVE] = 1 and
--Check that the membership program does allow multiple memberships if the member already has an active membership for that program
not exists (
select *
from dbo.[MEMBER]
inner join dbo.[MEMBERSHIP]
on [MEMBER].[MEMBERSHIPID] = [MEMBERSHIP].[ID]
where
[MEMBER].[CONSTITUENTID] = @CONSTITUENTID and
[MEMBERSHIPPROGRAM].[ALLOWMULTIPLEMEMBERSHIPS] = 0 and
[MEMBERSHIP].[MEMBERSHIPPROGRAMID] = [MEMBERSHIPPROGRAM].[ID] and
[MEMBER].[ISDROPPED] = 0
--4.25.12 No existing memberships are supported through the membership buttons these days
-- and [MEMBERSHIP].[STATUSCODE] in (0,1)
)
-- MEMBERSHIP PROMOTION
union all
select
[DAILYSALEITEM].[ID],
DAILYSALEITEM.TYPECODE,
dbo.UFN_DAILYSALEITEM_BUILDMEMBERSHIPPROMOBUTTONTEXT(DAILYSALEITEM.ID, @CURRENCYSYMBOL),
1,
0,
MEMBERSHIPPROMO.ID,
null,
null,
null,
null,
[DAILYSALEITEM].[BUTTONORDER],
null
from dbo.[DAILYSALEITEMMEMBERSHIPPROMO]
inner join dbo.[DAILYSALEITEM]
on [DAILYSALEITEM].[ID] = [DAILYSALEITEMMEMBERSHIPPROMO].[ID]
inner join dbo.[MEMBERSHIPPROMO]
on [DAILYSALEITEMMEMBERSHIPPROMO].[MEMBERSHIPPROMOID] = [MEMBERSHIPPROMO].[ID]
where
[DAILYSALEITEM].[ISACTIVE] = 1 and
[MEMBERSHIPPROMO].[ISACTIVE] = 1
-- GENERIC
union all
select
null,
TYPECODE,
TYPE + '...',
1,
1,
null,
null,
null,
null,
null,
BUTTONORDER,
null
from
dbo.UFN_DAILYSALESGENERICACTION_GETGENERICBUTTONS(0)
where
(TYPECODE in (2, 5, 9)) or -- 2: memberships, 5: event registrations, 9: scan tickets
((TYPECODE = 6) and exists(select * from dbo.MERCHANDISEPRODUCT where ISACTIVE = 1)) or -- 6: merchandise
((TYPECODE = 8) and dbo.UFN_SALESORDER_PATRONHASUPGRADE(@ID) = 1) or -- 8: mid-term upgrade
(
(TYPECODE = 3) and -- 3: discounts and promos
(
exists(select * from dbo.DISCOUNT where APPLICATIONTYPECODE <> 0 and ISACTIVE = 1) or
exists(select * from dbo.MEMBERSHIPPROMO where ISACTIVE = 1)
)
) or
(
(TYPECODE = 1) and -- 1: scheduled programs
exists (
select *
from dbo.EVENT
where
EVENT.PROGRAMID is not null
and EVENT.STARTDATETIMEWITHOFFSET >= @CURRENTDATETIMEOFFSET
)
)
-- END POPULATE TEMP TABLE
set @BUTTONS = (
select
QUICKBUTTONID,
TYPECODE,
BUTTONTEXT,
ISENABLED,
ISGENERIC,
PARAM1,
PARAM2,
PARAM3,
PARAM4,
PARAM5
from @BUTTONTEMPTABLE
order by BUTTONORDER, BUTTONSUBORDER asc
for xml raw ('ITEM'), type, elements, root('BUTTONS'), BINARY BASE64
)
return 0;