Slider

Posted: 2017-01-24 in Slider
Q:
In a custom section, I would like to show the tick marks.
Slider1.??
A:
Lianja 3.1Beta7 I have exposed these:
tickInterval: number
tickPosition: string // None, Above, Below, Left, Right, BothSides


String

Posted: 2017-01-24 in String

Q:
can I use more than one “like” clause in filter?
this, not work..
set filter to des_banca like “*UNI*” and PROVFINAN like ‘MO’
A:
You can use == as an alternative to LIKE.
A2:
The == operator in Lianja works the same as exactly equal to when it does not contain patter matching characters.
If it does contain pattern matching characters then a pattern match is performed.
The patterns can be %*?[a-z][~a-z]



String

Posted: 2017-01-24 in String

Q:
Displayed as XX | XXXXXXXXXXX.
Is there a way to only get a value from a specific column?
For example, how do I get the value from column 2?
A:
Extract the part of the value you need, e.g. from after the ‘|’ to the end of the string:
strextract(this.text,’|’)


I have also extended the database engine with SET STRCOMPARE ON.
This causes strings to be compared case insensitive and EXACT comparisons. The strings are padded with spaces up to the maximum length of either string. This resolves the issue of SQL returning multiple rows when looking up a substring of a column value. This behavior is like MSSQL now. You should only set it on when you want this behavior as it affects all string comparisons so:
“hello” = “HELLO”
will be true if STRCOMPARE is ON
.

Index key comparisons are case insensitive too now so the optimizer will handle mixed case comparisons.

One thing worth mentioning also is that in Lianja the
== operator behaves like EXACT only when the left hand side operand and the right hand side operand of the same length
otherwise == is a “pattern matching” operator. e.g.
select * from customers where customerid==”A*”
Will return all customers that start with “A”.

The pattern matching
operators _ * ? % [chars] and ^[chars] can be specified in the pattern.

Also remember that you can also
SET SOFTSEEK ON to progressively lookup a key by chopping characters off the end until a match is found.


In Lianja scripting, Javascript, PHP, Python, C, C++, Java, etc comparing strings is case sensitive.
If you are storing data then that’s up to your App to make sure it goes in in the correct case particularly when indexes are being updated or populated.

“hello” != “HELLO”

So fix up your data and use input masks to guarantee what is typed in by a user is correctly transformed before it is stored in a database.



 

Stored procedure

Posted: 2017-01-24 in Stored procedure

You can pass parameters to your stored procedure, e.g. nret = sqlexec(nhand,”call sp_demo(‘MA’)”,”mycursor”)


Currently, the ‘.prg’ needs to be present for stored procedures. This will be resolved in a future release, so that only the ‘.dbo


Lianja SQL Server lets you call stored procedures (or in fact just procedures) that use SEEK/SCAN/etc NoSQL commands inside them.

Server-side pages (
.rsp pages written in VFP compatible scripting) provide the same level of functionality in the cloud.
Best of both worlds NoSQL and SQL.


Q:
I created a stored procedure in “southwind” database through Lianja App builder. I named is as
sp_GetOrderDetails.prg
=======================
select * from order_details into cursor cc

I can run this in console and can browse cc cursor.
How can I call this or any other stored procedure from “Lianja Sql Server” to VFP ?
A:
call sp_name()
to to get multiple result sets issue two sqlexec() calls.


Q:
In VFP, a Databsae file (.DBC), saved all sotred procedures in field named as ‘code‘.
We can
edit any procedure with ‘modify procedure.
Can we have multiple stored procedures in a single sp_library.prg file ?
A:
You edit stored procedures in the “Data” workspace for the database table.

No. Lianja will look for the stored procedure by filename in the database container directory.



SQLlookup

Posted: 2017-01-24 in SQLlookup

Q:
I am currently working on a web app where I need to perform some server side data retrieval.

While referencing SQLLOOKUP, when the virtual table is used, the return value is the customer id.

