Nervatura Programming Interface

AMF and JSON encoded version
Ver.No: {{=response.verNo}}

Function Overview

Name Return type Parameters
getLogin Object / dict database, username, password, validdata
callFunction Any type login, functionName, paramList
executeSql Boolean / bool login, sqlKey, sqlStr, paramList
loadView Array login, sqlKey, sqlStr, whereStr, havingStr, paramList, simpleList, orderStr
loadTable Array login, classAlias, filterStr, orderStr
loadDataSet Array login, dataSetInfo
saveRecord Typed Object / class instance login, record, validate
saveRecordSet Array login, recordSet, validate
deleteRecord Boolean / bool login, record
deleteRecordSet Boolean / bool login, recordSet
saveDataSet Array login, dataSet, validate

Object Overview

Name Properties
validator valid, message, employee, audit, groupinput, transfilter, groups, menucmd, menufields, userlogin
login database, username, password, appl
param name, value, wheretype, type
recordSetInfo infoName, infoType, classAlias, filterStr, orderStr, sqlKey, sqlStr, whereStr, havingStr, paramList, functionName
infoSet infoName, recordSet
updateSetInfo updateType, tableName, recordSet, functionName, paramList, value

More Examples: Nervatura wxPython Client and Javascript RPC functions

Function Details

getLogin(database::String, username::String, password::String, validdata::Boolean=False)::Object

Functions: getLogin_amf, getLogin_json
Login rights control. Successful login additional information is available.
database: an NAS alias set for a database
username, password: valid username and password for the database

The result value is a validator object.

Examples:

ActionScript and RemoteObject:
var channel:AMFChannel = new AMFChannel("amf-channel", "http://127.0.0.1:8000/nerva2py/npi/call/amfrpc3");
var channels:ChannelSet = new ChannelSet(); channels.addChannel(channel);
var ro:RemoteObject = new RemoteObject("amfrpc3");
ro.destination="default"; ro.concurrency = "multiple"; ro.showBusyCursor = true; ro.channelSet = channels;

var op:AbstractOperation = ro.getOperation('getLogin_amf');
op.addEventListener(ResultEvent.RESULT, getLogin_amf); op.addEventListener(FaultEvent.FAULT, connectFault);
op.send("demo", "admin", null, true);

private function getLogin_amf(event:Event):void {if (ResultEvent(event).result["valid"]== true) {}}
private function connectFault(event:FaultEvent):void {}

Python and PyAMF:
service = RemotingService("http://127.0.0.1:8000/nerva2py/npi/call/amfrpc3").getService("default")
login = service.getLogin_amf("demo", "admin", None, True)
if login["valid"]==True:
  pass

Javascript and JSON-RPC:
data = {"id":1, "method":"getLogin_json", "jsonrpc":"2.0",
  "params":{"database":"demo","username":"demo","password":""}}
$.ajax({
  type: "post",
  url: "http://127.0.0.1:8000/npi/call/jsonrpc2/",
  data: JSON.stringify(data),
  contentType: "application/json",
  success: function(response){
    response = JSON.parse(response);
    if ("error" in response) {
      alert(response.error.message);
    } else {
      console.log(response.result);}}
  error: function(jqXHR, textStatus, errorThrown ) {
    alert("POST ERROR");}
});

callFunction(login::Object, functionName::String, paramList::Any type)::Any type

Functions: callFunction_amf, callFunction_json
It calls for the functionName server-side function. The paramList parameters are passed.

The result for the called function result.

Examples:

ActionScript and RemoteObject:
ro = (...)
var op:AbstractOperation = ro.getOperation('callFunction_amf');
op.addEventListener(ResultEvent.RESULT, getCustnumber); op.addEventListener(FaultEvent.FAULT, connectFault);
op.send({database: "demo", username: "admin", password: null}, "nextNumber", {id:"custnumber", step:true});

