vineri, 21 iunie 2013

FoxProW pentru incepatori Introducere, Cap. 1


Cuvânt înainte

Prezenta lucrare este destinatä celor care doresc să cunoască modul în care se utilizează FoxProW în proiectarea de lucrări de prelucrare a datelor cu exemple practice. Lucrarea este destinată atât programatorilor (sau celor care au de gând să devina programatori), cât şi celor ce doresc sä-i ajute pe aceştia în munca lor (ajutorilor programatori). Ea a fost concepută ca suport pentru cursul de FOX al elevilor clasei a Xll-a de liceu.
În cursul expunerii sunt prezentate comenzile FoxPro utilizând următoarele convenţii:
Numele comenzilor şi cuvintele Fox sunt scrise cu litere mari.
Cuvintele scrise cu litere mici reprezintă nume de câmpuri sau de variabile (care sunt la alegerea utilizatorulul).
Cuvintele scrise între paranteze drepte reprezinta opţiuni (deci ele pot fi folosite dar nu este absolut obigatoriu să fie folosite). Ele rezolvă anumite opţiuni de prelucrare la alegerea utilizatorului, Dacă nu sunt utilizate comanda funcţionează (dar într-o formă mai simplä),
Cuvintele separate între ele cu o linie vericală (I) dreaptă semnificä faptul că respectivele cuvinte se pot utiliza exclusiv (utilizarea unuia îl exclude pe celălalt).
- expl - este evaluată ca o expresie logicä;
- expn - este evaluatä ca o expresie numerica-raţională întreagä;
- expc - este evaluatä ca o expresie character;
- expr - este evaluata ca o expresie de orice tip.
În capitolul 10 al lucrării, numit “Programe tip” se găsesc o serie de programe proprii, considerate performante, ofenite ca exemplu şi care cu anumite modificäri pot fi utitilizate în lucrările dumneavoasträ proprii. Ele rezolvă anumite probleme utile şi vă oferá un exemplu privind modul de rezolvare a acestor probleme. Existä (tot în acest capitol) o serie de explicatii privind utilizarea lor şi de asernenea se găsesc aceste programe pe o discheta anexată acestei lucrari, Explicaţiile sperăm sa vă ajute în îneţegerea programelor.
Sperând că această carte va satisface exigenţele dumneavoastră, va dorim mult succes în consultarea acestei lucrări.

Autorul

Introducere

