Přístup na vzdálená data pohledy,SQL příkazy

Pohledy a SPT. Co s tím ?

2) Definice pohledu (SQL příkazu)

2a) Obecný popis:
Definice pohledů mezi visuálním návrhem a SPT se opět nijak výrazně neliší. Rozdíl je pouze v tom, že pohled definovaný v DBC konteineru (a otevíraný pomocí příkazu USE) si automaticky otevírá spojení na vzdálená data. Kdežto pro pohled (SQL příkaz) SPT se musí spojení nejdříve otevřít.

2b) Vlastnosti pohledu:
Následující tabulka ukazuje seznam nastavitelných vlastností pohledu. Jak již bylo řečeno výše, některé vlastnosti se dají nastavit pouze tak, že se aplikují na 0. pohled a VFP následně tyto vlastnosti přebere pro nově otevřený pohled (takové vlastnosti mají ve 4. sloupci Ano) - CURSORSETPROP("FetchAsNeeded",.F.,0). 5. sloupec určuje, zda se daná vlastnost dá nastavit i zaběhu a nová hodnota je respektována.

Název Deaultní hodnota Popis Nutné nastavit
na 0. pohled
Nastavení
za běhu
Poznámka
FetchSize 100 Velikost stahovaného balíku dat ve větách. Ano Ano  
FetchMemo .F. Příznak, zda se mají také stahovat MEMO/OLE položky. Ano Ano Pokud je nastaveno .F. a taková položka je v SELECTu (MEMO/OLE), pak VFP pro tyto položky data nestáhne.
Při vytvoření kopie věty pomocí SCATTER ... je nutno definovat seznam položek pomocí klauzule FIELDS a vyjmout z něj všechna MEMO pole, pokud to není aktualizační pohled (OLE pole vždy ignorují).
CompareMemo .F. Příznak, zda se mají porovnávat položky typu MEMO/OLE při opravě věty s hodnotami na datové straně. Ano Ano Je vhodné ponechat defaultní nastavení, neboť při opravě věty (zde navíc záleží na nastavení vlastnosti WhereType) VFP generuje SQL příkaz pro otestování zda nedošlo ke změně hodnot a takto výsledný SQL příkaz by mohl být delší než 65 KB (MS SQL, ORACLE) nebo 8KB (ACCESS,VFP).
MaxRecords -1 Počet vět, které VFP natáhne. Ano Ano Pokud je -1, pak VFP natáhne všechny věty odpovídající klauzuli WHERE. Pokud je zadáno číslo > -1, pak VFP natáhne uvedený počet. Toto omezení se však aplikuje až ve VFP, nikoliv na datové straně !!
UseMemoSize 255 Velikost v bytes , kdy VFP z textové/binární položky udělá MEMO/OLE. Ano Ne  
FetchAsNeeded .F. Příznak , zda se mají věty natahovat postupně na pozadí (.F.), či na požádání (.T.). Ano Ano Nastavení .T. se používá pro postupné zobrazení vět uživateli (tahá se balík dat, jehož velikost je určen vlastností FetchSize).
Prepared .F. Příznak, zda se má SQL pohled "předpřipravit" (.T.) či nikoliv (.F.) . Ano Ne Pokud se bude daný pohled/SQL příkaz spouštět vícekrát, je hodné nastavit .T. .
Databázový server si pak daný pohled/SQL příkaz předkompiluje a jeho další spuštění je vždy rychlejší (neprovádí se kompilace).
Je to vhodné nastavit, pokud je pohled/SQL příkaz parametrizován.
Buffering 3 Typ bufferování tabulky. Ne Ano Zde jsou pouze povoleny hodnoty 3 - optimistické bufferování jedné věty a 5 - optimistické bufferování celeé tabulky .
UpdateNameList   Seznam položek ve VFP kurzoru a jejich odpovídající kód na datové straně. Ne Ano Nutné pro updateovací pohledy.
UpdatableFieldList   Seznam položek VFP kurzoru, které se budou ukládat na datovou stranu. Ne Ano Nutné pro updateovací pohledy.
KeyFieldList   Seznam položek VFP kurzoru tvořící primární klíč. Ne Ano Nutné pro updateovací pohledy.
To proto, aby se dala jednoznačně určit věta pro opravu a smazání.
Tables   Seznam tabulek na datové straně, kterých se týkají změny v datech. Ne Ano Nutné pro updateovací pohledy.
WhereType 3 Typ kontroly rozdílů v datech mezi VFP kurzorem a tabulkou na datové straně. Ne Ano Nutné pro updateovací pohledy.
BatchUpdateCount 1 Počet vět, které se budou aktualizovat najednou. Ne Ano Nutné pro updateovací pohledy.
Hodnota větší jak 1 pouze pro buferování celé tabulky.
Na konferenci již proběhly zmínky, že to nefunguje korektně.
SendUpdates .F. Příznak, zda se mají posílat změny z VFP kurzoru na datovou stranu. Ne Ano Nutné pro updateovací pohledy.
UpdateType 1 Způsob opravy věty na datové straně. Ne Ano Nutné pro updateovací pohledy.
V dokumentaci VFP (nebo to bylo v tom speciálním reportu ?) je napsano, že je stjně jedno co se sem nastaví, neboť DB server si stejně udělá co chce.

2c) Updateovací pohledy:

Updateovací pohledy jsou výhodné, neboť dělají spoustu věcí za programátora.



Udělat aktualizační pohled pomocí DBC konteineru je velmi jednoduché. Stačí určit položky, které se budou aktualizovat, položky které tvoří primární klíč a povolit posílání změn na databázový server.
Pokud je potřeba totéž vytvořit pomocí SPT, je nutno nastavit potřebné vlastnosti na vytvořeném VFP kurzoru.

