Visual FoxPro 9.0 — Referenční příručka

Komplexní průvodce jazykem a prostředím | Verze 9.0 SP2 | Český jazyk

Visual FoxPro 9.0 je objektově orientovaný procedurální jazyk s integrovaným databázovým enginem. Tato příručka pokrývá celý jazyk od základní syntaxe po pokročilé techniky včetně OOP, SQL, COM a tvorby formulářů.

1. Úvod a historie

Visual FoxPro (VFP) je integrované vývojové prostředí a programovací jazyk pro tvorbu databázových aplikací pro Windows. Vychází z dBASE/FoxBASE rodiny xBase jazyků.

Historický přehled

VerzeRokKlíčové novinky
FoxBASE+1986dBASE klon firmy Fox Software
FoxPro 1.0–2.61989–1993Rushmore optimalizace, GUI nástroje
Visual FoxPro 3.01995OOP, DBC databázový kontejner
VFP 5.0–6.01997–1998COM Automation, ActiveX
VFP 7.0–8.02001–2003Intellisense, TRY/CATCH, XMLAdapter
VFP 9.02004Vylepšený Report Designer, CursorAdapter, lepší SQL
VFP 9.0 SP22007Poslední oficiální verze, ukončení vývoje
Životní cyklusMicrosoft ukončil podporu produktu v roce 2015. Existuje však aktivní komunita (VFPX na GitHubu) udržující rozšíření a opravy. VFP 9 SP2 stále funguje na všech moderních verzích Windows včetně Windows 11.

Klíčové vlastnosti

  • Integrovaný databázový engine s formátem .dbf (max. 2 GB na tabulku)
  • Lokální i SQL Server přístup k datům
  • Plnohodnotné OOP — dědičnost, polymorfismus, vizuální dědičnost tříd
  • SQL syntaxe pro práci s lokálními i vzdálenými daty
  • Rushmore optimalizace dotazů přes indexy
  • Vestavěný Form Designer, Report Designer, Class Designer
  • COM/COM+ servery, ActiveX hosting
  • Práce s XML přes XMLAdapter a CursorAdapter

2. IDE a prostředí

Hlavní okna

  • Command Window — interaktivní okno pro psaní příkazů, otevírá se přes Ctrl+F2
  • Project Manager — správa projektu a všech jeho souborů (.pjx)
  • Form Designer — vizuální návrh formulářů
  • Report Designer — návrh reportů (přepracovaný ve VFP 9)
  • Class Designer — vizuální tvorba a editace tříd
  • Database Designer — návrh struktury DBC s relacemi

Typy souborů

PříponaObsah
.prgProgram (zdrojový kód)
.fxpZkompilovaný program
.dbfTabulka (volná, nebo součást DBC)
.fptMemo soubor k tabulce
.cdxStrukturální složený index k tabulce
.idxSamostatný (single) index
.dbcDatabázový kontejner
.scx / .sctFormulář
.vcx / .vctKnihovna vizuálních tříd
.frx / .frtReport
.mnx / .mntMenu
.pjx / .pjtProjekt
.app / .exeZkompilovaná aplikace

Spouštění a kompilace z příkazového okna

DO mojeProgram                && spuštění .prg souboru
COMPILE mojeProgram           && kompilace na .fxp
MODIFY COMMAND mojeProgram    && otevření v editoru
BUILD APP mujProjekt FROM mujProjekt.pjx
BUILD EXE mujProjekt FROM mujProjekt.pjx

3. Základní syntaxe

Obecná pravidla

  • Jazyk je case-insensitive — SELECT, Select a select jsou totéž.
  • Identifikátory mohou mít až 254 znaků, začínají písmenem nebo podtržítkem.
  • Příkaz se ukončuje koncem řádku. Pro pokračování na další řádek se používá středník ;.
  • Klíčová slova lze zkracovat na první 4 znaky: REPLACE = REPL, MODIFY = MODI.

Komentáře

* Komentář na celém řádku (musí být první znak)
&& Komentář na konci řádku
NOTE Toto je také komentář
? "Hello"  && vypíše Hello

Pokračování řádku

SELECT jmeno, prijmeni, ;
       narozeni, mesto ;
   FROM klienti ;
   WHERE aktivni = .T.

Logické konstanty

Pravdivostní hodnoty se zapisují jako .T. (true) a .F. (false). Lze také .Y./.N. pro yes/no a .NULL. pro nedefinovanou hodnotu.

Literály

cText  = "Petr"            && řetězec (uvozovky nebo apostrofy)
cText2 = 'Klient: "Novák"'
nCislo = 3.14              && číslo
nHex   = 0x1A              && hexadecimálně (= 26)
dDatum = {^2026-05-05}      && ISO formát data — vždy bezpečné
tDatCas = {^2026-05-05 14:30:00}
lLog   = .T.
xNic   = .NULL.
Pozor na formát dataZápis {05/05/2026} závisí na SET DATE a může se chovat různě. Vždy používejte ISO formát {^YYYY-MM-DD}, který je nezávislý na nastavení.

4. Datové typy

Datové typy proměnných

TypSymbolRozsah / popis
CharacterCŘetězec, max. 16 777 184 znaků
NumericNČíslo s plovoucí čárkou, ±0.99999×10⁻¹⁹ až 0.99999×10²⁰
CurrencyYMěna, 4 desetinná místa, ±922 337 203 685 477.5807
DateDDatum, 01/01/0001 až 12/31/9999
DateTimeTDatum a čas
LogicalL.T. / .F.
IntegerICelé číslo, –2 147 483 647 až 2 147 483 647
DoubleB64-bit floating point
MemoMDlouhý text uložený v .fpt
GeneralGOLE objekt
ObjectOReference na objekt
VariantVVariant, generic field
BlobWBinární data (od VFP 9)VFP 9
VarcharVŘetězec proměnné délky VFP 9
VarbinaryQBinární data proměnné délky VFP 9

Datové typy v tabulkách (DBF)

Při definici sloupce v CREATE TABLE nebo Table Designeru se uvádí typ a délka:

CREATE TABLE klienti ( ;
   id        I, ;                         && integer
   jmeno     C(30), ;                   && character, 30 znaků
   prijmeni  C(50), ;
   narozeni  D, ;                         && date
   plat      Y, ;                         && currency
   poznamka  M, ;                         && memo
   aktivni   L, ;                         && logical
   vytvoreno T, ;                         && datetime
   foto      W, ;                         && blob (VFP 9)
   email     V(100) ;                  && varchar (VFP 9)
)

Konverzní funkce

FunkceKonverze
VAL(c)Řetězec → číslo
STR(n, len, dec)Číslo → řetězec
TRANSFORM(x, [pic])Cokoli → formátovaný řetězec
CTOD(c)Řetězec → datum (závisí na SET DATE)
DTOC(d)Datum → řetězec
DTOS(d)Datum → řetězec ve formátu YYYYMMDD
CTOT(c)Řetězec → datetime
TTOC(t)Datetime → řetězec
CHR(n) / ASC(c)Číslo ↔ ASCII znak
BINTOC(n, [size])Číslo → binární řetězec
CTOBIN(c)Binární řetězec → číslo
CAST(expr AS type)SQL-style přetypování
? VAL("123.45")               && 123.45
? STR(3.14159, 8, 3)            && "   3.142"
? TRANSFORM(12345.6, "@$ 999,999.99")   && "$ 12,345.60"
? DTOS(DATE())                && "20260505"

5. Proměnné a paměť

Deklarace proměnných

VFP nevyžaduje explicitní deklaraci typu — typ je odvozen z přiřazené hodnoty. Doporučuje se ale deklarovat scope.

LOCAL nCislo, cText, dDatum
PRIVATE nGlob
PUBLIC goApp                 && viditelné kdekoli

nCislo = 42
cText  = "Ahoj"
dDatum = DATE()

Scope (rozsah platnosti)

Klíčové slovoVýznam
LOCALPouze v aktuální proceduře/funkci. Doporučeno pro většinu proměnných.
PRIVATEAktuální procedura + všechny volané (dynamický scope).
PUBLICGlobální, přístupná odkudkoli, žije do RELEASE.
LOCAL ARRAYLokální pole.

Maďarská notace ve VFP

Tradičně se používají prefixy podle typu:

PrefixTypPříklad
nNumeric/IntegernPocet
cCharactercJmeno
dDatedNarozeni
tDateTimetVytvoreno
lLogicallAktivni
oObjectoForm
aArrayaSeznam
gGlobal (kombinuje se)goApp, gnUserID

Práce s pamětí

RELEASE nCislo                && uvolní jednu proměnnou
RELEASE ALL                  && uvolní všechny privátní
RELEASE ALL LIKE n*          && vše začínající "n"
CLEAR MEMORY
? TYPE("nCislo")             && "U" pokud neexistuje
? VARTYPE(nCislo)             && "N", "C", "D" atd.
? USED("klienti")             && .T. pokud je tabulka otevřena

6. Operátory

Aritmetické

OperátorPopisPříklad
+Sčítání / spojování řetězců3+4, "a"+"b"
-Odečítání / spojení s odstraněním koncových mezer"abc "-"d" = "abcd "
*Násobení3*4
/Dělení10/3
%Modulo10%3 = 1
^ nebo **Mocnina2^10 = 1024

Porovnávací

OperátorPopis
=Rovno (chování závisí na SET EXACT)
==Striktně rovno (řetězce přesně)
!=, #, <>Nerovno
<, >, <=, >=Menší / větší
$Substring — "oh" $ "Ahoj" = .T.

Logické

.AND.   && logické AND
.OR.    && logické OR
.NOT.   && negace, lze i ! (vykřičník)

? (5 > 3) .AND. (2 < 4)     && .T.
? .NOT. .T.                  && .F.
SET EXACT ON/OFFPři SET EXACT OFF (default) je "Petr" = "P" pravda — porovnává jen do délky pravého operandu. Při SET EXACT ON musí být řetězce stejné. Pro striktní porovnání používejte ==.

Operátor přiřazení

x = 5           && jednoduché přiřazení
STORE 10 TO a, b, c    && vícenásobné přiřazení
STORE "" TO cText

7. Řídicí struktury

IF...ELSE...ENDIF

IF nVek >= 18
   ? "Plnoletý"
ELSE
   ? "Nezletilý"
ENDIF

DO CASE

DO CASE
   CASE nDen = 1
      cText = "pondělí"
   CASE nDen = 2
      cText = "úterý"
   CASE nDen BETWEEN 3 AND 5
      cText = "střed týdne"
   OTHERWISE
      cText = "víkend"
ENDCASE

Funkce IIF (ternary)

cTyp = IIF(nVek >= 18, "plnoletý", "nezletilý")
cText = ICASE( ;
   nVek < 13, "dítě", ;
   nVek < 20, "teenager", ;
   nVek < 65, "dospělý", ;
   "senior")

Smyčka FOR ... ENDFOR

FOR i = 1 TO 10
   ? i, i*i
ENDFOR

FOR i = 100 TO 1 STEP -5
   ? i
ENDFOR

FOR EACH (pro pole a kolekce)

LOCAL ARRAY aBarvy(3)
aBarvy(1) = "červená"
aBarvy(2) = "zelená"
aBarvy(3) = "modrá"

FOR EACH cBarva IN aBarvy
   ? cBarva
ENDFOR

DO WHILE ... ENDDO

i = 1
DO WHILE i <= 10
   ? i
   i = i + 1
ENDDO

&& Standardní procházení tabulky
SELECT klienti
GO TOP
DO WHILE .NOT. EOF()
   ? klienti.jmeno, klienti.prijmeni
   SKIP
ENDDO

SCAN ... ENDSCAN (pro tabulky)

Kratší a idiomatičtější způsob procházení tabulky:

SELECT klienti
SCAN FOR aktivni = .T. .AND. mesto = "Praha"
   ? jmeno, prijmeni
ENDSCAN

&& SKIP a ukazatel se posouvají automaticky

Řídicí příkazy uvnitř smyček

PříkazPopis
EXITUkončí nejvnitřnější smyčku (jako break)
LOOPPokračuje další iterací (jako continue)
RETURNNávrat z procedury
FOR i = 1 TO 100
   IF i % 2 = 0
      LOOP           && přeskoč sudá
   ENDIF
   IF i > 50
      EXIT           && ukonči
   ENDIF
   ? i
ENDFOR

8. Procedury a funkce

Definice procedury / funkce

PROCEDURE Pozdrav(cJmeno)
   ? "Ahoj " + cJmeno
ENDPROC

FUNCTION Soucet(n1, n2)
   RETURN n1 + n2
ENDFUNC

&& Volání
DO Pozdrav WITH "Pavel"
? Soucet(3, 5)

Parametry

FUNCTION Pozdrav(cJmeno, cTitul)
   LOCAL cVysledek
   IF EMPTY(cTitul)
      cVysledek = "Ahoj " + cJmeno
   ELSE
      cVysledek = "Vážený(á) " + cTitul + " " + cJmeno
   ENDIF
   RETURN cVysledek
ENDFUNC

? Pozdrav("Petr", "")
? Pozdrav("Petr", "Ing.")

Předávání hodnotou vs. referencí

VFP standardně předává parametry hodnotou. Pro předání referencí použijte @:

PROCEDURE ZdvojNasob(@n)
   n = n * 2
ENDPROC

LOCAL x
x = 10
DO ZdvojNasob WITH @x
? x        && 20
SET UDFPARMSGlobální přepínač SET UDFPARMS TO REFERENCE změní default na předávání referencí. Většinou se nedoporučuje — držte se explicitního @.

Volitelné parametry a PARAMETERS

FUNCTION Pozdrav
   LPARAMETERS cJmeno, cTitul
   
   && Test, kolik parametrů přišlo
   IF PCOUNT() < 2
      cTitul = ""
   ENDIF
   
   RETURN cTitul + " " + cJmeno
ENDFUNC
Klíčové slovoPopis
PARAMETERSPrivátní parametry (starý styl)
LPARAMETERSLokální parametry (preferováno)
PCOUNT()Počet skutečně předaných parametrů

Soubor s více procedurami (procedure file)

SET PROCEDURE TO mojeFce ADDITIVE

&& v souboru mojeFce.prg:
PROCEDURE Funkce1
   ...
ENDPROC
PROCEDURE Funkce2
   ...
ENDPROC

9. Pole (arrays)

VFP podporuje 1D a 2D pole. Indexace začíná od 1.

Deklarace

LOCAL ARRAY aJmena(10)              && 1D, 10 prvků
LOCAL ARRAY aMatrix(5, 3)            && 2D, 5×3
DIMENSION aData(100)                && alternativní zápis
DECLARE aBuf(50)                     && totéž

aJmena(1) = "Pavel"
aJmena[2] = "Petra"                    && lze i hranaté závorky

aMatrix(1, 1) = 10
aMatrix(2, 3) = 42

Změna velikosti

LOCAL ARRAY aData(5)
DIMENSION aData(20)            && zvětšení (zachová obsah)
DIMENSION aData(3)             && zmenšení (oříznutí)

Funkce pro pole

