Viac

Automaticky sa zvyšujú polia atribútov pomocou kurzorov ArcPy a podmienených príkazov?


Snažím sa vytvoriť jedinečné ID pre atribút s názvom "FACILITYID" (str) a mám veľa pomoci zo súvisiacich príspevkov a online návodov pre python. Vybral som riadky, pre ktoré som chcel vytvoriť jedinečné ID, a použil som túto funkciu autoIncrement () v poľnej kalkulačke, ktorá funguje dobre.

def autoIncrement (pStart = 1, pInterval = 1): global rec if (rec == 0): rec = pStart return rec else: rec = rec + pInterval return rec

Chcel by som však sledovať premennú rec aby som mohol neskôr vytvoriť nové jedinečné ID. Keď som dospel k záveru, že sa musím pohnúť z poľnej kalkulačky, pokúsil som sa namiesto toho použiť kurzory.

Na aktualizáciu maximálnej hodnoty ID som vytvoril v prostredí dátovú tabuľku s jediným atribútom „FACILITYID“, ktorý je možné aktualizovať pri spustení kódu. Mal som s tým úspech, až na jeden malý detail: Chcem aktualizovať iba riadky, ktoré ešte nemajú FacilityID. Konkrétne chcem, aby kód fungoval iba pre riadky, kde sa FACILITYID rovná jednému znaku medzery.

FACILITYID == "

Vyskúšal som nespočetné množstvo príkazov if, zatiaľ čo cykly, funkcia getValue () atď., Ale zdá sa, že to nie je správne. Môže mi niekto pomôcť, aby tento kód fungoval pre moje polia cieľových atribútov?

#import modules import os, sys import arcpy #Set variables rec = 0 workspace = "Database Connections  FE.sde" arcpy.env.workspace = workspace feature_name = "FE.SManhole" #zmeňte triedu prvkov, ak je požadované pole = "FACILITYID" table_name = "FE.SWR_FacilityID" tRows = arcpy.SearchCursor (table_name) tRow = tRows.next () # Vytiahnite aktuálnu najvyššiu hodnotu z tabuľky Facility_ID maxID = int (tRow.getValue (pole)) # definujte funkciu automatického prírastku def autoIncrement (pStart = maxID, pInterval = 1): global rec if (rec == 0): rec = pStart return rec else: rec = rec + pInterval return rec #loop through table to update FacilityID if needed. cursor = arcpy.UpdateCursor (feature_name) # Neexistuje žiadna záruka poradia pre riadok v kurzore: ##### umiestnenie, kde som sa snažil if vyhlásenia. #### row.setValue (pole, str (autoIncrement () )) cursor.updateRow (riadok) #save new rec value to FE.SWR_FacilityID table maxID = rec tRows = arcpy.UpdateCursor (table_name) tRow = tRows.next () tRow.setValue (pole, str (maxID)) tRows.updateRow (tRow) del tRows, tRow, kurzor, tlač riadkov „Najvyššia hodnota„ FACILITYID “Hodnota:„ + str (maxID)

Som v pythone veľmi nový a väčšinu tohto kódu som získal z predchádzajúcich príspevkov vrátane automatického zvyšovania v skripte Python s kurzorom ArcPy?


Funkcia, ktorú používate na automatické zvyšovanie ID, je určená na použitie v poľnej kalkulačke; v poľnej kalkulačke musíte definovať globálnu premennú, ktorú majú používať ďalšie riadky v tabuľke, inak by boli všetky vaše hodnoty 1. Pre vaše účely musíte nevyhnutne definovať rec ako globálnu premennú a nepotrebujete na vytvorenie funkcie na pridanie 1 (stačí použiťrec + = 1).

Problém: Máte tabuľku zariadení, niektoré zariadenia už majú identifikačné čísla a iné nie. ID je číselná hodnota, ktorá je uložená v textovom poli, takže musíte nájsť najväčšie ID číslo, ktoré je už priradené, a sledovať najväčšie ID, ktoré váš skript priradil. Predpokladám, že nechcete automaticky priradiť ID, ktoré je už priradené k inému riadku (čím sa vaše pole stane primárnym kľúčom).

