« [Tip] The margin on the left in a record view | Main | [Tip] The exclamation mark in the left hand corner in the status bar »

November 29, 2004

[Article] Valuelists management with SQL and html

by Riccardo Albieri
Morninger Soluzioni

Seroy provides the user a cospicous set of tools for valuelists management. Especially valuelists based on field values seem to be the trait d'union between efficiency and versatility. But how can a developer let the user be free to customize this kind of lists in an intuitive manner?

SQL + html: Dinamic Duo strikes back
The amazing ability to show the results of a SQL query in a properly formatted text field could gives us the help we need.

First thing: we have to create two text global fields ( gListNames and gListValues) and a valuelist (ValueList_Fields) set for showing custom values. Let's put the two globals on a form based on the table containing the field used by the value lists and set gListNames as a combobox using ValueList_Fields as valuelist; after that, set gListValues as non-editable html area.

Now, it's time to create the methods needed to manage the value lists. The first (Get_Field_Names) is the method that takes care of getting the names of all the fields present in the valueList table: it's a good idea to attach it to OnShow property, in order to get updated values every time the form is accessed.

//get a specific table and get column info
var jstable = databaseManager.getTable('yourdbname','valuelist');
var listvalues = jstable.getColumnNames();

//Fill a custom type valuelist with values from array(s) or dataset
//set display values (return values will be same as display values)
application.setValueListItems('ValueList_Fields',listvalues);

If the table contains fields that have to be omitted from the list (e.g.: a primary key), we'll need some extra code to strip those unwanted columns from the listvalues array (using a parsing procedure for instance).

Once you have all the columns listed, the next step to complete our suite of tools is a method that gets all the values present in the selected column.

In this case, good ol' SQL becomes very handy: with a simple query linked to that little jewel named getDatasetByQuery, SQL will give us all the values we need. Here's the code (Get_Column_Values):

globals.gListValues = ""
//Get a dataset based on query
var maxReturedRows = 1000;// choose a max number of items for the valuelist
var query = 'select valuelistid, ' + globals.gListNames + ' from valuelist where ' + globals.gListNames + ' != null order by ' + globals.gListNames  +' asc'; // warning: certain dbs may require the expression NULL  instead of null
var dataset = databaseManager.getDataSetByQuery(currentcontroller.getServerName(), query, null, maxReturedRows);

for(var i=0 ; i = dataset.getMaxRowIndex() ; i++)
{
    dataset.rowIndex= i
    
    //omits null values
    var column2 = dataset[2]
    if(column2 != null)

        globals.gListValues = globals.gListValues + '<html><tr class="normal"><td><a href="javascript:Change_Item_Value('+"'"+dataset[2]+"'"+')">' + column2+'</a>></td></tr></html>'
}

As you can see, the code contains a link to a method (Change_Item_Value), which can be invoked directly from html. This method is intended to let the user easily modify or remove a value from the list. The code (Change_Item_Value):

var oldvalue = arguments[0]
var query = "select valuelistid from valuelist where " + globals.gListNames + " = '" + arguments[0] +"'"
var dataset = databaseManager.getDataSetByQuery (controller.getServerName(), query, null, 100);

var answer = plugins.dialogs.showQuestionDialog( "Liste valori",  "Vuoi eliminare il valore " + oldvalue + " dalla lista valori " + globals.gListNames + "?", "Elimina", "Modifica", "Cancella")

if (  answer == "Elimina" )
{
    controller.loadRecords(dataset)
    controller.deleteRecord()
    controller.saveData;    
}
else
{
    if ( answer == "Modifica" )
    {
    var newvalue = plugins.dialogs.showInputDialog('Modifica valore','Nuovo valore');
    //updates the foundset
    controller.loadRecords(dataset)
    var fsUpdater = databaseManager.getFoundSetUpdater(foundset)
    fsUpdater.setColumn(globals.gListNames,newvalue)
    fsUpdater.performUpdate();
    }
}

//refresh the value list items
Get_Column_Values();

In order to complete the suite, a last component is missing: the capability to add items to a value list.
Servoy offers several ways to accomplish this task; one of them could use the following code (Add_Item):

var selectedcolumn = globals.gListNames
var newvalue = plugins.dialogs.showInputDialog('Add a value to list ' + globals.gListNames ,'');

controller.newRecord()
forms.list_manager[selectedcolumn] = newvalue
forms.list_manager.controller.saveData();

controller.saveData();
Get_Column_Values();

Using this set of methods with a couple of globals and the powerful couple html + SQL it's possible to build a complete and reusable valuelists management system inside Servoy.

Have fun.

| Posted by David Workman on November 29, 2004 at 01:56 PM in Articles | Permalink

TrackBack

TrackBack URL for this entry:
http://www.typepad.com/t/trackback/118167/1472041

Listed below are links to weblogs that reference [Article] Valuelists management with SQL and html:

Comments

Very interesting indeed. I understand what you're doing with managing (adding, changing, deleting) a value list, but I don't see how to put such a value list into use. I've played around with the demo and haven't been able to get it to do anything but change the value list itself.

Posted by: Morley | Dec 9, 2004 9:53:22 AM

Hi, Morley

I'm not sure to understand what you're not able to do :-)
After adding a value to the list, can't you use this valuelist attached to a field?
Let me know.

Posted by: Riccardo Albieri | Dec 9, 2004 2:54:11 PM

Morley:

Just add a button to Riccardo's Valuelist solution and attach the method Add_Item.

It will then allow you to add values to any list that is selected in gListNames.

BTW, it's reading gListNames from the CRM solution.

Excellent work Riccardo!

Posted by: John Michael | Dec 16, 2004 12:36:32 AM

Post a comment