FunkcePopis
ALEN(a, [n])Celkový počet prvků (n=1: řádky, n=2: sloupce)
AINS(a, n)Vloží prvek na pozici n
ADEL(a, n)Smaže prvek na pozici n (poslední je .F.)
ASORT(a, [start], [count], [order])Setřídí pole
ASCAN(a, expr, [start], [count])Vyhledá hodnotu
ACOPY(zdroj, cíl)Zkopíruje pole
ARRAYTOPROP(o, ap)Pole → vlastnosti objektu
AFIELDS(a, [tbl])Naplní pole strukturou tabulky
ADIR(a, [skel])Naplní pole seznamem souborů
LOCAL ARRAY aFile(1)
nPocet = ADIR(aFile, "*.dbf")
FOR i = 1 TO nPocet
   ? aFile(i, 1), aFile(i, 2)    && jméno, velikost
ENDFOR

Tabulka → pole

USE klienti
COPY TO ARRAY aLide FIELDS jmeno, prijmeni FOR aktivni

&& nebo SCATTER pro jeden záznam
SCATTER TO aZaznam
SCATTER NAME oRow                && do objektu
? oRow.jmeno

&& GATHER zpět
GATHER FROM aZaznam
GATHER NAME oRow

10. Ošetření chyb

TRY ... CATCH ... FINALLY VFP 8+

TRY
   USE klienti
   SELECT * FROM klienti WHERE id = nID
CATCH TO oErr WHEN oErr.ErrorNo = 1
   && specifický catch
   ? "Soubor neexistuje"
CATCH TO oErr
   ? "Chyba " + TRANSFORM(oErr.ErrorNo) + ": " + oErr.Message
   ? "Procedura: " + oErr.Procedure
   ? "Řádek: " + TRANSFORM(oErr.LineNo)
FINALLY
   USE IN klienti      && vždy proběhne
ENDTRY

Vlastnosti objektu Exception

VlastnostPopis
ErrorNoČíslo chyby
MessageTextový popis
ProcedureNázev procedury, kde nastala
LineNoČíslo řádku
LineContentsObsah řádku
DetailsDoplňkový popis
UserValueVolitelná uživatelská hodnota (lze předat přes THROW)
StackLevelÚroveň zásobníku

THROW — vlastní výjimka

TRY
   IF nDelitel = 0
      THROW "Dělení nulou není povoleno"
   ENDIF
   nVysledek = nCislo / nDelitel
CATCH TO oErr
   ? oErr.UserValue
ENDTRY

Klasický ON ERROR (starší způsob)

ON ERROR DO ChybaHandler WITH ERROR(), MESSAGE(), LINENO()

&& ... kód ...

ON ERROR     && vrátit default

PROCEDURE ChybaHandler(nErr, cMsg, nLine)
   MESSAGEBOX("Chyba " + TRANSFORM(nErr) + ": " + cMsg, 16, "Chyba")
ENDPROC
DoporučeníV novém kódu používejte TRY/CATCH. ON ERROR ponechte jen jako globální záchrannou síť pro neočekávané chyby na nejvyšší úrovni aplikace.

11. Tabulky a databáze

Otevírání a zavírání tabulek

USE klienti                        && v aktuálním pracovním prostoru
USE klienti IN 0                   && v prvním volném work area
USE klienti IN 0 SHARED            && sdílený přístup
USE klienti IN 0 EXCLUSIVE         && výhradní
USE klienti IN 0 AGAIN ALIAS klienti2  && další otevření pod jiným aliasem
USE klienti IN 0 ORDER prijmeni     && s aktivním indexem

USE                                && zavře aktuální tabulku
USE IN klienti                     && zavře tabulku v aliasu klienti
CLOSE TABLES
CLOSE DATABASES ALL

Pracovní prostory (work areas)

VFP umožňuje až 32 767 současně otevřených tabulek, každá ve svém pracovním prostoru.

SELECT klienti        && přepne aktivní work area
SELECT 0              && vybere první volný
? ALIAS()             && jméno aktuální tabulky
? SELECT()            && číslo aktuální work area

Pohyb v tabulce

GO TOP                && první záznam
GO BOTTOM             && poslední
GO 5                  && konkrétní pořadí
SKIP                  && o jeden vpřed
SKIP -1               && o jeden zpět
SKIP 10               && o 10 vpřed

? RECNO()             && číslo aktuálního záznamu
? RECCOUNT()          && celkem záznamů (vč. smazaných)
? BOF()               && před prvním?
? EOF()               && za posledním?

Vytvoření tabulky

CREATE TABLE klienti ( ;
   id        I PRIMARY KEY AUTOINC, ;
   jmeno     C(30) NOT NULL, ;
   prijmeni  C(50) NOT NULL, ;
   email     V(100), ;
   narozeni  D, ;
   plat      Y DEFAULT 0, ;
   poznamka  M, ;
   aktivni   L DEFAULT .T., ;
   vytvoreno T DEFAULT DATETIME() ;
)

&& bez DBC — volná tabulka:
CREATE TABLE mujLog FREE ( ;
   datum T, ;
   text  C(200) ;
)

Úprava struktury

ALTER TABLE klienti ADD COLUMN telefon C(20)
ALTER TABLE klienti ALTER COLUMN jmeno C(50)
ALTER TABLE klienti DROP COLUMN poznamka
ALTER TABLE klienti RENAME COLUMN plat TO mzda

Zobrazení a změna struktury

DISPLAY STRUCTURE            && výpis struktury
MODIFY STRUCTURE             && vizuální editor

&& nebo zjištění strukturu programově:
LOCAL ARRAY aFlds(1)
AFIELDS(aFlds, "klienti")
FOR i = 1 TO ALEN(aFlds, 1)
   ? aFlds(i, 1), aFlds(i, 2), aFlds(i, 3)
ENDFOR

Manipulace se záznamy

&& Přidání záznamu
APPEND BLANK
REPLACE jmeno WITH "Pavel", prijmeni WITH "Novák"

&& nebo INSERT (SQL)
INSERT INTO klienti (jmeno, prijmeni) VALUES ("Petr", "Svoboda")

&& Editace
REPLACE plat WITH 35000 FOR mesto = "Praha"

&& UPDATE (SQL)
UPDATE klienti SET plat = plat * 1.05 WHERE aktivni = .T.

&& Mazání (logické)
DELETE FOR aktivni = .F.       && označí jako smazané
RECALL FOR id = 42             && obnoví smazaný
PACK                            && fyzicky odstraní (vyžaduje EXCLUSIVE)
ZAP                             && smaže všechny záznamy

&& Stav smazání
? DELETED()                    && je aktuální záznam smazán?
SET DELETED ON                 && smazané ignorovat při zpracování

Databázový kontejner (DBC)

CREATE DATABASE firma           && vytvoří firma.dbc
OPEN DATABASE firma             && otevře
CLOSE DATABASE

&& Přidání tabulky do DBC:
ADD TABLE klienti
REMOVE TABLE klienti

&& Vlastnosti DBC dovolují:
&&  - dlouhá jména tabulek/sloupců
&&  - persistentní relace (DBSETPROP)
&&  - validační pravidla na úrovni řádku/pole
&&  - default hodnoty, triggery
&&  - referenční integritu (RI builder)

12. Indexy a hledání

Vytvoření indexu

&& Strukturální složený index (.cdx) — automaticky se otvírá s tabulkou
INDEX ON prijmeni TAG prijmeni
INDEX ON UPPER(prijmeni) TAG prijmeni_u
INDEX ON DTOS(narozeni) TAG nar
INDEX ON id TAG id CANDIDATE            && unikátní
INDEX ON mesto + prijmeni TAG mesto_pri    && složený
INDEX ON plat TAG plat_d DESCENDING      && sestupný
INDEX ON plat TAG plat_h FOR aktivni     && částečný (filtered)

