Gestiunea Comenzilor la Un Magazin Virtual

Prezentarea lucrării

Obiectivul lucrării

Lucrarea își propune creare unui magazin virtual care permite preluarea comenzilor de la clienți și gestinuea stocurilor.

Magazinul virtual este alcătuit două componente:

Site-ul care este accesat de către clienți

Baza de date a magazinului

Magazinul virtual perimite clienților

să se înregistreze ca și clienți ai magazinului

să poată vizualiza lista cu produse din magazin

să poată comanda produse

Personalul magazinului are posibilitatea să:

să gestioneze datele despre clienții magazinului

să gestioneze stocul de produse

să gestioneze comenzile clienților

să emită comenzi către furnizori

Structura aplicației

Aplicația este compusă din două părți:

Prima parte este un site scris pentru Microsoft Internet Explorer 4.0 și versiunile ulterioare. Pentru a putea rula, site-ul are nevoie ca următoarele componentele din Internet Explorer să fie instalate: DHTML Suport și VB Script Suport.

A doua parte este o bază de date nu numele db.mdb scrisă în Microsoft Access 97. În tabelele bazei de date sunt stocate toate datele despre magazin, produse și clienți. Cu ajutorul formularelor și rapoartelor se pot efectua toate operațiile necesare pentru funcționarea magazinului.

Funcțiile aplicației

Funcțiile sitelui.

Accesarea magazinului pe baza numărului client.

Permite clienților să introducă datele personale pentru a primi un număr client.

Vizualizarea listei cu produse din magazin.

Crearea unei liste de comenzi pe baza listei cu produse.

Selectarea modului de plată.

Informarea clientului despre înregistrarea comenzii și despre modul de plată

Funcțiile bazei de date.

Stochează toate datele despre clienți, produse, comenzi și funrnizorii produseleor

Verifică stocul unui produs înainte ca acesta să fie listat de către site.

Emite comenzi de aprovizionare pentru produse a căror stoc a scăzut sub limita minimă a stocului.

Procesează automat toate comenzile sau fiecare comandă în parte.

Emite factură pentru fiecare comandă

Emite chitanță pentru clienții care au plătit cu carte de credit

Listează toți furnizorii.

Listează furnizorul unui produs cu ajutorul codului produsului.

Listează podusul din care s-a vândut cea mai mare cantitate într-un interval de timp

Listează produsul din care s-a obținut cea mai mare încasare într-un interval de timp.mare încasare într-un interval de timp.

Prezentarea lucrării

Obiectivul lucrării

Lucrarea își propune creare unui magazin virtual care permite preluarea comenzilor de la clienți și gestinuea stocurilor.

Magazinul virtual este alcătuit două componente:

Site-ul care este accesat de către clienți

Baza de date a magazinului

Magazinul virtual perimite clienților

să se înregistreze ca și clienți ai magazinului

să poată vizualiza lista cu produse din magazin

să poată comanda produse

Personalul magazinului are posibilitatea să:

să gestioneze datele despre clienții magazinului

să gestioneze stocul de produse

să gestioneze comenzile clienților

să emită comenzi către furnizori

Structura aplicației

Aplicația este compusă din două părți:

Prima parte este un site scris pentru Microsoft Internet Explorer 4.0 și versiunile ulterioare. Pentru a putea rula, site-ul are nevoie ca următoarele componentele din Internet Explorer să fie instalate: DHTML Suport și VB Script Suport.

A doua parte este o bază de date nu numele db.mdb scrisă în Microsoft Access 97. În tabelele bazei de date sunt stocate toate datele despre magazin, produse și clienți. Cu ajutorul formularelor și rapoartelor se pot efectua toate operațiile necesare pentru funcționarea magazinului.

Funcțiile aplicației

Funcțiile sitelui.

Accesarea magazinului pe baza numărului client.

Permite clienților să introducă datele personale pentru a primi un număr client.

Vizualizarea listei cu produse din magazin.

Crearea unei liste de comenzi pe baza listei cu produse.

Selectarea modului de plată.

Informarea clientului despre înregistrarea comenzii și despre modul de plată

Funcțiile bazei de date.

Stochează toate datele despre clienți, produse, comenzi și funrnizorii produseleor

Verifică stocul unui produs înainte ca acesta să fie listat de către site.

Emite comenzi de aprovizionare pentru produse a căror stoc a scăzut sub limita minimă a stocului.

Procesează automat toate comenzile sau fiecare comandă în parte.

Emite factură pentru fiecare comandă

Emite chitanță pentru clienții care au plătit cu carte de credit

Listează toți furnizorii.

Listează furnizorul unui produs cu ajutorul codului produsului.

Listează podusul din care s-a vândut cea mai mare cantitate într-un interval de timp

Listează produsul din care s-a obținut cea mai mare încasare într-un interval de timp.

Prezentarea tehnologiei

I.I DHTML

DHTML sau Dynamic HTML este un nou set de abilități care au fost încorporate în Microsoft Internet Explorer 4.0 si versiunile care l-au succedat. DHTML permite schimbarea dinamică a conținutului si modului deafișare a unei pagini HTML. Dinamic HTML permite creare de pagini interactive fără a fi nevoie de legături cu programele de pe server. De exemplu se pot crea animați cu imagini si text care se pot mișca independent indiferent de punctul de start si cel final. Se pot crea formulare interactive care reacționează automat la datele introduse de utilizator fără a fi nevoie de comunicarea cu serverul.

Dinamic HTML obține aceste efecte prin reformatarea si reafișarea automată a documentului fără să fie nevie de un server care să regenereze conținutul documentului. Nu este nevoie ca documentul sa fie reîncărcat sau un alt document să fie încărcat de către browser. Toate schimbările apărute sunt executate de către calculatorul utilizatorului reducându-se timpul de așteptare necesitat de schimbul de date cu serverul și timpul de afișare a rezultatelor.

Dinamic HTML nu necesită applet-uri Java sau controale speciale pentru a executa schimbările in documente HTML ci conține scripturi încorporate in document care manipulează direct tag-uri HTML, stilurile și textul documentului. Dinamic HTML poate utiliza applet-uri, controale Windows și ActiveX. Intr-un document DHTML toate tagurile cărora li se atribuie un nume pot fi referite ca si obiecte, se pot apela metodele obiectelor si citi sau seta proprietațile acestora.

Exemplu:

<DIV id=div1>text text</DIV>

Acest tag HTML poate fi accesat de către un script prin numele div1. Folosind acest nume se pot apela metodele și proprietațile specifice tag-ului DIV:

div1.innerText

div1.innerHTML

Documentele HTML clasice nu permit afisarea conținutului decât în anumite moduri ceea ce redude posibilitățiile de creare a unui document care să arate bine. Pentru a elimina aceste neajunsuri se pot crea stiluri de afișare adiacă se poate specifica pentru fiecare tag HTML modul de afisare. Dinamic HTML poate schimba automat stilul si formatare elementelor dintr-un document. Se poate examina și seta stilul unui element individual prin proprietatea “style”.În acest mod se poate schimba culoare sau mărimea unui text când mouse-ul trece peste el.

<HTML>

<HEAD>

<TITLE>tabel</TITLE>

<script language="VBS">

sub paragraf_onmouseover

paragraf.style.color="red"

end sub

</script>

</HEAD>

<BODY>

<P id=paragraf>Exemplu </P>

</BODY>

</HTML>

În acest exemplu în momentul când mouse-ul se deplasează peste tag-ul <P id=paragraf> scriptul modifică culoarea cu care este afișat textul.

În mod obișnuit un document HTML după ce este încărcăt într-un brower este nevoie de un schimb de informații cu serverul pentru ca să poata fi schimbat continuțul documentului. Aceasta operație necesită mult timp pentu ca documentul să fie reîncărcat sau un alt document nou să fie încărcat de browser. Conținutul unui document DHTML se poate schimba după încărcare. În acest scop DHTML posedă un set bogat de proprietați și metode care permit adăgarea, ștergerea si modificarea elementelor individuale prezente în document. Se pot modifica atributele si textul conținut în elementle documentului

<HTML>

<HEAD>

<TITLE>tabel</TITLE>

<script language="VBS">

sub paragraf1_onmouseover

paragraf1.innerText="Exemplu1"

paragraf2.innerHTML="<LI>Exemplu2"

end sub

</script>

</HEAD>

<BODY>

<P id=paragraf1>Exemplu </P>

<DIV id=paragraf2>Exemplu </DIV>

</BODY>

</HTML>

În acest exemplu în momentul când mouse-ul se deplasează peste tag-ul <P id=paragraf1> scriptul modifică textul din tag și conținutul HTML din <DIV id=paragraf1> care va fi transformat într-o listă.

I.II Visual Basic Script

Visual Basic Script este cel mai nou menbru al limbajelor de programare Visual Basic. VBScript este integrat în Internet Explorer și Microsoft Internet Information Server.

Între VBScript si Visual Basic există o serie de diferențe cum ar fi:

În VBScript există un singur tip de date denumit Variant. Tipul de date Variant este un tip special care poate conține tipuri diferite de date în funcție de modul în care a fost folosit. Tipul Variant este singurul tipul returnat de orice funcție VBScript. În cel mai simplu caz tipul Variant poate conține o valoare numerică sau un șir de caractere. Tipul Variant poate face distincție între tipurile de date continute, cu alte cuvinte poate să recunoască tipurile de bază din Visual Basic: Boolean,Integer,String,Object etc.

