I’ve gotten stuck on how to make my table in Perspective editable and write back to the database. Here’s the process:
Table data bound to query (default format)
The following script runs on the query, making all cells except month editable
# convert dataset to dict where specified columns are editable
editableCols = ["Budget","Monthly Actuals","Monthly Forecast"]
ds = value
colNames = ds.getColumnNames()
d = []
for i in range(ds.rowCount):
rowDict = {}
for col in colNames:
editable = False
if col in editableCols:
editable = True
rowDict[col] = {"value":ds.getValueAt(i,col),"editable":editable}
d.append(rowDict)
return d
This seems to be successful.
Use onEditCellCommit to update the database. (I opted to update all the columns to avoid SQL injection, but maybe that’s not necessary?)
#update perspective table
# Get the value that was typed into the cell
valueToSet = event.value
self.props.data[event.row][event.column] = valueToSet
#define table values
month=self.props.data[event['row']]['Month']['value']
budget=self.props.data[event['row']]['Budget']['value']
monthlyActuals= self.props.data[event['row']]['Monthly Actuals']['value']
monthlyForecast=self.props.data[event['row']]['Monthly Forecast']['value']
#update database table
query='Program Metrics/R and D/UpdateRDDataByLocalId'
parameters={
"local_Id":'247',
"metric_Month":month,
"budget":budget,
"monthly_Actuals":monthlyActuals,
"monthly_Forecast":monthlyForecast
}
system.db.runNamedQuery(query, parameters)
The error occurs
Error running action ‘component.onEditCellCommit’ on Embedded_Program_Views/R&D@D/root/FlexContainer_4/FlexContainer_0/Table: Traceback (most recent call last):
File “function:runAction”, line 8, in runAction
TypeError: unicode indices must be integers
I’ve tried using float() to convert the values retrieved from the table to float, but that didn’t improve things. Any suggestions?
That's funny.
You'll probably fix it by having self.props.data[event.row] instead of what you have.
EDIT: oops, didn't realize Jordan already had the fix.
EDIT2: actually, is it instead your column index that's wrong?
In props.data, I can't create an object/row with a key with a space in it in the Designer.
Hm I don’t think those are the issues. If i change to event.row and directly write a value for the columns with a space (instead of trying to pull the value from self), I still get the same error. See below for the edited script.
EDIT: If I directly write a value for budget instead of trying to pull the value from self, the script works fine. so the problem is somehow related to pulling the value from self.
#update perspective table
# Get the value that was typed into the cell
valueToSet = event.value
self.props.data[event.row][event.column] = valueToSet
#define table values
month=self.props.data[event.row]['Month']['value']
budget=self.props.data[event.row]['Budget']['value']
monthlyActuals= 200 #self.props.data[event.row]['Monthly Actuals']['value']
monthlyForecast=300 #self.props.data[event.row]['Monthly Forecast']['value']
#update database table
query='Program Metrics/R and D/UpdateRDDataByLocalId'
parameters={
"local_Id":'247',
"metric_Month":month,
"budget":budget,
"monthly_Actuals":monthlyActuals,
"monthly_Forecast":monthlyForecast
}
system.db.runNamedQuery(query, parameters)
I will add that you don’t have to convert your DataSet to a dictionary if you don’t need cell-specific settings. You can just configure table.props.columns and set which one is editable in there.
Thanks so much for your help! Such a simple solution.
About converting the dataset to a dictionary… From what i understand the editable property doesn’t work quite right for columns in perspective, so you have to use the cell-specific setting unfortunately.