duminică, 30 iunie 2013

FoxProW pentru incepatori Cap. 8, 9..

Cap. 8 APLICAŢII BAZE DE DATE

           În continuare vom explica câteva programe menite să fixeze cunoştinţele căpătate prin studiul volumului 1 al FoxProW-ului.
Vă propunem spre studiu (şi creare) următorul program (care se crează prin comanda: MODI COMM prg1 în fereastra de comenzi).

8.1 Crearea şi deschiderea unei baze
 În acest program se poate studia crearea bazeior de date (comanda CREATE, comenzile USE, SELECT şi comenzile APPEND, APPEND FROM, REPLACE, INSERT).
CLEA && 1
           CLOSE DATA && 2
           USE ANGAJATI && CREATE ANGAJATI && 3
           ? DBF() && 4
           ? SELECT() && 5
           SELECT 0 && 6
           USE ANGAJATI && 7
           •          EROARE && 8
           USE ANGAJATI AGAIN && 9
           USE ANGAJAT1 && 10
           ?DBF() && 11
           ?SELECT() && 12
           APPEND && 13
           INSERŢ && 14
           APPE BLANK && 15
           INSERT BEFORE . && 16
           *S-AU ADAUGAT PATRU INREGISTRARI!
           COUNT && 17
           SELE ANGAJATI && 18
           USE && 19
           SELE ANGAJAT1 && 20
           APPE FROM ANGAJATI && 21
             * INAINDE DE CREAREA BAZEI DE DATE SE CREAZA STRUCTURA; (REF.DBF)
             * SE ADAUGA DOUA INREGISTRARI (DIN BAZA DE DATE; ANGAJATI)
             SELE 1 && 22
             USE ANGAJATI && 23
       REPL NUME WITH ´POPESCU´, PRENUME WITH ´ION´, ADRESA WUTH ´STR.           JIMBOLIEI 143´ && 24
           CLOSE DATA && 25
           *CREAREA BAZEI DE DATE PLECAND DE LA O LISTA;
           USE REF && 26
           APPE FROM TTT.TXT TYPE SDF && 27
           DELE FOR NRC=0 && 28
           PACK && 29
           RETU && 30

      Acest program este menit să arate modul de funcţionare ai unor comenzi cum urmaează:
       1. comanda şterge ecranul sau fereastra activă (în cazul nostru şterge ecranul.  Comanda are forma completă CLEAR dar am amintit că se poate utiliza prescurtarea comenzilor la 4 caractere şi se pot utiliza atât literele mari cât şi cele mici).
           2. comanda realizează închiderea unor baze de date eventual rămase deschise. Deşi în mod normal toate bazele de date sunt închise (deoarece abia a fost lansat FoxPro-ul) aceasta este o măsură de siguranţă pentru a nu avea deschise alle baze de date decât pe cele pe care le doreşte utilizatorul).
       3. Comanda USE este comanda de deschidere a bazei de date. Pentru a putea deschide o bază de date ea trebuie mai întâi creată de exemplu cu comanda CREATE ANGAJATI se crează baza de date angaiati pe care o vom utiliza în continuare, Baza de date va fi creată cu următoarea structură:
           MARCA         N 3
           NUME           C 20
           PRENUME    C 15
           ADRESA       M
           În acestă bază de date se va crea numai structura (la întrebarea:
Input data record now ? Se va răspunde D şi recomandăm să fie adăugate două înregistrări).
         Dacă baza de date nu este creată în momentul în care este lansată acestă comandă (sau programu în care ea este prezentă) va fi semnalizată o eroare întrucât nu există baza de date care se doreşte a fi deschisă de către comandă. De aceea baza de date va fi creată înainde de lansarea programului, sau programul va fi modificat şi se va introduce în locul comenzii USE ANGAJATI comanda CREATE ANGAJATI).
         4. Comanda afişează numele bazei de date deschise în zona curent. Această bază de date este afişată cu tot cu directorul curent. Se afişează:
C:\CURS\C1\ANGAJATI.DBF (de exemplu)
          Este afişată zona deschisă curent. Se afişează
1
6. Este selectată prima zonă liberă (mai mare decât zona curentă). .
7. Comanda deschide baza de date ANGAJATI în această zonă de de lucru. Dar cum această bază de date a mai fost deschisă în zona 1 se va semnala eroare. Pentru a scăpa de eroare vom tasta "I" sau vom selecta "Ignore" şi programul va ignora eroarea şi se va încerca execuţia comenzii următoare (8).
   9. Acum deoarece deschiderea se face cu opţiunea AGAIN nu se mai semnalează eroare şi baza de date va fi deschisă şi în această zonă.
   10. Acum se deschide o altă bază de date în acestă zonă de lucru. Ea va rebui să fie în prealabil creată cu comanda CREATE ANGAJAT1 sau cu comenzile
       USE ANGAJATI şi COPY STRU TO ANGAJAT1 deoarece ele trebuie să aibă aceaşi structură (pentru necesitătile acestui program).
   11. Comanda va vizualiza baza de date activă în acest moment adică:   C:\CURS\C1\ANGAJAT1,DBF
Comanda vizualizează zona actlvă Se afişează:
2
13. Comanda adaugă date în baza de date. Cu această comandă se pot adăuga un număr nefimitat de date în bazele de date. Noi recomandăm să fie adăugată o singură înregistrare deoarece aceasîă metodă nu este cea mai indicată (vom studia metode mai avantajoase) deoarece nu se poate executa un control asupra datelor introduse (comanda nu permite validarea datelor).
       14. Este o altă comandă de introducere a datelor în baza de date dar cu aceleaşi inconveniente ca şi cele le comenzii APPEND. Noi vă recomandăm introducerea unei înregistrări, iar introducerea unui volum mare de date se va face prin alte metode de introducere.
         15. Comanda inserează q singură înregistrare şi aceasta este vidă. Această comandă poate fi utilizată în programe de introducere date în care datete (vide iniţial) sunt înlocuite prin date validate şi în care corelaţiile între date sunt verificate (în caz contrar nu se face adăugarea datelor respective).
     16. Comanda inserează înregistrări înaintea înregistrării curente. Recomandăm inserarea unei singure înregistrări.
       17. Comanda numără înregistrările din baza de date curentă. Este afişat:
        4 records
        18. Este sefectată baza de date ANGAJATI (zona 1)
        19 Este incisă baya de date ANGAJATI 
         20. Este selectată zona 2 (cu baza de date ANGAJAT1)
21. Prin această comandă sunt adăugate înregistrărite din baza de date (2 înregistrări) la baza de date ANGAJAT1. Acest lucru se întâmplă deoarece bazele de date au aceeaşi structură. în caz contrar sunt adăugate numai câmpurile comune, restul înregistrării rămânând vidă. Se va afişa mesajul:
          2 records added
          22. Este selectată zona 1
          23. Se deschide baza de date ANGAJATI