Din VBScript au fost eliminate colecțiile și accesul la ele cu operatorul “!” (Ex: Colectie!Aaaa), compilările conditionate (#id ..then , #cond). Au fost eliminate elemente de control a programului GoSub…Return, On…GoSub, numerotarea linilor, etichetele și With…End With. Au fost eliminate metodele clasice de acces la fișiere, funcțiile financiare, elemente de tratare a erorilor On Error…Resume, Resume, Error

VBScript conține o serie de elemente noi care nu sunt prezente în Visual Basic care sunt asemănătoare cu alte limbaje. Conține trei obiecte noi: FileSystemObject care asigură accesul la fisiere, TextStream asigură accesul secvențial la fisiere și obiectul Dictionary care este echivalent cu associative array din limbajul PERL. VBScript conține funcții noi de formatare a șirurilor de caractere: FormatDateTime, FormatCurrency, WeekdayName

I.III Data Access Objects

Data Access Objects sau DAO este o interfață între programator și Microsoft Jet. Sistemul de gestiune a bazelor de date Microsoft Jet este folosit în Visual Basic și în Microsoft Access Basic. Microsoft Jet stă la baza progrmului Microsoft Access

DAO suportă două tipuri de baze de date:

Baze de date Access care au fost create cu motorul de baze de date Microsoft Jet. Fișierele bazelor de date au extensia mdb

Baze de date ISAM sau Indexed Sequential Access Method. Aceste baze de date au fost create cu alte motoare de baze de date si necesită drivere pentru a fi accesate. Locația acestor drivere este înregistrată în Windows Registry. La instalare DAO instalează un număr de drivere care permit accesul la baze de date FoxPro, Paradox, Lotus 1-2-3.

DAO este o colecție de obiecte ordonate ierarhic care permit accesul la baze de date. Primul obiect din ierarhia DAO este obiectul DBEngine. Acest obiect este folosit pentru a creara alte obiecte DAO. Obiectul DBEngine conține două colecții de obiecte: Workspaces și Errors.

Colecția Workspaces reprezintă toate obiectele Workspace conținute de obiectul DBEngine.

Colecția Errors conține toate obiectele Error înregistrate în timpul operațiilor DAO.

În majoritatea aplicațiilor nu se crează decât un singur obiect de tipul Workspace care conține restul obiectelor. Obiectul Workspace contine trei colecții de obiecte: Databases,Groups și Users.

Colecția Groups conține obiectele de tipul Group.Un obiect Group reprezintă un grup de utilizatori care pot accesa date.

Colecția Users conține obiectele de tipul User. Un obliect User reprezintă un utilizator care poate accesa date. Pentru un utilizator sunt se înregistrează numele și parola. Dacă nu se folosesc opțiuni de securitate atunci toți utilizatorii sunt logați cu userul Admin și pot efectua orice operatie.

Colecția Databases conține toate obiectele de tipul Database. Un astfel de obiect este folosit pentru a stoca date. Crearea unui obiect de tipul Database se poate face în mai multe feluri.

Metoda Workspace.CreateDatabase sau DbEngine.CreateDatabase crează un fișier pe harddisk si returnează un obiect de tipul Database. Metoda are următoarea sintaxă:

CreateDatabase (name,locale,option)

name – reprezintă numele și locația bazei de date care este creată. Ex: “C:\db.mdb” sau “\\server\director\db.mdb”.

location – specifică proprietatea CollatingOrder și eventual o parolă pentru noua bază de date. Proprietatea CollatingOrder specifică modul în care se face sortarea șirurilor de caractere din baza de date. Cu alte cuvinte precizează locul caracterelor speciale ă î ț ș în alfabetul englezesc. Pentru acest scop au fost definite constantele: dbLangArabic, dbLangDutch, dbLangChineseTraditional etc… Aceste constante sunt de tipul longint și pot fi concatenate cu un șir de caractere care reprezintă parola bazei de date. Ex: dbLangGeneral & “pwd=parola”.

option – specifică versiunea bazei de date și dacă aceasta va fi criptată. Constantele:

dbEncrypt – baza de date va fi criptata

dbVersion10 – versiunea Access 1.0

dbVersion11 – versiunea Access 1.1

dbVersion20 – versiunea Access 2.0

dbVersion30 – versiunea Access 3.0

Dacă opțiunea dbEncrypt este omisă baza de date nu va fi criptată. Dacă nu se specifică versiunea atunci baza de data este creată în versiunea 3.0

Metoda Workspace.OpenDatabase sau DbEngine.OpenDatabase încarcă de pe harddisk fișierul care reprezintă baza de date si returnează un obiect Database. Metoda are urmatoarea sintaxă:

OpenDatabase (nume,options,read-only,connect)

nume – reprezintă numele bazei de date care trebuie deschisă. Ex : “C:\db.mdb” sau “\\server\director\db.mdb”.

options – are următoarele valori pentru un Workspace Jet :

true – baza de date este deschisă în mod exclusiv și alti utilizatori nu pot deschide baza de date

false – (varianta implicită) baza nu este deschisă în mod exclusiv

– pentru un Workspace ODBCDirect valorile spcecifică modul de încarcare a driverelor

read-only – specifică dacă baza este deschisă în modul read-only sau nu.

connect – specifică parola bazei de date în caz că există și informații despre modul de conectare.

În modelul Microsoft Jet obiectul Database conține cinci colecții de obiecte:

Containers, QueryDefs, Recordsets, Relations și TableDefs.

Colecția Containers conține obiecte de tipul Container. Fiecare obiect Container are o colecție Documents care conține obiecte cu informatii despre baza de date. Obiectele din colecțiea Containers pot fi accesate prin:

Database.Containers(index) unde index este numărul de ordine din colecție

Database.Containers(nume) unde nume este numele obiectului. Proprietatea Container.Name reprezinta numele obiecului.

Database.Containers!nume unde nume este numele obiectului

Colecția QueryDefs conține obiecte de tipul QueryDef. Aceste obiecte sunt folosite la Query sau Interogări ale bazei de date. Obiectele din colecțiea QueryDefs pot fi accesate prin:

Database.QueryDef(index) unde index este numărul de ordine din colecție

Database.QueryDef(nume) unde nume este numele obiectului.

Database.QueryDef!nume unde nume este numele obiectului.

Un obiect QueryDef conține o colecție de câmpuri și una de parametri. Obiecte de tipul QueryDef pot fi create temporar și nu este necesate să fie salvate pe harddisk. Un astfel de QueryDef poate fi accesat doar prin variabila care i-a fost atribuită. Obiectul QueryDef este creat de către obiectul Database prin apelarea metodei

CreateQueryDef(nume,sqltext) care returnează un obiect QueryDef

nume – este un șir de caractere care reprezintă numele noului query creat.

sqltext – este un șir de caractere care conține comanda SQL a noului query creat. Șirul poate fi omis în momentul în care este creat query – ul dar proprietatea SQL va fi nulă și trebuie setată ulterior.

Ex:

Database.CreateQueryDef(“QueryNou”, ”SELECT * FROM table1”

Colecția Recordsets conține obiecte de tipul Recordset. Cu ajutorul obiectul Recordset se accesează datele din tabele sau interogări. Obiectul Recordset expune la un moment date doar o singură înregistrare dintr-un tabel. Această înregistrare poartă numele de înregistrare activă. În funcție de modul în care a fost creat sau deschis, cu un obiect Recordset se pot face următoarele operați : adăugare de noi înregistrari, editare de noi înregistrari, ștergerea de înregistrări, poziționarea la începutul, sfârșitul sau la opozitie oarecare în tabel. Un obiect Recordset nu poate fi creat ci numai deschis de către obiectul Database. Pentru ca un Recordset să poată fi deschis apleată metoda:

OpenRecordset (source, type, options, lockedits)

source – reprezintă sursa înregistrarilor. Această sursă este numele obiectelor de tipul TableDef sau QueryDef sau o comandă SQL.

type – este o constantă care specifică tipul obiectului Recodset. În funcție de tipul ales se pot efectua mai multe sau mai puține operații cu obiectul Recordset. Aceste tipuri sunt:

dbOpenTable – Recordset de tipul table.

dbOpenDynamic – Recordset de tipul Dynamic. Se pot adăuga, șterge și modifica câmpurile din unul sau mai multe table făra a ține cont de aparteneța câmpurilor la tablele

dbOpenDynaset – Recordset de tipul Dynaset. Se pot adăuga, șterge și modifica câmpurile din unul sau mai multe table însă apartenența este fixată

dbOpenSnapshot – Recordset de tipul Snapshot. Se pot adăuga, șterge și modifica câmpurile din unul sau mai multe table. Modificările efectuate de alți utilizatori asupra datelor nu sunt văzute în recordset până când acesta este închis și redeschis.

dbOpenForwardOnly – Recordset de tipul ForwardOnly. Permite parcurgerea datelor fără a permite revenirea la datele deja accesate.

options – specifică felul în care se realizează accesul la datele aflate în rețea.

lockedits – specifică felul în care sunt actualizate înregistrările în funcție de viteza rețelei și a numarului de utilizatori care accesază datele.

Colectia Relations conține obiecte de tipul Relation. Obiectele Relation indică motorului bazei de date relații create între câmpurile tabelelor. Obiectele de tipul Relation pot fi accesate prin:

Database.Relations(index) unde index este numărul de ordine din colecție

Database. Relations (nume) unde nume este numele obiectului.

Database. Relations!nume unde nume este numele obiectului.

Un obiect Relation este create și adăugat colecției prin metoda

CreateRelation (name, table, foreigntable, attributes)

name – este numele obiectului create

table – este numele tabelului primar. Într-o relatie one-to-many tabelul primar este de partea “one” a relației

foreigntable – este numele tabelului secundar. Într-o relatie one-to-many tabelul secundar este de partea “many” a relației

attributes – specifică atributele relației. Aceste atribute sunt constante definite și au următoarele semnificații:

dbRelationUnique – realația este o relație de tipul one-to-one

dbRelationDontEnforce – relația creată nu împiedică utilizatorul să introducă date care nu verifică relația. Utilizatorul poate să introducă date care crează înregistrări orfane. Rapoartele sau interogările care sunt realizate cu ajutorul relației nu afisează înregistrările orfane. Pentru a crea relații care verifică datele intruduse, acest parametru trebuie omis.

dbRelationInherited – indică o relație creată în baza de date diferite de formatul Acces.

dbRelationUpdateCascade – crează o relație care pe baza căreia motorul bazei de date face modificări în tabelul secundar atunci când apar modificări în tabelul primar. O astfel de relație împiedică creare de înregistrări orfane în cazul în care apar modificări în tabelul primar.

dbRelationDeleteCascade – crează o relație care pe baza căreia motorul bazei de date șterger înregistrări din tabelul secundar atunci când sunt șterse înregistrări din tabelul primar. O astfel de relație împiedică creare de înregistrări orfane în cazul în care sunt șterse înregistrări din tabelul primar.

Atributele dbRelationDeleteCascade și dbRelationUpdateCascade pot fi folosite doar în lipsa atrinutului dbRelationDontEnforce.

Metoda CreateRelation nu este suficientă pentru a crea o relație care să functioneze. Fiecare obiect Relation are o colecție de obiecte de tipul Fileds care indică câmpurile între care este definită relația. Pentru o relație între două câmpuri trebuie creat un obiect Field și dăugat la colecția Fields. Obiectul Field foloseste proprietațile:

Name – indică numele câmpului din tabelul primar.

ForeignName – indică numele câmpului din tabelul primar.

Exemple:

CreateRelation (“Relatia1”, “tabel 1”, “tabel 2”, _

dbRelationUpdateCascade)

Relația creată poartă numele Relatia1, are ca tabel primar tabelul cu numele tabel 1, tabelul secundar este tabelul tabel 2 și are ca atribute

dbRelationUpdateCascade. Această relație împiedică întroducerea de înregistrări care nu verifică reația și face modificări în tabelul tabel 2 atunci când apar modificări în tabelul tabel 1.

CreateRelation (“Relatia2”, “tabel 1”, “tabel 2”, dbRelationDontEnforce)

Relația creată poartă numele Relatia1, are ca tabel primar tabelul cu numele tabel 1, tabelul secundar este tabelul tabel 2 și are ca atribute dbRelationDontEnforce. Relația nu împiedică în nici un fel introducerea, modificarea sau ștergerea înregistrărilor.

Colecția TableDefs conține obiecte de tipul TableDef . Obiectul TableDef reprezintă definiția unui tabel în care sunt înregistrate datele. Obiectele TableDef pot fi accesate prin:

Database.TableDefs(index) unde index este numărul de ordine din colecție

Database. TableDefs(nume) unde nume este numele obiectului.

Database. TableDefs!nume unde nume este numele obiectului.

Obiectele TableDefs sunt create prin apelarea metodei

Database.CreateTableDef (name, attributes, source, connect)

Argumentele au următoarele semnificații:

name – numele obiectului TableDef care este creat.

attributes – sunt constante care specifică atributele obiectului TableDef. Aceste atribute au următoarele valori:

dbAttachExclusive – reprezită un tabel extern deschis în mod exclusiv

dbAttachSavePWD – reprezintă un tabel extern care necesita o paroloă și un UserID pentru a fi deschis.

dbSystemObject – reprezintă un tabel folosit de motorul de date pentru a stoca informații despre baza de date. În aceste tabele sunt stocate informații de spre colecții de obiecte.

dbHiddenObject – reprezinta un tabel ascuns

dbAttachedTable – reprezintă un tabel care nu are ca sursă o bază de date care provine din ODBC

dbAttachedODBC – reprezintă un tabel care are ca sursă o bază de date care provine din ODBC.

source – specifică numele sursei externe din care provin datele pentru tabele care au surse externe.

connect – este un șir de caractere care conține informații de spre modul de conectare la surse externe.

Un obiect TableDef conține două colecții: Fields și Indexes.

După crearea obiectului TableDef create obiecte de tipul Field care apoi trebuie adăugate colecției Fields a obiectului TableDef.

Toate obiectele TabelDef, Relation, Recordset și QueryDef au colecții de obiecte Field dar nu toate proprietățile obiectului pot fi accesate de către aceste obiecte. Accesarea unor proprietăți ale obiectului Field de către anumite obiecte procude erori. Proprietatea type nu are valoare pentru obiecte Relation și Index și produce erori dacă este setată.

Obiectele Field sunt create cu metoda :

CreateField (name, type, size)

name – este numele noului obiect Field create

type – este tipul datelor care sunt înregistrare în câmpul bazei de date. Proprietates Value returnează valori de tipul specificat de type. Acceste tipuri sunt:

dbBigInt Big Integer

dbBinary Binary

dbBoolean Boolean

dbByte Byte

dbChar Char

dbCurrency Currency

dbDate Date/Time

dbDecimal Decimal

dbDouble Double

dbFloat Float

dbGUID GUID

dbInteger Integer

dbLong Long

dbLongBinary Long Binary (OLE Object)

dbMemo Memo

dbNumeric Numeric

dbSingle Single

dbText Text

dbTime Time

dbTimeStamp Time Stamp

dbVarBinary VarBinary

size – este dimensiunea câmpului

Colecția Indexes a obiectului TableDef conține obiecte de tipul Index. Obiecul Index specifică ordinea în care sunt accesate datele din tabele și dacă valorile pot să fie sau nu pot să fie duplicate. Obiectele Index sunt folosite la crearea obiectelor Recordset și specifică felul în care se face accesul la date dar nu specifică ordinea în care motorul bazei de date stochează datele.

Crearea de obiecte Index nu este necesară dar accelerează accesul la date în cazul unui volum mare de date. Crearea unui număr mare de obiecte Index poate încetini procesul de actualizare a bazei de date.

Pentru manipularea câmpurilor din tabele motorul de baze de date Microsoft Jet folosește obiectul Field. Obiectul Field este utilizat cel mai des pentru a defini un câmp în tabelele de date. Acest obiect poate fi utilizat și în alte scopuri. În obiectul Relation este folosit pentru a stoca informații despre relațiile dinte tabele.

Când este folosit pentru a accesa date obiectul Field are proprietăți și un tip de date.

Pentru un obiect TableDef un obiect Field conține informații despre o coloană din tabel.

Exemplu:

Câmpurile Nr, nume, adresa reprezintă coloane

Pentru obiectul Recordset obiectul Field reprezintă un singur câmp dintr-o singură înregistrare. Obiectul Field din Recordset este folosit pentru a modifica valorile din câmpurile înregistrării active.

Exemplu:

Deoarece obiectul Recordset accesează o singură înregistrare câmpurile au valorile:

Nr = 25

Nume = Bbbb

După ce obiectul Recordsetul mută înregistrarea activă la următoarea înregistrare din tabel câmpurile au valorile:

Nr = 26

Nume = Cccc

I.IV Microsoft Access

Mictosoft Access este un program de baze de date. Programul Access este compus din trei componete

Data Access Objects – este motorul de baze de date pe care a fost construit programul Access

Visual Basic – este limbajul folosit pentru manipularea obiectelor din Access

Librăria de obiecte Access – cu ajutorul acestor obiecte se realizează interfața dintre utilizator și DAO. Librăria conține obiecte predefinete cum ar fi formulare, rapoarte și editoare pentru tabele, etc…

Programul Microsoft Access permite deschiderea numai a unei baze de date la un moment dat. Acea baza de date trebuie să fie în format Microsoft Access adică cu extensia mdb. Access nu poate să deschidă alte tipuri de baze de date deși DAO poate accesa date din baze de date diferite de Microsoft Access.

Interfața Access este împărțită în șase părți:

Tables – afișează tabelele bazei de date

Queryes – afișează interogările din cadrul bazei de date

Forms – afișează formularele de introducere a datelor

Reports – afișează rapoartele

Macros – afișează macrocomenzile create

Modules – afișează modulele visual basic create

Tables

Tabul Tables este folosite pentru gestionare tabelelor. Aici se pot crea, modifica și șterge tabele. La tabele se pot modifica datele și structura.

Crearea unui tabel se poate face în mai multe moduri

Datasheet View – pentru fiecare coloana în care s-au introdus date se creaza un câmp cu tipul de date care se găsește în coloană. Proprietățile câmpurilor sunt proprietățile împlicite ale câmpului. De asemenea datele intruduse în câmpuri sunt salvate automat. Ex: valori numerice = tip numeric de tip General Number; valori numerice și text= tip Text si marime 50.

Design View – permite setarea mai precisă a numelui, tipului de date și a altor proprietați ale câmpurilor noului tabel

Table Wizard – permite crearea unui tabel nou și a relațiilor cu celelalte tabele, cu ajutorul unui wizard.

Import table – permite crearea unui tabel prin copierea structurii și eventual a datelor dintr-un tabel al unei baze de date externe. Tipul bazei de date poate fi Access sau alt format recunoscut de DAO.

Link Table – permite creare unei legături către o baza de date externe. Datele din tabel pot fi accesate dar nu sunt salvate în baza de date.

Queryes

Tabul Queryes conține interogăile create. În acest tab sunt create, modificate și șterse interoările. Înterogările sunt comenzi SQL care sunt executate de către program iar rezultatul este un tabel. Aceste interogări sunt create în mai multe moduri

Design View – crează o interogare pornind de la zero

Simple Query Wizard – crează o interogare folosind un singur tabel

Crosstab Query Wizard – crează o interogare care grupează datele pentru diferite calcule

Find Duplicates Query Wizard – crează o interogare care găsește înregistrări care au anumite câmpuri egale

Find Unmatched Query Wizard – crează o interogare care găsește înregistrarile care nu au pereche.

Interogările sunt de mai multe tipuri:

Select Query – este o interogare simplă care este folosită cel mai des la rapoarte. Rezultatele acestei interogări sunt pierdute după ce raportul sau grila interogării au fost închise.

Crosstab Query – este o interogare care grupează datele dint-un tabel

Make-table Query – este asemănător cu Select Query dar rezultatele sunt folosite pentru a crea un nou tabel.

Update Query – este o interogare care modifică datele din tabele

Append Query – este o interogare care adaugă înregistrările într-un tabel

Delete Query – este o interogare care sterge din tabele înregistrări care corspund unui criteriu

Editorul de interogări folosește aceste tipuri de interogări pentru a simplifica crearea interogarilor. În editorul de interogări o interogare poate fi văzuta în mai multe feluri:

Design View – permite utilizatorilor care nu cunosc limbajul SQL să creeze interogari. Aici pot fi vazute tabelel de unde sunt alese datele și de asemenea relațiile dintre tabele. Tot aici pot fi definite relații între tabele care folosesc interogării. Aceste relații au valoare doar în interogarea în care au fost create. Aceste relații sunt de tipul:

INNER JOIN – folosesc doar datele la care câmpurile relației sunt egale

LEFT JOIN – foloseste toate inregistrările din tabelul primar și cele înregistrările din tabelul secundar care verifică relația.

RIGHT JOIN – foloseste toate inregistrările din tabelul secundar și cele înregistrările din tabelul primar care verifică relația.

SQL View – permite editarea expresiei SQL care reprezintă interogarea. Această expresie este rezultatul editării cu Design View. Editarea interogării cu SQL View oferă o mai mare felxibilitate dar necesită cunoaștere limbajului SQL.

Datasheet View – permite vizualizarea rezultatelor interogării

Forms

Tabul Forms contine toate formularele create în baza de date. Cu ajutorul acestor formulare se pot introduce date în tabele dar pot fi folosite și în alte scopuri. Formularele din Access sunt asemanatoare cu fromularele din programul Visual Basic dar au fost create pentru a lucra cu bazele de date. Această asemănare oferă o flexibilitate mare formularelor. Ele pot conține obiecte standard dar și obiecte ActiveX. Un formular poate introduce sau citi date din un singur tabel sau query care este dat de proprietatea RecordSource. Pentru a naviga un sursa de date, un formular are în partea de jos a ferestrei un set de butoane și text box-uri care asigură navigarea și afisează numărul înregistrării curente și numărul total de înregistrări. Cu ajutorul butoanelor înregitrarea activă poate fi pozitionată pe poziția precedentă, pe poziția urmatoare, pe prima poziție din tabel sau pe ultima.

Pentru a introduce valori în câmpurile unei înregstrări sunt folosite obiecte specifice formularelor. Cele mai des folosite obiecte sunt TextBox, ComboBox și CheckBox. La toate aceste obiecte proprietatea ControlSource indică numele câmpului care controlează valoarea afișată. Dacă proprietatea RecordSource a formularului a fost setată corect atunci proprietatea ControlSource a fiecărui obiect de pe formular poate fi setată din lista cu numele câmpurilor din tabelul de la RecordSource.

Obiectele TextBox sunt folosite pentru a introduce șiruri de caractere. Șirurile de caractere pot fi numere sau text. Obiectele TextBox pot fi folosite și pentru câmpuri de tip text, numerice, dată/timp sau memo.

Obiectele ComboBox sunt folosite tot pentru a introduce șiruri de caractere în câmpuri de tip text, numeric și dată. Aceste obiecte sunt folosite pentru a introduce date predefinite sau luate din alte tabele. Dacă datele sunt predefinite atuni acestea sunt introduse în lista de valori a obiectului ComboBox. Dacă datele sunt din alt tabel atunci la proprietatea RowSource se trece expresia SQL care crează lista cu valori. Chiar dacă în lista de valori creată de expresia SQL sunt mai multe coloane cu valori numai valoarea uneia este trecută în câmp din tabel.

Obiectele CheckBox sunt folosi pentru a introduce valori boolene în câmpuri boolene.

O facilitate importantă a formularelor dă posibilitatea de a folosi în formulare subformulare. Subformularele sunt formulare care sunt deschise de formularul principal. Această facilitate permite introducerea de date în tabele legate prin relații fără a crea probleme legate de nerespectarea relațiilor. Cu ajutorul unui formular care conține subformulare se pot introduce simultan date în mai multe tabele.

Pentru a facilita crearea de formulare programul Access pune la dispoziție unelte cu care se pot crea formulare în mai multe moduri:

Design View – se crează un formular pornind de la zero

Form Wizard – se crează automat un formular. În procesul de creare trebuie alese caracteristicile formularului. La acest formular sunt folosite doar câmpurile pe care utilizatorul le selectează.

AutoForm: Columnar, Tabular, Datasheet – crează automat un tabel care folosește toate câmpurile tabeleului sursă pentru a introduce date.

Chart Wizard – crează un formular care conține un obiect Excel Chart. Pentru a afisa chart-ul se folosesc date din tabel.

PivotTable Wizard – crează un formular la care se folosește PivotTabel Wizard din programul Excel.

Rapoarte

În tab-ul Rapoarte se găsesc rapoartele create în baza de date. Rapoartele sunt folosite pentru a afișa date pe monitor sau la imprimantă. Pentru a vizualiza un raport este necesară instalarea unei imprimante.

Crearea rapoartelor este asemănătoare cu crearea formularelor. La rapoarte se folosesc aceleași obiecte ca și la formulare. La fel ca și la formulare valoarea afișată de un obiect este controlată de câmpul ControlSource. În locul numelui câmpului de la ControlSource se poate folosi o expresie care execută calcule. Un astfel de obiect poartă numele de CalculateControl. Astfel de obiecte pot fi folosite la afișarea unor totaluri la sfârșitul raportului.Pentru a afișa date un raport folosește cel mai des următoarele obiece:

TextBox – poate afișa text sau valori numerice. Obiectul TextBox are o proprietate RuningSum care indică felul în care este calculată o sumă.

Over Group – suma este calculată doar pentru înregistrările din grupul actual.

Over All – suma este calculată pentru toate înregistrările din raport

ChechBox – poate fi folosit pentru a afișa valori boolene.

Un raport este format din mai multe parți și fiecare parte a o funcție specială.

Report Header – este afișat o singură dată la începutul raportului și conține cel mai des titlul raportului

Report Footer – este afișat o singură dată la sfârșitul raportului. Aici se pot calcula totaluri pentru raport.

Page Header – este afișat la începutul fiecărei pagini și poate fi folosit pentru a afișa numele coloanelor din raport

Page Footer – este afișat la sfârșitul fiecărei pagini și poate fi folosit pentru a afișa numărul paginii curente

Detail – este partea raportului care este afișată pentru fiecare instrucțiune din tabelul sursă

Un raport poate grupa înregistrările după anumite câmpuri. Grupările pot fi pe mai multe nivele, adică un grup de înregistrări poate să aibă la rândul lui înregistrările grupate.

Un grup adaugă în secțiunea Detail alte secțiuni:

Group Header – este afișat la începutul fiecărui grup.

Detail – este partea care afișează datele din tabelul sursă. Acestă secțiune se repetă pentru fiecare înregistrare din grup

Group Footer – este afișat la sfârșitul grupului și poate fi folosit pentru calcule asupra grupului.

Rapoartele pot fi create în mai multe feluri:

Design View – crează un raport începând de la zero,

Report Wizard – crează un raport cu ajutorul unui wizard. Cu un wizard rapoartele sunt create ușor și rapid. În majoritatea cazurilor nu este nevoie să se facă modificări la raport.

AutoReport – crează automat rapoarte dar nu există posibilitatea de a selecta câmpurile care apar în raport.

Chart Wizard – crează un raport care conține un obiect Excel Chart.

Label Wizard – crează etichete cu ajutorul datelor din tabelul sursă. Exemplu: pot fi create etichete pentru o listă cu clienți care poate fi scoasă la imprimantă.

Macros

Tab-ul Macros conține macro comenziile create. O macro comandă poate să fie o instrucțiune sau un set de intrucțiuni. Exemple de intrucțiuni ce pot fi executate: deschiderea unui formular, afișarea unui mesaj etc…

Instrucțiunile care pot fi incluse într-un macro sunt metode ale obiectului DoCmd care este includs în bibliotaca Access.

Pentru a crea o macro comandă trebuie să selecteze numele instrucțiuni care este în coloana Actions și apoi setate argumentele instrucțiunii.

Modules

Tab-ul Modules conține programele din baza de date care sunt scrise în limbajul Visual Basic. Cu aceste programe se pot executa operații complexe asupra datelor din baza de date.

Prezentarea aplicației

Baza de date Access

În baza de date sunt stocate totate datele folosite de aplicație. Datele sunt stocate în tabele.

Între tabele sunt create relațiile:

Aceste tabele sunt:

Clienti

În acest tabel sunt stocate datele despre clienți. Datele sunt introduse de către clienți cu ajutorul formularului de pe site-ul magazinului.

Tabelul este în relație de unu la mai mulți cu tabelul ComenziHeader folosind câmpurile Clienti.Nr_client și ComenziHeader.Nr_client

Câmpuri

Nr_client –LongInt

Nume -Text

Prenume -Text

Jud -Text

Localitatea -Text

Strada -Text

Nr -Integer

Bloc -Text

Ap -Integer

Carte_credit -Text

Email -Text

Marfa

În acest tabel sunt stocate datele despre stocurile de marfă din magazin și sunt introduse de căte operatorii bazei de date

Câmpuri

Cod_marfa -LongInt

Denumire -Text

UM -Text

Cantitate -LongInt

Valoare -Currency

Furnizor -LongInt

CantComada -LongInt – cantitatea comandată automat când stocul scade sub valoarea de la CantMinima

CantMinima -LongInt – valoare minimă a stocului pentru care se face aprovizionarea.

Furnizori

În acest tabel conține date despre furnizorii. Între tabelul Furnizori și tabelul Marfa este definită o relație de unu la mai mulți folosind câmpurile Furnizori.Cod_furnizor și Marfa.Furnizor.

Câmpuri

Cod_furnizor -LongInt

Nume -Text

Adresa -Text

Localitatea -Text

Judet -Text

Banca -Text

ContBancar -Text

Tel -Text

ComenziHeader

În acest tabel sunt stocate date despre comenzi. Tabelul conține numărul comenzii și numărul clientului.

Tabelul ComenziHeader este în relație de:

-unu la mai mulți cu tabelul ComenziData folosind câmpurile ComenziHeader.Nr_cmd și ComenziData.Nr_Cmd.

-unu la unu cu tabelul Incasari folosind câmpurile ComenziHeader.Nr_cmd și Incasari.Nr_incasare.

Câmpurile tabelului

Nr_cmd -Autonumber

Nr_client -LongInt

ComenziData

În acest tabel sunt înregistrate pentru fiecare comandă una sau mai multe înregistrări care conțin date despre produsele comandate și cantitatea comandată.

Câmpuri

Nr_cmd -LongInt -este în rel. cu nr_cmd dinComenziHeader

Cod_marfa -LongInt

Cantitate -LongInt

Incasari

Tabelul conține date cate completează informațiile despre comenzi. În acest tabel sunt înregistrate date despre modul de plată, suma care trebuie încasată și data la care s-a făcut plata. Câmpul cu data poate fi folosit și pentru a se vedea data la care s-a făcut comanda.

Câmpuri

Nr_incasare -LongInt- este în relați de unu la unu cu nr_cmd din ComenziHeader

Mod_plata -LongInt

Valoare -Currency

Data -Data/Time

ComenziAprovizionare

Tabelul conține date depre comenzile de aprovizionare. Aceste în acest tabel comenzile sunt adăugate automat prin rularea macrocomenzii Update Aprovizionare-Comenzi. Înregistrările pot fi procesate și separat cu ajutorul formularului StocLimita.

Câmpuri

Nr_cmd -LongInt

Cod_marfa -LongInt

Cantitate -LongInt

Data -Data/Time

Tabele Auxiliare

Mod_plata

În acest tabel sunt stocate modurile de plată. Tabelul conține codul care identifică modul de plată și denumirea modului de plată.

Câmpuri

Mod_plata -LongInt

Descriere -Text

Um

Tabelul conține unitătile de măsură care sunt folosite în tabelul cu materiale

Interogări

CantComenzi_in_Data

Interogarea selectează comanda cu cea mai mare cantitate vânduta in perioada

DataMin – DataMax. Interogarea face suma cantității unui produs vândut în perioada DataMin – DataMax.

PARAMETERS DataMin DateTime, DataMax DateTime;

SELECT TOP 1 ComenziDate.cod_marfa, Sum(ComenziDate.cantitate) AS Total, [DataMin] AS DMin, [DataMax] AS DMax

FROM ComenziDate

WHERE (((ComenziDate.nr_cmd) In (SELECT Incasari.nr_incasare FROM Incasari WHERE (Incasari.data Between DataMin And DataMax))))

GROUP BY ComenziDate.cod_marfa

ORDER BY Sum(ComenziDate.cantitate) DESC;

ChitantaDateQuery

Interogarea este folosită la creare chitanțelor. Datele sunt luate din tabelele ComenziDate și Marfa

SELECT Marfa.Denumire, ComenziDate.cantitate, ComenziDate.nr_cmd, Marfa.UM

FROM Marfa INNER JOIN ComenziDate ON Marfa.Cod_marfa = ComenziDate.cod_marfa;

ChitantaQuery

Interogarea este folosită la creare chitanțelor. Pentru că rapoartele Access un pot folosi date decât dintr-un tabel sau interogare, datele pentru chitanță trebuie luate din mai multe tabele si grupate la un loc cu ajutorul interogării. Datele sunt luate din tabele Clienti, ComenziHeader și Incasari. Interogarea selectează numai inregistrările care au codul modului de plată egal cu 1 (codul pentru plată cu carte de credit).

SELECT Incasari.nr_incasare, Incasari.data, Clienti.Nume, Clienti.Prenume, Clienti.Jud, Clienti.Localitatea, Clienti.Strada, Clienti.Nr, Incasari.valoare, Clienti.carte_credit

FROM (Clienti INNER JOIN ComenziHeader ON Clienti.Nr_client = ComenziHeader.nr_client) INNER JOIN Incasari ON ComenziHeader.nr_cmd = Incasari.nr_incasare

WHERE (((Incasari.mod_plata)=1))

ORDER BY Incasari.nr_incasare;

Clienti Query

Interogarea este folosită pentru raportul Clienti Query. Pentru ca interogarea să fie executată trebuie să se introducă parametrul cod_client. Interogarea selectează doar clientul care are Nr_client=cod_client. Dacă nu există un client cu Nr_client=cod_client atunci interogarea nu selectează nimic.

PARAMETERS cod_client Long;

SELECT Clienti.Nr_client, Clienti.Nume, Clienti.Prenume, Clienti.Jud, Clienti.Localitatea, Clienti.Strada, Clienti.Nr, Clienti.Bloc, Clienti.Ap, Clienti.carte_credit, Clienti.email

FROM Clienti

WHERE (((Clienti.Nr_client)=[Cod_client]));

Comenzi de aprovizionare

Interogarea este folosită pentru a combina datele din tablele ComenziAprovizionare și Marfa. Datele sunt folosite pentru a afisa comanda de aprovizionare și furnizorul.

SELECT [Comenzi Aprovizionare].Nr_comanda, [Comenzi Aprovizionare].Cantitate, Marfa.Denumire, Marfa.Furnizor, Furnizori.Nume, [Comenzi Aprovizionare].Cantitate, Marfa.CantComanda

FROM (Furnizori INNER JOIN Marfa ON Furnizori.Cod_furnizor = Marfa.Furnizor) INNER JOIN [Comenzi Aprovizionare] ON Marfa.Cod_marfa = [Comenzi Aprovizionare].Cod_marfa;

Incasari_in_data

Interogarea selectrează cea mai mare încasare din perioada DataMin – DataMax.

PARAMETERS DataMin DateTime, DataMax DateTime;

SELECT TOP 1 Incasari.nr_incasare, Incasari.valoare, Incasari.data, [DataMin] AS DMin, [DataMax] AS DMax

FROM Incasari

WHERE (((Incasari.data)>=[DataMin] And (Incasari.data)<=[DataMax]))

ORDER BY Incasari.valoare DESC;

Marfa_cod_Furnizor

Interogarea selectrează furnizorul unui material. Datale sunt luate din tabelele Furnizori și Marfă.

SELECT Marfa.Cod_marfa, Marfa.Denumire, Marfa.Stoc, Marfa.Valoare, Furnizori.Nume, Furnizori.Adresa, Furnizori.Localitatea, Furnizori.Judet, Furnizori.Banca, Furnizori.ContBancar

FROM Furnizori INNER JOIN Marfa ON Furnizori.Cod_furnizor = Marfa.Furnizor;

MarfaFurnizori

Interogarea selectează pentru fiecare produs din baza de date furnizorul. Datale sunt luate din tabelele Furnizori și Marfă iar legătura dintre cele două tabele se face prin

Furnizori.Cod_furnizor = Marfa.Furnizor.

SELECT Marfa.Cod_marfa, Marfa.Denumire, Marfa.Stoc, Marfa.Valoare, Furnizori.Nume

FROM Furnizori INNER JOIN Marfa ON Furnizori.Cod_furnizor = Marfa.Furnizor;

MarfaQuery

Acestă interogare este accesată de către site-ul magazinului. Interogarea verifică dacă valoare câmpului stoc din fiecare înregistrare a tabelului Marfa este mai mare decât valoarea câmpului stocminim.

SELECT Marfa.Cod_marfa, Marfa.Denumire, Marfa.UM, Marfa.Stoc, Marfa.Valoare

FROM Marfa

WHERE (((Marfa.Stoc)>[StocMinim]));

MaxCant_in_Data

Interogarea utilizează date din CantComenzi_in_Data și Marfa pentru a fi folosite la rapoarte. Cu această interogare se derermină cea mai mare contitate vândută perioada DataMin – DataMax.

SELECT CantComenzi_in_Data.cod_marfa, CantComenzi_in_Data.Total, Marfa.Denumire, Marfa.UM

FROM CantComenzi_in_Data INNER JOIN Marfa ON CantComenzi_in_Data.cod_marfa = Marfa.Cod_marfa

ORDER BY CantComenzi_in_Data.Total DESC;

MaxComenzi_in_Data

Interogarea selectează cea mai mare vânzare din perioada

DataMin – DataMax. Datele sunt luate din interogarea CantComenzi_in_Data2 și din tabelul marfă.

SELECT TOP 1 CantComenzi_in_Data2.cod_marfa, CantComenzi_in_Data2.Total, Marfa.Valoare, [CantComenzi_in_Data2].[Total]*[Marfa].[Valoare] AS TotalVandut, Marfa.Denumire, Marfa.UM

FROM Marfa INNER JOIN CantComenzi_in_Data2 ON Marfa.Cod_marfa = CantComenzi_in_Data2.cod_marfa

ORDER BY [CantComenzi_in_Data2].[Total]*[Marfa].[Valoare] DESC;

StocLimita

Interogarea determină care produse au stocul sub StocMinim

SELECT Marfa.Cod_marfa, Marfa.Denumire, Marfa.UM, Marfa.Stoc, Marfa.Valoare, Marfa.CantComanda, Furnizori.Nume

FROM Furnizori INNER JOIN Marfa ON Furnizori.Cod_furnizor = Marfa.Furnizor

WHERE (((Marfa.Stoc)<=[StocMinim]));

AutoUpdate Stoc

Interogarea adaugă la stoc cantiatatea comandată. Această interogare trebuie rulată după interogarea AutoUpdate Comenzi.

UPDATE StocLimita INNER JOIN Marfa ON StocLimita.Cod_marfa = Marfa.Cod_marfa SET Marfa.Cantitate = [Marfa].[Cantitate]+[Marfa].[CantComanda]

WHERE [Marfa].[Cod_marfa]=[StocLimita].[Cod_marfa];

AutoUpdate Comenzi

Interogarea adaugă automat comezi în tabelul ComenziAprovizionare. Interogarea trebuie rulată împreună cu interogarea AutoUpdate Stoc.

INSERT INTO [Comenzi Aprovizionare] ( Cod_marfa, Cantitate, Data )

SELECT StocLimita.Cod_marfa, StocLimita.CantComanda, Date() AS Exp

FROM StocLimita;

Formulare

Clienti

Este un formular pentru întreținerea tabelului cu clienți. Nu este folosit pentru a introduce în tabel date deoarece clienți introduc datele personale.

Marfa

Formularul este folosit pentru a introduce date despre produsele din magazin. Pentru a nu aparea inregistrări orfane datele despre furnizori sunt citite din tabelul furnizori cu un combo box.

Furnizori

Cu acest formular sunt introduse datele despre furnizori. Aceste date trebuie introduse înaintea datelor depre produse.

ComenziHeader, ComenziDate, Incasari

Aceste formulare sunt folosite pentru a vedea comenzile clienților. În formularul ComenziHeader sunt introduse subformularele Incasari și ComenziDate. Legaturile dintre formulare sunt făcute prin câmpul nr_cmd.

Procesare_comenzi_Aprovizionare

Cu acest formular sunt procesate individual comenzile de aprovizionare. Datele sunt citite din interogarea StocLimita. Pentru fiecare comandă de aprovizionare de poate adăuga individual înregistrări în tabelul ComenziAprovizionare iar în tabelul Marfa stocul poate fi actualizat.

Rapoarte

Factura, FacturaDate

Acest raport este folosit pentru a crea o factură pentru o anumită comandă. Raportul Factura este raportul care conține datele furnizorului și a clientului. În raportul Factura este inclus subraportul FacturaDate care conține produsele din factură. La rularea raportului trebuie introdus numărul comanzi pentru care este emisă factura.

Chitanta

Acest raport este folosit pentru a crea o chitanță pentru o anumită comandă. Chitanțele sunt create doar pentru plățiile efectuate cu carte de credit( mod de plata=1).

Furnizori

Raportul listează toți furnizorii și produsele care sunt vândute de aceștia.

Marfa_cod_furnizor

Raportul listează furnizorul unui produs. Pentru a rula raportul trebuie introdus codul produsului

MaxCant_in_Data

Raportul listează cea mai mare cantitate vândută în o anumită perioadă

MaxVanzari_in_Data

Raportul listează cea mai mare sumă încasată în o anumită perioada.

Prezentare site

Site-ul utilizează facilitățiile oferite de DHTML. Tehnologia DHTML a fost dezvoltată de către firma Microsoft și este inclusă în browserul Internet Explorer 4.0 și în versiunile mai noi ale lui IE 4.0. Paginile site-lui sunt scrise în format HTML și conțin scripturi care manipulează obiectele din pagină. Aceste scripturi sunt scrise în limbajul Visual Basic Script. Pentru a accesa baza de date, site-ul folosește componenta Data Access Objects versiunea 3.5. Opțiunile de securitate a programului Internet Explorer trebuie setate în așa fel încât să permită crearea și rularea de componente ActiveX.

Site-ul este format din mai multe pagini. Fiecare pagină reprezintă un pas al procesului de creare a comenzii.

Pagina 1:

Index.htm

Această pagină oferă informații despre mediul în care trebuie rulat site-ul. Pagina explică de ce componente este nevoie și unde se pot găsi. De asemena oferă o listă cu pograme care au nevoie de DAO 3.5. Aceste programe instalează automat DAO 3.5 în momentul în care sunt instalate Pagina oferă și un link către următoarea pagină din site.

<HTML>

<HEAD>

<TITLE></TITLE>

</HEAD>

<BODY background="Parchmtl.jpg">

<h1 align=center>Magazinul Virtual SRL</h1>

<li>

<h3>Pentru a funcționa corect acest site necesită ca

Data Access Objects 3.5 să fie instalat.

<li>Dacă unul din programele Microsoft Word97 , Excel97 sau Access97 este instalat atunci si Data Access Objects 3.5 este instalat.

<li>Daca unul din programele VisualC 5 sau Visual Basic 5 este instalat atunci

si Data Access Objects 3.5 este instalat.

<li>Daca la intrarea in magazin apare o eroare atunci Data Access Objects 3.5 trebuie instalat.

Poate fi gasit la <a href=#>www.magazin-virtual.ro/dao35.exe</a> sau <a href=#>www.microsoft.com/download/dao35.exe</a>

</h3>

<h1 align=center><a href="pagina1.htm">Intra in magazin</a></h1>

</BODY>

</HTML>

Pagina nu conține scripturi.

Pagina 2:

Index1.htm

În această pagină se face autentificarea cliențiilor magazinului și crearea de noi clienți. Pagina este listată fară scripturi. Scripturile sunt listate și explicate separat.

<HTML>

<HEAD>

<TITLE>Magazin Virtual</TITLE>

<SCRIPT language="VBS">

</SCRIPT>

</HEAD>

<BODY id=corp background="Soapston.jpg">

<CENTER>

<H1><B><I>Magazinul Virtual SRL</B></I></H1></CENTER>

<DIV id=div_nrclient><P>Dacă sunteti un client al magazinului și aveți un număr client scrieti numarul și apasati OK

<P><INPUT id=str_NrClient style="WIDTH: 123px; HEIGHT: 22px" size=17> <INPUT type=button value=OK id=cmdOK_nrclient></P>

<P>Dacă nu sunteți un client al magazinului apasați butonul

Client Nou și completați formularul care apare. <INPUT type=button value="Client Nou" id=cmdClientNou></P>

<DIV id=div_formular style="VISIBILITY: hidden">

<P>Completați datele și apasați butonul Adaugare date

<P>Sau apăsați butonul Cancel pentru a introduce numarul client

<P>

Numele <INPUT maxLength=20 id=strNume><BR>

Prenume <INPUT maxLength=20 id=strPrenume><BR>

Jud <SELECT style="WIDTH: 73px" id=strJud size=1>

<OPTION value="AR" selected>AR</OPTION>

<OPTION value="TM">TM</OPTION></SELECT>

<br>Localitatea <INPUT id=strLoc maxLength=20>

<br>Strada <INPUT id=strStr maxLength=25 size=25>

<br>Nr <INPUT id=strNr style="WIDTH: 85px; HEIGHT: 22px" size=6 maxLength=6>

<br>Bloc * <INPUT id=strBloc style="WIDTH: 89px; HEIGHT: 22px" size=10 maxLength=10>

<br>Ap * <INPUT id=strAp style="WIDTH: 52px; HEIGHT: 22px" size=7 maxLength=3>

<br>Carte de credit* <INPUT id=strCr_cred style="WIDTH: 268px; HEIGHT: 22px" size=38>

<br>email* <INPUT id=strEmail style="WIDTH: 201px; HEIGHT: 22px" size=28>

<h5>* Sunt optionale</h5><INPUT id=cmdAddDate type=button value="Adaugare date">&nbsp;<INPUT id=cmdCancel type=button value=Cancel>

<P>&nbsp;</P>

</DIV></DIV>

</BODY>

</HTML>

În această pagină este nevoie de informații descre clienți. Pentru a accesa baza de date este nevoie de câteva obiecte pentru a face acest lucru.

Cu ajutorul acestei proceduri window_onload sunt create obiectele. Primul obiect creat este obiectul dbEngine. Cu ajutorul acestui obiect este deschisă baza de date și tabelul Clienti. Obiectul este creat cu funcția CreateObject care reutrnează adresa obiectului creat.

dim dbEngine,db,recClienti

sub window_onload()

set dbEngine=CreateObject("DAO.DBEngine.35")

set db=dbEngine.OpenDatabase("c:\diploma\db.mdb")

set recClienti=db.OpenRecordset("Clienti",2)

end sub

Pagina este formată din două formulare:

-primul formular este folosit pentru a autentifica clienții magazinului folosind numarul client.

-al doilea formular este folosit pentru a permite înregistrare de noi clienți. În acest formular clienții introduc datele personale.

Primul formular este format din:

Un TextBox Nr client cu id = str_NrClient

Un buton OK cu id = cmdOK_nrclient

Un buton ClientNou id = cmdClientNou

Această procedură este executată la evenimentul click al butonului cmdOK_nrclient. Mai întâi procedura verifică dacă valoarea din textbox-ul str_NrClient este o valoare numerică. Dacă valoarea este numerică atunci se caută în tabela Clienti o înregistrare care are câmpul Nr_client egal cu valoarea lui str_NrClient. Dacă s-a găsit o astfel de înregistrare valoarea lui str_NrClient este salvată în memoria temporară a browserului și este încărcată următoarea pagină. Încărcarea paginii se face prin apelarea metodei window.navigate

sub cmdOK_nrclient_onclick()

if IsNumeric(str_NrClient.value) then

recClienti.MoveFirst

recClienti.FindFirst "Nr_client = " + str_NrClient.value

if recClienti.NoMatch then

MsgBox "Un client cu acest numarul nu a fost gasit"

else

document.cookie = str_NrClient.value

window.navigate("table.htm")

end if

else

MsgBox "Trebuie introdusă valoare numerică"

end if

end sub

Al doilea formular nu este vizibil. Pentru a vedea al doilea formular trebuie apasat butonul ClientNou.

Această procedură este executată la evenimentul click al butonului cmdClientNou. Procedura modifică modul de afișare a documentului. Proprietatea style.visibility a primului formular este setată pe “hidden” iar cea a formularului doi pe “visible”. Pentru a modifica pagina nu este nevoie ca aceasta să fie reîncărcată.

sub cmdClientNou_onclick()

div_nrclient.style.visibility="hidden"

div_formular.style.visibility= "visible"

div_formular.style.position="absolute"

div_formular.style.top=70

strNume.focus()

end sub

Formularul doi conține mai multe textbox-uri care în care sunt introduse datele personale ale clientului. După ce s-au introdus datele acestea sunt validate pentru a se evita erori care pot să apară în timpul scrierii datelor în baza de date. După validarea datelor, în tabelul Clienți se adaugă o înregistrare nouă. Valorile din textbox-urile formularului sunt trecute la valorile câmpurilor din înregistrare și apoi înregistrarea este actualizată ( cu metoda Recordset.Update). Tot această procedură atribuie un nou număr client pe care îl afișează într-un dialogbox. Dacă nu au apărut erori în procesul de înregistrare atunci procedura se întoarce la primul formular pentru a folosi nr_client la intrarea în magazin.

sub cmdAddDate_onclick

Dim nUC

if strNume.value<>"" and strPrenume.value<>"" and _

strLoc.value<>"" and strStr.value<>"" and _

strNr.value<>"" and strNr.value<>"" and IsNumeric(strNr.value) then

recClienti.MoveLast

nUC=Cint(recClienti.Fields("Nr_client").Value)

recClienti.AddNew

recClienti.Fields("Nr_client").Value = nUC + 1

recClienti.Fields("Nume").Value = strNume.value

recClienti.Fields("Prenume").Value = strPrenume.value

recClienti.Fields("Jud").Value = strJud.value

recClienti.Fields("Localitatea").Value = strLoc.value

recClienti.Fields("Strada").Value = strStr.value

recClienti.Fields("Nr").Value = Cint(strNr.value)

recClienti.Fields("Bloc").Value = CStr(strBloc.value)

if strAp.value<>"" then recClienti.Fields("Ap").Value = _

Cint(strAp.value)

recClienti.Fields("carte_credit").Value = strCr_cred.value

recClienti.Fields("email").Value = strEmail.value

recClienti.Update

msgbox "Numarul client care v-a fost atrubuit este" & cstr(nUC+1) & ". Nu uitati acest numar pentru ca este folosit pentru a va identifica ca si client al magazinului. Pentru a continua introduceti numarul client"

cmdCancel_onclick

else

msgbox "Nu au fost introduse toate datele necesare sau nu sunt corecte"

end if

end sub

La formularul unu se poate ajunge apasând butonul Cancel. La apariția evenimentului click la butonul cmdCancel procedura de mai jos. Procedura face vizibil primul formular și pe formularul doi îl face invizibil.

sub cmdCancel_onclick()

div_nrclient.style.visibility="visible"

div_formular.style.visibility= "hidden"

str_NrClient.focus()

end sub

Pagina2.htm

În această pagină se afișează conținutul tabelului Marfa și se generează comanda. Scripturile din pagină sunt multe la număr și sunt explicate separat.

<HTML>

<HEAD>

<TITLE>tabel</TITLE>

<script language="VBS">

</script>

</HEAD>

<BODY id=d_body background="Soapston.jpg">

<h2 align=center>Produsele din magazin</h2>

<h6>Pentru a adauga produse in comanda dati un click pe un produs din tabela cu produse</h6>

<table width="80%"><tr>

<td width="15%">Nr cod</td>

<td width="65%">Denumire</td>

<td width="20%" align=right>Pret</td></tr></table>

<hr>

<table id=d_tbl BORDER=0 Cellspacing=0 width="80%"></table>

<hr>

<INPUT id=cmdPrimul type=button value="|<">

<INPUT id=cmdPrev type=button value="<<">

<INPUT id=cmdNext type=button value=">>">

<INPUT id=cmdUltimul type=button value=">|">

<HR>

<h3>Comanda</h3>

<table width="90%">

<tr>

<td width="15%">Nr cod</td>

<td width="55%">Denumire</td>

<td width="20%">pret</td>

<td width="10%">Cantitate</td>

</tr></table>

<hr>

<table id=d_tbl2></table>

<hr>

Total:<div id=divTotal align=right></div>

<br>

<SELECT id=opMod_plata style="WIDTH: 174px" name="">

<OPTION value=1 selected>Carte de credit</OPTION>

<OPTION value=2>Mandat postal</OPTION></SELECT>

<P>

<INPUT id=cmdContinua type=button value="Trimite Comanda"></P>

</BODY>

</HTML>

În pagină sunt două tabele HTML care nu conțin date. În aceste tabele sunt listate în timpul rulării datele din baza de date. Afișarea înregistrărilor se face cu ajutorul unei interogări. Interogarea verifică dacă stocul unui anumit material a scăzut sub o limită admisă pentru acel material.

Și pentru această pagină trebuie create obiectele cu ajutorul cărora se accesază baza de date.

În această pagină procedurile sunt definite într-un singur tag SCRIPT variabile globale reprezintă:

-dbEngine – obiectul prin care este referit motorul de baze de date DAO. Obiectul este creat prin funcția CreateObject care este folosită la creare de obiecte ActiveX

-recMarfa – este recordset-ul creat din interogarea MarfaQuery

-recTMarfa – este recordset-ul creat din tabelul Marfă

-recComH – este recordset-ul creat din tabelul ComenziHeader

-recComD – este recordset-ul creat din tabelul ComenziData

-recInc – este recordset-ul creat din tabelul Incasari

dim dbEngine,recMarfa,db,nr_ln,recComH,recComD,recInc,recTMarfa

sub window_onload

nr_ln = 4'Numarul de lini al tabelului cu marfa

set dbEngine = CreateObject("DAO.DBEngine.35")

set db = dbEngine.OpenDatabase("c:\diploma\db.mdb")

set recMarfa = db.OpenRecordset("MarfaQuery",2)

set recTMarfa = db.OpenRecordset("Marfa",2)

set recComH = db.OpenRecordset("ComenziHeader",2)

set recComD = db.OpenRecordset("ComenziDate",2)

set recInc = db.OpenRecordset("Incasari",2)

cmdPrev.disabled=true

cmdPrimul.disabled=true

fill_tbl

end sub

Pagina folosește două tabele HTML pentru a afișa date. În primul tabel sunt afișate un număr predefinit de înregistrări din MarfaQuery. În tabelul doi se adaugă de către utilizator produsele comandate cu cantitatea comandată.

Ambele tabele HTML nu conțin nici o linie. La tabele se adaugă linii în timpul rulării paginii.

Primul tabel HTML este referit prin variabila d_tbl. Procedura fill_tbl se ocupă cu inserarea de linii în tabel. Mai întâi pocedura apelează procedua clear_tbl care șterge toate linile din tabel.

Deoarece o pagină HTML nu poate fi văzută în întregime într-un browser înregistrările sunt afișate doar câte patru. După ce linile au fost șterse din tabel procedura începe să adauge linii noi la tabel. Linile sunt adăugate astfel:

Se adaugă o linie nouă cu metoda insertRow().

Se adaugă câte o celulă în linia nouă pentru câmpurile nrcod,denumire și pret din query-ul MarfaQuery.

Se trec valorile din câmpuri în celule.

Înregistrarea activă a recordsetului este mutată la următoarea înregistrare.

Exemplu de funcționare a procedurii:

La început execuție procedurii înregistrarea activă este pozitionată pe poziția x . Pentru înregistrarea de pe pozitia x din tebelul cu date sunt afișate datele în tabelul HTML. După afișare înregistrarea activă este mutată pe poziția x + 1 și se afișează datele în tabelul HTML. Se continuă mutarea înregistrării până la poziția x + nr_ln și se afișează datele pentru fiecare poziție. Înregistrarea activă rămâne pe poziția x + nr_ln

sub fill_tbl

clear_tbl

for i=1 to nr_ln

set tr=d_tbl.insertRow

set rc=tr.insertCell

rc.width="15%"

rc.innerHTML=cstr(recMarfa.Fields(0).Value)

set rc=tr.insertCell

rc.width="65%"

rc.innerHTML=cstr(recMarfa.Fields(1).Value)

set rc=tr.insertCell

rc.width="20%"

rc.align="right"

rc.innerHTML=cstr(recMarfa.Fields(4).Value)

recMarfa.MoveNext

if recMarfa.EOF then

recMarfa.MoveLast

cmdNext.disabled=true

cmdUltimul.disabled=true

exit for

end if

next

end sub

Prcedura clear_tbl șterge linii din tabel atât timp cât tabelul are linii. Metoda deleteRow șterge prima linie din tabel și apoi instrucțiunea while verifică dacă mai sunt linii.

sub clear_tbl

while d_tbl.rows.length>0

d_tbl.deleteRow

wend

end sub

Sub primul tabel HTML se află un set de butoane care este folsit pentru a naviga în tabelul cu marfă. Fiecare buton are asociată câte o procedură pentru evenimentul click.

Butoanele execută următoarele operații:

– butonul “|<” poziționează înregistrarea activă din recordsetul recMarfă la începutul recordsetului și apelează procedura fill_tbl. Procedura asociată poziționază înregistrarea activă a recordsetului pe prima poziție din MarfaQuery.De asemena procedura deactivează butoanele cmdPrev și cmdPrimul și activează butoanele cmdNext și cmdUltimul.

sub cmdPrimul_onclick

cmdPrimul.disabled = false

cmdNext.disabled=false

cmdUltimul.disabled=false

cmdPrev.disabled=true

recMarfa.MoveFirst

fill_tbl

end sub

-butonul “<<” mută înregistrarea activă din recordsetul recMarfă cu patru înregistrări înapoi și apelează procedura fill_tbl. Procedura asociată butonului mută înregistrarea acivă a recordsetului cu ajutorul metodei RecordSet.MovePrevious. Pentru a nu apărea erori trebuie verificat dacă nu s-a ajuns la începutul tabelului cu date. Verificarea se face cu ajutorul proprietății BOF sau Begin Of File. Proprietatea este de tip boolean și are valoarea true atunci când s-a trecut de începutul tabelului. Deoarece la ieșirea din tabel recodsetul nu mai indică o înregistrare corectă acesta trebuie repozitionat pe prima înregistrare.

sub cmdPrev_onclick

cmdNext.disabled = false

cmdUltimul.disabled = false

for i=1 to d_tbl.rows.length + nr_ln

recMarfa.MovePrevious

if recMarfa.BOF then

recMarfa.MoveFirst

cmdPrimul.disabled=true

cmdPrev.disabled=true

end if

next

fill_tbl

end sub

-butonul “>>” mută înregistrarea activă din recordsetul recMarfă cu patru înregistrări înainte și apelează procedura fill_tbl. Deoarece înregistrarea activă este pozitionată pe ultima înregistrare nu trebuie decât apelată procedura fill_tbl

sub cmdNext_onclick

cmdPrev.disabled=false

cmdPrimul.disabled=false

fill_tbl

end sub

-butonul “>|” poziționează înregistrarea activă din recordsetul recMarfă la sfârșitul recordsetului și apelează procedura fill_tbl. Procedura asociată mută înregistrarea activă la șfârșitul tabelului de date. Dacă se apelează metoda fill_tbl în tabelul HTML nu este afișată decât ultima înregistrare. Pentru a afișa corect datele în tabelul HTML înregistrarea activă trebuie mutată cu nr_ln-1.

sub cmdUltimul_onclick

recMarfa.MoveLast

cmdPrev.disabled=false

cmdPrimul.disabled=false

cmdNext.disabled=true

recMarfa.Move -(nr_ln-1)

fill_tbl

end sub

Starea butoanelor se schimbă în funcție de poziția înregistrării active.

Dacă înregistrarea activă este la sfârșitul recordsetului atunci butoanele “>>” și “>|” sunt deacivate. Aceste butoane devin active numai dacă înregistrarea activă este mutată către începutul recordsetului.

Dacă înregistrarea activă este la începutul recordsetului atunci butoanele “<<” și “|<” sunt deacivate. Aceste butoane devin active numai dacă înregistrarea activă este mutată către capătul recordsetului.

Pentru a adăuga produse în tabelul HTML care reprezintă comanda se folosește procedura d_tbl_onclick. Procedura este executată când apare evenimentul click la tabelul d_tbl.

Procedura identifică linia din tabel pe care s-a dat click si copiază conținutul liniei în tabelul d_tbl2. Deoarece nu se poate scrie proceduri pentru obiecte create în timpul rulării programului pocedura folosește proprietatea window.event. Această proprietate se referă la un eveniment apărut în fereastra browserului. În acest caz evenimentul click se propagă în ierarhia de obiecte astfel:

cell row tablewindow

Cu proprietatea window.event.srcElement se poate găsi elementul care a generat evenimentul click. Trebuie verificat dacă elementul este o celulă au unui tabel. Pentru a vedea dacă elementul este celulă se verifică dacă proprietatea window.event.srcElement.tagName este egală cu TD. Dacă elementul este celulă se poate găsi linia din care face parte cu proprietatea parentElement.

După ce s-a identificat linia pe care s-a dat click se verifică dacă produsul nu a mai fost adăugat la tabelul cu comanzi. În cazul în care produsul nu a fost găsit se se adaugă o linie nouă în tabelul HTML. Linia conține celule pentru înregistrările nrcrt,denumire valoare și pentru un textbox în care se adaugă cantitatea comandată.

Redesenarea paginii HTML se face automat fără a fi nevoie ca aceasta șă fie reîncărcată.

sub d_tbl_onclick

if window.event.srcElement.tagName="TD" then

set tr = window.event.srcElement.parentElement

nrcrt=tr.cells(0).innerText

if check_tbl(Clng(nrcrt))=false then

denumire=tr.cells(1).innerText

valoare=tr.cells(2).innerText

set tr2=d_tbl2.insertRow

set rc2=tr2.insertCell

rc2.width="15%"

rc2.innerText=nrcrt

set rc2=tr2.insertCell

rc2.innerText=denumire

rc2.width="55%"

set rc2=tr2.insertCell

rc2.width="20%"

rc2.innerText=valoare

set rc2=tr2.insertCell

rc2.width="10%"

rc2.innerHTML="<INPUT align=right style='WIDTH: 58px; HEIGHT: 22px' size=8 value=1>"

end if

end if

calc_total

end sub

Pentru a verifica dacă în tabelul HTML cu comenzi nu exită comenzi duplicate se folosește funcția check_tbl(nrcrt). Parametrul nrcrt reprezintă codul care trebuie trebuie găsit. Funcția ia fiecare obiect de tipul row din coloecția de linii(obiecte row) și verifică dacă valoarea textului din prima celulă este zero. Dacă codul materialului este găsit în tabel atunci funcția ia valoarea true și întoarce controlul la procedura apenlantă. Dacă au fost parcurse toate liniile din tabelul HTML înseamnă că nu s-a găsit codul și funcția ia valoarea false

function check_tbl(nrcrt)

dim r

for each r in d_tbl2.rows

if nrcrt=Clng(r.cells(0).innerText) then

check_tbl=true

exit function

end if

next

check_tbl=false

end function

Pentru a șterge materiale din tabelul cu comenzi trebuie ștearsă linia cu produsul. Ștergerea unei linii se face asemănător cu adăugarea de linii. Procedura d_tbl2_onmousedown este apelată când apare evenimentul mousedown în tabelul d_tbl2. Deoarece evenimentul poate să apară și când se dă click și pe bordura sau linia separatoare dintre coloane trebuie verificat dacă obiectul care a generat evenimentul este celulă de tabel. Dacă obiectul este celulă se găsește parintele celulei adică linia din care face parte. Ștergerea liniei din tabel se face cu metoda deleteRow care primește ca parametru indexul liniei care trebuie ștearsă. Indexul unei linii de tabel este dat de proprietatea rowIndex. După ștergerea liniei se calculează valoarea totală cu procedura clac_total.

sub d_tbl2_onmousedown

if window.event.srcElement.tagName="TD" AND

window.event.button=1 then

d_tbl2.deleteRow(window.event.srcElement.parentElement.rowIndex)

calc_total

end if

end sub

După ce se adaugă un produs în tabelul cu comenzile se calculează valoarea totală a comenzii. Calculul valorii totale se face atunci când se adaugă un produs la comandă, când se șterge un produs și când se modifică o cantitatea comandată.

În mod normal în cazul modificării valorii din textbox se scrie o procedură pentru evenimentul onchance. Acea procedură apeleză calc_total. Pentru obiecte care nu sunt create în momentul editării paginii HTML nu se poate scrie proceduri care să trateze evenimentle. De acea se folosește o procedură care este apelată la apariția evenimentului onkeypress. Procedura verifică dacă evenimentul vine de la textbox-ul cu cantitatea comandată și apelează procedura calc_total.

sub d_tbl2_onkeypress

if window.event.srcElement.tagName="INPUT" then

calc_total

end if

end sub

Procedura calc_total este cea care calculează și afișează suma. Suma este reprezentată de variabila sum care este inițializată cu zero. Suma se calculează prin parcurgerea tuturor liniilor din tabelul cu comenzi.

sub calc_total

dim r,sum

sum = 0

for each r in d_tbl2.rows

if r.cells(3).all(0).value<>"" then

sum = sum +Clng(r.cells(2).innerText)*Clng(r.cells(3).all(0).value)

end if

next

divTotal.innerText= CCur(sum)

end sub

Înregistrarea propriuzisă a comenzilor în baza de date se face cu procedura cmdContinua_onclick. Procedura este apelată la apatiția evenimentului click la butonul cmdContinua. Înainte de a înreginstra comanda în baza de date procedura verifică dacă sunt linii în tabelul cu comenzi. Dacă nu sunt linii în tabelul de comandă se afișează un mesaj de eroare și înregistrarea este oprită.

Dacă există linii în tabelul cu comenzi înregistrarea comenzilor în baza de date continuă.

Mai întâi se adaugă o înregistrare în recordsetul recComH. Deoarece câmpul nr_cmd este de tipul autonumber valoarea acestuia nu trebuie setată. Codul clientului este regăsit în memoria browserului și apoi trecut în tabelul bazei de date. Datele sunt salvate print apelarea metodei recComH.Update. După ce sau înregistrat datele despre comandă în baza de date trebuie înregistrat și conținutul comenzii.

Pentru fiecare linie din tabelul HTML cu comenzi se adaugă o înregistrare în recordsetul recComD. Pentru fiecare înregistrare valoarea câmpului nr_cmd din recComD trebuie setată la valoare câmpului nr_cmd din recComH. Acest lucru este necesar pentru a nu invalida relațiile din baza de date. După ce s-a înregistrat datele despre un produs comandat în baza de date se caută în recordsetul recTMarfa înregistrarea despre produsul repesprectiv și se actualizează valoare stocului pentru acel produs. Înregistrarea din recordsetul recTMarfa este căutată cu metoda FindFirst. Înregistrarea este găsită întodeauna deoarece codul căutat este din baza de date. În procesul de căutare înregistrarea activă este pozitionată pe înregistrarea care corespunde criteriului de cautare. După căutare înregistrarea este editată prin apelarea metodei Edit. Valorile câmpurilor sunt schimbate și apoi aceste valori trebuie salvate înapoi în baza de date prin apelarea metodei Update.

După ce se termină de înregistrat materialele din comandă se adaugă o nouă înregistrare în recordsetul recInc. Pentru a se menține relația de unu la unu între tabelul ComenziHeader și Incasari în câmpul nr_incasare se trece numărul comenzii și apoi se trec modul de plată, valoare comenzii și data.

În funcție de modul de plată se încarcă în browser o pagină care informează clientul despre modul de primire a produselor comandate și despre modul de plată.

sub cmdContinua_onclick

dim r,sum

if d_tbl2.rows.length>0 then

calc_total

sum = 0

cmdContinua.disabled=true

nr_client=Clng(document.cookie)

recComH.AddNew

nr_com=recComH.Fields(0).value

recComH.Fields(1).value=nr_client

recComH.Update

for each r in d_tbl2.rows

recComD.AddNew

recComD.Fields(0).value=nr_com

recComD.Fields(1).value=Clng(r.cells(0).innerText)

recComD.Fields(2).value=Clng(r.cells(3).all(0).value)

recComD.Update

recTMarfa.MoveFirst

recTMarfa.FindFirst "Cod_marfa = " +r.cells(0).innerText

recTMarfa.Edit

recTMarfa.Fields(3).value= recMarfa.Fields(3).value – Clng(r.cells(3).all(0).value)

recTMarfa.Update

sum = sum + Clng(r.cells(2).innerText)*Clng(r.cells(3).all(0).value)

next

recInc.AddNew

recInc.Fields("nr_incasare") = nr_com

recInc.Fields("mod_plata") = Clng(opMod_plata.value)

recInc.Fields("valoare") = CCur(sum)

recInc.Fields("data") = Date()

recInc.Update

if opMod_plata.value="1" then

window.navigate("endcredit.htm")

else

window.navigate("endmand.htm")

end if

else

MsgBox "Pentru a trimite o comanda trebuie selectat cel putin un produs. Pentru a adauga produse in lista dati un click pe produsele din tabel si completati cantitatea dorita"

end if

end sub

Manual de utilizare

Manualul de utilizare este în format electronic și este asociat aplicației. Manualul este un fisier în formatul Windows Help și poate fi accesat în timpul rulării aplicației. De asemenea fiecărei părți din aplicație îi este asociată o patre din fisierul Windows Help care poate fi accesată automat.

Documentație formulare

Formularul ComenziHeader

Acest formuar nu este folosit pentru a introduce date in tabele.

Formularul este folosit doar pentru a vizualiza datele din tabelele ComenziHeader,ComenziDate si Incasari.

Pentru comenda cu nr_cmd=22 sunt afisate inregistrarile din tabelul ComenziData care au nr_cmd=2 si din tabelul Incasari care au nr_incasare=22.

Deoarece intre tabelele ComenziHeader si ComenziData este o relatie unu la mai multi, pentru fiecare inregistrare din ComenziHeader pot exista mai multe inregistrari in ComenziData. Inregistrarile din ComenziData sunt afisate cu ajutorul unui tabel

Formularul Clienti

Formularul clienti este folosit pentru a vedea datele despre un cliet si eventual pentru a cauta un client

In acest formular nu se pot modifica date clientilor dar se pot sterge clienti.

Stergerea unui client se poate face daca inregistrarea despre acesta nu se afla in relatie cu alte inregistrari

Formularul Marfa

Acest formular este folosit pentru a introduce date depre produsele vandute de catre magazinul virtual. Codul marfii este unic si de aceea pot aparea erori la introducerea de produse noi

Campurile UM si Furnizor sunt cititre din tabelele Um si furnizor. In acest fel se evita introducerea de produse care nu au fornizorul trecut in baza de date.

Campul CantComanda reprezinta cantitatea comandata automat cand stocul scade sub stocul minim.

Campul StocMinim reprezinta stocul minim. Daca se doreste sa se lichideze stocul unui produs acesta trebuie trecut pe 0.

Formularul Furnizori

Formularul este folosit pentru a introduce date depre furnizori. Campul Cod_furnizor este unic pentru fiecare furnizor si nu poare fi duplicat.

Toate campurile formularului trebuie completate deoarece sunt necesare la afisarea rapoartelor.

Formularul Procesare_comenzi_Aprovizionare

Formularul este folosit pentru a procesa individual comenzile de aprovizionare.

Formularul este format din formularul Procesare comenzi Aprovizionare si din subformularele Mafa si Comenzi Aprovizionare

Subformularul Marfa nu este vizibil si este folosit doar pentru a actualiza stocul produselor dupa procesarea comenzilor de aprovizionare

Subformularul Comenzi Aprovizionare afiseaza inregistrarile din tabelul ComenziAprovizionare. Legatura dintre formular si subformular se face prin campurile cod_marfa de pe cele doua fomulare.

Procesarea comenzilor de aprovizionare se face astfel:

1.formularul Procesare comenzi Aprovizionare citeste inregistrarile din interogarea StocLimita

2.se selecteaza inregistrarea cu comanda care trebuie procesata

3.se de clic pe butonul AddComanda>. Codul asociat evenimantului click al butonului adauga o noua inregistrare in tabelul ComenziAprovizionare si adauga CantComandata la campul Stoc din tabelul Marfa.

Similar Posts