Hello I am trying to display related data in popups using an arcade script I found and altered. The issue is that I need to not return 0 or replace 0 with '' where attribute values are equal to 0. New to Arcade and I have no idea where I would insert a Replace or an if then statement. Right now the following code will show for example 5000 State Highway 149 0 as 0 is listed if the feature doesn't have a StreetType value. I have nulls and blanks calculate automatically to be 0 . I cant change the database values to be blank or null for a number of reasons which has to do with comparing values..
var related_table = FeatureSetById($datastore, "12");
var filter_query = "Asmt = '" + $feature["APN"] + "'";
var related_data_filtered = Filter(related_table, filter_query);
var related_data_filtered_count = Count(related_data_filtered);
var output = "";
if (related_data_filtered_count > 0) {
output = "Total of " + related_data_filtered_count + " Address(es)";
for (var related_data_row in related_data_filtered) {
output += TextFormatting.NewLine + related_data_row.StreetNum + " " + related_data_row.Street + " " + related_data_row.StreetType + TextFormatting.Newline + "____________";
}
} else {
output = "No Related Records...";
Solved! Go to Solution.
Well, you're nearly there. What you'd need is something to check the value of each field, then only append it to the output string if it's not a "0". There are lots of ways you could do it, but let's look at using an array and Erase / Concatenate.
By the way, are these layers truly related with a relationship class? You could bypass the filtering step entirely if you used FeatureSetByRelationshipName.
Instead of cobbling the string together all in one go, we can first create an array. Then we can loop through the array and drop any items that are equal to "0". Once our array is "cleaned", we can use concatenate to build that string.
var related_table = FeatureSetById($datastore, "12");
var filter_query = "Asmt = '" + $feature["APN"] + "'";
var related_data_filtered = Filter(related_table, filter_query);
var related_data_filtered_count = Count(related_data_filtered);
var output = "";
if (related_data_filtered_count > 0) {
output = `Total of ${related_data_filtered_count} Address(es)\n`;
for (var r in related_data_filtered) {
// Array of address parts
var addr_parts = [
r.StreetNum,
r.Street,
r.StreetType
]
// Clean '0' items from array
for (var part in addr_parts){
if (addr_parts[part] == '0'){
Erase(addr_parts, part)
}
}
// Create output string
output += `${Concatenate(addr_parts, ' ')}\n____________`;
}
} else {
output = "No Related Records...";
}
Oh, gosh. When I copied my code in, I forgot the last line:
return output
Add that to the expression I posted, it should return something.
And take a look at FeatureSetByRelationshipName. When you use that to access the related data, it is pre-filtered to those related items. You'll need to know the relationship name, or use the expression builder to pipe it in.
If the last value is the only one that would be empty, then you can use the IsEmpty function to do something like this
output += TextFormatting.NewLine + related_data_row.StreetNum + " " + related_data_row.Street;
if (!IsEmpty(related_data_row.StreetType)){
output += " " + related_data_row.StreetType;
}
output += TextFormatting.NewLine + "____________";
Decode might work for you:
output += TextFormatting.NewLine + related_data_row.StreetNum + " " + related_data_row.Street + " " + Decode(related_data_row.StreetType, "0", "", related_data_row.StreetType) + TextFormatting.Newline + "____________"
Assuming StreetType is a text field, if the value is "0", will replace it with "" (blank), if not, uses the value for related_data_row.StreetType.
R_
I wish your code would work for me because that is exactly what I am trying to do. It is saying Identifier Not Found. related_data_row
Well, you're nearly there. What you'd need is something to check the value of each field, then only append it to the output string if it's not a "0". There are lots of ways you could do it, but let's look at using an array and Erase / Concatenate.
By the way, are these layers truly related with a relationship class? You could bypass the filtering step entirely if you used FeatureSetByRelationshipName.
Instead of cobbling the string together all in one go, we can first create an array. Then we can loop through the array and drop any items that are equal to "0". Once our array is "cleaned", we can use concatenate to build that string.
var related_table = FeatureSetById($datastore, "12");
var filter_query = "Asmt = '" + $feature["APN"] + "'";
var related_data_filtered = Filter(related_table, filter_query);
var related_data_filtered_count = Count(related_data_filtered);
var output = "";
if (related_data_filtered_count > 0) {
output = `Total of ${related_data_filtered_count} Address(es)\n`;
for (var r in related_data_filtered) {
// Array of address parts
var addr_parts = [
r.StreetNum,
r.Street,
r.StreetType
]
// Clean '0' items from array
for (var part in addr_parts){
if (addr_parts[part] == '0'){
Erase(addr_parts, part)
}
}
// Create output string
output += `${Concatenate(addr_parts, ' ')}\n____________`;
}
} else {
output = "No Related Records...";
}
Yes it is a relationship class a one to many AGOL hosted feature service.
Oh, gosh. When I copied my code in, I forgot the last line:
return output
Add that to the expression I posted, it should return something.
And take a look at FeatureSetByRelationshipName. When you use that to access the related data, it is pre-filtered to those related items. You'll need to know the relationship name, or use the expression builder to pipe it in.
That seems to do the trick! The only thing I cant figure out is why when the street name is *UNASSIGNED* it just returns the underscores I use to separate the records in the popup.
var related_table = FeatureSetByRelationshipName($feature, "Address_Situs");
var related_table_count = Count(related_table);
var output = "";
if (related_table_count > 0) {
output = `Total of ${related_table_count} Address(es)\n`;
for (var r in related_table) {
// Array of address parts
var addr_parts = [
r.StreetNum,
r.Street,
r.StreetType
]
// Clean '0' items from array
for (var part in addr_parts){
if (addr_parts[part] == '0'){
Erase(addr_parts, part)
}
}
// Create output string
output += `${Concatenate(addr_parts, ' ')}\n____________` + TextFormatting.NewLine;
}
} else {
output = "No Related Records...";
}
return output;
Those underscores show up when there is at least 1 related record, regardless of its contents. Do you mean that the street name is literally "UNASSIGNED", or it's null? What's the data look like for rows where this happens?
Literally *UNASSIGNED*. It must have something to do with the * because when the street name is just UNASSIGNED the popup displays UNASSIGNED. This is just old data that came out of an AS400 system. The new data in the new system doesn't have the *