Hello all,
I’m getting a “TypeError: Unable to convert row 22, column 2 to type class java.sql.Timestamp”
and I don’t know how to solve this.
I am trying to create a dataset with multiple row on the project script to populate a table on perspective.
Status = system.dataset.toDataSet(headers, data)
return Status
If I return the “data” and do the “system.dataset.toDataSet” from a button script all is fine but I want the function to return this dataset.
After some test I sorted out that on the error is caused by this row:
Dati: row 22 - 2021-03-10 11:46:54.074 - Wed Mar 10 14:29:57 CET 2021
all the other row are like this:
Dati: row 21 - 2021-03-10 11:46:53.144 - 2021-03-10 11:46:54.074
On the last row I force the second timestamp to system.date.now().
if I do the same on the script console all is fine
some ideas?
Can you post your actual code?
It looks like you’re creating/modifying a dataset with a column that’s a java class (Timestamp
), but trying to insert some other type of value (a string?) into it instead.
Sure, my goal is to estract from a “system.tag.queryTagHistory” a dataset like this:
startTS, stopTS, value, duration
this is the script:
def calc(startTime,endTime,Paths):
#endTime = system.date.now()
#startTime = system.date.addDays(endTime, -12)
hist=system.tag.queryTagHistory(paths, startDate=startTime, endDate=endTime, returnSize=-1, returnFormat='Wide')
headers = ["Status", "Start", "End", "Duration"]
data = []
system.util.getLogger("Dataset").info("Dati:"+ str(startTime)+ " - " +str(endTime)+ " - " +str(tagPaths) + " - ")
#-----------------------------------------------------------------------------------------
for row in range(hist.getRowCount()):
eventStart = hist.getValueAt(row, 0)
if row < (hist.getRowCount()-1):
eventStop=hist.getValueAt(row+1, 0)
else:
eventStop=endTime
system.util.getLogger("Dataset").info("Dati:"+ str(row)+ " - " +str(eventStart)+ " - " +str(type(eventStop)) + " - ")
Duration = (eventStop.time - eventStart.time)/1000
Value=hist.getValueAt(row, 1)
data.append([Value, eventStart, eventStop, Duration])
Stati = system.dataset.toDataSet(headers, data)
return Stati
The way I’m calling is:
#startTime=self.getSibling("DateTimePicker_Start").props.value
#endTime=self.getSibling("DateTimePicker_End").props.value
startTime=system.date.addYears(system.date.now(),-1)
endTime=system.date.now()
tagPaths=["[default]Test/Fase"]
table = self.getSibling("Table_0")
newData = SM_Report_try.calc(startTime,endTime,tagPaths)
#table.props.data = newData
self.view.custom.Dataset=newData
Thanks in advance,
also if you think there is a better way to do that I’m fully open
Fabio
Well, I don’t see anything obviously wrong with your code. Try logging the type()
of your eventStart
and eventStop
values as you go through the loop? Something that’s not able to be coerced to a timestamp is slipping in there.
Yes the type looks different.
the one I’m getting from the query is java.sql.Timestamp
the one from system.date.now() is java.util.date
row 22 - 2021-03-10 11:46:54.074 - Wed Mar 10 14:29:57 CET 2021
The calculation works but I’m not able to insert into a dataset.
are any way to cast the type?
Yep,
import java.sql.Timestamp as Timestamp
now = system.date.now()
print now
print type(now)
print ' '
t = Timestamp(now.getTime())
print t
print type(t)
Output:
Thu Mar 11 13:01:01 EST 2021
<type 'java.util.Date'>
2021-03-11 13:01:01.618
<type 'java.sql.Timestamp'>
1 Like
Another option - use the DatasetBuilder
class to explicitly state what type(s) to use for your columns. Timestamp
is a subclass of java.util.Date
, so Java can coerce in one direction but not the other.
2 Likes
Thanks,
I’m trying to follow this way but following the example give me no result.
import com.inductiveautomation.ignition.common.util.DatasetBuilder as DatasetBuilder
myDataset = DatasetBuilder.newBuilder()
myDataset.colNames(“SeriesName”, “FillColor”, “StrokeColor”, “StrokeWidth”)
myDataset.colTypes(String.class, Color.class, Color.class, Float.class)
myDataset.addRow(“Process Value”, TypeUtilities.toColor("#B8DAFF33 "), Color.BLUE, 0.1)
myDataset.addRow(“Setpoint Value”, TypeUtilities.toColor("#FFFFFF44 "), Color.DARK_GRAY, 0.2)
myDataset.build();
This give me: NameError: name ‘String’ is not defined
Also where I can find the class definition I can use?
Thanks in advance
I converted as jordan suggested
eventStop=Timestamp(endTime.getTime())
actually I’m facing a stange behaviour,now the code is executing.
If I look at the dataset when I’m using perspective i get all field formatted as java.sql.Timestamp
If I use the script console I got the problem:
This looks very strange
Then I’m not certain what causing your original issue, as all of those returned are java.util.Date, except for the one we coerced at the end.
Is it possibile to use a transaction group to achieve this type of setup?
[…some variable…,start_Timestamp,stop_Timestamp,Duration]
Thanks in advance
tmahaf
February 27, 2024, 6:55pm
12
I'm running into the same problem that is documented above. I had one dataset that was returned from a gateway scope script, another one that was returned inside a Perspective property binding transform. I wanted to combine the two datasets, but the two types were not compatible.
My fix was to just have both datasets returned from a gateway script that way they were both the same type.