&& SQL syntaxe
ALTER TABLE klienti ADD UNIQUE email TAG email_u
ALTER TABLE klienti ADD PRIMARY KEY id TAG pk_id

Aktivace a manipulace

SET ORDER TO prijmeni            && aktivuje TAG
SET ORDER TO 0                   && bez indexu (přirozené pořadí)
? ORDER()                       && aktivní index
? TAGCOUNT()                    && počet tagů v .cdx

DELETE TAG prijmeni
DELETE TAG ALL
REINDEX                          && přebudovat indexy

Hledání

SET ORDER TO prijmeni
SEEK "Novák"
IF FOUND()
   ? "Nalezen na záznamu " + TRANSFORM(RECNO())
ELSE
   ? "Nenalezen"
ENDIF

&& Funkce SEEK() — vrací rovnou .T./.F. a posune ukazatel
IF SEEK("Novák", "klienti", "prijmeni")
   ? jmeno
ENDIF

&& LOCATE — sekvenční hledání bez indexu
LOCATE FOR mesto = "Praha" .AND. plat > 30000
DO WHILE FOUND()
   ? jmeno, prijmeni
   CONTINUE
ENDDO

Rushmore optimalizace

VFP automaticky optimalizuje dotazy s WHERE/FOR pomocí Rushmore — pokud existuje index, který přesně odpovídá výrazu ve filtru. Pro maximální využití:

  • Indexy musí být přesně stejné jako výraz ve WHERE — INDEX ON UPPER(prijmeni) optimalizuje WHERE UPPER(prijmeni) = "X", ale ne WHERE prijmeni = "X".
  • Funkce SYS(3054, 11) zapne výpis Rushmore plánu.
SYS(3054, 11)                   && verbose Rushmore log
SELECT * FROM klienti WHERE UPPER(prijmeni) = "NOVÁK"
SYS(3054, 0)                    && vypnout

13. SQL příkazy

VFP podporuje plnohodnotnou podmnožinu ANSI SQL pro lokální data.

SELECT

SELECT jmeno, prijmeni, plat ;
   FROM klienti ;
   WHERE aktivni = .T. .AND. plat > 25000 ;
   ORDER BY prijmeni, jmeno ;
   INTO CURSOR cZobrazeni

&& cíle dotazu:
SELECT ... INTO TABLE vystup        && do nové DBF
SELECT ... INTO CURSOR tmp          && do read-only kurzoru
SELECT ... INTO CURSOR tmp READWRITE && editovatelný
SELECT ... INTO ARRAY aData          && do pole
SELECT ... TO FILE vystup.txt       && do TXT
SELECT ... TO PRINTER               && na tiskárnu
SELECT ... TO SCREEN                && na obrazovku

JOINy

SELECT k.jmeno, k.prijmeni, o.cisloObj, o.castka ;
   FROM klienti k ;
   INNER JOIN objednavky o ON o.idKlient = k.id ;
   WHERE o.datum >= {^2026-01-01}

&& další typy: LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN

SELECT k.jmeno, NVL(SUM(o.castka), 0) AS celkem ;
   FROM klienti k ;
   LEFT JOIN objednavky o ON o.idKlient = k.id ;
   GROUP BY k.id, k.jmeno ;
   ORDER BY celkem DESC

Agregační funkce

FunkcePopis
COUNT(*)Počet řádků
COUNT(sloupec)Počet ne-NULL hodnot
SUM(sloupec)Součet
AVG(sloupec)Průměr
MIN(), MAX()Minimum, maximum

Subselect a další

&& Subselect ve WHERE
SELECT * FROM klienti ;
   WHERE id IN (SELECT idKlient FROM objednavky WHERE castka > 10000)

&& UNION
SELECT jmeno FROM klienti ;
UNION ;
SELECT jmeno FROM dodavatele

&& TOP N
SELECT TOP 10 jmeno, plat FROM klienti ORDER BY plat DESC
SELECT TOP 5 PERCENT ...

&& HAVING
SELECT mesto, COUNT(*) AS pocet ;
   FROM klienti ;
   GROUP BY mesto ;
   HAVING COUNT(*) > 5 ;
   ORDER BY pocet DESC

INSERT, UPDATE, DELETE

INSERT INTO klienti (jmeno, prijmeni, mesto) ;
   VALUES ("Pavel", "Novák", "Praha")

INSERT INTO klienti FROM NAME oRow      && z objektu
INSERT INTO klienti FROM ARRAY aData    && z pole

UPDATE klienti SET plat = plat + 2000, ;
                  vytvoreno = DATETIME() ;
   WHERE aktivni = .T. AND mesto = "Brno"

DELETE FROM klienti WHERE aktivni = .F.
PozorDELETE FROM v xBase módu pouze označí záznamy jako smazané. Pro fyzické odstranění je potřeba PACK.

14. Transakce a buffering

Transakce

BEGIN TRANSACTION
TRY
   UPDATE ucty SET zustatek = zustatek - 1000 WHERE id = 1
   UPDATE ucty SET zustatek = zustatek + 1000 WHERE id = 2
   END TRANSACTION             && commit
CATCH
   ROLLBACK
ENDTRY

Transakce jsou podporované jen pro tabulky v DBC (databázovém kontejneru). Volné tabulky transakce neumí.

Buffering

Buffering řídí, jak se změny v paměti propisují do tabulky. Zásadní pro multi-user aplikace.

HodnotaKonstantaPopis
1—Bez bufferingu (default pro free tables)
2—Pesimistický řádkový
3—Optimistický řádkový
4—Pesimistický tabulkový
5—Optimistický tabulkový (typický pro form-based aplikace)
SET MULTILOCKS ON          && nutné pro buffering 3, 4, 5
USE klienti IN 0 SHARED
CURSORSETPROP("Buffering", 5, "klienti")

&& uživatel mění data ve formuláři...

IF TABLEUPDATE(.T., .F., "klienti")    && commit změn
   ? "Uloženo"
ELSE
   TABLEREVERT(.T., "klienti")        && rollback změn
ENDIF

? GETFLDSTATE("jmeno")         && stav konkrétního pole
? GETNEXTMODIFIED(0)              && další změněný záznam

15. Kurzory a views

Kurzory

Kurzor je dočasná tabulka v paměti/temp adresáři. Vznikne nejčastěji jako výsledek SELECT ... INTO CURSOR.

SELECT * FROM klienti WHERE aktivni INTO CURSOR tmp
SELECT * FROM klienti INTO CURSOR tmp READWRITE
SELECT * FROM klienti INTO CURSOR tmp NOFILTER      && vždy nové data

&& Vytvoření prázdného kurzoru
CREATE CURSOR tmp ( ;
   id  I, ;
   nzv C(50), ;
   hod N(10, 2) ;
)

Lokální views

OPEN DATABASE firma
CREATE SQL VIEW v_aktivni AS ;
   SELECT id, jmeno, prijmeni, mesto ;
   FROM klienti WHERE aktivni = .T.

&& použití
USE v_aktivni
BROWSE

CursorAdapter VFP 8+

Univerzální způsob připojení k libovolnému zdroji dat (lokální DBF, SQL Server, ODBC, ADO, XML).

LOCAL oCA
oCA = CREATEOBJECT("CursorAdapter")
WITH oCA
   .Alias        = "klientiSQL"
   .DataSourceType = "ODBC"
   .DataSource     = nConnHandle
   .SelectCmd      = "SELECT * FROM Klienti WHERE Active = 1"
   .Tables         = "Klienti"
   .KeyFieldList   = "ID"
   .UpdatableFieldList = "jmeno, prijmeni, plat"
   .UpdateNameList = "jmeno Klienti.Jmeno, prijmeni Klienti.Prijmeni, plat Klienti.Plat"
   .SendUpdates    = .T.
   .CursorFill()
