Visual FoxPro 9 – česká referenční příručka

Praktická offline příručka s příklady: jazyk, DBF/CDX/FPT, SQL, formuláře, objektový model, reporty, COM a rejstřík A–Z.

1. Úvod

Visual FoxPro 9 (VFP 9) je databázový a aplikační vývojový systém založený na jazyce xBase. Tato příručka je prakticky orientovaná: soustředí se na nejčastější příkazy, funkce, práci s DBF/CDX/FPT, SQL, formuláře a objektový model.

Poznámka: Jde o původně sestavenou českou praktickou referenci, nikoli o úplný přepis oficiální dokumentace Microsoftu.

2. Základy jazyka

Proměnné

LOCAL lcJmeno, lnCena, ldDatum, llAktivni
lcJmeno = "Pavel"
lnCena = 199.90
ldDatum = DATE()
llAktivni = .T.

? lcJmeno, lnCena, ldDatum, llAktivni

Datové typy

TypPříkladPoznámka
Character"FoxPro"Text
Numeric123.45Číslo
Currency$123.45Měnová hodnota
Date{^2026-08-08}Datum v jednoznačném formátu
DateTime{^2026-08-08 12:00:00}Datum a čas
Logical.T. / .F.Pravda / nepravda
ObjectCREATEOBJECT(...)Objektová reference

Podmínky a cykly

IF lnCena > 1000
    ? "Vyšší cena"
ELSE
    ? "Nižší cena"
ENDIF

FOR lnI = 1 TO 5
    ? lnI
ENDFOR

DO WHILE lnI < 10
    lnI = lnI + 1
ENDDO

3. Příkazy A–Z

APPEND BLANK

Syntaxe: APPEND BLANK

Přidá nový prázdný záznam do aktuálně vybrané tabulky.

USE zakaznici IN 0 ALIAS zakaznici
SELECT zakaznici
APPEND BLANK
REPLACE jmeno WITH "Jan Novák", mesto WITH "Kolín"
BROWSE

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

BROWSE

Syntaxe: BROWSE [FIELDS seznam] [FOR podmínka]

Otevře interaktivní tabulkové zobrazení aktuálního aliasu.

USE zakaznici
BROWSE FIELDS id, jmeno, mesto FOR aktivni = .T.

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

DELETE

Syntaxe: DELETE [FOR podmínka]

Označí záznamy jako smazané. Fyzické odstranění provádí PACK.

USE zakaznici EXCLUSIVE
DELETE FOR aktivni = .F.
SET DELETED ON
* PACK fyzicky odstraní označené záznamy
PACK

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

GO / GOTO

Syntaxe: GO TOP | GO BOTTOM | GO n

Přesune ukazatel záznamu.

USE zakaznici
GO TOP
? RECNO(), jmeno
GO BOTTOM
? RECNO(), jmeno

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

INDEX ON

Syntaxe: INDEX ON výraz TAG jméno

Vytvoří indexový tag v CDX souboru.

USE zakaznici EXCLUSIVE
INDEX ON UPPER(jmeno) TAG jmeno
SET ORDER TO TAG jmeno
SEEK "NOVÁK" 

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

LOCATE

Syntaxe: LOCATE FOR podmínka

Vyhledá první záznam splňující podmínku; další lze hledat CONTINUE.

USE zakaznici
LOCATE FOR UPPER(mesto) == "KOLÍN"
IF FOUND()
    ? jmeno
ENDIF

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

REPLACE

Syntaxe: REPLACE pole WITH výraz [FOR podmínka]

Změní hodnotu jednoho nebo více polí.

USE zakaznici
REPLACE aktivni WITH .F. FOR posledni_nakup < DATE()-365

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

SCAN

Syntaxe: SCAN [FOR podmínka] ... ENDSCAN

Prochází záznamy aktuální tabulky.

USE objednavky
SCAN FOR stav == "NOVÁ"
    ? id, datum, castka
ENDSCAN

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

SELECT

Syntaxe: SELECT alias | SELECT n

Změní aktuální pracovní oblast nebo alias.

USE zakaznici IN 0 ALIAS zak
USE objednavky IN 0 ALIAS obj
SELECT zak
? ALIAS()

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

SEEK

Syntaxe: SEEK výraz

Rychle hledá hodnotu v aktivním indexu.

USE zakaznici
SET ORDER TO TAG prijmeni
IF SEEK("NOVÁK")
    ? jmeno, prijmeni
ENDIF

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

SET DELETED

