Hi,
I'm trying to create Arcade Expression, that will join the feature layer and a feature table for different widgets in Operations Dashboard, but my expression cannot load the data, please help me, as I suspect that something was not provided for in the code of this expression.
var portal = Portal("https://www.arcgis.com/");
var polyfs = FeatureSetByPortalItem(portal,"2c70f00e262a4488b266595720312617",0,["*"],true);
var tablefs = FeatureSetByPortalItem(portal,"227503e1ba6848baa7227b6311c04802",0,["*"],false);
var joinedDict = {
fields: [
{ name: "StreetID", type: "esriFieldTypeInteger" },
{ name: "Name", type: "esriFieldTypeString" },
{ name: "Depth", type: "esriFieldTypeFloat" },
],
'geometryType': '',
'features':[]};
var i = 0;
for (var t in tablefs) {
var tableID = t["StreetID"]
for (var p in Filter(polyfs, "StreetID = "+tableID)){
joinedDict.features[i] = {
attributes: {
StreetID: tableID,
Name: p["Address"],
Depth: t["Depth"],
}
}
}
i++
}
return FeatureSet(Text(joinedDict));
Thank you,
Roman
Solved! Go to Solution.
Ah, I see it now. You are trying to cast the Depth as a "float", which isn't in the list of field types you can use (even though it is a valid data type in other contexts).
Change that to 'esriFieldTypeDouble' and it evaluates just fine:
I would guess it has something to do with that Filter statement, but since the layers aren't shared publicly, it's hard to say for sure. Usually when referencing a variable in your expression string, you should put it in the string itself in the format @variableName. Try this to see if the output changes.
var i = 0;
for (var t in tablefs) {
var tableID = t["StreetID"]
var filt_poly = Filter(polyfs, "StreetID = @tableID")
for (var p in filt_poly){
joinedDict.features[i] = {
attributes:
StreetID: tableID
Name: p["Address"],
Depth: t["Depth"],
}
}
}
i++
}
Hi Josh,
Thanks for your answer, I applied your recomendations, but it not working. When I click Test button, I don't see error:
But after click Done button I see error in the expression:
I shared this services as public for everyone,
Thank you,
Roman
Ah, I see it now. You are trying to cast the Depth as a "float", which isn't in the list of field types you can use (even though it is a valid data type in other contexts).
Change that to 'esriFieldTypeDouble' and it evaluates just fine:
Josh, thank you very much, it is working
Roman
A follow up question to data types- when I try to define a date, there is not an error, but nothing is returned. Example below I modified from github here
I added lines 33 and 48 to get the ForecastTime which is a date field in the source, but when it is defined as "esriFieldTypeDate" in line 48, the Test fails. If you change it to "esriFieldTypeString" it works. But I want to have a date type to work with in the dashboard. Are dates not supported or am I missing something else?
var portal = Portal("https://www.arcgis.com/");
var polyfs = FeatureSetByPortalItem(
portal,
"4dbbad3d6f694e0ebc7c3b4132ea34df",
0,
["*"],
false
);
var tablefs = FeatureSetByPortalItem(
portal,
"4dbbad3d6f694e0ebc7c3b4132ea34df",
6,
["*"],
false
);
// Create empty features array and feat object
var features = [];
var feat;
// Populate Feature Array
for (var t in tablefs) {
var tableID = t["FeatureID"]
for (var p in Filter(polyfs, "HydroID = "+tableID)){
feat = {
attributes: {
FeatureID: tableID,
Name: p["DPS_Region"],
ModelID: t["ModelID"],
AddressCount: t["AddressCount"],
MAX_TSTime: t["MAX_TSTime"],
ForecastTime: t["ForecastTime"],
}
}
Push(features, feat)
}
}
var joinedDict = {
fields: [
{ name: "FeatureID", type: "esriFieldTypeString" },
{ name: "Name", type: "esriFieldTypeString" },
{ name: "ModelID", type: "esriFieldTypeInteger" },
{ name: "AddressCount", type: "esriFieldTypeInteger" },
{ name: "MAX_TSTime", type: "esriFieldTypeString" },
{ name: "ForecastTime", type: "esriFieldTypeDate" },
],
'geometryType': '',
'features':features
};
// Return dictionary cast as a feature set
return FeatureSet(Text(joinedDict));
.
EDIT: I found help from a co-worker- added number() in the attribute array on line 33 above:
ForecastTime: number(t["ForecastTime"]),
ForecastTime: number(t["ForecastTime"]),