24. Se face o înlocuire pentru prima înregistrare (deoarece la deschiderea unei baze de date pe acestă înregistrare este pozitionat contorul de înregistrări) a unor câmpuri din înregistrare. Sistemul va afişa următorul mesaj:
1 remplacement
          25. Se închid bazele de date.
         26. Pentru a putea studia comanda APPE FROM va trebui să creăm o bază de date cu o anume structură, Dorim să creăm o bază de date plecând de ia o listă (un fişier cu extensia TXT care conţine o listă rezultată anterior dintr-o bază de date pe care am pierdut-o.. Putem reface această bază de date altfe! decât prin adăugarea fiecărei înregistrări? Vom demonstra că acest lucru este posibil.      
             

      Observăm că lista este ordonată, câmpurile sunt aşezate unul sub celălalt şi (caracterele au aceeaşi lungime – conditie esentială) câmpurile respective au o lungime egală.
        Vom crea o bază de date pe care o vom numi REF (de la refacere fişier) care va avea următoarea structurâ:
                   NRC            N  4      0
                   NRDOC       N  8      0
                   F                 C  1
                   DATA          D   8
                   COD            N 10    0
                   DEN            C  41
                   UM              C   3
                   PRET          N  13    3
                   CANT          N  14    3
                   VAL             N  15   2

           Această structură rezultă din observarea câmpurilor şi numărarea caracterelor din listă pe care le conţine fiecare câmp. Pe această structură va fi refăcută baza de date care ulterior poate fi modificată. Câmpul F este un câmp prezent în listă dar care nu ne interesează. Dacă acest câmp ar fi fost la sfârşitul listei am fi putut să nu îl mai introducem în structura bazei de date.
             26. Apoi vom deschide baza de date (USE REF)
          27. Este comanda prin care sunt transformate înregistrările fişierului text (SDF) în înregistrări ale bazei de date. Se afişează:
    52 records added
            Dacă fişierul este de un alt tip şi nu text se pot utiliza şi alte opţiuni referitoare la tipul fişierului.
          28. Dar o serie de înregistrări din acestă bază de date nu ne interesează deoraece sunt totaluri ale unor înregistrări sau texte (titlul listei, ele putând fi vizualizate cu comanda BRQWSE). De aceea vom şterge aceste înregistrări (vom găsi un câmp valoarea 0 sau spaţiu pentru aceste înregistrări). Se afişează mesajul:
            22 records deleted
            29. Aceste înregistrări vor fi sterse definitiv când se va afişa:
            30 records copied
             şi în acest fel am refăcut structura iniţială a bazei de date.
       30. Programul se încheie prin acestă comandă care predă controlul ferestrei de comenzi. După tastarerea programului el se lansează prin comanda DO PRG1.
      Programul prezentat poate fi modificat (de exemplu se pot introduce comenzile SUSPEND - pentru a observa anumite mesaje sau BROWSE pentru a putea vedea în diferite puncte cum arată bazele de date).

8.2 Modificarea structurii unei baze

         Vă propunem următoru! program care va fi introdus în acelaşi mod cu cel arătat anterior (programul a fost numit PRG2).
             CLOSE DATA && 1
             USE REF && 2
             * SE MODIFICA STRUCTURA BAZEi DE DATE REF.DBF && 3
            MODI STRU && 4
             * SE STERGE CIMPUL F ŞI CIMPUL VALOARE && 5
             COPY STRU TO REF1 && 6
             COPY STRU TO REF2 EXTENDED && 7
             EDIT && 8
             CHANGE && 9
             USE REF2 && 10
             CREATE REF3 FROM REF2 && 11
             INSE && 12
             SELE 2 && 13
             USE REF3 AGAIN && 14
             SELE 3 && 15
             USE REF AGAIN && 16
             inde on cod to ic && 17
             UPDATE ON cod FROM ref3 REPLACE nrdoc WITH 17;
             random , && 18
             close data && 19
             retu && 20
            Acest program poate fi lansat în execuţie imediat după încărcarea şa în fereastra de comandă (definirea sa).
            Linia 1 este comanda de închidere a bazelor de date ca măsură de prevedere.
        2. Se deschide baza de date pe care am creat-o în programul trecut în vederea schimbării structurii sale. ^
          3. Modificarea structurii va avea în vedere ştergerea câmpurilor inutile (F este un astfel de câmp şi VAL valoarea putând fi calculată prin înmulţirea cantităţii cu preţul – în bazele de date nu sunt păstrate câmpuri în plus deoarece ele folosesc memorie utilă altor scopuri şi pot fi redimensionate celelalte câmpuri, poate fl adăugat un câmp pentru exercitiu etc.)
           4. Este comanda care crează fereastra de modificare interactivă a bazei de date. La sfârşitul modificării (se tastează de exemplu CTRL/W – sistemul va tipări un mesaj prin care suntem întrebaţi dacă structura dorim să rămână definitivă. Evident vom răspunde "Y"),
         5. Este o linie comentariu. Nu se prelucrează de către compilator şi nu are vre-un efect. Lămureşte doar programatorul asupra intenţiilor sale.
         6. Se copiază structura bazei de date active (REF) în structură creându-se o nouă bază de date cu aceeaşi structură ca cea originală. Baza de date creată (REF1) este vidă.
 7. Se copiază baza de date activă (REF) într-o nouă bază de date (REF2) cu structură fixă şi anume:
 FIELD_NAME iar continutul bazei de date este cea a FIELD_TYPE structurii bazei de date REF din care a fost FIELD_LEN copiată. Această structură este dată de clauza FIELD_DEC EXTENDED.
 8. Comanda edit permite modificarea înregistrărilor continute în baza de date activă. 
 9. Comanda CHANGE de asemenea permite modificarea câmpurilor prezente în înregistrare,
10. Se deschide baza de date REF2 (vidă) şi se închide baza de date REF (implicit)..
11. Se crează baza de date REF3 din baza de date REF2 (cu structura acesteia).
12. Se inserează un număr de înregistrări (cel puţin una - dar dacă se apasă asta ESCAPE atunci nu se crează nici o înregistrare)..
13. Se selectează zona 2.
14. în zona 2 se deschide baza de date REF3 (din nou).
15. se selectează zona3
16. Se selectează din nou baza de date REF3.
17. Se indexează această bază de date după câmpul cod (în vederea testării funcţionării comenzii UPDATE). Se afişează mesajul:
30 records indexed (dacă SET TALK este ON)
18. Se modifică în baza de date REF prima înregistrare din cele care au codul egal cu cel (sau cu cele dacă sunt mai muite) din baza de date activă (REF3 - în care prin inserare s-a adăugat o înregistrare cu codul egal cu al uneia din baze de date REF pentru a se face modificări în acestă bază de date). Dacă există opţiunea RANDOM atunci nu este obligatoriu să fie indexată (sortată) baza de date REF. Se afişează mesajul:
2 records updated
19. Se închid bazele de date.
20. Se opreşte programul predându-se controlul sistemului (în cazul nostru ferestrei de comandă).
         Programul poate fi completat pentru studiul unor opţiuni cu opţiunile respective şi poate fi oprit cu comanda SUSPEND pentru studiul acţiunii sale. De asemenea programul poate fi oprit prin acţionarea tastei ESC (definitiv) şi poate fi reluată rularea programului cu comanda RESUME (după acţionarea comenzii SUSPEND).

8.3 Poziţionarea în baze, ştergerea articolelor


                    Se va studia următorul program (PRG3):

close data

&& 1
use ref

&& 2
go bottom

&& 3
brow

&& 4
Go top

&& 5
brow

&& 6
skip

&& 7
Brow

&& 8
go17

&& 9
Brow

&& 10
skip -3

&& 11
Brow

&& 12
locate for cod=10000082

&& 13
Continue

&& 14
Brow
                   && 15
Cont

&& 16
Cont

&& 17
delete for recno()>20
                    && 18
Brow

&& 19
recall all

&& 20
Brow

&& 21
dele for necno()>29

&& 22
Pack

&& 23
Brow

&& 24
Zap

&& 25
Brow

&& 26
Clea

&& 27
Retu

&& 28
            în prima linie a programului se inchid bazele de date.
            2. Se deschide baza de date REF. La deschiderea unei baze de date de înregistrare este poziţionat pe prima înregistrare.
            3. Se face o trimitere la ultima înregistrare, lucru care poate fi văzut P
comanda următoare (4) urmat de ESC pt. continuare.
            5. Se retrimite pointerul de înregistrare pe prima înregistrare.
       6. Se vizualizează baza de date pentru a se vedea poziţionarea indicatorului de înregistrare
            7. Comandă care face indicatorul de înregistrare să avanseze cu o înregistrare (lucru care poate fi văzut datorită comenzii din linia 8).
       9 -10. Se face o trimitere la înregistrarea a 17-cea în ordinea în care se află înregistrăle.
            11 -12. Se face o trimitere spre începutul bazei de date cu trei înegistrări în faţă.
         13. Se execută o căutare a înregistrărilor care au codul egal cu 10000082. În momentul găsirii acestei înregistrări, pointerul de înregistrare se poziţionează pe această înregistrare. Pentru baze de date mari, această operaţie este de durată deoarece căutarea este secvenţială.
          14. Se execută în continuare căutarea unei înregistrari în aceleaşi condiţii.
          15. Se vizualizează baza de date.
          16 -17. Se face căutarea în continuare.
         18. Se marchează în vederea ştergerii toate înregisfrările cu număr de ordine mai mare de 20.
         19. Se vizualizează baza de date unde se vede marcarea înregistrărilor.
         20. Se refac înregistrările marcate pentru ştergere. (se sterge marcajul de ştergere).
         21. Se vizualizează baza de date.
         22. Se sterg din nou înregistrările dar numai cele cu număr de ordine mai mare de 29.
         23. Se şterg definitiv înregistrările care sunt marcate pentru ştergere (indiferent când a fost făcută marcarea).
       24. Se vizualizează baza de date în noua formă. (pointeru! de înregistrare după comanda pack se găseşte pe ultima înregistrare).
         25. Se execută o stergere a tuturor înregistrărilor bazei de date.
         26. Se vizualizează baza de date (este vidă).
         27 - 28. Se curătă ecranul şi se opreşte execuţia programului.

8.4 Importul şi Exportul bazelor de date

        Programul cu ajutorul căruia vom studia aceste operaţii (în forma cea mai simplă este PRG4:
         Close data && 1
         Use ref && 2
         Export to fisexp type xls && 3
         * 29 records copied && 4
         Use ref2 && 5
         Zap && 6
         Import from fisexp type xls && 7
         * 30 records imported && 8
         Brow && 9
         Zap && 10
         Use ref && 11
         Copy to fisexp type xls && 12
         * 29 records copied && 13
         retu && 14

        Prin import se înţelege aducerea bazelor de date cu care se lucrează în alte SGBD (şi nu numai) aducerea datelor deci din alte sisteme în FOXPRO. O serie de SGBD (de exemplu PARADOX-ul) permite exportul deci trimiterea datelor aşa cum sunt ele cerute de alte sisteme de prelucrare (FOX-ul de exemplu) acest lucru făcând posibilă comunicarea între sisteme de prelucrare.
       În programul nostru (PRG4) în linia 1 se închid bazeie de date iar în linia 2 se deschide baza de date REF.
        3. Se face un export într-un fişier numit FISEXP în care datele sunt aşa le cere EXCEL-ul. Acest fişier poate fi prelucrat ulterior în EXCEL,
        4. Sistemul afişează acest mesaj pe ecran (set talk on)
        5. Se deschide baza de date REF2
        6. Se sterg toate datele din baza de date (se goleşte).
        7. Se realizează importul din fişierul FISEXP de tipul EXCEL.
       8. Se afişază mesajul: 30 records imported. Atentie; prima înregistrare va trebui ştearsă deoarece ea conţine denumirile câmpurilor specifice EXCEL-ului sau vor trebui modificate în cazul că nu ne satisfac.
        9. Se vizualizează baza de date
       10. Se goleşte baza de date.
       11.Se deschide baza de date REF (închizându-se baza ce fusese deschisă).
     12. Comanda realizează acelaşi lucru cu comanda IMPORT. Este preluată dintr-o versiune anterioară FOX.
       13. Este mesajul afişat în urma copierii corecte a înregistrărilor
       14. Programul este oprit şi sistemul preia controlul (în cazul nostru fiind lansat programu! din fereastra de comandă prin comanda DO PRG4, controlul este predat acestei ferestre).

8.5 Ordonarea bazelor de date

       Ordonarea bazelor de date se realizează prin sortarea şi prin indexarea bazelor de date. Noi recomandăm utilizarea indexării deoarece permite acces rapid la înregistrări cu comenzi specifice (seek).
         Vă propunem spre studiu următoru! program (PRG5):
         Close data && 1
         clear && 2
         use ref && 3
         sort to sortref on cod && 4
         - 29 RECORDS SORTED && 5
        Use sortref && 6
        Brow && 7
        Use ref && 8
        Inde on cod to indref && 9
        * 29 records indexed && 10
        Brow && 11
        Seek 60653827 && 12
        Brow && 13
        Tt=10000082 && 14
        * 1000082 && 15
        Seek tt && 16
        Brow && 17
        Find 60653827 && 18
        Brow && 19
        ?found() && 20
        * .T. && 21
        ? eof() && 22
        * .F. && 23
        Set near on && 24
        Seek 20000000 && 25
        * no find && 26
        ? found() && 27
        * .F. && 28
        ? eof () && 29
        * .F. && 30
        Brow && 31
        Set near off && 32
        Seek 20000000 && 33
        * no find && 34
        ? found() && 35
        * .F. && 36
        ? eof() && 37
        * .T. && 38
        BROW && 39
        Use REF1 INDE indref && 40
        Brow && 41
        * index does not match database file. Recreate index. && 42
        Seek 2000 && 43
         * databases is not ordered [!] && 44
         * databases is not ordered [!] && 45
         Rein && 46
         * reindexing index file C:\CURS\INDEREF.idx && 47
         * 0 keys generated && 48
         seek 2000 && 49
         BROW && 50
         index on cod tag cod && 51
         * 0 keys generated && 52
         copy tag cod to indcod && 53
         * 0 keys generated && 54
         dele tag cod && 55
         dir *.cdx && 56
         * 0 bytes in 0 files && 57
         retu && 58

       1,2,3 - Se fac operaţiunile obişnuite la început. Se închid bazele de date, se curăţă ecranul şi se deschide baza de date (REF.DBF)
          4 - Se sortează baza de date. Se crează un fişier sortat (SORTREF.DBF).
          5 - Se afişază mesajul de sortare a înregistrărilor
       6,7 - Se deschide baza de date SORTREF şi se vizualizează văzând înregistrările sortate după cod. Dacă s-ar fi dorit sortarea după un alt criteriu s-ar fi creat un alt fişier sortat după criteriul respectiv. Se pot încerca o serie de comenzi LOCATE (funcţionează) SEEK (nu funcţionează) şi FIND pentru a vedea ce efect au. Cum comanda SEEK este cea mai eficientă, nu recomandăm metoda sortării.
          8 - Se deschide din nou baza de date REF
          9 - Se indexează acestă bază de date (după cheia COD).
        10,11 - Se afişează un mesaj (relativ la indexarea înregistrărilor) şi se vizualizează baza de date. Se vede că aparent arată ca şi cum înregistrările ar fi sortate (nu se vede nici o diferenţă între această bază de date şi baza de date SORTREF - ele apar ca identice). De fapt nu aceasta este ordinea înregistrărilor în baza de date, dar este utilizat fişierul index pentru a indica o ordine relativă în fişier. Acest lucru poate fi evidenţiat prin utilizarea comenzii ? RECNO() numărul de ordine al înregistrărilor va putea fi astfel văzut şi se va vedea că ordinea înregistrărilor diferă de ordinea de afişare.
      12 - Se utilizează comanda de căutare a unui cod. Comanda functionează practic instantaneu, fiind foarte rapidă deci eficientă.
          13 – Se vizualizează baza de date şi se vede poziţionarea indicatorului de înregistrare.
         14,15,16 - Se utilizează comanda de atribuire pentru a se vedea că această comandă (SEEK) functionează şi cu o variabilă de memorie. (intermediar se afişează valoarea de atribuire dar aceasta numai dacă SET TALK este ON).
        17 - Se vizualizează baza de date. Se observă poziţionarea indicatorului de înregistrare.
         18 - Se utilizează comanda FIND (la fel ca şi SEEK). Comanda FIND este preluată din versiuni mai vechi ale FOX-ului şi funcţionează în mod puţin diferit. De deşi ea functionează fără probleme, nu se recomandă utilizarea sa deoarece este mai lentă după anumiti autori.
     19, 20, 21 - Este vizualizată baza de date şi se vede poziţionarea indicatorului inregistrare. Funcţia found() va întoarce .T. ceea ce se vede într-un mesaj pe ecran.
     22, 23 - Funcţia EOF() va retuma valoarea .F. (mesaj) deoarece indicatorul de înregistrare se găseşte pe înregistrarea cu codul căutat şi nu pe sfârşitul fişierului.
          24 - Este setat NEAR pe ON
         25, 26 - Se utilizează din nou căutarea cu SEEK. Căutarea nu va reuşi (acest cod nu există în baze de date) şi se va afişa un mesaj corespunzător.
          27,28 - Funcţia FOUND () va returna .F.
     29,30,31 - Functia EOF () va returna de asemenea .F, deoarece indicatorul de înregistrare este pozitionat pe prima înregistrare cu cod mai mare decât cel căutat lucru ce poate fi văzut ia vizualizare.
          32 - Este setat acum NEAR pe OFF
        33,34 - La căutare cu SEEK codul (acelaşi) nu este găsit lucru care este afişat pe ecran (dacă SET TALK este ON).
           35,36 - Funcţia FOUND () va retuma .F.
        37,38,39 - Functia EOF () va returna .T. deoarece indicatorul de înregistrare este acum poziţionat pe sfârşitu! bazei de date lucru care se poate vedea la vizualizare.
         40,41 - Se deschide baza de date REF1 cu index şi se vizualizează (baza de este vidă. Indexul nu este creat pentru această bază de date dar este valid pentru că structura acestei baze de date este identică cu aceea a bazei de date deschisă anterior (REF).
         42 Se afişează un mesaj prin care se anunţă că indexul şi baza de date nu corespund şi se cere recrearea indexului. Cînd apare acest mesaj este un semn că s-a produs ceva ce a deranjat indexul sau că în orice caz pentru a utiliza indexul respectiv el trebuie recreat.
        43, 44, 45 – La utilizarea unei comenzi ca SEEK, FIND ele nu pot fi utilizate înainte de crearea indexului şi se afişează mesaje de eroare.
         46 - Comanda de reindexare pune ordine în înregistrări.
        47, 48 - Se afişază mesaje privind numărul înregistrărilor indexate (nici oînregistrare) şi numele bazei de date indexate.
        49, 50 – Se execută căutarea cu SEEK şi se vizualizează baza de date.
      51 – Se realizează o astfel de indexare (se crează un index complex structurat şi o intrare în acest index complex).
        52 - Este afişat un mesaj cu privire la crearea acestui index.
       53, 54 - Este transformat acest fişier compex structurat într-un fişier index simplu şi este afişat un mesaj corespunzător. Indexii compuşi structuraţi sunt mai performanţi decât indexii simpli (sunt întotdeauna compacţi, ocupă un volum mai mic şi sunt deschişi automat la deschiderea bazei de date! dar dacă nu sunteţi familiarizati cu ei şi indexii simpli sunt potriviti. În exemplele utilizate în continuare (programe tip) sunt utilizaţi cu precădere indexii simpli pentru claritatea programelor.
         55 Este sters indexul creat anterior

56, 57 - Se dă o comandă de afişare a fişierelor index structurale complexe şi se afişază că nu exisiă astfel de fişiere (ele au fost şterse).
58. Se încheie programul şi se predă comanda de execuţie în fereastra comenzi,
       Comanda RETURN nu esîe obligatorie la încheierea unui program. Dacă programul nu prevede această comandă, el se încheie după execuţia ultimei cornenzi din program. Totuşi prezenta acestei comenzi este utilă în cazul apelarii unor programe în alte progame deoarece nu permite anumite neînţelegeri posibile, aduce mai multă siguranţă, (mai mult, programatorului îi conferă siguranţă) predând comanda prpgramului de nivel superior.

8.6 Informaţii statistice

     Dintr-o bază de date pot fi extrase o serie de informatii statistice privitoare la înregistrările acestei baze, sau cu privire la mai multe baze de date dacă ele sunt puse în relaţie.
       Pentru studiul modului de obţinere a acestor informaţii propunem unrmîtorul program (PRG6):
         Close data  &&1
         Clea  &&2
         Use ref  &&3
         Sum cant, val to tt1, tt2  &&4
         * 29 records summed  &&5
         * CANT 36277319.600 VAL 222510194,20  &&6
         ? tt1,' ',tt2  &&7
         * 36277319.600 222510194,20  &&8
         Sum cant, val for cod > 30000000  &&9
         * 23 records summed  &&10
         * CANT 1250942,055 VAL 185754966,00  &&11
         Average cant  &&12
         * 29 records averaged  &&13
         * CANT 1250942,06  &&14
         Count  &&15
         * 29 records  &&16
         Calculate AVG(cant), VAR(CANT), MIN(CANT);  &&17
         MAX(CANT)  &&18
         * 29 records  &&19
         * 1250942,06 36277319,60 47672619497990,49 1465400,00 37756000,00  && 20
         CLOS DATA && 21
         RETU  &&22

         1,2,3. Se fac operaţiile obişnuite: se închid bazele de date, se şterge ecranul şi se deschide baza de date pentru care interesează datele respective.
           4,5,6. Se dă comanda pentru însumarea câmpurilor
         7, 8 – Dacă SET TALK este OFF atunci vor fi tipărite valorile însumate pe ecran şi este necesar ca aceste valori să fie introduce în nişte variabile de memorie penmtru a putea fi tipărite (sau utilizatre în program).
          9,10,11. Sunt însumate câmpurile CANT şi VAL dar numai pentru anumite înregistrări.  Se tipăresc numărul înregistrăriior însumate şi valorile însumate
       12,13,14. Este cerută valoarea mediei cantitătii. Este furnizat numărul înregistrărilor luate în calcul şi valoarea mediei.
          15, 16 – Este cerută numărarea înregistrărilor şi este furnizată acestă valoare.
       17,18,19,20. Este cerută calcularea mediei, a sumei, a varianţei, a minimului şi maximului din câmpul CANT şi sunt fumizate numărul înregistrărilor luate în calcul şi afişate datele cerute,
          21,22. Se închide baza de date şi se încheie programul,
       Se pot testa şi alte informaţii statistice (mai rar utilizate) sau pot fi testate aceste comenzi cu alte opţiuni.
         Pentru studiul relaţiilor între bazele de date, studiul structurilor de programe, meniuri şi ferestre de dialog, lucrul cu ferestre şi realizarea meniurilor ca şi pentru alte probleme legate de studiul problemelor FoxPro vă recomandăm studierea programelor tip şi anume:
         Pentru studiul meniurilor programele: MENU, MENUS, MENFACT.
        Pentru studiu! ferestrelor şi a lucrului cu ferestre, acestea sunt prezente în majoritatea programelor dar noi recomandăm programele BC şi CORBC.
       Pentru studiul relatiilor între fişiere se pot studia mai multe programe printre care amintim JURNAL.
          Aceste pr’ograme au scopuri bine determinate şi nu au fost concepute în folos didactic dar sperăm ca prin explicaţiile prezente să fie clare şi să vă ajute în lămurirea unor aspecte mai puţin clare.

8.7 Controlul culorilor şi al ecranului

         Pentru studiul culorilor şi al utilizării lor în FoxPro vă propunem programul următor (PRG7):
            close data  &&1
            clea  &&2
            nr=1  &&3
            do while nr<24  &&4
           @ nr,20 say ' TIPARESC CULOAREA' color scheme nr  &&5
            nr=nr+1  &&6
            enddo  &&7
            nr=1  &&8
            @ nr,40 say ' TIP' color w+/rb && 9 
            nr=nr+1  &&10
            @ nr,40 say 'TIP' color w/rb*  &&11
            nr=nr+1
            @ nr,40 say ' T!P' color n+/bg  &&12
            nr=nr+1
            @ nr,40 say ' TIP' color r+/bg+  &&13
            Nr=nr+1
            @ nr,40 say ' TIP' color gr+/g+  &&14
            nr=nr+1
            @ nr,40 say ' TIP' color g+/gr+  &&15
            nr=nr+1
            @ nr,40 say ' TIP' color g/r  &&16
            nr=nr+1
            @ nr,40 say ' TIP' color br+/r+  &&17
            nr=nr+1
            @ nr,40 say ' TIP' color rb+/n+  &&18
            nr=nr+1
            @ nr,40 say ' TIP' cotor rb/w  &&19
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,w/rb  &&20
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,n+/rb*  &&21
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,r+/b+  &&22
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,gr+/g+  &&23
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,gr/g  &&24
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,g+/gr+  &&25
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,g+/r+  &&26
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,bg+/w  &&27
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,bg/n+ && 28
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,rb+/w+  &&29
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w/b,rb/gr+  &&30
            nr=nr+1
            @ nr,50 get tip pict '@z 9999' defa 0 color w+/rb,r/bg,gr+/g+  &&31
            Read  &&32
            Defi wind fer from 1,60 to 3,79 color w+/rb,r+/bg,gr+/g+  &&33
            Acti wind fer  &&34
            @ 0,0 say 'TIP'  &&35
            @ 0,10 get nr pict '@Z 999999.999'  &&36
            Read  &&37
            Deac wind fer  &&38
            Retu  &&39

             1,2- închide bazele de date şi şterge ecranu!.
            3 - Este o comandă de atribuire. Este necesară pentru controlul liniei de tipărire pe ecran.
         4, 5, 6, 7 – Se lansează un ciclu de tipărire în care se tipăreşte un text cu toate schemele de culoare începând de la 1 până la 23.
            8 - Se atribuie din nou variabilei de control a liniei de tipărire valoarea 1.
           9- 19 - Sunt o serie de comenzi de tipărire cu diferite culori orezente în prima pereche de culori.
          20 - 32 - Sunt o serie de comenzi de introducere a datelor cu GET care utilizează a doua culoare din lista de perechi de culori. Setul de comenzi se încheie cu o comandă READ.
            33 - Se defineşte o fereastră atribuindui-se şi atributele de culoare.
          34 – Se activează o fereastră. Se observă că linia cu care este trasată fereastra este preluată din a treia pereche de culori a listei.
           35, 36, 37 - se observă culorile cu care se realizează comanda SAY (prima culoare a listei) şi GET (a doua culoare din lista de culori).
            38 – Se dezactivează fereastra.
            39 – Se încheie programul.

9. Realizarea de proiecte

           Vom încerca în continuare să explicăm modul în care trebuie abordată elaborarea unei lucrări, a unei aplicaţii care rezolvă o anumită problemă aceasta pentru a vă fi un ghid în acestă intreprindere de bază pentru o persoană care se numeşte programator.
           Primul lucru pe care îl avem de făcut este stabilirea temei, stabilirea problemei, a ceea ce avem de rezolvat.
          Să presupunem că ne punem problema elaborării unei lucrări care să realizeze un calcul al cheltuielilor de bloc şi repartizarea lor pe fiecare apartament. O astfel de lucrare nu este foarte complicată, dar în acelaşi timp necesită un anumit volum de muncă, volum care poate fi mult micşorat în cazul proiectării unei lucrări.
          Pentru a proiecta lucrarea, trebuie în primul rând să facem cunoştintă cu ea, să vedem cum se execută o astfel de lucrare. După cunoştinţele noastre calculul cheltuielilor de bloc se face după primirea facturilor referitoare la cheltuielile lunii anterioare. Aceste facturi se verifică de către comisia de cenzori pentru ca în facturi să nu fie strecurate cheltuieli necuvenite, după care se trece la repartizarea lor. Repartizarea pleacă de la cartea de imobil a blocului respectiv (asociatiei de locatari-proprietari) şi de la faptul că aceste cheltuieli trebuie repartizate după criterii diferite şi anume:
          - există cheltuieli ce se repartizează pe numărul de metrii pătrati ai fiecărui apartament (cheituielile relative la încălzire)
     - există cheltuieli care se repartizează pe numărul de persoane care locuiesc în respectivul apartament (de exemplu cheltuielile privind gazul metan).
       - în sfârşit există cheituiele care se împart direct pe apartament, fără a ţine cont de numărul de persoane ce locuiesc în apartament ci în mod egal (de exemplu cheltuielile privind administratorul, garanţia etc).
         Având în vedere aceste lucruri se poate trece la proiectarea bazelor de date.
         Propunem ca baze de date două şi anume:
      O bază de date va cuprinde datele din cartea de imobil cu numele persoanelor şi suprafaţa apartamentului, numărul persoanelor din apartament. Aceste elemente sunt toate necesare şi nu sunt necesare altele (sunt necesare şi suficiente). Pentru această bază de date va trebui să fie avut în vedere faptul că ea se mai schimbă (chiar dacă schimbările au un caracter mai lent).
       O a doua bază de date va trebui să fie creată pentru datele din facturi (cheltuielile lunare, care în fiecare lună sunt în valoare diferită, dar pot interveni modificări de la o lună la alta privind numărul acestor cheltuieli şi pot interveni şi modificări privind procedura de repartizare).
        Această bază de date va trebui să cuprindă numele cheltuielii, valoarea sa (suma totală) şi modul ei de repartizare (pe metrii pătraţi, persoane sau apartament).

         Cele două baze de date pe care le vom numi CHELT şi FACT vor avea următoarele câmpuri:
                       CHELT
                       ap               -N   3
                       nume           -C 30
                       mp              -N 5.2
                       pers            -N 3

                       FACT
                       Nume         - C 20
                       suma         - N 10
                       rep            - C 4

        Aceste elemente o dată stabilite, se poate trece la proiectarea generală a lucrării (schema bloc) care cuprinde schema generală cu principalele operatii de efectuat.
           Va trebui să proiectăm un lanţ de programe de actualizare a celor două fişiere - baze de date - astfel încât ele să poată fi actualizate oricând, şi să conţină datete necesare calculelor. Aceste lanţuri de programe considerăm că nu ridică probleme deoarece am mai realizat astfel de programe şi ştim să facem acest lucru (evidenta modificările necesare), în fiecare lant de programe vom avea un program de adăugare de date, un program de modificare, unul de ştergere şi un program de vizualizare şi verificare. Acest lanţ poate cuprinde patru programe, sau pot fi grupate cele patru programe într-un singur program (iar indicaţia privind adăugarea, modificarea şi ştergerea să fie primul lucru care să fie cerut de program).
       Va mai trebui să rezolvăm o problemă şi anume vom crea cifră de control pentru numărul apartamentului sau nu. Având în vedere că într-un b!oc de la noi nu sunt prea multe apartamente, credem că nu este necesară crearea unei cifre de control altfel aceasta nu ne-ar deranja prea mult nici dacă am prevedea o cifră de control pentru a nu complica lucrurile vom lucra fără cifră de control.
          Problema repartizării cheltuielilor o vom rezolva în felul următor:
       Vom totaliza cheltuielile după tipul de repartizare şi vom avea trei cheltuieli de repartizat: pe MP, pe PERS, pe AP.
     Vom face totalul metrilor pătraţi, al persoanelor şi al apartamentelor, vom împărţi cheltuielile (cele trei) la cele trei totaluri în mod corespunzător şi vom obţine trei coeficieţi.      Aceşti coeficienţi îi vom înmulţi la nivel de apartament cu mp respectivi şi vom obţine cheltuielile pe mp la nivel de apartament, cu numărul de persoane cheltuielite pe persoană şi coeficientul pe apartament reprezintă chiar cheltuielile pe apartament. Însumând cele trei tipuri de cheltuieli la nivel de apartament vor rezulta cheituielile totale pe apartament. Va trebui să fim atenţi ca lista ce o edita să cuprindă toate elementele necesare pentru ca fiecare persoană să poată vedea cum s-a făcut calculul şi să-l poată reface dacă doreşte.

                * DEFlNlNG THE MAIN MENU AND POP-UP-S *
                ***********************************************************
                Set talk off
                Clea
                Define menu mainmenu
                define pad int of mainmenu prompt 'ACTUALIZARI' at 5,32
                on pad int of mainmenu activate popup intpop
                define popup intpop from 8,28 shadow
       define bar 1 of intpop prompt '\<Actualizare f.PERS ' message; "Adaugare (A)/Modificare (M)/Stergere (S) FISIER PERSOANE ';
+'(lncheiere lucm=T)'
               define bar 2 of intpop prompt '\<Actualizare f.CHELT ' message ;
"Adaugare (A)/Modificare (M)/Stergere (S) FISIER CHELTUIELI';
+'(lncheiere lucru=T)'
               define bar 3 of intpop prompt '\<Listare SITUATIE CH' message ;
'Introducere cheltuieli si LISTAREA CHELTUIELILOR'
               define bar 4 of intpop prompt '\<Sfirsit prelucrare ' message ;
'Incheierea lucrului'
               on selection popup intpop do intmenu
               acti menu mainmenu

               Lista, aşa cum rezuită din lucrare este:
                     

                        


            * INTMENU.PRG
choice = bar()
hide menu mainmenu
hide popup intpop
flmstoc=.f.
do case
case choice = 1
do adaug
case choice = 2
do ADF
case choice = 3
do introd
case choice = 4
canc
endcase
deactivate window all
show menu mainmenu
show popupo intpop
clear
return
* EOF:INTMENU.PRG
    Set talk off &&            intr.prg                && 1
    close data
              clea
              add=0
              mod=0
ste=0
use chelt lNDE NRC
REIN
@ 2,20 to 6,60 double
          @ 4,30 say 'ACTUALIZARE FISIER PERSOANE'
          @ 7,5 to 22,75
           tip=" "
           do while tip='A' .or. tip='M' .or. tip='S'.or,tip ='' "
         @ 9,10 say 'TIP ACT' get tip pict ! message;
"A=adaugare, M=modificare, S=stergere, T=terminare' color 2
          READ
If tip='A'
nr=0
su=0
per=0
num='
@11,10 say 'NRCRT 'get nr pict '@ z999'
read
seek nr
          if .not.found()
          appe blank
          @13,10 say 'Numele ' get num pict '@ !'
          @15,10 say 'Suprafata ' get su pict '@z 9999.9'
          @17,10 say 'Nr. Pers ' get per pict '@z 9999'
          Read
          Repl nrc with nr,nume with num, sup with su,pers with per
          Add = add+1
                 Else
          @13,10 say 'EXISTA ACEASTA PERSOANA '
          Wait 'Apasati orice '
          @13,10 say ' '
          @14,10 say ' '
          endif
          endif
          if tip = 'M'
nr=0
@ 11,10 say 'INTRODUCETI NR CURENT DE MODIF' get nr PICT '@z 999'
read
seek nr
if found()
    @ 13,10 say 'NUMELE' get nume
    @ 15,10 say 'SUPRAF' get SUP
    @ 17,10 say 'NR PERS' get pers
    mod=mod+1
       else
    @ 13,10 say 'NU EXISTA ACEASTA PERSOANA'
      wait' APASATI ORICE'
         @ 13,10 say ' '
         @ 14,10 say ' '
endif
     endif
     if tip = 'S'
         nr=0
         @ 11,10 say 'INTRODUCETI NR CURENT DE STERS' get nr PICT '@z 999'
read
seek nr
          if found()
@ 13,10 say 'NUMELE '
@ 13,18 say nume
@ 15,10 say 'SUPRAF'
@ 15,18 say sup
@ 17,10 say 'NRPERS'
@17,18 say pers
MES='N'
@ 19,10 say 'DORITI ACEASTA STERGERE ? ';
(Da="D")'
get mes
read
          @ 19,10 SAY'
if mes ='D'
ste=ste+1
DELE
Endif
Else
@ 13,10 say 'NU EXISTA ACEASTA PERSOANA'

           Wait ' APASATI ORICE'
          @ 13,10 say ' '
          @ 14,10 say ' '
          Endif
          Endif
          Clea
     @ 2,20 to 6,60 double
     @ 4,30 say 'ACTUALIZARE FISIER PERSOANE '
     @ 7,5 to 22,75
     @ 10,20 say 'S-AU ADAUGAT '
     @ 10,35 say add pict '@z 99999'
     @ 10,42 say 'INREGISTRARI '
     @ 12,20 say 'S-AU MODIFICAT '
     @ 12,35 say mod pict '@z 99999'
     @ 12,42 say 'INREGISTRARI '
     @ 14,20 say 'S-AU STERS '
     @ 14,35 say ste pict '@z 99999'
     @ 14,42 say 'INREGISTRARI '
       Pack
     Wait ' Apasati o tasta pentru vizualizarea intregului fisier '
     Clea
     Define wind wcons from 1,21 to 29,59 title 'FISIERUL LOCATARILOR ';
     Color scheme 10
     Browse fields nrc:h= 'NRA', nume:h='NUMELE SI PENUMELE',;
     Sup:h='SUPRAF',PERS:h='PERS' noedit nodelete nomenu
     Clos databases
     Clear
     Retu

* ADF.prg                                                     && 2
Set talk off
Close data
Clea
Add = 0
Mod = 0
Ste = 0
Use fact inde den
@ 2,20 to 6,60 double
@ 4,29 say 'ACTUALIZARE FISIER CHELTUIELI '
@ 7,5 to 22,75
PT= 
Do while PT=A.or. PT=M.or. PT=S.or PT= 
@ 9,10 say 'TIP ACT' get PT pict '!' message 'A=adaugare, M=modificare;
+'S=stergere, ;
T=terminare' color 2
Read
Dn= 
If tip=A
@ 11,10 say 'DENUMIRE CHELTUIALA' get DN pict '@!'
read
seek DN
if .not. found()
appe blank
   @ 13,10 say 'TIP CALCUL (MP/PERS/AP)' get TP PICT '@!' VALID ;
    TP='MP .OR.TP='AP' .OR. TP='PERS' .OR. TP=' '
read
repl DEN with DN.TIP with TP
add=add+1
else
@ 13,10 say 'EXISTA ACEASTA CHELTUIALA'
wait' APASATI ORICE'
@ 13,10 say ' '
@ 14,10 say ' '
endif
endif
if PT= 'M'
@ 11,10 say 'DENUMIRE CHELTUIA DE MODIF' GET DN
READ
seek DN
if found()
@ 13,10 say 'DENUMIRE' get DEN
@ 15,10 say 'TiP ' get TIP
READ
mod=mod+1
else
@ 13,10 say 'NU EXISTA ACEASTA CHELTUIALA'
wait' APASATI ORICE'
@ 13,10 say ' '
@ 14,10 say ' '
ENDIF
ENDIF
If TIP='S'
          Nr=0
@ 11,10 say 'INTRODUCETI NR CURENT DE STERS' get nr PICT ; @z 999'
read
seek nr
          endif
         enddo
         clea
       @ 2,20 to 6,60 double
       @ 4,30 say 'ACTUALIZARE FISIER CHELTUIELI'
       @ 7,5 to 22,75
       @ 10,20 say 'S-AU ADAUGAT '
       @ 10,35 say add pict '@z 99999'
       @ 10,42 say 'INREGISTRARI'
       @ 12,20 say 'S-AU MODIFICAT'
       @ 12,35 say mod pict '@z 99999'
       @ 12,42 say ' INREGISTRARI'
       @ 14,20 say 'S-AU STERS '
       @ 14,35 say ste pict '@z 99999'
       @ 14,45 say 'INREGISTRARI'
         PACK
       Wait 'Apasati o tasta pentru vizualizarea intreguiui fisier'
       Clea
       Define window wcons from 1,21 to 24,59 'FISIER CU LOCATARI' color scheme 10
    Browse fields DEN:h=' DENUMIRE ',TIP:h= 'TIP',valoare:h='valoare' noedit nodelete nomenu window wcons
        Close databases
        Clear
        Return

* INTROD.prg                                               && 3
CLOSE ALL
Set talk off
Set safety off
Clea
@ 2,10 to 6,70 double
@ 3,10 say 'Procedura pentru introducerea cheltuielilor genera-'
@ 4,12 say 'le din facturi si listarea situatiei privind cheltuielile'
@ 5,12 say 'pe fiecare locatar. '
Lun= ' '
@ 8,30 SAY 'LUNA DE CALCUL' GET LUN
     READ
      VAL=0
      SELE1
      USE fact ALIAS FACT
      @ 10,20 TO 12,60 DOUBLE
       GO TOP
      DO WHILE.NOT.EOF()
      @ 11,25 SAY DEN
      @ 11,45 GET VAL PICT '@Z 999999999'
      READ
      REPL VALOARE WITH VAL
      VAL=0
       SKIP
      ENDDO
      CLEA
       GO TOP
      DEFI WIND BR FROM 2,22 TO 20,58
      BROW TITLE 'FISIER DE CHELTUIELI CTRL/W GATA' WINDOW BR;
      NODELETE NOMENU
      GO TOP
      SUM VALOARE TO TMP FOR TIP='MP'  &&4
      SUM VALOARE TO TPERS FOR TIP='PERS'
      SUM VALOARE TO TAP FOR TIP = 'AP'
      SELE 2
      USE chelt ALIAS CHELT
SUM SUP TO CH &&5
          SUM PERS TO PER
          COUNT TO NP
      COEF1=TPERS/PER  &&6
      COEF2=TMP/CH
      COEF3=TAP/np
      GO TOP
       SELE FACT
      SET F!LT TO TIP='PERS'  &&7
      GO TOP
       CPERS1=VALOARE  &&8
      denp1=den
      CP=1
IF .NOT.EOF()
SKIP
Cpers2=valoare
Denp2=den
Cp=2
Endif
If .not.eof()
SKIP
CPERS3=VALOARE
denp3=den
CP=3
ENDIF
IF=.NOT.EOF()
      SKIP
      CPERS4=VALOARE
      denp4=den
CP=4
      endif
       IF .NOT.EOF()
      SKIP
CPERS5=VALOARE
       Denp5=den
CP=5
       ENDIF
       Cp=cp-1
        Set filt to tip='AP'
      Go top
        cap1=valoare
        dena1=den
        ca=1          && 9
      if.not.eof() 
        SKIP
     Cap2=valoare
        Dena2=den
Ca=2
ENDIF
If.not.eof()
Skip
Cap3=valoare
Dena3=den
Ca=3
ENDIF
If.not.eof()
SKIP
CAP4 =VALOARE
dena4=den
CA=4
       ENDIF
       IF .NOT.EOF()
SKIP
CAP5 =VALOARE
dena5=den
CA=5
       ENDIF
       CA=CA-1
       SET FILT TO TIP='MP'
       GO TOP
       CMP1 =VALOARE
       denm1=den  &&10
       CM=1
       IF .NOT.EOF()
SKIP
CMP2 =VALOARE
denm2=den
CM=2
      ENDIF
      IF .NOT.EOF()
SKiP
CMP3 =VALOARE
denm3=den
CM=3
      ENDIF
       IF .NOT.EOF()
SKIP
CMP4 =VALOARE
denm4=den
CM=4
ENDIF
      IF .NOT.EOF()
      SKIP
      CMP5 =VALOARE
       denm5=den
     CM=5
     ENDIF
CM=CM+1
SELE2
Set filt to
NR=1
        @ SAY 'NUMAR EXEMPLARE LISTARE' GET NR
READ
n=1
DO WHILE N<=NR
ANTET1='STR.CAREI NR.14 SC.A'
SELE 2
inde on nrc to nrc
??? chr(27)+chr(77)  &&11
REPO FORM CHELT TO PRINT NOEJE                            
      N=N+1
      ENDDO
      set print to chelt.txt
      ???chr(27)+chr(77)
      repo form chelt to print noeje &&12
      set print to
      RETU
Explicatiile referitoare la aceste programe sunt următoarele:
      1. Este programul de introducere a locatarilor, pe număr de apartament şi suprafaţa apartamentului, cu numărul respectiv de persoane. Anterior au fost prezentate programul MENUS de creare a meniului general al aplicaţiei şi programul de selectare a procedurilor care au fost reduse la doar trei prin gruparea într-un singur program a mai multor proceduri. În acest program se realizează atât introducerea unor noi date, cât şi modifcarea lor şi ştergerea lor dar şi vizualizarea prin introducerea mai întâi a unui caracter (tip) cu care se selectează tipul operaţiei. Vizualizarea se face înainte de sfârşitul programului.
     2. Programul de introducere,modificare, ştegere şi vizualizare a datelor privind felul cheltuielilor ce trebuie plătite (calculate). Credem că aceste două programe nu ridică probleme deosebite deoarece astfel de programe s-au mai realizat şi au fost discutate anterior.
        3. Programul de introducere a valorifor din facturi şi de repartizare a cheltruielilor.
       4. Sunt totalizate în aceste comenzi totalul valorifor pentru sumele care se repartizează pe număr persoane, metrii pătrati şi apartament (TMP, TPERS, TAP).
       5.   Se însumează suprafaţa pentru repartizat, numărul total de personae şi numărul de apartamente (CH, PER, NP).
       6.   Se calculează coeficienţii necesari pentru repartizare care sunt total chelt/persoană (TPERS/PER), cheltuieli pe metru pătrat/metrii pătraţi (TMP/CH) şi pe apartament/ apartamente (TAP/NP),
       7. Se filtrează după tipul cheltuielilor şi se stabilesc numărul cheltuielilor pe fiecare tip prin mai multe testări.
         8. Se stabileşte numărul de cheituieli ce se repartizează pe persoană.
         9. Se stabilesc numărul de cheltuieli ce se repatrizează pe apartament.
        10. Se stabilesc numărul de cheltuieli existent ce se repartizează pe metru pătrat.
       11. Se transmite imprimantei un cod care face ca tipărirea să se execute în format "elite" A4 (dacă lista nu este făcută în WINDOWS),
        12. Se execută listarea situaţiei (reportul).
        Aceste elemente trebuie avute în vedere pentru modificarea lucrării pentru adaptarea sa la necesitătile dumneavoastră. De asemenea vă invităm să încercati să realizaţi lucrări proprii, prin modificarea celor expuse aici cu utilizarea comenzilor prezentate, având în vedere modul lor de funcţionare expus aici.
       Acest mod de realizare nu este obligatoriu. Modu! de abordare a fiecărei lucrări depinde de număru! celor ce o abordează, de cunoştinţele programatorului precum şi de timpul pe care el îl are la dispoziţie pentru elaborarea acestei lucrări. Dacă programatorul are timp mai puţin el va utiliza metode mai expeditive, nu se va concentra pentru a căuta metodele cele mai bune ci va utiliza metode rapide şi pe care el le-a utilizat de multe ori, !e cunoaşte bine.
      De exemplu, dacă avem din lucrări anterioare un program de culegere date vom modifica acest program pentru a-l putea utiliza pentru lucrarea respectivă. Aici se puteau utiliza de exemplu patiru programe în locul programuiui numit ADAUG aşa cum am precizat şi la început. De asemenea lista putea fi concepută în alt mod, dar acest mod mi s-a părut mie mai bun şi mai aspectuos. Bineînţeles că nu existâ restricţii în acest sens, fiecare îşi poate concepe lucrările în mod propriu, esential este să fie rezolvată problema propusă.
      Această lucrare are un program cu care ea poate fi lansată (în general acest program de lansare cuprinde şi meniu! principal, din care se lansează întreaga lucrare). Acest program este MENU. El cuprinde elementele necesare pentru lansarea tuturor programelor.
Există însă o metodă de asamblare a programelor într-un PROIECT. Această metodă este cea de utilizare a comenzii:
       CREATE PROJECT nume
      La lansarea acestei comenzi se deschide o fereastră în care se pot adăuga tot felul de elemente la proiect (programe, raporturi, etichete, fiitre etc), trebuind să fie indicate şi relaţiile dintre acestea. Noi nu vă recomandăm acestă metodă ci aceea a utilizării comenzii:
      BUILD project num1 FROM programe | nume2
      |report | label | screen | library
      [,progname | menu
      | report | label | screen | library... ]
        unde:
      nume1 - este numele proiectului ce va fi creat.
     nume2 - este numele programului prin care se lansează întreaga lucrare (opţional se pot indica biblioteci, programe etc).
      În urma lansării acestei comenzi se crează două fişiere cu numele nume1 şi extensia PJT şi PJX care reprezintă de fapt proiectu! respectiv.
      Se poate utiliza şi comanda:
      MODIFY PROJECT nume 
      prin care se poate modifica un proiect dacă nu se doreşte recrearea lui cu comanda        
      BUILD sau CREATE PROJECT.
    Efectul pe care îl are crearea unui proiect este este acela că el grupează toate programele şi celelalte elemente necesare lucrării, semnalând eventua! erorile constatate care permit intervenţia în aceste cazuri (în caz de erori nu se crează proiectul).
Un alt efect este că este posibilă integrarea mai departe a lucrării prin comanda:
       BUILD APP nume1 FROM nume2
       unde;
       nume1- este numele aplicaţiei care va fi creată.
     nume2 - este numele proiectului care va duce la crearea aplicaţiei, Deci proiectul este      necesar pentru a crea o aplicaţie.
    O aplicaţie este un fişier de relativ mici dimensiuni care poate fi lansat în .execuţie continând toate elementele necesare, dar numai în mediul FOX în care a fost creată aplicatia.respectivă.
     Dacă se doreşte un fişier (unic) care să conţină toate elementele lucrării şi el să poată fi lansat în absenţa suportului FoxPro se utilizează comanda:
     BUILD EXE exefile FROM projfile
     [STANDALONE] [EXTENDED]
     exefile - este nume!e fişierului exe (care are extensia exe).
     projfile - este numele proiectului care are drept substanţă programele lucrării respective
     STANDALONE - reprezintă modul "standard" de creare al acestui fişier. Acest mod include fişierele componente Fox şi anume: fişiere!e bib!ioteci!or: FOXPRO.LIB, POXPROS.LIB, FOXCLIBM.LIB, FOXMATHM.LIB şi componente ale fişiemlui WLINK8.EXE.
    Modul EXTENDED cuprinde un mod mai deosebit care are în componenţa sa fişiere sau părţi ale componentelor următoarelor biblioteci: FOXPROX, FOXPROSX, FOXCLIBX, FOXMATR, FOXLDR şi componente ale fişierului WLINK8.EXE.
         În mod norma! este suficientă precizarea STANDALONE, când fişierele sunt mai simple şi ele pot fi rulate pe calculatoare mai puţin performante (80286). Fişierele EXTENDED cer pentru rularea lor variante superioare (80386).
         În cazul în care nu se precizează nici o opţiune, fişierul rezultat (cu extensia .exe), poate fi executat numai sub mediul Fox. Crearea fişerelor Fox exe necesită o extensie FoxPro care se numeşte Fox Distribuţion. Programele exe create sub FOX DISTRIBUTION pot fi executate şi în absenţa mediului FOX (ca orice program executabil).
Fişierele rezultate se lansează în execuţie cu numele fişierului (ca o comandă DOS externă). Prezenţa fişierelor DBF, IDX, şi MEM pentru execuţia programelor este strict necesară, dar nu sunt necesare fişierele .prg, .frx, .frt etc.
În cazui creării fişierului exe când mai există în acelaşi director şi fişierele .pjx .app sau numai unul dintre ele şi există şi mediul FOX, cu comanda DO se va executa fişieru! EXE (care are precedenţă asupra celorlalte, apoi dacă fişierul .exe nu existâ fişierul cu extensia APP).