Syntaxe: SET DELETED ON | OFF

Určuje, zda mají být záznamy označené jako smazané skryté.

SET DELETED ON
USE zakaznici
BROWSE

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

SET EXACT

Syntaxe: SET EXACT ON | OFF

Řídí některá porovnání řetězců. Pro přesné porovnání je často vhodnější operátor ==.

SET EXACT OFF
? "ABC" = "AB"    && může záviset na nastavení
? "ABC" == "AB"   && .F.

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

SET ORDER

Syntaxe: SET ORDER TO [TAG název]

Volí aktivní indexové pořadí.

USE zakaznici
SET ORDER TO TAG mesto
GO TOP
BROWSE

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

USE

Syntaxe: USE tabulka [IN oblast] [ALIAS alias] [EXCLUSIVE | SHARED]

Otevře DBF tabulku.

USE data\zakaznici.dbf IN 0 SHARED ALIAS zak
SELECT zak
? RECCOUNT()

Doporučení: Před hromadnou změnou dat pracujte se zálohou a ověřte aktuální alias pomocí ALIAS().

4. Funkce A–Z

ALLTRIM()

Syntaxe: ALLTRIM(cText)

Odstraní mezery z levého i pravého okraje řetězce.

lcJmeno = "  Pavel Říha   "
? ALLTRIM(lcJmeno)

AT()

Syntaxe: AT(cHledat, cText [, nVýskyt])

Vrátí pozici hledaného textu; rozlišuje velikost písmen.

? AT("@", "info@example.cz")  && 5

ATC()

Syntaxe: ATC(cHledat, cText [, nVýskyt])

Jako AT(), ale bez rozlišení velikosti písmen.

? ATC("fox", "Visual FOXPro")

BETWEEN()

Syntaxe: BETWEEN(eVýraz, eDolní, eHorní)

Testuje, zda hodnota leží včetně mezí v intervalu.

lnVek = 45
? BETWEEN(lnVek, 18, 65)

CTOD()

Syntaxe: CTOD(cDatum)

Převede znakový řetězec na datum podle aktuálního SET DATE.

SET DATE GERMAN
ldDatum = CTOD("08.08.2026")
? ldDatum

DATE()

Syntaxe: DATE()

Vrátí aktuální systémové datum.

? DATE()
? DATE() + 7

DATETIME()

Syntaxe: DATETIME()

Vrátí aktuální datum a čas.

ltNow = DATETIME()
? ltNow

DTOC()

Syntaxe: DTOC(dDatum [, 1])

Převede datum na znakový řetězec.

? DTOC(DATE())

DTOS()

Syntaxe: DTOS(dDatum)

Převede datum na řetězec YYYYMMDD; vhodné například pro indexy.

? DTOS(DATE())

EMPTY()

Syntaxe: EMPTY(eVýraz)

Testuje prázdnou nebo nulovou hodnotu podle datového typu.

lcText = ""
? EMPTY(lcText)

FILE()

Syntaxe: FILE(cSoubor)

Zjistí, zda soubor existuje.

IF FILE("data\zakaznici.dbf")
    USE data\zakaznici
ENDIF

FOUND()

Syntaxe: FOUND([nOblast | cAlias])

Vrátí, zda poslední LOCATE/SEEK nalezl záznam.

LOCATE FOR id = 100
IF FOUND()
    ? "Nalezeno"
ENDIF

IIF()

Syntaxe: IIF(lPodmínka, eAno, eNe)

Vrátí jednu ze dvou hodnot podle podmínky.

lnCena = 1200
? IIF(lnCena > 1000, "dražší", "levnější")

LEN()

Syntaxe: LEN(cText)

Vrátí délku řetězce.

? LEN("FoxPro")  && 6

LOWER()

Syntaxe: LOWER(cText)

Převede text na malá písmena.

? LOWER("FOXPRO 9")

RECNO()

Syntaxe: RECNO([alias])

Vrátí číslo aktuálního záznamu.

USE zakaznici
GO TOP
? RECNO()

RECCOUNT()

Syntaxe: RECCOUNT([alias])

Vrátí počet fyzických záznamů tabulky.

USE zakaznici
? RECCOUNT()

STR()

Syntaxe: STR(nČíslo [, nDélka [, nDesetinných]])

Převede číslo na řetězec.

lnCena = 1234.5
? STR(lnCena, 10, 2)

SUBSTR()

Syntaxe: SUBSTR(cText, nStart [, nPočet])

Vrátí část řetězce.

