<expand>

The <expand> element allows you to expand a <block> of Macro Language code in the calling context, as well as access and modify variables from the outer scope.

Description

The <block> you <expand> must be defined in your current query or in a <library>. A <library> can be defined in your current query or stored as part of a Quick Query. If you need a <block> from a <library> defined outside your current query, you must use <import> to make that library available in your current query. The <expand> element is similar to <insert>, but <expand> can actually modify variables from the outer scope, while <insert> cannot.

Syntax

<expand block="[NAME_OF_BLOCK]" [[VAR_1]="[VALUE_1]"
        [VAR_2]="[VALUE_2]"...
        [VAR_N]="[VALUE_N]"]/>

Attributes

block
Specifies the <block> (code and defined variables) to insert into the current query.

The <expand> tag may take any number of additional attributes, which should match the attributes in the <block> tag that defines the expanded block. The [VALUE] of a [VAR]="[VALUE]" attribute is substituted wherever {@[VAR]} appears within the expanded <block>.

Example

In this example, <expand> captures a variable from the outer scope and modifies it permanently.

<defblock name="query" prefix="">
  <setv name="{@prefix}_var" value="2"/>
</defblock>
<dynamic foo_var="" bar_var="" go="0">
  <do onsubmit_="submit">
	<set go="1"/>
  </do>
  <widget class_="grid" require_="{@go=1}" invmode_="hide" name="foo">
	<expand block="query" prefix="bar"/>
	<willbe name="bar" value="'{@bar_var}'"/>
  </widget>
  <widget class_="button" type_="submit" submit_="submit"/>
  <widget class_="scope" refreshon_="1"/>
</dynamic>

<setv> allows for user-defined variables where one variable's name is determined by another variable. In this example, the name of the variable {@prefix}_var depends on the value of prefix and has a value of 2. When we <expand> the <block> named query, the prefix variable is assigned the value "bar", so the variable name is changed to bar_var and the value is still 2. The <willbe> statement sets the value of the column bar to the variable bar_var. Note that the value of bar below is 2.

By contrast, if you were to use <insert> instead of <expand> for the query block, the block is unable to change the name of the variable in the outer scope. The variable bar_var would remain "" and would not be modified: