sâmbătă, 29 iunie 2013

FoxProW pentru incepatori Cap. 6, 7.


6. GENERATOARE

              În FoxProW realizarea gestiunii datelor poate fi făcută în mai multe feluri:
             - prin intermediu! meniului sistem când se pot executa operaţii elementare. Metoda nu este eficientă în cazurile când este necesară execuţia repetată a unor operaţii şi a operatiiior complexe;
              - prin programe create de utilizator - folosind comenzile şi funcţiile limbajului FoxProW, când un întreg grup de operaţii se poate face repetat, se automatizează practic, operaţiile pot fi făcute printr-o singură instrucţiune (trimiterea în execuţie a programului);
             - folosind generatoarele încorporate în mediul FoxPro pe baza unor opţiuni specificate de utilizator.
             Principiul de funcţionare al generatoarelor este: utilizatorul specifică prin intermediul interfeţei sistemului opţiunile sale şi pe baza lor vor fi generate programe de către FoxProW care vor rezolva problema pusă.
            Aceste programe (generate prin generatoare) pot fi înglobate în programele proprii deci pot fi utilizate de către utilizatori şi modificate. Avantajul folosirii generatoarelor este dat de posibilitatea obţinerii unor programe performante cunoscând doar comenzile de bază şi fără efort deosebit, cunoscând doar modul de utilizare al genearatoarelor.

