<defblock>

A <defblock> is very similar to <block> code, except the Macro Language code associated with a <defblock> will not execute in the macro until it is referenced with an <insert> call.

Description

The contents of a <defblock> are not executed until the <defblock> is called by an <insert> tag within the macro. If <defblock> appears within a <library> tag (in which case you must use <import> to make that library available in your current query), it can be called exactly like a <block> and will be executed at the time it is called.

Syntax

<defblock name="[NAME_OF_DEFBLOCK]" 
 [USER_DEFINED_VAR_1]="[VALUE_1]" ...
          [USER_DEFINED_VAR_N]="[VALUE_N]">
   <note>Macro Language code with parameterized variables goes here</note>
</defblock>

Attributes

name
The name of the <defblock>

The name must begin with an alphabetic character and consist only of alphanumeric characters, digits, and/or underscores. In addition, the name must be unique; that is, no other block in the macro may have the same name.

[USER_DEFINED_VAR_x]
Accepts a string that will act as a user-defined variable. The variable name must begin with a lowercase alphabetic character and consist only of lowercase alphanumeric characters, digits, and/or underscores.

The block element may include any number of additional attributes, which may be used as parameters in the Macro Language code contained within the element. The value of a user-defined variable (e.g., my_var) is substituted wherever a scalar expression containing a reference to it (e.g., {@my_var}) appears within the block element.

Example

In this example, the base table is pub.demo.retail.item. The goal is to force the selection of three separate values for three columns in the table. If any one value is not specified, the <defblock> will return a message asking for the value to be selected.

<base table="pub.demo.retail.item"/>
<defblock name="defblockexample" store_select="" sku_select="" 
 account_select="">
    <switch>
        <case when="{@store_select=''}">
            <signal msg="You must select a store value"/>
        </case>
        <case when="{@sku_select=''}">
            <signal msg="You must select a product"/>
        </case>
        <case when="{@account_select=''}">
            <signal msg="You must select an account"/>
        </case>
        <else>
            <sel value="store={@store_select} & sku={@sku_select} & 
             account={@account_select}"/>
        </else>
    </switch>
</defblock>

<insert block="defblockexample" store_select="3" sku_select="'A96'" 
 account_select="523"/>

In the example above, the <defblock> may appear anywhere within a macro. However, it will not be executed until it is called by an <insert> tag after the <defblock> is defined.