Select to view content in your preferred language

Atributové pravidlo pro kontrolu jedinečnosti hodnoty atributu

261
1
Jump to solution
02-10-2025 05:39 AM
Labels (2)
honzavesely
New Contributor

Dobrý den,

prosím o radu. Vytvářím aplikaci pro editaci vyhlášky Tržního řádu hl.m.Prahy. Mám bodovou vrstvu s lokalizací místa. ID1 - číselník tržních míst, ID2 - číselník městské části ve které se bod nachází, ID3 pořadí tržního místa v rámci městské části, které si dopočítávám při založení místa jako n+1.

Tyto 3 záznamy jsou složeny v unikátní ID.

K tomu je relační tabulka 1:N obsahující kdy a co se na daném místě dá prodávat (vánoce/velikonoce atd) a navíc obsahuje ID4, kdy každý režim provozu je nový záznam.

Jednotlivá ID si posílám do tabulky atributovými pravidly abych zachoval relace při aktualizaci a tvorbě záznamů. Bohužel se mi nedaří zprovoznit kontrolu bodového jedinečného ID, aby se při následných změnách nerozpadly relace a nerozbila se data v tabulce.

Snažím se vytvořit omezující pravidlo, které mi povolí editaci pokud je ID jedinečné a pokud ho najde v seznamu existujících hodnot tak zahlásí chybu a editaci neprovede. Bohužel mi pravidlo hlásí chybu vždy i když tvořím jedinečné hodnoty ID.

// Načteme hodnoty ID1, ID2 a ID3 z aktuálního prvku
var id1 = $feature.ID1;
var id2 = $feature.ID2;
var id3 = $feature.ID3;

// Ověříme, zda hodnoty nejsou prázdné
if (IsEmpty(id1) || IsEmpty(id2) || IsEmpty(id3)) {
return "Chyba: Chybí hodnota ID1, ID2 nebo ID3.";
}

// Sestavíme nové ID jako kombinaci ID1 + ID2 + ID3
var newID = Text(id1) + Text(id2) + Text(id3);

// Získáme původní hodnotu ID z editovaného prvku (pokud existuje)
var originalFeature = $originalFeature;
var featureGlobalID = $feature.GlobalID; // Unikátní identifikátor prvku

// Načteme všechny existující hodnoty ID z bodové vrstvy
var fs = FeatureSetByName($datastore, "TrzniRad_test_b", ["ID", "GlobalID"], false);
var existingIDs = [];

// Načteme ID všech prvků, **kromě editovaného prvku**
for (var record in fs) {
if (record.GlobalID != featureGlobalID) { // Pokud není stejný GlobalID, přidáme
Push(existingIDs, Text(record.ID));
}
}

// Kontrola duplicity - pokud nové ID už existuje v seznamu, vrátíme chybu
if (IndexOf(existingIDs, newID) != -1) {
return "Chyba: ID již existuje! (" + newID + ")";
}

// Pokud ID není duplicitní, povolíme uložení
return;

 

Věděl by někdo jak poradit? Bohužel jsem v tomto začátečník a snažím se pomáhat umělou inteligencí, která mi zde již řadu pokusů nabízí stále chybné tipy.

 

Děkuji

S pozdravem

Honza Veselý

0 Kudos
1 Solution

Accepted Solutions
honzavesely
New Contributor

Dobrý den,

po pár dnech oddychu se mi to povedlo. Tak si odpovím sám pro inspiraci ostatních. 

 

// Načteme hodnoty ID1, ID2 a ID3 z aktuálního prvku
var id1 = $feature.ID1;
var id2 = $feature.ID2;
var id3 = $feature.ID3;

// Pokud je nějaká hodnota prázdná, nevracíme chybu
if (IsEmpty(id1) || IsEmpty(id2) || IsEmpty(id3)) {
return true; // TRUE = žádná chyba
}

// Sestavíme nové ID jako kombinaci ID1 + ID2 + ID3
var newID = Text(id1) + Text(id2) + Text(id3);

// Načteme GlobalID aktuálního prvku
var featureGlobalID = $feature.GlobalID;

// Načteme všechny záznamy v bodové vrstvě s odpovídajícím ID, ale jiným GlobalID
var fs = FeatureSetByName($datastore, "O_MHMP_OIC.TrzniRad_test_b", ["ID", "GlobalID"], false);
var filtered = Filter(fs, "ID = @newID AND GlobalID <> @featureGlobalID");

// Počet nalezených duplicit
var countDuplicates = Count(filtered);

// Pokud existuje duplicita, vracíme FALSE (chyba)
if (countDuplicates > 0) {
return false; // FALSE = záznam je nevalidní
}

// Pokud neexistuje žádný duplicitní záznam, vracíme TRUE (validní ID)
return true;

 

Chybou bylo především vracení true/false. Když bylo v return něco jiného tak to pak hlásilo chybu v pravidle podle nastavení vždy. Ještě je tedy přede mnou dlouhá cesta v atributových pravidlech a jak moc věřit umělé inteligenci, která mi základ výrazu sepsala 🙂

View solution in original post

1 Reply
honzavesely
New Contributor

Dobrý den,

po pár dnech oddychu se mi to povedlo. Tak si odpovím sám pro inspiraci ostatních. 

 

// Načteme hodnoty ID1, ID2 a ID3 z aktuálního prvku
var id1 = $feature.ID1;
var id2 = $feature.ID2;
var id3 = $feature.ID3;

// Pokud je nějaká hodnota prázdná, nevracíme chybu
if (IsEmpty(id1) || IsEmpty(id2) || IsEmpty(id3)) {
return true; // TRUE = žádná chyba
}

// Sestavíme nové ID jako kombinaci ID1 + ID2 + ID3
var newID = Text(id1) + Text(id2) + Text(id3);

// Načteme GlobalID aktuálního prvku
var featureGlobalID = $feature.GlobalID;

// Načteme všechny záznamy v bodové vrstvě s odpovídajícím ID, ale jiným GlobalID
var fs = FeatureSetByName($datastore, "O_MHMP_OIC.TrzniRad_test_b", ["ID", "GlobalID"], false);
var filtered = Filter(fs, "ID = @newID AND GlobalID <> @featureGlobalID");

// Počet nalezených duplicit
var countDuplicates = Count(filtered);

// Pokud existuje duplicita, vracíme FALSE (chyba)
if (countDuplicates > 0) {
return false; // FALSE = záznam je nevalidní
}

// Pokud neexistuje žádný duplicitní záznam, vracíme TRUE (validní ID)
return true;

 

Chybou bylo především vracení true/false. Když bylo v return něco jiného tak to pak hlásilo chybu v pravidle podle nastavení vždy. Ještě je tedy přede mnou dlouhá cesta v atributových pravidlech a jak moc věřit umělé inteligenci, která mi základ výrazu sepsala 🙂