? SUBSTR("Visual FoxPro", 8, 6)  && FoxPro

TRANSFORM()

Syntaxe: TRANSFORM(eVýraz [, cFormát])

Převede hodnotu na text, volitelně podle formátovací masky.

lnCena = 1234.5
? TRANSFORM(lnCena, "9 999.99")

TYPE()

Syntaxe: TYPE(cVýraz)

Vrací znak popisující typ vyhodnoceného výrazu.

lnX = 10
? TYPE("lnX")  && N

UPPER()

Syntaxe: UPPER(cText)

Převede text na velká písmena.

? UPPER("Visual FoxPro")

VAL()

Syntaxe: VAL(cText)

Převede číselný text na číslo.

? VAL("123.45") + 1

5. DBF, CDX a FPT

DBF obsahuje tabulková data, CDX indexy a FPT memo/bloková pole.

Vytvoření tabulky

CREATE TABLE zakaznici ;
    (id I AUTOINC NEXTVALUE 1 STEP 1, ;
     jmeno C(50), ;
     email C(100), ;
     datum_reg D, ;
     aktivni L)

INDEX ON UPPER(jmeno) TAG jmeno
INDEX ON id TAG id CANDIDATE

Vložení dat

INSERT INTO zakaznici (jmeno, email, datum_reg, aktivni) ;
VALUES ("Jan Novák", "jan@example.cz", DATE(), .T.)

Bezpečná aktualizace

BEGIN TRANSACTION
TRY
    UPDATE zakaznici SET aktivni = .F. ;
      WHERE datum_reg < DATE()-730
    END TRANSACTION
CATCH TO loEx
    ROLLBACK
    MESSAGEBOX(loEx.Message, 16, "Chyba")
ENDTRY
Pozor: DELETE pouze označuje záznamy. PACK je fyzicky odstraní a obvykle vyžaduje výhradní otevření tabulky.

6. SQL ve Visual FoxPro

SELECT

SELECT id, jmeno, email ;
  FROM zakaznici ;
 WHERE aktivni = .T. ;
 ORDER BY jmeno ;
 INTO CURSOR curAktivni READWRITE

BROWSE

JOIN

SELECT z.jmeno, o.id AS objednavka, o.castka ;
  FROM zakaznici z ;
  JOIN objednavky o ON o.zakaznik_id = z.id ;
 WHERE o.castka > 1000 ;
 INTO CURSOR curPrehled

GROUP BY

SELECT zakaznik_id, COUNT(*) AS pocet, SUM(castka) AS suma ;
  FROM objednavky ;
 GROUP BY zakaznik_id ;
 INTO CURSOR curSouhrn

INSERT / UPDATE / DELETE

INSERT INTO zakaznici (jmeno, aktivni) VALUES ("Eva Malá", .T.)

UPDATE zakaznici SET aktivni = .F. WHERE id = 15

DELETE FROM zakaznici WHERE id = 15

7. Objektový model, formuláře a události

Vytvoření jednoduchého formuláře programově

PUBLIC goForm
goForm = CREATEOBJECT("Form")
goForm.Caption = "Moje aplikace"
goForm.Width = 600
goForm.Height = 400

goForm.AddObject("cmdClose", "CommandButton")
goForm.cmdClose.Caption = "Zavřít"
goForm.cmdClose.Left = 20
goForm.cmdClose.Top = 20
goForm.cmdClose.Visible = .T.

goForm.Show()
READ EVENTS

Vybrané vlastnosti

VlastnostVýznamPříklad
Form.CaptionText v titulku formuláře.
ThisForm.Caption = "Evidence zákazníků"
Form.Width / HeightRozměry formuláře.
ThisForm.Width = 800
ThisForm.Height = 600
Control.EnabledPovolí nebo zakáže ovládací prvek.
ThisForm.cmdSave.Enabled = .F.
Control.VisibleZobrazí nebo skryje prvek.
ThisForm.lblInfo.Visible = .T.
TextBox.ValueHodnota textového pole.
ThisForm.txtName.Value = "Novák"
Grid.RecordSourceAlias nebo kurzor, který Grid zobrazuje.
ThisForm.grdZak.RecordSource = "zakaznici"

Vybrané události