Creşterea continuă a volumului precum şi a complexităţii datelor în conducerea proceselor economice precum şi a altor aspecte ale vieţii sociale şi materiale au impus metode şi tehnici de organizare a informaţiilor tot mai perfecţionate.
Principalele forme de organizare a informatilor pot fi grupate în fişiere şi bănci de date. Prima etapa în evoluţia metodelor şi tehnicilor de organizare a informaţiilor în condiţiile utilizärii calculatoarelor electronice se caracterizează în general prin adaptarea tipurilor de organizări existente în sistemele de prelucrare manuală la condiţiile tehnice impuse şi permise de calculatoarele electronice. Principalul tip de organizare a informaţiei este fişierul. Fişierul reprezintă o colecţie de date având un anumit mod de organizare. Acest sistem de organizare este comun sistemelor manuale ca şi celor automate, în exemplu fiind colecţia de fişe de personal dintr-o intreprindere (cuprinzând toate datele de personal) indifferent că aceste date sunt ţinute pe suport de hârtie (în varianta manualä) sau pe mijloace de memorare magneticä (în prelucrarea automată).
Un salt calitativ important în sistemele de prelucrare electronicä a datelor s-a înnregistrat o data cu crearea şi darea în exploatare a sistemelor de algoritmare şi programelor standard privind integrarea (înlänţuirea) fişierelor, atât ca mod de organizare, cat şi ca exploatare în sistemele de prelucrare automată. Apar astfel tehnici de organizare a informaţiei care permit reprezentarea datelor şi a relaţilor dintre ele, având ca rezulat utilizarea fişerelor integrate.
Un exemplu al tehnicilor de acest tip pot fi citate sistemele BOMP (Bill of Material Process) şi SCF (Systeme de Chainage de Fichers) utilizate pe calcuatoare tip IBM (primul) şi FELIX-C256 (al doilea). Aceste sisteme s-au dezvoltat în anii ’70 şi aveau drept suport calculatoarele din acel ani cu sisteme de operare ca SIRIS-50 ce se utilizau cu o serie de limbaje de programare ca COBOL, FORTRAN, ASSIRIS în care sunt definite câteva tipuri de acces la informaţii şi anume:
Accesul secvenţial este acel acces care nu permite reîntoarcerea deci accesul se face de la prima informaţie spre ultima sau dacă se doreşte accesarea unei înregistrări este necesar să fie pacurse toate cele anterioare. Acest tip de acces este relativ lent. El este caractenstic datelor pe suport de hârtie (o carte, cel puţin la scriere permite doar accesul secvenţial), sau pe suport de bandä magnetică, unde, deşi este posibilă revenirea benzii magnetice, la citirea unui fişier de pe bandă trebuie recunoscut antetul de fişier (începutul fişierului), structura lui de organizare şi apoi trebuie recunoscută înregistrarea cäutată, lucru care se face prin citirea secvenţialä, una după alta a înregistrărilor.
Accesul direct (mai corect spus cvasidirect) la înregistrări care este posibil în cazul suportului disc magnetic (care s-au dezvoltat în ultimul timp) care este mai rapid. Acest acces se caracterizează prin faptul că este posibilă accesarea unei informaţii în mod direct prin trimiterea la aceasta informaţie (înregistrare) prin intermediul unui fişier de adrese-index în care se face iniţial trimiterea şi apoi cunoscând adresa pe disc a înregisitrării se face citirea acesteia. Acest mod de acces este dat de posibilităţile tehnice pe care le oferă discul magnetic prin construcţia sa. Acest mod de organizare a accesului la înregistrări a permis dezvoltarea bazelor de date.
Într-o etapă ulterioară se dezvoltă sisteme care să asigure gestionarea datelor necesare mai multor utilizatori, astfel încât programele de aplicaţii să nu depindă de modul de structurare şi gestiune a datelor ajungându-se asfel la băncile de date.
Foxpro 2.6 este un sistem de gestiune a bazelor de date relaţionale. El asigură o rnare viteză de execuţie, compatibilitate cu toate sistemele DBASE FOXPRO din versiunile anterioare şi un context pentru întreţinerea şi dezvoltarea aplicaţiilor de prelucrare a bazelor de date.
O bancä de date presupune trei elemente şi anume:
1. o colecţie de date (baze de date) aflate în interdependenţă;
2. descrierea datelor şi a relaţiilor dintre ele ;
3. un sistem de programare pentru gestionarea datelor care asigură independenţa programelor aplicative faţă de modul de structurare al datelor, o redondanţă minima, controlată în memorarea acestora, precum şi timp minim de răspuns a solicitärile utiIizatoror în ansamblul lor (un limbaj de manipulare a datelor.
Noţiunea de bază de date se utilizează pentru a denumi grupat primele două elemente ale băncii de date. Baza de date are deci sens nurnai ca un element al băncii de date. Componenta a treia a băncilor de date este sistemul de programare cu o serie de sarcini specificate mai sus şi poartä denumirea de Sistem de Gestiune al Bancii de Date (SGBD) care asigura gestionarea (prin programe) a bazei de date sau a sistemului de baze de date asociate băncii de date. Se mai poate spune că banca de date este formată dintr-o bază de date (sau un sistern de baze de date) şi un SGBD asociat.
Scrierea de aplicaţii folosind procedurile FOXPRO oferă o serie de avantaje faţă de alte limbaje de programare. Acestea sunt legate de faptul că un program are o anumită independenţă faţă de bazele de date (care pot fi create şi modificate în afara programetor. Dacă în COBOL, PASCAL, BASIC sau C un program este strict legat de fişierul pe care îl prelucrează şi îl crează, aici nu se întâmplă acelaşi lucru. Acest fapt permite să se facă modificări (adăugari de campuri dă exemplu) în baza de date fară ca programul sä sufere vre-o modificare şi putând adauga programe noi care sä prelucreze aceste informaţii noi. Aceasta deoarece crearea bazelor de date în FoxPro se face separat faţă de celelalte operaţii asupra bazelor de date şi aceasta dă caracterul de SGBD FoxPro-ului. Aceste avantaje le au şi alte SGBD de exemplu PARADOX-ul. În plus însă FOXPRO posedä şi o extensie pentru documentarea programelor (FOXDOC) ceea ce nu posedă PARADOX-ul.
Bazele de date în FoxPro au o structură asemănătoare unui tabel. De altfel unii outori le şi descriu numindu-le tabele şi nu baze de date. În Paradox ele sunt numite “table” deci tabele.
În structura lor se disting denumirea câmpurilor, care este de fapt capul tabelului (structura bazei de date) şi inregistrile, care conţin rândurile tabelei adică valorile respective ca în exemplul de mai jos:

Tabel reprezentând o bază de date

În cadrul bazelor de date pot fi definite relaţii. De exemplu sä considerăm o bază de date referitoare la persoanele dintr-un oraş. Această bază de date poate fi definită prin numele şi prenumele persoanelor care alcatuiesc fiecare familie (persoane adulte), prin adresa lor să zicem numärul şi seria buletinului de identitate şi codul numeric personal pentru o identificare absolut exactă. Dar această listă de persoane ar putea fi completată cu o alta listă cuprinzând copiii acestor persoane, averea lor, ocupaţia etc. O listă cuprinzând copiii poate fi definită ca o sublistă a acestei prime liste sau se pot defini anumite relaţii între aceste liste. Relaţiile care pot fi definite între bazele de date în FoxPro sunt de mai multe tipuri:
- relaţii 1-1 - care stabilesc o corespondenţă biunivocă la înregistrările a două baze de date, astfel încât fiecarei înregistrari dintr-o bază de date îi corespunde o înregistrare într-o altă bază de date. Această relaţie nu este neapărat biunivocä în sensul că unor înregistrări poate sä nu le corespundă nici o înregistrare în cea de a doua baza de date. Ca exemplu a unei reiaţii de acest tip poate fi relaţia între un nomenclator de produse cuprinzând codul şi denumirea produsului, şi stocul cantitativ pe o magazie pentru acel produs. Acesta poate lipsi caz în care poziţia respectivă de stoc este vida.
- relaţii 1 la mai multe - stabileşte o relaţie în care o înregistrare conţine mai multe subordonari. Ca exemplu putem da o familie (soţ-soţie) şi numarul de copii corespunzator acelei familii. Acest numar poate varia între zero şi un numar peste 10.
Un alt exemplu este relaţia dintre nomenclatorul de produse definit mai sus cu stocurile de produse la mai multe magazii (atunci când într-o unitate economicä exista mai multe magazii care pot avea acelaşi produs). În acest caz relaţia ce se stabileşte poate merge de la 1-0 atunci când nu s-a realizat acel produs, şi panä la 1- numărul magaziilor, când produsul există în stoc la fiecare magazie.
- relaţii mai multe la mai multe - este o relaţe în care mai multe înregistrări într-o bază de date sunt puse în legätură cu mai multe înregistrări dintr-o altă bază de date. Ca exemplu s-ar putea da o relaţie stabilită între oferta de materii prime şi multitudinea cererilor de materii prime pe flecare tip de materie prima.
S-ar mai putea defini o relalie tip mai multe la una dar acest tip se reduce la tipul una la mai multe prin schimbarea sensului relaţiei.
Cerintele sistem ale FoxPro-ului sunt nepretenţioase. Pentru a putea lucra în FoxPro sunt necesare:
- un calculator IBM XT sau compatibil cum sunt: IBM XT şi AT, PS/2, Compaq Portable, Plus, DeskPro, Portable II, Portable Ill sau Compaq 386
- memorie minima 512 Ko
- o unitate de flopy disk şi un hard disk
- sistem de operare DOS v 2.1 sau mai mare, sau OS/2 v 1.0 sau mai mare.
- monitor monocrom sau color
- imprimantä compatibila cu sistemul de operare amintit

FoxPro poate utiliza memorie suplimentará AST RAM Page, Intel Above Board sau orice Board care satisface cerinţele LIM (LOTUS-INTEL-MICROSOFT). (Sau altfel spus orice calculator care se gaseşte la ora actuală pe piaţă). În reţea se pot utiliza staţii de lucru cu memorie minima de 640 Ko şi orice configuraţie de unităţi de disk sau fărä, Dos versiunea 3.1 sau mai mare sau OS/2 versiunea 1.0 sau mai mare, şi reţea Novell Advanced NetVare sau IBM PC Network, Token Ring Network, IBM PC Local Area Network program, 3Com 3Plus Network cu sistem de operare 3Com 3Plus sau orice configuraţie network compatibilá 100% NETBIOS cu sistem de operare DOS versiunea 3.1 sau mai mare.
FoxPro utilizează toate tipurile de memorie de calculator. Printr-o configurare curectă, pertormanţele pot fi considerabil îmbunatăţite. Dacă dispune de memorie convenţională şi extinsă, FoxPro o utilizeazá îmbunăţindu-şi performanţele.
În CONFIG.SYS trebuie precizate două linii şi anume:
BUFFERS 30 (Se recomandä, minim).
FILES = 40 (se recomandá, minim),
Acest număr este necesar deoarece în FoxPro sunt deschise simultan mai multe fişiere şi această cifră limitează numărul fişierelor deschise simultan.
Fişierul CONFIG.FP (în general se găseşte în directorul în care a fost creat FoxPro-ul), este un fişier de configurare citit de FoxPro la lansare. În fişierul CONFIG.FP se pot include şi comenzi proprii de configurare sub forma <element = valoare> ca de exemplu:
TALK = OFF
sau se poate indica un program care să fie lansat automat la încărcare:
COMMAND DO nume program.
- În AUTOEXEC.BAT se include comanda:
SET FOXPROCFG = cale(numefişier) pentru a găsi fişierul CONFIGFP (de configurare a FoxPro-ului).
PATH C:\FOXPRO26 se include în linia PATH aceasta pentru ca lansarea FoxPro-ului să se poată face din orice director.
FOXPRO poate fi folosit sub DOS sau WINDOWS. În DOS el lucreazä în mod text, în WINDOWS se foloseşte modul grafic (fonturi, imagini, desene, transfer între aplicaţii). Aceasta este posibil deoarece FoxPro2.6 se gäsete în ambele versiuni, atât sub DOS cat şi sub WINDOWS.
Cele studiate în continuare se referä la FoxPro versiunea 2.6. Programele scrise şi care funcţionează în celelalte versiuni (Dbase III, III+, IV sau FoxPro 2.0) funcţionează perfect în Fox2.6 eventual prin conversia unor programe (conversia se realizează automat) Invers însă lucrurile nu sunt neaparat adevărate şi aceasta deoarece FoxPro 2.6 introduce o serie de funcţii noi precum şi noi comenzi sau o nouä formă de scriere a unor comenzi şi de aceea un program scris cu suportul FoxPro 2.6 este foarte probabil sä nu funcţioneze într-o versiune mai veche,
Lansare în DOS: - FOX (enter)
În WINDOWS - 2K (dublu click) pe icoana corespunzätoare
Pentru ieşire din FOX se tasteazä QUIT şi ENTER.
Dupä lansare apare fereastra COMMAND unde se pot introduce comenzi şi se poate utiliza practic acest SGBD sau se lansează un catalog în care a fost creatä baza de date sau se cere selectarea sau adaugarea unui catalog (dacă se doreşte gruparea bazelor de date într-un catalog pentru o evidenţă mai simplă a lucrărilor neferiitoare la problema ce se doreşte a fi rezolvată).

1. INTRAREA ŞI IEŞIREA ÎN/DIN FOXPROW

       1.1 Elemente de interfaţă

Odată pornit FoxProW (se porneşte windows-ul şi se apasă dublu click pe icoana corespunzătoare sau se foloseşte lansarea cu comanda DOS – “FOX <ENTER>”) pe ecran apare fereastra Microsoft FoxPro care are în partea superioară un meniu sistem al FoxProW-ului prin care se poate selecta modul de lucru cu meniul. Aici se pot selecta comenzile pentru lucrul cu platforma grafică specifică Windows-ului sau cele specifice variantei sub DOS a FoxPro-ului. La instalare utilizatorul este întrebat asupra setului de taste şi combinaţii de taste folosite pentru comunicarea cu FoxPro-ul care permite individualizarea utilizärii FoxPro-ului.
Un alt element al FoxproW-ulul este fereastra de cornenzi care permite să se lucreze în celelalte două moduri şi anume în mod comandă, ceea ce presupune introducerea de la tastatură a unei comenzi în fereastra de comandă (urmată de ENTER) care realizează executarea imediată a comenzii (daca ea este valldă) sau posibilitatea introducerii unei comenzi prin care se deschide o altă fereastră în care există posibilitatea introducerii şi testării unui program care va fi executat ulterior.
Fereastra COMMAND are urmăoarele elemente:
- bara de titlu;
- buton de închidere (stânga sus) ;
- buton de maximizare/revenire la dimensiunile iniţiale (dreapta sus);
- buton de redimensionare - punctul din dreapta jos (se aplică metoda DD drag and drow);
- butoane şi bare de derulare orizontală/verticală;
- continutul ferestrei care se deruleazä.

Această fereastră poate fi manipulata ca orice altă fereastră Windows.
Cu FOXPRO se poate lucra în trei moduri şi anume:
- Modul IMEDIAT prin tastarea de comenzi urmate de <ENTER>;
          - Modul ASISTAT care constă în folosirea meniurior FOXPRO;
- Modul PROGRAMAT care constă în introducerea şi păstrarea comenzilor în nişte fişiere (program, fişiere de comenzi) şi lansarea lor după necesităţi.
Ecranul FoxProW este de fapt zona utilizator a ferestrei Microsoft FoxPro şi ea reprezintă zona de afişare a rezultatelor de către FoxPro. Spre deosebire de varianta sub DOS, care folosea tot ecranul fizic al calculatorului, FoxProW foloseşte doar interiorul ferestrei Microsoft EoxPro ca ecran de lucru. Iniţial pe ecran este afişată sigla FoxProW-ului (vulpea).
Pentru a putea vedea întregul conţinut al ecranului, se poate ascunde fereastra command, se poate transforma într-o icoană sau se poate închide această fereastră.
Reafişarea sa se realizează prin alegerea optiunii command din submeniul Window al FoxProW.
În afară de aceste elemente ale interfeţei FoxProW-ului, comunicarea dintre utilizatori şi sistem mai implicä şi alte elemente, cum ar fi ferestrele sistem şi obiectele de control.
Ferestrele sistem sunt deschise de FoxProW ca urmare a unor comenzi ale utilizatorului, în vederea realizării comunicării dintre cei doi, utilizator şi SGBD. Ferestrele de sistem pot conţine mesaje, obiecte de control şi chiar meniuri asociate.
Comunicarea propriuzisă se realizează prin intermediul obiectelor de control, care pot fi folosite la:
- introducerea de diverse texte, cu semnificaţii diferite (nume de fişiere, conţinutul unor câmpuri, valori numerice etc);
- selectarea unor opţiuni din mai multe variante posibile;
- activarea / dezactivarea unor comutatoare, opţiuni.
Obiectele de control sunt de următoarele tipuri:
- câmpuri, zone de editare, însotite eventual de butoane de incrementare şi decrementare (pentru câmpurile numerice);
- liste;
- comutatoare;
- declansatoare;
- butoane radio.
Se lucrează în general în toate 3 modurile - în modul imediat pentru verificarea şi vizualizarea comenzilor, a efectului lor, în mod asistat pentru anumite modificări asupra bazelor de date, crearea de rapoarte şi screenuri şi în general pentru unele rnodificări asupra bazelor de date care trebuie fäcute rapid şi nu se poate aştepta pânä la scrierea şi verificarea unui program şi în majoritatea cazurilor în modul programat.
Modul programat este modalitatea principală în care lucrează programatorii pentru a crea apilicaţii pentru alţi utilizatori, nespecialişti în programare, care sunt in aşa mod concepute încât ele să asigure rezolvarea tuturor problemelor puse, într-un mod simplu şi rapid, cu o serie de mijloace (proceduri) pentru asigurarea siguranţei datelor şi a uşurinţei şi simplităţii în utilizare.
În mod asistat meniul se apeleaza cu tasta ALT sau F10 sau cu mouse-ul (M) clik (K) pe opţiune. Renunţare cu ESC sau K în afara meniului.
Pentru exemplificarea modului de lucru cu obiectele de control ale interfeţei, vorn folosi două ferestre sistem: OPEN şi NEW aflate pe ecran ca urmare a alegerii opţiunilor open şi respectiv new din submeniul File.
Fereastra Open este folosită pentru specificarea numelui unul fişier ce urmeazá a fi deschis. Ea coţine următoarele obliecte de control:

              

- un câmp de editare, File name, în care poate fi introdus caracter cu caracter de la tastatură numele fişierului de deschis;
- două liste, una sub câmpul de editare iar cealaltă în partea dreaptä a ferestrei (numită Directory), care permit selectarea unui fişier şi respectiv a unui director dintr-o mulţime finită aflată (parial) pe ecran;
- două liste ascunse, numite List files of type prin intermediul căreia se permite selectarea tipului de fişier, respectiv a unităţii de disc; Diferenta dintre listele simple şi cele ascunse este că în acestea din urmă se afişează doar elementul selectat, restul listei putând fi vizualizată doar dacă se selectează această listă (butonul din dreapta).
- patru comutatoare, numite Al files, Read Only, Environment şi Exclusive, fiecare indicând prezenţa sau absenţa unei proprietăţi simbolizată de comutatorul respectiv; Prezenţa proprietăţii este indicată printr-un X în interiorul pătrăţelului asociat comutatorului.
- trei declanşatoare: New, Open şi Cancel, în partea dreaptă a ferestrei, a căror acţionare determină declanşarea anumitor operaţii, sugerată prin numele fiecärui declanşator.
Fereastra New, este folosită pentru crearea unui anumit fişier şi conţine următoarele obiecte de control:
- un grup de butoane radio, numit File Type, a căror principală caracteristică este aceea că permite selectarea unei anumite variante din mai multe posibile; activarea unui buton determină dezactivarea celui activat anterior.
- două declanşatoare, numite New şi Cancel.
Modul de lucru va fi prezentat în continuare:
Se poate folosi tastatura sau mouse-ul.
Modul de lucru cu tastatura:
In cadrul ferestrei trecerea de la un câmp la altul se realizează prin tastarea tastei TAB (înainte) respective SHIFT +TAB (înapoi). Pentru a completa un câmp cu o anumită valoare, se selectează câmpul (folosind TAB) după care se completează câmpul utilizând tastatura.
Câmpurile de editare numerice pot fi însoţite de butoane de incrementare/decrementare care apar în dreapta câmpurilor respective find reprezentate prin sageţi (sageată stânga). Acţionarea tastei (sageată sus) realizează incrementarea (respectiv săgeată jos) decrementarea cu o unitate.
Lista ascunsă trebuie de asemenea, selectată înainte de a putea alege elementul curent al acesteia. După selectare se apasă tasta SPACE pentru aflarea elementelor listei şi, cu ajutorul tastelor direcţionale se selectează elementul corespunzator (ENTER) care devine element curent, iar lista este ascunsă.
Comutatoarele dupa selectare se activează (sau dezactivează) folosind tasta SPACE sau ENTER, trecând comutatorul selectat în starea complementară.
Pentru activarea unui buton radio dintr-un grup se seletează mai întâi grupul, (tasta Tab sau SHIFT TAB) apoi se selectează butonul radio (cu ajutorul tastelor direcţionale şi în final se apasă tasta ENTER.
Folosind mouse-ul:
Câmpurile de editare se completează (folosind tastatura) dupa ce sunt selectate mai intâi printr-un click În câmpul respectiv pentru pozitionarea cursorului.
Butoanele de incrementare/decrementare se pot utiliza apasând click pe butonul respectiv. Selectarea unui element dintr-o listá ascunsä se realizeaza un click pe elementul curent iar apoi (se deschide lista respectivă) pe elementul din listă, care devine element curent,
Dintr-o listă elementul dorit se selectează cu click pe element, iar activarea
comutatoarelor respectiv a butoanelor radio şi a declanşatoarelor, prin click pe elementul respectiv.
Parasirea FoxProW-ului se poate realiza prin:
- alegerea opiunii Close de pe meniul asociat sistemului, sau prin dublu click pe butonul de închidere al ferestrei Microsoft FoxPro
- alegerea opţiunii Exit din submeniul File
- prin acţionarea tastelor combinate Alt+F4.
De asemenea FoxProW-ul poate fi suspendat şi prin ascunderea ferestrei asociate acestui sistem (transformarea ei într-o icoană) şi reluarea lucrului în FoxProW prin dublu click pe icoana asociată.

        1.2 Help-ul

Help (în engleză = ajutor), reprezintă o facilitate importantă în sensul că indică utilizatorilor modul de acţiune al comenzilor fox, al funcţiilor sistem.
Există două tipuri de help:
- ajutorul independent de context care poate fi cerut prin apăsarea tastei F1, sau cu ajutorul comenzii help tastată în fereastra de comandă. El oferă informaţii (în limba engleză) referitoare la elementele sistemului FoxPro care pot fi studiate pe rând sau se pot cere informaţii referitoare la anumite elemente ale acestui sistem (exemplu help browse tastat în fereastra de comandă, dă informaţii referitoare la comanda browse).
- ajutorul dependent de context, când la un apel al utilizatorului, sisternul selectează comanda sau operaţia în lucru din contextul în care ea se efectueză şi oferă informaţiile dorite. De exemplu dacä se lucreazá cu o fereastră sau un meniu, o comandä sau o funcţie, FoxPro-ul la tastarea Fl oferă informaţii referitoare la acea comandă sau funcţie.
De asemenea FoxProW ofera doua tipuri de ajutor: un tip, utilizat de către cei care lucreazá mult în mediul windows şi sunt familiarizaţi cu help-ul windows, este un tip de help apropiat de modul windows de afişare şi utilizare.
Un al doilea mod (tip baza de date) utilizat în special de utilizatorii mai vechi, obişnuiţi cu modul de afişare utilizat în versiunile anterioare Windows (dos) ale FoxPro-ului.
Selectarea uneia sau alteia din metode se face prin comenzi specifice şi anume:
SET HELP TO FOXHELP.HLP selectează modul windows de afişare şi utilizare.
SEF HELP TO FOXHELP.DBF selectează modul de afişare tip bază de date.

       1.3 Editorul de texte

FoxProW este dotat cu un editor do texte relativ performant deoarece este deseori necesară crearea sau modificarea unor fişiere (cel mai frecvent programatorii utilizează editorul de texte pentru a-ş introduce şi/sau modifica programele proprii sau preluate din alte surse).
Editorul de texte se apelează utilizând comanda MODIFY FILE fişier.prg unde fişier.txt reprezintă un fişier tip text cu extensia sa. La tasatarea acestei comenzi în fereatra de comanda va apare o nouă fereastră de editare unde se va introduce textul dorit. Textul se introduce carater cu caracter de la tastatură. La sfârşitul liniei se tastează ENTER.
Pentru deplasarea cursorului în cadrul ferestrei se pot folosi următoarele taste

Combinaţia de tasteSemnificatia
Săgeată dreaptaUn caracter dreapta
Săgeată stângaUn caracter stânga
Săgeată în susO linie în sus
Săgeată în josO linie în jos
PgUpO pagină în sus
PgDnO pagină în jos
HomeLa începutul liniei
EndLa sfârşitul liniei
CTRL+Săgeată dreaptaUn cuvânt la dreapta
CTRL+Săgeată sângaUn cuvânt la stânga
CTRL+HOMEÎnceputul textului
CTRL+EndSfârşitul textului

Dacă nu se precizează extensia, ea va fi .prg (extensie implicită)
Poziţionarea cursorului pe o anumită linie se poate realiza şi prin intermediul opţunii Goto line la alegerea căreia este deschisă o fereastră:
                


În această fereastră se va poziţiona cursorul în câmpul de editare line number, se va modifica valoarea (se va introduce valoarea liniei) prin introducere de a tastatură sau cu ajutorul butoanelor de incrementare (mouse), se va selecta apoi butonul Goto pentru pozitonarea pe linia dorită.
O facilitate deosebit de importantă este posibilitatea oferită de a lucra cu blocuri de text, adica tratând un bloc de text ca un tot unitar.
Selectarea blocului de text se poate face cu mouse-ul sau cu tastatura. Cu tastatura se ţine tasta SHIFT apăsată şi se deplasează cursorul conform tabelulul de mai sus (care indică deplasarea cursorului) şi textul pe care se deplasează cursorul este selectat (se coloreaza diferit, în roşu).
Cu mouse-ul se selectează textul prin deplasarea acestuia peste text cu butonul stáng acţionat. Deselectarea se face deplasând cursorul în orice direcţie fară a acţiona tasta SHIFT, iar cu mouse-ul deplasând cursorul fără acţionarea butonului.
Tasta Backspace şterge caracterul din stânga cursorului, Delete şterge caracterul în faţa cäruia se aflä cursorul. Prin selectarea unui text urmată de apăsarea tastei Backspace se şterge textul selectat. Acelaşi lucru se realizează şi prin selectarea unui text şi selectarea optiunii Clear din meniul Edit.
Exista posibilitatea copierii sau mutării unui text prin alegerea opiunilor Cut, Copy sau Paste din meniul Edit:
Astfel opţiunea Cut încarcă textul selectat în clipboard, eliminându-l din textul sursă.
Opţiunea Copy încarcă textul în clipboard fără eliminarea lui.
Opţiunea Paste încarcă textul din clipboard în texzul editat, la poziţia cursorului.
FoxPro-ul poate realiza căutarea unui text (cuvânt, frază) în textul editat şi poziţionarea cursorului la respectivul text. Aceasta se realizează folosind opiunile Find, sau Find again (caută din nou), iar apoi Replace sau Replace and find again, sau Replace all din meniul Edit (înlocuieşte, înlocuieşte şi caută din nou şi înlocuieşte totul).
Pentru folosirea editorului în ferestra de comandă se fac următoarele observaţii:
1. Deplasarea cursorului pe o linie în care a fost scrisă o comandă şi apäsarea tastei ENTER duce la executarea comenzii respective indiferent unde se află cursorul în cadrul liniei;
2. Când linia se terminá cu caracterul “;“ aceasta fiind o linie de continuare, se ia în considerare şi linia următoare, Această regulă este folosită şi la editarea programelor,
O comandä FOX se poate întinde pe maxim 2048 caractere. Se poate prescurta orice comandă la primele patru caractere. De exemplu comanda CLEAR se poate prescurta CLEA, comanda REPLICATE se prescurtează REPL şamd. Termiruarea forţata a unei comenzi se realizează prin apäsarea tastei ESC. O comandă fox conţine cuvântul rezervat care constituie un ordin pentru calculator care este urmat de alte cuvinte reprezentând argumente, opţiuni, vaniabile etc.
Pentru relansarea unei comenzi ne poziţionăm pe comandă (cu săgeiţile sau cu mouse-ul - M) şi apoi se tasteaza ENTER.
Comanda “?” (afişează) afişează datele pe linia următoare, Comanda “??” afişează răspunsul începând cu poziţia curentă.
Execuţa repetată a aceleişi succesiuni de operaţii prin intermediul meniurilor este ineficientä (fiecare operaţie trebuind să fie executată de fiecare dată). În locuI acestei metode se folosete o alta care ne permite automatizarea acestor operaţii precum şi utilizarea calculatorului de către persoane mai puţin familiarizate cu FoxPro-ul, care ştiu să utilizeze calculatorul, să introducă date, dar nu au cunoştinţe de programare (operatori calculator). Astfel mai întâi sunt concepute anumite operaţii care trebuie executate, mintal sau pe hârtie, se stabilesc instrucţiunile ce trebuie executate şi se introduc într-un fişier text (care se numeşte program) şi care poate fi ulterior lansat în execuţie de oricâte ori este necesar.
Un program se crează prin următorii paşi:
1. mai întâi se concepe mintal (sau pe hârtie, eventual utilizând schemele logice) algoritmul de rezolvare a problemei propuse;
2. se transformă acest algoritm într-un şir de instucţiuni, care constituie chiar programul de rezolvare al problemei respective;
3. urmoază introducerea programului în calculator, adică editarea acestuia, memorarea făcându-se în general pe un suport extern (harddisk);
4. ultima etapă este cea de execuţie sau de rulare, care constă în executarea instrucţiunilor programului, pentru care este folosită varianta compilată, adică o variantă a programului care este executabilä şi rezultă în urma compilärii (interpretării şi traducerii în instrucţiuni executabile de către compilator a comenzilor şi instrucţiunilor programului).
De exemplu următorul program:

clear
@14,30 say ‘FoxPro sub Windows’

Acest program care este foarte simplu se editează în felul urmätor:
În fereastra de comandă se introduce următoarea comandă:
modify command mesaj
Aceastä comandă are ca urmare deschiderea unei ferestre numite “mesaj.prg” de editare a acestui program pe care l-am numit mesaj.
El se introduce linie cu lilnie în acestă fereastră. Când se termină acestă operaţie se închide fereastra de editare “mesaj.prg” prin apăsarea tastei ESC, sau cu mouse-ul apăsând pe butonul de închidere al ferestrei dupä ce s-a salvat programul editat prin apäsarea tastelor CTRL/W sau alegând opţiunea save a submeniului file.
Apoi urmează compilarea programului (care se face automat) ce poate fi executată prin comanda compile mesaj acestă comandă având ca rezultat o varianta executabilă: fişierul mesaj.fxp care poate fi lansat în execuţie ori de câte ori dorim folosind comanda do mesaj care determiná ştergerea ecranului şi afişarea mesajului “FoxPro sub Windows”.
Dacă în locul numelui “mesaj” vom edita un program numit altfel (este valid orice nume format din opt caractere maxim în care caracterele sunt o literă sau caracterul “_” sau cifrele de Ia 0 la 9), vom obţine programul respective. Înlocuind cede douä comenzi din programul mesaj cu comenzile pe care le dorim în programul respectiv.

        1.4 Baze de date

           1.4.1 Definiţie. Crearea bazelor de date

Bazele de date reprezintă acumulări de date, organizate într-un anumit mod şi referitoare la un anumit subject (fenomen).
Pentru construirea unei baze de date este necesară existenţa datelor, existenţa unui suport de memorare a lor, cât şi existenţa unui mecanism de manipulare a acestor date. Datele sunt memorate la ora actuală pe discuri magnetice şi optice, rnecanismul de accesare îl reprezintă unităţile de disc magnetic (împreună cu interfeţele aferente), iar partea logică de momorare şi manipulare este asigurată de mecanismele software specializate – SGBD-urile. La nivel fizic bazele de date sunt constituite din fişiere a căror organizare şi manipulare este asigurată de SGBD.
În FoxProW se foloseşte următorul mecanism privind manipularea bazelor de date:
1 Baza de date trebuie creată înainte de utilizare. Această operaţie este necesară înainte de prima utilizare.
2. Prima operaţie asupra unei baze de date după crearea sa este deschiderea bazei de date prin care sistemul asociază bazei de date o zona de memonie pentru manipularea datelor.
3. Se pot face acum diverse operaţii asupra bazelor de date cum ar fi vizualizarea datelor, accesarea lor adăugarea de date, reordonarea etc.
4. În final se închide baza de date după terminarea lucrului prin care se eliberează zonele de memorie utilizate.
Privind operaţiile ce se pot executa asupra bazedor de date sunt:
- adăugarea de noi date în baza de date;
- modificarea datelor;
- ştergerea unor date introduse anterior;
- reorganizarea datelor din baza de date, din punctul de vedere al structurii sale, al ordinii datelor, etc.
Operaţiile amintite se pot executa prin intermediul meniului FoxPro sau prin intermediul cornenzilor Fox, variantă ce presupune cunoaşterea mediului de programare şi FoxProW, variantă utilizată de către programatori. Capitolul prezent îşi propune prezentarea modului de lucru cu meniurile Fox.
Pentru crearea unei baze de date să considerăm o bază de date de evidenţă a stocurilor de produse dintr-un depozit. Fiecare înregistrare din baza de date va conţine un produs caracterizat prin:
- codul produsului;
- denumirea produsului;
- cantitatea în stoc;
- unitatea de masură;
- necosită/nu necesită condiţii speciale de depozitare;
- informaţii suplimentare.
Pentru a crea acestă bază de date se alege opţiunea New a submeniului File, acesta determinând deschiderea ferestrei cu acelaşi nume:
Din grupul de butoane radio din stânga ferestrei se selectează butonul Table/DBF, indicând că fişierul ce se crează este o bază de date (se mai pot crea:
programe, fişiere ASCII, fişiere index, rapoarte, etichete, ecrane, meniuri, filtre, proiecte folosind restul de butoane radio). Urmează acţionarea declanşatorului New, operaţie ce va determina deschiderea unei noi ferestre, numitä Table/Structure, în care se va descrie structura bazei de date. Înainte de deschiderea acestei ferestre este necesar să stabilim structura exactă a bazei de date care este dată în următorul label:

Denumire câmpTip câmpLungZecim
Codcaracter8
Denumirecaracter30
CantNumeric102
Unit_mascaracter3
Cond_specLogical1
InformMemo10

Acestă structură se va indica în fereastra Table/Structure
Fereastra conţine o listă formată din şase coloane, fiecare linie descriind o linie (înregistrare) din baza de date, fiecare coloană descriind o caracteristică a câmpului.
Coloanele listei au urrnătoarele semnificaţii:
1. Prima cloană care nu poartă nici un nume, este utilizată la schimbarea ordinii de apariţie a câmpurilor, pentru mutarea unui câmp se acţioneză butonul din acestă coloană şi, cu butonul stâng al mouse-ului apăsat se mută câmpul o dată cu cursorul în noua poziţi, după care se eliberează butonul mouse-ului; utilizând tastatura. Operaţia se realizează cu ajutorul combmnaţiilor tastelor CTRL +|(sageata sus) şi CTRL+| (sageata jos)

2. A doua coloană, numită Tag, se utilizează la stabilirea criteriilor de ordonare şi indexare după cum se va discuta în capitolele următoare.
3. Urmätoarea coloană, numită Name, este folosită pentru indicarea numlui câmpului (cod, denumire etc);
4. A patra coboană, Type, specifică tipul fiecărui câmp de date; ea conţine o listă ascunsă cu următoarele elemente:
- Character - şir de caractere (maxim 255)
- Numeric - numeric (1-18 caractere numerice)
- Float - numeric idem
- Date - data calendaristicä (8 caractere)
- Logical - logic (boolean) (1 caracter)
- Memo - câmp memo (10 caractere)
- General - câmp general (10 caractere)
- Picture - imagine
5. Coloana a cincea, Width, serveşte la indicarea numărului total de caractere al câmpului. Pentru câmpurile tip date, logical, memo şi general nu este necesarä complectarea acestui câmp deoarece el este cunoscut dinainte şi se completeaza automa.
6, Coloana a şasea. Dec, se foloseşte pentru câmpurile numerice şi float pentru indicarea numarulul de cifre zecirnale. (numärul de zecimale +1 se adaugă la numărul de întregi şi se află nurnrul total de caractore ce se indică în coloana 5).
Fereastra Table Structure mai conţine două declanşatoare, în secţiunea Field prin care se poate insera un câmp nou deasupras câmpului curent (declanşatorul insert) sa se poate şterge câmpul current (declanşatorul Delete). După terminarea lucrului se acţionează declanşatorul OK pentru validarea, sau Cancel pentru renunţarea la crearea bazei de date.
Acţionarea declanşatorului OK determină deschiderea unei noi ferestre, Save As, folosită la specificarea numelui bazei de date cât şi a locului în care se va găsi (a
căii de acces, discul şi directorul).
Nurnele fişierului va fi introdus în câmpul de editare Save Table As sau se va alege din lista de sub acesta (PROD.DBF). Fişierul va fi depus pe discul selectat din lista ascunsa Drive:,
în directorul selectat din lista Directory. Sistemul mai afişează o fereastră de dialog la selectarea declanşatorului OK prin care suntem întrebaţi dacă dorim sau nu să introducem date în baza nou creată (Input data record now?). Un răspuns afirmativ (Yes) va deschide o altă fereastră de adăugare de date, iar unul negativ (No) va preda controlul ferestrei de comenzi.
Pentru exerciţiu, vă sugerăm să introduceţi (creaţi) baza de date cu structura indicată mai sus care s-o numiţi PROD.DBF.

1.4.2 Deschiderea/închiderea bazelor de date. Zone de lucru

Pentru a utiliza a bază d date, aceasta trebuie deschisă. Pentru manipularea bazelor de date FoxProW-ul utilizează zone speciale de memorie, numite “zone de lucru”, în care sunt memorate unele informaţii referitoare la asocierea sa cu o zonă de lucru. Într-o zonă de lucru se poate lucra (deschide) cu o singură bază de date la un moment dat. Pentru a folosi mai multe baze de date sunt utilizate mai multe zone de lucru. În FoxProW v2.6 sunt disponibile 225 zone de lucru.
Pentru anumite problome simple care nu utilizează decât o singură bază de date (o singură zonă de lucru) operaţia de deschidere se realizeazä astfel:
  • se alege opţiunea Open a submeniului File pentru deschiderea ferestrei cu aceaşi nume, în care se specifică numele bazei de date care se va deschide;
  • numele bazei de date se introduce manual în câmpul de editare File Name, sau se poate selecta din lista aflată sub acest câmp; prin lista Directory, de pe discul specificat în lista ascunsă Drive:, de tipul dat de elementul selectat din lista ascunsă List Files of Type;
  • se declanşează apoi butonul Open pentru deschiderea bazei de date respective;
  • acţionarea butonului New determină pornirea operaţiei de creare a unei baze de date cu numele specificat.
Controlul zonelor de lucru şi al bazelor de date deschise se realizează în FoxProW prin fereastra View în modul de lucru View, fereastra deschisă la alegerea opţiunii View a
submeniului Window:
Selectarea modului de lucru View din fereastra View se realizează prin acţionarea primului buton (din stânga sus) din grupul de cinci butoane. Celelalte moduri de lucru sunt On/Of, Files şi Misc corespunzând diferitelor grupuri de opţiuni ale meniului FoxProW.

Lista Work Areas (zone de lucru) conţine cca elemente 225 zone de lucru dintre care fiind accesibilă una dintre ele la un moment dat, selectată ca zonă curentă în care poate fi deschisă o bază de date.
Pentru a deschide o bază de date în zona curentă se acţionează declaşatorul Open care determină deschiderea ferestrei cu acelaşi nume. În această fereastră se alege baza de date care urmează a fi deschisă. Urmatoarele baze de date care se doresc a fi deschise trebuie să folosească altă zone de lucru, deci trebuie selectată altă zonă de lucru (din lista Work Areas) şi deschisă o bazä de date în aceasta.
O dată cu deschiderea unei baze de date într-o zonă de lucru, acesteia i se atribuie un nume simbolic (“alias”) folosit la referirea bazei de date respective care este afişat în lista Work Areas. De obicei aliasul este chiar numele bazei de date respective..
Observaţie: La crearea unei baze de date aceasta este automat deschisa în zona de lucru curentă. Dacă nu există o zona curentă deschisă explicit, acesta este implicit zona de lucru 1.
Dupä terminarea lucrului cu o bază de date ea trebuie închisă. Acest lucru poate fi făcut implicit sau explicit, din fereastra View, se selectează zona de lucru şi se acţioneză declanşatorul Close. Prin închiderea bazei de date se eliberează zona de lucru respectivă.
Închiderea impicită se poate face prin deschiderea unei ale baze de date într-o zonă de lucru (când este închisă automat baza de date deschisă anterior) sau prin ieşirea din mediul Fox când sunt închise toate bazele de date.

          1.4.3 Adăugarea de noi date în baza de date


         Încărcarea unei baze de date este prima operaţie ce trebuie avută în vedere pentru utilizarea unei baze de date. Adăugarera de înregistrări într-o baze de date este o operaţie curentă, ea realizânduse de fiecare dată când apar date noi referitoare la fenomenul studiat prin baza de date respectivă. Mai întâi se deschide baza de date la care se adaugă noi înregistrări procedându-se astfel:
         - se alege opţiunea Append a submeniului Record pe ecran fiind deschisă o fereastră de adăugare;
         - câmpurile (cele din structura bazei de date) sunt aşezate unul sub altul şi sunt separate printr-o linie punctată;
         - se completează fiecare câmp în parte, înregistrare după înregistrare;
         - completarea câmpurilor memo se face în ferestre separate deschise prin acţionarea combinatiei CTRL+PgDn şi închise cu ajutorul combinaţiei CTRL+ENTER;
         - câmpurile logice se completează cu F sau T (pentru false respectiv true, adică adevărat sau fals);
         - după completarea uItimului câmp al ultimei înregistrări de adăugat se acţionează combinaţia CTRL+END care închide fereastra de adăugare şi salvează noile înregistrari adăugate sau se închide fereastra ca orice fereastra Windows.
        Notă: Pentru adaugarea de date în acest mod trebuie ţinut cont de corelaţille pe care trebuie să Ie respecte valoriile introduse sau să se dispună de o Iista a tuturor valorilor reale. Acest mod de introducere a datelor nu ne scuteşte de anumite erori posibile la introducere şi de aceea este necesară o atenţie deosebită.

         1.4.4 Modificarea/vizualizarea conţinutului unei baze de date.

         Pentru verificarea datelor introduse FoxProW oferă o posibilitate de vizualizare şi verificare ca şi de modificare a datelor eventual eronate. Pentru aceasta se alege opţunea Browse a submeniulul Database, deschizându-se o fereastră în care se va afla spre modificare conţinutul bazei de date, sub forma de tabel, câmpurile find coloane iar înregistrările fiind rânduri.
Deplasarea din câmp în câmp se face cu ajutorul tastelor TAB şi SHIFT+TAB iar din înregistrare în înregistrare, folosind tastele direcţionale (săgată sus şi jos).
Odată deschisă fereastra Browse, Ia meniul sistem al FoxProW este adăugat un nou submeniu (numit tot Browse) prin care se pot efectua diferite operaţii în acestă fereastră cum ar fi:
          - schimbarea modului de afişare a câmpuriior (unul langă altul sau unul sub altul);
          - afişarea sau inhibarea afişării liniilor despărţitoare dintre câmpuri şi înregistrări;
- schimbarea dimensiunilor de afişare a câmpurilor, a ordinii de afişare a acestora;
- Schimbarea fontului de afişare a textului.
Modul de afişare este numit Browse când câmpurile sunt afişate unele Iânga altele, iar modul de afişare cu câmpurile unele sub altele este numit Change. Trecerea de a un mod Ia altul se reabizează prin alegerea opţiunii Change şi respectiv Browse, al meniului sistem.
Afişarea sau inhibarea liniilor despărţitoare dintre câmpuri se realizează prin selectarea optiunii Grid din submeniul Browse.
Modul de afişare a textelor se stabiIeşte în fereastra Font care se deschide Ia alegerea opţiunii Font a submeniului Browse.
Închiderea ferestrei Browse se realizează fie prin combinaţia tastelor CTRL+END, CTRL+W sau Close (submeniul File).

                      

           Pentru modificarea automată a conţinutului unor câmpuri din baza de date se poate alege oplţunea Replace a submeniului Record când se deschide fereastra Replace care este reprodusă în pagina curentă.
           În partea stangă se află o Iistî din care se alege câmpul care se modifică, din baza de date specificată în lista ascunsă From Table, Comutatoarele Scope, For şi While permit stabilirea înregistrărilor afectate de această comandă. Valorile care vor fi introduse în câmpul selectat vor fi precizate prin intermediul decIanşatoruIui With sau prin câmpul de editare din dreapta acestuia.
Prin decIanşatorul Scope trebuie indicat domeniul de acţiune al comenzii Replace : All adică asupra tuturor înregistrarilor, urmatoarele n înregistrari (unde n este întreg), când se selectează butonul radio Next şi se introduce n în câmpul de editare din dreapta butonului, înregistrarea cu numărul n, când se selectează butonul radio Record iar n se introduce în câmpul alăturat acestui buton, sau restul de înregistrări inclusiv cea curentă şi până la ultima înregistrare, când se selectează butonul radio Rest.
Dintre înregistrări sunt selectate doar cele care respectă condiţiile puse prin clauzele For şi While. Deci clauzele Scope, For şi While acţionează cumulativ, fiecare impunându-şi propriile restricţii Ia selectarea înregistrărilor.
Condiţiile clauzelor For şi While vor fi specificate cu ajutorul constructorului de expresii (care va fi prezentat ceva mai jos). Vor fi selectate acele înregistrări pentru care expresia clauzei este evaluată la valoare adevărat (.T.), iar pentru clauza While se vor selecta înregistrările numai atât timp cât valoarea clauzei este îndeplinită (cât timp valoarea expresiei este adevărată sau este .T.). Clauza For se traduce prin “pentru” iar clauza While prin “atăt timp cât”.
Pentru alcătuirea expresiilor (de orice tip dar în cazul nostru pentru construirea expresiilor asociate clauzelor For şi While) se deschide fereastra Expresion Builder, prin activarea comutatoarelor For (sau While) şi se va introduce o expresie în regiunea de editare (Expresion sau For Clause, sau While Clause după caz), fie manual de către utilizator, fie asistat de către sistemul FoxProW prin intermediul celorlalte obiecte de control din fereastră.
                  

               Listele ascunse String, Math, Logical şi Date conţin funcţii FoxProW de tip şir de caractere, numeric, logic şi respectiv data calendaristică.
Exemplu condiţia: SUBSTR(Prod.cod,1,1)==”A” se introduce în folul următor: Se octivează comutatorul For al forestrel Replace deschizâdu-se fereastra Expresion Builder. Din lista ascunsă String se alege SUBSTR(,,);
Apoi din lista Fields se alege câmpul cod (Prod.cod - baza de date prod.dbf a fost deschisă anterior şi a fost selectată din lista ascunsă From Table);
Se completează cu 1 celelalte pozii ale funcţiei Substr() după care se mută cursorul Ia sfârşitul liniei:
Se aIege operatorul din lista ascunsă Logical şi se alege elementul “text” din lista ascunsă String şi între ghilimele se introduce caracterul “A” rezultând expresia:
SUBSTR(PROD.cod1 ,1)==”A”
Se acţionează declanşatorul Verify pentru verificare şi Ok pentru acceptarea expresiei, după care este executată comanda Replace de către sistem.
Exemplu: Se doreşte modificarea cantităţii tuturor înregistrărilor care au primele 4 caractere din denumire “bere” cu dublul cantităţii existente în baza de date. Rezolvarea este:
Scope: All
For: SUBSTR(PROD.denumire,1 ,4)==”bere”
While
-
Câmpul de modificat din fereastra Replace este CANTITATE
Cu ajutorul constructorului de expresii în spaţiul din dreapta comutatorului With se introduce sau se construieşte expresia:
Prod.cantitate*2 după care se acţionează declanşatorul Replace.
Acelaşi lucru se va realiza şi în cazul în care se introduce în fereastra de comandă următoarea comandă:
Replace cantitate with cantitate * 2 for substr(denumire,1,4) == “bere” - după cum vom vedea Ia studiul programării în FoxProW.


           1.4.5 Ştergerea datelor din bazele de date. Accesul la datele coţinute în bazele de date

În FoxPro există două tipuri de ştergere:
1. O ştergere logică prin care înregistrările nu sunt şterse efectiv (fizic) din bazele de date, ci sunt marcate şi sistemul le recunoaşte ca fiind şterse.
2. O ştegere efectivă (fizică) prin care înregistrările nu mai exista în bazele de date, (după ştegere).
Datorită faptului că ştergerea logică marchează un indicator al înregistrării şi nu şterge efectiv înregistrarea din baza de date, există posibilitatea revenirii la o înregistrare înainte de ştergerea efectivă.
De asemenea se poate realiza o ştergere (logică) Ia nivel de câmpuri în sensul că se poate stabili o listă de câmpuri care pot fi accesate prin comenziile şi functiile FoxProW, restul de câmpuri fiind invizibile pentru utilizator.
Pe lângă aceste moduri de ştergere FoxProW mai permite selectarea unor înregistrări în funcţie de respectarea unor condiţii dinainte stabilite (procedeu numit filtrare) putând fi eventual şterse (logic) aceste înregistrări.
Ştergerea logică a înregistrărilor se realizează prin intermediul ferestrei Delete a submeniulul Record. În această fereastră se specifică înregistrările care vor fi şterse prin clauzele Scope, For şi While după care se acţionează declanşatorul Delete. Operaţia este executată asupra bazei curente (baza de date deschisă, în zona activă).
Ştergerea efectivă poate fi făcută după această operaţie (care este o ştergere logică) după care se recomandă ştergerea fizică, prin alegerea opţiunii Pack din submeniul Database. O dată şterse fizic, înregistrările nu mai pot fi refăcute. (Totuşi, dacă sunt şterse fizic înregistrări utile, poate fi refăcută baza de date dinaintea ştegerii prin comenzi DOS deoarece se crează o nouă bază de date dar se pstrează un fişier cu aceeaşi denumire dar cu extensia .BAK). La comanda Pack sunt şterse fizic toate înnregistrările marcate pentru ştergere (şterse logic) indiferent în câte etape şi când a fost facută ştergerea logică.
Rechemarea înregistrărilor şterse logic anterior poate fi obţinută astfel:
- se alege opţiunea Recall din submeniul Record pentru deschiderea ferestrei Recall;
- se specifică apoi condiţille de selecţie a înregistrărilor ce urmează să fie rechemate, cu ajutorul clauzelor Scope, For şi While;
- se acţioneaza declanşatorul Recall.
Condiţiile de accesare a câmpurilor bazei de date active se stabileşte în felul umător:
1. Se deschide fereatra Setup prin alegerea acestei opţiuni din submeniul Database;
2. Se acţionează declanşatorul Fields deschizându-se. în acest fel fereastra Field Picker.
3. Din lista All Fields se selectează câmpurile active care vor fi transferate în lista Selected Fields prin acţionarea declanşatorului Move.
4. Eliminarea din lista Selected Fields şi trecerea câmpurilor înapoi în lista All Fields înseamnă eliminarea câmpurilor respective din lista de câmpuri active (Selected Fields) şi se realizează prin actionarea declanşatorului Remove.
5. Declanşatoarele All şi respectiv Remove All realizează mutarea tuturor câmpurilor în lista activă (Selected Fields) respectiv eliminarea lor din aceasta (Remove All). 6. Încheierea operaţiei şi revenirea în fereastra Setup se realizează prin acţionarea declanşatorului Ok care se închide de asemenea prin acţionarea declanşatorului OK.
Cel de al treilea tip de ştergere / accesare a datelor, filtrarea înregistrărilor se realizează asemănător doar că în fereastra Setup se acţioneza declanşatorul Filter Data. Va fi pornit constructorul de expresii în vederea specificării expresiei de filtrare după care se acţionază declanşatorul Ok.
Deplasarea în înregistrările bazei de date (în afară e deplasarea manuală explicată în fereastra Browse) se poate realiza prin schimbarea indicatorului de înregistrări al bazei de date, prin schimbarea indicatorului înregistrarea devine egală cu cea a numarului indicatorului.
Pentru deplasare este necesar să selectăm opţiunea Goto din submeniul Record în acest fel deschizându-se fereastra Goto în care:
- selectarea butonului radio Top determină pozitionarea indicatorului de înregistrare pe prima înregistrare a bazei de date iar butonul radio Bottom deplasează indicatorul de înregistrare pe ultima înregistrare a bazei de date.
- butonul radio Record este folosit pentru deplasarea pe o anumită înregistrare (n unde n reprezintă un întreg care se introduce în câmpul de editare din dreapta butonului Record, realizând deplasarea pe prima – n=1, a zecea – n=10 sau a cinciyeci şi şaptea - n=57).
În aceeaşi fereastră se află şi butonul radio Skip care se utilizează pentru (deplasari relative (deplasari luând în considerare poziţia în care se află indicatorul de înregistrare în acel moment). Dacă se selectează acest buton şi se introduce 5 în câmpul de editare alăturat indicatorul de înregistrare avansează cu cinci înregistrări). În acest caz o valoare pozitivă introdusă în câmpul de editare indică deplasarea spre sfârşitul fişierului a indicatorului de înregistrare iar o valoare negativă indică o deplasare spre începutul fişieruIui. Exemplu:
1. Deplasarea pe prima înregistrare Goto Top sau Goto 1
2. Deplasarea pe înregistrarea 111 - Goto 111
3. Deplasarea pe înnregistrarea 88 - Goto 88 sau Goto 8*11
4. Deplasarea pe ultima înregistrare - Goto Bottom
5. Deplasarea pe înregistrarea anterioară - Skip -1
6. Deplasarea cu trei înregistrări - Skip 3
Într-o bază de date se poate cere sistemului să caute o anumită înregistrare. În acest caz indicatorul de înregistrare se pozitionează pe înregistrarea respectivă. Prin alegerea opţiunii Locate din submeniul Record se deschide fereastra cu acelaşi nume pentru folosirea acestei căutări. Condiţiile de selectie a înregistrărilor (de căutare) se precizeaza prin clauzele Scope, For şi While, iar Ia selectarea declanşatorului Ok, indicatorul de înregistrare va fi poziţionat pe prima înregistrare care respectă condiţiile din aceste clauze. Dacă se doreşte căutarea în continuare (în cazul în care există mai multe înregistrari care respectă aceste condiţii) se va folosi opţiunea Continue a submeniului Record şi indicatorul de înregistrare se va poziţiona pe următoarea înregistrare care respectă condiţiile impuse.
Exemplu: Sa se caute primele 4 înregistrări care au preţul produsului mai mare decât 2500 lei:
Locate - Scope All- For PROD.pret > 2500 - While
Continue
Continue
Continue

         1.4.6 Organizarea şi reorganizarea bazelor de date

Operând cu cantităţi mari de date, SGBD-urile moderne sunt prevăzute cu facilităţi de ordonare după criterii diverse folosind tehnici dintre cele mai moderne. În FoxProW accesul făcându-se Ia nivel de înregistrare, ordonarea bazelor de date va însemna stabilirea unei anumite ordini în care vor fi accesate înregistrarile din baze de date. O bază de date poate fi ordonată după un anumit criteriu dacă fiecare înregistrare a acesteia respectă criteriul dat în raport cu înregistrările anterioare şi posterioare. Acest criteriu poartă numele de “cheie de ordonare” valoarea ei, în mod normal, fiind diferita la fiecare înregistrare. în general ea conţine câmpuri ale bazei de date sau fragmente de câmpuri.
Bazele de date pot fi sortate sau indexate. Prin sortarea unei baze de date se construieşte o altă bază de date (cu un alt nume şi extensia .dbf) dar în care înregistrările se află în ordinea cerută de cheie. Ordonarea poate fi făcută crescător sau descrescător.

Prin indexarea unei baze de date se construieşte un fişier asociat bazei de date care stabileşte ordinea înregistrarilor (aşa cum cere cheia - numit fişier index) iar baza de date rămâne neschimbata.
Pentru sortarea bazelor de date se selectează opţiunea Sort a submeniului Database când este deschisă o fereastră de dialog şi din Iista ascunsă From Table se alege baza de date ce urmează a fi sortată.
                     
           
            Partea superioară a ferestrei este folosită Ia specificarea cheii de ordonare care în acest caz se numeşte cheie de sortare. În stânga se găseşte lista All Fields din care se pot aloge câmpurile ce vor constitui cheia de sortare, jar în dreapta se află lista Sort Order, în care se vor introduce câmpurile selectate în cheie.
Cheia de sortare se stabileşte astfel: se stabileşte primul criteriu de sortare (deci se stabileşte ordinea – crescător sau descrescător – şi câmpul de sortare), deci se alege unul din butoanele radio (ascending au descending) şi se selectează primul câmp de sortare din lista All fields şi prin acţionarea declanşatorului Move se adaugă acest câmp în Sort Order.
În cazul în care câmpul selectat este de tip caracter se poate activa comutatorul Ignore case pentru a face compararea câmpului independent de caracterele majuscule sau minuscule.
Se stabilesc (în acelaşi mod) şi celelalte câmpuri din cheia de sortare după care se trece la speciticarea condiţiilor de selectie a înregistrărilor prin intermediul opţiunii input a ferestrei prin comutatoarele Scope, For şi While. Numele noii baze de date (sortată) se poate indica în sectiunea Output. În acestă bază de date se pot selecta numai o parte a câmpurilor, ele se precizează în fereastra deschisă prin activarea comutatorulul Fields, apoi se poate acţiona decIanşatorul Save As, pentru construirea bazei de date sortată cu salvarea acestela, cu numele precizat.
Indexarea bazelor de date reprezintă o metodă performantă de acces la înegisrtrări, într-o anumită ordine (după o cheie de indexare). La sortare, baza de date este copiată într-o altă bază de date deci se face o risipă de spaţiu de memorare, pe când la indexare, deoarece se contruieşte un alt fişier care conţine numal cheia de indexare şi numărul înregistrării, se poate accesa rapid orice înregistrare în ordinea şi se face în acelaşi timp economie de spaţiu de memorare.

                       

Într-un fişier indexat indexul acţionează ca un filtru asupra bazei de date, înregistrările neordonate fizic fiiind văzute logic în ordinea dorită.
Cheia de indexare se construieşte fie alegând câmpuri din baza de date din lista Fields, fie cu ajutorul constructorului de expresii pornit Ia acţionarea decIanşatoruIui Index Key. Tipul de indexare (crescător sau descrescător) se indică prin intermediul butoanelor radio AscendIng respectiv Descending. Este posibil să existe mai multe înregistrări care să aibă aceeaşi valoare pentru cheia de indexare. Dacă se acţionează comutatorul Unique se va permite accesul numai la prima înregistrare din acestea, restul valorilor fiind inaccesibile. Când acest comutator este inactiv, se permite accesul la toate înregistrările.
Se poate stabili un filtru pentru accesul la înregistrarile bazei de date. Filtrul constă dintr-o expresie logică ce permite accesul Ia înregistrare doar dacă evaluată, ia valoarea .T. în caz contrar înregistrările fiind inaccesibile.
Expresia index se introduce în zona de editare din dreapta decIanşatoruIui Index Filter, sau se acţionează acest decIanşator când se porneşte constructorul de expresii.
Numele fişierului index se specifică în secţiunea Output File din fereastră. Tipul fişierului pate fi:
- Fişier index simplu (se acţionează butonul radio Single Index File);
-
Fişier index compus (când se selectează butonul Compound Index File
CDX);
Când este creat un fişier index compus, tipul acestui fişier, structural sau nestructural este dat de starea comutatorului Structural index Structure (când acesta este activat se creează un fişier index compus structural). Dacă se activează comutatorul Compact Index Structure se va crea un fişier compact (această opţiune are sens numai în cazul fişierelor index simple - fişierele index compuse sunt întotdeauna compacte).
Numele fişerului index şi directorul în care va fi acesta depus se introduc fie prin intermediuI ferestrei Save As, fie manual prin introducerea căii şi numelui fişierului în regiunea de editare din dreapta decIanşatorului.
Pentru crearea unui fişier index se parcurg următoarele etape:
- se stabileşte tipul fişierului idex (simplu sau compus şi structural sau tnestructural, compact sau necompact);
- se stabiIeşte numele fierului index şi locul unde acesta va fi depozitat pe disk;
- se stabileşte cheia de indexare;
- în cazul fişierelor index compuse se introduce în câmpul de editare Tag Name, denumirea etichetei index ce se va crea;
- se specifică tipul indexării (crescătoare sau descrescătoare, unică sau multiplă) cât şi filtrul index;
- în final se acţionează declanşatorul Ok.
Crearea unui fişier index pentru o bază de date nu presupune automat că acest fişier va fi deschis când baza de date esto deschisă în afară de fişierele compuse structuraIe care sunt deschise automat la dechiderea bazelor de date. În toate celelalte cazuri la deschiderea bazei de date esto necosar să se deschidă fişierele index (prin selectatea opţiunii Open a submoniului File şi alegând din fereastra Open ce se deschide, din lista ascunsă List Files of Type tipul fişierului care este Index. Cu ajutorul listelor ascunse Drive şi Directory se stabileşte directorul de unde se preia fişierul index.
Din lista aflată în partea stângă sus a ferestrei se alege fişierul index care se va deschide şi apoi se acţioneză declaşnatorul Open.
Se repetă operaţiile pentru toate fişierele index asociate bazei de date.
Din mai multe fişiere index deschise doar unul dă ordinea de accesare a înregistrărilor, iar dacă acesta este compus, o singură etichetă a fişierului index compus dă ordinea de sortare.
Pentru a stabili fişieruI index activ sau eticheta fişierului index compus activă se foloseşte opţiunea Setup a submeniului Database. În lista Indexes sunt afişate toate fişirele index simple şi etichetele fişierelor index compuse deschise simultan. Pentru a aduce un nou element se acţioneaza declanşatorul Add şi se alege fişieruI respectiv în fereastra deschisă. DecIanşatorul Modify se foloseşte pentru a modifica cheia de indexare a unui fişier index. Închiderea unui fişier index se face prin acţionarea decIanşatoruIui Remove după selectarea acestuia din lista Indexes a fişierului index deschis.
Acţionarea declanşatorului No Order face ca accesarea înregistrărilor bazei de date să se facă în ordinea fizică a bazei de date (fără index).
Stabilirea fişieruIui care va da ordinea de accesare se face prin selectarea declanşatorului Set Order. Fereastra se părăseşte implicit prin acţionarea declanşatorului Ok.
O dată cu închiderea bazei de date se închid automat şi toţi indexii asociaţi acesteia.
Atunci când se actualizează (modifică, adaugă sau se şterg înregistrări) într-o bază de date sunt actualizaţi şi toţi indexii deschişi în acel moment. Dar este posibil ca să mai rămână indexi ai bazei de date care nu au fost deschişi (din greşeală sau se întâmplă astfel de lucruri în cazul unor incidente - de exemplu o pană de curent) şi aceşti indexi nu sunt actualizaţi ei pastrând ordinea veche (neactualizată) a bazei de date. Pentru rezolvarea acestei probleme se poate folosi opţiunea Reindex a submeniului Databases care reface indexul punând în acord indexul cu conţinutul actual al bazel de date.
O facilitate importantă a folosirii indexării bazelor de date este accesul deosebit de rapid (practic instantaneu). Căutările în bazele de date indexate se fac pe baza cheii de indexare prin intermediul opţiunii Seek din submeniul Record. La alegerea acestei opţiuni se deschide fereastra constructorului de expresii cu ajutorul căruia se caută o anumită înregistrare. Valoarea căutata se introduce în câmpul de editare (Value to seek). Înainte de aceasta se alege un câmp din lista Fields care este câmpul de indexare al bazei de date respective şi valoarea careia se va introduce în câmpul de căutare (valoarea codului). Alegând butonul radio Skip din submeniul Record, opţiunea Goto se parcurg următoarele înregistrări cu aceeşi valoare a cheii de indexare.
Exemplu: pentru baza de date Prod să se listeze produsele în ordinea crescătoare a codurilor produselor şi în ordinea crescătoare a cantităţilor. Se va proceda astel:
- se deschide baza de date Prod;
- se indexează această bază de date (opţiunea New submeniul File şi se alege butonul Index din fereastra deschisă);
- se acţionează decIanşatorul implicit New pe ecran fiind deschisă fereastra de creare a fişierelor index;
- se va crea un fişier index compus, structural, selectând butonul radio Compound Index File (CDX) şi acţionând comutatorul Structural index Structure (dacă ele nu sunt deja activate);
- se specifică cheia de indexare, care în acest caz va fi formată doar din câmpuI COD, ce se selectează din lista Fields;
- se introduce în câmpul Tag Name numele primei etichete index: COD;
- se specifică tipul indexării - crescătoare - acţionându-se butonul radio Ascending şi multiplă (comutatorul Unique dezactivat) prima eticheta index fiind creată;
- se va acţiona declanşatorul Add to Index List pentru a adăuga indexul nou la lista Index Key; - vom crea cea de a doua etichetă pe care o vom numi cantitate, numele etichetei îl introducem în câmpul Tag Name;
- vom preciza cea de a doua cheie de indexare alegând câmpul CANTITATE din lista Fields, cea de a doua etichetă, fiind creată;
- acţionăm declanatorul Add to index List pentru a adauga cel de al doilea index listei Index Key; - acum se acţioneză declanşatorul Ok pentru închiderea ferestrei şi crearea fişierului index cu cele două etichete specificate;
- pentru listarea bazei de date se va specifica eticheta index activă (COD) deschizându-se fereastra Setup prin alegerea acestei opţiuni din submeniul Database;
- în fereastră se alege indexul PROD.COD din lista Indexes şi se acţioneză declanşatorul Set Order; - se închide fereastra şi se deschide fereastra Browse pentru baza de date activă;
- pentru o listare simplă se poate introduce în fereastra de comenzi instrucţiunea list iar dacă se doreşte o listare mai complexă se poate folosi generatorul de filtre;
- la fel se procedează pentru listarea bazei de date în ordinea crescătoare a cantităţii materialelor.
Cu bazele de date se mai pot executa o serie de operaţii care vor fi pe larg expuse în partea de programare FoxProW. Până atunci vă spunem că se pot efectua calcuIe statistice asupra datelor din bazele de date (medii aritmetice, însumarea câmpurilor, aflarea minimului şi a maximului, numărarea înregistrărilor, etc), se pot exporta bazele de date pentru a fi prelucrate în alte sisteme de prelucrare (EXCEL, fişiere DIF în care coloanele devin câmpuri iar rândurile înregistrari, SYLK - Symbolik Link - în care liniile devin înregistrări iar coloanele devin câmpuri, SDF, fişiere text în care înregistrările au a lungime fixa şi se termină prin sfârit de linie (CR+LF) şi o mulţime de alte formate.
De asemenea între bazele de date se pot construi relaţii în sensul că fenomenele complexe din viată nu se pot cuprinde într-o singură bază de date şi atunci sunt necesare mai multe baze de date, dar care sunt dependente unele de altele. Astfel dacă hotărâm să cream o bază de date cuprinzând copiii dintr-o gradiniţă ar fi posibil ca Ia un moment dat să ne intereseze şi părinţii lor. Astfel pentru fiecare copil vom crea întro altă bază de date câte două înregistrări pentru fiecare din cei doi părinţi. Va trebui să cream o metodă de accesare rapidă a înregistrărilor părinţilor pentru fiecare înregistrare din baza de date a copiilor din grădinţă.
O reaţie între doua baze de date presupune construirea a cel puţin două baze de date din care una să constitue în bază de date “parinte” iar cealaltă în baza de date “copil”, în cazul nostru baza de date “parinte” este baza de date privitoare la copiii din grădinţă (pentru că ea este baza de date principală privind studiul nostru care se referă la copii) iar baza de data “copil” este baza de date privitoare Ia părinţi (pentru că ei ne interesează în secundar, şi pentru că de Ia copii plecăm pentru a afla date despre părinţii lor). De asemenea bazele de date trebuie sa aibe un câmp comun un câmp pe baza căruia se va construi reIaţia şi acest câmp comun poate sa fie de exemplu numele de familie (care va fi acelaşi pentru copil şi parinţi) şi în plus baza de date “copil” trebuie să fie indexată după campul comun. În acest fel relaţia este constituită şi în momentul în care se accesează o înregistrare din baza de date “părinte” avem acces la înregistrările corespunzătoare din baza de date “copil” şi putem citi şi vizualiza toate datele cospunzătoare.
Se pot construi relaţii de mai multe tipuri:
1. - reiaţii 1 – 1 sunt relaţii în care fiecărei înregistrari “părinte” îi corespunde o singură înregistrare copil. Exemplu: o relaţie între o bază de date a profesorilor dintr-o şcoală şi o bază de date a domiciliului lor este în general biunivocă şi deci poate avea
acest tip;
2. - relaţii tip unu - mai multe - este o relaţie în care fiecare înregistrare din baza de date părinte este pusă în reIaţie cu mai mute înregistrări din baza de date copil. Exemplu: Se construieşte o bază de date pentru facturile emise şi o alta baza de date pentru incasarea acestor facturi. Dar încasările pot fi şi parţiale deci pot exista mai multe incasări Ia o factură emisă.
3. - relaţii tip mai multe - mai multe - este o relaţie amintită în exemplul nostru (copil-părinţi) când pot fi mai mulţi copii în gradiniţa (fraţi) care să aibă aceeaşi părinţi care pot fi Ia rânduI lor doi sau unul singur.
Relaţiile se pot construi cu ajutorul ferestrei View din submeniul Window în felul următor:
  1. se deschid bazele de date fiecare în altă zonă de lucru;
- se selectează baza de date părinte (deplasarea cursorului în lista Work Areas pe zona de lucru în care este deschis tabelul ales ca părinte şi se acţionează tasta spaţiu;
- se acţionează declanşatorul Relations în lista din partea dreaptă aparând tabelul părinte de Ia care pleacă o sageată spre viitorul tabel copil;
- se selectează tabelul copil în lista Work Areas;
- se deschide constructorul de expresii pentru specificarea cheii relaţiei după introducerea căreia se acţionează declanşatorul Ok;
-
se crează în mod analog restul relaţiilor (dacă este cazul).
Pentru a crea o relaţie de tipul una la mai multe se crează aşa cum s-a arătat mai sus relaţia (una Ia una) şi ea se transformă într-una tip una Ia mai multe acţionând decIanşatorul 1-To-Many după selectarea tabelului părinte din lista Work Areas când este deschisă fereastra 1-To-Many ce conţine urmatoărele elemente:
Child Aliases listă continând bazele de date cu care se află în relaţie baza de date părinte selectată;
Selected Aliases listă ce conţne bazele de date selectate care identifică relaţiile ce vor fi transformate în “una la mai multe”; se va aplica această transformare pentru toate eelaţiile dintre tabelul părinte curent şi tabelele copil selectate;
Move - trece baza de date din Child Aliases în Selected Aliases;
All - acelaşi efect dar pentru toate bazele de date din lista Child Aliases;
Remove - acţiune opusă lui Move;
Remove All - acţiune opusă lui All;
Ok - termină lucrul realizând transformarea;
Cancel - renunţă Ia transformare.

Un comentariu:

  1. Play Slots & Casino Game at MapYRO - Earn Real Money!
    Win real money at Slots & Casino 영천 출장안마 Game. The BEST 인천광역 출장샵 way to 서울특별 출장마사지 start 의정부 출장안마 playing online slots and casino games is to get an exclusive bonus. 서귀포 출장안마

    RăspundețiȘtergere