Python and PyAMF:
service = RemotingService("http://127.0.0.1:8000/nerva2py/npi/call/amfrpc3").getService("default")
result = service.callFunction_amf({"database": "demo", "username": "admin", "password": None}, "nextNumber", {"id":"customer_number", "step":False})

Javascript and JSON-RPC:
data = {"id":11, "method":"callFunction_json", "jsonrpc":"2.0",
  "params":{
    "login":{"database":"demo", "username":"admin", "password":""},
    "functionName":"nextNumber",
    "paramList":{"id":"customer_number", "step":False}}};
$.ajax({...});

executeSql(login::Object, sqlKey::String, sqlStr::String, paramList::Array)::Boolean

Functions: executeSql_amf, executeSql_json
Execute the sqlStr statement on the database. If sqlKey value is not null, the statement is replaced with stored in the NAS login.appl table.
paramList: the list of param objects

True if the SQL statement runs successfully.

Examples:

Close all customer order between 2011.01.01 and 2011.02.01, in EUR:
sqlStr = "update trans set closed=1
  where deleted=0 and transtype =(select id from groups where groupvalue='order')
    and direction =(select id from groups where groupvalue='out')
    and curr=@curr and transdate>=@from_date and transdate<@to_date"

ActionScript and RemoteObject:
ro = (...)
var paramList:ArrayCollection = new ArrayCollection;
paramList.addItem({name:"@curr", value:"EUR", wheretype:"in", type:"string"});
paramList.addItem({name:"@from_date", value:"2011-01-01", wheretype:"in", type:"date"});
paramList.addItem({name:"@to_date", value:"2011-02-01", wheretype:"in", type:"date"});

var op:AbstractOperation = ro.getOperation('executeSql_amf');
op.addEventListener(ResultEvent.RESULT, closedResult); op.addEventListener(FaultEvent.FAULT, connectFault);
op.send({database: "demo", username: "admin", password: null}, null, sqlStr, paramList);

Python and PyAMF:
service = RemotingService("http://127.0.0.1:8000/nerva2py/npi/call/amfrpc3").getService("default")
paramList = []
paramList.append({"name":"@curr", "value":"EUR", "wheretype":"in", "type":"string"})
paramList.append({"name":"@from_date", "value":"2011-01-01", "wheretype":"in", "type":"date"})
paramList.append({"name":"@to_date", "value":"2011-02-01", "wheretype":"in", "type":"date"})

result = service.executeSql_amf({"database": "demo", "username": "admin", "password": None}, null, sqlStr, paramList)

