Mřížka, ach ta mřížka - Double trouble

Když se ztrácí obsah mřížky po příkazu PACK

Jedna z nejčastějších operací nad mřížkou je použití příkazu PACK nad exkluzívně otevřenou tabulkou. Začátečníci jsou obvykle překvapeni, že po této operaci v mřížce nejsou vidět sloupce. Existují dva triky jak tomu zabránit - použít příkaz ZAP nebo před použitím příkazu ZAP nastavit vlastnost RecordSource na prázdný řetězec (viz.
Dynamické generování mřížky).

Když se ztrácí obsah mřížky

Občas se stane, že data nejsou v mřížce zobrazena i když se zdá, že zdroje dat byly korektně přiřazeny jak mřížce, tak i sloupcům. Obvykle to mohou být tyto důvody:

Když se ztratí obsah vlastnosti ControlCource sloupce

Při změně vlastnosti RecordSource na mřížce VFP automaticky vymaže obsah vlastnosti ControlSource všech sloupců. Dá se tomu předejít dvěma způsoby. Buď se použije utilitka na vyhledání a záměnu řetezce (GoFish, Search And Replace, Code References) nebo se záměna provede ručně.

Když se při použití relací nebo dohledávání zobrazuje stejná hodnota

Ačkoliv se relace nebo příkazy SEEK() a LOCATE používají pro dotažení hodnot z dalších tabulek občas se stane, že mřížka zobrazuje stejné hodnoty. Jako 100% ukázkový příklad poslouží
grid_73.scx kde se při pohybu po hlavní mřížce zobrazí stejný popis v podřazené mřížce předchozí věty. Někdy tatáž situace nastane i jednoduchýho gridu a to ještě náhodně. Existuje pouze jedni řešení - přesypat data z více tabulek do pracovního kurzoru ať s použitím smyčky SCAN ... ENDSCAN nebo SELECT - SQL a ten potom použít jako zdroj dat pro mřížku.

Rushmore? Kde té je konec … (pro VFP 3.0-VFP 8.0)

Mřížka není seznam, ačkoliv to naprvní pohled není vidět, nemá odpovídající vlastnost ke klíčovému slovu FOR a tudíž nepodporuje technologii Rushmore. Pokud se použije příkaz SET FILTER TO na filtrovaní dat, pak je při fitrování menšího množství dat z většího je pohyb v mřížce velmi pomalý. Při fitrování dat dle indexového klíče lze použít příkaz SET KEY TO (od FP 2.6) jinak je nutné použít SELECT - SQL pro vytvoření pracovního kurzoru nebo tabulky. Ale mřížka má ve VFP 9.0 novou vlastnost Optimize, která udává, zda se má použít Rushmore technologie (.T.) či ne (.F.) se všemi neduhy které s tím souvisí. Například při vyfiltrování 2 vět z 3,775,113 příkaz GO TOP trvá 32 vteřin, LOCATE FOR .T. trvá 0.8 vteřiny ale při použití SET KEY TO je vykonání obou příkazů téměř neměřitelné.

Když se objeví "Record is not locked"/"Záznam není uzamčen"

Příkladem je
grid_82.scx, kde je hlavní a podřazená mřížka. Popis z tabulky XXT900 se dohledává pomocí metody (SEEK()) na formuláři. Při pokusu kliknutí na sloupec "Ano/Ne" v podřazené mřížce se objeví chybové hlášení. Řešením je nahradit dohledávání pomocí relace, vytvořením pracovního kurzoru nebo tabulky.

Když se objeví "The control is read-only"/"Ovládací prvek je určen ke čtení"

Příkladem je
grid_83.scx, kde je hlavní a podřazená mřížka. Data v podřazené mřížce jsou jen ke čtení (netýká se 2. a 3. sloupce) i když je mřížka ve visuálním návrhu nastavena k zápisu. Při pokusu o zápis do 1. a 4. sloupce se zobrazí chybové hlášení pokud je SET NOTIFY ON. Je to tím, že jako zdroj dat sloupce je uvedena položka bez aliasu tabulky a současně není tento alias vybrán jako aktuální.
Vrátil bych se k druhému sloupci. Ten ačkoliv má definován jako zdroj sloupce pouze položku, bez aliasu tabulky, a zároveň se pro zobrazení hodnoty používá zaškrtávací políčko nebo skupina voleb není tento sloupec jen ke čtení.

Když si ukazatel mřížky skáče kam chce

Příkladem je
grid_84.scx, kde je hlavní a podřazená mřížka. Tentokrát jsou místo tabulek použity kurzory (je jedno zda jsou vytvořené příkazem CREATE CURSOR nebo SQLEXEC()). Kurzory "DataMain" a "DataTest" jsou spojené relací, popisy se z číselníku se tahají pomocí metody na formuláři (SEEK()). Při kliknutí na první řádek podřazené mřížky se zdá, že je všechno v pořádku. Avšak při kliknutí na druhý řádek sloupce "Ano/Ne" se objeví navíc čtvrtý řádek a zakšrtávátko ve sloupci je také zatrhnuté. Jediné řešení, na které jsem narazil, bylo nahradit relaci příkazem SET FILTER TO nebo SET KEY TO či popis dotahovat pomocí relace.

Object manager internal consistency error

Příkladem je
grid_85.scx, kde v mřížce se zobrazuje memo pole. Ovšem aby se místo textu "Memo"/"memo" zobrazil text používá se jeden trik, jako zdroj dat se se název memo pole uzavírá do závorek: ControlSource="(memo_pole)". Tento způsob má však jednu nevýhodu, pokud je hodnota .NULL., dojde k vyvolání výše uvedené chyby při pohybu po mřížce. Té se dá předejít několika způsoby: Stačí tedy memo pole nevracet jako nepřímý výraz, ale zapouzdřit jej nějakou funkcí dle potřeby.