Is it possible to have multiple returned values?
For example, can the return value be customerid and employeeid.

If it is not possible, other than calling SQLLOOKUP() several times, what would be the best way to use the same functionality with virtual tables?
I am trying to make a call to a virtual table that returns two columns from a table.
I would then taken the values, place them in a JSON string format and return the encoded object to the client.

I am currently using two sqllookup calls and I’m trying to make it easier with one single call.

Code:
m_defbranch = sqllookup("vtsecure","where loginname = '" + m_username + "'", "","defbranch","'Not found'")

m_colcode = sqllookup("vtsecure","where loginname = '" + m_username + "'", "","collcode","'Not found'")

I am storing each of the values in the caption of a label in a canvas section for other uses (which will not be visible to the user).
A:
The easiest nocode way I can think of: put a canvas section on the page that is invisible.
Put
two textboxes on the section set to the two fields you want to use.
Set the
datasource to be a VT which will give you the values you want.

When you need to requery() (here’s another place where having all the details would make a difference), set the WHERE attribute of the section..
I’m not sure if it will
requery itself, or where you will then have to requery the section. One way or the other, your two values will be available for you to use as you need.



SQLlookup

Posted: 2017-01-24 in SQLlookup

Q:
Why is a wrong field shown in column “groep”.
choices: SELECT omschrijving FROM groep WHERE bedrijf = 234 AND periode = 2015
Get data mapping : sqllookup(“groep”,”where bedrijf = 234 AND periode = 2015 AND groep = ‘{}'”, “”,”omschrijving”,”0″)
Swt data mapping : sqllookup(“groep”,”where bedrijf = 234 AND periode = 2015 AND omschrijving = ‘{}'”, “”,”groep”,”0″)
A:
What are the datatypes of groep and omschrijving?
If they are character, the final parameter (notfound) in SQLLOOKUP() should be in quotes within quotes “‘0′”



 

ShowDocument

Posted: 2017-01-24 in ShowDocument

Incredibly powerful, but possibly less well know, is the showdocument() function and the corresponding Lianja.showDocument() method.
Here are some of the operations you can do with showdocument() and Lianja.showDocument():

  • Switch to another App
  • Switch to another Page
  • Navigate records: First, Previous, Next, Last, move relative, goto record number
  • Initiate data operations: Add, Edit, Delete
  • Search and filter data
  • Refresh ‘Visible when’ and ‘Readonly when’ Rules at Section or Page level
  • Change or reset UI States
  • Navigate to the previous or next Page
  • Hide or show the left and right Sidebars
  • Hide or show the Navigation Panel
  • Expand and collapse Sections
  • Select a particular Section in an accordion Page
  • Select a particular Tab in a TabView Section
  • Dynamically change Virtual Table queries

 


Q:
Is there an advantage to using Lianja.showDocument() method other than the ability to chain commands in a single call (which is very nice)? IOW, can all the same actions/settings be accessed using Lianja.get()? I ask because I seem to remember at one point that some things could only be done using showDocument.
A:
There are certainly some that are showdocument only – the hide/show of the navigation panel and sidebars and the UI States spring to mind.
Others are standard
section or pagemethods and will be calling the same code behind the scenes.


there should be only one colon, if used, following the first name: that tells the Get method of Lianja which part of the hierarchy to start searching.

So if section1 is on pgCreateTasks, your parameter to showDocument would be as below. Note that if you are starting at page level, the page: isn’t needed.

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

 


Unlike Lianja.getElementByID(), Lianja.showDocument() needs to have a prefix of “section:” so that the specified action is performed against the section.


Q:
When using showdocument in a web browser, I can do a search on a section as follows.

Code:
Lianja.showDocument("page: page1.section3?action=search&text=King");

This will search on my search field (which is lastname) for King.
If I wanted to filter a section, what is the correct syntax?
This is clearly not correct.

Code:
Lianja.showDocument("page: page1.section3?action=filter&text=lastname = 'King'");

A:
From the new treeview app .js file:

Code:
function page1_section1_dblclick(title, key)
{
    Lianja.showDocument("page: page1.section4?action=search&text="+key);    
};
Code:
Lianja.getElementByID("page1.section4").refresh();

here is the OData syntax.

Code:
Lianja.showDocument("section:section2?action=filte r&text=contactname eq 'Jean Fresniere'"); 
Lianja.showDocument("section:section2?action=filte r&text=contactname eq ''");


ShowDocument

Posted: 2017-01-24 in ShowDocument
// Event delegate for 'ready' event
function page1_ready()
{
        Lianja.showDocument("page:page1?action=add");
}

or

Code:
////////////////////////////////////////////////////////////////
// Event delegate for 'ready' event
function page1_section1_ready()
{
        Lianja.showDocument("page:page1?action=add");
}

Create new record whenever the section is loaded


Sounds like you want to use the Stacked behavior Accordion I mentioned earlier or maybe you should have individual Pages. Remember you can change pages using Lianja.showdocument(“page:ageid”) and Lianja.showdocument(“page:ageid?action=do_this”).
You can also
set the Page Attribute to ‘Hide page from menu’ at runtime so users can’t switch to it until you want them to.


From Lianja v1.3, the “Full page edit” also applies to Add – clicking the Page’s Add button or from an Add action:

Code:
Lianja.showDocument("page: page1?action=add")

 



 

ShowDialog

Posted: 2017-01-24 in ShowDialog

you could use a Canvas Section instead of a Customs Search Panel with

Code:
Lianja.showDocument("page:pageid.sectionid?action=hide");
Code:
Lianja.showDocument("page:pageid.sectionid?action=show");

to hide/show the section.



ShowDialog

Posted: 2017-01-24 in ShowDialog

Pages to be used as UI Pages with Lianja.showDialog() and Lianja.showDialogPanel() should be created in a separate App from the one(s) from which they will be called – for example the customerlist UI Page used in the sample lianjademo App is in the ui_mypagelibrary (mypagelibrary in earlier versions) App, so can be modified when required.



‘search.rso’ will be the compiled version of ‘search.rsp’. How does that fit into your App?
Are any
functions/custom libraries required by your combobox available when it is called from another App with showdialog() instead of as a Page in its own App?


Q:
use a dialog panel and use filter as an action.
A:
define an activate delegate for your grid section in your UI Page that does the sort based on a memory variable you set before you call the showdialogpanel(), e.g.
Calling code:

Code:
nSortcol = 2
        lianja.showDialogPanel("Game List","gamelist",...)

Section.activate:

Code:
////////////////////////////////////////////////////////////////
// Event delegate for 'activate' event
proc Gamelist_grdGamelist_activate()
        Lianja.Get("Gamelist.grdGameList").grid.sort(nSortcol,1)
endproc

Q:
From the Lianja.showdialogpanel() UI Page, I can interact with the main Page?
A:
You can use Lianja.get() from the Custom UI Page in the Navigation Panel or opened by Lianja.showdialogpanel(). Public memory variables will also be available to the Custom UI Page, along with access to the database.


Lianja.showDialog() and Lianja.showDialogPane() return 1 if you click the ‘Done’ button and 0 otherwise.
Display of the buttons on a showDialog() is optional – full arguments are listed
here.
As Fabio says, if you
want to return a particular value, you can set a public variable.
You can also
perform a Lianja UI action (Lianja.showdocument()) as you exit the dialog, e.g. select a particular Page or Section and search for a record, or filter the data.


Q:
I opened my app and goto “Console” workspace
When I issue the command, “Lianja.ShowDialog(“Some title”,”Leave_Balance”), the system display only a blank popup window instead of my page in the popup window.
A:
Lianja.showDialog() displays pages from the UI page library not the current app.
Save the page in the UI a Page library to be able to use it like that.


Lianja.showDialog() surely as they can be modal or non modal.


Multiple Lianja pages can be displayed modal/non-modal using LIanja.showDialog() and/or Lianja.showDialogPanel().
When a UI page is loaded into a dialog or dialogpanel it is added into the LOM (Lianja Object Model) and can be manipulated using Lianja.getElementByID() and/or Lianja.showDocument().
In v1.3 Lianja.showDialog() and Lianja.showDialogPanel() have been extended so that they can render a custom UI that you create yourself.


Q:
I have a page with form section and I need to popup an editable grid when user click on a command button on the form section.
May I know how can this be done without totally displaying a new page with a grid section?
A:
In v1.3, You can use Lianja.showDialog() and specify a .prg that generates the contents of the popup dialog.
You can also use a
page that you have designed visually and saved in the UI page library.


Lianja.showDialog() and Lianja.showDialogPanel() are now both implemented in the LianjaWebFramework.
Here is a simple example to show you what can be done very easily.
Fire up the example_webapp1 App.

Click the “Map” menu item and the map for the currently displayed customer is displayed by calling the Google mapping API with the customers address.

This is the code that is called when you click on the “Map” menu item.

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

Notice how I can reference the data in the “customers” cursor just as I would do so in Lianja/VFP.
Obviously you can add additional information to this dialog content.
Here is an example of sliding in a DialogPanel. Again, this can contain a complete App that you have deployed.

And the code that slides in this DialogPanel.

Code:
// The last parameter is the width that I want this DialogPanel to be
Lianja.showDialogPanel("EMPLOYEE INFORMATION", "showdialogpanel_employee.rsp?employeeid={employees.employeeid}", 500);

As I mentioned above, I can in fact display another App in the Dialog that pops up just by specifying the html filename for the App.

You can also write server side JavaScript files with a .jssp extension if that takes your fancy.
If you have existing PHP generated content you can specify that URL using a .php extension. The same goes for .aspx pages. This makes for good integration with your existing code and data.

I Can add “Cancel” and “Done” buttons that enable me to callback some JavaScript functions that will in turn refresh the App content, navigate to another page or apply a search filter to a section of a the page that is being displayed.
Pretty powerful stuff, making it easy to slide in content with Lianja.showDialogPanel() or popup query forms etc using Lianja.showDialog() with minimum coding required.

Also remember that in v1.3 the Cloud Server has full integration with
Virtual Tables so building Apps that integrate data from MSSQL, MySQL and any other ODBC data source is a breeze.
I should also add that this is all touch friendly too. When a Dialog or DialogPanel is displayed you can touch anywhere outside of them to close them.
In the case of a DialogPanel swiping from left to right with also close it and if you have a SwipeLeft delegate on a page you can slide a DialogPanel in using that gesture.

You can have as many different Dialogs and DialogPanels as you want.

Tip: Specifying a width of “100%” for a DialogPanel will animate it in place and it will occupy the whole page viewport.

It is common in Tablet and Phone Apps to “flick” your finger from left to right over the left hand side of the display.
To position the DialogPanel on the left hand side rather than the right side specify the
width as a negative value (works on desktop too). You can then specify a “SwipeRight” delegate that will slide the DialogPanel in from the left.

If you want to style the complete DialogPanel with no header and no buttons as you want to put your own in then do it like this.

Code:
// The second parameter is an empty title and the last parameter causes the buttons to be hidden
Lianja.showDialogPanel("", "showdialogpanel_employee.rsp?employeeid={employees.employeeid}", 500, , undefined, undefined, undefined, undefined, 1);

And lastly if you want to share DialogPanels across Apps put the code in the library and reference it like this.

Lianja.showDialogPanel(“EMPLOYEE INFORMATION”, “lib:/showdialogpanel_employee.rsp?employeeid={employees .employeeid}”, 500);


Prior to this version (1.3Beta5) Lianja.showDialog() and Lianja.showDialogPanel() only worked with page library files.
Now the filename can be a .vpx (as previously) or a .rsp, .jssp function that creates a custom section and embeds it in the Dialog.