Ultima actualizare: 2022-12-06
Alt ghid util: https://hackfox.github.io/

=== Setari/environment ===
-- Afisare ceas
SET CLOCK ON
-- Setare numar de zecimale (precizie)
SET DECIMALS TO 10
-- Schimbare separator zecimale
SET POINT TO ","
-- Stergerea variabilelor de utilizator
CLEAR MEMORY
CLEAR ALL
-- Afisarea variabilelor de utilizator
SHOW MEMORY
LIST MEMORY
-- Toate datele si orele sunt implicit in format american
 adica mm/dd/yy si 12h hh:mm AM/PM.
-- Adevarat si fals sunt reprezentate ca si .T. sau .F., respectiv.
-- Diferenta dintre DISPLAY si LIST este ca DISPLAY umple ecranul
 apoi asteapta o apasare de tasta de la utilizator pana sa afiseze
 urmatorul ecran de informatii. LIST varsa absolut tot pe ecran
 chiar daca datele fac scroll in afara lui.

=== Declarare variabile ===
-- Numeric
var = 10
-- String
var = "Niste text"
-- Data (format ISO8601 yyyy-mm-dd)
var = {^2022-12-31}
-- Array/tablou/vector
DECLARE tbl[10]
DIMENSION tbl[10]
-- Matrice
DECLARE mtx[10,10]
-- Seteaza toate pozitiile din vector la ceva
STORE 69 TO tbl
-- Adauga text la pozitia 1 din vector
tbl(1)="Niste text"
-- Seteaza numere la coordonatele 2 si 3 din matrice
mtx(2,3)=69

=== Interogare/afisare ===
-- Continutul unei variabile
?var
-- Continutul unei variabile (fara newline)
??var
-- Continutul la mai multe variabile o data
?x,y,z
-- Operatie matematica
?5/3
-- Continulul unui array (unde X indica pozitia)
?tbl(X)
-- Comentariu (orice dupa && nu este interpretat ca si comanda)
&& Un comentariu, similar cu // din C.

=== Citire de la tastatura/stdin ===
-- String
ACCEPT "Introduce text: " TO var
-- Numeric
INPUT "Introduce numar: " TO var
-- Asteapta interactiune (apasare de tasta)
WAIT "Apasa orice tasta"

=== Functii pe date numerice ===
sign(x) - semnul lui x (+-)
abs(x) - valoarea absoluta a modulului
mod(x,y) - operator modulo, restul impartirii
int(x) - partea intreaga, numarul fara zecimale
round(x,y) - rotunjire cu y zecimale
sqrt(x) - radacina patratica/radical
exp(x) - exponential
log(x) - logaritm natural (ln)
log10(x) - logaritm in baza 10 (log)
sin/cos/tan/asin/acos - functiile trigonometrice

=== Functii pe date alfanumerice/string ===
asc(x) - caracter --> ASCII (primul caracter in cazul unui sir)
chr(x) - ASCII --> caracter
len(x) - lungimea unui string
replicate(x,y) - repetarea lui x de y ori
space(x) - returneaza sir de x spatii
lower(x) - CuVaNt --> cuvant (schimbarea majusculelor in minuscule)
upper(x) - CuVaNt --> CUVANT (schimbarea minusculelor in majuscule)
proper(x) - "Aceasta este o propozitie" --> "Aceasta Este O Propozitie" (face
           prima litera a fiecarui cuvant sa fie mare)

strtran("ceva","findString","replaceString",pozitie,ori) - echivalent cu functia
find and replace la editoarele text. Primul parametru ia un sir, al doilea ce
sa caute, al treilea cu ce sa il inlocuiasca, al patrulea de la ce aparenta sa
inceapa, al cincilea la cate aparente dupa primul sa inlocuiasca.
?strtran("ana are mere mere mere","mere","pere",2,1)
ana are mere pere mere

=== Functii pe data/ora ===
date() - afiseaza data curenta in format implicit (mm/dd/yy)
datetime() - data si ora (mm/dd/yy hh:mm AM/PM)
time() - doar ora (hh:mm AM/PM)
day(x) - numarul zilei din luna (1-31)
dow(x) - ziua numerica a saptamanii (Day Of Week, 1-7)
cdow(x) - la fel dar numele zilei
week(x) - numarul saptamanii
month(x) - numarul lunii (1-12)
cmonth(x) - la fel dar numele lunii
year(x) - anul din x
hours(x) - orele din x
minute(x) - minutele din x
sec(x) - secundele din x
seconds() - secundele de azi, 00:00:00 pana in momentul prezent
&& Pe data/ora se pot face si operatii de adunare si scadere,
&& de exemplu ?DATE()-1 va afisa data de ieri, la fel functioneaza
&& si cu variabile care contin o data/ora.

