Set focus

Posted: 2017-01-24 in Set focus

you should be able to do a Lianja.GetElementById(“page1.section1.field61”).se tfocus in the Ready Delegate of your section. That will set the initial focus to field61.
Then you should be able to do the same where ever else you want to
shift the focus. Obviously it doesn’t make much sense to change focus in an Interactive Change Delegate (which fires on every key press) unless you only expect a single character to be entered.


Q:
when I open the app, and switch between section1 and section2. If I switch pages focus is not restored.Now if I add a second page (page2), and switch to it and come back to page1, this same code runs but the focus is not set.
A:
The Lianja.get(“page.section”).textbox.setfocus() needs to be in the page.activate() so that it is called when you switch pages.


I’ve got three pages in my App: tsearch, page2 and page3. On tsearch I have 2 Canvas Sections, section1 and section2 and they are in a TabView Section, section3. Section1 and Section2 each have 2 textboxes (section1 has field61 and field12, section2 has field1 and field2). InteractiveChange is set up on field61 and field1 as per your earlier code, they also have a change delegate set up to update a variable then switch to one of the other pages. When you reselect the tsearch page, the variable is used to take you back to the original textbox.

Code:
////////////////////////////////////////////////////////////////
// Event delegate for 'activate' event
proc tsearch_activate()
        if m_wherecalled = "section1"
            Lianja.showdocument("section:section3?action=select&text=section1")
            Lianja.get("tsearch.section1").field61.setfocus()
        else
            Lianja.showdocument("section:section3?action=select&text=section2")
            Lianja.get("tsearch.section2").field1.setfocus()
        endif
        
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'ready' event
proc tsearch_ready()
    Lianja.showdocument("section:section3?action=select&text=section1")
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'init' event
proc tsearch_init()
    public m_wherecalled = "section1"
    public vsearch, vsearch2
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'changed' event
proc tsearch_section2_field1_changed()
    m_wherecalled = "section2"
    Lianja.showdocument("page:page3")
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'interactivechange' event
proc tsearch_section1_field61_interactivechange()
    vsearch = this.text
    Lianja.get("tsearch.section1").field12.text = vsearch
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'ready' event
proc tsearch_section1_ready()
    lianja.get("tsearch.section1").field61.text = " "
    vsearch = " "
    Lianja.get("tsearch.section1").field12.text = vsearch
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'changed' event
proc tsearch_section1_field61_changed()
    m_wherecalled = "section1"
    Lianja.showdocument("page:page2")
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'interactivechange' event
proc tsearch_section2_field1_interactivechange()
    vsearch2 = this.text
    Lianja.get("tsearch.section2").field2.text = vsearch2
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'ready' event
proc tsearch_section2_ready()
    lianja.get("tsearch.section2").field1.text = " "
    vsearch2 = " "
    Lianja.get("tsearch.section2").field2.text = vsearch2
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'activate' event
proc tsearch_section1_activate()
    if Lianja.get("tsearch.section3").activepage = "section1"
        Lianja.get("tsearch.section1").field61.setfocus()
    endif
endproc


////////////////////////////////////////////////////////////////
// Event delegate for 'activate' event
proc tsearch_section2_activate()
    if Lianja.get("tsearch.section3").activepage = "section2"
        Lianja.get("tsearch.section2").field1.setfocus()
    endif
endproc




 

Set

Posted: 2017-01-24 in SET

Q:
If I do a select from a large table in the console and would like to kill it, can I use set escape?
A:
No, the query will need to complete. It is executed in the calling thread and control does not return to the main event loop until it has completed.



SET

Posted: 2017-01-24 in SET

Many of the SET commands work this way – you omit anything after the ‘to’ to set it back to the default.

Code:
set filter to

 



 

SessionStorage

Posted: 2017-01-24 in SessionStorage

Q:
Lianja.sessionStorage.setItem(“aquivo”, “teste”)
Error: Property ‘Sessionstorage’ undefined
A:
This works for me, in desktop and mobile:

Code:
var lo = Lianja.sessionStorage;
lo.setItem("Hank","Fay");
messageBox(lo.getItem("Hank"));

Take my code, put it in the Ready of a page

Case sensitive. sessionStorage is not the same as Sessionstorage in JavaScript.


