Understanding Macros

From Lianjapedia
Jump to: navigation, search

Lianja makes extensive use of { expression } macros which are substituted dynamically.

These can be specified in many of the UI attributes when building Apps.

  • Page headers
  • Page footers
  • Section headers
  • Section footers
  • As part of the URL to any WebViews or sidebar gadgets
  • In Validation expressions
  • In validation error messages
  • In filter expressions
  • In SQL statements
  • FormItem/Field/Gadget captions
  • Data binding controlsource
  • + many more

The use of {expression} macros is very effective in NoCode App development.

In their simplest use just put { expression } anywhere you want a dynamic value to be substituted.

{customers.customerid}

Any expression can be substituted.

{sqllookup("southwind!employees","lastname","'{customers.empid}'","employeeid")}

When used in conjunction with {...} macros, Dialog Panels can display dynamic context sensitive content. This is the JavaScript code used to display a Google map for the customer currently being displayed in the form. It is called by clicking or touching on the "Customer Location" button in the footer menu:

Lianja.showDialogPanel("CUSTOMER LOCATION", 
    "lib:/showdialog_map.rsp?address={customers.address}
                +{customers.city}+{customers.country}", 500);

Uinav17.png

Just as you can use {expression} macros in the Lianja Desktop Client you can also use these in your Web and Mobile Apps. The following JavaScript examples show you how to use macros. You use this this same notation in desktop Apps.

Lianja.evaluate("calculateCustomerBalance('{cust.name}’)",
    function(result)
    {
        Lianja.getElementByID("mypage.mysection.myfield").text = result;
    },
    function(errormessage)
    {
        Lianja.showErrorMessage("Failed to calculate customer balance");
    }
);
// execution continues before the result is returned

Macros are evaluated from left to right:

Lianja.evaluate("calculateCustomerBalance('{customers.name}','{customers.id}’)",
    function(result)
    {
        Lianja.getElementByID("mypage.mysection.myfield").text = result;
    },
    function(errormessage)
    {
        Lianja.showErrorMessage("Failed to calculate customer balance");
    }
);
// execution continues before the result is returned

Macros can be nested so that the inner macros are evaluated before the outer macros. This provides the ability to query information from the server and have that information substituted into another call to the server.

Lianja.evaluate("calculateCustomerBalance('{customers.name}'," + "{getCustomerID('{{customers.custid}}')}")),
    function(result)
    {
        Lianja.getElementByID("mypage.mysection.myfield").text = result;
    },
    function(errormessage)
    {
        Lianja.showErrorMessage("Failed to calculate customer balance");
    }
);
// execution continues before the result is returned

This will result in the following macro substitutions being performed in this order.

 {{customers.custid}} lets call this result3
 {customers.name} let's call this result1
 {getCustomerID("result3")} let's call this result2
 Lianja.evaluate("calculateCustomerBalance('result1', "result2")

Bear in mind that you can specify validation expressions that use {...} macros and also use {} to be substituted for the current value of the UI control being validated.

One thing interesting about macro substitution in the web/mobile client is that if the {expression} cannot be evaluated on the client it will be evaluated on the server. This provides the ability to call server-side Lianja/VFP procedures transparently.