TL;DR: Dieser Ausdruck gibt die zuletzt bearbeitete Zusammenfassung über mehrere Tabellen zurück.<\/P>
var related_records = FeatureSetByRelationshipName($feature, "relationship_name") var sorted_records = OrderBy(related_records, 'last_edited_date DESC') var most_recent_record = First(sorted_records)<\/code><\/pre><P> <\/P><H4 id="toc-hId--1839843622">Benutzerdefinierte Funktionen, Funktionen kombinieren<\/H4><P>Das sind viele unnötige Zwischenausgaben, die für jede Tabelle wiederholt würden. Wann immer möglich ist es wünschenswert, Funktionen zusammenzufassen. Aber vielleicht nicht so sehr, dass Ihr Code schwer verständlich wird.<\/P><P>Betrachten Sie:<\/P><PRE>First(OrderBy(FeatureSetByRelationshipName($feature, "EH_Complaints_violations"), 'last_edited_date DESC'))<\/PRE><P>Das ist ein gültiger Ausdruck, aber ziemlich lang. Fühlen Sie sich frei, Zeilenumbrüche einzufügen, wenn es Ihnen hilft.<\/P><PRE>First(<BR \/> OrderBy(<BR \/> FeatureSetByRelationshipName(<BR \/> $feature,<BR \/> "EH_Complaints_violations"),<BR \/> 'last_edited_date DESC')) <\/PRE><P>In diesem Beispiel müssen wir jedoch viel davon für <EM>jede<\/EM> verwandte Tabelle in unserem Layer eintippen. Persönlich verwende ich gerne benutzerdefinierte Funktionen für solche Dinge. Hier werde ich eine benutzerdefinierte Funktion <STRONG>MostRecent<\/STRONG> verwenden, um die Funktionen <STRONG>First<\/STRONG> und <STRONG>OrderBy<\/STRONG> zu kombinieren. Ich kann diese dann mit jeder verwandten Tabelle verwenden, um meine neuesten Features sehr prägnant zu erhalten.<\/P><P> <\/P><pre class="lia-code-sample language-javascript"><code>function MostRecent(lyr){ return First(OrderBy(lyr, 'last_edited_date')) } var violations = FeatureSetByRelationshipName($feature, "EH_Complaints_violations") var narrative = FeatureSetByRelationshipName($feature, "EH_Complaints_narrative") var most_recent_v = MostRecent(violations) var most_recent_n = MostRecent(narrative)<\/code><\/pre><P> <\/P><H4 id="toc-hId-647669211">Vergleiche<\/H4><P>Das ist alles schön und gut, aber wie bekomme ich das zuletzt bearbeitete Feature aus diesen einzelnen Features? Ich <EM>kann nicht<\/EM> <STRONG>OrderBy<\/STRONG> verwenden, weil dies separate Features sind und kein FeatureSet. Es gibt jedoch die Funktion <A href="https:\/\/developers.arcgis.com\/arcade\/function-reference\/data_functions\/#sort-inputarray--comparatorfunction----array" target="_self" rel="nofollow noopener noreferrer"><STRONG>Sort<\/STRONG><\/A>. Aber sie nimmt ein Array und eine Vergleichsfunktion als Argumente und diese fehlen uns.<\/P><P>Ziemlich einfach für das Array. Einfach Klammern und Kommas um Ihre Features setzen!<\/P><PRE>[most_recent_v, most_recent_n, $feature]<\/PRE><P>Der Vergleich ist einfach. Indem wir das <STRONG>last_edited_date<\/STRONG>-Feld unserer Features nehmen, sehen wir einfach welches größer ist, also neuer.<\/P><P> <\/P><pre class="lia-code-sample language-javascript"><code>function DateSort(a, b){ if (a['last_edited_date'] > b['last_edited_date']){ return -1 } else { return 1 } } var sorted = Sort([most_recent_v, most_recent_n, $feature], DateSort) var most_recent_feature = First(sorted)<\/code><\/pre><P> <\/P><P>Jetzt haben wir ein Array von Features sortiert vom neuesten bis zum ältesten Bearbeitungsdatum und können einfach den <STRONG>First<\/STRONG>-Wert dieses Arrays nehmen.<\/P><P>Außer... wie wissen wir <EM>woraus für einer Tabelle es stammt?<\/EM>?<\/P><H4 id="toc-hId--1159785252">Zurückverfolgen und Ursprungstabelle einschließen<\/H4><P>Irgendwo früher in unserem Ausdruck müssen wir einen Tabellenbezeichner an die einzelnen Features binden. Der einfachste Weg ist die Verwendung eines <STRONG>Dictionaries<\/STRONG>. Oder besser gesagt eines Arrays von Dictionaries. Wir formatieren es wie folgt:<\/P><P> <\/P><pre class="lia-code-sample language-javascript"><code>[ {table: 'Complaint Details', feat: $feature}, {table: 'Violations', feat: most_recent_v}, {table: 'Narrative', feat: most_recent_n} ]<\/code><\/pre><P> <\/P><P>Unsere DateSort-Funktion kann weiterhin gleich funktionieren, aber jetzt müssen wir auf das Feature als Wert des größeren Dictionaries zugreifen. Das heißt,<br \/></P><PRE>a['feat']['last_edited_date']<br \/></PRE><P>und so weiter. Jetzt haben wir unser einzelnes Feature zusammen mit seiner Ursprungstabelle. Es bleibt nur noch eine Ausgabestring zu erstellen.<br \/></P><PRE>return `${most_recent_feature['table']} layer edited ${most_recent_feature['feat']['last_edited_date']}`</PRE><P> <br \/></p><p>Aber ich habe genug gesagt und genug Teile des Ausdrucks gegeben. Lassen Sie uns abschließen.<br \/></p><h3 id="toc-hId--1170288356">Der finale Ausdruck<br \/></h3><p>Hier ist er komplett zusammengefügt. Mit ein paar weiteren Anpassungen wie dem Hinzufügen des vollständigen Namens des Benutzers.<br \/></p><p> <br \/></p><pre class="lia-code-sample language-javascript"><code>// Benutzerdefinierte Funktion zur Rückgabe des neuesten Features function MostRecent(lyr){ return First(OrderBy(lyr, 'last_edited_date')) } // FeatureSets für jede verwandte Tabelle var violations = FeatureSetByRelationshipName($feature, "EH_Complaints_violations") var narrative = FeatureSetByRelationshipName($feature, "EH_Complaints_narrative") // Array von Feature-Dictionaries mit Ursprungstabelle var feats = [ {table: 'Complaint Details', feat: $feature}, {table: 'Violations', feat: MostRecent(violations)}, {table: 'Narrative', feat: MostRecent(narrative)} ] // Sortierfunktion function DateSort(a, b){ if (a['feat']['last_edited_date'] > b['feat']['last_edited_date']){ return -1 } else { return 1 } } var most_recent = First(Sort(feats, DateSort)) // Zusätzliche Zeilen zum Abrufen des vollständigen Namens eines Benutzers var portal = Portal('https://maps.co.kendall.il.us/portal') var editing_user = GetUser(portal, most_recent['feat']['last_edited_user']) // Rückgabe eines formatierten Ausgabestrings basierend auf dem neuesten Feature return `${most_recent['table']} table edited ${Text(most_recent['feat']['last_edited_date'], 'DD-MMM-YYYY')} by ${editing_user}`
On a side note:(I do a similar thing to what @jcarlson mentions above, but I use SQL queries in Oracle, instead of Arcade.)One thing I find frustrating is that domains don't have a date column/property to track the last time the domain was modified.
Scenario — sync to external system:
I have a sidewalk FC that I sync as assets to a work order management system. The sync logic is based on a SYNC_NEEDED column in a spatial view on the FC. That SYNC_NEEDED column is based on the LAST_EDITED_DATE. But ideally, It would also account for changes to domains as well.
For example, the sidewalk FC has a MATERIAL column that uses a MATERIAL_SIDEWALK domain. If someone were to change a value in the domain from, say, CONCRETE to CONCRETE - CAST-IN-PLACE, then ideally, the affected features in the FC should be synced, so that the new material information would show up in the external system.
But since there's no way to query for domains that have changed, that doesn't seem to be possible. The only other option for capturing the domain changes would be to re-sync the entire FC on a schedule, which is problematic since the external system (IBM Maximo) is extremely slow at syncing records. The only realistic option is to sync changes-only, not sync all rows.
Related:
Angemeldete Mitglieder können Beiträge verfassen, Updates folgen und mehr. Neu hier? Registrieren Sie ein kostenloses Konto.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.