6.1 Generatorul de ecrane

            Prin intermediul generatoruiui de ecrane se realizează programe care au drept scop conversaţia dintre program şi utilizator cu privire la introducerea unor date şi de vizualizare a conţinutului unor baze de date. Programele de introducere a datelor în bazele de date sunt în genera! realizate cu acest generatorl
            Cu ajutorul generatorului de ecrane pot fi realizate programe ce afişează pe ecran, într-o anumită configuraţie, ferestre şi obiecte specifice, text, linii, chenare, obiecte de control etc asupra cărora se acţionează cu mouse-ul sau tastatura. Obiectele şi caracteristicile lor poartă numefe generic de "ecran".

            6.1.1 Pornirea generatorului de ecrane

          Etapele realizării unui program cu ajutorul generatorului de ecrane sunt următoarele:
          - se deschide fereastra de configurare a ecranului, în interiorul căruia se definesc obiectele ce alcătuiesc ecranul şi se stabilesc caracteristicile globale ale ecranului;
           - pe baza celor specificate se generează programul.
          Pentru pornirea generatorului de ecrane se va tasta comanda (în fereastra de comandă.
          CREATE SCREEN nume
unde nume este numele ecranului respectiv.
          În urma tastării acestei comenzi, se va deschide fereastra de configurare a ecranului în care se definesc obiectele:
           Porţiunea de editare a ecranului (centrul său) este destinat introducerii obiectelor ecranului;
          - pentru a informa utilizatorul că în zona de editare trebuie scris un nume, în apropierea acestuia va apărea textul "nume" acesta fiind un obiect al ecranului,
          - la marginea ferestrei de configurare se pot vedea două rigle (folosite pentru determinarea coordonatelor) care implicit sunt gradate în inci, dar se poate modifica gradarea în centimetri. Pentru aceasta se utilizează opţiunea Ruller/Grid din submeniul Screen.
          Pentru ca să fie afişate permanent coordonatele cursorului (mouse-ului) se alege opţiunea Show Position din submeniul Screen.
          În scopul definirii unui obiect câmp în zona de editare se realizează următoarele operaţii:
         - din coloana de butoane aflate în partea stângă a ferestrei de configurare se acţionează declanşatorul al treilea (de sus în jos), se mută cursorul mouse-ului la trei unităţi de marginea superioară, în pozitie centrală şi se apasă butonul stâng, deschizând astfel pe ecran fereastra de dialog Field;
         - numele variabilei în care va fi păstrat continutul zonei de editare va fi scris în căsuţa text input: nume;
        - în timpul execuţiei programului, după ce a fost completat un nume în zona de editare, pe ecran va fi afişat un mesaj prin intermediul instrucţiunii SAY. Dacă se doreşte acest lucru aceasta va fi introdusă în clauza Valid (instructiunile corespunzătoare acestei clauze vor fi executate înainte de ieşirea din zona de editare a zonei de editare; de aceea se acţionează declanşatorul Valid, iar în fereastra ce se deschide pe ecran se scriu instrucţiunile:
        @ 14,35 SAY nume
        @ 16,30 SAY ' Acest program este în functiune'
        - se închid apoi ferestrele de dialog deschise, acţionând succesiv declanşatoarele OK.
       Pentru modificarea dimensiunilor unui obiect, se deplasează cursorul pe câmpul respectiv, se actionează butonui stâng al mouse-ului realizând în acest fel selectarea câmpului (obiectului) respectiv. Apoi, menţinând butonu! apăsat, se deplasează mouse-ul astfel încât dimensiunile să fie modificate la cele dorite.
        Al doilea obiect, textul "nume", se defineşte astfel:
        - se acţionează al doilea declanşator (din stânga), se mută cursorul la două unităţi de marginea superioară şi se apasă butonul stâng al mouse-ului;
        - se introduce textul "nume" şi se apasă butonul stâng (mouse).
       Specificările făcute în fereastra de configurare, pe baza căreia se va genera programul, trebuie salvate într-un fişier. Pentru aceasta se foloseşte opţiunea Save din submeniul File. Generarea programului se face utilizând opţiunea Generate ... din submeniul Program. După ce toate aceste operaţii au fost executate, fereastra de configurare va fi închisă, tastând ESC. Programul obţinut poate fi executat tastând cornanda:
        DO nume.spr
unde nume este numele dat programuiui (cel precizat în comanda CREATE SCREEN) iar spr este extensia (obligatorie!),
       În continuare vom prezenta modul de introducere a datelor într-o bază de date cu ajutorul unui program generat cu generatorul de ecrane şi vom folosi baza de date creată în continuare.
       Pentru a crea baza de date NOM.DBF vom folosi comanda:
       CREATE nom
       Structura creată va fi:

      Câmp   Tip  Lungime   Obs
      Den      C    15             Denumire material
      Data_ui D                    Data ultimei intrări
      Data     D                    Data introducerii
      Specif   M                    Specificaţii tehnice (STAS, Nl etc)
      Cod      C     8             Codul materialului
      Grup     C   14             Grupa de materiale
      Prov      L                    Provenienţă (Intern / Import)
      Pret      N   12.3           Preţul materialului
      Stoc      L                    Stoc (are stoc sau nu)

       Deoarece specificaţiile pot varia foarte mult s-a propus pentru acest câmp ca el să fie un câmp memo.
       Pentru introducerea datelor se poate folosi sistemul (BROWSE sau APPEND) dar aceasta necesită cunoştinţe FoxPro. Pentru ca introducerea să poată fi făcută de nespecialişti este necesară realizarea unui program (care are şi avantajul posibilităţii verificării datetor).
       Programul va fi un ecran cu structura din figură:
                   
          Se va introduce comanda de creare a ecranului:
          CREATE SCREEN introd
          Astfel va fi creată fereastra de configurare a ecranu!ui iar în bara meniu!ui sistem vor fi incluse opţiunile Screen şi Object, La un moment dat pot fi deschise mai multe ferestre de configurare, numărul acestora fiind limitat de memoria de lucru disponibilă şi de numărul maxim de fişiere deschise concomitent (config.sys), Obiectele create pot fi copiate şi mutate dintr-o fereastră în alta folosind optiunile Cut, Copy şi Paste din submeniul Edit.
        De obicei, înainte de deschiderea ferestrei de configurare a ecranului, trebuie deschise bazele de date cu care se lucrează (deci vom deschide iniţial NOM.DBF), se şterge ecranul şi se initializează variabilete utilizând instrucţiunile "codului de iniţializare".
În exemplu! nostru programu! generat va contine o instructiune READ cu care vor fi activate obiectele ecranului. Înainte de definirea obiectelor se stabilesc caracteristicile globale ale ecranului: codul de iniţializare şi finalizare, clauzele instrucţiunii READ şi diverse atribute ale ferestrei în care vor fi afişate obiectele. Atributele ferestrei se referă la poziţia, dimensiunea şi stilul acesteia, la fondul şi font-ul implicit al ferestrei.
         Specificarea caracteristlciior giobale ale ecranului se face prin intermediul ferestrei de dialog Screen Layout, aceasta fiind deschisă pe ecran prin alegerea opţiunii Layout din submeniul Screen.
                      
            Dimensiunile şi poziţia ferestrei se stabiiesc cu ajutorul câmpului de editare Size, respectiv Position sau cu ajutorul comutatorului Center, aflate în această fereastră de dialog.
           Pentru exemplul nostru, folosind butoanele de incrementare-decrementare din secţiunea Size, se stabilesc dimensiuniie ferestrei (măsurate în pixeli): Width (lăţime) 570, Height (înăltime):380. De asemenea se activează comutatorul Center din secţiunea Position.
           În câmpul de editare Title poate fi scris un şir de caractere care va apărea în centrul laturii superioare a ferestrei, ca şi în câmpul de editare Name, acesta fiind folosit în programul generat.
         Tipul şi proprietăţile ferestrei în care vor fi afişate obiectele se stabilesc prin intermediul dedanşatorului Window Style aflat în fereastra de dialog Screen Layout. Prin acţionarea acestuia, pe ecran va fi deschisă fereastra de dialog cu acelaşi nume.
Referitor la tipul ferestrei, în lista Type sunt disponibile:
          - Desktop - obiectele apar în ferestra FoxProW sistem (pe ecranui sistemului);
          - User - obiectele apar într-o fereastră utilizator care poate fi:
user - fereastră utilizator
system - fereastră sistem
dialog - fereastră de dialog
alert - fereastră de atenţionare (erori)
           Atributeie ferestrei pot fi:
        - Close - fereastra poate fi închisă
        - Moveable - poate fi mutată
- Halt Ht/Title Bar - defineşte o fereastră a cărei latură superioară are înălţimea mai mică decât cea obişnuită (jumătate)
- Minimize - ferestra poate fi minimizată şi maximizată
Chenarul poate fi de următaarele tipuri:
-None – fără chenar;
- Single – cu o linie simplă;
- Double - cu linie dublă
- Panel - cu chenar plin
- System - cu chenar asemănâtor ferestrei de comenzi de exemplu.
Închiderea ferestrei Window Style se face actionând declanşatorul OK.
        Specificarea eventualelor pachete de instructiuni (codul de iniţializare şi cel de finalizare, clauzele instrucţiunii READ) care vor fi asociate ecranului, se face prin intermediui ferestrei de dialog Screen Code. Aceasta va fi deschisâ pe ecran prin acţionarea declanşatorului Code din ferestra Screen Layout
            
         Utilizând declanşatorul Screen Setup Code se pot scrie în fereastra de editare deschise prin acţionarea acestuia, codul de initializare, iar cu declanşatorul Cleanup and Procedures se poate scrie codul de finalizare. În codul de finalizare pot fi scrise proceduri, în care caz se foloseşte comanda:
          PROCEDURE nume_procedură
         Pentru specificarea codurilor de initializare şi a celui de finalizare ale exemplului nostru, se realizează următoarele operaţii;
          - se acţioneazâ declanşatorul Cleanup and Procedures şi apoi Screen Set Code.
          - se închid cele două ferestre de dialog deschise, acţionând declanşatarele OK, activându-se astfel fereastra Setup, în care se scriu comenzile următoare:
          close all
          set date to dmy
          use nom && se deschide baza de date
          go top
          if reccount()>0 && dacă există înregistrări
               scatter memvar memo && se mută valoarea din înreg
               show gets && în variabilele de memorie
          else
               m.cod = 0 && în caz contrar se dau valori
               m.pret = 5000 && acestor variabile de memorie
               m.prov = .F. && variabilele de memorie au
               m.stoc = ‘TABLA’ && caracaterul m în faţa denumirii
         endif
         buton=1 && în continuare sunt initializate
         comut=0 && alte variabile de memorie
         decl=1 && necesare: pentru butonul radio
         list=1 && declanşatoare, listă etc
         poz=1
- acţionând combinaţia de taste CTRL+F1 se activează fereastra Cleanup, în care se scriu instructiunile:
        CLOSE ALL
        CLEAR
  • se revine în fereastra de configurare folosind combinaţia de taste CTRL+F1.
       Există cazuri în care obiectele ecranului nu trebuie să fie activate decât în anumite condiţii (nu este permis accesul la obiecte) de exemplu în cazul în care citirea unui câmp "nume_copil", când câmpul "copii" e .F. În astfel de cazuri în fereastra de editare deschisă prin acţionarea declanşatorului On Screen Entry va fi scris un pachet de instructiuni sau o expresie logică. După generare obiectele ecranului vor fi activate numai dacă valoarea returnată de conţinutul ferestrei de editare este .T. Codul scris în această fereastră va corespunde clauzei WHEN a instructiunii READ cu care sunt activate obiectele în programul generat.
      În mod asemănător, terminarea citirii obiectelor ecranului depinde de valoarea returnată de codul corespunzător clauzei VALID a instructiunii READ. Conţinutul clauzei poate fi specificat utilizând declanşatorul On Screen Exit din fereastra de dialog Screen Code.
       În acelaşi mod poate fi specificat un set de instrucţiuni care va fi executat înainte de citirea obiectelor (utilizând declanşatorul On Window Activate – corespunzător clauzei ACTIVATE) la activarea altei ferestre (folosind declanşatorui On Window Deactivate - clauza DEACTIVATE) sau la execuţia unei instructiuni SHOW GETS - (On Refresh) corespunzând clauzei SHOW GETS. Aceste instrucţiuni sunt adesea folosite pentru actualizarea conţinutului ecranului sau pentru a activa şi dezactiva obiectele acestuia.
       Pentru a redeschide fereastra de dialog Screen Layout se alege opţiunea Layout din submeniul Screen. Aspectul ecranului poate fi îmbunătăţit prin alegerea unei culori potrivite pentru fondul respectiv. În acest scop se acţionează declanşatorul Color din fereastra de dialog Screen Layout şi pe ecran se va deschide o fereastra (Screen Color) când se poate alege o culoare implicită (prin căsuţa Automatic) sau o altă culoare. Se poate alege şi un fişier (de tip bitmap.bmp) pentru fondul ecranului. Alegerea acestuia se face prin intermediul declanşatorului Wallpaper. Închiderea ferestrei se face acţionând declanşatorul OK.
       Un font implicit pentru textul câmpurilor de editare şi al zonelor de editare poate fi specificat cu ajutorul declanşatorului Font aflat în fereastra de dialog Screen Layout. Pentru fiecare din aceste obiecte se poate indica un alt font la definire.
        În FoxProW se poate alege un fişier (de tip icoană .ico) al cărui conţinut va substitui ecranul când acesta este minimizat. Alegerea fişierului se face prin intermediul declanşatorului lcon File. Revenirea în fereastra de dialog Screen Layout se face acţionând butonul OK.
       Pe parcursul realizării unui ecran, utilizatorul poate modifica starea mediului PoxPro (selectând alte zone de lucru, deschizând alte baze de date etc). Prin intermediul declanşatorului Environment va fi deschisă fereastra de dialog cu acelaşi nume, în care poate fi salvată starea mediului FoxProW (declanşatorul Save), poate fi refăcută o stare creată anterior (Restore) sau pot fi şterse ultimele informaţii salvate (Clear).
        Pentru exemplul nostru se va salva mediul FoxPro (declanşatorul Save din fereastra de dialog Environment) după care se închide fereastra Screen Layout acţionând declanşatoru! OK.

          6.1.2 Tipuri de obiecte

         Se pot defini într-un ecran următoarele tipuri de obiecte:
         - obiecte text;
         - câmpuri de editare;
         - regiuni de editare;
         - declanşatore;
         - butoane radio;
         - comutatoare;
         - liste ascunse;
         - liste;
         - câmpuri de editare cu butoane de incrementare-decrementare;
         - linii;
         - chenare;
         - chenare rotunjite la margini.
        Aceste tipuri de obiecte au o caracteristică comună. La definire, acestora li se asociază o variabilă de memorie sau un câmp al unei baze de date. în timpul execuţiei, actionând asupra unui obiect, variabila asociată acestuia ia o anumită valoare (de exemplu dacă într-o listă ascunsă se alege o anumită valoare, acesteia îi este atribuită valoarea 2 (a doua din listă). În funcţie de valoarea pe care o are variabila, pot fi executate anumite operaţii.
       De exemplu instructiunile ce testează valoarea variabilei asociate unui obiect şi, în funcţie de aceasta, execută anumite operaţii şi pot fi incluse în clauza VALID a obiectului respectiv (instrucţiunile clauzei vor fi executate înaintea părăsirii obiectului).
        Cornunicarea dinire utilizator şi FoxPro se realizează astfel:
      - utilizatorul acţionează (taste sau mouse) asupra unui obiect, modificând valoarea variabilei asociate acestuia;
    - funcţie de valoarea variabilei, se execută anumite operaţii sau se transmit informaţii utilizatomlui (prin afişarea unui text, dezactivarea unor obiecte, afişarea unor imagini etc.).
      Comunicarea încetează odată cu încheierea execuţiei (de obicei acţionând declanşatorul OK).
     Între obiecte există şi o deosebire esenţială: în câmpurile de editare datele se introduc tastând caracter cu caracter, iar la alte câmpuri (declanşatore, butoane radio, comutatoare, liste, liste ascunse) se acţionează modificând valoarea variabilei asociate (selectând valori).
    Zonele de editare cu butoane de incrementare-decrementare pot fi incluse în ambele categorii prezentate mai sus, utilizatorul având posibilitatea de a introduce direct în zona de editare valoarea dorită, sau poate modifica prin incrementare-decrementare, cu ajutorul butoanelor asociate.
      Regiunile de editare se aseamănă foarte mult cu zonele de editare (diferind doar cantitatea de date introdusă).
     În versiunea sub Windows, pe partea stângă a ferestrei de configurare se găseşte o coloană de butoane cu ajutorul cărora se definesc obiectete ecranului. Cu excepţia primeia (Selection pointer) fiecare buton corespunde unui anumit tip de obiecte. Definirea unui obiect se realizează în felul următor:
        - se selectează butonul corespunzător;
       - se mută cursorul în fereastra de configurare în poziţia dorită pentru obiectul respectiv şi se apasă butonul stâng al mouse-ului;
    - se stabilesc proprietăţile obiectului (în ferestra de dialog deschisă pe ecran, care se incheie prin închiderea ferestrei).
      Pentru a defini mai multe obiecte succesiv, se procedează astfel:
      - se realizează un dublu clic pe butonul asociat tipuiui de obiect care va fi definit;
    - se pot defini mai multe obiecte de acelaşi tip, în modul prezentat anterior, fără a mai actiona butonul asociat aflat în stânga ferestrei de configurare;
     - pentru a încheia operaţia de definire a grupului de obiecte de acelaşi tip se realizează un clic pe primul buton (Selection pointer).
     Fiecărui obiect îi este asociată o ferestră de dialog ce poate fi deschisă printr-un clic dublu pe obiectul respectiv.
     În exemplul nostru, pentru construirea ecranului se alege initial opţiunea Show Position din submeniul Screen pentru ca în bara de stare din partea inferioară a ecranului să fie ataşate coordonatele curente ale cursorului mouse-ului. De asemenea în fereastra Ruler/Grid, deschisă prin alegerea opţiunii cu acelaşi nume din submeniul Screen, se selectează butonul radio Centimeters.
      Începem crearea obiectelor care alcătuiesc ecranul prin definirea unor obiecte de tip text.                Pentru a crea un astfel de obiect, în cazul nostru "Den", se realizează următoarele:
       - se acţionează al doilea buton din latura stângă a ferestrei de configurare (de sus);
    - se mută cursorul mouse-ului în poziţia în care se doreşte plasarea obiectului (1.40 pe verticală şi 1.80 pe orizontală, în cazul nostru) şi se apasă butonul stâng al mouse-ului;
      - se introduce textul dorit (Denumire);
     - se apasă butonul stâng al mouse-ului.
     În mod similar se definesc celelalte obiecte text ale ecranului nostru după cum urmează:


            Data ultimei int
       2.48,
  1.68
            Data introducerii
       3.08,
  1.68
            Cod 
       3.78,
  1.68
            Specificatii
       4.68,
  1.68
            Provenienta
       6.98,
  2.68
            Pret
       7.88
  5.88
           Grupa
       6,88
  5.88
           Nom
       0.58,
12.18

        Aceste obiecte (tip text) au caracter informativ. Utilizatorul nu poate acţiona asupra lor.
                CÂMPURI DE EDITARE

        Porţiunile de ecran în care se vor introduce date pentru actualizarea unor baze de date de exemplu (Den, Specif, data_ui etc) poartă numele de câmpuri de editare. Pentru a defini un câmp de editare se procedează astfel:
       - se acţionează butonul al treilea din stânga ferestrei de configurare;
     - se mută cursorul în poziţia dorită pentru câmpul de editare şi se apasă butonul stâng al mouse-ului, deschizând fereastra de dialog;
                            

         - în i    nteriorul acesteia se stabilesc proprietăţile obiectului;
         - prin închiderea ferestrei se încheie definirea.
        Proprietăţile unei zone de editare care pot fi specificate în fereastra de dialog se referă la:
        - numele variabilei asociate (un câmp din baza de date sau o variabilă de memorie) şi va            fi specificat prin intermediul declanşatorului Input sau în câmpul de editare alăurat;
        - tipul datei - (şir caractere, numeric sau dată calendaristică) şi va fi stabilit prin intermediul ferestrei de dialog Format, deschisă prin acţionarea declanşatomlul cu acest nume. În fereastră pot fi specificate opţiuni de editare ca în tabelele alăturate:

                      OPŢIUNI PENTRU ŞIRURILE DE CARACTERE

OPŢIUNEA
MODUL DE AFIŞARE
Alpha Only
Doar caractere alfabetice
To Upper Case
Caractere convertite în litere mari
R
Caracterele non-format sunt afişate dar nu sunt păstrate în câmp
Edit „Set” Date
Date calendaristice editate în formatul curent
British Date
Date calendaristice în format eglez (zz.ll.aa)
Trim
Spaţiile de la început şi sfârşit sunt eliminate
Right Align
Datele sunt afişate la dreapta câmpului
Center
Datele sunt afişate centrat
 
                  OPŢIUNI DE FORMATARE DATE NUMERICE

OPŢIUNEA
MODUL DE AFIŞARE
Left Justify
Aliniere la stânga (normal pentru câmpuri numerice)
Blank if Zero Spaţiu în caz că valoarea este zero
(Negative) Numerele negative sunt încadrate între paranteze
Edit „Set” Date
Date calendaristice editate în formatul curent
British Date
Date calendaristice în format eglez (zz.ll.aa)
CR if Pozitive CR (credit) afişat după număr dacă este pozitiv
DB if Negative DB (debit) afişat după număr dacă numărul este nagativ
Leading Zeroes Tipăreşte toate zerourile din faţa câmpului
Currency Afişează în formatul curent
Scientific Afişează ţn formatul ştiinţific
  
                OPŢIUNI DE FORMATRE DATE CALENDARISTICE

     - valoarea câmpului sau variabilei va fi editată dacă este selectat butonul radio Input Field (Get), sau va fi doar afişată dacă este ales butonul radio Output Field (Say);
    - dacă este activat comutatoru! Select Field on Entry, când cursorul se află în câmpul de editare, întregul obiect va fi selectat. în cazul unui obiect tip Say (care este doar afişat) acesta va fi actualizat la fiecare modificare a variabilei afişate. În mod implicit zona de editare va fi dezactivată după generare, în timpul activării comutatorului initialiy Disable Field.
    - o valoare minimă şi una maximă pentru valoarea introdusă în câmp pot fi specificate prin intermediui declanşatoarelor Lower respectiv Urpper.
    - se pot specifica pachete de instrucţiuni corespunzătoare clauzelor asociate obiectului, prin intermediul declanşatorelor din secţiunea Clauses.
    Crearea primului câmp de editare (aflat lângă obiectul text "Nume") se face astfel:
    - se selectează căsuţa a treia din marginea stângă a ferestrei de configurare;
    - se mută cursorul în poziţia 1.18, 3.72 şi se apasă butonul stâng al mouseului;
   - în fereastra de dialog deschisă pe ecran, în căsuţa text Input... se specifică numele variabilei în care va fi păstrat conţinutul căsuţei de defilare m.nume;
    - se închide fereastra de dialog acţionând declanşatorul OK.
    Pentru a modifica dimensiunea unui obiect se procedează astfel:
    - se poziţionează mouse-ul pe obiect şi se acţionează butonul stâng al mouse-ului;
    - se poziţionează cursorul pe un colţ al obiectului şi se deplasează mouse-ul încât obiectul să capete dimensiunile dorite (mouse-u! rămânând apăsat).
   Se modifică dimensiunile obiectului creat astfel încât acesta să se întindă până la 1.32 centimetri de marginea superioară şi 6,24 centimetri de extremitatea stângă a ferestrei de configurare. În mod asemănător se definesc celelalte căsuţe de editate astfel:
                       Poziţia      Variabila asociată
                    1.68,3.88                m.data_ui
                    2.32, 3.88               m.data_i
                    3.12, 3.88               m.cod

        La definirea obiectelr m.data_ui şi m.data_i se va specifica faptui că acestea sunt de tip dată calendaristică astfel: se deschide fereastra asociată fiecărui obiect, se acţionează declanşatorul Format, iar din fereastra de dialog deschisă se selectează butonul radio Date.

                                 REGIUNI DE EDITARE

        Acest tip de obiect se foioseşte pentru cazurile în care spatiul ocupat de zona respectivă este mai mare (nu se referă numai la 10-20 de caractere). Definirea zonelor de editare se face în mod asemănător cu crearea câmpurilor de editare, folosind butonul al patrutea aflat la marginea stângă a ferestrei de configurare.
       Faţă de câmpurile de editare, în fereastra de dialog Edit Region se pot face următoarele specificări:
      - Dacă a fost selectat comutatorul Scrool Bar on Edit Region, în marginea dreaptă a regiunii de editare va fi adăugată o bară de defilare;
         - tasta Tab va putea fi utilizată în regiunea de editare în cazul când comutatorui Allow Tabs in Edit Region este activat;
       - numărul de caractere care pot fi scrise în regiunea de editare va fi specificat cu ajutorul zonei de editare Character Length.
                           
         Crearea regiunii de editare a adresei se va face astfel:
         - se selectează butonul al patrulea din marginea stângă a ferestrei de configurare;
      - se mută cursorul în pozitia dorită (de exemplu 4.50, 3.80) şi se apasă butonul stâng al       - mouse-uiui deschizând ferestra de dialog Edit Region;
     - în căsuţa text Input se scrie numele variabilei asociate obiectului (m.specif)
     - se închide fereastra acţlonând declanşatoru! OK.
                 BUTOANE RADIO
   Specificarea provenienţei în exemplul nostru se va face printr-un buton radio aflat în apropierea textului "Prov" (deoarece are doar două vaiori), Definirea unui buton radio se face cu ajutorul butonului al şaseiea, în mod asemănător cu definirea zonelor de editare.
                         
 
           În fereastra Radio Button se pot face specificările:
- variabila sau câmpul bazei de date asociat grupului, de tip numeric sau şir de caractere va fi specificat prin declanşatorul Variable sau în zona alăturată (câmp de editare);
- textele explicative vor fi plasate în apropierea butoanelor radio (pentru a fi explicite) şi vor fi specificate în secţiunea Radio Button Prompts;
- în apropierea butoanelor radio pot fi afişate imagini (comutatorul Picture Buttons, fişiere cu extensia .bmp, selectate dedanşatorul Picture File..);
- la prima afişare butonul radio ce va fi selectat se poate specifica cu ajutorul listei ascunse Initial;
- butoanele grupului pot fi dispuse vertical (Verical) sau orizontal (Horizontal) cu specificare în secţiunea Options;
- grupul de butoane poate fi dezactivat la lansare dacă a fost activat comutatorul Initialy Disable Buttons;
- în zona de editare Space Between Buttons poate fi indicată distanţa dintre butoane;
- clauzele asociate grupului pot fi specificate prin intermediul declanşatoarelor din secţiunea Clauses;
          Pentru cazul nostru se vor realiza următoarele operaţii:
- se acţionează declanşatorul al şaselea din marginea stângă;
- se mută cursorul în poziţia dorită (7.58, 2.16) şi se apasă butonul stâng, deschizând astfel fereastra de dia!og Radio Button;
- în câmpul de editare Variable se introduce numele variabilei;
- în secţiunea Radio Button Prompts: se introduc textele reprezentând butoaneie radio:
\< Intem
\< Extern
- se actionează declanşatorul Valid şi m zona de editare a ferestrei deschise, se scriu instrucţiunile de validare;
if buton=0
m.prov=.f.
else
m.prov=.t.
endif
- se închid în final feresfrele de dialog prin acţionarea declanşatoarelor OK.

 
                      LISTA ASCUNSĂ
O listă ascunsă va fi folosită în exemplul nostru pentru a selecta grupa (din mai multe posibilităţi) în care se găseşte un material. Definirea se face asemănător cu a zonei de editare selectând butonul al optulea din stânga ferestrei de configurare. Se pot specifica:
         - elementele listei ascunse vor fi precizate de utilizator după selectarea butonului radio List Popup din secţiunea Options, sau vor fi extrase dintr-un masiv în cazul selectării butonului radio Array Popup;
          - după generare lista va fi dezactivată dacă a fost ales comutatorul Initialy Disable Popup care va putea fi activată doar explicit;
             - numele variabilei de memorie sau al câmpului bazei de date de tip numeric sau şir de caractere va fi specificat prin intermediul declanşatorului Variable ... sau în câmpu! de editare asociat lui;
                              

         - dacă elementeie nu sunt extrase dintr-uri masiv ele vor fi introduse în secţiunea Popup Prompts; 
         - elementul listei care va fi selectat iniţial se indică în lista ascunsă Initial;
       - cu ajutorul declanşatoarelor 1st Element şi # Element (secţiunea Clauses) se vor stabili elementeie masivului şi anume primul element al listei şi numărul elementelor extrase.
          Pentru definirea listei ascunse din exemplul nostru, se realizează operaţiile;
      - după acţionarea declanşatorului cu număru! opt se mută cursorul în zona dorită (6.62, 7.22) şi se apasă butonul stâng al mouse-ului deschizând fereastra de dialog Popup;
       - în câmpui de editare Variabie al acestei ferestre se scrie numeie variabilei de memorie sau al câmpului din baza de date care va fi asociat listei ascunse (m.filiala);
        - în secţiunea Popup Prompts se indică elementele listei ascunse (una sub alta);
                           
                             Profile                                        Produse din lemn
                             Tablă                                         Cauciuc si produse PVC
                             Materiale de constructii           Rulmenti
                             Ambalaje                                  Organe asamblare

                         CÂMPURI DE EOITARE CU BUTOANE DE INCREMENTARE

         În exemplul nostru un câmp cu butoane de incrementare-decrementare poate fi preţul unui material. Definirea acestui câmp se face cu ajutorul butonului al zecelea din fereastra de configurare, în mod asemănător cu crearea celorlalte câmpuri.
         În fereastra de dialog Spinner se pot specifica:
        - numele variabilei sau al câmpului bazei de date (numerice) ce va fi specificat cu ajutorul declanşatorului Variable sau în câmpul alăturat asociat;
         - formatui de afişare cu declanşatorui Format;
       - valorile minimă şi maximă între care se va încadra valoarea introdusă în câmpul de editare respectiv (câmpurile Minimum şi respectiv Maximum din secţiunea Display;
        - pasul de incrementare - decrementare (Increments By);
     - la execuţia programului se pot scrie valori mai mici sau mai mari decât acestea (secţiunea Range specifică valorile minime şi maxime cu declanşatoarele Lower şi Upper);                               




        - pot fi specificate o serie de clauze (secţiunea Clauses) privind condiţii impuse variabilei la introducere (WHEN, VALID etc);
     - comutatoarele Select on Entry şi initially Disable au aceleaşi semnicaţii ca şi în cazul obiectelor prezentate anterior.
     Pentru ecranul nostru definirea butonului de incrementare-decrementare folosit la stabilirea preţul unui material se face astfel:
     - se acţionează butonul al zecelea şi se mută cursorul în zona dorită (7.52, 7.38) şi se apasă pe butonul stâng al mouse-ului;
      - în sectiunea Display a ferestrei Spinner ce s-a deschis se scriu valorile (de exemplu):
                                        Minimum:           1000
                                        Maximum:     500000
                                        Increment By:         10
       - în câmpul de editare Variable se introduce numele variabilei asociate câmpului (m.pret);
       - se închide fereastra de dialog Spinner (OK).

                                       COMUTATOARE

     În exemplul nostru operatorul va putea specifica prin intermediul unui comutator dacă materialul respectiv are stoc sau nu. La definirea acestui obiect se acţionează butonul al şaptelea şi după ce s-a deschis fereastra Check Box asociată se fac specificările obişnuite:
       - numele variabilei de memorie sau al câmpului din baza de date de tip numeric sau logic se specifică în câmpul de editare Variable, sau prin intermediul declanşatorului, Variabila va lua valoarea 0 sau 1 după cum comutatorul a fost activat sau nu;
      - textul informativ va fi introdus în câmpul de editare Check Box Prompt (caracterul precedat de" \<" va deveni tastă directă de selecţie);
                                  
       - dacă va fi ales comutatorul Picture Check Box, va fi aleasă o imagine în locul textului explicativ, iar cu comutatorul Picture File se va afişa fisierul (.bmp) ce conţine imaginea;
        - după generare, comutatorul va fi activat dacă a fost ales comutatorul Initially Checked (va fi dezactivat cu comutatorul Disbled);
      - clauzele asociate se definesc cu comutatoarele din secţiunea Clauses după care se închide fereastra (OK).
         Definirea comutatorului "Stoc" se face astfel:
        - se alege butonui al şaptelea şi se mută cursorul în poziţia dorită (8.50, 6.20) după care se acţionează butonul stâng al mouse-ului;
         - în câmpu! de editare Check Box Prompt: se introduce textul:
\<Stoc (S va deveni tastă directă de selectare)
         - în câmpul de editare Variable se scrie numele variabilei;
       - pentru a specifica o clauză Valid se actionează declanşatorul cu acest nume şi se scriu instructiunile:
               IF comut=0
            m.stoc=.f.
               ELSE
           m.stoc=.t.
               ENDIF
         - se închid cele două ferestre deschise acţionând tastete OK.

                                             LISTE

         Pe ecran va fi afişată o listă conţinând grupele de materiale despre care există informaţii în baza de date nom.dbf pe parcursul execuţiei programului. Prin alegerea unei grupe din listă, obiectele ecranului vor fi actualizate cu informatiile referitoare !a acesta.
                             
      - utilizând butoanele radio din secţiunea List Items se va preciza de unde sunt extrase elementete listei:
        From Array - dintr-un masiv;
        From Popup - dintr-un submeniu;
        From Files - din fişiere aflate pe diverse periferice (disk);
        From Fields – lista se extrage dintr-o bază de date;
        From DBF Structure - din structura unei baze de date.
     - în câmpul de editare Variable sau declanşatorul cu acelaşi nume se va indica numele variabilei asociate (numeric sau şir);
    - dacă este selectat comutatorul Terminate When Choise is Made, în timpui execuţiei programului execuţia comenzii READ este terminată când se face o alegere;
      - initial lista este dezactivată dacă este activat comutatoru! Initially Disable List;
      - eventualele clauze asociate se indică în sectiunea Clauses;
     Definirea listei pentru exemplul nostru se face astfel:
    - se actionează butonul al nouălea şi se mută cursorul în poziţia dorită (1.20, 11.50) şi se declanşează butonul stâng al mouse-ului deschizând fereastra de dialog List;
     - din secţiunea List Items a acestei ferestre se aiege butonul radio From Field iar în câmpul de editare alăturat se introduce numele câmpului din care vor fi extrase elementele listei şi anume "grupa";
    - în câmpul Variable se scrie numele variabilei care va fi asociată acestui obiect, variabila poate avea orice nume;
     - se acţionează declanşatorul Valid din secţiunea Clauses iar în zona de editare a ferestrei ce se deschide se scriu instrucţiunile:
             GO lista
             pozitie=lista
             SCATTER MEMVAR MEMO
              if m.prov = .f.
                 buton = 1
             ELSE
                buton=2
            ENDIF
            IF m.stoc = ,f.
                 comut = 0
           ELSE 
                  comut = 1
           ENDIF
           SHOWGETS
    care vor fi executate după ce se face alegerea oricărui element al listei, apoi se închid ferestrele acţionând comutatoarele OK.
    Se poate modifica lista astfel încât colţul din dreapta să fie în colţul de coordonate 5.30, 13.80.

                                        DECLANŞATOARE

         În ecranul pe care dorim să-l creem operaţiile de adăugare a informaţiilor, salvare a lor şi incheierea operatiei de introducere se fac prin intermediul a trei declanşatoare (Adăugare, Salvare şi leşire). Un grup de declanşatoare se defineşte cu butonu! a! cincilea din şirui de butoane din stânga ecranuiui de configurare. Apoi mutând cursorul în dreapta şi acţionând butonul stâng al mouse-ului se deschide fereastra Push Button în interiorul căreia se definesc declanşatoarele:
                                  

       - un declanşator poate fi de tip normal, zone dreptunghiulare care se disting prin culoarea lor diferită şi prin textul încadrat, declanşatoare invizibile - care se suprapun (de obicei) peste o imagine sau text şi de tip picture - declanşatoare în care textul este înlocuit de o imagine. Tipul declanşatoarelor unui grup se specifică cu ajutorul butoanelor din sectiunea Type. Dacă s-a ales tipul invizibil în câmpul de editare Number se va indica numărul de declanşatoare ce alcătuiesc grupul, în cazul declanşatoarelor de tip picture, fişierele din care sunt extrase imaginile folosind declanşatoru! Each Picture File;
     - pentru declanşatoarele normale, textele pe care acestea le încadrează vor fi scrise în secţiunea Push Button Prompts; (poate fi folosit grupul de caractere "\<" pentru a desemna taste directe. De asemenea poate fi desemnat un declanşator implicit plasând în faţa textului asociat grupul de caractere "\!" astfe) după generare declanşatorul va fi ales în mod automat dacă este acţionată combinaţia CTRL+Enter. Pentru a specifica un declanşator care după generare va fi acţionat în mod implicit prin apăsarea tastei ESC textul asociat va fi precedat de grupul "\?";
       - prin intermediul declanşatorului Variable se precizează variabila sau câmpul din baza de date asociată declanşatorului;
    - dispunerea pe orizontală sau verticală a declanşatoarelor este indicată prin butoanele radio Horizontal sau Verical;
    - dezactivarea initială a grupului de declanşatoare va fi dată de alegerea comutatorului Initially Disable;
   - instucţiunea READ va fi încheiată prin acţionarea unui declanşator din grup dacă se activează comutatorul Terminate READ on Selection;
    - distanţele între declanşatoare se stabiiesc cu ajutorul zonelor de editare Space Between Butons;
    - eventualele clauze se pot specifica prin comutatoarele secţiunii Clauses.
    Pentru definirea grupului de declanşatoare din exemplul nostru se procedeazâ astfel:
  - după selectarea butonului al cincilea se mută cursorul în zona dorită amplasării declanşatoarelor (6.30, 11.50) şi se apasă pe butonul stâng al mouse-ului când se deschide fereastra Push Button;
   - se scriu în secţiunea Push Button Prompts unele sub altele textele asociate celor trei declanşatoare adică:
        \<Adaugare
        \<Salvare
        \!\ iesire // acesta este declanşator implicit
  - în câmpul de editare Variable se introduce numele variabilei asociate grupului de declanşatoare;
    - se atege butonu! radio Vertical pentru dispunerea declanşatorelor;
- în clauza Valid se scriu instrucţiunile (daclanşatorul Valid):

        Do case
        Case decl = 1 && declanşatorul ADAUGARE
append blank
scatter memvar memo && se mută variabileie din baza de
poz=recno() && date în câmpurile coresp. din
m.cod=' ' && memorie (sunt create van'abileie)
m.grupa='tabla' && se iniţializează apoi variabilele
m.pret=5000
m.prov=.f.
m.stoc=.f.
buton=1
comut=0
decl=1
list=1
show gets
      case decl=2
if reccount()=0
appe biank
endif
go poz
gather memvar memo && se mută variabilele de memorie && în baza de date
show gets && în baza de date
      case decl=3
clea read
     endcase

     - se inchid ferestrele (OK).
         Programul de introducere astfel creat (cel dat ca exemplu) are însă anumite deficienţe: el este un program model, care are incluse toate tipurile de obiecte ce pot fi create. Într-un prrogram de introducere unde se fac introduceri masive însă, este neconvenabil ca în timpul introducerii (unde se lucrează în special cu tastatura) să fie nevoie să se întrerupă tastarea şi să se lucreze cu mose-ul, apoi să se reia tastarea. Ba chiar este nevoie ca tastările numerice să fie grupate de cele alfanumrice pentru ca să poată fi automatizată într-o mai mare măsură tastarea. Din acest motiv noi recomandăm utilizarea unor programe scrise cu instrucţiunile SAY şi GET sau utilizarea generatorului de filtre doar pentru crearea ecranului de introducere şi folosirea !ui în interiorul unui program asemănător cu exemplul care urmează. Aici nu se utilizează nici un câmp care să utilizeze mose-ul, iar încheierea tastării este semnalizată printr-o anumită introducere în primui câmp (spaţiul). Astfel când se va introduce acest cod se va produce ieşirea, iar altfel se va continua cu o altă introducere.
         Pentru a rezolva automatizarea introducerilor şi a modificărilor se va putea indexa baza de date şi se va testa existenţa codului în fişier. Dacă e! există, va fi vorba de o modificare (codul trebuie să fie unic) iar dacă nu, este vorba de o introducere (ca în programu! următor):
        close all
        set date to brit
        use nom inde indcod
        go top
m.den=' '
m.cod=0
m.data_ui=date()
m.data_i=date()
m.adr=repl( ,80)
m.grupa=' '
m.pret=1ooo
m.Prov=.f.
m.stoc=.f.
tt=.t.
       do while tt=.t. && se lansează un ciclu DO pentru reluarea
       do int.spr && introducerii utilizând screenul (anumit INT)
       if m.den=" && text de oprire introducere (verificare la
       tt=.f. && sfârşitul introducerii - după READ)
exit
       endif
       seek m.cod
       if .not.found() && test verificare ADAUGARE sau MODIF
       appe blank
       gather memvar memo
           else
      gather memvar memo
      endif
      m,den=' ' && urmează ini(ializarea valorilor la introd.
      m.cod=' ' && ulterioare
      m.data_ui=date()
      m.daia_i=date()
      m.adr=repl(' ',80)
      m.grupa=' '
      m.pret=1000
       m.prov=.f.
       m.stoc=.f.
       enddo
       close all
       retu
         De fapt lucrurile sunt ceva mai complicate dar o parte din ele pot fi rezolvate în acest fe!.  Altele pesupun combinarea între screenuri şi programe şi (eventual modificarea în cadrul programului de creare screenuri - int.spr - care este un program ca oricare altul).
                                        OBIECTE GRAFICE

       Pentru îmbunătăţirea aspectufui şi a claritătii programelor este recomandabil să se utilizeze obiectele grafice. Acestea sunt: linii, chenare sau chenare rotunjite pentru care se folosesc butoanele 11,12 şi 13 din stânga ecranului de configurare.
         De exemplu pentru ecranul nostru se pot crea două chenare, primul având punctul de coordonate din stânga sus 0.40,1.00 iar cel din dreapta jos la 6.10,10,20 iar al doilea în punctu! 6.40, 1.00 şi 9.50, 10.20 În mod asemănător se va crea un ecran rotunjit având coordonatele: stânga sus: 7.40, 1.68 şi dreapta jos: 8.82, 4.60 care se încadrează în grupul de butoane radio definit anterior.
          Caracteristici suplimentare pentru linii, chenare şi chenare rotunjite pot fi stabilite după ce au fost selectate, folosind opţiuniie din partea inferioară a submeniuiui Object (care vor fi ulterior explicate). O facilitate deosebită o reprezintă posibilitatea includerii în ecran a obiectelor de tip imagine. Pentru aceasta se acţionează butonul cel mai de jos aflat în stânga ferestrei de configurare. În continuare se mută cursorul în stânga şi se plasează cursorul în partea unde va fi colţul din stânga sus al figurii, se spasă pe butonul stâng al mouse-ului, deschizând pe ecran fereastra de dialog Screen Structure unde:
        - pentru a include o singură imagine în ecran se alege butonul radio File, iar cu ajutorul declanşatorului alăturat se specifică fişierul din care se preia imaginea;
          - dacă în ecran se doreşte includerea unui câmp general, se va alege butonul radio Field, numele câmpului fiind introdus în fereastra deschisă la actionarea declanşatomlui;
         - caracteristicile imaginii se stabilesc cu ajutoru! butoanelor radio din sectiunea Structure And Frame Oifferent Size; dacă a fost ales butonu! Clip Picture iar dimensiunile imaginii sunt mai mari decât ale cadrului în care este depus, numai o porţiune a imaginii va fi vizibilă, alegând butonul radio Scale Picture - Retain Shape, imaginea îşi va modifica dimensiunite astfel încât să ocupe un spatiu cât mai mare (păstrând prporţiile imaginii), imaginea îşi va modifica proporţiile ca să ocupe tot cadrul dacă s-a selectat butonul Scale Picture - Fill the Frame;
         - imaginea va fi centrată – dacă s-a ales comutatorul Center Picture;
       - dacă informaţiile sunt extrase dintr-un câmp de tip general, pentru ca să se actualizeze conţinutul imaginii la fiecare schimbare a înregistrării eurente, se alege comutatorul Refresh Output Filed;
        - în cadrul declanşatorului Comment se indică eventualele comentarii asociate.
      În ecranul nostru se va include o imagine. După ce a fost acţionat ultimul buton din marginea stângă a ferestrei de configurare, se pozitionează cursorul în punctul 0.95 6.65 şi se apasă butonul stâng al mouse-ului, deschizând fereastra de dialog asociatâ imaginii. Prin intermediu! declanşatorului File se alege fişierul c:\FOXPROW\ SAMPLE\ORGANIZE\BMPS\RESERVE.BMP. Se alege butonul radio Scale Picture Retain Shape şi apoi declanşatorul OK.
6.1.3 Manipularea obiectelor

 
Deoarece uneori forma proiectată iniţial pentru ecran este necesar să fi schimbată (poziţia obiectelor în ecran o dorim alta, sau se doreşte ştergerea sau adăugarea unor obiecte) se face o reconfigurare a obiectelor (schimbarea poziţiei lor). Realizarea acestei operaţii se face prin intermediu! submeniuiui Object, care este inc!us în meniul sistem la pornirea generatorului de ecrane.
Pentru a modifica proprietăţile mai mutor obiecte se face selectarea acestora iar apoi, prin intermediui opţiunilor subineniului Object, se fac schimbănie dorite perifru toate obiecteie selectate. Pentru selectare se acţionează butonul Selection pointer, aflat în partea stângă a ferestrei de configurare (primul buton), şi apoi se realizează un click pe obiectul de selectat. În continuare pot fi selectate alte obiecte (alături de primul) acţionând simuftan tasta SHIFT şi butonul stâng al mouse-ului după ce cursorul a fost poziţionat pe obiect.
Selectarea obiectelor se poate face şi printr-o zonă de marcare în modul următor:
- se acţionează butonul Selection pointer;
- se mută cursorul în colţul din stânga sus al zonei ce cuprinde obiecteie de selectat;
- mentinând butonul stâng al mouse-ului apăsat, se deplaseazâ mouse-ul până când se plasează în zona de selecţie toate obiectele dorite;
- apoi se eliberează butonul mouse-ului, obiectele conţinute total sau parţial în zona de marcare vor fi setectate.
Deseori este necesară (sau este dorită) o aliniere a obiectelor. O aliniere perfectă se poate realiza alegând opţiunea Align to Grid din submeniul Screen, după ce au fost selectate obiectele care sunt implicate în această operaţie. Dacă s-a ales opţiunea Snap to Grid din acelaşi submeniu, alinierea obiectelor se va face automat (obiectele ce sunt aşezate pe aproximativ aceeaşi linie sau coloană).
Proprietăţile caroiajului de linii la care se face alinierea pot fi stabilite în fereastra de dialog Ruller/Grid care va fi deschisă pe ecran dacă se alege opţiunea cu acelaşi nume din submeniul Screen.
Folosind butoanele radio din secţiunea Ruler Lines (din această fereastră) se poate specifica un caroiaj vizibil (Yes) sau nu (No) pe ecran. Pot fi de asemenea alese unităţile de masură iar închiderea ferestrei se face acţionând declanşatorul OK.
În fereastra de configurare unele obiecte pot fi suprapuse astfel încât cel mult unul să fie vizibil în întregime. Aducerea în prim plan a unui obiect din mai multe suprapuse, se face selectând obiectul, alegând optiunea Bring to Front din submeniul Screen. În mod asemănător selectând un obiect aflat în prim plan, prin intermediul opţiunii Send to Back din submeniul Screen, obiectul este plasat în ultimul plan al imaginii. Plasarea unui obiect în poziţie centrală în cadrul liniei curente se face prin selectarea lui şi alegând opţiunea Center.
În realizarea ecranelor apar o serie de situaţii în care este necesară efectuarea aceloraşi operatii asupra mai multor obiecte. Aceste obiecte pot fi grupate, astfel încât ele să se comporte unitar ele putând fi manipuiate ca un obiect. Pentru gruparea obictelor ele sunt selectate, după care se alege opţiunea Group din submeniul Screen. Operaţia inversă se realizează alegând opţiunea Ungroup, după ce grupul de obiecte a fost selectat.
Font-ul textului conţinut într-un obiect se alege din fereastra de dialog Font deschisă pe ecran prin selectarea obiectului şi alegerea opţiunii Font din submeniul Screen. În mod asemănător, prin intermediul opţiunii Text Alignment din acelaşi submeniu, se stabileşte tipul de aliniere a textului în cadrul unui obiect.
Un model de fond şi culoarea de fond pentru un obiect se specifică prin intermediu! opţiunii Fill, respectiv Fill Color. Opacitatea sau transparenţa unui obiect se stabilesc cu ajutorul opţiunii Mode. Pentru marginile obiectelor pot fi stabilite culori prin intermediu! opţiunii Pen Color. Grosimea şi tipul marginilor chenarelor şi a! chenarelor rutunjite se specifică prin opţiunea Pen. Parcurgerea obiectelor unui ecran cu ajutorul tastaturii (TAB pentru ordinea directă şi SHIFT+TAB pentru ordine inversă) se face în ordinea definirii lor,
Ordinea de parcurgere poate fi modificată prin fereastra de dialog Object Order deschisă prin alegerea opţiunii cu acelaşi nume din submeniul Screen. În această fereastră se află o listă cu toate obiectele de control definite. Ordinea din listă coincide cu ordinea de parcurgere a lor după generare. Schimbarea ordinii se face astfel:
- se poziţionează cursorul mouse-ului pe linia aflată în stânga obiectului a cărui ordine se doreşte a fi schimbată;
- menţinând butonul stâng apăsat, se deplasează mouse-ul mutându-se şi obiectul în poziţia dorită;
- eliberând butonul mouse-ului operaţia va fi încheiată.
Dacă din fereastra Obiect Order se ateae butonul radio By Row după generare obiectele vor fi accesate de la stânga la dreapta, linie cu linie, pornind din partea superioară a ecranului. Accesul va fi de sus în jos, pe coloane de la stânga la dreapta dacă se alege butonul By Column. Închiderea ferestrer de dialog se facp folosind declanşatorul OK.
        Pentru fiecare pachet de instrucţiuni specificat de utilizator se deschide câte o fereastră de editare dacă se alege opţiunea Open All Snipets. Parcurgerea lor se face cu combinaţia de taste CTRL+F1 sau opţiunile submeniului Window.        Dacă majoritatea obiectelor unui ecran sunt câmpuri de editare corespunzând câmpurilor unei baze de date, crearea ecranului poate fi uşurată de utilizarea opţiunii Quick Screen (din submeniul Screen).      Prin alegerea acesteia va fi deschisă fereastra cu acelaşi nume iar câmpurile asociate câmpurilor de editare vor fi specificate în Constructorul de expresii deschis prin alegerea declanşatorului Fields.        Dimensiunea implicită a câmpului va fi cea din baza de date, dar poate fi specificată o altă lungime cu ajutorul câmpului de editare Max Field Width. Câmpurile de editare vor fi aşezate în ordine pe linii de la dreapta la stânga, sau pe coloane funcţie de butonul radio selectat (în secţiunea Field Layout). Dacă a fost activat comutatorul Titles, în apropierea câmpurilor de editare vor fi afişate numele câmpurilor bazei de date.        Dacă se selectează comutatorul Add Alias, la numele câmpului se va adăuga şi numele alias-ului iar dacă se alege comutatorul Memory Variables, pentru fiecare căsuţă îi este asociată o variabilă de memorie.      După ce a fost închisă fereastra de dialog Quick Screen, în fereastra de configurare vor apărea câmpurile de editare. Ecranul astfel creat poate fi completat cu alte obiecte de control sau obiecte grafice. Cu ajutorul opţiunii Save a submenuilui File este salvat ecranu! creat, informaţiile fiind păstrate în fişierul cu extensia .scx şi numele fiind cel al ecranului (pentru ecranul nostru INTROD.SCX).
        
           6.1.4 Generarea programului

         Opţiuniie pe baza cărora se va face generarea programului vor fi indicate în fereastra de dialog Generate Screen, deschisă cu opţiunea Generate din submeniul Program.
                               
        Generarea unui program se poate face pe baza unuia sau mai multor ecrane, ale căror nume sunt afişate în lista Screen Set. Ordinea în care numele apare în listă, coincide cu ordinea în care sunt preluate ecranele în scopul generării.
Modificarea în cadrul listei se face aşa cum s-a prezentat în paragraful anterior la ordinea de accesare a obiectelor. în acestă listă pot fi adăugate sau eliminate obiecte folosind dec!anşatoare!e Add şi Remove.
Vizualizarea pe ecran a obiecteior poate fi făcuiă în vederea unor modificări prin selectarea din lista Screen Set a unui nume după care se actionează declanşatorul Edit.
Utilizând declanşatorul Arrange se poate realiza o rearanjare a obiectelor pe baza cărora se face generarea programului. Modiflcarea se ia în considerare la generarea programului şi nu afectează forma ecranului aşa cum a fost salvată, caracteristicile lui.
Pe parcursul realizării ecranelor se pot deschide şi închide baze de date, fişiere index etc, se pot stabili relatii între bazele de date. Dacă se selectează comutatoarele Open Files şi Close Files, în program vor fi incluse automat instructiuni care realizează aceste operaţii. De asemenea în program vor fi incluse comenzi pentru definirea şi dezactivarea ferestrelor dacă au fost selectate comutatoarele Define Windows şi Release Windows. Dacă este selectat comutatorul Modal Screen, după generare numai ferestrele implicate în această citire pot fi activate (pe parcursul citirii obiectelor cu instrucţiunea READ).
Câmpurile de editare pot fi mărginite de câte un chenar dacă a fost selectat comutatorul Border for GETS. Folosind tasta TAB obiectele citite pot fi accesate în ordine o singură dată. Pentru ca citirea să devină ciclică (după citirea ultimului obiect să se revină la primul) la comanda READ trebuie adăugată opţiunea CYCLE prin selectarea comutatorului CYCLE Through Fields.
Se poate lucra concomitent cu mai multe ecrane care sunt incluse în acelaşi program care conţine o singură instrucţiune READ, sau poate fi generată o astfel de instrucţiune pentru fiecare ecran dacă s-a ales comutatorul Execute Multiple READS.
        Dacă este activat comutatorul Windows Objects, se va genera un cod program pentru o singură platformă Windows. Specificarea ferestrelor care vor fi accesate împreună cu ecranele se face prin intermediu! declanşatorului Asociatted Windows.
       Operaţia de generare se face acţionând declanşatorul Generate şi programul obiect poate fi studiat. în cazul nostru va fi generat programui INTROD.SPR, iar execuţia lui se va face cu optiunea Do ... din submeniul Program sau Screen din submeniul Run sau mai simplu prin comanda:
           DO INTROD.SPR


6.2 Generatorul de rapoarte

         În procesul de prelucrare este de o mare importanţă posibilitatea de afişare a rezultatelor. Acestă operaţie (care este ultima din procesul de prelucrare care cuprinde introducerea, prelucrarea, extragerea şi prezentarea datelor) poate fi făcută prin două metode:
             - prin programe - acestea conţin instructiuni de afişare a informaţiilor conţinute în baze de date şi în variabile de memorie, dar au dezavantajul finalizării grafice mai laborioase, modificărite în program se fac mai greu şi necesită cunoaşterea !imbajului de programare la un nivel superior;
            - prin utilizarea generatorului de rapoarte, metodă mai facilă.

            6.2.1 Fereastra de configurare a raportului

Folosirea generatorului de rapoarte presupune:
         - pornirea generatorului, deschizând fereastra de configurare; crearea raportului este mult uşurată de faptul că fereastra este împărţită în benzi orizontale, de dimensiune variabilă şi care poate fi modificată (se pot adăuga linii şi se pot şterge linii care reprezintă secţiuni ale raportului;
      - în interiorui benzilor se definesc obieciele specifice generatorului (obiecte text, obiecte grafice, obiecte câmp şi obiecte câmp calculate); .
- odată creat, raportul se salvează şi el poate fi tipărit folosind opţiunea Report din subbmeniul Database sau cea cu acelaşi nume din submeniu! Run, sau prin comenzi specifice (REPORT FORM).
    Cu ajutomlui generatorului de rapoarte pot fi definite foarte uşor obiecte în benzile de configurare. Astfel pentru exemplificare va fi creat un raport având la bază înregistrările bazei de date NOM.DBF care satisface următoarele cerinţe
                           

      - conţine denumirea, pretul, şi grupa pentru toate materialele
- pentru fiecare grupă, denumirea apare în ordine alfabetică;
- după ultima denumire va fi afişat un total cu numărul materialelor din grupă;
- la sfârşitu! raportu!ui este afişat numărul tota! de materiale.
      Forma tipărită va fi asemănătoare celei de mai sus:
     Dacă se doreşte o grupare a datelor după anumite criterii este necesar ca baza de date în care se extrag datele, să fie sortată sau indexată după cheia care dă criteriile de grupare.           Cheia poate cuprinde mai multe criterii, fiecare corespunzând unui nivel de grupare al informaţiilor.
      În cazul nostru baza de date va fi indexată după grupă+den. Pentru generarea indexului vom utiliza comenzile:
        USE nom
        INDEX on grupă+den to indnom
        lar după aceasta va fi pornit generatorul de rapoarte cu comanda:
        CREATE REPORT nume
             unde nume este numele raportului.
       Se mai poate folosi pentru crearea raportului opţiunea New din submeniul File.
                                          
         Pornirea raportului începe cu pomirea generatomlui cu comanda CREATE REPORT lista. Astfel pe ecran va fi deschisă fereastra de configurare a raportului, iar în bara meniului sistem vor fi incluse doiiă optiuni: Object şi Report.
     Deschiderea ferestrei de configurare în scopul unor modificări asupra unui raport creat anterior (şi salvat) se face cu comanda:
       MODIFY REPORT nume
sau cu opţiunea Open din submeniui Fiie. Pot fi deschise mai multe ferestre de configurare (în măsura existen’ei memoriei disponibile) dar numai una este activă într-un anumit moment. Cu optiunile Cut, Copy şi Paste din submeniul Edit, obiectele pot fi mutate sau copiate dintr-o fereastră în alta.
       Indiferent de conţinutul unui raport, în interiorul lui pot fi puse în evidenţă: titlul raportului, titlul de pagină, corpul raportului, totalurile de pagină, totalurile raportului. Acestor elemente componente le corespund benzile oriontale, dimensiunile putându-se modifica după necesităţi. .
     După pomirea generatorului de rapoarte, în fereastra de configurare se pot observa trei benzi: Page Header, Detail şi Page Footer. În afară de acestea se pot include în raport următoarete benzi: Title, Group Header, Group Footer şi Summary. Dacă raportul este structurat pe coloane, în fereastra de configurare vor apărea benzile Column Header şi Column Footer. Dimensiunea verticală a unei benzi poate fi modificată acţionând cu mouse-ul asupra butonului aflat în marginea stângă a ferestrei de configurare, la nivelul benzii respective.
       Caracteristicile benzilor sunt:
    - Title - (banda de titlu) conţinutul ei apare o singură dată la începutul raportului (titlul raportului);
      - Page Header - (banda superioară de pagină) - conţinirtul ei apare în partea superioară a fiecărei pagini (antet de pagină);
       - Column Header - (bandă superioară de coloană) - continutul apare la partea superioară a fiecărei coloane (antet de coloană);
      - Group Header - (banda superioară de grup) - obiectele incluse în bandă apar la începutul fiecărui grup (antet de grup);
    - Detail - (banda de detalii) - obiectele incluse contin informaţii din fiecare înreqistrare a bazei de date deci contine informatiile importante ale raportu!ui;
     - Group Footer - (banda inferioară de grup) - informaţiile apar în partea inferioară a fiecărui grup, de obicei contine totalizâri pe grup;
     - Column Footer - (banda inferioară de coloană) - conţinutul ei este tipărit la sfârşitul fiecărei coloane;
    - Page Footer - (banda inferioară de pagină) - conţinutul benzii este tipărit la partea inferioară a fiecărei pagini - obişnuit conţine totaluri la nivel de pagină, număru! paginii, data etc.
    - Summary - (banda rezumat) - conţinutul benzii este afişat o singură dată la sfârşitul raportului. Conţine de obicei totaluri la nivelul întregului raport, informaţii privind editarea sa etc.
În scopul introducerii în raport a benzii de titiu, se alege optiunea Title/Summary din submeniul Report, deschizând asffel fereastra de dialog cu acelaşi nume. Pentru a introduce o bandă de titlu se alege comutatorul Title Band din secţiunea Report Title, iar selectarea comutatorului Summary Band se va adăuga banda Summary. Dacă se alege comutatorul New Page se trece la pagină nouă şi apoi se pot deschide alte benzi.
        Prin intermediul ferestrei de diafog Page Layout se stabilesc caracteristiciie generale ale raportului şi se realizează deschiderea acestei ferestre prin alegerea opţiunii Page Layout din submeniul Report.
        Cu ajutorul zonelor de editare Columns, Left Margin, Column Width şi Space Between Columns se indică numărul de coloane, distanţa faţă de marginea stângă la prima coloană, lătimea coloanelor şi spaţiile dintre coloane. Mărimile se măsoară în centimetri sau inches (butonu! radio Cm sau Inches). Dacă raportul este structurat pe coloane, dimensiunea benzii de detalii, a benzii superioare de coloană şi a celei inferioare, ca şi a benzilor de grup vor fi micşorate după specificările făcute în fereastra Page Layout referitoare la dimensiunea coloanelor.
      Riglele afişate la marginea superioară şi stângă a raportului pot fi gradate în inces sau centimetri (butoanele radio din secţiunea Dimension). Un obiect de tip câmp poate mai multe elemente (pentru fiecare înregistrare) el fiind în zona de detaliu. Acestea se dispun în ordine de la stânga la dreapta şi de sus în jos sau invers, ordine specificată folosind butoanele radio din sectiunea Print Order.
       Dacă este ales butonul Printable Page din secţiunea Print Area, aria paginii tipărite este determinată în mod automtat de sistem, după tipul imprimantei. Rapotul va umple întreaga pagină dacă a fost selectat butonul radio Whole Page din această secţuine. Caracteristici suplimentare privind imprimanta pot fi specificate prin acţionarea declanşatorului Print Setup când este deschisă o fereastră.
      În fereastra de dialog Environment (deschisă prin acţionarea declanşatorului cu acelaşi nume din fereastra Page Layout) pot fi salvate, refăcute sau şterse utilizând obiectele de control existente aici. Font-ul implicit al raportului se poate specifica prin intermediul declanşatorului Font.
       Închiderea ferestrei de dialog Page Layout se face acţionând declanşatorul OK revenind în fereastra de configurare.

        6.2.2. Obiecte generate de rapoarte

 
      În mod similar cu generatorul de ecrane, în generatorul de rapoarte (ferestra de configurare) se pot defini diverse obiecte:
  • obiecte text – care sunt folosite pentru a da utilizatorului anumite explicaţii cu privire la conţinutul raportului:
  • obiecte câmp – care conţin vizualizarea datelor cuprinse în baza de date (sau bazele de date) sau variabile de memorie, sau valoarea obţinută prin evaluarea unor expresii;
  • oboecte grafice – linii, chenare, chenare rotunjite folosite pentru îmbunătăţirea lizibilităţii şi a aspectului raportului;
  • imagini – se folosesc pentru îmbunătăţirea aspectului raportului şi pentru a oferi diverse informaţii.

         OBIECTE TEXT

    În fereastra de configurare şi în forma fmaiă a raportuui texteie sunt identice. Deci introducerea unui text într-o anumită bandă din raport, va duce la apariţia acelui text în zona respectivă a raportului. De exemplu textul LISTA introdus în banda de titlu, va duce la apariţia acestui text la începutul listei.
       Definirea obiectelor se face cu ajutorul butoanelor dispuse vertical în marginea stângă a ecranului de configurare. acţionând butonul al doilea şi mutând cursorul în dreapta în locul de plasare al oboectului, se apasă pe butonul stâng şi se introduce textul. Operaţia se încheie apăsând pe butonul stâng al mouse-ului.

         OBIECTE CÂMP

      Se acţionează butonul al treilea şi se mută cursorul în poziţia dorită pentru câmpul respectiv, după care se apasă din nou butonul stâng al mouse-ului. Astfel apare pe ecran o fereastră de dialog (Report Epresion) unde se specifică proprietăţile obiectului. Acţionând declanşatorul Expresion, se introduce numele câmpului din baza de date, expresia formată cu un câmp al bazei de date, sau o variabilă de memorie. Formatul de ieşire se stabilişte prin intermediul declasnşatorului Format iar codiţiile de tipărire vor fi specificate în fereastra de dialog Print When, ce va fi deschisă prin acţionarea declanşatorului cu acelaşi nume. Alinierea obiectului câmp la partea superioară sau inferioară a benzii în care se află şi modificarea dimensiunii verticale a acestuia în funcţie de volumul de date pe care îl cnţine, vor fi realizate prin selectarea butoanelor radio Top-Constant Field-Height, Bottom şi Top-Field Can Strech.
     Prin declanşatorul Comment se pot face comentarii referitoare la obiect. Utilizând declanşatorul Calculate poate fi definit un câmp calculat (totaluri la nivel de obiectele de grup sau total general, numărare, medii etc). Prin închiderea ferestrei definirea va fi încheiată.

         OBIECTELE GRAFICE

        Se acţionează butonul corespunzător din marginea stângă a ferestrei de configurare (câte unul pentru linii, chenare şi chenare rotunjite) şi se mută cursorul îndreapta unde va fi plasat obiectul. Menţinând butonu! stâng apăsat, se deplasează mouse-ul până când obiectul grafic ia dimensiunile dorite. Eliberând butonul mouse-ului operaţia va fi încheiată. Caracteristici suplimentare se pot specifica din submeniul Object (după ce obiectul respectiv a fost selectat).

         OBIECTE iMAGINI

     O facilitate existentă în FoxProWo reprezintă posibilitatea manipulării fişierelor de tip imagine (.bmp) sau a câmpurilor cu conţinut general. Pentru a include o imagine într-o listă se procedează astfel:
         - se acţionează ultimul buton din stânga ferestrei de configurare;
         - se mută cursoru! în locul de amplasare pentru obiect;
      - cu butonul stâng apăsat se deplasează mouse-ul controlând astfel o zonă în care va fi plasat obiectul;
       - la eliberarea butonului, pe ecran va fi deschisă fereatra de dialog Report Picture în care se stasbilesc proprietăţile obiectului.
      Prin alegerea butonului radio File în cadrul creat va fi inclusă o imagine extrasă dintr-un fisier cu extensia .bmp. Dacă a fost selectat butonul Field, va fi inclus conţinutul unui câmp de tip general.
     Utilizatorul poate stabili cum va fi inclusă o imagine diferită ca mărime faţă de zona rezervată pentru depunerea ei astfel:
  • dacă imaginea este mai mare, prin selectarea butonului Clip Picture în raport se va afişa doar o porţiune din imagine (partea de sus);
  • selectând butonu! Scale Picture - Retain Shape, imaginea va fi redusă/mărită proporţional la dimensiunile rezervate pentru obiect;
  • imaginea va umple tot cadrul rezervat dacă se selecteazâ Scale Picture – Fill the Frame (eventual cu diustorsionarea imaginii).
         În cazul includerii unui câmp de tip general, selectând butonul  Center Picture imaginea va fi depusă în centru.
      În fereastra de dialog Print When deschisă prin acţionarea butonului cu acelaşi nume, pozitia imaginii va fi raportată la partea superioară a benzii dacă este ales butonul radio Top şi la partea inferioară dacă este ales butonul Bottom. Comentarii pot fi specificate prin intermediul declanşatorului Comment.
Manipularea obiectelor se face prin selectarea lor iniţială aşa cum s-a arătat la generatorul de ecrane. Opţiunile submeniului Object au aceleaşi utilizări.

            6.2.3 Submeniul REPORT
      Pentru a crea raportul nostru (lista alfabetică pe filiale a angajaţilor) este necesară gruparea înregistrărilor după filială. Crearea sau modificarea unei benzi de grup se face prin intermediul ferestrei de dialog Data Grouping, deschisă pe ecran alegând opţiunea Data Grouping din submeniul Report.
                          

        În lista Group din fereastră vor fi afişate cheile de grupare (indexare) de sus în jos. Numărul lor nu poate depăşi cifra 20. Schimbarea ordinii de afişare a cheilor se face selectând cheia şi folosind combinaţiiie de taste CTRL+PgUp şi CTRL+PgDn sau cu mouse-ul deplasând cursorul cu butonul stâng apăsat după ce a fost selectată cheia care se doreşte a fi mutată.
           Pentru a crea o bandă de grup se alege declanşatorul Add, deschizând astfel fereastra de dialog Group Info.
        Cheia asociată benzii va fi indicată prin declanşatorul Group sau în câmpul de editare alăturat. Operatiile referitoare la schimbarea cheii vor fi indicate utilizând comutatoarele When             Group Changes, Begin:
- New Column - se trece la o coloană nouă
- New Page - salt la pagină nouă
- New Page (Page No=1) – se trece la pagina nouă (cu număr=1) ,
        Dacă se acţionează comutatorul Reprint Heder On SubSequent Pages, titlul de grup va fi tipărit la începutul fiecărei pagini pe care acesta este afişat (grup pe pagină nouă). Pentru a evita situaţiile în care un grup ar putea apărea în partea inferioară a unei pagini se foloseşte zona de editare If Less Than ... Below Header, Begin New Page în care poate fi stabilită o distanţă minimă între titlu şi marginea superioară a paginii. Prin închiderea ferestrei de dialog Group Info se revine în fereastra Data Grouping numele cheii de grup fiind inclus în lista Group din fereastră.
Pentru modificarea unei chei de grup sau a proprietăţilor sale se selectează numele cheii şi se acţionează declanşatorul Change. În fereastra deschisă se fac modificările dorite după care se închide fereastra cu revenire în fereastra Data Grouping.
Ştergerea unei benzi de grup se face acţionând declanşatorul Delete după selectarea cheii ce se doreşte a fi ştearsă. Închiderea ferestrei Data Grouping se face acţionând declanşatorul OK.
În raportul nostru (şi în general în rapoarte) este necesar să afişăm totalul unor câmpuri (la nivel de grup sau pe total înregistrări). Acest lucru se face prin definirea unui câmp calculat:
- se acţionează butonul al treilea din fereastra de configurare şi se mută cursorul în zona pentru câmp (în general în banda Group Footer, Column Footer sau Summary);
- apăsând butonul stâng al mouse-ului se deschide fereastra de dialog Report Expression;
- se foloseşte dedanşatoru! Expression sau câmpu! de editare alăturat unde se introduce câmpul sau expresia pe baza cărora se realizează operatiile matematice dorite;
- se deschide fereastra de dialog Calculate Field prin acţionarea declanşatorului Calculate;
- în fereastră se specifică momentul (locul) reiniţializării valorii din obiectul calculat care poate fi:
End of Report - la sfârşitul bazei de date (sfârşitul raportului);
End of Page - la sfârşit de pagină;
End of Group (sau Column) - la sfârşitul grupului sau al coloanei.
     Se va stabili apoi operatia matematică ce va fi efectuată cu valorile conţinute în câmp:
     Nothing - nici o operaţie
     Count - numărare
     Sum - însumare
     Average - media aritmetică
      Lowest - valoarea minimă din cele existente
      Highest - valoare maximă din cele existente
      Std. Deviation – abaterea medie pătratică a valorilor
      Variance – patratul abaterii medii pătratice
    Acţionând declanşatorul OK se revine în fereastra de dialog Report Expression şi se încheie operaţia de creare a câmpului calculat.
     Într-o serie de cazuri sunt necesare operaţii care nu se reţin în baze de date ci în variabile de memorie. În acestea se retin rezultate partiale ale calculelor sau rezultafe finale.
     Crearea, ştergerea şi modificarea vahabilelor de memorie se poate face şi prin intermediul ferestrei de dialog Report Variables deschisă prin alegerea opţiuni Variables din submeniul Report.
                                       

       Pentru a crea o variabilă de memorie, din fereastra de dialog Report Variables se alege declanşatorul Add, deschizând fereastra Variable Definition.
Caracteristicile variabilei pot fi indicate folosind obiectele conţinute în aceastâ fereastră;
       - în zona de editare Variable Name se va trece numele variabilei 
   - expresia de calcul a valorii variabilei va fi precizată în zona de editare aflată sub declanşatorul Value to Store ... sau cu ajutorut constructorului de expresii pornit prin acţionarea acestui declanşator;
     - valoarea iniţială (în general 0 pentru însumări sau 1 pentru multiplicări) va specificată în zona de editare aflată sub decianşatoru! Initial Value... Această valoare poate fi specificată şi prin intermediul constructorului de expresii;
      - variabila creată în acest fel va fi ştearsă din memon'e după terminarea afişării raportului în cazu! activării comutatoruiui Release After Report;
     - utilizând lista ascunsă Reset, se poate specifica o condiţie de reinitializare a variabilei (la sfârşitul raportului, la sfârşit de pagină sau la sfârşit de grup);
    - tipul de operaţie matematică se introduce după ce s-au acţionat butoanele radio din secţiunea Calculate; semnificaţiile acestor butoane fiind cele prezentate după care fereastra se închide (OK).
    Pentru a modifica proprietăţile unei variabile de memorie, din secţiunea Variables sa ferestrei de dialog Report Variables se selectează numele variabilei care va fi modificată şi se alege declanşatorul Change. În fereastra Variable Deflnition deschisă pe ecran se fac modificările dorite. Ştergerea unei variabile se realizează prin alegerea declanşatorului Delete după ce a fost selectat numele variabilei.
Ordinea de afişare a variabitelor coincide cu ordinea evaluării !or la tipărirea raportului. Dacă o variabilă cuprinde în expresia ei o altă variabilă, atunci aceasta trebuie definită înaintea celeilalte. Ea trebuie deja să fie calculată la evaluarea variabilei compuse.
Raportul creat poate fi vizualizat pe ecran folosind opţiunea Page Preview din submeniul Report. Este vizuaiizată iniţiai prima pagină a raportului pe ecran, pagina pate fi mărită sau micşorată (Zoom In, Zoom Out), se trece la pagina următoare (Next) sau la cea anterioară (Previous). închiderea se face acţionând declanşatorul OK.
Afişarea în bara de stare a coordonateior curente a!e cursoruiui depinde de opţiunea Show Position. Alinierea automată la caroiaj se face alegând opţiunea Snap to Grid.. Proprietăţile caroiajului se stabilesc prin intermediul opţiunii Ruller/Grid din meniul Report.
Un raport simplificat poate fi creat în mod rapid folosind optiunea Quick Report din acelaşi submeniu. La selectarea opţiunii se deschide o fereastră de dialog în care pot fi specificate obiectele câmp ce vor fi introduse în raport şi modul de dispunere Ibr, Realizarea raportului se încheie folosind optiunea Save din submeniu! File.
Pentru a continua crearea raportului nostru definim benzite de t!t!u şi banda rezumat, alegând opţiunea Title/Summary din submeniul Report. în fereastra de dialog deschisă se vor acţiona comutatoarele Title Band, şi Summary Band pentru crearea celor două benzi după care se acţionază declanşatorul OK.
În scopul creării benzii superioare şi inferioare de grup se va selecta Data Grouping din submeniul Report, vom acţiona declanşatorul Add şi vom crea în fereastra ce se deschide prin intermediul constructorului de expresii pornit la acţionarea declanşatorului Group grupul GRUPA după care se închid ferestrele folosind declanşatoarele OK.
Pentru ca riglele să fie gradate în pixeli, din fereastra de dialog Ruller/Grid (submeniul Report), se setectează butonul radio Pixels.
Coordonatele curente a!e cursorului vor fi vizibile în partea inferioară a ferestrei de configurare prin alegerea optiunii Show Position (submeniui Report).
Acţionând cu mouse-ul asupra fiecărei benzi se modifică mărimile acestora astfel încât să aibă dimensiunile verticale ca exemplu:
Title 75
Pagge Header 40
Group Header 1 (Grupa) 0
Detail 24
Qroup Footer 1 (Grupa) 40
Page Footer 0
Summary 45
Se introduce în banda de titlu fextul:
NOMENCLATOR DE MATERIALE „INDUSTRIA LINII”
şi textele
DEN PRET GRUPA (în banda de titlu pagină)
Numar de materiale (în banda inferioară degrup)
Numar total materiale (în banda rezumat)
Pentru a crea banda de detaliu (cu care eu de obicei încep crearea unui raport se acţionează butonul al treilea din fereastra de configurare, se poziţionează cursorul în poziţia 220,205 (poziţia aleasă) şi se apasă butonul stâng al mouse-ului deschizând fereastra Report Expression. Prin intermediul constructorului de expresii (declanşatorl Expression) se alege câmpul Den (apoi PRET şi GRUPA) şi se închide fereastra (OK)
În aceeşi bandă se vor introduc câmpurile PRET (210,340) şi GRUPA (210,480).
Utilizând mouse-ul, cele trei obiecte vor fi redimensionate astfel încât dimensiunea verticală să fie egală cu cea a benzii iar cea orizontală se fie de 100 unitâţi (păstrând colţul din stânga jos fix).
Se va defini acum obiectul câmp calculat continând numărul total de materiale. În scopul creării acestui obiect se acţionează butonul al treilea, se poziţionează cursorul în poziţia dorită (240,500) şi se apasă butonul stâng al mouse-ului folosiind declanşatorul Expression, se introduce câmpu! "den", se actionează declanşatoru! Format, iar în fereastra deschisă se alege comutatoru! Center şi apoi OK.
Pentru a specifica faptul că obiectul respectiv este un obiect câmp calculat, se activează comutatorul Calculate şi în fereastra Calculate Field deschisă pe ecran, se alege butonul Count (numărare). Se închid apoi ferestrele actionând declanşatorels OK. În mod similar se crează în banda rezumat a raportului un obiect calcufat în mod identic (câmpul "den" se introduce pentru a fi contorizat) şi din lista ascunsă Reset aflată în fereastra de dialog Calculate Field se alege opţiunea End of Report.
Pentru a îmbunătăţi aspectul grafic al listei vor fi definite obiecte grafice după cum urmează:
           - un chenar rotunjit va încadra simetric banda titlu din raport;
         - o linie orizontată va fi creată sub obiectele text nume, prenume, filiala (pentru a detaşa explicatiile de continutul listei);
          - un chenar va încadra obiectele din banda inferioară de grup;
         - deasupra obiectelor din banda rezumat se poate crea o linie. În banda titlu din raport poate fi inclusă o imagine. Pentru aceasta se alege ultimul buton din fereastra de configurare (stânga), se mută cursorul în dreapta (48,88) şi se apasă butonul stâng al mouse-ului, deschizând astfel fereastra Report Picture. Prin intermediui declanşatorului File se selectează fişierul din care va fi extrasă imaginea (c:\foxprow\sample\organize\bmp\ house.bmp) după care se acţionează butonul radio Scale Picture – Fill the Frame. Se închide fereastra de dialog Report Picture actionând declanşatorul OK iar obiectul va fi redimensionat astfel încât cadrul imaginii să fie un pătrat cu aceeaşi dimensiune ca banda în care se află.
       Raportul poate fi previzualizat pe ecran folosind opţiunea Page Preview din submeniul Report.

         6.2.4 Salvarea şi afişarea rapoartelor

      Pentru încheierea construirii unui raport este obligatorie salvarea lui (în mod contrar raportul este pierdut). Pentru salvarea raportului se utilizează opţiunea Save din submeniul File şi se va salva raportul sub numele LISTA.FRX sau se va tasta simuitan CTRL+W ceea  ce are acelaşi efect.
        Numele raportului (în cazul nu s-a specificat la deschiderea ferestrei de cunfigurare) se va specifica prin intermediul declanşatorului Form sau în câmpul de editare alăturat.
       Pentru ca în momentul afişării listei să fie refăcută starea mediului din momentul salvării raportului, trebuie ca la salvare să fie ales comutatorul Environment. Dacâ nu este ales acesta, atunci lista creată va putea lista şi alte baze de date (care au structură identică) pentru că lista nu este legată nemijlocit de baza de date deschisă la crearea sa.
        Un raport simplificat poate fi creat adhoc prin intermediul declanşatorului Quick Report.
        La selectarea comutatorului Console On va fi afişată pe ecran lista, To Printer unde va fi specificată imprimanta sistemului. Dacă este ales obiectul de control Page Preview se va face o vizualizare a raportului pe ecran. Prin închiderea ferestrei de dialog Report operaţia de tipărire a listei va fi declanşată.
         Tipărirea unui raport (a unei liste) se poate face şi prin comenzi ale sistemului:
         REPORT [FORM file | ? ]
         [ENVIRONMENT]
         [scope] [FOR expl1] [WH!LE expl2]
         [HEADING expc]
         [NOEJECT]
         [NOCONSOLE]
         [NOOPTIMiZE]
         [PLAIN]
         [PREVIEW]
         [TO PRINTER | TO FILE file]
         [SUMMARY]
         [PDSETUP]

     Acestă comandă realizează listarea unui raport creat anterior. Opţiunile fotosite în comandă sunt:
         FROM file – specifică numele fişierului raport;
         ? – afişează numele tuturor rapoartelor;
       ENVIROMNENT - contextul salvat la crearea fişierului va fi restaurat (bazele de date, indexii, relaţiile create la crearea raportului).
           scope
        FOR exp!1
        WHILE expl2 - aceste clauze stabilesc setul de articole pentru care se construieşte lista
        HEADING - permite specificarea unui titlu suplimentar ce va apărea pe fiecare pagină a raportului. Dacă este specificată şi optiunea PLAIN aceasta are precedenţă
        NOEJECT - suprimă caracterul "form feed" înainte de începutul raportului (are ca efect neavansarea hârtiei la început de pagină la începutul unei noi liste).
        NOCONSOLE - interzice afişarea raportului pe ecran
     NOOPTIMIZE - sunt foarte puţine cazuri în care trebuie dezactivat Rushmore - de exemplu când o comandă modifică cheia index referenţiată în clauza FOR utilizată de rushmore
       PLAIN - permite tipărirea benzii page heading o singură dată, la începutul listei, suprimă tipărirea numărului de pagină la începutul fiecărei pagini.
       PREVIEW- face trimiterea listei numai pe ecran (în vederea verificării)
       TO PRINTER | TO FILE file - trimite raportul într-un fişier (to file) sau la imprimantă
       SUMMARY - nu tipăreşte liniile din banda deta!iu ci doar ce!e de tota! şi subtotal
     PDSETUP - foloseşte o setare a imprimantei salvată împreună cu fişierul de definire raport.
         Exemplu:
       REPORT FORM ANGAJATI TO PRINT NOEJECT
         sau
       REPORT FORM ANGAJATI TO PRINT NOEJE SUMMARY

         6.2.5 Folosirea rapoartelor create cu alte aplicaţii

 
       Transferul rapoartelor create sub DOS în varianta sub Windows se face ca şi în cazul ecranelor prin intermediui ferestrei de dialog Transporter. Varianta 2.6 a Fox-ului este compatibilă cu toate versiunile anterioare, chiar şi cu variantete create DBASE III, DBASE III+ şi DBASE IV eventual cu recrearea rapoartelor respective care este realizată automat. Dacă se doreşte o variantă îmbunătăţită a acestor rapoarte ca să includă şi posibilităţile specifice variantei FoxProW, este necesară modificarea acestor liste după preluarea lor în FoxProW care se realizează prin utilizând comanda:
        MODIFY REPORT nume
prin care se deschide fereastra de configurare şi se introduc elementele specifice dorite, după care este salvată lista cu respectivele modificări.
      Fereastra Transporter va fi deschisă pe ecran la deschiderea unui fişier de tip ecran, raport sau etichetă, creat în versiunea sub DOS a FoxPro-ului (sau într-o versine mai veche).
                              

 
         Platforma (sistemul de operare) sub care s-a creat lista va fi alesă din lista ascunsă Transport Objects From. Un font implicit pentru raport poate fi specificat prin intermediul declanşatorului Font. Acţionând declanşatorul Transport and Open fişierul va fi transformat şi deschis în generatorul de rapoarte (generatorul de ecrane sau de etichete) al variantei sub Windows.

          6.3 Componenta grafică FOXGRAPH
În variantele sub DOS ale FoxPro există o componentă care poartă numele FOXGRAPH şi care permite reprezentări grafice pornind de la o bază de date.
În varianta sub Windows nu există necesitatea completării Fox-ului cu o extensie deoarece există posibilitatea comunicării între FoxProW şi graficele specifice Windows-ului fiind prezent utilitarul Microsoft Graph.
În generaf, dată fiind multitudinea dafelor în bazele de date Fox este necesară costruirea unor baze de date sintetice obţinute prin filtrarea şi gruparea datelor, rezultatul fiind un volum mai mic de date, dar care aproximează fenomenul destul de bine, pentru a obţine un grafic explicit.
De exemplu dacă avem într-o bază de date cheltuielile zilnice ale unei societăţi comerciale în cursul unui an, analiza grafică a acestor date ar fi extrem de dificilă. Se poate însă (prin totalizare) construi o bază de date cu cheltuielile lunare, care pot fi analizate perfect.
       Vom considera baza de date COM.DBF care conţine totalurile cheltuielilor şi veniturilor lunare pe timpul unui an (1998). Structura bazei de date va fi:
                  LUNA     C   10
                  CHELT   N   10
                  VENIT    N   10
                  ...........
        - În figura "Reprezentare grafică" este prezentată reprezentarea obţinută prin modulul de reprezentări grafice.
Crearea unei reprezentări grafice în FoxProW presupune efectuarea operaţiilor:
- deschiderea bazei de date din care sunt preluate datele pe baza cărora se construieşte graficul (COM.DBF). Lansarea în executie a Asistentului pentru grafice (aplicaţia GENGRAPH.APP din directorul în care este instalat FoxProW-ul) obţinând astfel pe ecran prima din cele patru ferestre ale Asistentului (GraphWizard), prin intermediul căruia se pot specifica principalele caracteristici ale graficului;
- salvarea graficului într-un fişier pe disc, în vederea unei viitoare utilizări.
În scopul rezolvării problemei pe care ne-am propus-o prima operaţie ce trebuie efectuată este deschiderea bazei de date COM.DBF.
Baza de date din care sunt preluate pentru grafic datele poate avea în structura sa cel mult un câmp al cărui tip nu este numeric.
Aplicaţia GENGRAPH.APP: se alege opţiunea Application din submeniul Run şi din fereastra de dialog ce se deschide pe ecran se alege numele aplicaţiei (Gengraph.app).
Pe ecran va fi afişată prima ferestră a asistentului pentru grafice. Acţionând asupra unuia din butoanele radio poate fi selectat un tip de grafic (linie, bare verticale sau orizontate, suprafete etc). Parcurgerea ce!or patru ferestre GraphWizard se face prin intermediul declanşatoarelor aflate în partea inferioară a acestora:
- |<< - se activează prima fereastră;
- >>| - se trece la ultima ferestră;
                   
          - Next > - se activează ferestra următoare;
          - <Back • se trece la fereastra anterioară;
          - Cancel - operaţiile sunt anulate, păstrându-se asistentul,
      În ultima fereastră declanşatoru Next > este înlocuit cu OK, care încheie execuţia asistentului pentru grafice.
         Acţionând declanşatoru! Next> din prima fereastră, va fi activată a doua care stabileşte modul în care vor fi asociate şirurile de valori conţinute în câmpurile bazei de date axelor de coordonate în reprezentarea grafică. în fereastra a treia poate fi specificat un titlu pentru grafic acesta apărând deasupra sistemului de coordonate.
         Prin intermediul ultimei ferestre pot fi realizate trei operaţii: salvarea graficului, tipărirea acestuia la imprimantă, apelarea utilitarului Microsoft Graph prin care pot fi schimbate anumite caracteristici ale graficului.
     Tipărirea se face prin declanşatorul Print aflat în ultima fereastră. Pentru salvarea graficului se acţionează declanşatorul Save As, iar în fereastra deschisă se precizează numele unei baze de date în care se va face salvarea (un grafic va fi păstrat într-o înregistrare a bazei de date). Dacă numele bazei de date specificate este deja existentă, pe ecran va fi afişată o altă fereastră. Acţionând declanşatorul Append, la baza de date va fi adăugată o înregistrare nouă care va contine graficu! salvat, iar în cazul acţionării declanşatorului Owerwrite, graficul va fi suprascris peste cel din înregistrarea curentă.

             Structura bazei de date în care se face salvarea graficului este:
Numele şi tipul
Conţinut
graphname
C
10
         numele graficului
graphid
N 
  2
         identificatorul graficului
Graphtitle
C 
80
         titlul graficului
xaxis
C
12

         Numele câmpului care                       .........contine date pt. axa X 
flist
M
10
Numele câmpuiui care contine date pt. axa Y
olegraph
G
10
reprezentarea grafică ca un obiect încorporat
        Execuţia graficului se încheie prin selectarea declanşatorului OK în cazul în care s-a obţinut graficul dorit. Dacă se doresc modificarea unor carecteristici, pentru a porni utilitarul Microsoft Graph se procedează astfel:
        - se acţioneză declanşatorul Zoom, deschizând o ferestră care contine reprezentarea grafică curentă;
      - se porneşte utilitarul Microsoft Graph realizând un dublu click pe graficul afişat în acestă fereastră.
       Vor fi vizibile acum (parţial) două ferestre: Prima reprezintă un tabel care . conţine datele pe baza cărora se construieşte graficul, iar a doua conţine graficul în forma sa curentă. În partea superioară a ferestrei este vizibil meniul aplicaţiei.
         Realizarea (modificarea) graficului se realizează astfel:
         - se stabileşte formatul în care se afişează datele în celulele tabelului;
         - se alege tipul de grafic;
         - se. adaugă text la grafic (titlu şi textele explicative asociate axelor de coordonate);
         - se realizează anumite modificări dorite;
         - se actualizează graficul conform cu Microsoft Graph.
        Trecerea din tabel la grafic şi invers se face cu ajutorul opţiunilor Chart şi Datasheet din submeniul Window sau realizând un click pe fereastra care interesează.
        Folosind opţiunea Import Data din submeniul File pot fi importate în tabel date din alte fişiere decât baze de date. De asemenea prin intermediul opţiunii Open Microsoft Chart, poate fi deschis în Microsoft Graph un grafic creat în Excel. În acest caz datele şi opţiunile în care este construit graficul le vor substitui pe cele vechi preexistente.
      Cu opţiunea Include Row/Col se poate include o linie sau o coloană în grafic (Insert Row/Col din submeniul Edit). Graficul se va actualiza automat în momentul modificării (adăugării sau ştergerii) datelor din tabel.
        În mod implicit graficul este creat pe baza tuturor datelor din tabel. Pentru a exclude din grafic datete dintr-o linie sau coloană, se selectează o căsuţă (click pe o căsută) şi se alege optiunea Exclude Row/Col din submeniul DataSeries. În fereastra deschisă se specifică faptu! că este vorba despre o linie sau o coloană.
       Datete vor fi preluate din tabel pe linii (Series in Row în submeniul DataSeries) sau pe coloane (Series in Columns). Prin opţiunea Number din submeniul Format este ales formatul în care sunt afişate datele din tabel. Lăţimea unei coloane va fi stabilită (după selectare) cu opţiunea Column Width din submeniul Format. Font-ul folosit pentru text în tabel poate fi precizat pnn opţiunea Font.
      Calitatea graficului poate fi influenţată de tipul graficului. Sunt posibile şapte tipuri de grafice bidimensionale şi cinci tipuri tridimensionale, pentru fiecare existând mai multe variante. Selectatea tipului se face cu opţiunea Gallery;
        - Area - arie
        - Bar - bare orizontale
        - Column - bare verticale
        - Line - linii
        - Pie - cerc,elipsă (plăcintă)
        - XY Scatter - Grafic creat numai pe bază de valori numerice
        - Combination - combinaţie de două tipuri de grafic.
      Pentru graficele tridimensionale pot fi selectate: Area, Bar, Column, Line, Pie. Vaciantele se aleg dipă alegerea tipului din fereastra Chart Gallery. Prin acţionarea declanşatrului Custom din fereastra Chart Gallery se pot alege caracteristici suplimentare pentru grafic. Prin alegerea unei opţiuni din submeniul Gallery, eventualele specificări suplimentare făcute anterior de utilizator vor fi pierdute. Pentru a evita acest lucru, se utilizează opţiunea Chart din submeniul Format.
      Este posibilă rotirea graficului în jurul axelor, precum şi modificarea distanţei (dintre grafic şi punctul de observare a lui. Aceste operaţii se realizează în fereastra de dialog Format 3-D View deschisă prin alegerea optiunii 3-D View din submeniul Format.
       Un grafic XY Scatter este creat pe baza a cel mult două şiruri de valori numerice, fiecare punct din grafic corespunzând unei perechi de valori, în mod implicit, prima serie va fi asociată axei X. Pentru a modifica această asociere se foloseşte opţiunea PlotOnXAxis din submeniul DataSeries. Această opţiune va fi aleasă după selectarea anterioară a unei căsuţe din coloana care va fi asociată axei X.
       Optiunea Combination permite includerea în aceeaşi reprezentare grafică a două grafice distincte, unul de bază peste care va fi suprapus un grafic de acoperire. Seriile de date vor fi împărtite în mod egal între graficul de bază şi cel de acoperire. Pentru un număr impar, jumătate plus unu din numărul seriilor va fi inclus în graficul de bază. Pentru a transfera o serie din graficul de bază în cel de acoperire, se alege opţiunea Move To Overlay. În md similar cu opţiunea Move To Chart se poate transfera o serie din graficul de acoperire în cel de bază.
       Prin alegerea opţiunilor Chart şi Overlay din submeniul Format (şi alegerea unor opţiuni suplimentare) se poate evita pierderea unor opţiuni referitoare la grafic.
      Prin submeniul Chart se pot stabili o serie de opţiuni. Cu opţiunea Titles se pot stabili titlul, şi identificatori pentru axele de coordonate. Pentru a putea edita un identificaior se realizează două click-uri (nu unul dublu) pe acesta. Încheierea editării se face printr-un click în afara identificatorului.
    Pentru afişarea valorilor graficului pe ecran se utilizează opţiunea DataLabels din submeniul Chart.
       Pentru punerea în evidentă a unor elemente din grafic (care în Microsoft Graph se face printr-o săgeată îndreptată spre elementul respectiv), se alege opţiunea Add Arrow din submeniul Chart. Va fi creată o săgeată care poate fi îndreptată spre orice element cu ajutorul mouse-ului. Se pot crea astfel mai multe săgeţi (care la început sunt suprapuse şi nu se disting decât prin selectare şi mutare cu mouse-ul}.
       Cu Delete Arrow după selectarea unei săgeti aceasta poat fi ştearsă.
    Cu opţiunea Add Legend se adaugă legenda în grafic iar cu Delete Legend ea este ştearsă. Poziţia şi alte proprietăţi ale legendei se pot specifica prin opţiunea Legend din submeniul Format.
    Prin opţiunea Axes din submeniul Chart se deschide o fereastră de dialog şi prin intermediul comutatoarelor din această fereastră se poate introduce sau elimina din eprezentarea grafică valorile asociate diviziunilor axelor de coordonate. Densitatea caroiajelor corespunzătoare axelor se stabileşte prin intermediul ferestrei de dialog Gridlines deschisă la alegerea opţiunii cu acelaşi nume din submeniul Chart. Caracteristici suplimentare pot fi stabilite cu opţiunile din submeniul Format (titlu, legenda, axele de coordonate, săgeţi) iar grosiumea liniilor şi fondul unui obiect selectat se pot stabili cu ajutorul opţiunii Patterns. Cu opţiunea Font se pot stabili dimensiunile, stilul, culoarea şi fondul pentru textul selectat. Alinierea şi orientarea acestuia se stabilesc folosind opţiunea Text, iar proprietăţi referitoare la axele de coordonate prin intermediul opţiunii Scale. Paleta de culori poate fi modificată cu opţiunea Color Palette din submeniul Format.
     Caracteristicile oricărui element al graficului se pot specifica în fereastra deschisă prin reaiizarea unui ciick dublu pe elementui respectiv.
     Graficul se poate depune într-un câmp de tip general folosind opţiunea Copy Chart din submeniul Edit. Inserarea graficului în câmp, ulterior se poate face prin opţiunea Paste Special.
     Salvarea graficului creat în Microsoft Graph se face prin alegerea opţiunii Update din submeniul File. După părăsirea Microssoft Graph folosind opţiunea Exit and Return din submeniul File şi revenirea în fereastra asistentului pentru grafice se poate face cu declanşatorul Save As pentru salvarea graficului într-o bază de date.
Realizând un click în afara ferestrei ce conţine graficul aceasta va fi închisă revenindu-se în cea de a patra fereastră GraphWizard.

          6.4 Generatorul de etichete

         Etichetefe sunt forme simplificate de prezentare a datelor existente în baza de date. În general o etichetă se constituie cu datele existente într-o înregistrare a bazei de date (existând câte o etichetă pentru fiecare înregistrare). , .
        Pentru crearea etichetelor se pomeşte generatorul de etichete care este asemănător cu generatorul de rapoarte. Utilizatorul are posibilitatea să aleagă dintr-o mulţime de forme predefinite de etichete. După alegere se porneşte geberatorul de etichete în modul următor:
  • se alege opţiunea New din submeniul File sau se tastează comanda:
CREATE LABEL nume_etichetă
  • pentru modificarea unei etichete se foloseşte opţiunea Open din submeniul File sau comanda:
MODIFY LABEL nume_etichetă
       Pe ecran va fi afişată o fereastră din care se va alege o formă predefinită de etichetă.  Forma se referă la dimensiunile benzii de detaliu şi la numărul de etichete care vor fi tipărite pe aceeaşi linie. Apoi pe ecran se va deschide o fereastră de configurare a raportului în care banda de detalii va avea caracteristicile etichetei.
     Crearea etichetei se face ca în cazul raportelor. Etichetete pot conţine de exemplu numele persoanei şi adresa (o carte de vizită).
        


Pentru crearea unor etichete se procedează în felul următor;
- se deschide baza de date;
- se introduce comanda: CREATE LABEL etich
- din lista aflată în fereastra de dialog New Label se selecteză forma dorită a etichetei şi apoi se acţionează declanşatorul OK.
- prin intermediul declanşatorului Expression se aleg câmpurile ce trebuie introduse în etichetă, revenindu-se apoi în fereastră;
- se actionează declanşatorul Format, şi în fereastra deschisă se activează comutatoarele To Upper Case şi Center (dacă se doreşte acest lucru pentru schimbarea modilui de scriere, cu litere mari/mici şi centrat).
- se închid ferestrele acţionându-se OK.
- în mod simiiar se definesc celelalte câmpuri (adresa, funcţia);
- pentru centrarea obiectelor se poate alege opţiunea Center din submeniu! Object;
- se poate alege opţiunea Font pentru alegerea fontului (bold) după selectarea obiectului;
- tot în banda de detalii se poate construi un chenar cu care se încadrează obiectele;
- pentru safvarea informaţiilor se aleg succesiv opţiunile Page Layout din submeniul Report şi declanşatorul Save, după care se revine în ferestra de configurare;
- cu Page Preview poate fi vizualizată eticheta (Report);
- se salvează eticheta cu opţiunea Save din submeniul File.
Afişarea eticheteior se face prin intermediu! opţiunii Label din submeniul Database sau Run. Dacă se foloseşte submeniul Database, pe ecran se va deschide o fereastră de dialog identică cu cea din fereastra Report utilizată la afişarea rapoartelor.

        6.5 Generatorul de filtre

      Un filtru reprezintă un procedeu de selectare a unor înregistrări din numărul total al înregistrărilor unei baze de date (sau din mai multe baze de date puse în relaţie). De exemplu din toţi angajaţii prezenţi în baza de date personal.dbf ne interesează doar cei care au fost angajaţi începând cu 1998. Un filtru rezolvă această problemă şi furnizează doar datele cerute unei proceduri nde vizualizare (browse, listă, raport etc).
       Realizarea unui filtru se poate face în afară de comenzi FoxPro prin generatorul de filtre în felul următor:
      - se deschide fereastra de configurare a filtrului (fereastra RQBE - Relational By Query by Example - cerere relaţională prin exemple);
       - se specifică bazele de date din care vor fi extrase datele;
      - se stabilesc condiţiile de legătură între bazele de date (dacă avem mai multe baze de date – în general este vorba de un câmpo comun);
      - se specifică câmpurile din care vor fi extrase datele;
      - se stabileşte succesiunea în care vor fi prezentate rezultatele;
      - se grupează datele extrase (dacă este necesar);
      - se stabileşte modui de prezentare a datelor rezultate;
      - se specifică un criteriu de selecţie a datelor;
      - se salvează filtrul;
                                  

      
        - se poate trece la execuţia filtrării.
       Vom lua ca exemplu crearea unui filtru având ca problemă extragerea din baza de date personal.dbf a numelui, prenumelui şi a telefonului angajaţilor născuţi după anul 1980.
Pomirea generatorului de filtre se realizează prin intermediul opţiunilor New (pentru creare) şi        Open (pentru modificare) sau cu comenzile:
       CREATE QUERY nume_filtru
       MODIFY QUERY nume_filtru
    La pomirea generatorului pe ecran va apărea fereastra: RQBE. Dacă în momentul deschiderii ferestrei în zona de lucru există o bază de date deschisă, numele ei va fi afişat în secţiunea Database a ferestrei. Altfel utilizatorul va trebui să specifice într-o ferestră de dialog deschisâ anterior ferestrei RQBE, numele bazei de date (bazelor de date) din care vor fi extrase datele.
      Dacă se doreşte adăugarea unei baze de date pentru extragerea datelor, se acţionaeză declanşatorul Add din fereastra RQBE.
      La deschiderea unei baze de date în cazul în care există şi alte baze de date, pe ecran va fi deschisă fereastra RQBE Join Condition, în care se pot specifica eventualele legături între bazele de date. Pentru a deschide o bază de date după ce a fost selectat numele acesteia în secţiunea Databases, se acţionează declanşatorul Clear.
    Dacă filtrul lucrează mai mult decât cu o bază de date, pentru fiecare bază de suplimentară se poate preciza o condiţie de legătură.
       De exemplu să presupunem că datele despre angajaţii unei intreprinderi sunt păstrate în două baze de date. Pentru a extrage toate datele despre o persoană trebuie consultate ambele baze de date. Acest lucru este posibil dacă există un câmp comun (de exemplu marca) în ambele baze de date, identic iar una din baze este sortată sau indexată (condiţiile stabilirii unei relaţii între două baze de date).
                          


      La fiecare deschidere a unei baze de date suplimentare, pe ecran se va deschide o fereastră (RQBE Join Condition) pentru stabilirea condiţiilor de legătură între cele două baze de date.
     Din iista ascunsă aflată în partea stângă a ferestrei se seiectează un câmp pe baza căruia se va face legătura cu altă bază de date (un câmp comun bazelor de date). Tipul comparaţiei care va fi făcută între câmpuri se selectează din lista ascunsă aflată în centrul ferestrei, astfel:
     - Like - se verificâ dacă vatoarea conţinută în câmpul al doilea este inclusă în primul câmp;
       - Exactly Like - se verifică dacă cele două câmpuri sunt absolut identice;
      - More Than - se verifică dacă valoarea continută în câmpul ales în prima listă ascunsă este mai mare decât cea din a doua listă ascunsă;
      - Less Than - se verifică dacă prima valoare este mai mică. Din a doua listă ascunsă se alege un câmp din aită bază de date. Dacă se urmăreşte ca la comparare să nu se facă diferenţe între majuscule şi minuscule, se activeazâ comutatorul Ignore Upper/Lower Case, se închide fereastra acţionând declanşatorul OK.
     Pentru a modifica o condiţie de legătură se poziţionează cursorul mouse-ului pe numele câmpului de legătură, după care se relizează un click dublu pe butonul stâng,. iar în fereastra deschisă se fac modificările dorite. Pentru ştergerea unei condiţii se selectează numele câmpului de legătură după care se acţionează declanşatorul Remove.
     Prin intermediul ferestrei de dialog RQBE Select Fields care se deschide la acţionarea comutatorului Fields, se pot specifica câmpurile bazei de date care sunt incluse în filtru.
                            
     În secţiunea Table Fields sunt afişate numele câmpurilor disponibile prin alegerea cărora acestea vor fi mutate în secţiunea Selected Output. Aceasta conţine numele câmpurilor şi a expresiilor care sunt incluse în rezultatele fumizate de filtru,
  Mutarea numelor de câmpuri între ceie două secţiuni se face prin intermediul declanşatoarelor Move (mutare din secţiunea Table Fields în Selected Output), All (care se referă la toate câmpurile care sunt la fel mutate), Remove (sunt mutate câmpurile selectate din Selected Output în Table Field) şi Remove All (mută la fel dar toate câmpurile). Mutarea se poate face şi print-un click dublu după ce cursorul a fost pozitionat pe câmpul de mutat. Specificarea unei expresii care va fi inclusă în rezultatele filtrului se face prin intermediul listei ascunse Functions.
      Dacă este activat comutatorul No Duplicates, în cazul înregistrărilor identice numai una va fi inclusă în rezultatele filtrului. În cazui în care rezultatele sunt reprezentări grafice, se activează comutatorul Cross Tabulate. Închiderea ferestrei de dialog se face acţionând declanşatorul OK.
      Informaţiile rezultate datorită unui filtru pot fi ordonate funcţie de criteriile utilizatorului. Prin activarea comutatorului RQBE Order By se deschide fereastra RQBE Order By unde se fac aceste precizări.
     În lista Selected Output a ferestrei sunt afişate numete câmpurilor din care au fost extrase date, iar lista Ordering Criteria va conţine numele câmpurilor după care se face ordonarea. Mutarea câmpurilor dintr-o secţiune în alta se face ca şi în fereastra Selected Fields prezentată anterior. După ce s-a selectat un nume din secţiunea Ordering Criteria, folosind butoanele radio din secţiunea Order Option, se stabileşte modul de ordonare: Ascending - în ordine crescătoare, Descending - în ordine descrescătoare.
        La execuţia filtrului se realizează:
        - dacă !ista Ordering Criteria conţine cel putin un câmp, datele extrase vor fi ordonate în ordinea acestuia;
       - dacă această listă contine mai multe câmpuri şi în primul câmp mai multe înregistrări contin aceeaşi valoare, atunci acestea vor fi ordonate după cel de al doilea câmp din lista Ordering Criteria.
        Închiderea ferestrei se face prin acţionarea declanşatorului OK.
                                         

      Dacă este necesar ca în rezultatele date de filtru să nu apară înregistrări care conţin într-unul din câmpuri valori identice, se poate face o grupare a înregistrărilor după anumite criterii precizate de utilizator. Gruparea se face prin intermediul ferestrei deschise !a activarea comutatorului Group By.
     Specificarea câmpurilor după care se face gruparea se realizează prin selectarea numelor acestora din secţiunea Fields in Table urmată de acţionarea declanşatorului Move. Numele câmpurilor care au fost mutate apare în sectiunea Group By Fields realizându-se gruparea după aceste câmpuri. (Acţionând declanşatorul Remove se realizează mutarea inversă). Actionând declanşatorul OK fereastra va fi închisă.
                                 


       Stabilirea condiţiilor ce trebuie îndeplinite de grup pentru ca el să fie inclus în rezultatele furnizate de filtru, se face în fereastra de dialog RQBE Search Condition ce va fi deschisă la actionarea declanşatorului Having.
     Condiţiile pe baza cărora se face selectia înregistrărilor care sunt fumizatede filtru se stabilesc cu ajutorul obiectelor de control aflate în partea inferioară a ferestrei RQBE. Din lista ascunsă Field Name se alege un nume de câmp sau o expresie (opţiunea expression ... porneşte constructorul de expresii) ce va fi un termen al condiţiei.
      Pentru a alege tipul comparatiei se alege una dintre opţiunile Like (grupul de caractere trebuie să fie inclus în câmp), Exactiy Liks (identic), More Than (mai mare), Less Than (mai mic), Between (între) sau in (în) din lista ascunsă alăturată. Dacă este activat comutatorul Not se obţine inversarea (negarea) condiţiilor respective.
      În câmpul de editare Example se completează partea a doua a condiţiei În acelaşi mod pot fi create mai multe condiţii. Dacă este necesară inserarea unor condiţii peste altele create anterior se procedează după cum urmează:
       - se selectează conditia deasupra căreia va fi inserată o alta;
       - se acţionează declanşatorul Insert;
       - se introduce noua condiţie.
    Ştergerea unei condiţii se realizează prin selectarea acesteia şi apoi declanşatorului Remove.
       În mod implicit o înregistrare este furnizată de filtru numai dacă sunt îndeplinite cumulativ toate condiţiile impuse. În acest caz condiţiile sunt combinate cu operatorul logic AND (şi). Pentru ca acestea să fie combinate cu operatorul OR (sau), se procedează astfel:
  • se acţionează declanşatorul Or din fereastra RQBE sau se alege opţiunea cu acelaşi nume din submeniul RQBE; o bandă care conţine textul OR va fi afişată sub ultima opţiune selectată; această bandă împarte grupul în două, combinate între ele cu operatorul logic OR; deci o înregistrare va fi selectată de filtru dacă îndeplineşte condiţiile din prima sau a doua parte (separate între ele prin banda OR);
  • acestă linie poate fi mutată utilizând tastele direcţionale sau mouse-ul.
     Modul în care sunt extrase rezultatele filtrului pot fi precizate printr-o serie de opţiuni prezente în lista ascunsă Output din fereastra RQBE:
       Browse - Informatiile sunt prezentate într-o fereastră BROWSE
       Report/Label -... sunt prezentate ca raport sau etichete;
       Table/DBF -... sunt prezentate ca o bază de date;
       Cursor -... sunt introduse într-o bază de date temporară;
       Graph - datele sunt prezentate grafic. La executie este apelat generatorul de grafice.
     În cazul prezentării sub forma unui raport sau a unei etichete, activând comutatorul Options pe ecran va fi deschisă fereastra de dialog RQBE Display Options prin intermediu! căreia se poate preciza:
        - Screen Display - rezultatele sunt afişate pe ecran;
        - Report - se afişază un raport;
        - Label - se afişază o etichetă;
        - numele raportului (sau etichetei) va fi precizat prin declanşatorul Form Name;
        - o formă simplificată de raport - declanşatorul Quick Report;
        - vizualizarea datelor pe ecran - comutatom! Page Preview;
   - prezentarea unor rezultate sumare (banda summary) - declanşatorul Summary Information Only;
        - salt la pagină nouă - comutatorul Eject Page Before Report;
      - un titlu de raport - declanşatoru! Report Heading sau în câmpul de editare alăturat încadrat între apostroafe;
        - titluri de coloane - comutatorul Suppress Column Headings;
        - tipărirea şi la imprimantă - comutatorul Console On;
        - pauză !a umplerea ecranului - comutatoru! Pause Between Screens;
        - trimiterea datelor la imprimantă - comutatorul To Printer;
        - trimiterea datelor într-un fişier - comutatorul To File;
      - rezultatele filtrului vor fi suprascrise peste vechiul conţinut dacă este activat comutatorul Owerwrite File şi vor fi adăugate în caz contrar.
      Comanda SELECT pe baza specificărilor făcute în fereastra RQBE, poate fi vizualizată în orice moment prin actionarea declanşatorului See SQL, Execuţia filtrului a fi realizată prin acţionarea declanşatorului Do Query. După ce a fost făcută salvarea (folosind opţiunea Save din submeniul File) şi a fost închisă fereastra RQBE, filtrul poate fi executat ca orice alt program prin comanda:
        DO nume_filtru
      În urma creării unui filtru este creat un fişier (care poate fi vizualizat cu comanda MODlFY COMM) cu numele său şi extensia .qpr.
        Problema propusă se rezoivă în felul următor:
  • se deschide fereastra RQBE (CREATE QUERRY filtru)
  • se alege baza de date personal.dbf
      - se activează fereastra RQBE Select Fields pentru a selecta câmpurile ce vor fi incluse în rezultat;
      - se aleg în ordine câmpurile: nume, prenume, telefon;
      - ţinând cont că numele selectate în filtru trebuie să fie prezentate în ordine alfabetică, se alege comutatorul Order By şi în fereastra deschisă se aleg câmpul nume şi apoi butonui radio Ascending; la fel se procedează şi pentru câmpul prenume, după care se închide fereastra.
     - pentru a stabili condiţia de selecţie a înregistrărilor se alege câmpul D_NAST din lista ascunsă aflată în partea inferioară a ferestrei RQBE şi opţiunea More Than din lista ascunsă alăturată; în câmpui de editare alăturat se scrie 01.01.1980
      - se salvează filtrul şi se închide fereastra RQBE. Filtrul poate fi executat cu comanda:
      DO filtru.qpr


         6.6 Generatorul de meniuri

      Operaţiile ce se efectuează în cadrul unei aplicaţii mai complexe prin gruparea lor şi utilizarea unui program monitor, pot fi mai bine coordonate şi utilizate. De asemenea utilizarea unui program monitor (numit în acest paragraf "meniu") pemite operarea în program de către persoane care nu cunosc programul în complexitatea sa,.pe baza unui minim de instrucţiuni de operare.
    În general un program monitor este construit în jurul unui meniu principal. Pentru a introduce o comandă, utilizatorul va alege opţiunea corespunzătoare din meniu. În acest fel se face o comunicare eficientă între aplicaţie şi utilizator. Crearea meniurilor utilizatoruiui se face priri două metode;
      - prin scrierea linie cu linie a programelor;
      - prin intermediul generatorului de meniuri.
    Generatorul de meniuri crează un program, pe baza opţiunilor date de uitliizator, prin a cărui execuţie se defineşte şi se activează meniul creat. Pentru crearea unui meniu trebuie parcurse următoarele etape:
       - pornirea generatorului de meniuri;
      - în fereastra afişată pe ecran, se stabilesc numele opţiunilor, operaţiile declanşate prin alegerea acestora şi caractristicile generale ale meniului;
       - pe baza celor specificate se generează meniul.
    Ca exemplu va fi generat un meniu prin intermediul căruia se vor lansa programele generate anterior (cu generatoarele): introd.spr, raport.frx, eticheta.lbx şi filtru.qpr; schema meniului fiind prezentată în cele ce urmează:
                                  

         Mai întâi trebuie pornit generatorul cu comanda:
        CREATE MENU nume_meniu
sau utilzând opţiunea New din submeniul File.
       Pentru a modifica un meniu se poate utiliza comanda MODIFY MENU nume_meniu sau opţiunea Open din submeniul File.
      Pe ecran va apărea astfel fereastra de configurare a meniului iar la meniul sistem va fi adăugat submeniul Menu.
                                  

            Definirea opţiunilor meniului se face pe mai multe nivele. Opţiunile bară se încadrează în nivelul 0 (cel mai prioritar, primul nivel), iar eventualele submeniuri corespunzatoare opţiunilor bară vor forma nivelul 1 al meniului. Submeniurile corespunzătoare opţiunilor de nivel 1 vor forma nivelul 2 ş.a.m.d.
         Crearea unui meniu începe cu definirea opţiunilor bară. Numele acestora vor fi scrise în ferestra de configurare a meniului, în câmpurile de editare din coloana Prompt. Grupul de caractere "\<" poate fi utilizat pentru a defini taste directe de selectare a opţiunilor. Dacă acest grup este folosit, primul caracter devine tastă de selectare directă. După generare meniul va fi activat fotesind tasta ALT. În continuare orice opţiune bară poate fi selectată utilizind tastele de selectare directă, tastele direcţionale sau cursorul mouse-ului (click). Prin alegerea unei opţiuni bară va fi declanşată actlunea corespunzătoarei barei respective. Această acţiune poate consta în afişarea unui submeniu, în executatea unui program (o comandă FoxPro) sau o procedură.
        Pentru a specifica tipul de acţiune care va fi declanşată, se alege una din opţiunile listei ascunse Result:
       - Submenu - se va afişa un submeniu; pentru a crea sau modifica submeniul se alege declanşatorul alăturat (Create sau Modify), trecând la definirea nivelului următor al meniului;
      - Command - comanda ce va fi scrisă în câmpul alăturat va fi executată la alegerea opţiunii (comanda poate fi DO program); :
        - Pad Name/Bar - în câmpui de editare aiăturat se va introduce o opţiune bară;
       - Procedure - corpul procedurii care va fi asociată opţiunii bară va fi scrisă în fereastra deschisă prin acţionarea declanşatorului Create.
     Caracteristici suplimentare pentru opţiunea bară pot fi specificate prin intermediui ferestrei de dialog Prompt Options, deschisă pe ecran prin actionarea declanşatorului Options din fereastra de configurare a meniului.
                                         
        În căsuţa text Comment a acestei ferestre pot fi descrise comeritarii. Acestea nu vor fi luate în considerare la execuţia programului generat,
        O cale directă (tastele de alegere directă) poate fi specificată prin intermediul ferestrei de diaiog Shortcut. După ce aceasta a fost deschisă prin activarea comutatorului cu acelaşi nume, calea directă va fi specificată prin apăsarea unei combinaţii de taste. închiderea ferestrei Shortcut se va face prin selectarea declanşatorului OK.
       O condiţie de accesare a opţiunilor poate fi făcută prin intermediul Skip For. Când este selectată o opţiune, în partea inferioară a ecranului poate fi afişat un mesaj, indicând semnificaţia opţiunii respective. Acest mesaj este inclus introdus intermediul comutatorului Message.
      Un nume pentru opţiunea bară poate fi scris în ferestra de dialog deschisă prin acţionarea declanşatorului Pad Name. Închiderea ferestrei Prompt Options se face prin alegerea declanşatorului OK. ,
        Ordinea în care sunt definite opţiuniie bară în fereastra de configurare a meniului (de sus în jos) coincide cu ordinea în care acestea sunt afişate în bara meniului (de !a stânga la dreapta). După ce au fost definite opţiunite de nivel zero, se trece la definirea opţiunilor din nivelurile următoare.
      Trecerea de la un nivel la altul se face prin intermediul listei ascunse Menu Level. Definirea opţiunilor de submeniu se face în mod similar cu definirea opţiuilor bară, existând şi deosebiri. Între opţiunile unui submeniu pot fi interpuse linii separatoare. Pentru ca în partea inferioară a unei opţiuni de submeniu să fie afişată o linie separatoare, în fereastra de configurare, în căsuţa text aflată sub numele opţiunii se introduce şirul de caractere "\-".
        La definirea opţiunilor de submeniu, în lista ascunsă Result opţiunea Pad este înocuită cu optiunea Bar #. După alegerea acestei opţiuni în zona de editare alăturată se poate scrie un nume de opţiune. Inserarea unei opţiuni se face cu .ajutorul declanşatorului Insert. Alegerea acestuia permite definirea unei optiuni noi deasupra ceiei selectate anterior. Pentru a şterge o opţiune după selectarea ei se acţionează declanşatorul Delete. Aceste operaţii pot fi realizate şi cu ajutorul opţiunilor lnsert şi Delete din submeniul Menu. O testare parţială a meniului creat în fereastra de configurare se poate realiza prin declanşatorul Try It.
Poate fi utilizat un cod de iniţializare şi unul de finalizare pentru meniu, aceste operaţii fiind realizate înainte şi după activarea meniului.
     Meniul creat poate înlocui meniul activ sau poate fi adăugat celui activ. Aceste caracteristici pot fi specificate prin intermediul ferestrei de dialog General Options, care se deschide cu aceeaşi opţiune din submeniul Menu.
         Acţionând declanşatorul Setup sau Cleanup sau declanşatorul Edit, poate fi spcificată o procedură care va fi executată la alegerea oricărei opţiuni barâ a meniuiui, pentru care nu a fost specificată o acţiune anumită. Poziţia meniuiui nou creat în raport meniu! activ va fi stabilită fotosind butoanete radio din secţlunea Locatiors.
         Replace - meniul activ va fi înlocuit de cel creat;
         Append - meniul va fi adăugat coexistând cu cel activ (în dreapta)
         Before - meniul va fi inclus in ce! activ, înaintea optiunii alese din lista ascunsă
         After - meniul va fi la fel inclus după opţiunea bară selectată din lista ascunsă alăturată
         Închiderea ferestrei se reaiizează prin acţionarea declanşatorului OK. .
       Pentru definirea unei proceduri asociate unei opţiuni bară sau unui submeniu se poate folosi a doua opţiune din submeniul Menu. Prin alegerea acesteia, în zona de editare a ferestrei deschise pe ecran (sau prin intermediul declanşatorului Edit poate fi specificată o procedură asociată submeniului. Aceasta va fi executată în cazul alegerii din suibmeniu a unei opţiuni, pentru care nu a fost stabilită actiunea ce va fi executată prin alegerea acesteia.
       În cazul în care meniul are o structură asemănătoare cu cea a meniului sistem, devine foarte eficientă folosirea opţiunii Quick Menu din submeniul Menu (sub opţiunea General Options). Prin alegerea acestei opiţuni în zona de editare a ferestrei sau prin intermediul declanşatorului Edit, poate fi specificată o procedurâ asociată meniului. Aceasta va fi executată în cazul alegerii unei opţiuni, pentru care nu a fost stabilită acţiunea ce va fi executată prin ategerea acesteia.
    După precizarea structurii meniulu!, acesta va fi salvat folosind opţiunea Save din submeniul File. Pentru generarea programului se alege opţiunea Generate din submeniul Program, deschizând astfel o fereastră (Generate Menu) pe ecran. Numele.programului generat se va specifica prin declanşatorul Output File.
     În fereastra de dialog Options deschisă prin acţionarea declanşatorului Comment Options  pot fi precizate caracteristici suplimentare pentru meniu. Operaţia de generare va fi declanşată la alegerea declanşatorului Generate. Programul generat poate fi executat prin comanda DO ca orice alt program FoxPro.
        Pentru a realiza meniul propus ca exemplu se va proceda astfel:
        - în fereastra de configurare se scriu textele opţiuniior una sub alta:
Proceduri
Terminare
Informatii
- pentru a treia opţiune (Text), din lista ascunsă Result se alege optiunea Procedure şi se acţionează declanşatorul Create, iar în fereastra de editare alăturată se introduc comenzile:
Clear
          text
              Program meniu ca exemplu! Orice text
endtext
      - pentru a doua opţiune, din lista ascunsâ Result se alege optiunea Procedure şi se acţionează decianşatorul Create, iar în fereastra de editare atăturată se infroduc comenzile:
        SET SYSMENU TO DEFAULT
        CLOSE ALL
        CLEAR
     - pentru prima opţiune din lista ascunsă Result se alege optiunea Submenu apoi se declanşează Create, trecându-se astfel la definirea submeniului Operaţii:
       - se scriu unele sub altele textele asociate opţiunilor submeniului:
l\<ntroducere
\<Fi(tru
\<Lista
\<Etichetă
      - pentru opţiunea "Introducere" din lista ascunsă Result se alege opţiunea Command, iar în câmpul alăturat se introduce:
DO introd.spr
      - pentru opţiunea filtru se procedeză la fel:
DO filtru.qpr
  • din lista ascunsă asociată opţiunii Raport se alege Procedure, după care se acţionează declanşatorul Create şi în ferestra deschisă se introduc comenzile:
CLEAR
REPORT FORM lista ENVIRONMENT
    - la fel se procedează pentru opţiunea "Eticheta" după ce a fost alesă opţiunea  Procedure şi declanşatorul Edit:
        CLEAR
        LABEL FORM eticheta.lbx ENVIRONMENT
     - pentru a specifica codul de iniţializare al meniului se alege opţiunea General Options din submeniul Menu, iar din fereastra deschisă se selectează comutatorul Setup iar în această ferestră se scrie comanda:
        CLEAR
    - se revine în fereastra de configurare, acţionând butonul mouse-ului după ce cursorul a fost poziţionat în acestă fereastră;
     - se salvează meniul cu opţiunea Save din submeniul File.
  - se alege opţiunea Generate din submeniul Program iar în fereastra deschisă se actionează declanşatorul Generate.
       Programul obţinut, MENIU.MPR poate fi executat cu comanda:
       DO meniu.mpr

Cap 7. Lucrul în reţea

        Unul din principalele avantaje ale reţeletor de calculatoare în cazul FoxPro-ului este faptul că un fişier de date poate fi accesat concomitent de mai mulţi utilizatori, fără să fie nevoie ca fiecare dintre aceştia să posede o copie a fişierului pe staţia sa de lucru. În acest mod se economiseşte spaţiu de memorie şi timp.
        În domeniul bazelor de date mari, acest avantaj este esenţial, deoarece pe o staţie mică (cu un harddisk mic) acest fişier ar putea să nu încapă. Problema principală se pune de a partaja lucrul în aşa fel ca să nu se creeze conflicte între cei ce accesează
de date unică de date, asigurând securitatea datelor.
          Pentru a rula FoxPro-ul pe o staţie de lucru sunt necesare următoarele condiţii:
       - minim 480 Ko memorie disponibilă pe staţia de lucru (după încărcarea reţelei) sau 440Ko cu memorie expandată compatibilă LIM40, pentru versiunea standard.
         - minim 2MB memorie extinsă, pentru versiunea extinsă
      - se recomandă existenţa unui harddisk şi a memoriei extinse pe staţia de lucru dar acestea nu sunt obligatorii
      - un soft de reţea compatibil DOS 3.1 sau mai nou, care să suporte interfaţa BlOS standard cum sunt: 3Can3+, IBM PC Netware, Novell Advanced Netware (versiune minim 1.02), NovelNetWare 286 sau 386, Lantastic, lnvisible Net, etc.

7.1 Configurarea FoxPro pentru o staţie

      Pentru versiunea multiutilizator configurarea se rezumă la stabilirea conţintului a două fişiere:
      Fişierul CONFIG.FP (de configurare) care determină parametrii de utilizare ai mediului FoxPro şi fişierul de resurse FOXUSERS.DBF în care sunt memorate seturile de culori folosite, macrouri utilizate, caracteristici ale ferestrelor sistem etc. .... Încazul versiunii multiutilizator, fiecare utilizator va oferi o configuraţie specifică statiei de lucru, după resursele statiei. Acest lucru este uşurat de FoxPro datorită prezenţei unui program care realizează automat fişierele necesare în funcţie de opţiunea utilizatorului. Acest program este ADDUSER.PRG. El trebuie rulat pe fiecare staţie de lucru în parte, parcurgându-se următoarele etape:
       - se conectează la reţea staţia de lucru
       - se lansează FoxPro-ul intrându-se în mediul de lucru al acestuia.
       - se lansează în execuţie programul ADDUSER.PRG (do adduser)
     După stabilirea configuraţiei dorite ieşirea din program se face prin apăsarea tastei F10 sau pgDn, situaţie în care vor fi afişate următoarele opţiuni:
      Modify - se revine în program pentru anumite rectificări
Proceed - se declanşează configurarea staţiei de lucru pentru crearea fişierelor cerute.
      - Abort - se renunţă la configurare
     - Filer - declanşează utilitarul Filer pentru gestionarea fişierelor pe disc Selectarea opţiunii Proceed va determina crearea celor două fişjerp configurare şi de resurse, precum şi modificarea fişierului AUTOEXEC.BAT al staţiei de lucru, în vederea localizării corecte a fişierelor create anterior.
    Fişierul CONFIG.FP al statiei de lucru poate conţine una din următoarele opţiuni referitoare la lucrul în retea: OVERLAY, EDITWORK, SORTWORK, PROGWORK, TMPFILES RESOURCE. Acestea se referă !a locu! de depozitare a fişierelor temporare folosite în sistem, de exemplu cele ale editorului de texte (EDITWORK), sau indexarea bazelor de date (SORTWORK), cât şi la locul unde se găseşte fişierul de resurse (FOXUSER.DBF).
      Locul de depozitare al fişierelor temporare este important pentru viteza de lucru a staţiei, fiind mai mare atunci când se găsesc pe harddiskul staţiei de lucru. În timpul rulării Fox-ul accesează de multe ori fişierul FOXPROL.OVL şi timpul de rulare al programelor creşte cu cât creşte timpul de acces la acest fişier (pe hardiskul staţiei accesul este cel mai rapid). Acelaşi lucru se întâmplă cu celelalte fişiere dar importanţa lor nu este identică.Pornirea FoxPro-ului în versiunea 2 se face tastând FOXL.

7.2 Programarea multiutilizator

       Pentru evitarea conflictelor (de exemplu când un utilizator modifică o înregistrare a bazei de date şi un a!tul cere accesul !a ea, Fox-u! îi livrează o inregistrare "jumătate modificată şi jumătate nu" se fofoseşte blocarea înregistrărilor. În fox sunt blocate înregistrările atunci când un utilizator efectuează o operaţie asupra unei înregistrări.
Blocarea inregisiraniur se face la nivelul întregii baze de date sau la nivelul unei înregistrări sau a unui grup de înregistrări, Deschiderea unei baze de date exclusivă (pentru utilizarea ei de către un singur utilizator) se face prin comanda USE cu clauza EXCLUSIVE, care nu permite accesul celorlalţi utilizatori la baza de date respectivă.
        USE numeb EXCLUSIVE
realizează acest lucru (în Fox monoutilizator clauza exclusive este implicită).
       Se poate folosi comanda SET pentru a preciza modul în care se vor realiza următoarele deschideri ale linei baze de date:
       SET EXCLUSIVE ON│OFF
     SET EXCLUSIVE OFF permite accesul la înregistrările bazelor de date pentru acele baze ce se vor deschide sub această setare.
      Următoarele comenzi necesită deschiderea bazelor de date în modul excusiv:
      INDEX
      INSERT BLANK
      MODIFY STRUCTRURE
      PACK
      REINDEX
      ZAP.
     Folosirea bazelor de date de către un singur utilizator (utilizarea comenzilor de mai sus) se recomandă numai atunci când acest lucru este strict necesar. Pentru a nu se pierde inutil avantajele oferite de modul de lucru în reţea.
     Un alt mod de lucru este modul de lucru multiutilizator care este recomandat ori de câte ori acest lucru este posibil. În acest mod, mai mulţi utilizatori pot citi şi scrie în aceeaşi baza de date în acelaşi timp, dar o regulă esenţială limitează lucrul în acest mod: nu se permite totuşi scrierea unei înregistrări concomitent cu o altă scriere în aceeaşi înregistrare. (Noi recomandăm ca scrierea în bazele de date să se facă de la o anumită staţie, pentru a se evita modificarea bazei de date în mod nedorit). Deci înainte de scrierea unei date este necesară blocarea la scriere a înregistrării respective de către ceilalţi utilizatori.
      Acest lucru se poate realiză în două moduri:
      - blocarea automată - a accesului înainte de executarea unei comenzi;
    - blocarea manuală (explicită), folosindu-se comenzi speciale Blocarea automată la una sau mai multe înregistrări la scriere este realizată înainte de executarea unor comenzi, după care acest acces este deblocat.
    Comenzile care realizează acest lucru, cât şi înregistrările afectate, sunt date în tabelul de mai ios:

Comanda Domeniul înregistrărilor blocate
APPEND Întreaga bază de date
APPEND BLANK Antetul bazei de date (locul unde se depun informaţiile despre baza de date - structura)
APPEND FROM Întreaga bază de date
APPEND FROM ARRAY Antetul bazei de date
APPEND MEMO Înregistrarea curentă
BROWSE, CHANGE, EDIT Înregistrarea curentă şi toate înregistrările aflate în relaţie cu aceasta atunci când se începe editarea
DELETE Înregistrarea curentă
DELETE NEXT 1 Înregistrarea curentă
DELETE RECORD nr Înregistrarea nr
DELETE domeniu Întreaga bază de date
GATHER Înregistrarea curentă
INSERT SQL Antetul bazei de date
MODIFY MEMO Înregistrarea curentă când începe editarea
READ Înregistrarea curentă şi toate înregistrările aflate în relaţie cu aceasta.
RECALL Înregistrarea curentă
RECALL NEXT 1 Înregistrarea curentă
RECALL RECORD nr Înregistrarea nr
RECALL domeniu Întreaga baza de date.
REPLACE Înregistrarea curentă şi toate înregistrările aflate în relaţie cu aceasta.
REPLACE NEXT 1 Înregistrarea curentă
REPLACE RECORD nr Înregistrarea nr şi toate înregistrările aflate în relaţie cu aceasta.
REPLACE domeniu Întreaga baza de date şi toate înregistrările aflate în relaţie cu aceasta.
SHOE GETS Înregistrarea curentă şi toate înregistrările aflate în relaţie cu aceasta.
UPDATE Întreaga baza de date.
      Comenzile BROWSE, CHANGE, EDIT şi MODIFY MEMO vor bloca înregistrarea curentă numai atunci când se începe editarea acesteia, nu şi la deplasarea cursorului de la o înregistrare la alta, de-a lungul bazei de date.
       Pentru a ne proteja împotriva modificărilor bazei de date de exemplu în timpul unei listări, vom folosi blocarea cu ajutorul comenzii SET LOCK OFF | ON. După executarea listei se va realiza deblocarea (off).
      Această comandă activează (ON) sau dezactivează (OFF) blocarea automată a accesului la scriere înaintea executării următoarelor comenzi:
           AVERAGE DlSPLAY (dom) REPORT
           CALCULATE INDEX SORT
           COPY TO JOIN (amb. fiş) SUM
           COPY TO ARRAY LIST
          TOTAL COUNT LAB
         Chiar şi opţiunea on a acestei comenizi va permite accesul celorlalţi utilizatori la baza de date dar numai pentru citire.
         Cea de a doua metodă de blocare a înregistrărilor este metoda explicită, folosind una din funcţiile FLOCK(), RLOCK() sau LOCK().
        Funcţia FLOCK ([expn | expc]) încearcă blocarea la scriere pentru întreaga bază de date dacă funcţia este apelată fără nici un argument, sau cea specificată prijn parametrul transmis funcţiei reprezentând numărul zonei de lucru (expn) sa acestei zone (expc). Dacă s-a reuşit blocarea funcţia întoarce valoarea ,T., altfel .F.
         După blocarea bazei de date cu funcţia FLOCK(), ceilalţi utilizatori nu se vor mai putea scrie în respectiva bază de date, dar vor putea citi din aceasta, spre deosebire de comanda  USE EXCLUSIVE.
         Deblocarea bazei de date se face cu comanda:
         UNLOCK
         care realizează deblocarea întregii baze de date.
        În cazul în care baza de date a fost blocată de un alt utilizator, blocarea va eşua, funcţia retumând valoarea .F.
        Bazele de date care sunt în relaţie cu baza de date blocată, nu vor fi blocate automat de funcţia FLOCK(), e!e necesitând să fie blocate explicit prin comenzi acdecvate.
Blocarea accesului !a scriere pentru o înregistrare a unei baze de date se face prin fuincţiile RLOCK() sau LOCK() care sunt identice şi au sintaxa;
         RLOCK ([expn | expc1] | expc2, expn | expc1])
         LOCK ([expn | expc1] | expc2, expn | expc1])
         Funcţiile vor returna valorile:
        .T. - dacă s-a reuşit blocarea înregistrărilor respective
        .F. - în caz contrar
      expn sau expc identifică baza de date în care se blochează înregistrările respective.       Dacă aceşti parametri lipsesc, funcţia se referă la baza de date activă (din din zona de lucru curentă).
       În cazul în care şirul de caractere expc2 lipseşte, se va bloca accesul la scriere pentru înregistrarea curentă, iar dacă expc2 este prezent în apelul funcţiei, aceasta va conţine o listă cu numerele înregistrărilor ce vor fi blocate de functia respectivă, e!emente!e listei fiind separate prin virgulă.
      Blocarea mai multor înregistrări într-o bază de date este permisă numai dacă în comanda SET MULTILOCKS se utilizează setarea ON.
       Funcţiile vor returna valoarea .T. numai dacă toate înregistrările din listă au fost blocate.  Dacă nu s-a reuşit blocarea uneia sau mai multor înregistrări din listă, nici celelalte nu vor fi blocate, iar functia va returna valoarea .F,
     Deblocarea accesului la înregistrările blocate cu funcţiile LOCK() şi RLOCK() se face prin:
       - comanda UNLOCK();
       - închiderea bazei de date;
       - ieşirea din FoxPro;
       - comanda SET MULTILOCKS;
       - comanda FLOCK().
     Redăm în continuare un exemplu de program în care în baza de date se vor schimba între ele înregistrările 2 şi 3. Programul care realizează acest lucru este prezentat mai jos:
       set talk on
       clea
       close all
       on error do eroare
       set multilocks on
       use test in a
       use test in b again
       list for recno() >=2 .and. Recno() <= 3
       goto 2 in a
       goto 3 in b
        if rlock(1) =.t..and.rlock(2) =.t.
       NOTE se blockează înreg. curente din;
       zonete de lucru 1 şi 2 (a şi b)
       scatter memvar
       replace nume with b.nume, prenume with;
       b.prenume, suma with b.suma
       select b
       gather menvar
       select a
       endif
       use in b
       list for recno() >=2 .and. recno()<= 3
       use in a
       procedure eroare
       ? message ()
       ? error ()
       return
      În acest program linia IF RLOCK(1) =.t. .and. rlock (2) =.t. poate fi înlocuită cu una din liniile:
       IF RLOCK('1,2',1)
       IF LOCK('1,2',A)
       IF LOCK("1,2",B)
     Pentru ca într-o bază de date să se poată bloca accesul la scriere pentru mai multe înregistrări simultan trebuie activată această capacitate, prin comanda MULTILOCKS cu sintaxa următoare:
       SET MULTILOCKS ON | OFF
      Această comandă va permite (ON) blocarea simultană a mai multor înregistrări, sau nu va permite acest lucru (OFF). Când set multilocks este on blocarea înregistrărilor se va face prin apelarea repetată a acestor funcţii, înregistrările fiind blocate una după alta. Dacă set multilocks este off (implicit), nu se va putea bloca decât o înregistrare. Când se va încerca blocarea unei alte înregistrări, cea blocată va fi deblocată .
      Dacă într-un program blocarea nu a fost reuşită, funcţia întoarce valoarea .F. Şi execuţia programului continuă cu următoarea comandă.
     Comanda SET REPROCES determină repetarea un anumit timp a încercării de blocare înregistrărilor unei baze de date, Comanda are sintaxa:
      SET REPROCESS TO AUTOMATIC | TO expn [SECONDS]
expresia expn indică numărul încercăritor de blocare suplimentare (valoare 2 – 32000).
     - dacă clauza SECONDS nu este prezentă expn indică numărul suplimentar de încercări iar dacă este prezentă indică numărul de secunde cât se va încerca blocarea.
    Rutina ON ERROR are prioritate asupra încercărilor suplimentare din comanda SET REPROCESS.
      Valorile 0, -1, -2 ale expresiei expn se folosesc penTru a determina un număr nelimitat de încercări de blocare.
     Încercările de blocare se întrerup atunci când o încercare se tecmină cu succes, funcţia va returna .T.
        Diferentele între comenzile
        SET REPROCESS TO 0 şi
        SET REPROCESS TO -2
apar atunci când prin comanda ON ERROR s-a stabilit o rutină de executat în cazul apariţiei unei erori. În primul caz (expn este 0) rutina ON ERROR este executată în locul încercărilor suplimentare de blocare, iar când avem o blocare automată nu se vor executa nici încercărite suplimentare nici comanda ON ERROR, în cazu! în care expn
este -2:
     - la blocarea automată după acţionarea tastei ESCAPE se va executa comanda ON ERROR
      - la blocarea normală după acţionarea tastei ESCAPE nu se va executa comanda ON ERROR iar funcţia va returna valoarea .F.
      Comanda SET REPROCESS TO -2 este echivaientă cu comanda SET REPROCESS TO AUTOMATIC.
      Valoarea -1 a expresiei numerice (comanda SET REPROCEES TO -1) va determina repetarea încercării de blocare a înregistrării până când reuşeşte blocarea fără posibilitatea operatorului de a opri acest process. Încercările de blocare vor avea în acest caz întâietate asupra comenzii ON ERROR şi nu vor putea fi oprite prin apăsarea tastei ESCAPE.
       O altă metodă de repetare a încercării de blocare este folosirea comenzii RETRY.
    Această comandă returnează controlul programului apelant de nivel imediat superior, ultima linie executată a acestuia reexecutându-se. Folosind comanda într-o procedură sau o funcţie de tratare a erorii de blocare a înregistrărilor, se va obţine un
apel repetat al rutinei (procedurii sau functiei) până când se reuşeşte operaţia de blocare ca în exemplul următor:
         set talk off
         clear
         set reprocess to 0
         on error do eroare
         use test .
         if flock() =.t.
         sort to test_s on nume
         unlock
         use test_s
         list
         endif
         use
         procedure eroare
         retry

       În exemplul acesta se încearcă blocarea bazei de date TEST.DBF în vederea sortării. Dacă blocarea nu reuşeşte, va apărea o eroare, care va fi tratată de procedura EROARE. Execuţia acesteia va determina reexecutarea instrucţiunii IF şi deci reevaluarea functiei FLOCK(). În acest fel se va încerca blocarea tabelei până când se reuşeşte,
     Deblocarea accesului la scriere asupra unei înregistrări sau a unei baze de date se realizează prin comanda UNLOCK cu sintaxa:
        UNLOCK [IN expn | IN expc | ALL]
       Folosirea comenzii fără nici un argument va determina deblocarea tuturor. înregistrărilor blocate din baza de date activă, sau a bazei de date în întregime. Dacă se doreşte ca deblocarea să se refere !a a!tă bază de date decât cea curentă, aceasta va fi desemnată prin numărul zonei de lucru în care este deschisă (expn) sau aliasul ei (expc).
       Comanda UNLOCK ALL deblochează toate înregistrările din bazele de date deschise sau toate aceste baze de date.
       Pentru reîmprospătarea datelor de pe ecran a fost prevăzută comanda REFRESH cu sintaxa:
         SET REFRESH TO expn
      Această comandă permite reîmprospătarea conţinutului ferestrelor BROWSE, CHANGE, şi EDIT sau a celor deschise prin comanda MODIFY MEMO, la intervale
constante de timp, sau în funcţie de momentul deblocării unor date. Comanda acceptă
un parametru numeric (0-3600) care indică intervalul dintre reîmprospătări prima având loc după deblocarea înregistrărilor.
       Tipărirea în reţea este controlată de comanda SET PRINTER cu urrnătoarele trei forme:
      1. SET PRINTER TO [\\nume staţie\nume impr=dest]
      2. SET PRINTER TO [\\SPOOLER | NB]
          [\F=n] [\B=c][\C=n] [\P=n]
          [\S=server] [\Q=coadă]
      3. SET PRINTER TO [dispozitiv | fişier]
         Primul format dirijează ieşirea de imprimantă către o imprimantă a reţelei.
         nume staţie - reprezintă numele staţiei de lucru în cadrul reţelei.
         imprimantă - este numete atribuit imprimantei de către administratoml reţelei.
        - destinaţia - va fi desemnată prin dest care poate fi LPT1, LPT2 sau LPT3.
       Al doilea format al comenz!! se foloseşte sub NOVELL ADVANCED NETVARE 2.00 sau o versiune mai mare, optiunile având semnificaţiile;
       NB - nu se tipăreşte pagina de titlu (no banner)
       F=n - n = 0-255 şi pecizează forma de tipărire
     B=c - numele titlului (un şir de 12 caractere afişat pe pagina de titlu - implicit numele utilizatorului)
       C=n - numărul de copii (implicit C=1)
       P=n - desemnează imprimanta serverului reţelei, unde se va trimite textul de tipărit
       S=server - specifică serverul reţelei
       Q=coada - specifică numele cozii de aşteptare ataşate imprimantei respective
       SPOOLER - se introduce pentru compatibilitate (FoxPro îl ignorează).
      Al treilea format se foloseşte pentru a trimite ieşirea către un dispozitiv local sau un fişier.
    O ultimă funcţie se referă la testarea accesului la o înregistrare a unei baze de date.          Funcţia SYS(2011) are sintaxa:
      SYS(2011)
     Şirul de caractere returnat de această funcţie va constata starea înregistrării curente a bazei de date active:
       "Exclusive" - baza de date este deschisă pentru utilizare exclusivă
       "Record Unlocked" - înregistrare curentă neblocată
       "Record Locked" - înregistrarea este blocată de utilizatorul ce a iniţiat testarea.

     Utilizând comenziile şi funcţiile prezentate mai sus programele pot căpăta un plus de performanţă şi se poate utiliza de mai mulţi utilizatori aceeaşi bază de date situată pe un server de reţea de exemplu.

Niciun comentariu:

Trimiteți un comentariu