Search code examples
biml

BIML Nested For loop Container


I'm trying to nest a forloop container within another. I keep getting error that child element is not allowed.

How do I nest for loop?

 <ForLoop Name="For loop for Year">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="Find count of rows.Output" SsisName="No data exist" PathAnnotation="ConstraintName" EvaluationOperation="Expression" EvaluationValue="Success" Expression="@[User::CountRows]==0" />
                        </Inputs>
                    </PrecedenceConstraints>
                    <InitializerExpression>@StartYear</InitializerExpression>
                    <LoopTestExpression><![CDATA[@StartYear <= @EndYear]]></LoopTestExpression>
                    <CountingExpression><![CDATA[@StartYear = @StartYear + 1]]></CountingExpression>
                        <ForLoop Name="For loop for Month"> 
                            <InitializerExpression>@StartMonth</InitializerExpression>
                            <LoopTestExpression><![CDATA[@StartMonth <= @EndMonth]]></LoopTestExpression>
                            <CountingExpression>@StartMonth = @StartMonth + 1</CountingExpression>
                        </ForLoop>
                </ForLoop>


Solution

  • A ForLoop is a member of the Tasks collection. You have specified that your inner ForLoop is a member of the outer ForLoop. Instead, it should be a member of the outer ForLoop's Task collection.

    Thus

    <Biml xmlns="http://schemas.varigence.com/biml.xsd">
        <Packages>
            <Package Name="so_46415142">
                <Variables>
                    <Variable Name="StartYear" DataType="Int32">2014</Variable>
                    <Variable Name="EndYear" DataType="Int32">2014</Variable>
                    <Variable Name="StartMonth" DataType="Int32">1</Variable>
                    <Variable Name="EndMonth" DataType="Int32">6</Variable>
                </Variables>
                <Tasks>
                    <ForLoop Name="For loop for Year">
                        <!--
                        <PrecedenceConstraints>
                            <Inputs>
                                <Input OutputPathName="Find count of rows.Output" SsisName="No data exist" PathAnnotation="ConstraintName" EvaluationOperation="Expression" EvaluationValue="Success" Expression="@[User::CountRows]==0" />
                            </Inputs>
                        </PrecedenceConstraints>
                        -->
                        <InitializerExpression>@StartYear</InitializerExpression>
                        <LoopTestExpression><![CDATA[@StartYear <= @EndYear]]></LoopTestExpression>
                        <CountingExpression><![CDATA[@StartYear = @StartYear + 1]]></CountingExpression>
                        <Tasks>
                            <ForLoop Name="For loop for Month">
                                <InitializerExpression>@StartMonth</InitializerExpression>
                                <LoopTestExpression><![CDATA[@StartMonth <= @EndMonth]]></LoopTestExpression>
                                <CountingExpression>@StartMonth = @StartMonth + 1</CountingExpression>
                            </ForLoop>
                        </Tasks>
                    </ForLoop>
                </Tasks>
            </Package>
        </Packages>
    </Biml>