Second level drilldowns can be very useful in cases where a critical number is calculated from sub-totaled data, and the details of the sub-total need to be accessible. You can use Output Column property names of the parent drilldown as input parameters for the sub-drilldown.
Follow the steps in Setting Up a Critical Number Drilldown Based on an IDO to create the drilldown. To associate the new drilldown as a sub-drilldown:
The preconfigured Inventory Value critical number is a good example of second level drilldowns for stored procedure-based critical numbers. This critical number shows your whole inventory value, and drills down to a subtotal by inventory. It drills down one step further to item totals or location totals by warehouse.
Follow the steps in Setting Up a Stored Procedure-based Critical Number Drilldown to create the drilldown. To associate the new drilldown as a sub drilldown:
For example, the Inventory Value Detail Drilldown (SSSWBCanInvValDtlSp) accepts Whse in @Parm1, Item in @Parm2, and Location in @Parm3. It is coded to use these values as filters if provided, or ignore them if they are not provided.
When one drilldown calls another, the sub-drilldown automatically pulls these values by column header name from the calling drilldown. For example, the Item Inventory Value Detail drilldown has a Column Heading named Item. When it calls the Inventory Value Detail sub-drilldown, the Item value is passed to the Inventory Value Detail program in @Parm2.
CREATE PROCEDURE SSSWBCanInvValItemDtlSp (
@AsOfDate DateType
, @DrillNum WBDrillNumType
, @CrNum WBCrNumType
, @Id nvarchar(500)
, @Parm1 WBSourceNameType
, @Parm2 WBSourceNameType
, @Parm3 WBSourceNameType
, @Parm4 WBSourceNameType
, @Parm5 WBSourceNameType
, @Parm6 WBSourceNameType
, @Parm7 WBSourceNameType
, @Parm8 WBSourceNameType
, @Parm9 WBSourceNameType
, @Parm10 WBSourceNameType
, @Parm11 WBSourceNameType
, @Parm12 WBSourceNameType
, @Parm13 WBSourceNameType
, @Parm14 WBSourceNameType
, @Parm15 WBSourceNameType
, @Parm16 WBSourceNameType
, @Parm17 WBSourceNameType
, @Parm18 WBSourceNameType
, @Parm19 WBSourceNameType
, @Parm20 WBSourceNameType
, @Parm21 WBSourceNameType
, @Parm22 WBSourceNameType
, @Parm23 WBSourceNameType
, @Parm24 WBSourceNameType
, @Parm25 WBSourceNameType
, @Parm26 WBSourceNameType
, @Parm27 WBSourceNameType
, @Parm28 WBSourceNameType
, @Parm29 WBSourceNameType
, @Parm30 WBSourceNameType
, @Parm31 WBSourceNameType
, @Parm32 WBSourceNameType
, @Parm33 WBSourceNameType
, @Parm34 WBSourceNameType
, @Parm35 WBSourceNameType
, @Parm36 WBSourceNameType
, @Parm37 WBSourceNameType
, @Parm38 WBSourceNameType
, @Parm39 WBSourceNameType
, @Parm40 WBSourceNameType
, @Parm41 WBSourceNameType
, @Parm42 WBSourceNameType
, @Parm43 WBSourceNameType
, @Parm44 WBSourceNameType
, @Parm45 WBSourceNameType
, @Parm46 WBSourceNameType
, @Parm47 WBSourceNameType
, @Parm48 WBSourceNameType
, @Parm49 WBSourceNameType
, @Parm50 WBSourceNameType
) AS
DECLARE
@RowPointer RowPointer
, @TmpAmount AmountType
, @StartItem ItemType
, @EndItem ItemType
DECLARE @ttItemloc TABLE (
RowPointer uniqueidentifier
, item nvarchar(30)
, amount decimal(20,8)
, processed tinyint
)
SET @StartItem = ISNULL(@Parm1, dbo.LowString('ItemType'))
SET @EndItem = ISNULL(@Parm1, dbo.HighString('ItemType'))
INSERT INTO @ttItemloc
SELECT RowPointer, item, 0, 0
FROM itemloc
WHERE item BETWEEN @StartItem AND @EndItem
WHILE EXISTS (SELECT TOP 1 1 FROM @ttItemloc WHERE processed = 0)
BEGIN
SELECT TOP 1 @RowPointer = RowPointer
FROM @ttItemloc
WHERE processed = 0
SET @TmpAmount = 0
EXEC SSSWBCanInvValSubItemlocSp @RowPointer, @TmpAmount OUTPUT
UPDATE @ttItemloc
SET amount = @TmpAmount
, processed = 1
WHERE RowPointer = @RowPointer
END
INSERT INTO #tt_drill_results(
CHAR01, DECI01, amount
)
SELECT item, SUM(amount), SUM(amount)
FROM @ttItemloc
GROUP BY item
UPDATE #tt_drill_results
SET RowPointer = item.RowPointer
FROM #tt_drill_results tt, item
WHERE item.item = tt.CHAR01
RETURN 0
Second
Level Drilldown Program:
CREATE PROCEDURE SSSWBCanInvValDtlSp (
@AsOfDate DateType
, @DrillNum WBDrillNumType
, @CrNum WBCrNumType
, @Id nvarchar(500)
, @Parm1 WBSourceNameType
, @Parm2 WBSourceNameType
, @Parm3 WBSourceNameType
, @Parm4 WBSourceNameType
, @Parm5 WBSourceNameType
, @Parm6 WBSourceNameType
, @Parm7 WBSourceNameType
, @Parm8 WBSourceNameType
, @Parm9 WBSourceNameType
, @Parm10 WBSourceNameType
, @Parm11 WBSourceNameType
, @Parm12 WBSourceNameType
, @Parm13 WBSourceNameType
, @Parm14 WBSourceNameType
, @Parm15 WBSourceNameType
, @Parm16 WBSourceNameType
, @Parm17 WBSourceNameType
, @Parm18 WBSourceNameType
, @Parm19 WBSourceNameType
, @Parm20 WBSourceNameType
, @Parm21 WBSourceNameType
, @Parm22 WBSourceNameType
, @Parm23 WBSourceNameType
, @Parm24 WBSourceNameType
, @Parm25 WBSourceNameType
, @Parm26 WBSourceNameType
, @Parm27 WBSourceNameType
, @Parm28 WBSourceNameType
, @Parm29 WBSourceNameType
, @Parm30 WBSourceNameType
, @Parm31 WBSourceNameType
, @Parm32 WBSourceNameType
, @Parm33 WBSourceNameType
, @Parm34 WBSourceNameType
, @Parm35 WBSourceNameType
, @Parm36 WBSourceNameType
, @Parm37 WBSourceNameType
, @Parm38 WBSourceNameType
, @Parm39 WBSourceNameType
, @Parm40 WBSourceNameType
, @Parm41 WBSourceNameType
, @Parm42 WBSourceNameType
, @Parm43 WBSourceNameType
, @Parm44 WBSourceNameType
, @Parm45 WBSourceNameType
, @Parm46 WBSourceNameType
, @Parm47 WBSourceNameType
, @Parm48 WBSourceNameType
, @Parm49 WBSourceNameType
, @Parm50 WBSourceNameType
) AS
DECLARE
@RowPointer RowPointer
, @Whse WhseType
, @TmpAmount AmountType
, @StartWhse WhseType
, @EndWhse WhseType
, @StartItem ItemType
, @EndItem ItemType
, @StartLoc LocType
, @EndLoc LocType
DECLARE @ttItemloc TABLE (
RowPointer uniqueidentifier
, whse nvarchar(4)
, item nvarchar(30)
, loc nvarchar(15)
, amount decimal(20,8)
, processed tinyint
)
SET @StartWhse = ISNULL(@Parm1, dbo.LowString('WhseType'))
SET @EndWhse = ISNULL(@Parm1, dbo.HighString('WhseType'))
SET @StartItem = ISNULL(@Parm2, dbo.LowString('ItemType'))
SET @EndItem = ISNULL(@Parm2, dbo.HighString('ItemType'))
SET @StartLoc = ISNULL(@Parm3, dbo.LowString('LocType'))
SET @EndLoc = ISNULL(@Parm3, dbo.HighString('LocType'))
INSERT INTO @ttItemloc
SELECT RowPointer, whse, item, loc, 0, 0
FROM itemloc
WHERE whse BETWEEN @StartWhse AND @EndWhse
AND item BETWEEN @StartItem AND @EndItem
AND loc BETWEEN @StartLoc AND @EndLoc
WHILE EXISTS (SELECT TOP 1 1 FROM @ttItemloc WHERE processed = 0)
BEGIN
SELECT TOP 1 @RowPointer = RowPointer
FROM @TTItemloc
WHERE processed = 0
SET @TmpAmount = 0
EXEC SSSWBCanInvValSubItemlocSp @RowPointer, @TmpAmount OUTPUT
UPDATE @ttItemloc
SET amount = @TmpAmount
, processed = 1
WHERE RowPointer = @RowPointer
END
INSERT INTO #tt_drill_results(
CHAR01, CHAR02, CHAR03, DECI01, amount, RowPointer
)
SELECT whse, item, loc, amount, amount, RowPointer
FROM @ttItemloc
RETURN 0
About Critical Number Drilldowns
Setting Up a Critical Number Drilldown Based on a Stored Procedure