ENDWITH

16. Remote data (ODBC, SQL Server)

Připojení přes SQL pass-through (SPT)

LOCAL nHandle, lcCmd
nHandle = SQLCONNECT("DSN=mySQLServer;UID=user;PWD=heslo")
&& nebo přes connection string:
nHandle = SQLSTRINGCONNECT("Driver={SQL Server};Server=.;Database=Test;Trusted_Connection=Yes")

IF nHandle < 0
   ? "Připojení selhalo"
   RETURN
ENDIF

SQLEXEC(nHandle, "SELECT * FROM Klienti WHERE Plat > ?lnPlat", "vystup")

SELECT vystup
BROWSE

SQLDISCONNECT(nHandle)

Klíčové funkce SPT

FunkcePopis
SQLCONNECT()Připojí přes ODBC DSN
SQLSTRINGCONNECT()Připojí přes connection string
SQLEXEC(h, cmd, [cur])Provede SQL příkaz
SQLPREPARE()Příprava parametrického dotazu
SQLGETPROP() / SQLSETPROP()Vlastnosti spojení
SQLCOMMIT() / SQLROLLBACK()Transakce na serveru
SQLDISCONNECT()Odpojení
SQLTABLES() / SQLCOLUMNS()Metadata

Parametrické dotazy

LOCAL lnPlat, ldDatum
lnPlat   = 30000
ldDatum  = {^2026-01-01}

SQLEXEC(nHandle, ;
   "SELECT * FROM Klienti WHERE Plat > ?lnPlat AND Vytvoreno >= ?ldDatum", ;
   "vystup")

17. Třídy a objekty

Definice třídy v PRG

DEFINE CLASS Klient AS Custom
   * Vlastnosti
   cJmeno    = ""
   cPrijmeni = ""
   nVek      = 0
   PROTECTED nID
   nID = 0
   
   * Konstruktor
   PROCEDURE Init(tnID, tcJmeno)
      THIS.nID    = tnID
      THIS.cJmeno = tcJmeno
   ENDPROC
   
   * Metody
   PROCEDURE CelyJmeno
      RETURN THIS.cJmeno + " " + THIS.cPrijmeni
   ENDPROC
   
   PROCEDURE Destroy
      * Cleanup
   ENDPROC
ENDDEFINE

&& Použití
LOCAL oKlient
oKlient = CREATEOBJECT("Klient", 42, "Pavel")
oKlient.cPrijmeni = "Novák"
? oKlient.CelyJmeno()

Dědičnost

DEFINE CLASS VipKlient AS Klient
   nSleva = 0.10
   
   PROCEDURE Init(tnID, tcJmeno, tnSleva)
      * Volání rodičovského konstruktoru
      DODEFAULT(tnID, tcJmeno)
      THIS.nSleva = tnSleva
   ENDPROC
   
   PROCEDURE CelyJmeno
      * Override + volání původní metody
      RETURN "VIP: " + DODEFAULT()
   ENDPROC
ENDDEFINE

Speciální klíčová slova OOP

KlíčVýznam
THISReference na aktuální objekt
THISFORMReference na formulář, ve kterém je objekt
THISFORMSETReference na formset
PARENTNadřazený kontejner
DODEFAULT()Volá metodu rodičovské třídy
NODEFAULTV eventu zruší výchozí akci VFP
PROTECTEDChráněná vlastnost/metoda (jen pro instanci a potomky)
HIDDENSoukromá (jen pro tuto třídu)

Třídy z VCX

SET CLASSLIB TO moje_tridy ADDITIVE
LOCAL oKlient
oKlient = CREATEOBJECT("Klient")         && načte z VCX

&& nebo bez SET CLASSLIB:
oKlient = NEWOBJECT("Klient", "moje_tridy.vcx")

Vestavěné základní třídy

TřídaPopis
CustomNeviditelná base třída pro vlastní třídy
FormFormulář
ContainerKontejner pro další controly
LabelStatický text
TextBox / EditBoxVstupní pole
CommandButtonTlačítko
CheckBox / OptionGroupZaškrtávátko / radio
ComboBox / ListBoxCombo / list
GridDatová mřížka
PageFrame / PageZáložkový panel
ImageObrázek
TimerČasovač
Collection VFP 8+Generická kolekce
EmptyPrázdný objekt — lze přidávat členy za běhu

Empty třída a dynamické vlastnosti

LOCAL oRow
oRow = CREATEOBJECT("Empty")
ADDPROPERTY(oRow, "jmeno", "Pavel")
ADDPROPERTY(oRow, "vek", 35)
? oRow.jmeno, oRow.vek

&& SCATTER NAME ho rovnou naplní z aktuálního záznamu
SCATTER NAME oRow MEMO
? oRow.prijmeni

18. Formuláře a komponenty

Programové vytvoření formuláře

LOCAL oForm
oForm = CREATEOBJECT("Form")
WITH oForm
   .Caption = "Můj formulář"
   .Width   = 400
   .Height  = 300
   .AutoCenter = .T.
   .AddObject("lblNadpis", "Label")
   .lblNadpis.Caption = "Vítejte"
   .lblNadpis.Top  = 20
   .lblNadpis.Left = 20
   .AddObject("cmdOK", "CommandButton")
   .cmdOK.Caption = "OK"
   .cmdOK.Top  = 100
   .cmdOK.Left = 150
   .Show()
ENDWITH
READ EVENTS

Spuštění formuláře z .scx

DO FORM mojeForm
DO FORM mojeForm NAME oForm LINKED
DO FORM mojeForm WITH nID, cJmeno         && parametry pro Init
DO FORM mojeForm TO lOK                  && návratová hodnota z Unload

Klíčové eventy

EventKdy se volá
InitPři vytvoření, parametry konstruktoru
LoadPřed Init formuláře (otevřít DataEnvironment)
ActivatePři získání focusu
DeactivatePři ztrátě focusu
ClickKliknutí myší
DblClickDvojklik
KeyPressStisk klávesy
GotFocus / LostFocusFocus
ValidPřed opuštěním kontroly
InteractiveChangeZměna od uživatele
QueryUnloadPřed zavřením, lze zrušit (NODEFAULT)
UnloadPři uzavření (poslední)
DestroyPři uvolnění objektu

Společné vlastnosti controlů

VlastnostPopis
Top, Left, Width, HeightPozice a velikost (pixely)
Visible, EnabledViditelnost / aktivní
Caption, ValuePopis / hodnota
ControlSourcePole tabulky pro data binding
ForeColor, BackColorRGB barvy (např. RGB(255,0,0))
FontName, FontSize, FontBoldFont
TabIndex, TabStopPořadí a tabulátor
ToolTipTextTooltip
AnchorKotvení při změně velikosti formu

Standardní dialogy

&& Messagebox
nVolba = MESSAGEBOX("Uložit změny?", 4+32, "Otázka")
&& 4 = Yes/No, 32 = ikona ?
&& návratové hodnoty: 1=OK, 2=Cancel, 6=Yes, 7=No

&& Otevřít soubor
cFile = GETFILE("DBF", "Vyberte tabulku:")
cFile = GETFILE("TXT;CSV", "Importovat:")

&& Uložit jako
cFile = PUTFILE("Uložit jako:", "vystup", "TXT")

&& Vybrat adresář
cDir = GETDIR("", "Vyberte adresář:")

&& Vstup od uživatele
cText = INPUTBOX("Zadejte jméno:", "Vstup", "výchozí")

&& Barva
nBarva = GETCOLOR()        && vrátí číslo nebo -1 při zrušení

Hlavní smyčka aplikace

DO FORM mainForm
READ EVENTS             && spustí event loop