UdálostVýznamPříklad
InitSpouští se při inicializaci objektu.
THIS.Caption = "Připraveno"
LoadU formuláře probíhá před Init; vhodné pro otevření dat.
USE zakaznici IN 0 SHARED
ClickKliknutí na tlačítko nebo jiný prvek.
MESSAGEBOX("Kliknuto")
ValidValidace hodnoty při opouštění prvku.
RETURN !EMPTY(THIS.Value)
DestroyUkončení objektu; uvolnění zdrojů.
IF USED("zakaznici")
    USE IN zakaznici
ENDIF

8. Vlastní třídy

DEFINE CLASS Zakaznik AS Custom
    cJmeno = ""
    nId = 0

    PROCEDURE Init(tcJmeno, tnId)
        THIS.cJmeno = tcJmeno
        THIS.nId = tnId
    ENDPROC

    PROCEDURE Popis
        RETURN TRANSFORM(THIS.nId) + " - " + THIS.cJmeno
    ENDPROC
ENDDEFINE

LOCAL loZak
loZak = CREATEOBJECT("Zakaznik", "Jan Novák", 10)
? loZak.Popis()

9. Ošetření chyb

TRY
    USE neexistuje.dbf IN 0
CATCH TO loException
    MESSAGEBOX( ;
        "Chyba: " + loException.Message + CHR(13) + ;
        "Řádek: " + TRANSFORM(loException.LineNo), ;
        16, "Chyba aplikace")
FINALLY
    * úklid zdrojů
ENDTRY

V produkčních aplikacích je vhodné chyby zapisovat do logu a uživateli zobrazit stručnou, srozumitelnou zprávu.

10. Reporty

SELECT zakaznici
REPORT FORM reporty\zakaznici PREVIEW

* Tisk přímo na tiskárnu:
REPORT FORM reporty\zakaznici TO PRINTER NOCONSOLE

Report Designer pracuje s datovým prostředím, poli, skupinami a výrazy. Před spuštěním reportu vždy ověřte, že je otevřen správný alias nebo kurzor.

11. Soubory a adresáře

lcFile = GETFILE("dbf", "Vyberte tabulku")
IF !EMPTY(lcFile)
    USE (lcFile) IN 0
ENDIF

IF !DIRECTORY("export")
    MD export
ENDIF

COPY TO export\zakaznici.csv TYPE CSV

12. COM / Automation

LOCAL loExcel
loExcel = CREATEOBJECT("Excel.Application")
loExcel.Visible = .T.
loExcel.Workbooks.Add()
loExcel.Cells(1,1).Value = "Visual FoxPro 9"
loExcel.Cells(2,1).Value = DATE()
Použití COM závisí na instalovaných aplikacích a jejich objektovém modelu.

13. Kompletní praktický příklad – jednoduchá evidence

CLEAR
CLOSE DATABASES ALL
SET DELETED ON
SET SAFETY OFF

IF !FILE("zakaznici.dbf")
    CREATE TABLE zakaznici ;
      (id I AUTOINC NEXTVALUE 1 STEP 1, ;
       jmeno C(50), ;
       email C(100), ;
       mesto C(40), ;
       aktivni L)
    INDEX ON UPPER(jmeno) TAG jmeno
ENDIF

USE zakaznici IN 0 SHARED ALIAS zak
SELECT zak

IF RECCOUNT() = 0
    INSERT INTO zak (jmeno,email,mesto,aktivni) ;
      VALUES ("Jan Novák","jan@example.cz","Kolín",.T.)
    INSERT INTO zak (jmeno,email,mesto,aktivni) ;
      VALUES ("Eva Malá","eva@example.cz","Praha",.T.)
ENDIF

SELECT id, jmeno, email, mesto ;
  FROM zak ;
 WHERE aktivni ;
 ORDER BY jmeno ;
 INTO CURSOR curSeznam

BROWSE NORMAL NOWAIT
RETURN

Co příklad ukazuje

  • kontrolu existence tabulky,
  • vytvoření DBF a indexu,
  • INSERT INTO,
  • SELECT ... INTO CURSOR,
  • práci s aliasem,
  • zobrazení dat pomocí BROWSE.

14. Rejstřík A–Z

15. Doporučené zdroje

  • DAQUAS – české doplňky pro Visual FoxPro 8/9.
  • Bakaláři – přehled funkcí a stručný popis jazyka FoxPro v češtině.
  • Hacker's Guide to Visual FoxPro – rozsáhlá anglická referenční příručka příkazů, funkcí, vlastností, událostí a metod.
  • DAQUAS – materiály pro začátečníky a informace k novinkám Visual FoxPro 9.0.

Odkazy: daquas.cz, napoveda.bakalari.cz, hackfox.github.io