Javascript and JSON-RPC:
data = {"id":5, "method":"executeSql_json", "jsonrpc":"2.0",
  "params":{
    "login":{"database":"demo", "username":"admin", "password":""},
    "sqlKey":"", "sqlStr":sqlStr,
    "paramList":[
      {"name":"@curr", "value":"EUR", "wheretype":"in", "type":"string"},
      {"name":"@from_date", "value":"2011-01-01", "wheretype":"in", "type":"date"},
      {"name":"@to_date", "value":"2011-02-01", "wheretype":"in", "type":"date"}]};
$.ajax({...});

loadView(login::Object, sqlKey::String, sqlStr::String, whereStr::String, havingStr::String, paramList::Array, simpleList::Boolean=False, orderStr::String="")::Array

Functions: loadView_amf, loadView_json
Loads the sqlStr query from the database. If sqlKey value is not null, the query is replaced with stored in the NAS login.appl table.
whereStr: the valid sql where filter string
havingStr: the valid sql having filter string
paramList: the list of param objects
simpleList: Optional. If set to False, the results will be converted to a sequence of dictionaries keyed with the table field names. Default value: False.
orderStr: Optional. The valid sql orderby string. Default value: ""

The result for the execute query result.

Examples:

All customer invoices from 2011.01.01, between 0 and 1 000 000, in EUR, order by duedate:
sqlStr = "select t.transnumber, t.transdate
  from trans t
  inner join groups tt on t.transtype=tt.id and tt.groupvalue='invoice'
  inner join groups dt on t.direction=dt.id and dt.groupvalue='out'
  where t.deleted=0 @where_str
    and t.id in(select trans_id from item where deleted=0 group by trans_id having @having_str)
  order by @orderby_str"

whereStr="and t.curr=@curr and t.transdate>@from_date"
havingStr="sum(amount)>=@from_amount and sum(amount)<=@to_amount"
orderStr="duedate"

ActionScript and RemoteObject:
ro = (...)
var paramList:ArrayCollection = new ArrayCollection;
paramList.addItem({name:"@curr", value:"EUR", wheretype:"where", type:"string"});
paramList.addItem({name:"@from_date", value:"2011-01-01", wheretype:"where", type:"date"});
paramList.addItem({name:"@from_amount", value:0, wheretype:"having", type:"number"});
paramList.addItem({name:"@to_amount", value:1000000, wheretype:"having", type:"number"});

var op:AbstractOperation = ro.getOperation('loadView_amf');
op.addEventListener(ResultEvent.RESULT, loadResult); op.addEventListener(FaultEvent.FAULT, connectFault);
op.send({database: "demo", username: "admin", password: null}, null, sqlStr, whereStr, havingStr, paramList, False, orderStr);

Python and PyAMF:
service = RemotingService("http://127.0.0.1:8000/nerva2py/npi/call/amfrpc3").getService("default")
paramList = []
paramList.append({"name":"@curr", "value":"EUR", "wheretype":"where", "type":"string"})
paramList.append({"name":"@from_date", "value":"2011-01-01", "wheretype":"where", "type":"date"})
paramList.append({"name":"@from_amount", "value":0, "wheretype":"having", "type":"number"})
paramList.append({"name":"@to_amount", "value":1000000, "wheretype":"having", "type":"number"})

result = service.loadView_amf({"database": "demo", "username": "admin", "password": None}, null, sqlStr, whereStr, havingStr, paramList, False, orderStr)

Javascript and JSON-RPC:
data = {"id":2, "method":"loadView_json", "jsonrpc":"2.0",
  "params":{
    "login":{"database":"demo", "username":"admin", "password":""},
    "sqlKey":"", "sqlStr":sqlStr, "whereStr":whereStr, "havingStr":havingStr, "orderStr":orderStr, simpleList:false,
    "paramList":[
      {"name":"@curr", "value":"EUR", "wheretype":"where", "type":"string"},
      {"name":"@from_date", "value":"2011-01-01", "wheretype":"where", "type":"date"},
      {"name":"@from_amount", "value":0, "wheretype":"having", "type":"number"},
      {"name":"@to_amount", "value":1000000, "wheretype":"having", "type":"number"}]};
$.ajax({...});

loadTable(login::Object, classAlias::String, filterStr::String, orderStr::String)::Array

Functions: loadTable_amf, loadTable_json
Loads data from a database table.
classAlias: a registered class name
filterStr: the valid sql having where string
orderStr: Optional. The valid sql orderby string. Default value: ""

The result a Typed Object (class instance).

Examples:

ActionScript and RemoteObject:
ro = (...)
var op:AbstractOperation = ro.getOperation('loadTable_amf');
op.addEventListener(ResultEvent.RESULT, getCustomer); op.addEventListener(FaultEvent.FAULT, connectFault);
op.send({database: "demo", username: "admin", password: null}, "models.customer", "id=1", null);

Python and PyAMF:
service = RemotingService("http://127.0.0.1:8000/nerva2py/npi/call/amfrpc3").getService("default")
result = service.loadTable_amf({"database": "demo", "username": "admin", "password": None}, "models.customer", "id=1", None)

Javascript and JSON-RPC:
data = {"id":3, "method":"loadTable_json", "jsonrpc":"2.0",
  "params":{
    "login":{"database":"demo", "username":"admin", "password":""},
    "classAlias":"customer", "filterStr":"id=1", "orderStr":""};
$.ajax({...});

loadDataSet(login::Object, dataSetInfo::Array)::Array

In a group, any number can be sent loadTable, loadView, executeSql and callFunction requests.
dataSetInfo: the list of recordSetInfo objects

Functions: loadDataSet_amf, loadDataSet_json
The result value a list of infoSet objects.

Examples:

ActionScript and RemoteObject:
ro = (...)
var dataSetInfo:ArrayCollection = new ArrayCollection;
var paramList:ArrayCollection;

dataSetInfo.list.addItem({infoName:"groups", infoType:"table", classAlias:"models.groups",
  filterStr:"deleted=0 and groupname in ('customer', 'nervatype', 'fieldtype', 'logstate', 'custtype')",
  orderStr:"groupname, groupvalue" });
dataSetInfo.list.addItem({infoName:"deffield", infoType:"table", classAlias:"models.deffield",
  filterStr:"deleted=0 and nervatype = (select id from groups where groupname = 'nervatype' and groupvalue = 'customer')",
  orderStr:"description" });
paramList = new ArrayCollection;
paramList.addItem({name:"@customer_id", value:1, wheretype:"in", type:"integer"});
dataSetInfo.list.addItem({infoName:"calendar_view", infoType:"view", sqlKey:"fCustomer_getCalendarView",
  sqlStr:null, whereStr:"", havingStr:"", paramList:paramList});
dataSetInfo.list.addItem({infoName:"custnumber", infoType:"function", functionName:"nextNumber",
  paramList:{id:"custnumber", step:false}});

var op:AbstractOperation = ro.getOperation('loadDataSet_amf');
op.addEventListener(ResultEvent.RESULT, getDataSet); op.addEventListener(FaultEvent.FAULT, connectFault);
op.send({database: "demo", username: "admin", password: null}, dataSetInfo);

Python and PyAMF:
service = RemotingService("http://127.0.0.1:8000/nerva2py/npi/call/amfrpc3").getService("default")
dataSetInfo = []

dataSetInfo.append({"infoName":"groups", "infoType":"table", "classAlias":"models.groups",
  "filterStr":"deleted=0 and groupname in ('customer', 'nervatype', 'fieldtype', 'logstate', 'custtype')",
  "orderStr":"groupname, groupvalue" })
dataSetInfo.append({"infoName":"deffield", "infoType":"table", "classAlias":"models.deffield",
  "filterStr":"deleted=0 and nervatype = (select id from groups where groupname = 'nervatype' and groupvalue = 'customer')",
  "orderStr":"description" })
paramList = []
paramList.append({"name":"@customer_id", "value":1, "wheretype":"in", "type":"integer"})
dataSetInfo.append({"infoName":"calendar_view", "infoType":"view", "sqlKey":"fCustomer_getCalendarView",
  "sqlStr":null, "whereStr":"", "havingStr":"", "paramList":paramList})
dataSetInfo.append({"infoName":"custnumber", "infoType":"function", "functionName":"nextNumber",
  "paramList":{id:"custnumber", step:false}})

result = service.loadDataSet_amf({"database": "demo", "username": "admin", "password": None}, dataSetInfo)

Javascript and JSON-RPC:
data = {"id":2, "method":"loadDataSet_json", "jsonrpc":"2.0",
  "params":{
    "login":{"database":"demo", "username":"admin", "password":""},
    "dataSetInfo":[
      {"infoName":"groups", "infoType":"table", "classAlias":"models.groups",
        "filterStr":"deleted=0 and groupname in ('customer', 'nervatype', 'fieldtype', 'logstate', 'custtype')",
        "orderStr":"groupname, groupvalue"},
      {"infoName":"deffield", "infoType":"table", "classAlias":"models.deffield",
        "filterStr":"deleted=0 and nervatype = (select id from groups where groupname = 'nervatype' and groupvalue = 'customer')",
        "orderStr":"description"},
      {"infoName":"calendar_view", "infoType":"view", "sqlKey":"fCustomer_getCalendarView",
        "sqlStr":null, "whereStr":"", "havingStr":"",
        "paramList":[{"name":"@customer_id", "value":1, "wheretype":"in", "type":"integer"}]},
      {"infoName":"custnumber", "infoType":"function", "functionName":"nextNumber",
        "paramList":{id:"custnumber", step:false}}
    ]}};
$.ajax({...});

saveRecord(login ::Object, record::Typed Object, validate::Boolean=False)::Typed Object

Functions: saveRecord_amf, saveRecord_json
Insert or update a data row. A new record, set the returned id.
validate: if True, it calls the DAL validators for the fields before performing the update or insert

The result value of the input record object.

saveRecordSet(login ::Object, recordSet::Array, validate::Boolean=False)::Array

Functions: saveRecordSet_amf, saveRecordSet_json
Insert or update multiple rows of data.
recordSet: the list of record objects. A new record, set the returned id.
validate: if True, it calls the DAL validators for the fields before performing the update or insert

The result value of the input recordSet list.

deleteRecord(login ::Object, record::Typed Object)::Boolean

Functions: deleteRecord_amf, deleteRecord_json
Delete a data row.

True value if the deletion is successful.

deleteRecordSet(login ::Object, recordSet::Array)::Boolean

Functions: deleteRecordSet_amf, deleteRecordSet_json
Delete multiple rows of data.
recordSet: the list of record objects.

True value if the all deletion is successful.

saveDataSet(login::Object, dataSetInfo::Array)::Array

Functions: saveDataSet_amf, saveDataSet_json
In a group, any number can be sent saveRecordSet, deleteRecordSet and callFunction requests.
dataSetInfo: the list of updateSetInfo objects

The result value of the input dataSetInfo list (with returned new id).

Object Properties

validator {valid::Boolean, message::String, employee::Object=null, audit::Array=null, groupinput::Array=null, transfilter::int=null, groups::Array=null, menucmd::Array=null, menufields::Array=null, userlogin::String=null}
valid: True or False
message: 'OK' or error message

If validdata==True:
employee: Login user employee data
audit: Login user audit data
transfilter: Login user transfilter data or null
groups: All groups values: usergroup, nervatype, transtype, inputfilter, transfilter, department, logstate, fieldtype
menucmd: All ui_menu data
menufields: All ui_menufields
userlogin: 'true' or 'false' from database settings
login{database::String, username::String, password::String, appl::String=''}
database: an NAS alias set for a database
username, password: valid username and password for the database
appl: database table name for sqlKey. Optional.
param{name::String, value::Object, wheretype::String, type::String}
name: the replacement name
value: replacement value of the variable
wheretype: specifies which part replace the variable. Valid values: where, having, in.
type: set up the correct sql syntax. Valid values: string, date, integer, number, boolean.
recordSetInfo{infoName::String, infoType::String, classAlias::String=null, filterStr::String=null, orderStr::String=null, sqlKey::String=null, sqlStr::String=null, whereStr::String=null, havingStr::String=null, paramList::Array=null, functionName::String=null}
infoName: required. unique request identifier name
infoType: required. Valid values: table, view, execute, function
functionName: only if infoType = function, else null
classAlias: only if infoType = table, else null
filterStr: only if infoType = table, else null
orderStr: only if infoType = table, else null
sqlKey: only if infoType = view or execute, else null
sqlStr: only if infoType = view or execute, else null
whereStr: only if infoType = view, else null
havingStr: only if infoType = view, else null
paramList: only if infoType = view, execute or function, else null
infoSet{infoName::String, recordSet::Array}
infoName: request recordSetInfo.infoName
recordSet: recordSetInfo result value
updateSetInfo{updateType::String, tableName::String=null, recordSet::Array=null, functionName::String=null, paramList::Array=null, value::Array=null}
updateType: required. Valid values: update, delete, function
tableName: only if updateType = update or delete, else null
recordSet: only if updateType = update or delete, else null
functionName: only if infoType = function, else null
paramList: only if infoType = function, else null
value: result value if infoType = function, else null