&& někde v kódu, např. v Quit handleru:
CLEAR EVENTS

19. Reporty a etikety

Reporty jsou uloženy v souborech .frx/.frt a navrhují se v Report Designeru. VFP 9 přinesl výrazně přepracovaný engine reportů.

Základní spuštění reportu

REPORT FORM mujReport PREVIEW
REPORT FORM mujReport TO PRINTER PROMPT
REPORT FORM mujReport TO PRINTER NOCONSOLE
REPORT FORM mujReport TO FILE vystup.txt ASCII

&& Filtr záznamů
REPORT FORM mujReport PREVIEW FOR mesto = "Praha"

&& Rozsah
REPORT FORM mujReport PREVIEW NEXT 50
REPORT FORM mujReport PREVIEW REST

VFP 9 Report Listener (object-oriented rendering)

LOCAL oList
oList = NEWOBJECT("ReportListener", HOME() + "FFC\_reportlistener.vcx")
oList.ListenerType = 1           && preview

REPORT FORM mujReport OBJECT oList
&& nebo nově:
REPORT FORM mujReport OBJECT TYPE 1          && preview
REPORT FORM mujReport OBJECT TYPE 3          && XML
REPORT FORM mujReport OBJECT TYPE 4          && HTML (s FFC)

Přímý tisk a ovládání tiskárny

SET PRINTER TO NAME "HP LaserJet"      && vybrat tiskárnu
? SET("PRINTER", 3)                  && aktuální tiskárna

&& "tichý" tisk přímo z kódu
SET PRINTER ON
SET CONSOLE OFF
? "Hlavička sestavy"
? "==================="
SET PRINTER TO
SET CONSOLE ON

Etikety

LABEL FORM mojeEtikety PREVIEW
LABEL FORM mojeEtikety TO PRINTER

21. Práce se soubory

Nízkoúrovňové funkce

&& Otevření / vytvoření / čtení / zápis
nFile = FOPEN("data.txt", 2)        && 0=read, 1=write, 2=read/write
nFile = FCREATE("novy.txt")
IF nFile = -1
   ? "Chyba otevření"
   RETURN
ENDIF

cText = FREAD(nFile, 1024)             && přečte 1024 bajtů
cText = FGETS(nFile)                  && jeden řádek
FWRITE(nFile, "text dat")
FPUTS(nFile, "řádek")                 && s CRLF na konci

FSEEK(nFile, 100, 0)                  && pozice (0=od začátku, 1=od pos, 2=od konce)
? FSEEK(nFile, 0, 2)                  && velikost souboru
? FEOF(nFile)
FCLOSE(nFile)

Vysokoúrovňové funkce

cContent = FILETOSTR("vstup.txt")
STRTOFILE(cText, "vystup.txt")
STRTOFILE(cText, "log.txt", 1)         && 1 = append

? FILE("klienti.dbf")               && existuje?
? DIRECTORY("C:\Data")             && existuje adresář?
? FSIZE("data.dbf")
? FDATE("data.dbf")
? FTIME("data.dbf")

DELETE FILE "stary.txt"
RENAME "old.txt" TO "new.txt"
COPY FILE "src.txt" TO "dst.txt"
MD "NovyAdresar"                 && vytvořit adresář
RD "StaryAdresar"

Cesty a aktuální adresář

? CURDIR()                       && aktuální adresář
? FULLPATH("klienti.dbf")        && absolutní cesta
? JUSTPATH("C:\data\file.txt")   && "C:\data"
? JUSTFNAME("C:\data\file.txt")  && "file.txt"
? JUSTSTEM("C:\data\file.txt")   && "file"
? JUSTEXT("C:\data\file.txt")    && "txt"
? ADDBS("C:\data")               && "C:\data\"
? DEFAULTEXT("data", "dbf")      && "data.dbf"
? FORCEPATH("file.txt", "D:\backup")
? FORCEEXT("file.txt", "bak")
? SYS(5) + SYS(2003)            && aktuální drive a path

SET DEFAULT TO "D:\projekty\moje"   && změnit pracovní adresář

22. Řetězcové funkce

FunkcePopisPříklad
LEN(c)DélkaLEN("abc") = 3
UPPER(c)Velká písmenaUPPER("Abc") = "ABC"
LOWER(c)Malá písmenaLOWER("Abc") = "abc"
PROPER(c)První velkáPROPER("ahoj svět") = "Ahoj Svět"
LEFT(c, n)Zleva n znakůLEFT("abcdef", 3) = "abc"
RIGHT(c, n)Zprava n znakůRIGHT("abcdef", 3) = "def"
SUBSTR(c, start, [len])PodřetězecSUBSTR("abcdef", 2, 3) = "bcd"
STUFF(c, start, len, expr)Vložit/nahraditSTUFF("abcdef", 2, 2, "XX") = "aXXdef"
AT(c1, c2, [n])Pozice substringuAT("c", "abcdef") = 3
RAT(c1, c2)Pozice zprava—
OCCURS(c1, c2)Počet výskytůOCCURS("a", "banana") = 3
STRTRAN(c, find, repl)NahraditSTRTRAN("abc abc", "a", "X") = "Xbc Xbc"
CHRTRAN(c, find, repl)Nahradit znaky 1:1CHRTRAN("abc", "ac", "12") = "1b2"
ALLTRIM(c)Bez mezer obou stran—
LTRIM(c) / RTRIM(c)Bez mezer zleva/zprava—
PADC/L/R(c, n, [pad])Doplnění mezeramiPADL("5", 3, "0") = "005"
REPLICATE(c, n)OpakováníREPLICATE("-", 5) = "-----"
SPACE(n)n mezer—
EMPTY(c)Je prázdný/jen mezery?—
ALINES(a, c, [flag])Rozdělí na řádky do pole—
GETWORDCOUNT(c, [sep])Počet slov—
GETWORDNUM(c, n, [sep])n-té slovo—
STREXTRACT(c, beg, end)Mezi delimitery—
BETWEEN(x, lo, hi)x v rozsahu—
LIKEC(pattern, c)Match s wildcards * a ?LIKEC("a*c", "abc")

Praktické příklady

&& Rozdělit CSV řádek do pole
LOCAL ARRAY aFields(1)
nCount = ALINES(aFields, "Pavel,Novák,Praha", 0, ",")
FOR i = 1 TO nCount
   ? aFields(i)
ENDFOR

&& Vyčistit telefonní číslo (jen číslice)
cTel = "+420 777 123-456"
cClean = CHRTRAN(cTel, "+- ", "")
? cClean        && "420777123456"

&& Generovat random ID
cID = SYS(2015)         && 10-znakový jedinečný ID

23. Datum a čas

FunkcePopis
DATE()Dnešní datum
DATETIME()Aktuální datum + čas
TIME()Aktuální čas jako řetězec "HH:MM:SS"
SECONDS()Sekundy od půlnoci (s desetinnou částí)
YEAR(d) / MONTH(d) / DAY(d)Komponenty data
HOUR(t) / MINUTE(t) / SEC(t)Komponenty času
DOW(d, [first])Den v týdnu (1=Ne ... 7=So)
WEEK(d)Číslo týdne v roce
CDOW(d)Název dne (lokalizovaný)
CMONTH(d)Název měsíce
GOMONTH(d, n)Posun o n měsíců
DTOC(d) / CTOD(c)Date ↔ char
DTOS(d)Date → "YYYYMMDD" (vhodné pro indexy)
TTOC(t, [flag])Datetime → char
TTOD(t) / DTOT(d)Datetime ↔ Date

Aritmetika data

? DATE() + 7                   && za týden
? DATE() - 30                  && před měsícem
? {^2026-12-31} - {^2026-01-01}  && rozdíl ve dnech = 364