S kurzorom arcpy.da môžete mať do kurzora zabudovaný dotaz (kde je klauzula), takže prechádzate iba riadky, ktoré vyhovujú podmienkam dotazu (http://desktop.arcgis.com/en/arcmap /10.3/analyze/arcpy-data-access/updatecursor-class.htm). Skúste to:

import os, sys import arcpy #Set premenné rec = 0 workspace = "Database Connections  FE.sde" arcpy.env.workspace = workspace feature_name = "FE.SManhole" #zmeňte triedu funkcií, ak je požadované pole = ["FACILITYID"] table_name = "FE.SWR_FacilityID" ### Vytvorte zoznam všetkých ID zariadení, ktoré sú už vyplnené ### preveďte každú položku na celé číslo, ak položka nie je "alebo" alebo Žiadne ####### Predpokladám, že váš ID sú celé čísla, ale možno budete musieť zmeniť toto all_facility_ids = [int (x [0]) pre x v arcpy.da.SearchCursor (feature_name, pole), ak x [0] nie je v [",", None]] # ## Zoradiť zoznam ID (od najmenších po najväčšie) a vrátiť poslednú položku max_id = zoradené (all_facility_ids) [- 1] # prehrať dáta pomocou arcpy.da.UpdateCursor (oveľa rýchlejšie) # kurzory arcpy.da majú možnosť použite dotaz, takže urobíme tento dotaz = "FACILITYID nie je v (", ", NULL)" s arcpy.da.UpdateCursor (feature_name, pole, dotaz) ako kurzor: pre riadok v kurzore: zatiaľ čo True: ## Táto časť sa bude neustále pridávať k rec, ak je číslo už v th Zoznam ID zariadení, ak rec v all_facility_ids: rec + = 1 else: rec + = 1 riadok zalomenia [0] = str (rec) cursor.updateRow (riadok) del kurzor

Toto je ďalšia možnosť, ak chcete použiť príkaz if na iteráciu vo všetkých riadkoch:

s arcpy.da.UpdateCursor (feature_name, pole) ako kurzor: pre riadok v kurzore: ak riadok [0] nie je v (",", None): while True: ## Táto časť bude neustále pridávať do rec, ak je číslo už v zozname ID zariadení, ak rec v all_facility_ids: rec + = 1 else: rec + = 1 riadok zalomenia [0] = str (rec) cursor.updateRow (riadok) else: pokračujte del kurzor

Podmienené MLE pre auto-regresný model je možné vyriešiť pomocou štandardnej teórie lineárnej regresie. Je ľahké to urobiť v maticovej forme a použiť štandardný vzorec pre odhad koeficientu v tejto podobe. Napriek tomu je možné problém maximalizácie vyriešiť v skalárnej podobe a ukážem vám, ako na to.

Váš súčet v tejto podmienenej pravdepodobnosti je napísaný nesprávne. Predpokladám, že ste pozorovali časové hodnoty $ t = 1, 2,. T $, v takom prípade podmieňujeme hodnoty $ t = 1, 2 $ a súčet ide od $ t = 3,. T $. Je to tiež jednoduchšie, ak svoje rovnice napíšete pomocou parametra presnosti $ lambda equiv sigma ^ <-2> $. Vďaka týmto zmenám a ďalšiemu zjednodušeniu odstránenia aditívnych konštánt možno funkciu podmieneného logaritmu pravdepodobnosti zapísať ako:

$ ell ( phi_1, phi_2, lambda) = frac <2> cdot ln ( lambda) - frac < lambda> <2> sum_^ T (x_t - phi_1 x_ - phi_2 x_)^2.$

Pre uľahčenie našej analýzy definujeme množstvá vzorky $ s_ equiv sum_^ T x_ X_$ za $ i, j = 0, 1, 2 $. Pomocou tejto notácie sú skóre skóre:

Auto-regresné koeficienty: Podmienené MLE pre autoregresné koeficienty riešia simultánne rovnice:

Výsledkom riešenia týchto rovníc je:

Parameter odchýlky / presnosti: Podmienená MLE pre rozptyl / presnosť sa získa nastavením prvej z skóre rovníc na nulu a nahradením odhadov za auto-regresné koeficienty. Je to dané:

Toto je zaujatý odhad a na jeho opravu sa zvyčajne používa Besselova korekcia nahradením $ T-3 $ v menovateli namiesto $ T-2 $.


Ako môžem dynamicky vykresliť požadované polia pomocou dynamického komponentu

Mám stránku Visualforce, na ktorej vykresľujem veľa polí pomocou dynamického komponentu (čo je výstupný panel, ktorý obsahuje všetky polia). Polia sa pridávajú na základe výberu možností v zozname s viacerými zoznamami a zakaždým, keď sa uskutoční výber v zozname s viacerými zoznamami, stránka sa znova vykreslí zo strany servera, aby sa zobrazil nový výber polí. Niektoré z týchto polí musia byť povinné.

Kedykoľvek sa na stránke vyžaduje pole a výber sa zmení v zozname mutipicklist, ktorý riadi, ktoré polia sa majú vykresliť, Visualforce spôsobí chybu, že pole nebolo vyplnené, aj keď má byť na základe výberu odstránené. Toto zabráni odstráneniu poľa a polia na stránke sa neaktualizujú kvôli tejto chybe Visualforce.

Napadlo mi teda vytvoriť si vlastnú požadovanú funkcionalitu pomocou nástroja jQuery a JavaScriptu na overenie na strane klienta pomocou metódy overovania v Apexe na strane servera.

Existuje lepší spôsob, ako to urobiť? Ak nie, ako môžem duplikovať „požadovanú“ funkčnosť Visualforce (so zobrazením červeného pruhu vedľa každého z povinných polí).

Pre referenciu

Tu je časť mojej súčasnej stránky Visualforce. Products je zoznam viacerých položiek, kedykoľvek kliknete na príkazové tlačidlo, polia sa znova vykreslia.

Metóda SelectProduct je mimoriadne jednoduchá. Je to len metóda, ktorá nič nerobí a nič nevracia. Používa sa hlavne na vykonanie spiatočnej cesty na server a opätovné vykreslenie vlastnosti SectionsAndFields. Ukážku kódu vlastnosti SectionsAndFields nájdete v tejto odpovedi na inú otázku.


Pridajte atribút onchange do apex: inputField (Field1), ktorý volá funkciu JavaScriptu, keď sa Field1 zmení, aby vyhodnotil požadovanú hodnotu pre Field2, napr .:

Pri prístupe k prvkom VF z JavaScriptu buďte opatrní, pretože to môže byť trochu frustrujúce na základe toho, ako Visualforce generuje HTML - môžete buď použiť $ Component, alebo použiť vygenerovanú syntax stromu prvkov.

Vytvorte jedno pole s číslom (pole 1) a potom vytvorte jedno pole so vzorcom (typ: Number). Vložte vzorec ako Test_Number__c + 30, kde Test_Number__c je prvé pole s číslom. To by malo stačiť na to, ako je uvedené. Upozorňujeme, že pole vzorca sa na stránke úprav nezobrazí, ale hodnota sa zobrazí na stránke podrobností po uložení záznamu príležitosti.


Je možné vo formulároch SharePointu uviesť podmienené povinné pole?

Mám zoznam SharePointu s niekoľkými poľami, ktoré sa používajú na vytvorenie adresára tlačiarne.

Okamžite mám pole Áno / Nie „Sieťová tlačiareň“, aby som určil, či musím zbierať ďalšie údaje, ako je IP adresa a podsieť. Zatiaľ mám toto pole označené ako nepovinné a zmeňte vstupný formulár v aplikácii InfoPath tak, aby ich skryl, akonáhle niekto vo výbere sieťovej tlačiarne zvolí možnosť „Nie“, aby koncový používateľ vedel, že tieto informácie nemusí vyplniť. v.

Bol by som rád, keď používateľ zvolí možnosť „Áno“, aby nemohol pridať položku do zoznamu, kým nevyplníte tieto technicky povinné polia.


2 odpovede 2

Robím podobnú vec na základe vstupu do rozbaľovacej ponuky, môžete to pre svoje účely zrefaktorovať.

Vyššie uvedené vráti hodnotu true, ak je podmienka splnená, a hodnotu false, ak nie. Výsledkom je podmienene požadované pole.

Takže ak ste sa chceli ubezpečiť, že pole napríklad nie je prázdne, môžete urobiť niečo ako:

Ak v poli nie je žiadny text, vráti sa hodnota required.

Tieto veci môžete tiež založiť na rôznych vlastnostiach štýlu, tu je príklad kontroly, či má pole červený okraj:


Nedeľa 24. júla 2016

GIS5103 - Modul 10 - Vytváranie vlastných nástrojov

V tomto module sme mali za úlohu vytvoriť vlastný orezávací nástroj. Premena vášho skriptu Python na nástroj je jednoduchý spôsob zdieľania funkcií vášho skriptu s ostatnými.

Prvým krokom bolo vytvorenie skriptu Python. Dostali sme šablónu na úpravu. Po druhé, bolo treba vytvoriť nový súbor nástrojov. Po pridaní skriptovacieho nástroja do panela nástrojov sme nastavili vlastnosti nástroja. Náš upravený skript v jazyku Python bol súbor skriptu a boli vytvorené štyri parametre: umiestnenie vstupného súboru, hraničná funkcia klipu, vstupné funkcie a umiestnenie výstupného súboru. Dôležitým krokom bolo nastavenie dátového typu a hodnôt. Vyžadujú sa úplné cesty k súboru, ale úvodzovky nie sú potrebné.

Dialógové okno nástroja MultiClip Tool

Po nastavení vlastností nástroja sme potrebovali upraviť náš skript v jazyku Python, aby používatelia mohli zadávať parametre. Používanie funkcií GetParameter () a GetParameterAsText () mi spôsobilo určité ťažkosti. Potreboval som pochopiť, či je vracaný objekt reťazec alebo nie. Náš parameter vstupných funkcií bol viachodnotový, čo znamená, že môže byť poskytnutá viac ako jedna hodnota alebo zoznam. Skript Python použil slučku „pre“ na iteráciu nad každou vstupnou funkciou v zozname. Tiež sme museli nahradiť pôvodné „tlačové“ príkazy skriptu Python funkciou AddMessage. Používanie správ s povolením príkazov AddMessage, ktoré sa majú zobraziť v dialógovom okne s postupom nástroja a v okne s výsledkami.

Výsledky nástroja MultiClip v module 10
Pre každú vstupnú funkciu je vytlačený jej názov. Po vykonaní analýzy klipov sa vytlačí názov novovytvoreného orezaného prvku.

Rozhodol som sa skontrolovať, či nástroj pracuje aj s iným hraničným prvkom. Vytvoril som mapu zobrazujúcu funkcie orezané Durango aj funkcie orezané NuevoLeon.

Záverečná mapa modulu 10 -
vstupné funkcie mex_rivers, mex_roads, mex_rails a mex_urban sú pripnuté k funkciám Durango aj NuevoLeon.
Nakoniec som vytvoril vývojový diagram skriptu použitého v nástroji.

Vývojový diagram modulu 10 MultiClip Script
Pre toto zadanie som musel použiť pomocné zdroje ArcGIS, aby som lepšie pochopil funkcie v skripte a ich príslušné argumenty. Pozrieť sa na ukážky kódu bolo užitočné. Tiež som si všimol, že v dokumentácii bol niekedy rozdiel medzi pro.arcgis.com a desktop.arcgis.com

Toto zadanie mi skutočne pomohlo vidieť užitočnosť nástrojov. Takto je ľahké replikovať nástroj medzi rôznymi funkciami a rôznymi parametrami.


1 odpoveď 1

Ak vám záleží na čase, čas by mal byť vo vašej databáze. Obdobie. Chcete vidieť prípad, keď by použitie sekvencie mohlo zlyhať (nie som si istý, či by sa to isté mohlo stať aj pri automatických prírastkoch MySQL)?

Ak požadujete hodnotu zo sekvencie v transakcii, nevytiahnete iba ďalšiu hodnotu, DB pre vás vyhradí celý blok hodnôt. To sa deje kvôli zníženiu réžie pri správnom uzamknutí sekvencie a manipulácii s viacerými súčasnými pripojeniami. Pozrime sa na tento sled udalostí:

  • Klient č. 1 sa pripája k serveru
  • Klient č. 1 požaduje hodnotu zo sekvencie
  • DB rezervuje pre klienta č. 1 - 10, dáva klientovi č. 1 hodnotu 1
  • Klient č. 1 vloží číslo 1 do tabuľky
  • Klient č. 1 sa rozhodne urobiť niečo, čo bude nejaký čas trvať
  • Klient č. 2 sa pripája k serveru
  • Klient č. 2 požaduje hodnotu zo sekvencie
  • Spoločnosť DB vyhradzuje 11-20 pre klienta č. 2, dáva klientovi č. 2 hodnotu 11
  • Klient č. 2 vloží 11 do tabuľky
  • Klient č. 2 sa zaviaže a odpojí
  • Klient č. 1 požaduje ďalšiu hodnotu zo sekvencie
  • Spoločnosť DB dáva klientovi č. 1 hodnotu 2
  • Klient # 1 vloží 2 do tabuľky
  • Klient č. 1 sa zaviaže a odpojí

Aký je stav databázy teraz? V tabuľke máte 1, 2 a 11, ale riadok s 2 je najnovší. Zoradenie podľa tejto hodnoty vám poskytne nesprávny výsledok.


2 odpovede 2

To, čo navrhujete, je možné vykonať iba s MySQL čisto za troch (3) podmienok

  • PODMIENKA # 1 : Použite úložný modul MyISAM
  • PODMIENKA # 2 : Nastaviť stĺpec auto_increment ako súčasť zloženého primárneho kľúča
  • PODMIENKA # 3 : Každý auto_increment pre daný typ musí existovať vo svojom vlastnom riadku

Tu je vaše pôvodné rozloženie tabuľky

Na základe troch podmienok, ktoré som práve spomenul, je tu nové navrhované rozloženie tabuľky:

Tu je príklad pomocou vzorových údajov a jazyka SQL:

CAVEAT: V súčasnosti podporuje iba server MyISAM Storage Engine viacero hodnôt auto_increment zoskupených s inými stĺpcami. To nie je možné, ak je InnoDB založený na stĺpcoch auto_increment viazaných priamo na gen_clust_index (alias klastrovaný index) .


7 odpovedí 7

Keď zašednete ovládací prvok, komunikujete tým, že „niečo je momentálne zakázané, ale môže byť dostupné, ak na stránke urobíte niečo iné“.

Jedinou nevýhodou tohto prístupu je, že zakázané ovládacie prvky budú zaberať miesto na stránke, takže ak sa tieto zakázané ovládacie prvky používajú zriedka a / alebo ich je veľa, mohlo by to za veľmi malú hodnotu pridať zbytočnú vizuálnu zložitosť.

Keď niečo skryjete a odhalíte to iba na požiadanie, keď je to potrebné (progresívne zverejňovanie), zaistí to, že stránka bude jednoduchá, až kým nebudú potrebné ďalšie okolnosti.

Jedinou nevýhodou tohto prístupu je, že sa stránka bude musieť prispôsobiť, aby sa zobrazili novo odhalené ovládacie prvky. Je nepravdepodobné, že používateľa prekvapí postupné zverejňovanie, pretože ide o robustný interakčný vzor, ​​ktorý existuje už mnoho rokov.

Oba prístupy sú platné a majú svoje klady a zápory. Vaše rozhodnutie bude nakoniec založené na hodnote ďalších kontrol, množstve ďalších kontrol a frekvencii ich používania.

Prečo mať samostatné textové pole pre každé pole, ak môže používateľ zadať hodnotu iba raz? Stačí mať jediné textové pole na uchovanie hodnoty akejkoľvek možnosti, ktorú vyberú:

Štítok poľa sa môže meniť podľa toho, ktorú možnosť vyberú. Toto pole môžete buď skryť, kým nevyberú jednu z možností, alebo len nechať označiť niečo všeobecné, aby sa mohlo vzťahovať na ktorúkoľvek z možností.

Vidím obe strany týchto dizajnov a nemyslím si, že je to „nesprávne“, ale vždy by som odporúčal, aby boli veci pre používateľa jednoduché. V tomto prípade by to znamenalo mať políčka viditeľné, ale sivé.

Týmto sa dosiahnu dve veci:

  1. Používateľ si je od začiatku vedomý, že bude musieť preukázať ďalší text. Ak by bolo políčko skryté, percento používateľov by ho iba zaškrtlo a myslelo by si, že bolo urobené, len aby sa rozčuľoval vyskakujúcou chybou „Poskytnite údaje“.
  2. Technických obáv je menej. Keď sa veci objavia, vaše rozloženie stránky sa nezmení / nemusíte sa starať o vymazanie / uchovanie údajov. Jednoduché veci, ale všetky prispievajú k testovacím podmienkam potrebným pre váš produkt.

Vzhľadom na povahu údajov, ktoré zachytávate, by som namiesto rozbaľovacích výberov napadol použitie začiarkavacích políčok. Sú začiarkavacie políčka potrebné? Vždy sú šikovní, najmä pokiaľ ide o návrhy pre mobilné zariadenia.

V spoločnosti, kde pracujem, chce tím UX vždy „každý vstup viditeľný pre používateľa“ jednak preto, že komunikujete používateľa s celým procesom, jednak preto, že objavujúce sa pole je ťažšie rozpoznateľné, čo vedie k mnohým chybám pri vyplňovaní vstupy pred odoslaním formulára.

To je celkom vždy pravda, ale samozrejme existujú aj nejaké okrajové prípady, napríklad ak je forma skutočne chaotická, potom niečo vyčistite a nechajte pole, aby sa objavilo (nejakým efektným spôsobom viditeľné), mohlo by to byť lepším spôsobom.

Ak ich najskôr skryjete a ukážete ich po výbere prepínača, musíte naznačiť, že sa tak stane. Ak tak neurobíte, používatelia nemusia očakávať, že sa tak stane, a môžu byť zmätení alebo dokonca naštvaní skutočnosťou, že na dokončenie tejto časti formulára musia urobiť „ešte jednu“ akciu.

Ak nemôžete jasne určiť, aký bude ďalší krok používateľa, jeho zobrazovanie od začiatku, ale jeho deaktivácia (napríklad jeho zašednutie) pravdepodobne poskytne lepší prehľad o tom, čo bude musieť používateľ ďalej urobiť, a tým poskytuje lepšiu používateľskú skúsenosť.

Pokiaľ hovoríme o webovej stránke, na mobilných zariadeniach s menšími obrazovkami si viem predstaviť problémový prístup „skryť“.

Pri prehliadaní mobilných telefónov mám vo zvyku zväčšiť a „prispôsobiť“ šírku čítaného textu šírke obrazovky (dvojitým klepnutím na text). Takto mám maximálnu veľkosť textu bez toho, aby som stratil veľa informácií o tom, kde sa v dokumente nachádzam (aspoň bočne). Ak sa rozhodnete pre prístup „skryť“ a vaši používatelia mobilných zariadení zväčšia text rovnako ako ja, spočiatku nebudú vidieť textové polia, ktoré sa zobrazia pri výbere.

Povedal by som teda „vypnúť“, „neskryť“.

Najradšej by som ich skryl a ukázal pri vznášaní. to prinesie používateľovi myšlienku, že musí vybrať (kliknúť) na pole a vložiť text. používateľ bude hrať najskôr s ukazovateľom hore a dole a veľmi ľahko si všimne, že vstupné pole zostane zobrazené vždy, keď klikne.

Nie som s myšlienkou úplne to skryť, pokiaľ nekliknete. náhle konanie nie je dobrým zvykom. a tiež mi nejde o to, aby som im to ukázal a deaktivoval. na stránky vložíte prvky, aby ste ich nezakázali, čím získate predstavu, že na stránke nie je niečo v poriadku. a samozrejme nie som s kombináciou všetkých rádio boxov so vstupným boxom, pretože toto riešenie nebude mať na pamäti, že existuje vstupné pole súvisiace s tým, ktorý prepínač som práve vybral, čo ak si užívateľ čo rozmyslí a vyberte iný prepínač !!

Moje riešenie je teda medzi všetkými ostatnými riešeniami, skrýva vstupné pole a zároveň ich zobrazuje a rozhodnutie v rukách používateľov. závisia od okamihu jeho ukazovateľa.


Nemôžete odovzdať parametre do väzieb metód vytvorených na stránke Visualforce vášmu radiču, podľa témy pomocníka tu môžete poskytnúť iba metódy „action“, „get“ a „set“.

S cieľom implementovať vašu požiadavku by som vám odporučil zvážiť pohľad na komponenty Visualforce Components, aby ste mohli mať niečo podobné

Tento komponent by interne používal komponent apex: outputText, ako je uvedené vyššie, jeho radiču by však bola odovzdaná hodnota „test“ ako atribút komponentu. Na ovládači by ste mali getFormattedValue na výstup formátovanej verzie.


Pozri si video: Müller. Heinrich Müller. Gestapo (Október 2021).