SELECT je třeba: SELECT XX000,XX001,XX002,XX003 AS XX00X FROM XXT000

Název Hodnota vlastnosti Vysvětlení
UpdateNameList XX000 XXT000.XX000, XX001 XXT000.XX001, XX002 XXT000.XX002, XX00X XXT000.XX003 Informace o položce je tvořena dvěma části. Nejdříve je uveden název položky ve VFP kurzoru a potom , odděleno mezerou, název tabulky a položky na datové straně.
UpdatableFieldList XX000,XX001,XX002,XX00X Jde o seznam položek z VFP kurzoru, jejichž hodnota se bude promítat na datový server.
KeyFieldList XX000 Jde o seznam tvořící primární nebo kandidátní klíč pro.
Tables XXT000 Seznam tabulek, do nichž se mají promítnout změny. V případ dvou tabulek by to vypadalo takto: XXT000,XXT001.
SendUpdates .T. K tomu již není co dodat.


Poznámka: Hodnoty v seznamech jsou vždy odděleny čárkou.

Výsledný kód by tedy vypadal takto:

LOCAL lihdbc,lcAlias
lcAlias=SYS(2015)
lihdbc=SQLSTRINGCONNECT("DSN=MOJE_DSN;uid=Uziv1;pwd=Heslo1;")
=SQLEXEC(lihdbc,"SELECT XX000,XX001,XX002,XX003 AS XX00X FROM XXT000",lcAlias)
=CURSORSETPROP("KeyFieldList","XX000",lcAlias)
=CURSORSETPROP("Tables","XXT000",lcAlias)
=CURSORSETPROP("UpdatableFieldList","XX000,XX001,XX002,XX00X",lcAlias)
=CURSORSETPROP("UpdateNameList","XX000 XXT000.XX000, XX001 XXT000.XX001, XX002 XXT000.XX002, XX00X XXT000.XX003",lcAlias)
=CURSORSETPROP("SendUpdates",.T.,lcAlias)

* Nyní se můžou provádět změny v datech VFP kurzoru, které budou automaticky/ručně promítnuty na datový server.


Oprava věty:
Opravu věty ovlivňuje vlastnost WhereType. Ta určuje za jakým způsobem se testuje zda nedošlo na té samé větě ke změnám hodnot v položkách.
Pokud došlo ke změně dat (na datovém serveru), VFP vyhlásí svoji chybu - 1585 - konflikt při opravě věty.

Oprava věty s MEMO/OLE položkou:
Opravu věty ovlivňuje vlastnost CompareMemo (při špatném nastavení negativně).
Tato vlastnost musí být nastavena na:

Poznámka:
Na updateovací pohledy vytvořené pomocí SPT nelze použít funkci REQUERY() (tuto funkci lze použít jen pro pohledy definované v DBC konteineru - docela bych rád věděl proč to nejde) pro znovu načtení dat. Řeší se to tak, že se znovu spustí SELECT a znova se nastaví potřebné vlastnosti VFP kurzoru.
Funkci REFRESH() lze použít v obou dvou případech.

2d) Parametrizované pohledy a SQL příkazy:

VFP přímo podporuje parametrizované pohledy/SQL příkazy. Používá se pro to konvence: Položka=?pPoložka kde "pPoložka" je proměnná ve které je požadovaná hodnota. Znak "?" slouží pro určení, že se jedná o parametr.
Stačí nastavit novou hodnotu dané proměnné a provést znovu načtení dat. Pohledy v DBC konteineru se znovunačtou pomocí funkce REQUERY(), SQL příkazy se musejí znovu spustit.
Pokud "hrozí", že daný pohled/SQL příkaz bude spouštěn vícekrát během krátké doby pak u pohledu je vhodné nastavit vlastnost Prepared, SQL příkaz lze přepřipravit nastavením vlastnosti Prepared na nultém spojení, či použitím funkce SQLPrepare().

Výsledný kód by tedy vypadal takto:

LOCAL lihdbc,lcAlias,lcXX001
lcAlias=SYS(2015)
lihdbc=SQLSTRINGCONNECT("DSN=MOJE_DSN;uid=Uziv1;pwd=Heslo1;")
=SQLPREPARE(lihdbc,"SELECT XX000,XX001,XX002,XX003 AS XX00X FROM XXT000 WHERE XX001 LIKE ?lcXX001",lcAlias)

lcXX001="%TEST%"
* Pak už jen stačí
=SQLEXEC(lihdbc,"SELECT XX000,XX001,XX002,XX003 AS XX00X FROM XXT000 WHERE XX001 LIKE ?lcXX001",lcAlias)

* Nebo
=SQLEXEC(lihdbc)


* Nyní se může změnit hodnota vstupního parametru a znova zavolat
lcXX001="%ABC%"
=SQLEXEC(lihdbc,"SELECT XX000,XX001,XX002,XX003 AS XX00X FROM XXT000 WHERE XX001 LIKE ?lcXX001",lcAlias)

2e) Volání uložených procedur:

Slovníček pojmů a zkratek:
ConnectString - - Spojovací řetězec , jehož některé elementy můžou být specifické pro určitý ODBC driver, ale většina odpovídá standardu ODBC
ODBC driver - - Specifický driver pro konkrétní datový zdroj
DSN - Data Source Name - Název datového zdroje definovaného v ODBC manažeru
DAO - Data Access Object - Objektové rozhraní pro přístup k RD
SPT - -viz SQL Pass Through
SQL Pass Through - - Technologie pro vykonaní nativních příkazů pro datový server
ODBC - Open database connectivity - Univerzální rozhraní pro přístup k různým datovým zdrojům
RD - - Vzdálená data
DE - Developmen Environment - Vývojové prostředí
Runtime - -
OLE-DB - -
ADO - -