? DATETIME() + 3600            && za hodinu (sekundy)
? GOMONTH(DATE(), 3)            && za 3 měsíce

&& Začátek a konec měsíce
nDnes = DATE()
dPocatek = GOMONTH(nDnes, 0) - DAY(nDnes) + 1
dKonec   = GOMONTH(dPocatek, 1) - 1

Formátování

SET DATE TO GERMAN              && DD.MM.YYYY
SET DATE TO ANSI                && YYYY.MM.DD
SET DATE TO BRITISH             && DD/MM/YYYY
SET DATE TO AMERICAN            && MM/DD/YYYY
SET CENTURY ON                 && čtyřciferný rok
SET MARK TO "."                 && oddělovač

? DTOC(DATE())                 && podle SET DATE
? TRANSFORM(DATE(), "@D")        && krátké datum
? TRANSFORM(DATE(), "@E")        && evropské

24. Matematické funkce

FunkcePopis
ABS(n)Absolutní hodnota
SIGN(n)Znaménko (-1, 0, 1)
INT(n)Celá část (truncate)
FLOOR(n) / CEILING(n)Zaokrouhlení dolů / nahoru
ROUND(n, dec)Zaokrouhlení na dec míst
MOD(n, d)Modulo (i pro reálná čísla)
SQRT(n)Druhá odmocnina
EXP(n)e^n
LOG(n)Přirozený logaritmus
LOG10(n)Dekadický logaritmus
SIN/COS/TAN(n)Goniometrické (radiány)
ASIN/ACOS/ATAN(n)Inverzní
ATAN2(y, x)Arctangent z dvou hodnot
PI()3.141592...
RAND([seed])Náhodné číslo <0, 1)
MIN(...) / MAX(...)Min / max ze seznamu
BITAND/OR/XOR/NOTBitové operace
BITLSHIFT(n, k) / BITRSHIFT(n, k)Posuny
? ROUND(3.14159, 2)        && 3.14
? SQRT(2)                && 1.4142...
? PI()                   && 3.14159...
? SIN(PI() / 2)            && 1

&& Náhodné celé v rozsahu 1..100
? INT(RAND() * 100) + 1

&& Bitové operace
? BITAND(12, 10)           && 8 (1100 & 1010 = 1000)
? BITOR(12, 3)              && 15

25. COM a Automation

Volání externí aplikace přes COM

&& Excel
LOCAL oExcel, oWB
oExcel = CREATEOBJECT("Excel.Application")
oExcel.Visible = .T.
oWB = oExcel.Workbooks.Add()
WITH oWB.Sheets(1)
   .Cells(1, 1).Value = "Jméno"
   .Cells(1, 2).Value = "Plat"
   .Cells(2, 1).Value = "Pavel"
   .Cells(2, 2).Value = 35000
ENDWITH
oWB.SaveAs("C:\Temp\plat.xlsx")
oExcel.Quit()

&& Word
LOCAL oWord
oWord = CREATEOBJECT("Word.Application")
oWord.Documents.Open("C:\dopis.docx")
&& ...

&& FileSystemObject
LOCAL oFSO
oFSO = CREATEOBJECT("Scripting.FileSystemObject")
? oFSO.GetFile("C:\data.dbf").Size

&& ADO
LOCAL oConn, oRS
oConn = CREATEOBJECT("ADODB.Connection")
oConn.Open("Provider=SQLOLEDB;Data Source=.;Initial Catalog=test;Integrated Security=SSPI")
oRS = oConn.Execute("SELECT * FROM Klienti")
DO WHILE .NOT. oRS.EOF
   ? oRS.Fields("Jmeno").Value
   oRS.MoveNext()
ENDDO

VFP jako COM server

DEFINE CLASS MujServer AS Custom OLEPUBLIC
   PROCEDURE Pozdrav(tcJmeno AS String) AS String
      RETURN "Ahoj " + tcJmeno
   ENDPROC
ENDDEFINE

&& v projektu pak BUILD MTDLL nebo BUILD EXE — registrace proběhne automaticky

26. XML, XMLAdapter

XML <-> kurzor jednoduchými funkcemi

&& Kurzor → XML
SELECT klienti
CURSORTOXML("klienti", "klienti.xml", 1, 512, 0, "1.0")
&& flags: 1 = atributy, 2 = elementy

&& XML → kurzor
XMLTOCURSOR("klienti.xml", "importovani")

XMLAdapter (object model)

LOCAL oXA, oTable
oXA = CREATEOBJECT("XMLAdapter")
oXA.LoadXML("data.xml", .F., .F.)        && load file
&& nebo: oXA.LoadXML(cXmlString, .T.)      load string

FOR EACH oTable IN oXA.Tables
   oTable.ToCursor(.T.)
   ? "Tabulka: " + oTable.Alias + ", záznamů: " + TRANSFORM(RECCOUNT())
ENDFOR

&& Z kurzoru zase XML
oXA.AddTableSchema("klienti")
oXA.IsDiffgram = .F.
cXml = oXA.ToXML()

MSXML přes COM

LOCAL oXML, oNode
oXML = CREATEOBJECT("MSXML2.DOMDocument.6.0")
oXML.async = .F.
oXML.load("data.xml")

FOR EACH oNode IN oXML.selectNodes("//klient")
   ? oNode.selectSingleNode("jmeno").text
ENDFOR

27. Volání Win32 API

DECLARE - DLL

DECLARE INTEGER MessageBox IN user32 ;
   INTEGER hWnd, ;
   STRING lpText, ;
   STRING lpCaption, ;
   INTEGER uType

&& volání
? MessageBox(0, "Ahoj z API", "Test", 0)

&& ShellExecute pro otevření URL/souboru
DECLARE INTEGER ShellExecute IN shell32.dll ;
   INTEGER hndWin, ;
   STRING cAction, ;
   STRING cFile, ;
   STRING cParams, ;
   STRING cDir, ;
   INTEGER nShow

ShellExecute(0, "open", "https://www.example.com", "", "", 1)
ShellExecute(0, "open", "C:\dokument.pdf", "", "", 1)

&& Sleep
DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
Sleep(1000)        && pauza 1 sekunda

&& Získat handle hlavního okna VFP
DECLARE INTEGER GetForegroundWindow IN user32

&& Spuštění externí aplikace - blokující varianta
RUN /N notepad.exe                 && /N = neblokovat
RUN /N7 cmd.exe /c dir              && minimalizované
Velký katalog API ukázek: Win32API knihovna VFPX (foxypreviewer, vfpwin) obsahuje stovky pre-deklarovaných API funkcí. Doporučuji.

28. Distribuce aplikace

Build EXE

BUILD EXE mojeApp FROM mojeApp.pjx RECOMPILE

&& pro 64-bit i pro 32-bit verze Windows je výsledný EXE 32-bit

Runtime soubory

Aplikace pro distribuci potřebuje VFP 9 runtime knihovny. Klíčové DLL:

  • vfp9r.dll — hlavní runtime (anglická verze)
  • vfp9renu.dll — anglické resources
  • vfp9rcsy.dll — české resources CSY
  • vfp9t.dll — runtime pro vlákna (DLL servery)
  • gdiplus.dll — pro Report Listenery a obrázky
  • msvcr71.dll — Visual C++ runtime

InstallShield Express / Inno Setup

VFP 9 obsahoval InstallShield Express LE pro tvorbu MSI instalátorů. Komunita typicky doporučuje Inno Setup jako jednodušší alternativu.

Manifest pro Windows 7+

Pro správné chování UAC a vzhledu na Windows 7 a novějších přiložte k EXE manifest soubor (mojeApp.exe.manifest) s deklarací compatibility a UI themingem.