=== Tabele ===
Orice tabel este reprezentat de un fisier .dbf si un singur tabel
poate fi incarcat in memorie o data.
-- Crearea si incarcarea unui nou tabel (fisierul se va numi numeTabel.dbf)
CREATE numeTabel
-- Schimbarea/setarea tabelului activ
USE numeTabel
-- Inchiderea tabelului curent (similar cu f.close() din C)
USE
-- Crearea unui nou tabel cu structura preluata din alt tabel (dar nu si valorile)
CREATE tabelNou FROM tabelExistent
-- Afisarea structurii
DISPLAY STRUCTURE
DISP STRU
-- Modificarea structurii (arata o fereastra si nu ia argumente ca si comanda)
MODIFY STRUCTURE
MODI STRU
-- Activarea accesului la campuri (implicit off)
SET FIELDS ON
-- Defineste la ce campuri are acces utilizatorul
SET FIELDS TO listaCampuri
-- Eliminarea accesului la orice camp
SET FIELDS TO
-- Adaugarea inregistrarilor interactiv
APPEND
-- Adaugarea unei inregistrare goale neinteractiv
APPEND BLANK
-- Copierea inregistrarilor (optional si campurile) din alt tabel
APPEND FROM numeTabel [FIELDS listaCampuri]
-- Adaugarea inregistrarilor interactiv (similar cu APPEND)
INSERT [BEFORE]
-- Adaugarea inregistrarilor neinteractiv (similar cu APPEND BLANK)
INSERT BLANK [BEFORE]
-- Inlocuieste inregistrari intr-o coloana spefica
REPLACE [ALL] camp WITH valoare [FOR exp] [WHILE exp]
-- Aratarea continuturilor tabelului activ interactiv (sinonime: EDIT, CHANGE)
BROWSE [FIELDS listaCampuri] [FOR cond1] [WHILE cond2] [FONT cFontName] [STYLE cStyleCodes] [FREEZE numeColoana] [LAST/NOINIT]
-- Clauza FIELDS (filtrare campuri)
:R - campul poate fi doar vizualizat (Read-only)
:V=<cond> - daca conditia e adevarata permite modificarea, altfel arata mesajul de eroare standard
:E=<msg> - mesaj standard de eroare
:W=<cond> - cursorul poate fi pus pe inregistrare doar daca conditia este adevarata
-- Clauzele FONT, STYLE, FREEZE si LAST/NOINIT
FONT - arata inregistrarile cu un anumit font
STYLE - caracteristicile fontului (bold, italic, underline)
FREEZE - permite modificari doar coloanei specificate
LAST/NOINIT - deschide fereastra cu ultimele setari aplicate
NOAPPEND - impiedica crearea a noi inregistrari
NODETELE - impiedica marcarea inregistrarilor pentru stergere
-- Arata doar campurile nume, prenume, salar si localitate, salar fiind imposibil de modificat
BROWSE FIELDS nume,prenume,salar:R,localitate
-- Arata doar campurile nume, pret, nume fiind imposibil de modificat si pret poate fi doar peste 100, in caz de eroare sa se afiseze "ghinion"
BROWSE FIELDS nume:R,pret:V=pret>100:E="ghinion"
-- Sari la o inregistrare (navigare tabel)
GOTO TOP
GOTO BOTTOM
GOTO 123
GO 123
&& Partea amuzanta este ca GOTO e singura comanda in limbaj unde comanda in sine
&& e optionala deci poti scrie doar un numar si FoxPro va sari la acea inregistrare.
123
-- Sari X inregistrari inainte sau inapoi (in cazul unui numar negativ)
SKIP 5
SKIP -2
-- Sare la prima inregistrare gasita dupa o conditie logica (EOF daca nu e gasita)
LOCATE FOR cond1 [WHILE cond2]
LOCATE FOR ceva > 10
-- Sare la urmatoarea inregistrare gasita (EOF daca ai trecut de ultimul rezultat)
CONTINUE
-- Marcarea inregistrarilor pentru stergere ("logic")
DELETE [SCOP] [FOR cond] [WHILE cond]
-- Marcarea inregistrarii curente pentru stergere
DELETE
-- Demarcarea inregistrarilor de la stergere
RECALL [SCOP] [FOR cond] [WHILE cond]
-- Stergerea definitiva a inregistrarilor marcate ("fizic")
PACK
-- Stergerea a tuturor inregistrarilor definitiv din tabelul curent ("fizic")
ZAP
-- Ignorarea inregistrarilor marcate de catre alte comenzi
SET DELETED ON (ignora)
SET DELETED OFF (nu ignora)

=== Functii pe tabele ===
field(x) - numele campului pe pozitia x
fcount() - numarul campurilor din tabelul activ
fsiz(x) - marimea campului x
bof() - adevarat daca inregistrarea selectata este la inceputul tabelului, altfel fals
eof() - adevarat daca inregistrarea selectata este la sfarsitul tabelului, altfel fals
recno() - numarul inregistrarii selectate
reccount() - numarul de inregistrari in tabel
deleted() - adevarat daca inregistrarea curenta este marcata pentru stergere, altfel fals