SAVE and RESTORE DATASESSION are useful especially in WebViews generated by rsp pages. It was however awkward to nest the saving and restoring properly.
So in 2.1 I have added two new commands
PUSH DATASESSION and POP DATASESSION.
These operate in the same way as SAVE and RESTORE DATASESSION but enable pushing and popping data session state (database, tables, and cursor state)
up to 256 levels deep.



SessionStorage

Posted: 2017-01-24 in SessionStorage

In Lianja v2.0 we have made it dramatically easier to share data in real time between multiple Lianja processes running in parallel.

In HTML5 Web/Mobile there is the concept of “localStorage” and “sessionStorage”.

In the Lianja v2.0 Desktop client “sessionStorage” is non persistent data that can be shared across multiple concurrent processes e.g. background processes gathering data from instruments or multiple Lianja windows on the desktop.

Access to data in sessionStorage is handled automatically for you so that concurrent reads, updates and removing of data items is atomic.

You access sessionstorage from the Lianja system object Lianja.sessionStorage.

Properties:

// The number of key/value pairs in sessionStorage
length

Methods:

// These should be quite explanatory
Lianja.sessionStorage.setItem(key, value)
value = Lianja.sessionStorage.getItem(key)
Lianja.sessionStorage.removeItem(key)
Lianja.sessionStorage.clear()

Lianja uses a shared memory segment to maintain sessionStorage.

Lianja will automatically keep the keys and their values consistent between each running process as you reference the items stored in SessionStorage. If you want to keep complex objects as the values for keys then use json_encode() and json_decode() to handle serialization and deserialization of the objects.

Code:
// in the main process App
private myobj = object("name" => "Barry", "company" => "Lianja")
Lianja.setItem("myobj", json_encode(myobj) )

// then in another process that needs to read objects from the main App window
private myobj = json_decode( Lianja.sessionStorage.getItem("myobj") )

Note that each time you call any of the methods or reference the length property the shared sessionStorage will be automatically kept current for you.


Indeed, there is a “Session data changed” delegate and a “Session data changed interval” in App Settings.

Lianja will check for changes in the sessionStorage every #msecs and call the “Section data changed” if any changes in the sessionStorage have been made.

This is fast as a transaction sequence number is kept as part of the sessionStorage so no deserialization of data is required.

There is also a property called “datachanged” and “datachangedinterval” (in milliseconds) so this can be used by non GUI applications (background worker processes etc).


In Lianja v2.0 you also have several new classes that handle custom shared memory access and custom system semaphores.

New “SharedMemory” system class

Code:
m_shareddata = createObject("sharedmemory")

// attach will create the shared memory if it does not exist. Args are the "key" and the "size"
m_shareddata.attach("com.lianja.myshareddata", 64*1024)

// set key/value pairs
m_shareddata.setItem("mykey", somevalue)

// get value
m_value = m_shareddata.getItem("mykey")

New “SystemSemaphore” system class

Code:
m_sem = createObject("SystemSemaphore")

// setKey will create the SystemSemahore if it does not exist. 
m_sem.setKey("com.lianja.mysem")

// acquire exclusive access to a resource across multiple running processes
m_sem.acquire()

// do something...

// release access to the resource m_sem.release

Another interesting use of sessionStorage is the ability to switch between Apps and maintain state or pass data between them.

So when building a large application which is built out of smaller apps and each app is built out of pages you can load apps using Lianja.openApp(“someappname”) and in the “Ready” delegate read some data from sessionStorage that was set using Lianja.sessionStorage.setItem(“mediate”, “some JSON encoded object”) in the parent app that loaded “someappname”.

This technique also works in the Web/Mobile client which also has Lianja.sessionStorage in the framework.



Section

Posted: 2017-01-24 in Section

Use the section.requery() method OR set the section.sql property – not both, e.g.

// section.requery()
// Specify everything after the WHERE (apologies if I misled you on this syntax previously)

Code:
Lianja.get("page1.section2").requery([userid='{Lianja.get("page1.section1.field1").text}'] )

OR
// section.sql
// Specify the full SQL statement

Code:
Lianja.get("page1.section2").sql = [select * from <basetable> where userid='{Lianja.get("page1.section1.field1").text}']