29. Přehled hlavních příkazů

PříkazPopis
?Vypíše výrazy do výstupu (s odřádkováním)
??Vypíše bez odřádkování
@ row, col SAYPozicovaný výpis (původní DOS syntax)
ACTIVATE WINDOWAktivuje okno
APPEND BLANKPřidá prázdný záznam
APPEND FROMImportuje data z jiného souboru (CSV, XLS, DBF...)
BROWSEEditovatelný gridový pohled na tabulku
CLEARVyčistí výstupní okno
CLOSEUzavře tabulky/databáze/all
COPY TOKopíruje tabulku do nového souboru
COUNTSpočítá záznamy
SUM, AVERAGE, CALCULATEAgregace v aktivní tabulce
DEFINE CLASSDefinuje třídu
DELETEOznačí záznamy ke smazání
DISPLAY / LISTVypíše záznamy
DOSpustí program/proceduru
EXTERNALPro Project Manager — explicitní reference
GO / GOTOPohyb v tabulce
HIDE WINDOWSkryje okno
KEYBOARDVloží klávesy do bufferu
MODIFY COMMAND/MEMO/FORM/CLASS/DATABASEOtevře designer
ON ERROR / ON KEY / ON SHUTDOWNGlobální handlery
PUSH/POP KEYUloží/obnoví klávesové zkratky
QUITUkončí VFP
READ EVENTS / CLEAR EVENTSEvent loop
RELEASEUvolní proměnné/objekty/menu
REPLACEUpdate polí v aktuálním záznamu (xBase styl)
SET XXXXSpousta nastavení (viz dále)
SHOW WINDOWZobrazí okno
WAITPauza s libovolnou klávesou
WITH ... ENDWITHZkrácený zápis pro objektové vlastnosti

Důležité SET příkazy

SETDefaultCo řeší
SET DATEAMERICANFormát data v zobrazení
SET CENTURYOFF2 vs. 4ciferný rok
SET DELETEDOFFIgnorovat smazané záznamy
SET EXACTOFFPřesná shoda řetězců
SET ANSIOFFANSI vs xBase porovnávání ve WHERE
SET NEAROFFSEEK posun na nejbližší při neúspěchu
SET TALKONZobrazování informací o stavu
SET SAFETYONDotaz před přepsáním souboru
SET MULTILOCKSOFFPro buffering 3,4,5 musí být ON
SET REFRESH0,5Interval refresh BROWSE
SET DEFAULT TO—Aktuální adresář
SET PATH TO—Cesty pro hledání souborů
SET CLASSLIB TO—VCX knihovny tříd
SET PROCEDURE TO—PRG soubory s procedurami

30. Přehled funkcí

Informační funkce

FunkcePopis
VARTYPE(x)Typ hodnoty: "C","N","L","D","T","O","U" (undefined)
TYPE("nazev")Typ podle jména proměnné/výrazu
USED([alias])Tabulka otevřena?
FCOUNT()Počet sloupců aktuální tabulky
FIELD(n)Jméno n-tého sloupce
RECNO() / RECCOUNT()Aktuální záznam / celkem
BOF() / EOF()Začátek/konec tabulky
FOUND()Poslední SEEK/LOCATE byl úspěšný
DELETED()Aktuální záznam je smazaný
EMPTY(x)Hodnota je prázdná (pro daný typ)
ISNULL(x)Hodnota je .NULL.
NVL(x, y)Vrátí y pokud x je NULL
EVL(x, y)Vrátí y pokud x je EMPTY
BETWEEN(x, lo, hi)x v rozsahu
INLIST(x, ...)x v seznamu
EVALUATE(c)Vyhodnotí výraz z řetězce
EXECSCRIPT(c)Spustí kód z řetězce VFP 9

Systémové

FunkcePopis
SYS(0)Síťové jméno + uživatel
SYS(2)Sekundy od půlnoci
SYS(3)Unikátní jméno souboru
SYS(5)Aktuální disk
SYS(2003)Aktuální adresář
SYS(2015)Unikátní 10-znakový string
SYS(2018)Parametry poslední chyby
SYS(2333)Bind events / detach (VFP 9)
SYS(3054, n)Rushmore log
OS()Operační systém
VERSION([n])Verze VFP
HOME([n])Adresář VFP
GETENV(c)Hodnota proměnné prostředí
WONTOP()Aktuální top window
RGBSCHEME(n)Barva ze schématu

31. Systémové proměnné

Předdefinované globální proměnné začínající podtržítkem.

ProměnnáPopis
_SCREENHlavní okno VFP (objekt typu Form)
_VFPAplikační objekt
_MSYSMENUHlavní systémové menu
_TALLYPočet záznamů zpracovaných posledním xBase příkazem
_TEXTSoubor pro výstup TEXT příkazu
_PRETEXTVyhrazené pro Project Manager
_STARTUPPRG/APP spouštěné při startu
_FOXCODEIntellisense tabulka
_FOXTASKTask tabulka
_PCLPAGEPCL formátování pro tisk
_THROTTLEThrottle u výstupu
_WINDOWS.T. pokud je VFP na Windows (always .T.)
_DOS / _MAC / _UNIXPlatforma (vždy .F. ve VFP 9 pro Windows)
&& Příklady
_SCREEN.Caption = "Moje aplikace"
_SCREEN.WindowState = 2           && maximalizováno
_SCREEN.AddObject("oTimer", "Timer")

&& Skrytí systémového menu
_MSYSMENU.Visible = .F.

&& Jméno z _TALLY
SELECT COUNT(*) FROM klienti
? _TALLY

32. Časté kódy chyb

KódVýznam
1File does not exist
3Too many files open
4End of file encountered
5Record is out of range
9Data type mismatch
10Syntax error
11Function argument value, type, or count is invalid
12Variable not found
13Alias not found
15Not a table
20Record not in index
26No table is open in current work area
36Command contains unrecognized phrase/keyword
41Memo file is missing or invalid
43Insufficient memory
52No database is open
108File is in use by another
109Record is in use by another
110Exclusive open required
111Cannot update file
1444Class definition for X is not found
1429OLE error
1925Unknown member X
1958Object class is invalid

33. Klávesové zkratky IDE

Editor a Command Window

ZkratkaAkce
Ctrl+F2Zobrazit/skrýt Command Window
F2Aktivovat Command Window
Ctrl+SUložit
Ctrl+FNajít
Ctrl+LHledat dál
Ctrl+RNajít a nahradit
Ctrl+GJít na řádek
Ctrl+IOdsadit blok
Ctrl+UZrušit odsazení
Ctrl+QKomentovat blok
Ctrl+WUložit a zavřít editor
EscZavřít bez uložení
Ctrl+JIntellisense (force)

Spuštění a debug

ZkratkaAkce
Ctrl+DSpustit DO program
Ctrl+EZavřít projekt
F5 (v debuggeru)Continue
F8Step Into
Shift+F8Step Over
F9Toggle breakpoint
Ctrl+Shift+F2Trace Window
Ctrl+Alt+EndCancel běžícího kódu

Form Designer

ZkratkaAkce
F11Properties window
Ctrl+PProperties window (alt.)
F7Code window
Ctrl+klikOtevře code v dvojkliknutém eventu
Ctrl+AVybrat všechny controly
Ctrl+DData Environment

Project Manager

ZkratkaAkce
Ctrl+TabPřepínat záložky
Ctrl+Shift+KlikDrag-out item
Enter na .prgOtevře v editoru
Ctrl+Enter na .prgSpustí program

Visual FoxPro 9.0 — Referenční příručka • Sestaveno 2026
Pro produktivní práci doporučuji VFPX komunitní rozšíření a HackFox/MasterFox tipsheety.