Resumo: Esta expressão retorna o resumo da edição mais recente em múltiplas tabelas.<\/P>
Por quê, exatamente?<\/H3>Vou usar um exemplo concreto. Um dos departamentos do nosso condado acompanha reclamações de saúde. Estas são organizadas em investigações (uma camada de pontos), com um registro contínuo de notas, anexos, etc., bem como uma lista de violações associadas à investigação (duas tabelas relacionadas).<\/P>Os funcionários interagem com essas investigações por meio de uma série de Dashboards e formulários Survey123. Do ponto de vista da gestão<\/EM>, no entanto, estamos interessados em ver a atividade mais recente em uma investigação<\/EM>, independentemente da tabela específica.<\/P>Posso fazer isso sem uma expressão?<\/H3>Mais ou menos! É possível<\/EM> navegar pelos meus registros relacionados, pelo menos no Classic Map Viewer. Mas esse processo, em cliques, é assim:<\/P>Clique na feição<\/LI>Clique em Mostrar Registros Relacionados<\/STRONG><\/LI>Clique na tabela de interesse<\/LI>Opcionalmente, clique para ordenar a tabela relacionada por data para encontrar mais facilmente a edição mais recente<\/LI>Clique em Mostrar Registros Relacionados<\/STRONG><\/LI>Clique na próxima tabela<\/LI><\/OL>E assim por diante. E então eu tenho que lembrar cada valor, qual era qual, comparar na minha cabeça (já que não podem ser exibidos lado a lado), então eu tenho isso.<\/P>Talvez construir ações de seleção/filtragem no meu Dashboard ou Experience para o usuário final possa reduzir alguns cliques, mas no máximo, isso apenas traz minhas edições recentes por camada para minha visualização para que eu mesmo compare.<\/P>O que eu realmente<\/EM> quero aqui é remover essa etapa final também. Fazer a comparação e me dar a única<\/EM> edição mais recente para que eu possa saber rapidamente o que foi editado, quando e por quem.<\/P>Então, vamos ao Arcade.<\/P>NOTA: Isso pressupõe que suas camadas usam todos os campos padrão de rastreamento de editor last_edited_date<\/STRONG> e last_edited_user<\/STRONG>.<\/P><\/BLOCKQUOTE>Construindo a Expressão<\/H3>Para obter o resultado desejado, precisamos da única feição editada mais recentemente por tabela relacionada. Isso pode ser feito da seguinte forma:<\/P> <\/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">Funções Personalizadas, Combinando Funções<\/H4><P>São muitas saídas intermediárias desnecessárias que seriam repetidas para cada tabela. Sempre que possível, é desejável combinar funções juntas. Mas talvez não tanto a ponto do seu código ficar difícil de entender.<\/P><P>Considere:<\/P><PRE>First(OrderBy(FeatureSetByRelationshipName($feature, "EH_Complaints_violations"), 'last_edited_date DESC'))<\/PRE><P>Essa é uma expressão válida, mas é bem longa. Sinta-se à vontade para inserir algumas quebras de linha se isso ajudar você.<\/P><PRE>First(<BR \/> OrderBy(<BR \/> FeatureSetByRelationshipName(<BR \/> $feature,<BR \/> "EH_Complaints_violations"),<BR \/> 'last_edited_date DESC')) <\/PRE><P>Neste exemplo, porém, teremos que digitar muito disso para <EM>cada<\/EM> tabela relacionada na nossa camada. Pessoalmente, gosto de usar funções personalizadas para coisas assim. Aqui, vou usar uma função personalizada <STRONG>MostRecent<\/STRONG> para combinar as funções <STRONG>First<\/STRONG> e <STRONG>OrderBy<\/STRONG>. Posso então usar isso com cada tabela relacionada para obter minhas feições mais recentes de forma muito concisa.<\/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">Comparações<\/H4><P>Tudo isso é ótimo, mas como obtenho a feição mais recente dessas feições individuais? Eu <EM>não posso<\/EM> usar <STRONG>OrderBy<\/STRONG>, porque são feições separadas, não um FeatureSet. Existe a função <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>, porém. Mas ela recebe um array e uma função de comparação como argumentos, e estamos sem esses.<\/P><P>Bastante fácil para o array. Basta colocar colchetes e vírgulas ao redor das suas feições!<\/P><PRE>[most_recent_v, most_recent_n, $feature]<\/PRE><P>A comparação é simples. Pegando o <STRONG>last_edited_date<\/STRONG> das nossas feições, vemos qual é maior, ou seja, mais recente.<\/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>Agora temos um array de feições ordenadas da mais recentemente editada para a menos recentemente editada e podemos simplesmente pegar o valor <STRONG>First<\/STRONG> desse array.<\/P><P>A menos que... como sabemos <EM>de qual tabela ela veio?<\/EM>?<\/P><H4 id="toc-hId--1159785252">Voltar e Incluir Tabela de Origem<\/H4><P>Lá atrás na nossa expressão, temos que vincular algum identificador da tabela às feições individuais. A maneira mais simples de fazer isso é usar um <STRONG>dicionário<\/STRONG>. Ou melhor dizendo, um array de dicionários. Vamos formatar assim:<\/P><P> <\/P><pre class="lia-code-sample language-javascript"><code>[
{table: 'Detalhes da Reclamação', feat: $feature},
{table: 'Violações', feat: most_recent_v},
{table: 'Narrativa', feat: most_recent_n}
]<\/code><\/pre><P> <\/P><P>Nossa função DateSort ainda pode funcionar do mesmo jeito, mas agora precisaremos acessar a feição como um valor do dicionário maior. Ou seja,<br \/></p><PRE>a['feat']['last_edited_date']<br \/></PRE><p>E assim por diante. Agora temos nossa única feição junto com sua tabela de origem. Tudo o que resta é construir uma string de saída.<br \/></p><p> <br \/></p><pre class="lia-code-sample language-javascript"><code>return `${most_recent_feature['table']} layer
editado ${most_recent_feature['feat']['last_edited_date']}`<br \/>
MAs já falei bastante e dei peças suficientes da expressão. Vamos encerrar isto.
A Expressão Final
Aqui está tudo junto. Com alguns outros ajustes também, como adicionar o nome completo do usuário.
// Função personalizada para retornar a feição mais recente
function MostRecent(lyr){
return First(OrderBy(lyr, 'last_edited_date'))
}
// FeatureSets para cada tabela relacionada
var violations = FeatureSetByRelationshipName($feature, "EH_Complaints_violations")
var narrative = FeatureSetByRelationshipName($feature, "EH_Complaints_narrative")
// Array de dicionários de feições com tabela de origem
var feats = [
{table: 'Detalhes da Reclamação', feat: $feature},
{table: 'Violações', feat: MostRecent(violations)},
{table: 'Narrativa', feat: MostRecent(narrative)}
]
// Função de ordenação
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))
// Linhas extras para obter o nome completo do usuário
var portal = Portal('https://maps.co.kendall.il.us/portal')
var editing_user = GetUser(portal, most_recent['feat']['last_edited_user'])
// Retorna uma string formatada baseada na feição mais recente
return `${most_recent['table']} table
editado ${Text(most_recent['feat']['last_edited_date'], 'DD-MMM-YYYY')}
pelo ${editing_user}`<br \/>
E depois de tudo isso, aqui está o resultado:

Pode parecer um pouco demais para três linhas de texto, mas agora o usuário que supervisiona este programa pode obter uma informação desejada com um único clique.