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:
V ControlSource je použito klíčové slovo This
VFP jej totiž jinak vyhodnocuje když je buňka aktivní (This reprezentuje odkaz na aktivní objekt určený vlastností CurrentControl/DynamicCurrentControl) a když není aktivní (This reprezentuje odkaz na mřížku) - příklad grid_80.scx
U VFP 6.0 a vyšší se při dynamickém generování mřížky není před přiřazením zdroje dat mřížky aktivní oblast zdroje dat.
Položka nebo funkce přiřazená do vlastnosti ControlSource neexistuje, viz. grid_81.scx
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ě.
Otevře se formulář jako tabulka: USE myform.scx
Najde se požadovaný záznam mřížky (nejlépe dle názvu objektu a nařazeného objektu): LOCATE FOR OBJNAME='mujgrid' AND PARENT='myform'
Otevře se memo pole PROPERTIES, najde se řádek s přiřazením vlastnosti RecordSource a změní se na požadovanou hodnotu
Uzavře se tabulka: USE
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:
ControlSource="ALLT(memo_pole)"
ControlSource="NVL(memo_pole,'')"
Stačí tedy memo pole nevracet jako nepřímý výraz, ale zapouzdřit jej nějakou funkcí dle potřeby.