If your current App is failing to load, use the Versions workspace to restore an earlier version of your prg or open the prg in an external editor and comment out the lines (//) of your section.ready() event delegate.


Q:
How to add objects to a custom section
A:

Code:
define class page1_section1 as section
enddefine
define class contTopStatusBar as container
        layout = "vertical"
        fixedheight = 40
        backcolor = "white"
        add object buttonTest as commandbutton

enddefine

proc page1_section1 
        page1_section1 = createobject("page1_section1")
        page1_section1.addobject("cont1", "contTopStatusBar")
        cont1.buttontest.caption = "Hello"
        page1_section1.addobject("cont2", "contTopStatusBar")
        cont2.buttontest.caption = "World"
return page1_section1

define class herbButton as commandbutton
proc click()
Lianja.showMessage("Button was clicked")
endproc 

enddefine

define class contTopStatusBar as container
layout = "vertical"
fixedheight = 40
backcolor = "white"
add object buttontest as herbButton

enddefine

proc page1_section1 
page1_section1 = createobject("page1_section1")

page1_section1.addobject("cont1", "contTopStatusBar")
cont1.buttontest.caption = "Hello"
page1_section1.addobject("cont2", "contTopStatusBar")
cont2.buttontest.caption = "World"

return page1_section1

Q:
The finished app has a section on the left hand side with such things as favourites, recently viewed which you can hide by clicking on the word hide. Is there any way of removing that whole section ? Also is it possible to remove the navigation buttons from the bottom of the page which relate to the customer records at the top ?
A:
Yes – that’s called the Left Sidebar. Look in the Page Attributes (cog icon or double-click on header) and in the Left Sidebar sub-section uncheck ‘Show left sidebar‘.
In the Page Attributes ‘Appearance’ sub-section you will find ‘Hide actionbar‘ – check that to remove the navigation buttons.


Q:
How do use hwnd to get the id for a section, or a gadget?
A:
In LianjaDemo, from the console:

Code:
lo = lianja.get("customers")
? lo.hwnd

Better to create a custom section, add a container that auto sizes into the section and use its hwnd. Why? Because it excludes the area occupied by the header, header menu and footer menu.


Q:
1. Adding the canvas and grid sections to my page works just fine but I cannot add a button to the canvas, the commented -out code just doesn’t work – am I doing something wrong?
2. Running this code as-is in the app builder (ie. forget the button part), I see the new sections but if I try to add any gadgets manually to the canvas (from the ‘Advanced’ menu option at the bottom of the app builder) then the IDE crashes (with the “lianja.exe has stopped working” message).

Code:
proc page1_section2_field2_click()

        //Get a reference to the page
        page = Lianja.getElementByID("page1")

        //Add a canvas section to the page
        page.AddSection("custCanvas", "canvas")
        canvasSection = Lianja.getElementByID("page1.custCanvas")
        canvasSection.caption = "New Canvas"

        //Add a button to the canvas
        /*NOT WORKING
        canvasSection.AddObject("myButton", "commandbutton")
        btn = Lianja.getElementByID("page1.custCanvas.myButton")
        btn.move(20,20,100,50)
        */
       
        //Add a grid section to the page
        page.AddSection("custGrid", "grid")
        gridSection = Lianja.getElementByID("page1.custGrid")
        gridSection.caption = "New Grid"

endproc

A:
You cannot create canvas sections dynamically using addobject().
Canvas sections are designed visually.
Custom sections are created dynamically


‘Enhanced “Form” section layout to provide a more compelling UI for Web/Mobile Apps using NoCode.’ — my understanding of this, in plain language, is that just about everything you want to design in an app will be doable in a Form section, and will be responsive.
With the new UI in 2.1, and the metadata enhancements, this takes app development to a new level. This is huge, as this is the first step toward using all the other stuff above.


Q:
On a canvas section I’m trying to insert some custom buttons mainly for navigation and basic actions. I’ve tried several ways but with no luck.
On exemple, for a “move to next record” button in a desktop app what I’m doing is to create a new page(page1), a new canvas section (section1), drop in some record fields, and then I insert a command button, typing in the Default action field of the control:

Code:
section:section1?action=next

.
When I click it, it seems that nothing happens, or almost the fields are not refreshing. How can I use the “default actions” in a button in the canvas section?
A:
If you put the code in the Click event delegate for your button that will work.

JavaScript:

Code:
////////////////////////////////////////////////////////////////
// Event delegate for 'click' event
function page1_section1_field1_click()
{
        showdocument("section:section1?action=next");
};

VFP (remember to use JavaScript if you want to run in the Lianja Web Client)

Code:
////////////////////////////////////////////////////////////////
// Event delegate for 'click' event
proc page1_section1_field1_click()
        showdocument("section:section1?action=next")endproc

A2:
It seems like you added a canvas section and then added some textfields, and some buttons.
I am using the southwind database in my example.

1. Drag the fields from the table you want onto the canvas from table itself. I have selected the ‘example’ table

2. Add your buttons.
3. In the button that you want to use to move the records forward, add the following code. On my section, I named them txtNext and txtPrior (not case sensitive in VFP).

Here is the code from click events.

Code:
// Event delegate for 'click' event
proc page1_section1_txtPrior_click()
select example
if not bof()
skip -1
Lianja.get("page1.section1").refresh
else
wait window " You are on the first record"
endif
endproc

////////////////////////////////////////////////////////////////
// Event delegate for 'click' event
proc page1_section1_txtNext_click()
select example
if not eof()
skip 1
Lianja.get("page1.section1").refresh
else
wait window " You are on the last record"
endif
endproc

Q:
when one would use the standard sections and when or why the custom?
A:
That’s a tough one to answer, because I think it’s based on personal preferences. Although there are some things like custom grid section menus, that have to be done via custom code (meaning create container -> add objects etc..).

The other differences to me boils down to 2 things.
1. Re-using custom classes.
2. Layout management

In a custom sections, you can re-use classes that you have saved in the library. I Know that version 3.1 will have a visual Component builder, but that is still in the pipeline.

Custom sections can resize themselves based on how you specify the layout.
Canvas sections are not naturally responsive -but you can resize them via code. That can be tough if you have many objects.

I don’t know which one I use more though, I think it also depends on what I am doing.
You really cant go wrong with either one.


This is a quick intro to using custom VFP sections in Lianja.
https://youtu.be/22KwE857M24


Hide a section at runtime


Here is an explanation of dilema standard-custom-canvas:

As you know there are a lot of pre-built sections and I always recommend that you look into using these standard sections as your first choice rather than coding.

The question you really have to answer first is “Where do I want these Apps I build to run“?

If you are targeting desktop only then I would say go ahead and use whatever you feel comfortable with.

If you build your apps out of the standard sections then it will pretty much run straight off in the cloud too.
These built-in sections have been chosen due to the fact that they are common high level building blocks that you can visually build your Apps out of.
Its a sort of lego for cross-UI database apps.
The standard sections that I would recommend you using the most (if at all possible) are; Form, Grid, Report, Chart, WebView, Calendar, Attachment, ImageStrip, and TabView.

There are obvious tradeoffs that you have to make if you want your apps to be desktop, web and mobile — and after all, thats what Lianja is all about — apart from the cross platform nature of it; Windows, Mac and Linux.

“Custom sections” are code centric.
They can be developed in the Visual FoxPro compatible scripting, PHP, Python or JavaScript — whatever you are comfortable with in fact.

Canvas sections do not have the same level of functionality as you have in the page builder when you are visually designing pages out of forms, grids and webviews.
You have to basically “paint” them yourself — hence the name “Canvas”.

It is important to understand that just because it is not immediately apparent how to do something in standard sections not to assume that the standard sections can’t do it.
I don’t see building apps using standard sections without coding as being for beginners.
The idea is that domain knowledge developers should be able to build an App with minimal coding.

You can move fields around in form sections and separate them into columns using dividers.

To build a composite form you would use two sections one above the other and “Hide the section headers”.

You can change values in other fields as data is entered now.

You can build form sections into horizontal columns using the dividers i mention above to separate the form off into columns.

…you have “rules” that control “Visibility” and “Readonly” that are evaluated as data is displayed and entered in the form so the form can re-arrange itself.

…the section footer can contain hyperlinks that can be clicked and change the “State” in which the form is in. This can hide/show certain fields.

When working with Canvas, think Container: the Container moves controls around the same way as Form sections.

You can designate a Canvas section to be displayed only for desktop and web (big tablets); and have an alternate Form section that you designate only for Mobile (phones, small tablets). That’s controlled by section by the checkboxes at the bottom of the Section attributes.


Q:
how to hide/show a single element in a section?
I understand how to hide pages and sections. For some reason, I cannot find a reference to it hiding and showing a single element. I am trying to hide a textbox upon data change of another textbox.

Code:
proc Generate_line_detail_stkno_changed()
quantity.hide
getlineitemfrompricelist()
endproc

A:
Try this:

Code:
// Event delegate for 'changed' event
proc page1_section1_field1_changed()
    quantity=Lianja.get("quantity")
    quantity.hide
endproc

In App inspector you can see your quantity field is fully qualified as:

page: page1.section1.quantity

or in your case, I suppose:

page: Generate_line.detail.quantity

To apply “hide”, you need to reference this field object by Lianja.get(…), not by name only.

Shorten way:

Code:
// Event delegate for 'changed' event
proc page1_section1_field1_changed()
    Lianja.get("quantity").hide
endproc

Q:
I want a section initially hidden upon system start up. Where should I place this code?

Code:
showdocument("section:section1?action=hide")

I tried to place it in the ready delegate of the section itself and in the ready delegate of the page where the section is located but got the same behavior the section was not hidden upon the system start up.
Also, I tried to place the same code on the click delegate of the cancel button and the section was hidden upon clicking the cancel button.
A:
I put your code

Code:
showdocument("section:section1?action=hide")

in page’s ready delegate of lianja_mobiledemo, and deployed it.
After that, in App Center the Section1 is not showing at start. As expected.

In development views in Lianja App Builder it is showing.
These are only development (pre)views and they can not 100% replace real runtime environment.
If they could, then we would not need Page Center on development machine.



Section

Posted: 2017-01-24 in Section

Q:
two Form sections. The first had Columns added by dragging the entire table from the Tables list.
The second had them
added individually by dragging them from the Column Names list.
Why does the former get navigation controls added automatically and the second does not? How do I add them to the second?
A:
Just save and reload the App and it will pick up that the section is data-bound and show the navigation in the Section header.


(?A):
it is possible to change both the database and table for a section, even if it’s grayed out.
For a form/grid/webview etc. section named mysection, use the console and issue:

Code:
lianja.get("mysection").database = "mynewdatabase"

Next: save the app and refresh it. You will see the new database name has been saved. Similary for the table (or anything else).


Q:
I have a project and successfully deployed it on LAN. But on the client PC not all fields are seen on the canvas section due to the small monitor screen. So the solution I have in mind is to put a scroll bar on the canvas section. Is that possible to put a scroll bar on canvas section when the monitor is too small to view all the fields on canvas?
A:
A canvas section is non responsive as you have discovered. A canvas section cannot be scrollable.
The
page containing the canvas section can be scrollable so play about with that setting in the page attributes.



Section

Posted: 2017-01-24 in Section

Q:
Is it possible to have a collapsible section start off collapsed?
I have several sections on a page and a few of them would only be occasionally used. So, it would be nice to have the page start with them collapsed so the other sections can be more visible.
A:
In the “Ready” delegate for the page you can collapse the sections.

Code:
Lianja.get("customers.section2").collapse()

Added a new section attribute “Apply rules on parent data change“. This causes the UI presentation rules to be evaluated dynamically as you navigate data in the parent section.
You can therefore
hide/show other related sections based on the data that is being displayed in the parent section.
Note that when the UI presentation rules are applied the “Visible When” and “Readonly When” conditions are evaluated. This is only
effective in runtime mode.


Visible when” and “Readonly when” are evaluated when you

Code:
Lianja.get("page.section").applyRules()

This happens automatically if you have set the section attribute “Apply rules on change” in the “UI Presentation Rules”.
This will then cause the UI to hide and show elements dynamically depending on the data being currently viewed.


Q:
It is possible to display a grid within a canvas section?
I don’t want the grid in a separate section, I want it included with the section being used to potentially display basic or related information.
Here’s what I’m thinking:
– Add a label
– Add a combobox
– Display values in a grid based on the selected combobox value. Data would possibly come a a virtual table.
Using Southwind as an example (albeit not the best example):
label: Expenses
combobox values: Monthly Expenses (as label) and values (choices) could be individual months
grid: display the orders for the selected month
A:
A page can be arranged out of numerous sections that can have the section header hidden at runtime. So the page acts and appears as one section although it has been visually designed out of many.
Sections can be grouped together (there is an example demo App showing how to achieve this) so they expand and collapse as one section.

There are various examples of this. The Custom Canvas Demo example App uses a TreeGrid.


SQL with {…} macros is used to relate the sections.


In v1.2.2 there is a new section attribute “Where condition” that can be used to requery() Virtual Tables dynamically. This is a SQL SELECT WHERE condition for your target SQL database.
It can be set dynamically:

Code:
Lianja.get("page1.section1").where = "account > 1000 and empid = '0001'"

or

Code:
Lianja.showDocument("page: page1.section1?action=where&text=account gt 1000 and empid eq '0001'"

(notice how I have specified the where condition above in OData format).
So If you are working with large amounts of data create your VT as SELECT… WHERE 1=0
Then change the “where condition” dynamically in your App ready delegate.


Q:
So then it wouldn’t matter if it was a foxpro or JavaScript section since the requery is at the section level and not at the cursor adaptor or recordset level.
A:
Yes thats correct. It only works against VTs as internally it issues a requery() for the VT. The cursoradaptor for the VT knows what section it is bound too so when the requery() completes the section is automatically refreshed.
Also remember that the “where condition” operates just like requery() method on the Virtual Table so it can also contain ORDER BY … LIMIT etc.
So it replaces everything after the WHERE in the Virtual Table definition.
This makes paging of data and changing order much easier.


Q:
I am trying to create a new record whenever the section is loaded. I am trying to do this with the init/ready delegate with the following code:

Code:
Lianja.showDocument("page:gCreateTasks.section:section1?action=add");

A:
That syntax looks wrong, try it in the JavaScript console.

Code:
page: page1.section1?action=add


 

Search

Posted: 2017-01-24 in Search

Q:
is possible to know the contents of the char contained in the “search box” (Instant search is upper right field with magnifyer)
A:
the search field is not currently exposed.


A quick explanation on how to search data behind a section either by referencing the row itself, or using the search delegate.
https://youtu.be/a_cSD_oBz-Y


Q:

to find the right record, I’ve write a RSP page to display, filter and sort the table.
is possible to do something like this in a grid?

With VFP, my user can click on a column, then just typing some char, I open a “search” window
Is possible something like that with Lianja?
A:
The way I would do it, is to just add a custom control.
In this case, add a textbox that calls a showdialog.
Look back at this thread.

http://lianja.com/community/showthre…grid+container

Code:
public mysearchbox

define class clsmytextbox as textbox
proc interactivechange()
Lianja.writelog(this.text)
endproc
enddefine

proc mycontainer

mycontainer = createobject("container")
mycontainer.layout = "horizontal"
mycontainer.height = 50
mycontainer.addobject("mysearchbox","clsmytextbox" )

return mycontainer

In this case, I am just writing out as each letter is entered.

A2:
Ahh – you want to be able to type in the top row.
You can actually just use webview in the menu.
I just tried this and it worked well for me.

Under menu, click visible.
Then add an rsp or jssp page as the menu panel.
Adjust the height.


Instant Search – Search information shown in Section HeaderBar

Code:
$("page:customers?action=search&text={customers.companyname}||hidedialogpanel")

 

Code:
$("section:section1?action=search&text={}")

 


Q:
I have a page with a grid section and below it a canvas section
I want a search panel for the grid so in the grid Search Panel attributes I checked true for Visible and Auto Create.
Actually, the panel is there but the panel has nothing in it. It’s just a blank strip.
A:
Search panel for the grid means you get a row between section name and a grid body.
It is empty until you chose column from grid for this use.
You need to doubleclick on Last Name column in the grid and set attribute Search panel field=True
You dont need canvas section with a field for that. The field is already on that panel.



Search

Posted: 2017-01-24 in Search

Q:
setting a form field as ‘Search field‘ + ‘User-selectable search field’ means the user can click the field they want to use in the main form search.
What I don’t get what it means if ‘Search Field’ is set but ‘User selectable’ is not set
A:
You can set one ‘Search Field’ or set one or more user selectable ones.


Q:
user will be able to choose from a drop-down combo box. Based on the value selected in the combo-box, the rest of the form will be updated.
A:
– Set the search field on the section (e.g. employees.lastname)
Add a Field and set its choices (e.g. select lastname from employees)
– Create an interactivechange delegate for the combobox field to search for the value


Lianja Web Client has built-in support for queries called “Instant Selections“?
Setup and instant selection.

Deploy your App from the “Web App View”.
Now your users can query data based on known selections.