Functionalitatea Aplicatiei de Contabilitate a Stocurilor
CUPRINS
INTRODUCERE
Cap. 1. CONTABILITATEA STOCURILOR
1.1 Stocurile
1.1.1 Definiția și clasificarea stocurilor
1.2 Evaluarea Stocurilor
1.2.1 Evaluarea la intrarea în gestiune
1.2.2 Evaluarea la ieșirea din gestiune
1.2.3 Evaluarea la închiderea exercițiului financiar
Cap. 2. TEHNOLOGII UTILIZATE
2.1 SQL Server 2012
2.2 Visual Studio 2012
Cap. 3. FUNCȚIONALITATEA APLICAȚIEI
3.1 Baza de Date
3.1.1 Definirea dicționarului de date
3.1.2 Prezentarea tabelelor
3.1.3 Prezentarea diagramei bazei de date și legăturilor dintre tabele
3.1.4 Schema generală a aplicației
3.2 Aplicația
3.2.1 Instalarea aplicației
3.2.2 Importarea bazei da date
3.2.3 Utilizarea aplicației
Cap. 4. CONCLUZII
BIBLIOGRAFIE
INTRODUCERE
În baza cunoștințelor acumulate în cei 3 ani petrecuți la specializarea Informatică Economică, cunoștințe privind lucrul cu baze de date, dezvoltarea de aplicații cu ajutorul unor programe precum Visual Studio și alte cunoștințe din domeniul economic și contabil, am realizat această lucrare de licență care presupune gestiunea stocurilor și produselor intr-o firmă, ce folosește ca sistem de gestiune a bazelor de date programul creat de Microsoft, și anume SQL Server 2012.
În această lucrare, partea teoretică prezentată se referă la contabilitatea de gestiune a stocurilor precum și la elemente teoretice referitoare la limbajul de programare C# utilizat cu Windows Forms care este o extensie din cadrul programului Visual Studio și la bazele de date și sistemelor de gestiune a bazelor de date, cu ajutorul carora am realizat această aplicație de gestiune a stocurilor și produselor.
În zilele noastre, sistemele de baze de date sunt folosite în orice domeniu, facând lucrul cu date mult mai ușor și mai eficient, simpla foaie devenind un domeniu al trecutului. De asemenea, riscul de pierdere de informații este unul mult mai scăzut decât in cazul păstrării de informații prin alte metode decât cele informatice. Eficiența este una mult mai ridicată deoarece accesul la datele stocate într-un sistem informatic este unul mult mai ușor, cu ajutorul unui singur click putem căuta o mulțime de informații fără a fi nevoie de a răsfoi întregi registre. În aplicație mea, toate spusele din această introducere sunt confirmate deoarece demonstrează faptul ca importanța unui sistem informatic într-o firmă (mai ales dacă este vorba despre o firma dezvoltată și care dispune de o mulțime de informații în care lucrul cu registre este foarte greu) este una foarte mare. Totodată, utilizarea unei astfel de aplicații ca cea creată de mine este una simplă și eficientă, nefiind nevoie de sisteme de calcul foarte avansate și scumpe.
Am considerat că programele SQL Server 2012 și Visual Studio 2012 sunt aplicațiile potrivite pentru realizarea acestei lucrări de licența datorită faptului că sunt tehnologii foarte utilizate în zilele noastre iar invățarea acestor programe poate ajuta la o dezvoltare profesională în domeniul informatic. Deși aplicația pe care eu am proiectat-o este una mult mai simplă decât cele proiectate de programatori experimentați, consider ca este un bun start pentru mine în ceea ce privește învățarea acestor programe și dezvoltarea mea profesională în acest domeniu.
Cap. 1. CONTABILITATEA STOCURILOR
1.1. STOCURILE
Definiția și clasificarea stocurile
„Stocurile sunt active cu conținut material destinate pentru a fi vândute în stare inițială sau pentru a fi consumate la prima lor utilizare.
Potrivit IAS 2 ,,Contabilitatea Stocurilor” sunt considerate stocuri acele active:
Deținute pentru a fi vândute pe parcursul desfășurării normale a activității;
În curs de producție în vederea vânzării în aceleași condiții de mai sus;
Sub formă de materii prime, materiale și alte consumabile ce urmează a fi folosite în procesul de producție sau pentru prestarea de servicii.
Structura stocurilor cuprinde:
Materiile prime care participă direct la realizarea produsului și se găsesc în produsul final integral sau parțal, fie în starea lor inițială, fie modificată;
Materialele consumabile sunt materialele care intră în componența produsului finit, având un caracter secundar sau pentru nevoile administrativ – gospodărești;
Produsele în curs de execuție reprezintă lucrările și serviciile aflate în curs de realizare la sfârșitul perioadei;
Semifabricatele sunt acele produse care au parcurs o parte din procesul de producție, reprezentând componenta de bază a produselor finite;
Lucrările și serviciile în curs de execuție reprezintă lucrprile și serviciile aflate în curs de reașozare la sfârșitul perioadei;
Produsele finite, adică acele produse care au parcurs toate fazele procesului de producție și corespund din punct de vedere calitativ, fiind în depozite pentru a fi livrate terților;
Produsele reziduale sunt deșeuri vandabile;
Mărfurile sunt acele bunuri destinate vânzării către populație prin unități cu amănuntul sau direct, din depozitele cu ridicata;
Ambalajele sunt destinate pentru a fi folosite pentru protejarea produselor și mărfurilor pe timpul transportului sau depozitării, precum și la prezentarea în magazine.”
1.2. EVALUAREA STOCURILOR
Evaluarea stocurilor în mai multe momente apare ca o necesitate, deoarece aceste bunuri se regăsesc în permanență în structura activului întreprinderii. Astfel, stocurile trebuie evaluate atât în structura activului întreprinderii. Astfel, stocurile trebuie evaluate atât în contabilitatea curentă cât și în situațiile financiare anuale.
La baza evaluării stocurilor stau regulile generale de avaluare care trebuie puse în acord cu regulile și principiile contabile.
Evaluarea stocurilor are loc în următoarele momente:
La intrare în gestiune;
La ieșire din gestiune;
La închiderea exercițiului financiar.
1.2.1 Evaluarea la intrarea în gestiune
Mărfurile achiziționate cu titlu oneros se evaluează la cost de achiziție. Conform normei contabile internaționale IAS 2 “Stocuri”, revizuită in 1993, costul de achiziție cuprinde prețul de cumpărare, taxele vamale și alte cheltuieli direct imputabile achiziției de stocuri în procesul aprovizionării (cheltuieli de incărcăre, transport, manipulare, asigurare, descărcare). În cazul unitaților neplătitoare de TVA, această taxă intră în componența prețului de înregistrare a mărfurilor aprovizionate. Conform OMFP nr. 306/2002 pentru aprobarea Reglementărilor contabile simplificate armonizate cu directivele Europene, costul de achiziție al unui bun este format din prețul de cumpărare, taxele nerecuperabile, cheltuielile de transport, aprovizionare și alte cheltuieli accesorii pentru punerea în stare de utilitate sau intrarea în gestiune a bunului respectiv.
,,Costul de achiziție al unui element de stoc este prețul plătit pentru cumpărarea sa sau mărimea avantajelor consimțite de cumpărător; costul include cheltuielile directe și indirecte angajate pentru a aduce bunul în starea și în locul în care se gasește”.
,,Costul de producție este utilizat pentru evaluarea și înregistrarea în contabilitate a stocurilor obținute în urma realizării procesului de producție. Acest cost este format din:
costul de achiziție al materiior prime și al materialelor consumabile folosite pentru realizarea produsului;
cheltuielile de prelucrare care cuprind costurile cu salariile directe și alte cheltuieli similare;
cota de cheltuieli indirecte de producție sau fixe de producție formată din amortizarea, întreținerea secțiilor și utilajelor precum și costurile de conducere și administrare a secțiilor de producție.
1.2.2 Evaluarea la ieșirea din gestiune
Acesta se realizează în momentul vânzării sau dării în consum a activelor, la valoarea de intrare. Aceasta se diferențiază pentru același sortiment de marfă, în funcție de calea de intrare și perioada intrării în patrimoniu. De aceea, pentru evaluarea mărfurilor la ieșirea din patrimoniu, reglementările și standardele internaționale recomandă următoarele metode de evaluare:
metoda costului mediu ponderat (CMP);
metoda prima intrare – prima ieșire (FIFO);
metoda ultima intrare – prima ieșire (LIFO);
metoda prețului cu amănuntul utilizat de către magazinele de vânzare cu amănuntul și alimentația publică;
alte metode prevăzute de normele legale (preț sau cost prestabilit).
Metoda costului mediu ponderat constă în evaluarea stocurilor la un cost stabilit după fiecare operațiune de intrare sau lunar, prin raportul dintre valoarea totală a stocului inițial plus valoarea intrărilor și cantitatea inițială la care se adaugă cantitatea intrată.
Metoda prima intrare – prima ieșire (FIFO) are la bază principiul epuizării stocurilor și constă în evaluarea ieșirilor din gestiune la costul primei intrări în gestiune până la epuizare, utilizându-se pentru evaluare costul următoarei intrări.
Metoda ultima intrare – ultima ieșire (LIFO) are la bază principiul epuizării stocului și constă în evaluarea ieșirilor din gestiune a stocurilor la costul utlimei intrări în gestiune până la epuizare, utilizându-se apoi costul intrării anterioare.
Alte metode utillizate pentru evaluarea ieșirilor din gestiune a stocurilor sunt prețul sau costul standard, costul de înlocuire a stocurilor, metoda prețului cu amănuntul, etc.
Metoda identificării specifice se utilizează atunci când se poate stabili costul de intrare a stocurilor, modalitate care poate fi realizată în cazul unor elemente care fac obiectul unei comenzi distincte.’’
1.2.3 Evaluarea la închiderea exercițiului
,,Se efectuează pentru stocurile existente în patrimoniu la închiderea exercițiului. De regulă, închiderea exercițiului financiar coincide cu mometul efectuării inventarierii activelor și pasivelor întreprinderii.
Cu ocazia inventarierii stocurilor e stabilește valoarea actuală denumită potrivit IAS 2, valoarea realizabilă netă. Estimarea valorii realizabile nete trebuie să se bazeze pe cele mai credibile dovezi în momentul în care are loc estimarea valorii stocurilor care se așteatptă a fi realizată. Pentru estimarea valorii stocurilor sunt luate în considerare:
prețul pieței;
starea bunurilor;
locul în care se regăsesc bunurile;
scopul pentru care stocurile sunt deținute.”
Pentru stocurile de mărfuri la care se constată diferențe în plus între valoarea de inventar și valoarea lor de intrare, la inchiderea exercițiului acestea sunt evaluate la valoarea de intrare. Se poate trage concluzia că plusul de valoare nu se inregistrează în contabilitate deoarece menținerea stocurilor la valoarea de intrare este impusa de principiul necompensării.
În cazul stocurilor de mărfuri la care s-au constatat diferențe în minus între valoarea de inventar și valoarea de intrare, acestea se evaluează, la închiderea exercițiului la valoarea de inventar. Deoarece minusul de valoare, în acest caz, nu are un caracter definitiv, fiind o depreciere reversibilă, se recurge la constituirea unui provizion pentru deprecierea mărfurilor. Dacă din valoarea de intrare a mărfurilor se deduce valoarea deprecierilor pentru care au fost calculate și inregistrate provizioane, se obține valoarea actuală sau valoarea netă a mărfurilor la care are loc evaluarea în bilanț.
Cap. 2. TEHNOLOGII UTILIZATE
Tehnologiile utilizate în realizarea acestei aplicații sunt SQL Server 2012 și Visual Studio 2012. Prima reprezintă un instrument de creare și administrare a bazelor de date necesară reținerilor datelor din aplcație iar a doua reprezintă un limbaj de programare cu ajutorul caruia am realizat aplicația.
2.1. SQL SERVER 2012
SQL Server este un program de administrare a bazelor de date relaționale dezvoltat și oferit spre utilizare de Microsoft. Ca și bază de date, este un produs software al cărei funcții principale este de a stoca și a primi date de la alte aplicații software (în cazul meu de la aplicația Visual Studio) care pot fi pe același computer dar și pe alte computere care sunt legate în rețea. Sunt foarte multe versiuni ale acestei aplicații fiecare fiind distribuită pentru diferite audiențe și pentru diverse volă un instrument de creare și administrare a bazelor de date necesară reținerilor datelor din aplcație iar a doua reprezintă un limbaj de programare cu ajutorul caruia am realizat aplicația.
2.1. SQL SERVER 2012
SQL Server este un program de administrare a bazelor de date relaționale dezvoltat și oferit spre utilizare de Microsoft. Ca și bază de date, este un produs software al cărei funcții principale este de a stoca și a primi date de la alte aplicații software (în cazul meu de la aplicația Visual Studio) care pot fi pe același computer dar și pe alte computere care sunt legate în rețea. Sunt foarte multe versiuni ale acestei aplicații fiecare fiind distribuită pentru diferite audiențe și pentru diverse volume de lucru, de la aplicații mici pentru un singur computer sau mai multe legate în reațea până la aplicații mari care își preiau datele de pe internet. Prima versiune a apărut în anul 1989 și se numea SQL Server 1.0.
Codul de bază pentru Microsoft SQL Server își are originile în Sybase SQL Server și a reprezentat intrarea Microsoft pe piața bazelor de date pentru întreprinderi, concurând cu Oracle, IBM și Sybase. Microsoft, Sybase si Ashton-Tate s-au unit pentru a crea și a scoate pe piață prima versiune numita SQL Server 4.2 pentru Win OS/2. Mai tarziu Microsoft a negociat pentru drepturi de exclusivitate la toate versiunile de SQL Server scrise pentru sistemele de operare Microsoft. Sybase și-a schimbat ulterior numele în Adaptive Server Enterprise, pentru a evita confuzia cu Microsoft SQL Server. SQL Server 7.0 a fost primul server de baze de date bazat pe GUI. O variantă de SQL Server 2000 a fost prima variantă comerciala pentru arhitectura Intel. Microsoft SQL Sever foloseste o varianta de SQL numita T-SQL, sau Transact-SQL, o implementare de SQL-92 (standardul ISO pentru SQL) cu unele extensii. T-SQL in principal adauga sintaxa aditionala pentru procedurile stocate si pentru tranzactii. Standardele SQL necesita ACID; acesta este un acronim pentru cele 4 conditii pentru orice tranzactie: atomicitate, consistenta, izolare, durabilitate. MS SQL Server suporta ODBC (Open Database Connectivity).
SQL Server 2012 este un sistem de gestiune a bazelor de date relaționale care oferă o varietate de ustensile de administrare pentru a ușura munca dezvoltării de aplicații ce conțin baze de date precum și administrării acestora. Cele mai folosite ustensile în dezvoltarea aplicațiilor sunt: SQL Server Management Studio, SQL Profiler, SQL Server Agent și SQL Server Configuration Manager.
În crearea aplicației mele am folosit SQL Server Management Studio dat fiind faptul că este o aplicație de dimensiuni mici și nu are nevoie de monitorizări amănunțite și e instalată pe un singur calculator.
SQL Server Management Studio (SSMS) este o interfață grafică inclusă în SQL Server începând cu versiunea 2005 iar în versiunele următoare a fost îmbunătățită având întrebuințări precum configurarea și administrarea tuturor componentelor din interiorul SQL Server. Acesta conține atât editor de cod cât și instrumente grafice care lucrează cu obiecte și caracteristici ale serverului. SQL Server Management Studio înlocuiește Enterprise Manager (a fost principalul instrument de administrare a SQL Server 2000) începând cu versiunea 2005. O caracteristică principală a SQL Server Management Studio o reprezintă Object Explorer, care permite utilizatorului parcurgă, selecteze sau să acționeze asupra oricărui obiect de pe server. Poate fi folosit pentru a observa și analiza interogari și optimiza performanța bazei de date, și multe altele. SSMS poate fi folosit și pentru a crea baze de date noi, modifica o bază de date existentă, crea tabele noi, adăuga tabele la o bază de date sau modifica tabele existente precum și coloanele acestora, analiza performanțele bazei de date. Include, de asemenea și fereastra de interogări care furnizează o interfață grafică pentru a scrie și executa interogări.
Data lansării a SQL Server 2012 a fost anunțată de Microsoft ca fiind următoarea versiune majoră a SQL Server pe 11 Octombrie 2011 la conferința PASS (Professional Association for SQL Server). Față de versiunile anterioarea, SQL Server 2012 prezintă caracteristici noi precum AlwaysOn SQL Server Failover Cluster Instances and Availability Groups care oferă un set de opțiuni pentru a îmbunătăți disponibilitatea unei baze de date, Contained Databases care simplifică transferul bazelor de date între instanțe, funcții dinamice și view-uri noi și îmunătățite, imbunătățiri de programabilitate care includ caracteristici noi, îmbunătățiri ale performanței și a securitați, îmbunătățirea rolurilor și permisiunilor utilizatorilor. Această versiune a fost ultima care a mai suportat OLE DB (Object Linking and Embedding Database) în loc sa prefere ODBC (Open Database Conectivity).
Stocarea datelor se realizează cu ajutorul unei baze de date care este o colecție de tabele. SQL Server suportă diferite tipuri de date, incluzând tipurile primare precum integer, float, decimal, char (care include și stringurile de caractere), varchar, text și altele. În plus, pe lângă tabele, o bază de date mai poate conține și alte obiecte precum view-uri, stored procedures și indecși. O bază de date în SQL Server poate conține un maxim de 231 obiecte. Datele din baza de date sunt stocate în fișiere primare cu extensia .mdf. Spațiu de stocare alocat la o bază de date este împărțit în pagini numerotate secvențial, fiecare cu o dimensiune de 8 KB. O pagină este unitatea de bază a I / O pentru operațiunile executate de SQL Server. O pagină este marcata cu un antet de 96 bytes care stochează metadate despre pagină, inclusiv numărul paginii, tipul de pagină, spațiul liber de pe pagină și ID-ul obiectului pe care îl deține. Tipul de pagină definește datele conținute în pagina – date stocate în baza de date, indecși, harta de alocare care deține informații cu privire la modul în care paginile sunt alocate pentru tabele și indicși, harta de schimbare care deține informații despre modificările făcute la alte pagini de la ultima copie de rezervă sau logare, sau conțin tipuri de date de mari dimensiuni, cum ar fi imagini sau text. În timp ce pagina este unitatea de bază a unei operațiuni I / O, spatiul este de fapt gestionat în termeni de extindere care constă din 8 pagini. Un obiect al bazei de date poate extinde toate cele 8 pagini într-o măsură ("măsură uniformă") sau de a partaja o măsură cu până la 7 mai multe obiecte ("măsură mixtă"). Un rând dintr-un tabel al bazei de date nu se poate extinde pe mai mult de o pagină, astfel încât este limitat la o dimensiune de 8 KB. Cu toate acestea, în cazul în care datele depășeșc 8 KB și rândul conține date de tip varchar sau varbinary, datele din aceste coloane sunt mutate într-o pagină nouă (sau, eventual, o secvență de pagini, numită unitate de alocare), și înlocuit cu un pointer către date.
2.2. VISUAL STUDIO 2012
Microsoft Visual Studio este un mediu de dezvoltare de aplicații integrat (IDE) de la Microsoft. Acesta este utilizat pentru a dezvolta programe de PC pentru familia Microsoft Windows de sisteme de operare, precum și site-uri web, aplicații web și servicii web. Visual Studio foloseste platforme de dezvoltare de software Microsoft, cum ar fi Windows API, Windows Forms, Windows Presentation Foundation, Windows Store și Microsoft Silverlight.
Visual Studio include un editor de cod care suportă IntelliSense (Intelligent Code Completion), precum și code refactoring (procesul de restructurare a codului fără a-i schimba sensul). Debugger-ul integrat funcționează atât ca un program de depanare la nivel de cod sursă cât și ca un debugger la nivel de mașină. Alte unelte built-in includ un designer de formulare pentru dezvoltarea aplicațiilor vizuale, web designer, designer de clasă, și designer de scheme de baze de date. Acceptă plug-in-uri care îmbunătățesc funcționalitatea la aproape toate nivelele, incluzând adăugarea suportului pentru sistemele de sursă de control (cum ar fi Subversion) și adăugarea de noi seturi de unelte, cum ar fi editori și designeri vizuali pentru limbaje specifice domeniului sau seturi de unelete pentru alte aspecte ale întregului ciclu de dezvoltare software (cum ar fi clientul Team Foundation Server: Team Explorer).9
Visual Studio suportă diferite limbaje de programare și permite editorului de cod și debugger-ului să sprijineasca (în grade diferite) aproape orice limbaj de programare, cu condiția să existe un serviciu a limbajului specific. Limbajele de programare incluse în Visual Studio sunt C, C++ si C++ / CLI (prin Visual C++), VB.NET (prin Visual Basic. NET), C# (prin Visual C#), și F#. Suport pentru alte limbaje, cum ar fi M, Python, Ruby printre altele, care este disponibil prin intermediul serviciilor limbajelor instalate separat. Aceasta mai suportă, de asemenea, XML / XSLT, HTML / XHTML, JavaScript și CSS.10
Microsoft oferă ediții "Express" ale Visual Studio care nu au nici un cost. Versiunile comerciale ale Visual Studio, împreună cu versiunile anterioare sunt disponibile gratuit pentru studenți prin programul Microsoft DreamSpark.
Printre caracteristicile ale programului Visual Studio le amintim pe cele care se regăsesc în aplicația de gestiune: editor de cod, debugger, windows forms designer, class designer, data designer și alte ustensile precum open tabs broser, properties editor, object browser, solution explorer, team exporer, data explorer, server explorer etc.
Voi vorbi puțin despre caracteristicile mai importante și voi începe cu caracteristica editor de cod. Acesta suportă sublinierea textului și completarea automată a codului folosind IntelliSense nu doar pentru variabile, funcții și metode ci și pentru construcții ale limbajului precum interogări. Sugestiile de completare automată apar în casete de tip listă, suprapus pe editorul de cod. De la versiunea Visual Studio 2008 și până în prezent această casetă se poate face semi transparentă pentru a se vedea codul ce este acoperit de aceasta. Editorul de cod este folosit pentru toate limbajele suportate de program.
Windows Forms Designer este folosit pentru dezvoltarea de aplicații cu interfață grafică folosind Windows Forms. Interfața poate fi controlată prin adăugarea elementelor în alte “containere” sau blocându-le într-o parte a form-ului. Elementele care afișează date (cum ar fi textbox, list box, grid view) pot fi legate de surse de date (data sources) precum baze de date sau interogări. Aceste elemente legate de date pot fi create prin glisarea obiectelor din fereastra Data Sources pe o suprafață de design. UI-ul (User Interface) este legat de cod folosind un model de programare determinat de evenimente. Designer-ul generează cod C# sau VB.NET pentru aplicație.
Class Designer este folosit pentru crearea și editarea claselor (incluzând membrii acestia precum și accesul la aceasta) folosing UML (Unified Modeling Language). Class designer-ul poate genera cod C# și VB.NET pentru clase și metode. Poate genera, de asemenea, diagrame de clasă pentru clasele scrise de mână.
Data designer poate fi folosit pentru editarea grafică a schemelor bazei de date, incluzând tabelele acesteia precum și chei primare și externe.
Cap. 3. FUNCȚIONALITATEA APLICAȚIEI
Aplicația a fost realizată utilizând programele Visual Studio 2012 și SQL Server 2010. În acest capitol va fi prezentată funcționalitatea acestei aplicații și modul de realizare a acesteia.
3.1. BAZA DE DATE
După cum precizam mai sus, baza de date a fost realizată utilizând programul oferit de Microsoft, numit SQL Server 2010 și care a fost prezentat într-un capitol anterior din această lucrare.
Baza de date se numește GestiuneFirma iar tabelele din cadrul acesteia, folosite pentru corecta funcționare a aplicației, sunt următoarele:
BonuriConsum (BonConsumID, ProdusID, Cantitate, NumarBon, DataBon, BonPentru, Observatii)
CategoriiProduse (CategorieID, Categorie, Observatii)
Chitanta (ChitantaID, ClientID, Suma, Moneda, Reprezentand, DataChitanta, NumarChitanta)
Clienti (ClientID, NumeCompanie, NumeContact, PrenumeContact, NumarTelefon, AdresaFacturare, Adresa, CodPostal, Tara)
DetaliiLogare(DetaliiLogareID, UserID, Username, Pasword, Firma, Tip)
Firme (FirmaID, NumeFirma, CIF, Sediul, Judet)
Furnizori (FurnizorID, Furnizor, NrRegCom, CodFiscal, Adresa, Telefon, Email, CIF)
IncasareClient (IncasareID, ClientID, Data, Client, Suma, TipIncasare, NrDocument, Observatii)
Produse (ProdusID, Denumire, CategorieID, Pret, Cantitate, CodEAN, CotaTVA, Observatii)
Users (UserID, Username, Pasword, Tip, CNP)
Legendă:
Underline – cheie primară
Bold – cheie externă
3.1.1 Definirea dicționarului de date
În continuare vom defini dicționarul de date. Definirea acestuia este necesara pentru o mai buna ințelegere a coloanelor tabelelor.
3.1.2 Prezentarea tabelelor
Fiecare tabelă are un scop bine definit in funcționarea aplicației. Totul incepe de la
tabela Users care conține utilizatorii necesari in logarea aplicației si fara de care aplicația nu este disponibilă spre utilizare. Aceasta tabelă conține mai multe coloane, dupa cum se poate observa si in figura 3.1 ilustrată mai jos.
Prima coloana, UserID reprezintă numărul curent al utilizatorului inregistrat precum si cheia primară a acestei tabele.. Aceasta coloană este folosită și pentru crearea legaturii cu tabela DetaliiLogare despre care vom vorbi in cele ce urmează. Următoarele doua coloane, Username și Pasword (deși nu e corect din punct de vedere al gramaticii engleze, este scris cu un singur ,,s” deoarece in SQL Server Password este un cuvant rezervat) reprezintă numele utilizatorului inregistrat respectiv parola pe care acesta o deține. Ultimele două coloane, Tip respectiv CNP, reprezintă tipul utilizatorului (care poate fi Admin sau User și despre care vom vorbi in prezentarea aplicației propriu zise) si CNP-ul acestuia.
În cele ce urmează, vom vorbi despre tabela DetaliiLogare. În această tabela se vor reține detaliile de logare precum numele utilizatorului, tipul acestuia și firma pe care se va lucra in interiorul aplicației. Coloanele acestei tabele sunt prezentate in figura 3.2 de mai jos.
Prima coloană a acestei tabele, DetaliiLogareID reprezintă numărul curent al ultimei logări efectuate în aplicație. Urmatoarea coloană, UserID reprezintă cheia externă care face legătura cu tabele Users. Ultimele patru coloane sunt aceleași ca cele din tabela Users.
A treia tabelă despre care vom vorbi este tabela Firme. In aceasta tabelă se vor reține datele firmei pe care se va lucra din interiorul aplicației și fără de care aplicația ar fi ambiguă, adică ar fi doar o aplicație universala de gestiune a stocurilor si produselor neputând fi ulterior personalizată pe o firma anume. Coloanele din această tabelă sunt cele ilustrate in figura 3.3 de mai jos.
Coloana FirmaID, la fel ca si in cazul tabelei Users si DetaliiLogare, reprezintă numarul curent al firmei înregistrate în aplicație precum si cheia primară a tabelei. Următoarele coloane, NumeFirma, CIF, Sediul, Judet, sunt sugestive reprezentând numele firmei precum și codul de identificare fiscală, sediul si județul in care se afla firma respectivă.
A patra tabelă pe care o voi prezenta este tabela Produse. După cum sugereazăm și numele, in această tabelă se vor reține produsele firmei care vor fi înregistrate in aplicație de către utilizatori. Pe lângă adăugarea produselor, acestea mai pot fi si șterse dn aceasta tabela, dar mai multe despre acest lucru vom vorbi în capitoulul legat strict de funcționarea aplicației propriu zise. Coloanele acestei tabele sunt prezentate in figura 3.4 de mai jos.
Coloana ProdusID (la fel ca la toate tabelele), reprezintă numărul curent al unui produs îregistrat precum si cheia primară a tabelei. Această coloană realizează și legătura cu o altă tabelă numită CategoriiProduse. Coloana Denumire, reprezintă, după cum sugerează si numele acesteia, denumirea sau numele unui produs. Coloana CategorieID, reprezintă o cheie externa catre tabela CategoriiProduse de unde va prelua numele categoriei de produs reprezentativă pentru produsul respectiv. Urmatoarele coloane Pret, Cantitate, CodEAN, CotaTVA și Observatii, sunt de asemenea sugestive reprezentând prețul produsul respectiv, cantitatea, codul numărului european de articol, cota de TVA precum și eventualele observații care pot fi introduse de catre un utilizator.
În continuare vom vorbi de tabela CategoriiProduse care este în strânsă legătură cu tabela Produse, dupa cum spuneam mai sus în cadrul prezentării tabelei anterioare. Această tabelă furnizează tabelei Produse, prin intermediul cheii primare, numele categoriei de produs reprezentativă pentru produsul repspectiv. Coloanele acestei tabele sunt ilustrate în cadrul figurii 3.5 de mai jos.
Avem doar 3 coloane in acestă tabelă CategorieID, Categorie și Observatii. Prima reprezintă numarul de ordine pentru o anumită categorie precum si cheia primară a tabelei, a doua reprezinta numele propriu zis al categoriei iar a treia eventualele observații pe care utilizatorii le pot introduce pentru o anumita categorie.
Următoarea tabelă pe care o vom prezenta este tabela Furnizori. Aceasta tabela va ține evidența tuturor furnizorilor firmei. Coloanele acestei tabele sunt ilustrate in figura 3.6 alăturată.
Ca la toate celelalte tabele, prima coloana, FurnizorID, reprezintă numarul curent al unui furnizor aflat în această tabelă. Această coloana este de asemenea și cheia primară a tabelei. Următoarele coloane, Furnizor, NrRegCom, CodFiscal, Adresa, Telefon, Email, CIF, reprezintă informații sugestive despre un furnizor. Coloanele enumerate anterior reprezintă numele furnizorului, numărul din registrul comerțului, codul fiscal precum si adresa la care se află firma, numărul de telefon al acesteia, email-ul și codul de identificare fiscală.
La fel ca și tabela Furnizori, tabela Clienti ține evidența clienților cu care firma are legătură. Această tabela se află într-o strânsă legătură cu alte două tabele, și anume: Chitanta și IncasareClient. Aceste două tabele conțin chei primare care fac legatura cu tabela Clienti. Această legătură a fost necesară pentru a se putea realiza chitanțele și încasările provenite de la clienți și pentru a se putea ilustra mai bine acest lucru în interiorul aplicației. Fară această legatură, chitanțele și încasările nu ar avea prezente pe ele nici o data despre client ceea ce ar face ca aceste documente sa fie ambigue, neștiind pentru cine sau cu ce scop au fost create. Coloanele prezente în această tabelă sunt ilustrate in figura 3.7 de mai jos.
Prima coloană, ClientID reprezintă (la fel ca la toate celelalte tabele) numărul curent al unui client din cadrul tabelei. Aceasta coloană este și cheia primară a tabelei și este folosită, după cum precizam in cadrul prezentării tabelei, pentru a face legătura cu tabelele Chitanta și IncasareClient. Celelalte coloane reprezintă informații sugestive despre un client precum numele acestuia, numele și prenumele persoanei de contact care poate fi contactată în orice situație , numărul de telefon al clientului, adresa de facturare la care se vor trimite chitanțele sau incasările, adresa la care se află sediul firmei, codul poștal si țara.
Urmatoarea tabelă despre care vom vorbi în continuare este tabela IncasareClient pentru a prezenta legătura dintre aceasta și tabela prezentată anterior. Tabela conține cheie externă pentru a realiza legătura cu tabela Clienti și pentru a face posibilă realizarea incasărilor pentru clienți. Cheia externă a acestei tabele o reprezintă coloana ClientID. Ca și la tabelele anterioare, voi prezenta în continuare structura acesteia, ilustrand in figura 3.8 de mai jos toate coloanele acestei tabele.
Prima coloană, IncasareID are același scop precum cele de la toate celelalte tabele, așa cum a fost evidențiat în cadrul prezentării tabelelor anterioare, și anume de a evidenția numărul curent al unei incasări prezente în acest tabel, precum și pentru a servi drept cheie primară pentru acest tabel. A doua coloană din acest tabel, reprezintă, după cum spuneam și mai sus in prezentarea propriu-zisă a tabelului, cheia externă necesară realizarii legăturii cu tabela Clienti. Următoarele coloane prezintă informații specifice necesare realizării unei incasări, precum: data la care a fost realizată încasarea, numele clientului, suma acesteia, tipul încasării (cash, banca sau altceva), numărul documentului și eventualele observații pe care utilizatorul dorește sau nu sa le introducă.
Ca și tabela IncasareClient, tabela Chitanta este într-o strânsă legătură cu tabela Clienti, din motivele prezentate anterior. Aceași cheie externă, ClientID este prezentă și in acest tabel. Coloanele acestui tabel vor fi prezentate in figura 3.9 alăturată.
dsadasdasdadasdsadasdas
dsa
dsadasdadsadasda
dsadsadasdsa
Primele două coloane ale acestui tabel (ca și pentru celelalte, de obicei), reprezintă cheia primară (ChitantaID) și cheia externă (ClientID). Ele au același rol ca și pentru tabelele prezentate anterior, doar scopuri diferite. Următoarele coloane, ca și în cazul tabelei IncasareClient, reprezintă informații specifice unei chitanțe precum: suma acesteia, moneda în care se va efectua plata, scopul acestei facturi, data la care s-a realizat chitanța și numărul documentului.
Ultima tabelă prezentă în această bază de date este BonuriConsum. Această tabelă realizează atât legătura cu tabela Clienti cât și cu tabela Produse. Această legătura cu ambele tabele este necesară pentru a se putea realiza un bon de consum într-un mod eficient astfel încat sa se poate realiza eliminarea produselor din tabela Produse în momentul în care acestea vor fi date în consum printr-un bon de consum. Legătura cu tabela Clienti este pentru a fi posbilă preluarea datelor unui client. Vom prezenta coloanele acestei tabele în cele ce urmează și vom ilustra coloanele acesteia în figura 3.10 de mai jos.
Prima coloană, BonuriConsumID este cheia primară a acestei tabele și reprezintă numarul curent al unui bon de consum. Următoarele două coloane, ClientID și ProdusID, reprezintă, după cum am precizat mai sus, cele două chei externe care crează legătura tabelei cu celelalte două tabele, necesare realizării unui bon de consum. Restul coloanelor prezintă informații specifice realizării unui bon de consum precum: cantitatea din produsul care urmează a fi dat spre consum, numărul bonului, data la care a fost realizat bonul de consum, pentru ce anume s-au dat produsele spre consum și eventualele observații pe care utilizatorul dorește sau nu sa le introducă.
3.1.3 Prezentarea diagramei bazei de date și legăturilor dintre tabele
După prezentarea tabelelor bazei de date, urmează prezentarea diagramei precum și legăturile dintre tabele. În următoarea figura (Fig. 3.1.1) este reprezentată diagrama care conține toate tabelele din baza de date.
După cum se poate observa în figura de mai sus, nu toate tabelele sunt legate între ele deoarece acest lucru nu a fost necesar. De exemplu, o legătură între tabela Chitanta și tabela DetaliiLogare nu era necesară din simplul fapt că nu e nevoie de nici o informație dintr-o tabelă pentru cealalaltă spre deosebire de Clienti și Chitanta unde este absolut necesară legătura pentru a știi pentru ce client s-a emis o chitanță.
În continuare vom prezenta toate legăturile și relațiile dintre tabele.
Între tabelele Users si DetaliiLogare (și invers) există o relație de 1,1, adică un utilizator se poate afla pe un singur detaliu de logare iar un detaliu de logare poate contine un singur utilizator.
Între tabelele Produse și BonuriConsum există o relație de 1,n, adică un produs se poate afla pe mai multe bonuri de consum (atât timp cât există cantitatea din produsul respectiv care se dă spre consum). Între BonuriConsum și Produse există o relație de 1,1, adică un bon de consum poate conține un singur produs.
Între tabelele Produse și CategoriiProduse (și invers) există o relație de n,n, adică mai multe produse se pot încadra în mai multe categorii de produs iar pe mai multe categorii de produs se pot afla mai multe produse.
Între tabelele Clienti și Chitanta există o relație de 1,n, adică un client se poate afla pe mai multe chitanțe. Între Chitanta și Clienti există o realație de n,n, adică pe mai multe chitanțe se pot afla mai mulți clienți.
Între tabelele Clienti și IncasareClient există o relație de 1,n, adica un client se poate afla pe o singura încasare. Între IncasareClient și Incasare există o relație de n,n, adică pe mai multe incasări se pot afla mai mulți clienti.
Este necesară și prezentarea legăturii tabelelor din baza de date cu documentele primare din aplicație, dupa cum urmeaza:
3.1.4 Schema generală a aplicației
3.2. APLICAȚIA
Aplicația propriu-zisă a fost realizată în programul Visual Studio 2012, program oferit de Microsoft și despre care am vorbit intr-un capitol anterior.
Aplicația realizează gestiunea produselor și stocurilor unei firme ținând evidența atât produselor și categoriilor de produse din cadrul firmei cât și evidența furnizorilor și clienților firmei. De asemenea, aplicația oferă și posibilitatea eliberării de chitanțe, încasări catre clienți, bonuri de consum și generarea unui raport pentru disponibilitatea stocului.
3.2.1. Instalarea aplicației
Pentru o mai ușoară furnizare a aplicației către un utilizator și fară riscul pierderii unor fișiere la copiere am creat un installer folosind o extensie pentru Visual Studio, și anume Install Shield 2013 Limited Edition care se poate achziționa gratuit. În figura următoare (Fig. 3.2.1) este prezentă pagina principală a acestei extensii.
Utilizarea acestei extensii nu este complicată. La secțiunea Application Information se vor furniza informațiile desre aplicație precum numele companiei, numele aplicației, versiunea aplicației și adresa web a companiei. În cadrul sectiunii Installation Requirements se solicită, la instalarea aplicației, utilizatorului o anumită versiune de windows sau instalarea unor programe adiționale pentru funcționarea corectă a aplicației. Următoarea secțiune, Installation Acrhitecture se păstreaza setările default dacă nu sunteți utilizator experimentat. La Application Files se furnizează fișierele aplicației care vor fi instalate. În cadrul acestei secțiuni este foarte important sa atașăm si fisierele bazei de date. Pentru a realiza acest lucru este nevoie sa realizăm o copie backup a bazei de date. În momentul instalării, acest fișier va fi furnizat utilizatorului care v-a fi nevoit să importe acest backup in programul SQL Server 2010 iar din acest motiv, utilizatorii aplicației vor fi nevoiți sa aibă instalat (iar in caz contrar să instaleze) acest program fară de care aplicația nu ar funcționa. Vom discuta despre importarea bazei de date intr-un subcapitol viitor. Următoarele două secțiuni ale installer-ului este, din nou, destinat utilizatorilor experimentați așa ca vom trece la ultima secține Installation Interview unde se vor pune o serie de intrebari la instalare, precum: posibilitatea instalării aplicației in altă locație decat cea default, posibilitatea pornirii aplicației de indată ce instalarea s-a efectuat.
Instalarea propriu-zisă a aplicației este una ușoară urmărindu-se pașii necesari instalării. După ce instalarea se efectuează aveți posibilitatea de a lansa automat aplicația sau de a o lansa ulterior.
3.2.2 Importarea bazei de date
După cum am precizat anterior, este necesară importarea fisierului backup al bazei de date in programul SQL Server 2010 pentru ca aplicația să funcționeze corect și pentru a se putea reține toate datele introdu-se in aplicație. Pentru a se realiza acest lucru vom deschide SQL Server 2010 si vom naviga la secțiunea Databases unde vom apăsa click dreapta cu mouse-ul și vom alege opțiunea Restore database… așa cum este prezentat in Fig. 3.2.2 de mai jos.
Următoarea fereastră care v-a apărea este cea din Fig. 3.2.3 de mai jos. Din această fereastră se va alege opțiunea Device și se va da click pe cele trei puncte (marcate cu casuță roșie in figura de mai jos) pentru a alege fișierul care s-a furnizat la instalarea aplicației navigând în locația care s-a ales la instalare. După ce fișierul a fost ales, se va apăsa pe butonul OK din fereastra de alegere a fișierului iar baza de date se va importa automat. Dat fiind faptul ca această bază de date nu are o dimensiune foarte mare importarea se va face repede (aproximativ 1-2 secunde) după care se va putea folosi fară nici o problemă.
Dacă s-au urmat pașii explicați, importarea se va efectua fără nici o problemă iar aplicația este gata de utilizare.
3.2.3 Utilizarea aplicației
După ce toți pașii au fost urmați corespunzător în importarea bazei de date și nici o eroare nu a fost prezentă aplicația poate fi lansată. În momentul lansării aplicației se va deschide o fereastră de logare (Fig. 3.2.4), fără de care un utilizator nu are acces la aplicație. Din motive de securitate, se va furniza utilizatorului care achiziționează aplicația un user prestabilit. Acest user este de tip administrator, acesta având posibilitatea de a adăuga alți utilizatori dupa logare sau de a schimba tipul altor utilizatori. Cele două tipuri de utilizator sunt următoarele:
Administrator – are acces la toate funcționalitațile aplicației și are posibilitatea de a adăuga alți utilizatori sau de a modifica utilizatori curenți;
Utilizator – nu are acces la toate funcționalitațile aplicației și nu poate adăuga utilizatori sau modifica utilizatorii curenți sub nici o formă.
În general, funcția de administrator este oferită doar persoanelor de încredere din firmă sau persoanelor care se ocupă de administrarea aplicației. Nici o altă persoană nu ar trebui sa aiba această funcție deoarece se pot produce daune mari firmei dacă există această intenție.
După cum spuneam, pentru a putea accesa aplicația este nevoie de autentificare. În această fereastră se vor introduce datele de autentificare, și anume: numele utilizatorului, parola acestuia și firma pe care urmează să se lucreze (implicit, firma se va numi Test aceasta urmând să se modifice sau sa se adauge una nouă din interiorul aplicației).
Dacă informațiile de autentificare au fost corecte, se va deschide fereastra principală a aplicației, în caz contrar se va afișa un mesaj de eroare (Fig. 3.2.5) care va atenționa utilizatorul că informațiile de logare nu sunt corecte sau ca nu sa completat una dintre casuțe.
Pentru ca accesul să fie restricționat altor persoane în afara celor care au conturi de utilizator, am folosit următorul cod pentru a selecta din tabela Users din baza de date utilizatorii existenți:
În primul rând este necesară realizarea conexiunii dintre aplicație și baza de date iar aceasta se face utilizând primul rand de cod de mai sus. Mai apoi se realizează un string care va conține interogarea și care va prelua din baza de date utilizatorul care va avea valorile din tabel egale cu cele din casuțele de text completate în fereastra de autentificare. În acest moment avem doar interogarea, dar aceasta nu se execută singură. Pentru a se realiza executarea acestei interogări va trebui să atribuim parametrului command interogarea, care mai apoi, utilizând conexiunea realizată anterior și deschisă, va fi executată in baza de date de unde se vor prelua rezultatele obținute.
Dacă informațiile de autentificare au fost corecte se va trece la următorul pas, și anume preluarea acestor informații și introducerea lor in tabela DetaliiLogare. Informațiile din această tabelă vor fi folosite pentru afișarea lor in fereastra principal după cum voi explica în subcapitolul următor. Realizarea inserării se face utilizând următorul cod:
Această inserarea se realizează pe același principiu ca la selectarea datelor dintr-o tabelă. Totuși, diferența față de selectare este ca în acest procedeu se folosesc parametrii pentru inserarea în tabel și nu datele preluate direct din casuțele de text. Am folosit și acest procedeu pentru a demonstra că această metodă, după parerea mea, este mai simplă și mai eficientă decât cea anterioară.
În continuare, voi prezenta fereastra principală a aplicației care este ilustrată în figura următoare (Fig. 3.2.6).
Vom prezenta această fereastra incepând cu partea de jos unde avem prezente informații despre utilizatorul care s-a logat în aplicație, data și ora curentă precum și firma pe care se lucrează. În centrul ferestrei se află menul principal structurat sub forma unor bilete cu imagini reprezentative pentru fiecare categorie. Acest meniu este funcțional, putandu-se accesa fiecare categorie. În partea de sus a aplicației avem meniul care este permanent prezent indiferent de categoria în care navigăm.
Pentru ca informațiile din partea de jos a aplicației sa fie prezente acestea se vor prelua din tabela DetaliiLogare. Această preluare se va realiza in momentul incărcării form-ului, dupa principiul folosit și la fereastra de autentificare. Inițial se va realiza conexiunea cu baza de date, mai apoi se va realiza string-ul cu interogarea iar mai apoi se va executa interogarea cu ajutorul conexiunii.
Există totuși o diferență între această interogare comparată cu cea de la fereastra de autentificare. Imediat după SELECT avem TOP 1 iar la sfârșitul interogării avem DESC. Ceea ce aceste construcții realizează in plus este că, cu ajutorul DESC vom ordona descrescător rezultatele iar cu ajutorul TOP 1 vom selecta un singur rând din tabelă pentru a lua ultimul utilizator autentificat.
Tot in momentul încărcării form-ului se verifică si tipul de utilizator, folosind aceași interogare ca cea de mai sus. Pentru a face posibilă această verificare vom folosi clasa SqlDataReader. Această clasă permite citirea rândurilor returnate de o interogare intr-un mod simplu și eficient. Utilizând această clasă, vom crea o variabilă de tipul acestei clase în care vom introduce rezultatele executarii interogarii de mai sus. Mai departe, se vor parcurge toate rezultatele și dacă coloana Tip (sqlReader[“Tip”]) din tabela DetaliiLogare nu este de tipul Admin se vor bloca form-urile care permit administrarea utilizatorilor, modificarea sau adugarea unei firme, clienții și furnizorii. În caz contrar toate formurile vor fi activate. Urmează inchiderea variabilei folosind metoda Close pentru a putea primi parametrii de ieșire.
Voi continua prin a prezenta fiecare categorie din toate cele 4 meniuri: configurare, nomenclator, introducere, stoc. Aceste form-uri ce urmează a fi explicate sunt copii ai form-ului principal care este parinte, în cazul in care un form nu este copil se va deschide independent de form-ul parinte. Pentru ca formul sa fie copil în momentul deschiderii am utilizat codul de mai jos:
Prima categorie din meniul Configurare pe care o voi prezenta este Utilizatori. Această categorie conține 3 form-uri frmUtilizatori, frmUtilizatoriAdd și frmUtilizatorUpdate. Primul form este ilustrat in figura 3.2.7 de mai jos. Celelalte doua form-uri sunt folosite pentru adăugarea unui utilizitor respectiv actualizarea unuia deja existent în baza de date.
Acest form conține un meniu creat dinamic la încărcarea form-ului în partea de sus cu butoane pentru adăugare utilizator nou, căutare utilizator, actualizare și ștergere utilizator existent precum și un buton de refresh care va reîncărca datele la apăsare. Form-ul mai conține un GridView care reține datele din baza de date și câmpuri de filtrare date prezente în partea de jos a form-ului.
Procesul de creare a meniului și afișarea lui în mod dinamic nu este unul foarte complicat. Prima dată, am creat meniul din partea vizuală a formului iar mai apoi, în partea de cod am creat o procedură care are ca și parametru un vector care conține toate elementele meniului.
Pentru ca meniul să fie vizibil în form, am folosit următorul cod:
toolStrip1.Show() face ca întreg meniul sa fie vizibil iar showToolbars, cu valorile true sau false, face ca un element al meniului să fie vizibil sa nu.
Pentru ca butoanele din meniu sa fie funcționale este nevoie ca în momentul apăsării lor, acestea sa preia proceduri din celelalte form-uri sau să realizeze deschiderea altor form-uri (după caz). În cazul butonului de Adăugare Utilizator nou, la apăsare acesta va deschide form-ul frmUtilizatoriAdd prezentat in figura următoare (Fig. 3.2.8).
Procesul de deschidere al acestui form utilizând butonul de Adaugare Utilizator se realizează utilizând următorul cod:
Prima dată, este necesară crearea a două instanțe ale celor două form-uri. Mai apoi se parcurg toate formurile care sunt copii ai formului principal. În cazul în care unul dintre form-urile copii este același cu form-ul frmUtilizatori atunci se va deschide formul frmUtilizatoriAdd.
În cadrul form-ului de adăugare utilizator nou, avem prezente mai multe câmpuri care conțin informații necesare adăugarii unui utilizator precum numele utilizatorului, parola acestuia, tipul utilizatorului (care poate fi Admin sau User) și codul numeric personal. Adăugarea unui utilizator se face prin completarea câmpurilor și apăsarea butonului Salvare. În momentul apăsării butonului, se execută codul care realizează inserarea în tabela Users a informațiilor furnizate în câmpurile din form dar nu înainte de a se verifica dacă toate câmpurile au fost completate. Inserarea se face folosind instrucțiunea INSERT INTO numele tabelei urmată de câmpurile în care dorim să inserăm și valorile pe care dorim sa le inserăm.
În căsuța de text anterioară am introdus tot codul care se execută în momentul apăsării butonului Salvare deoarece acesta se va aplica (în afară de instrucțiunile SQL și parametrii) la majoritatea form-urilor de adăugare sau actualizare. Din acest motiv, la celelalte form-uri voi adăuga codul care realizează actualizare sau adăugarea in baza de date. După cum spuneam mai sus, prima dată se face verificarea câmpurilor ce trebuiesc completate folosing proprietatea isNullOrEmpty. Dacă acestea nu sunt completate vom primi un mesaj de eroare care ne va atenționa acest lucru. Dacă acestea sunt completate se va trece mai departe la adăugarea informațiilor în baza de date utilizând conexiunea cu baza de date, absolut necesară ca inserarea sa se efectueze, și stringul care conține instrucțiunea de inserare. Inserarea datelor în tabela Users se realizează utilizând parametrii astfel ca este necesară declararea acestor parametrii și la fiecare trebuie adăugat campul respectiv din form. Mai apoi, se va deschide conexiunea, se va executa comanda SQL și se va inchide conexiunea. Am folosit corpurile try, catch si finally pentru ca în caz de eroare a comenzii SQL, aplicația să nu se întrerupă ci să afișeze un mesaj de eroare iar astfel aplicația va continua sa ruleze iar utilizatorul va sti care este eroarea. Finally este momentul în care toate comenzile s-au efectuat cu succes și nici o eroare nu a fost ,,aruncată”. Aici se realizează afișarea unui mesaj care ne informează ca un utilizator nou a fost adăugat în baza de date după care se va închide form-ul de adăugare (this.Close();).
Butonul de Actualizare utilizator realizează, dupa cum sugerează și numele acestuia, actualizarea unui utilizitor. De fapt, ceea ce face acest buton insă, e să deschidă form-ul frmUtilizatoriUpdate, deschiderea acestui form facandu-se după același procedeu ca în cazul butonului de Adăugare Utilizator, actualizarea propriu-zisă urmând a se face din interiorul form-ului respectiv. Acest form îl voi prezenta în cele ce urmează, fiind ilustrat în figura alăturată (Fig. 3.2.9).
Structura acestui form este identică cu cea a form-ului de adăugare utilizator nou, singura diferență e că pentru numele utilizatorului avem un combobox (cb) și nu un textbox. Motivul pentru care am folosit combobox a fost acela de a selecta din baza de date toți utilizatorii existenți și a popula cb-ul cu aceștia. În momentul în care se va selecta un utilizator din cb toate celelalte câmpuri se vor completa automat corespunzător cu datele utilizatorului respectiv din baza de date. Cb-ul se populează cu numele utilizatorilor în momentul incărcării form-ului după cum urmează:
Și în acest caz folosim clasa SqlDataReader la fel ca și în cazul verificării tipului de utilizator de la încărcarea formului principal (părinte). Rezultatele obținute în urma interogării pe tabela Users vor fi transmise in variabila sqlReader, după care se vor parcurge toate rezultatele și se vor introduce in combobox. E nevoie de deschiderea conexiunii înainte și inchiderea acesteia după executarea instrucțiunilor pentru o funcționare corectă.
Completarea celorlalte câmpuri conform cu informațiile din baza de date se face utilizând unul dintre event-urile combobx-ului, și anume SelectedIndexChanged. Ceea ce înseamnă de fapt acest event este faptul că în momentul în care valoarea din cb se schimbă, se întamplă ceva.
Codul începe prin selectarea din tabela Users a utilizatorilor al caror nume este egal cu valoarea selectată din combobox. După aceea, din nou utilizând variabila de tip SqlDataReader parcurgem toate rezultatele și vom reține în variabile de tip string toate datele ce dorim să le afișăm. Proprietatea GetString(i) a variabilei sqlReader preia datele din coloana i a tabelei Users (numerotarea coloanelor începe întotdeauna de la 0). Ex: sqlReader.GetString(2) preia datele din coloana Pasword a tabelei Users. După reținerea datelor în string-urile respective, se vor afișa în texbox-uri și/sau combobox-uri datele obținute.
Actualizarea unui utilizator se face apasând butonul de salvare. O parte din codul (deoarece restul este aproximativ asemanător ca la partea de introducere a unui utilizator) care face posibilă actualizarea este următorul:
După realizarea conexiunii cu baza de date și deschiderea acesteia precum și verificarea faptului că toate câmpurile au fost completate corespunzător (totul mode asemănător cu adăugarea unui utilizator), se execută instrucțiunea de UPDATE nume tabel urmat de SET coloană = parametru și WHERE nume utilizator = nume utilizator din combobox-ul numelui de utilizator. Dacă toate comenzile s-au efectuat cu success și nu a aparut vreo eroare, se va afișa un mesaj care va spune ca utilizatorul a fost actualizat.
Următorul buton din meniu despre care voi vorbi în continuare este cel de Stergere. Acest buton apelează din form-ul frmUtilizatori o procedură care se numește deleteRow. Apelarea acestei proceduri se realizează cu ajutorul următorului cod:
Inițial se crează o instanța a form-ului după care se vor parcurge toate form-urile care sunt copii ai form-ului părinte. Se verifică dacă form-ul curent este egal cu cel a carei instanță a fost creată, apoi se verifică dacă form-ul este intr-adevăr deschis iar dacă este deschis, se execută procedura.
Ștergerea propriu-zisă a unei valori din tabel se face selectând un rând din GridView și apasând pe butonul Stergere. Procedura de ștergere este următoarea:
După stabilirea conexiunii dintre aplicație și baza de date, primul lucru care trebuie făcut este să obținem numărul curent al rândului din DataGridView pe care l-am selectat cu mouse-ul după care se deschide conexiunea. Pe urmă, reținem intr-un string comanda DELETE de ștergere a unui utilizator din tabela Users, unde id-ul utilizatorului (sau numarul de identifiare) este egal cu numărul curent al rândului selectat din grid din care se preia valoarea din prima coloană care este id-ul utilizatorului. Dacă ștergerea s-a efectuat cu succes va apărea un mesaj care ne va confirma acest lucru, după care DataGridView-ul se va reactualiza automat și nu mai e nevoie de apăsarea butonului de refresh.
În continuare, voi prezenta butonul de Cautare utilizator. Căutarea se realizează cu ajutorul câmpurilor prezente în partea de jos a form-ului. Avem prezente trei câmpuri: în primul se va introduce numele utilizatorului pe care dorim sa îl căutăm (se poate introduce și doar parțial numele, și voi explica de ce în cele ce urmează), al doilea este un combobox care conține numele coloanelor după care putem să căutam iar al treilea este tot un combobox care conține valorile ASC si DESC după care putem ordona ascendent sau descendent rezultatele obținute. Acest buton apelează, la fel ca și in cazul celui de ștergere, o funcție prezentă în form-ul frmUtilizatori, și anume cautareUtilizator. Codul acestei funcții este următorul:
Prima dată se verifică dacă sunt completate câmpurile pentru căutare iar in caz afirmativ, după setarea conexiunii și deschiderea acesteia, se trece la următoarea verificare în care se verifică după ce coloană din tabelă dorim să cautăm un utilizator, iar mai apoi se trece la utlima verificare în care se va realiza cautarea propriu-zisă in baza de date după cum urmează:
Dacă valoarea selectată din combobox-ul de sortare este ASC, atunci rezultatele SELECT-ului care va căuta în tabelă după numele utilizatorului, ordonat după o coloană prezentă în combobox-ul cmbOrderBy vor fi ordonate ascendent. Nu e nevoie ca valoarea introdusă în casuța de căutare sa fie exact aceeași ca cea din tabelă deoarece am folosit WHERE Username LIKE nume_utilizator și nu WHERE Username = nume_utilizator, ceea ce face ca rezultatul returnat să conțină ceea ce este introdus în căsuța de căutare.
Dacă valoarea selectată din combobox-ul de sortare este DESC, atunci rezultatele SELECT-ului (care se vor căuta după același principiu ca la primul punct) vor fi ordonate descendent.
Acest procedeu de căutare continuă asemănător schimbându-se valoarea combobox-ului după care dorim să căutăm și SELECT-ul care va căuta în baza de date după valoarea combobox-ului respectiv.
La partea de afișare a valorilor din tabel am folosit, în momentul încărcării form-ului, clasa SqlDataAdapter care realizează conexiunea între baza de date si un DataTable. Un DataTable este un intrument vizual format din coloane și rânduri utilizate pentru a organiza informațiile dintr-o tabelă a bazei de date, iar în cazul nostru este vorba de tabela Users.
Bineînțeles că înainte de a se executa aceste comenzi care preiau date din baza de date, este nevoie ca înainte sa se facă conexiunea la baza de date așa cum am explicat mai sus în acest capitol. În variabila sda se vor reține rezultatele interogării (SELECT) care ia din tabelele Produse și CategoriiProduse informațiile pe care dorim sa le afișăm utilizând variabila conn care conține conexiunea. Pentru a putea lua informații din ambele tabele este nevoie de a uni tabelele fiind necesare cheia primară din prima tabelă si cea externă din a doua. În continuare, se va crea o variabilă de tip DataTable în care se vor introduce rezultatele interogării (sda.Fill(dt);) iar mai apoi rezultatele din acest DataTable se vor afișa in form cu ajutorul unui DataGridView.
Următoarea categorie din meniul Categorie pe care o voi prezenta în continuare este Firma. Avem un singur form pentru această categorie, și anume frmFirma în care se vor putea operațiuni de adăugare firmă nouă și actualizare firmă existentă. Nu am considerat necesară utilizarea unui DataGridView ca în cazul secțiunii de Utilizatori datorită faptului că aceasta tabelă (Firme) nu conține la fel de multe date ca cea de utilizatori. Acest form nu este un copil al formului principal deci se va deschide independent de formul părinte. În figura următoare (Fig. 3.2.10) este ilustrat acest form.
Acest form conține informații necesare inregistrării unei firme în aplicație precum id-ul firmei (sau numărul de identificare), numele firmei, codul de identificare fiscală, sediul si județul în care este localizată firma. Aceste informații sunt necesare în întregime deoarece vor fi trecute pe chitanțe, încasări clienți precum și pe bonurile de consum. Acest form mai conține si trei butoane: de adăugare firma, de actualizare firma existentă și de golire a câmpurilor. Procedurile de adăugare, actualizare și golire sunt asemănătoare cu cele de la categoria Utilizatori iar din acest motiv nu mai e nevoie de o prezentare la fel de amănunțită.
Ultima categorie din cadrul meniului Configurare este cea de Notificari Email. Cu ajutorul acestui form (frmMailNotification) putem trimite clienților, furnizorilor, utilizatorilor aplicației sau oricui deține o adresă de email, notificări prin intermediul acestui serviciu. Acest form este ilustrat in figura următoare (Fig. 3.2.11).
Structura acestui form este una destul de simplă și specifică unui serviciu de email precum gmail. Avem prezente câmpuri pentru persoana care trimite email-ul, persoana către care se trimite email-ul, subiectul acestuia și mesajul propriu zis. Este o singură procedură care realizează trimiterea email-ului și se apelează în momentul apăsării butonului de trimitere.
Pentru ca aceste notificări prin mail să funcționeze, trebuie configurat clientul serviciului de email. În cazul de fața, clientul este gmail iar setările precum port-ul si protocolul (smtp) trebuie sa fie reale și in concordanța cu serviciul de email oferit de google altfel nu ar fi posibilă transmiterea email-urilor. Credentials reprezintă datele de autentificare ale contului de pe care vor fi trimise mesajele și din nou, acestea trebuie sa fie reale. După ce toate aceste setări au fost realizate, se crează un nou mesaj (MailMessage) la care se va adăuga persoana către care va fi transmis mesajul iar aceasta se va transmite din casuța de text prezentă pe form (la fel ca si pentru celelalte informații), persoana care va trimite mesajul, subiectul mesajului și mesajul propriu zis. La final, dacă toate setările sunt în ordine, email-ul va fi trimis și se va afișa un mesaj care va confirma acest lucru.
În cadrul meniului de Configurare mai avem o singură opțiune, și anume Iesire. Mai departe voi vorbi despre meniul Nomenclator.
Depsre toate categoriile (produse, categorii produse, furnizori, clienți) din cadrul meniului Nomenclator voi vorbi la general datorită faptului că toate sunt asemănătoare diferind doar interogările din baza de date și tabelele. Toate aceste categorii au prezente meniul dinamic cu aceleași butoane care execută proceduri din form-uri sau deschid form-uri de adăugare/actualizare, despre care am vorbit și la categoria de utilizatori din meniul Configurare. De asemenea, acestea au și form-uri pentru adăugare și actualizare precum și câmpuri pentru căutare. Ceea ce avem in plus la aceste categorii, este generarea unui id de produs automat de către aplicație la adăugare și am implementat acest lucru pentru faptul că într-o tabelă în SQL nu se poate adăuga un produs cu același id, și la adăugarea unui produs sa nu ne mai consultam cu ceea ce este în tabelă și a pierde timp, am decis sa implementez această funcționalitate care generează automat un număr cuprins între 1 și 10000 (valoarea maximă se poate modfica dupa nevoi). Codul care generează acest număr este unul foarte simplu:
Generarea acestui număr se realizează creând o variabilă utilizând clasa Random iar apoi vom folosi proprietatea Next a acestei clase pentru a genera numărul cuprins între 1 și 10000. Numărul îl vom afișa în casuța de text aferentă id-ului și care este nemodificabilă.
Următorul meniu despre care voi vorbi, este Introducere. În acest meniu avem categoriile Chitanță, Încasare Client și Bonuri de Consum. Aceste categorii au aceleași caracteristici ca celelalte despre care am vorbit până acum, dar cu anumite plusuri sau diferențe pe care le voi explica în cele ce urmează.
În primul rând, o diferența generală în toate cele trei categorii este aceea că în meniul generat dinamic se mai regăsește (pe lângă cele deja existente) și butonul de Print cu ajutorul căruia putem printa o chitanța, o încasare sau un bon de consum din baza de date. Acest buton, ca și celelalte, execută o procedură din una dintre cele trei categorii, și anume printChitanta. În figura de mai jos (Fig. 3.2.12) este ilustrat un exemplu de chitanță.
Aceasta a fost creată doar cu ajutorul liniilor de cod, fară nici un alt program. Procedura printChitanta care se apelează la apăsarea butonului de printare, apelează la rândul ei o procedură care crează toată această chitanță. Deoarece este o procedură mai lungă, voi explica doar ce nu a mai fost explicat până acum.
În colțul din stânga sus a chitanței avem date generale despre firmă. Aceste date sunt luate din baza de date (tabela Firme). Datele sunt preluate tot cu ajutorul clasei SqlDataReader și reținute în stringuri. În exemplul de mai jos, este preluat din baza de date numele firmei. Acesta este afișat pe chitanța cu ajutorul proprietații DrawString la locațiile startX și startY, si cu fontul font.
Locațiile de start si fonturile sunt definite la începutul procedurii după cum urmează:
Mai departe, la mijlocul chitanței avem numărul precum și data și ora la care a fost creată chitanța, din nou, aceste informații sunt preluate din baza de date. Următorul cod realizează restul de chitanță:
Ca și în cazul stergerii unui rând dintr-o tabelă din baza de date utilizând DataGridView, este nevoie sa reținem intr-o variabila, în cadrul exemplului nostru e vorba de variabila index, după care vom prelua din grid coloanele corespunzătoare informațiilor pe care dorim să le afișăm pe chitanță.
Procedura care este apelată în momentul apăsării butonului Print (printareChitanta) va apela procedura de creare a chitanței. Aceasta mai conține și trei instanțe necesare printării, și anume: PrintDialog, PrintPreviewDialog și PrintDocument. Prima permite utilizatorului să aleagă o imprimantă și secțiunea documentului pe care dorește să o printeze, a doua permite utilizatorului să vizualizeze chitanța înainte de printare iar a treia trimite datele de printat către imprimantă.
Un alt lucru ce este diferit față de celelalte categorii din meniurile prezentate pană acum sunt câmpurile de cautare. În figura următoare (Fig. 3.2.13) sunt ilustrate câmpurile de căutare.
La căutarea unei chitanțe după număr nu se schimbă nimic față de ceea ce am prezentat până acum. Dacă o sa schimbăm valoarea de la Cautare dupa în DataChitanța va apărea automat lângă aceste câmpuri alte două câmpuri după cum se poate observa în figura următoare (Fig. 3.2.14). Astfel se poate căuta o chitanță (sau mai multe) cu data la care a fost creată să fie cuprinsă intre aceste două câmpuri (De la și Pana la).
Același lucru se întâmplă și la căutarea unei chitanțe după suma acesteia (Fig. 3.2.15). Pentru a fi mai ușor pentru utilizator să găsească o chitanță sau pur si simplu să vizualizeze chitanțele ale căror valori sunt cuprinse între două sume, am adăugat, la fel ca în cazul de mai sus, două câmpuri (De la și Pana la) pentru a face posibilă această metodă de căutare.
Interogarea pentru aceste câmpuri de căutare este aproximativ asemănătoare cu diferența că clauza WHERE din select o sa caute valoare dintr-o coloană cuprinsă între doua valori introduse în casuțele de căutare.
Următoarea categorie din acest meniu despre care voi vorbi este cea de Bonuri de Consum. Formul care realizează un bon de consum se numește frmBonDeConsum. Putem sa dăm o cantitate dintr-un anumit produs spre consum pentru a se realiza un alt produs din el. Cantitate din produsul dat spre consum se va elimina din cantitatea totală a produsului existentă în baza de date. Figura următoare (Fig. 3.2.16) ilustrează form-ul de adăugare a unui bon de consum.
Acest form conține informații necesare realizării unui bon de consum precum numărul bonului, produse care sunt disponibile a se da spre consum, cantitatea pe care dorim să o dăm spre consum, cantitatea disponibilă din produsul respectiv, data la care se crează bonul, pentru ce anume s-au dat produsele spre consum și observații referitoare la acest bon. Pentru a se putea realiza bonul trebuie să avem în baza de date cantitate disponibilă din acel produs, altfel crearea acestuia nu este posibilă. În cazul în care dorim să dăm spre consum o cantitate mai mare decât cea disponibilă, vom primi un mesaj care ne va avertiza ca nu avem disponibilă cantitatea din produsul respectiv pentru a fi dat spre consum. De exemplu: dorim să dăm spre consum din produsul portocale 5 bucați dar disponibilul acestui produs este de 4 bucăți. Acest lucru nu se va realiza deoarece nu sunt destule bucăți disponibile. Dar dacă avem disponibilă acea cantitate în baza de date, cantitatea dată spre consum se va elimina din baza de date și va ramânea noua cantitate ca fiind cantitatea disponibilă – cantitatea dată spre consum.
Pentru a se elimina cantitatea și a se actualiza baza de date am creat două stringuri: unul pentru inserarea bonului de consum în baza de date și unul pentru actualizarea cantitații din produsul respectiv în tabela Produse. Apoi verificăm dacă toate câmpurile au fost completate corespunzător. Dacă nu au fost completate, vom primi un mesaj de eroare care ne va avertiza de acest lucru. Dacă au fost completate, se va trece mai departe la verificarea cantitații introduse cu cea disponibilă din baza de date. În cazul în care cantitatea introdusă este mai mare decât cea disponibilă vom primi un mesaj de eroare și se va colora casuța de text. În cazul în care cantitatea introdusă este mai mică decât cea disponibilă, se va trece mai departe la executarea interogărilor, prima fiind cea de introducere a bonului de consum, iar apoi actualizarea tabelei Produse. Pentru actualizarea cantității, am scăzut din valoarea casuței de text ce conține cantiatea ce dorim să o dăm spre consum cu valoarea casuței de text ce conține cantitatea disponibilă și am reținut valoarea în parametrul care va returna rezultatul obtinut instrucțiunii de INSERT după cum urmează:
Mai jos am inserat tot codul care realizează aceste operații de adăugare și actualizare pentru o mai bună înțelegere a ceea ce am explicat.
Ultima categorie prezentă în acest meniu este cea de Încasare Client, formul în care am creat această categorie numindu-se frmIncasareClient iar pe lângă acest form mai avem si form-ul frmIncasareClientAdd pentru adăugarea unei încasări. Toate opțiunile din acest form au fost create după principiul celorlalte două categorii. Căutarea unei încasări de client se poate realiza după numărul documentului, suma respectiv data acesteia. Datorită faptului că acest form este asemănător cu cel pentru chitanțe, voi prezenta doar form-ul pentru adăugare a unei încasări, acesta fiind ilustrat în figura de mai jos (Fig. 3.2.18).
Câmpurile prezente în acest form sunt necesare pentru realizarea unei încasări. Primul câmp, Încasare ID, se generează automat de către aplicație după principiul pe care l-am explicat la adăugarea unui produs în baza de date. Data se completează cu ajutorul uni calendar care se deschide la apăsare și de unde se selectează data la care dorim să realizam încasarea, clientul se selectează din combobox aceștia fiind luați din baza de date la încărcarea form-ului, la introducerea sumei se poate selecta din combobox-ul de lângă tipul de monedă în care se face încasarea (RON, USD, EUR), tipul încasării poate fi Banca, Cash sau Altceva și se slectează din combobox acesta fiind populat automat la încărcarea form-ului, numărul documentului se completează pentru a fii folosit în printrarea încasării (Fig. 3.2.12 Exemplu chitanță printată), observațiile nu trebuie introduse obligatoriu, dar se pot introduce pentru o înțelegere mai bună a ceea ce s-a realizat prin acea încasare.
Ultimul meniu prezent în aplicație se numește STOC si conține o singură categorie cu același nume. Această categorie implică, de asemenea, un form care se numește frmStoc pe care am realizat un raport cu stocul disponibil în perioada curentă. În continuare voi prezenta realizarea acestui raport.
Raportul a fost realizat în cea mai mare măsură folosind partea vizuală a programului Visual Studio. Acesta conține o extensie pentru creare de rapoarte numită simplu Report. Pentru a crea acest report, am realizat mai întâi un nou DataSet care va conține tabela Produse. În acest DataSet am configurat interogarea care preia produsele din tabelă și categoria de produs din care face parte, legătura între cele două tabele fiind facută cu ajutorul cheilor primară și externă, care au cantitatea mai mare decât 0 (adică produsele care sunt disponibile pe stoc). Interogarea folosită este următoarea:
După această configurare, am creat un nou raport utilizând acea extensie iar în momentul de față acesta este gol, noi vom fi cei care vor crea acest raport de la zero asta însemnând că trebuie să ne ocupăm și de partea vizuală dar și de partea ce ține de baza de date. Primul lucru care trebuie făcut este să adăugam un nou tabel în care se vor afișa produsele disponibile. Acest lucru se realizează utilizând toolbox-ul aplicației de unde vom selecta opțiunea Table. După selectare, o fereastră (Fig. 3.2.19) de configurare a tabelului se va deschide.
În această fereastră la opțiunea Data source vom alege DataSet-ul nou creat. Dat fiind faptul că acesta conține doar un tabel acesta se va selecta automat la optiunea Available datasets. În acest moment ne mai rămâne decat să verificăm dacă totul e în ordine după care vom apăsa butonul OK și un nou tabel va apărea. În tabelul respectiv, vom selecta coloanele pe care dorim să le afișăm în raport. Se mai pot face anumite modificări la interfață dar acest lucru nu este absolut necesar, raportul funcționând și fără. După ce raportul a fost creat, în formul frmStoc trebuie să adăugăm un ReportViewer. Acesta se gasește în fereastra toolbox. După ce acesta a fost adăugat în form, în colțul din stânga sus avem o sageată care după ce este apasată va apărea un meniu din care vom alege raportul nou creat. Nu trebuie sa umblăm la partea de cod din form deoarece acesta va fi generat automat. Singura modificare pe care putem să o facem în cod este în cazul în care adăugam parametrii interogării. În cazul meu nu sunt parametrii adăugați, deci nu am făcut nici o modificare codului. Dacă toți acești pași au fost urmați corespunzător, raportul a fost creat și poate fi vizualizat după rularea aplicației la secțiunea STOC. Mai jos, în figura 3.2.20 avem prezentat raportul pentru stocul disponibil la perioada curentă.
Din interiorul aplicației acest raport se poate exporta (utilizând butonul în pătrat roșu) în fișiere word, excel sau PDF sau se poate printa (utilizând butonul în pătrat portocaliu) direct. De asemenea, raportul mai prezintă opțiuni pentru căutare, marime a paginii precum și buton pentru a vizualiza cum o să arate raportul înainte de a fi tipărit.
Prezentarea aplicației a ajuns la final iar tot ce am prezentat se află în interiorul acesteia și este funcțională.
Cap. 4. CONCLUZII
BIBLIOGRAFIE
Gheorghe Ialomițianu – Contabilitatea Financiară. Editura INFOMARKET, 2004.
Niculae Feleaga – Sisteme contabile comparate, vol.I, Ed. Economica, Bucuresti, 1999.
http://ro.wikipedia.org/wiki/Microsoft_SQL_Server
Kalen Delaney – Inside Microsoft Sql Server. Microsoft Press. 1 October 2006
http://en.wikipedia.org/wiki/Microsoft_Visual_Studio
BIBLIOGRAFIE
Gheorghe Ialomițianu – Contabilitatea Financiară. Editura INFOMARKET, 2004.
Niculae Feleaga – Sisteme contabile comparate, vol.I, Ed. Economica, Bucuresti, 1999.
http://ro.wikipedia.org/wiki/Microsoft_SQL_Server
Kalen Delaney – Inside Microsoft Sql Server. Microsoft Press. 1 October 2006
http://en.wikipedia.org/wiki/Microsoft_Visual_Studio
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Functionalitatea Aplicatiei de Contabilitate a Stocurilor (ID: 140480)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
