Gestiune Si Achizitie de Date Utilizand Codurile de Bare
1.Consideratii teoretice asupra limbajului Visual C++6.0
Utilizare Visual C++6.0
Popularizarea Internetului și a disponibilităților Multimedia ale PC-ului au accelerat creșterea cererii de aplicații tot mai diverse și mai puternice.
Calculatoarele personale pe care rulează una din variantele sistemului de operare Windows, devin un peisaj des întâlnit în casele programatorilor.
Pare la modă stigmatizarea lui Microsoft exclusiv datorită succesului sau și, totuși, succesul și atenția permenentă pe care acesta o acordă standardizării au permis programatorilor să-și satisfacă nevoile.
Ce este Visual C++6.0 și la ce folosește
Visual C++6.0 este ultima și cea mai bună versiune a compilatorului Microsoft Visual C/C++.
Produsul oferit a devenit mult, mult mai bun decât un simplu compilator. Sunt incluse clase fundamentale Microsoft (Microsoft Foundation Classes) care simplifică și accelerează dezvoltarea aplicațiilor Windows. Sunt incluse editoare sofisticate de resurse în scopul proiectării casetelor de dialog complexe, a meniurilor, a barelor cu instrumente, a imaginii și a multor alte elemente ce compun aplicațiile Windows moderne. Este oferit un excelent mediu de dezvoltare integrat numit Developer Studio, care prezintă forme grafice ale structurii aplicate pe măsură ce o dezvoltăm.
Un instrument pentru depanare integrat perfect ne permite să inspectăm în detaliu fiecare aspect din cadrul unui program aflat în execuție.
Acestea sunt numai câteva din numeroasele facilități oferite de Visual C++6.0 care ne ajută să dezvoltăm aplicații rapide și complete folosind cele mai recente tehnologii din Windows.
Ce aduce nou Visual C++6.0
Visual C++6.0 aduce o mulțime de noi facilități din care amintim:
1. Noile controale așa cum este controlerul de selecție a datei pe care se poate să-l fi întâlnit în aplicațiile de poștă electronică, Microsoft Outlook sunt acum disponibile propriilor aplicații:
-utilizarea controalerelor indicatori de evoluție: se folosesc pentru a informa utilizatorului despre desfășurarea unei operații de durată; el apare sub forma unei bare albastre, continuă sau întreruptă care umple treptat o casetă pe masură ce operația înaintează în desfășurare;
-utilizarea unui control bară de derulare: se întâlnesc, de multe ori, atașate de marginile unei ferestre în scopul derulării conținutului acestuia;
-utilizarea unui control glisor: permite utilizatorului să stabilească o valare prin tragerea unui indicator de-a lungul unui interval liniar și plasarea lui într-o anumită poziție (asemănător cu potențiometrul de volum audio);
-utilizarea controalelor de selecție a datei/orei.
2. Elementelor din casetele combinate le pot fi asociate acum imagini iar acestea sunt afișate în caseta de selecție și în lista derulantă ale noului control extins. Caseta combinată: lucrul cu imagini, bitmap-uri și pictograme.
3. Barele cu instrumente plate întâlnite în Office 1997 și Internet Explorer 4 sunt acum integrate în cadrul claselor fundamentale, ele putând fi utilizate în propriile aplicații: utilizarea barelor cu instrumente și a barelor de stare.
4. Se poate apela Internet Explorer-ul din cadrul ferestrelor aplicate pentru a vizualiza paginile Webb și elementele HTML. Utilizatorul reprezentat de tip listă, arbore, text format și HTML.
5. Programarea bazată pe componente și modelul componentelor obiectuale distribuite (DCOM).
6. Prezintă cele mai recente versiuni de interfețe API și pachete SDK.
7. Puternicul App Wizard poate să creeze mai multe tipuri de structuri inițiale de aplicații astfel încât noua dvs. aplicație poate avea întreaga funcționalitate a unor aplicații cu forme multiple de vizualizare, așa cum este Windows Explorer fără a mai scrie nici o singură linie de cod: crearea de reprezentări multiple (dezvoltarea unei aplicații cu ajutorul MFC).
Dezvoltarea unei aplicații cu ajutorul arhitecturii MFC
Document/Reprezentare
Cele mai multe aplicații din ziua de azi se bazează pe arhitectura Document/Reprezentare sau pe variantele sale. Această arhitectură aduce o structură modulară a programului în care codul care administrează datele este separat de codul responsabil de interfață cu utilizatorul. Datele sunt gestionate în cadrul documentului iar interfața cu utilizatorul este implementată în cadrul reprezentării. De regulă, documentul corespunde unui fișier de pe disc. Infrastructura MFC oferă două tipuri de aplicare Document/Reprezentare
SDI: interfață document singular;
MDI: interfață document multiplu.
Diferența dintre SDI si MDI este explicată chiar din denumire.
În aplicarea SDI, la un moment dat, nu poate fi deschis decât un singur document.
În aplicarea MDI pot fi deschise simultan două sau mai multe documente, fiecare având o fereastră de reprezentare proprie care realizează interfața cu utilizatorul.
Generarea unui proiect MDI nu ține decât de selectarea unor opțiuni adecvate în App Wizard. După crearea proiectului nu mai este ușor să schimbăm între SDI și MDI.
Spre deosebire de SDI, în care există o singură instanță a clasei document, în MDI pot exista mai multe. Fiecare răspunde de gestionarea datelor unui fișier. Crearea unui obiect document duce întotdeauna la crearea unei noi ferestre de reprezentare, asocierea acesteia cu documentul și crearea unei noi ferestre cadru ce va conține reprezentarea.
MDI intoduce conceptul de document activ, deoarece, la un moment dat, pot exista mai multe instanțe de documente.
Dobandind aceste cunostinte, putem sa scriem aplicatii complexe si competitive cu ajutorul unuia dintre cele mai flexibile si mai confortabile medii de dezvoltare existente: Visual C++6.0. Pentru programatorul in Visual C++6.0 conformarea la aspectul si atmosfera Windows se face relativ fara effort.
Biblioteca MFC ofera un sprijin substantial la generarea unei noi aplicatii prin intermediul App Wizard, care poate sa creeze automat un meniu, o bara cu instrumente, o bara de stare si alte componente, permitand apoi personalizarea usoara a fiecarui element.
Create cu App Wizard lucreaza impreuna pentru a forma o structura omogena cunoscuta sub numele de arhitectura Document/Reprezentare (Document/View).
Acest concept inseamna separarea datelor propriu-zise de prezentare a ceea ce datele semnifica pentru utilizator.
Aceasta se realizeaza stocand datele intr-o clasa (clasa document) si informatiile privind prezentarea intr-o alta clasa (clasa reprezentare).
Despre reprezentari multiple:
Separarea codului care gestioneaza datele (documentul) de codul care implementeaza interfata cu utilizatorul (reprezentarea) are ca rezultat si o structura flexibila. Astfel devine posibila afisarea mai multor reprezentari ale acelorasi date.
Generarea unei aplicatii cu suport pentru bazele de date
Modul in care se dezvolta o aplicatie care necesita o aplicatie care necesita accesarea unei baze de date depinde foarte mult de o serie de factori decisivi.
De exemplu: aplicatia trebuie sa acceseze mai multe baze de date sau trebuie suportate si alte tipuri de fisier? Toate aceste cazuri sunt posibile si trebuie luate in considerare, deoarece metoda cea mai simpla de integrare a suportului pentru bazele de date este utilizarea optiunilor oferite de App Wizard la momentul crearii proiectului (optiunile selectate in App Wizard nu mai pot fi schimbate dupa generarea proiectului, singurele solutii fiind editarea codului sau crearea proiectului de la inceput).
Ce inseamna un proiect bazat pe casuta dialog
Un proiect bazat pe casete de dialog foloseste o asemenea caseta drept fereastra principala a unui program simplu. De exemplu, multe dintre utilitarele din Panoul de control Windows 95 (Control Panel) se bazeaza pe casete de dialog.
Un program bazat pe casete de dialog are un meniu la care se ajunge prin meniul sistem situat in coltul din stanga-sus a barei de titlu a casetei de dialog. Daca programul trebuie sa aiba meniuri sofisticate, atunci nu trebuie sa fie bazat pe casete de dialog. Totusi, acest tip de program este ideal pentru demonstrarea modului de functionare a controalelor tip buton sau ale altor programe simple.
SUPORTUL OFERIT DE VISUAL C++ PENTRU BAZE DE DATE
MFC ofera suport pentru accesul la bazele de date in doua moduri:
prin intermediul standardului Data Access Objects (DAO) si al mecanismului Microsoft Jet pentru lucrul cu bazele de date;
– prin intermediul standardului Open Database Connectivity (ODBC) si al unui driver ODBC.
Ambele metode utilizeaza concepte abstracte, care simplifica lucrul cu bazele de date, la care se adauga viteza, puterea si flexibilitatea limbajului C++.
In continuare, vom prezenta diferentele dintre cele doua metode si vom furniza informatii care sa va ajute in alegerea metodei adecvate de acces la bazele de date.
Folosirea casetelor dialog
Un asemenea proiect este folosit adeseori pentru a construi programe foarte mici care sa interactioneze cu utilizatorul prin intermediul unei singure casete de dialog. Programul poate fi mult mai mic si mai usor de scris, deoarece numarul de clase create de AppWizard este redus cu aproximativ o jumatate.
In program bazat pe casete de dialog poate fi manipulat cu usurinta de utilizator. Exista o singura fereastra, a casetei de dialog, nu exista meniuri, si toate controalele disponibile in mod obisnuit sunt vizibile de la bun inceput. Nu exista casete de dialog sau articole de meniu ascunse, iar utilizatorul poate vedea cu exactitate care sunt operatiunile care trebuie executate.
Modificarea interfetei aplicatiei
Elementele vizuale ale unui proiect se numesc resurse. Spre exemplu, caseta dialog, pictogramele si meniurile constituie resurse. Numit negativ editor de resurse, acesta este instrumentul din Visual Studio care se foloseste pentru proiectarea resurselor de diferite tipuri si modificarea aspectului efectiv al aplicatiei.
Ce reprezinta DAO si ODBC
DAO este un sistem familiar programatorilor care folosesc Microsoft Access Basic sau Microsoft Visual Basic. DAO foloseste mecanismul Microsoft Jet pentru a furniza un set de obiecte pentru lucrul cu bazele de date: obiecte database, tabledef si querydef, recordset etc., despre care vom vorbi mai tarziu. Sistemul DAO este optim pentru lucrul cu fisiere MDB, de tipul celor create cu Microsoft Access, dar puteti avea acces si la surse de date ODBC prin intermediul sistemului DAO si al mecanismului Microsoft Jet. ODBC furnizeaza o interfata pentru programare (API) implementata prin intermediul driverelor ODBC specifice diferitelorsisteme pentru administrareabazelor de date (DBMS).
Programul dvs. foloseste aceasta interfata API pentru a apela administratorul de drivere ODBC (ODBC Driver Manager), care, la randul sau, apeleaza driverul corespunzator. Driverul interactioneaza cu sistemul de administrare a bazei de date DBMS) prin intermediul instructiunilor SQL (Structured Query Language).
Atat DAO, cat si ODBC va ofera posibilitatea de a scrie aplicatii independente de un anumit sistem de administrare a bazei de date.
Ce reprezinta modelul MFC
pentru programarea in domeniul bazelor de date
MFC furnizeaza un model pentru programarea in domeniul bazelor de date foarte asemanator cu cel folosit de Microsoft Access Basic si Microsoft Visual Basic. Desi la baza implementarile pentru DAO si ODBC sunt destul de diferite, interfetele asemanatoare simplifica portarea aplicatiilor, in special de la ODBC la DAO>
In modelul MFC pentru programare, indiferent daca folositi DAO sau ODBC, lucrari cu cate un obiect baza de date pentru fiecare baza de date deschisa. Acest obiect reprezinta conexiunea dvs. cu baza de date respectiva. Interogarile si actualizarile le realizati prin intermediul obiectelor recordset. DAO furnizeaza si alte obiecte pentru lucrul cu tabele, pentru salvarea interogarilor in vederea refolosirii etc. MFC va pune la dispozitie clase pentru fiecare dintre aceste obiecte, astfel incat exista un set de clase pentru DAO si altul pentru ODBC.
Crearea si inregistrarea bazei de date
Inainte de za un set de obiecte pentru lucrul cu bazele de date: obiecte database, tabledef si querydef, recordset etc., despre care vom vorbi mai tarziu. Sistemul DAO este optim pentru lucrul cu fisiere MDB, de tipul celor create cu Microsoft Access, dar puteti avea acces si la surse de date ODBC prin intermediul sistemului DAO si al mecanismului Microsoft Jet. ODBC furnizeaza o interfata pentru programare (API) implementata prin intermediul driverelor ODBC specifice diferitelorsisteme pentru administrareabazelor de date (DBMS).
Programul dvs. foloseste aceasta interfata API pentru a apela administratorul de drivere ODBC (ODBC Driver Manager), care, la randul sau, apeleaza driverul corespunzator. Driverul interactioneaza cu sistemul de administrare a bazei de date DBMS) prin intermediul instructiunilor SQL (Structured Query Language).
Atat DAO, cat si ODBC va ofera posibilitatea de a scrie aplicatii independente de un anumit sistem de administrare a bazei de date.
Ce reprezinta modelul MFC
pentru programarea in domeniul bazelor de date
MFC furnizeaza un model pentru programarea in domeniul bazelor de date foarte asemanator cu cel folosit de Microsoft Access Basic si Microsoft Visual Basic. Desi la baza implementarile pentru DAO si ODBC sunt destul de diferite, interfetele asemanatoare simplifica portarea aplicatiilor, in special de la ODBC la DAO>
In modelul MFC pentru programare, indiferent daca folositi DAO sau ODBC, lucrari cu cate un obiect baza de date pentru fiecare baza de date deschisa. Acest obiect reprezinta conexiunea dvs. cu baza de date respectiva. Interogarile si actualizarile le realizati prin intermediul obiectelor recordset. DAO furnizeaza si alte obiecte pentru lucrul cu tabele, pentru salvarea interogarilor in vederea refolosirii etc. MFC va pune la dispozitie clase pentru fiecare dintre aceste obiecte, astfel incat exista un set de clase pentru DAO si altul pentru ODBC.
Crearea si inregistrarea bazei de date
Inainte de a incepe construirea aplicatiei propriu-zise, trabuie sa creati baze de date si sa o inregistrati cu ODBC (Open Database Connectivity). Alegeti un format de baza de date pentru care aveti la indemana sistemul de administrare (DBMS) corespunzator si driverul de ODBC pe 32 de biti. Microsoft Developer Studio poate incarca driverele pentru majorarea formatelor standard folosite de bazele de date: SQL Server, Access, Paradox, dBase, FoxPro, Excel, Oracle si Microsoft Text.
Daca doriti sa folositi suportul oferit de MFC pentru SQL Server, trebuie sa aveti instalat si produsul SQL Server, pe langa driverul de ODBC pentru SQL Server, furnizat o data cu Developer Studio.
Daca doriti sa folositi alte formate de baze de date, aveti nevoie de driverul de ODBC si de sistemele DBMS respective
Daca doriti sa folositi formatul Microsoft Access, aveti nevoie de driverul ODBC pe 32 de biti pentru Microsoft Access si de produsul Microsoft Access.
Va recomand sa folositi Microsoft Access pentru a crea baza de date si apoi sa o inregistrati cu ODBC. Daca nu stiti sa folositi produsul Microsoft Access, veti gasi in anexa 1 indrumarile necesare pentru crearea fisierului care reprezinta baza de date cu tabelele deschise anteior.
Inregistrarea bazei de date cu ODBC
Veti inregistra noua baza de date cu ODBC. Aplicatia va contine referinte la acest nume. Folositi ODBC Administrator din Control Panel. Urmatoarea procedura prezinta inregistrarea sursei de date folosind driverul ODBC pentru Microsoft Access. Daca folositi alt driver, procedura va fi usor diferita. Se presupune ca ati creat deja baza de date, continand tabelele descrise anterior.
Pentru a inregistra sursa de date folosind ODBC, procedati astfel:
In Control Panel. executati dublu-clic pe pictograma ODBC.
In caseta de dialog Data Sources, alegeti butonul Add. Va aparea caseta de dialog Add Data Source.
Alegeti driverul pe care doriti sa-l folositi pentru baza de date, in acest caz Microsoft Access, si apasati OK. Va aparea caseta de dialog ODBC Setup, specifica driverului pe care l-ati ales.
In campul Data Source Name, scrieti “Aplicatie baze de date”.
Optional, introduceti si o descriere a bazei de date.
In grupul Database, apasati butonul Select pentru a gasi locatia pe disc a fisierului pe care l-ati creat cu Microsoft Access.
Apasati OK pentru a selecta baza de date.
Apasati OK pentru a inchide caseta de dialog ODBC Setup, apoi apasati butonul Close pentru a inchide caseta de dialog Data Sources
Concluzii :
In concluzie, mediul Visual C++, permite o realizarea unor aplicatii mult mai flexibile si intr-un timp mult mai scurt decat mediul C++.
Limbajul C/C++ este indicat realizarii aplicatiilor in timp real, cum am fi programarea microcontrolerelor. Microcontrolerele pot fi programate atat in limbaj de asamblare( specific fiecarui microcontroller), dar si in C/C++, deoarece exista o serie de complilatoare care adapteaza codul scris in C/C++ pentru un anumit microcontroler.
Astfel in acest domeniu limbajul C/C++ se dovedeste a fi foarte util.
Limbajul C/C++ permite integrarea in aplicatie a unor module de program scrise in limbaj de asamblare pentru procesoare din familia 8086, procedeu care se dovedeste a fi extrem de util in cazul in care se doreste sporirea vitezei de procesare.
De exemplu pentru realizarea unor programe de grafica in C/C++ este indicat in primul rand folosirea unui lookuptable, pentru memorarea valorilor functiilor sin si cos pe
un interval cuprins intre 0 si 360 de grade, deoarece durata calcului unui sin sau a unui cos este relativ mare.
Operatiile de inmultire si impartire este indicat sa se faca folosind shift-ari la dreapta respectiv la stanga( aceste operatii intervin in general in calculul offsetului unui pixel).
Pentru o buna functionare este indicatsa se lucreze direct pe memoria video (segment: 0xA000), iar functia de putpixel sa fie implementata tot in limaj de asamablare .
Folosind aceste tehnici, programul va fi foarte rapid, animatia avand continuitate.
In cazul in care programatorul doreste ca animatia integrata in aplicatie sa nu-i afecteze mersul normal al aplicatieie atunci el poate modifica vectorul de intrerupere al timerului, folosint functiile c++ (setvect si getvect).
In noua rutina de tratate a acestei intreruperi (0x1c), mai intai se insereaza o secventa de cod care sa asigure continuitarea miscarii (ex: incrementarea cu un grad, in cazul in care avem o rotatie) si apoi se preda controlul rutinei initiale de tratare a intreruperii, rutina a carei adresa a fost salvata.
In acest mod, pe langa faptul ca animatia este rapida, ea nici nu va afecta cursul normal al aplicatiei.
In Visual C++, folosind controale activeX, se poate realiza animatie relativ usor (ex: animatie realizatain Flash, integrata in Visual C++ prin intermediul controlului activex ShockWave player).
Odata integrata in Visual C++ animatia este implicit setata ca sa se execute fara sa afecteze executia programului.
Deci pentru realizarea aplicatiilor 100% soft este indicata folosirea mediilor vizuale (Visual C++, Visual J++, Visual Delphi, Visual Fox si alte programe auxiliare sum ar fi Macromedia), iar pentru realizare aplicatiilor care implica si comunicarea cu anumite echipamente electronice in timp real este indicata folosirea limbajelor de asamblare sau a mediilor de programare mai evoluate adica C/C++.
2.CONCEPTUL DE COD DE BARE
2.1.Ce este un cod de bare? De ce cod de bare?
Datorita interesului tot mai mare pentru acest domeniu, va propunem o serie de articole, care sa raspunda (macar partial) la principalele întrebari legate de identificarea automata (Auto ID).
În epoca productiei de masa, a urbanismului si a nevoii de informatie, în epoca în care informatica înainteaza cu pasi de gigant, obiectele, documentele trebuiesc identificate în vederea unei cât mai usoare prelucrări. Deoarece nu pot fi tratate decât informatiile înregistrate în prealabil, iar operatiile de culegere bat pasul pe loc în raport cu viteza de prelucrare, orice noua tehnica apta sa reduca acest decalaj se bucura de un succes deosebit.
Informatiile sunt cel mai adesea de doua feluri: pe de o parte valori, pe de alta parte sunt identificatori legati de aceste valori – binomul clasic: numar (simbol)/valoare (semnificatie). Astfel apare conceptul de codificare. Dar, spre deosebire de cele mai multe mijloace de identificare, codurile de bare sunt “informatice”, ele scriindu-se într-un limbaj înteles de calculator.
Si pentru ca tot am ajuns aici, sa vedem totusi ce sunt aceste coduri de bare. Conform definitiei, codul de bare este o zona (array) compusa din bare rectangulare paralele si spatii dispuse conform legilor de codificare ale unei simbologii particulare, cu scopul de a reprezenta datele în formatul recunoscut de dispozitivul de citire.
Pentru a întelege mai bine interesul pentru citirea optica a codului de bare, este suficient sa-i subliniem calitatile intrinseci si s-o raportam la alte moduri de înregistrare a datelor.
Viteza. Citirea automata a codurilor de bare este mult mai rapida fata de dactilografierea pe taste unde, spre exemplu, introducerea datelor se face cu doua caractere/secunda. Pentru a citi manual cu un creion optic nu trebuiesc mai mult de 2-3 secunde pe mesaj. Un mesaj de 12 caractere va fi citit foarte usor în 3 secunde, deci cu 6 caractere/secunda, adica de doua ori mai repede. Închipuiti-va ce înseamna însa un cititor manual cu CCD care are o rata de 200 scanari/sec.
Fiabilitate. Introducerea manuala de la tastatura a informatiilor implica o eroare la câteva sute de caractere. La citirea optica a caracterelor se apreciaza o eroare la 10.000 de caractere citite. În fine, la citirea codurilor de bare se atinge o eroare la 3 milioane de caractere.
Universalitate. Acelasi mesaj codificat, unic, va fi citit de mai multe ori în diferite etape ale drumului catre consumator: de catre fabricant, transportator, angrosist, detailist, etc.
Randament. Atunci când se face bilantul, se observa imediat ca procedeul se dovedeste a fi foarte economic în raport cu altele.
Rapide si sigure, comode si ieftine. Si aceasta nu este totul! Culegerea informatiilor prin citirea codurilor de bare poate fi descentralizata la maximum, nefiind necesara regruparea datelor dispersate; aici, îndata ce este citita, informatia este transmisa calculatorului, în timp real. Se poate vorbi deci de un adevarat instrument de gestiune deosebit de performant. Numai o informatie cunoscuta fara întârziere si tratata pe loc are valoare. Cunoasterea imediata a datelor noi permite o decizie eficace. Cum sa gestionezi un stoc daca nu ai, pe masura ce se produc, toate miscarile de intrare si de iesire? Cum sa faci un control de calitate, demn de acest nume, daca produsele în curs de fabricatie nu pot fi identificate în momentul când li se masoara caracteristicile pe banda? De aceea, putem spune fara sa gresim: codurile de bare sunt unul din elementele esentiale ale gestiunii moderne.
Celelalte mijloace de prelucrare au avantajele lor si-si pastreaza locul. Înregistrarea magnetica se face cu o mare densitate, ea poate fi stearsa si apoi rescrisa. Aceasta metoda este ideala pentru tichetul de metrou, dar în acest mod informatia nu poate fi citita de la distanta sau reprodusa cu cheltuiala minima.
Dar citirea optica de caractere? puteti spune dumneavoastra… Ce poate fi mai seducator decât un dispozitiv care “citeste” aceleasi caractere ca ochiul omenesc? Din pacate, cititoarele optice de caractere sunt lipsite de suplete, sunt mai delicate si mai putin fiabile. E adevarat, codurile de bare trebuiesc traduse în clar pentru ca omul sa le poata descifra si întelege, dar au marele avantaj al redundantei verticale (se pot “citi” la orice nivel, înaltimea barelor nefiind semnificativa) si al controlului caracter cu caracter. Erorile prin substituire, de departe cele mai grave, când un caracter eronat este înregistrat în calculator, sunt de multe sute de ori mai frecvente la cititoarele optice de caractere decât în cazul citirii codurilor de bare.
fig.1
Redundanta verticala: barele scurtate (deteriorate) se pot înca citi
În definitiv, cea mai buna dovada a avantajelor excelente ale codurilor de bare este succesul lor evident. Sunt vazute peste tot, ceea ce nu este deloc întâmplator deoarece ele servesc si fac servicii remarcabile.
Acestea fiind spuse, sa trecem la pasul urmator si sa vedem din ce sunt alcatuite codurile de bare.
Structura si simbologie
Orice graf este simbol, adica imagine semnificativa.
Simbologia este o stiinta ambivalenta: pe de o parte ea defineste simbolurile ( în interiorul unui sistem), pe de alta parte ea permite interpretarea lor, cunoasterea semnificatiei sau valorii.
Combinatia bare înguste/bare late si spatii înguste/spatii late defineste un unic caracter, care poate fi: litera, cifra sau simbol (în sensul tipografic al cuvântului). Aici intervine simbologia care defineste cu precizie combinatia inerenta fiecarui caracter. Ea da cheia pentru codificare si pentru decodificare – pentru citire ca si pentru scriere. În acest fel fiecare ansamblu de caractere al unei simbologii devine un cod.
Totusi, trebuie sa se stabileasca o regula între diverse simbologii. Pentru aceasta se definesc niste parametri foarte simpli, care constituie specificatia.
Terminologia codului de bare
MODUL:
“Cel mai mare divizor comun”, el este latimea nominala a barei sau a spatiului cel mai îngust, adica cel mai mic “increment”.
ELEMENT:
Un element este fie o bara, fie un spatiu. El se defineste prin numarul de “module” care-l compun. Bineînteles în latime, pentru ca înaltimea barelor nu este niciodata luata în consideratie.
CARACTER:
Mai multe elemente formeaza un caracter, dupa o combinatie predefinita. Aceasta relatie între bare si spatii, alaturate sau interdependente, constituie structura codului. Un caracter poate fi o litera, o cifra, un simbol. El poate servi fie la reprezentarea unei valori, fie la organizarea functionala a codului (caracter de început si/sau de sfârsit), fie la control. Caracterele semnificative sunt întotdeauna alcatuite dintr-un numar constant de elemente comune, valorile lor rezultând din diverse combinatii bare înguste/bare late si spatii înguste/spatii late. Un exemplu: la codul “2 din 5”, într-un caracter exista întotdeauna doua bare late din cele cinci care formeaza caracterul respectiv.
Structura unui cod de bare ( UPC/EAN)
fig.2
RATIA:
Este raportul între elementele late si elementele înguste, adica între barele late si barele înguste. În general el este de 3 la 1 (bara lata este de 3 ori mai lata decât cea îngusta). Ratia spatiilor este aceeasi ca aceea a barelor.
DENSITATE:
Ea este definita prin numarul de caractere înscrise pe o lungime lineara data. Varierea densitatii se poate face printr-o simpla omotetie, marind sau micsorând latimea modulului de baza, sau, cel mai bine, aceasta se face modificând ratia. Uneori, pentru obtinerea unei densitati mai mari sau mai reduse se face o dilatare sau o contractare a unei densitati medii. Cine spune densitate mare (înalta) spune câstig de spatiu pe lungimea codului, deoarece elementele sunt mai apropiate (strânse), iar citirea este mai dificila. Invers, densitatea redusa (slaba) implica o lungime mai mare pentru un cod, care este însa mult mai usor de citit. În particular, în cazul unei citiri la distanta, adesea se recurge la micsorarea densitatii, pentru a avea mai putine respingeri.
CONTINUU – DISCONTINUU:
CONTINUU, aceasta înseamna ca fiecare caracter se alatura vecinilor sai, cum sunt casele pe strazile unui oras. Se începe cu o bara, se sfârseste printr-un spatiu. Doua marci încadreaza mesajul codificat: un caracter de început de citire si un caracter de sfârsit de citire.
DISCONTINUU, aceasta evoca locuintele periferiei, unde fiecare casa este separata de vecina sa printr-o gradina. Astfel, fiecare caracter începe printr-o bara si sfârseste printr-o bara si între doua caractere alaturate exista totdeauna un interval (fix sau variabil).
MARGINI:
De o parte si de alta a codului, la stânga si la dreapta, deci înainte de a începe citirea si dupa terminarea ei sunt necesare zone “calme”, de o latime minima. În aceste margini nu este permis` nici o imprimare, doar daca aceasta imprimare apare într-o culoare diferita de cea a barelor si este perfect invizibila pentru aparatul de citire utilizat.
JOC DE CARACTERE:
Întocmai ca un dictionar, el da lista completa a tuturor caracterelor unui cod cu valorile lor binare. El asigura legatura între citirea automata si prelucrarea informationala, permitând trecerea de la semnalele optice la semnalele electronice. Elementele înguste au valoarea zero, elementele late au valoarea unu si iata-ne în sistemul binar atât de familiar calculatorului.
fig.3
Cod de bare complet
M1 si M2: margini (zone “calme”)
D: marca de început (Debut) a citirii
F: marca de sfârsit (Fin) a citirii
Cheie: cheia de control.
2.2.STANDARDE PENTRU CODURILE DE BARE
Am promis că voi reveni cu câteva detalii asupra cele mai uzuale standarde pentru coduri de bare.
Ar fi tare simplu daca ne-am limita la numai câteva standarde. Lista diferitelor coduri este deja lunga si, fara îndoiala, ea se va mai lungi înca. De ce? Foarte simplu – pentru ca un cod nu poate întruni toate calitatile. Trebuie facuta o alegere, de unde rezulta un compromis între diversele avantaje cautate.
Pentru că vorbim de standarde este bine să enumăr câteva din ele:
UPC – UNIVERSAL PRODUCT CODE, codul marii distributii americane.
EAN – EUROPEAN ARTICLE NUMBER, corespondentul european al UPC.
CODABAR – numit si “2 din 7”.
Cod 39 – numit si “3 din 9”.
2 din 5, cu varianta sa.
2 din 5 întretesut.
MSI – cod special al firmei constructoare de terminale portabile MSI.
În realitate, fiecare constructor de echipamente ce implica o culegere prin citire optica a codului de bare are tendinta de a-si crea propriul sau cod. Trebuie spus ca exista totusi, pe ici, pe colo, reale eforturi de armonizare.
MSI
La origine acest cod a fost dezvoltat de societatea PLEESEY (de unde uneori numele de cod "Pleesey modificat").
STRUCTURA
Barele si spatiile au latimi "binare", si anume un singur modul pentru elementele înguste, doua module pentru elementele late.
Fiecare caracter contine 4 valori binare, fiecare din ele cuprinzând 3 module, reprezentate printr-o bara si un spatiu – vor fi, deci, pentru fiecare caracter, 4 bare si 4 spatii.
SIMBOLOGIE
Algoritmul primar este binar si nu functioneaza decât pentru barele negre, cele înguste având valoarea 1. Tabelul caracterelor este limitat la 10 cifre, de la 0 la 9.
Se ia 1 drept caracter de plecare si 0 drept caracter de sfârsit de citire.
Codificarea se face luând ca algoritm secundar "zecimalul codificat binar", 8-4-2-1.
fig.4
Codificarea caracterului “6” în standardul MSI
Codul MSI nu se autocontroleaza, fiecare caracter nu este verificabil individual prin algoritm. În general, se asociaza o cheie de control (eventual doua). Citirea poate fi bidirectionala, simbolurile de sfârsit si de început ale citirii, zero si unu, fiind diferite. Între aceste borne (marci) pot exista pâna la 15 caractere.
Cheile de control sunt ultimele caractere la dreapta. Fiecare din ele controleaza toate caracterele citite precedent. În consecinta, cea de-a doua cheie de control, în extrema dreapta si chiar înaintea caracterului de sfârsit de citire, o controleaza si pe prima dubla securitate. Cea de-a doua cheie este calculata întotdeauna dupa formula "IBM Modulo 10". Ea este numai interna cititorului si nu însoteste celelalte caractere, destinate prelucrarii informatiei.
În cele doua cazuri, exista, de asemenea, un control de validare efectuat de circuitele logice interne ale aparatului de citire. Daca programul prevede transmiterea acestei prime chei de control, ea poate fi calculata în "IBM modulo 10" sau “IBM modulo 11”. Daca se decide ca informatia sa nu fie transferata, atunci calculul este obligatoriu în “IBM modulo 10”.
CODABAR
CODABAR este o marca a firmei MONARCH (una din diviziunile grupului PITNEY BOWES). Initial s-a sperat ca el va fi adoptat pentru marea distributie. Neavând succes în acest domeniu, CODABAR a prins în altele: biblioteci, dar mai ales transfuzie sanguina.
STRUCTURA
Nu este modular. Altfel spus, barele si spatiile sunt neregulate. Tabelul caracterelor se bazeaza pe 18 latimi de "module" diferite. Simplificam si nu vorbim totusi decât de bare si spatii late sau înguste.
Acest cod ar putea fi botezat "4 din 7", pentru ca necesita 7 elemente pentru a defini un caracter: 4 bare plus 3 spatii, sau “2 din 7” (2 elemente late din cele 7).
El este discontinuu, adica exista întotdeauna un interval între doua caractere adiacente (apropiate). Este totusi asincron, din cauza variabilitatii elementelor (bare si spatii).
fig.5
CODABAR (MONARCH)
2 elemente late dintr-un total de 7
SIMBOLOGIE
Tabelul caracterelor cuprinde cifrele de la 0 la 9, sase caractere de control (- $ : / . +) si 4 caractere de marcare (bornare), fiecare dintre ele putând fi reprezentate prin doua litere pentru aceeasi valoare binara: a sau t, b sau n, c sau ., d sau e.
Principalele 12 caractere – adica toate cifrele, cratima si $ – au o bara lata si un spatiu lat.
Alte patru semne ( : / . + ) au 3 bare late si nici un spatiu lat. Caracterele de bornare (marcare) nu au decât o singura bara lata si doua spatii late.
Un simbol complet în CODABAR începe cu unul din caracterele început/sfârsit, urmat de un numar de caractere semnificative si se termina printr-unul din caracterele început/sfârsit. Deoarece se poate folosi oricare din aceste marci (borne), care sunt 4, fiecare având doua semnificatii, se dispune de 16 combinatii de încadrare, care, în unele cazuri, sunt foarte utile pentru a distinge un tip sau altul de informatie.
Intervalele între caractere: la minimum este latimea modulului îngust (de ex.: 0,17 mm\n densitatea înalta). Ele pot fi mai mari, pâna la a egala (la maximum) chiar latimea caracterelor. Remarcam ca aceste dimensiuni nu sunt critice de vreme ce intervalele nu contin nici o informatie si caracterele apropiate (adiacente) sunt citite independent.
Limite: de fiecare parte a mesajului codificat, trebuie sa se rezerve o zona calma de cel putin 2,54 mm (0,1").
COMENTARII
CODABAR are o lungime variabila, el se autocontroleaza, este discontinuu. Aceasta îi confera securitate si suplete. Un exemplu: deoarece intervalele pot varia în proportii importante, este usoara imprimarea unui cod în doi timpi pe acelasi suport. Astfel, în industria laboratoarelor fotografice într-un prim moment se imprima un numar, precedat numai de un caracter de început a citirii (asta se petrece la fabricantul de "pochettes-travaux") si ulterior (de data asta în laborator) se completeaza primul numar printr-un al doilea, care va avea doar un caracter de sfârsit de citire. Citirea se va face asupra unui singur si unic mesaj.
Din pacate CODABAR-ul este foarte complex. Faptul ca are 18 dimensiuni diferite si elemente care nu sunt formate dintr-un numar întreg de module nu adauga nimic la valoarea codului. Este evident ca prea multe nivele, prea multe tolerante, cresc riscul de a nu le respecta. Pe scurt, aceasta complexitate se traduce prin dificultati la imprimare.
Ar fi suficiente doua si numai doua latimi. Cercetarile în directia simplificarii lui au dus la crearea de noi coduri cum ar fi AMES (folosit în mediul medical) si codul “2 din 7”.
Nu ramâne mai putin adevarat ca el este codul cel mai sigur si nu este întâmplator faptul ca în toata lumea a fost retinut de Centrele de Transfuzie Sanguina.
COD 39
S-a nascut în 1975. Rapid dezvoltat în SUA, mai ales prin Ministerul Apararii si prin Serviciile Generale ale Administratiei, care l-au impus tuturor furnizorilor lor, obligati sa -si codifice (marcheze) toate produsele. Codul indica o referire "produs" (stabilita la scara nationala) combinata cu un numar de comanda.
A fost adoptat si de industria auto. În sfârsit, el este codul industriei farmaceutice (în Franta) si apare pe toate ambalajele de medicamente.
Structura
De ce 39? Din doua motive: numarul de caractere al listei, 39 (cel putin la origine, caci ulterior au fost oferite 43) si mai ales structura codului care implica 3 elemente late dintr-un total de 9. Aceste 9 elemente constau din 5 bare si 4 spatii.
Fiecare caracter este deci reprezentat printr-o serie de elemente înguste si late. Un element este o bara sau un spatiu.
Simbiologie
Elementele late sunt egale cu valoarea binara 1, în timp ce elementele înguste au valoarea binara 0. Fiecare caracter este unic, atât în binar cât si ca aspect grafic. Asterixul (*) serveste drept caracter de marcare (bornare) , atât la dreapta cât si la stânga. Citirea este bidirectionala, adica poate fi citit de la stânga la dreapta ca si de la dreapta la stânga. Lungimea codului este variabila si depinde de aparatul de citire utilizat. În general, totusi, ea nu depaseste niciodata 32 de caractere. Codul 39 este un cod discontinuu, caracterele nefiind alaturate (adiacente), ci separate unele de altele printr-un interval.
Densitatea clasica este de 3,7 caractere pe cm (9,4 caractere/pouce-deget). Dar ea este flexibila si se pot întâlni frecvent densitati mai reduse decât densitatea medie de 2,04 pe cm (5,2 caractere/pouce-deget) sau densitatea cea mai redusa de 1,18 cm (3 caractere/pouce-deget). Elementele late au un numar exact de module.
Ratia – poate varia de la 2/1 la 3/1 (raportul latimilor).
Cele mai bune rezultate, adica cele mai "bune citiri chiar de la prima trecere" si rata erorilor de înlocuire cea mai redusa se obtin când ratia (raportul) este mai mare (3/1).
Daca se doreste obtinerea densitatii mari (înalte) de 3,7 caractere/cm (9,4 caractere/deget), atunci trebuie sa se ia o latime de 0,19 mm (0,0075 pouce-degete) si o ratie (raport) de 2,25/1. Cu aceeasi latime, nu vor fi decât 8,3 caractere/pouce-deget, în loc de 9,4.
Limite – Zonele "calme" fara nici o imprimare lizibila, trebuie sa fie cel putin de 10 ori latimea adoptata pentru modulul de baza. Deci, cel putin 1,9 mm daca bara îngusta este de 0,19 mm. Se recomanda totusi sa se prevada mai mult.
Intervale – între cele doua caractere adiacente (alaturate) trebuie sa existe cel putin valoarea unui modul de baza. Se poate merge pâna la de 9 ori aceasta valoare.
Cheia de control – Codul 39 se autocontroleaza, caracter cu caracter. Este deci foarte sigur: cu un aparat de citire bine adaptat si o calitate a imprimarii buna, s-a putut obtine o singura substituire (înlocuire) la 70 de milioane de caractere citite.
fig.6
Cod 393 elemente late dintr-un total de 9
Una din cele mai interesante statistici este cea a Departamentului Apararii al SUA care a facut statistica rezultatelor testelor lor. Au fost citite mai mult de 500.000 de etichete, având în medie 24 de caractere, create pentru diverse materiale de imprimare (imprimanta cu impact, cu matrice de puncte, prese de imprimerie,…). Rezultatul: mai putin de o eroare de substituire (înlocuire) pentru 3 milioane de caractere. Daca acesta poate fi considerat ca insuficient, atunci se poate prevedea o cheie de control calculata în "modulo 43", care ar da un caracter suplimentar, având o relatie aritmetica unica cu mesajul codificat propriu-zis.
Un exemplu: fie sirul de caractere ANNEE 1985
adunând valorile caracterelor se obtine:
10 + 23 + 23 + 14 + 14 + 1 + 9 + 8 + 5 = 107
107 împartit la 43 = 2
restul = 21 va fi caracterul L care devine cheia de control. Codul complet va fi: ANNEE 1985 L
COMENTARII
Codul 39 este un cod alfanumeric. El este extrem de sigur, cu o cheie de control în modulo 43. El permite un numar ridicat de combinatii prin abandonarea bazei 10 pentru a trece în baza "16", sau în baza "32" sau “43”.
Daca densitatea este înalta, se poate obtine un cod de suprafata redusa, de unde succesul sau în industria electronica, pentru identificarea circuitelor imprimate.
3.IMPRIMANTA ZEBRA STRIPE 300
Cererea de transfer caloric a imprimantei
STRIPE S – 300 pentru o tiparire si operare de calitate
Calitatea traditionala a „zebrei”, nedepasita.
Imprimanta Zebra STRIPE S – 300 este cea mai economica alegere pentru etichetarea codurilor de bare.
Transferul caloric al imprimantei STRIPE S – 300 este proiectat pentru a imbunatati calitatea si productivitatea operatiilor de afaceri prin largirea folosirii codurilor de bare fie la receptia docului cand materialele intrate sunt etichetate de echipajul de la receptie in arii de depozitare unde etichetele sunt imprimate si aplicate in momentul in care sunt stocate la inventar, pe banda rulanta de asamblare in timp ce procesul de functionare merge in fabrica sau la o inspectie si la punctele de transport.
Cand trebuie sa faci fata
Imprimanta STRIPE S – 300 imprima pe etichete pana la 114 mm latime si 152 mm lungime. Unitatea accepta role avand diametru standard de 203 mm, acceptand putine schimbari ale rolelor pentru intesificarea productiei. Furnizeaza eticheta perfecta ca marime care corespunde multor inteprinderi incluzand ABCD-ul, AIAG-ul, AIBC-ul si altele specifice. Daca se doreste, memoria poate fi un factor de extindere pana la 5 MB, eticheta avand o lungime pana la 406 mm. Pregradatia neteda suplimentara (baza EPROM) este o optiune utilizabila. Poti folosi orice dispozitiv (truc) capabil sa genereze ASCII de la 300 la 19,200 baud pentru a comanda pretul pentru cel mai eficient sistem de imprimare „Zebra” si pentru a produce etichetele cu coduri de bare care intalnesc imprimanta specifica ANSI.
In situatiile in care punctul de aplicatie al etichetei este dorit, STRIPE S – 300 raspunde dorintei de a tipari la cerere in medii unde sunt cerute imprimari in deplina viteza de 51 mm/sec si fonturi netede predilatate „zebra”.
Imprimanta compacta comprima cel mai mult de la spatiile limitate
Imprimanta STRIPE S-300 livreaza ceea ce te astepti de la Zebra – imprimare de calitate, productivitate si functionalitate, totul intr-o lumina rezistenta (mai putin de 8 kilo), imprimanta compacta care comprima cel mai mult de la spatiile limitate. STRIPE S-300 lucreaza aproape oriunde unde o asezi – pe un raft, birou, pe podeaua unei inteprinderi sau intr-un laborator.
Daca doresti sa incepi sa lucrezi cu coduri de bare sau sa-ti extinzi aplicatiile, dar nu iti permite bugetul sa o faci, descopera Zebra STRIPE S-300.
Specificatii despre imprimare
Filmul capului imprimator subtire
Transfer termal sau imprimare directa termala
Descompunere de 8 puncte/mm
Latime maxima de imprimare: 104 mm
Dimensiunile suportului de memorare
Latimea minima a etichetei: 19 mm
Latimea maxima a etichetei: 114 mm
Lungimea minima a etichetei: 16 mm, model dependent
Lungimea maxima a etichetei: 152 mm cu un standard de 256K DRAM (dintr-un total de 512K DRAM)
Viteze de imprimare
Viteza constanta de imprimare de 51 mm/sec
Limbajul de programare Zebra (ZPLII sau ZPL)
ZPLII sau ZPL se selecteaza prin software
Coduri de bare/Simbologii (lista partiala)
Code 39 Code 11
Cod 128 Code 93
LOGMAR 2 sau 5 intercalari
EAN-8, EAN-13 2 sau 5 industriale
UPC-A, UPC-E 2 sau 5 standa
Interfata comunicatiilor
RS-232C
300-19,200 BAUD
Paritate, date biti, XON-XOFF/DTR set de reguli ale schimbarilor DIP
Material
Usor si compact:
Inaltime: 330 mm
Latime: 210 mm
Grosime: 432 mm
Greutate: 7,84 kg
Mediu ambiant
Temeperatura de functionare: de la 50 C la 400 C
Stocare/transportare: de la -400 C la 600 C
Generarea codului de dare cu ajutorul codului 39, cat si imprimarea lui pe etichete termice, folosind imprimanta termica Zebra Stripe 300 :
fig.7
4.TERMINALUL PORTABIL SYMBOL 3100
fig.8
Captura informatiilor extinse, a Comunicatilor si a Capacitatilor prezentate pentru industria principalelor terminale
4.1.Mai multe optiuni pentru colectarea, etalarea si comunicarea datelor prin Symbol Portable Terminals (Simbolul terminalului portabil)
Sunt mici, deschise la culoare, avand o baza a datelor terminalului portabil DOS de 16 biti si o optiune integranta de scanare. Sunt construite pentru o durabilitate de neegalat si sunt proiectate pentru operatii cu o singura mana.
Si acum, cu o etalare marita, scanarea 2-D laser – viitoarea generatie fara fir Symbol a capacitatii LAN, familia Symbol a datelor teminalului portabil transmite mai multe optiuni pentru colectarea si comunicarea informatiilor vitale pentru organizatia ta:
Popularul PDT 3100 – ofera o alegere de 4 sau 8 linii, avand 20 de caractere etalate. Totodata, poti alege intre configuratii cheie sau optionale: 35 – 46 alfanumeric sau 21 numeric avand o capabilitate de scanare a codurilor de bare lineara (o singura dimensiune). Nu e de mirare ca seria PDT 3100 de la Symbol Technologies este captura datelor codului de bare cea mai populara a industriei datelor terminalului portabil.
Noul PDT 3500 – ofera o linie-16 de expunere a 21 de caractere pentru a observa mai multe date dintr-o singura privire. Totodata, PDT 3500 caracterizeaza o solutie de 46 alfanumerice si optionale unidimensionale sau bidimensionale.
Si pentru rapiditatea accesului la informatii, terminalele PDT 3100 si PDT 3500 ofera un timp real de comunicare cu computerul tau gazda via Symbol Spectrum One sau Spectrum 24 a tehnologiei fara fir LAN.
Optiunile de scanare satisfac un traseu de nevoi
Seriile terminalului PDT 3100 si PDT 3500 ofera o performanta a scanarii pe teren chiar si in mediile cele mai revendicate.
Aptitudinea lor de scanare optionala are abilitatea de a:
citi simbolurile de slaba sau buna calitate, de aproape sau de la distanta;
transmite intr-un timp scurt si exact;
scana prin plastic si alte materiale protectoare;
se roti, permitand o scanare usoara cu ambele maini.
In plus, motorul de scanare 1-D caracterizeaza elementul scanat Mylar patentat la Symbol, o tehnologie unica care creeaza o miscare fara a purta sau distruge durabilitatea, de o seriozitate continua.
4.2.Fisierele portabile pentru PDT 3100
Alternativa a motorului laser de viteza bidimensional mareste suplimentar capacitatea de scanare a PDT-ului 3500. In timp ce transmite cu o excelenta performanta pe simbologii 1-D, citeste simbolul PDF 417, o simbologie 2-D care functioneaza cu o mare densitate si cu o mare capacitate a fisierului portabil a informatiilor. Suport de hartie depozitabil simbolul PDF 417 duce mai mult de un kilobit pe un cod citibil de o masina intr-un spatiu egal cu acela al unui cod de bare. Rezultatul este cel al unui acces scazut la informatii fara a fi nevoie de a se lega la o baza a datelor externa.
Intreaga incarcatura a etichetelor, a manifestelor, a informatiilor valoroase, a modalitatilor de inregistrare si a multor altele devine imediat descifrabila folosind PDF 417 si PDT3500. Afisarea PDT-ului 3500 cu 16-linii permite utilizatorilor sa observe mai multe informatii dintr-o singura privire, facand-o ideala pentru a suporta mai multe fisiere de date decat poate furniza PDF417.
4.3.Optiunile de comunicare adaptate la mediul nostru
Seriile datelor terminalului portabil Symbol PDT 3100 si 3500 ofera o distanta de neintrecut a alternativei de transmitee a datelor: procesul lotului de date, sau aleasa de la tehnologia fara fir LAN pentru accesul rapid la informatii vitale:
Spectrum One se intinde pe o retea spectru a frecventei radio (RF) pentru schimbari de informatii ON LINE cu computerul tau gazda. Rapid, aceasta imixtiune, o solutie fara fir, o performanta a caracteristicii inalte a modelului celular pentru puterea de trecere in timp ce furnizeaza la mare distanta operatii si informatii securizate.
Symbolul Spectrum 24 viitoarea generatie fara fir LAN este o caracteristica a angajamentului de a deschide cate un model la fiecare interfata hardware si software. Schitat pentru a satisface propunerea standard IEEE 802.11 pentru LAN-urile fara fir, Spectrum 24 este ideal pentru aplicatii care cer nivele inalte de putere de trecere a informatiei.
Ideal pentru informatii si aplicatii intensive
Terminalele informaiilor portabile Symbol sunt ideale pentru informatiile si aplicatiile intensive pe o scara larga a industriei, incluzand vanzarea, unde terminalele informatiilor portabile aduc noi nivele de viteza, seriozitate la verificarea preturilor politelor, verificarea preturilor, intrarea comenzilor, controlul inventarului, navigatie, vanzare-cumparare. Companiile de transport si logistica vor afla ca asigura mai multe cai eficiente de a efectua urmarirea pachetelor/bagajelor, vanzarii-cumpararii si ale aplicatiilor de traversare a docului.
Trecut cunoscut si viitor nelimitat
Seria terminalelor datelor portabile Symbol PDT 3100 are o istorie cunoscuta a performantelor si seriozitatii sale.Acum, seria este cu mult mai mare, cu mai multe optiuni in a te ajuta sa colectezi si sa comunici date care sunt vitale organizatiei tale.
Este un alt exemplu al unei gandiri strategice din partea Symbol Technologies, liderul in actionarea odurilor de bare si a sistemelor de conducere a informatiei, cu mai mult de 5 milioane de scanere si terminale instalate in toata lumea.
5.Utilizare Sistem
Achiziție Date cu Ajutorul Codurilor de Bare
Sistemul actual de achiziție date folosind tehnologia codurilor de bare are următoarele părți componente:
Hardware Citire și Transmisie Coduri de Bare
terminale de culegere date Symbol PDT 3100 8 linii display, 1 MB RAM
un cradde simplu cu un slot
cablu de legătură de la PC la craddle RS232
alimentator cradle
cablu alimentare 220 V
Hardware Tiparire Etichete cu Coduri de Bare
imprimanta Zebra 105Se
cablu de legătura la PC RS232 sau paralel
cablu de alimentare 220 V
Software
de gestiune și achiziție coduri de bare pe terminalele PDT 3100
de comunicație dintre terminal și PC
de suport PC și de debugging
Consumabile
baterii NiCd reîncărcabile pentru terminalele PDT 3100
etichete autoadezive 42×21 mm albe în role de 6.500 bucăți
ribbon negru 40 mm x 450 m pentru tipărire coduri de bare
soluție de curățat capul de tipărire al imprimantei Z105Se
5.1.Softwer-ul de gestiune și achiziție coduri de bare pentru terminalele PDT 3100
Componenta
Este grupat în programul MAESTRO.EXE care este încărcat în memoria EEPROM NVM a terminalului, laolaltă cu driverele de comunicație și de scanare. În memoria RAMDISK a terminalului mai sunt încărcate următoarele fișiere: POZIȚII.TXT (inventarul pe poziții), STOC.TXT (inventarul simplu), DENINDEX.DAT (fișierul de indecși pentru STOC.TXT) și PRODUSE.DAT (nomenclatorul de produse).
Mai sunt prezente în vederea efectuării de eventale intervenții software utilitarul TDREM.EXE în memoria NVM precum și RX.BAT în RAMDISK.
Descriere
În ceea ce privește utilizatorul, acesta va avea doar de apelat de la promptul sistemului de operare programul MAESTRO.EXE utilizând tastatura alfanumerică a terminalului, după modelul
În acest moment pe ecranul terminalului vor apărea următoarele: D:> <M><A><E><S><T><R><O><ENTER>
fig.9
Utilizatorul poate alege o opțiune fie apăsând direct cifra din meniu, fie deplasând zona cu highlight ce reprezintă opțiunea curentă cu ajutorul săgeților Sus Jos confirmând alegerea cu ajutorul tastei ENTER (dreapta jos).
Ieșirea din orice meniu de acest tip se face cu ajutorul tastei CLR (echivalentul tastei ESC) aflată în stânga sus pe tastatura PDT 3100. Dacă se tastează <CLR> în MENIUL PRINCIPAL, se iese din program în sistem la prompterul DOS (D:>). Dacă se tastează <CLR> în orice alt meniu, se revine în meniul imediat superior.
O sesiune de culegere de date constă în principal din trei activități:
culegerea de date
alegerea tipului de inventar: VERIFICARE PRODUS, INVENTAR SIMPLU sau INVENTAR PE POZIȚII
introducerea efectivă de date:de la tastatura,prin scanare,adaugarea datelor suplimentare
comunicatia:transmisia datelor adunate
ștergerea de date adunate pentru a face loc altora noi
În acest program ștergerea de date are loc automat la încheierea cu succes a comunicației de date și este controlată de către PC.
5.1.1.Culegere Date
Alegerea Tipului de Inventar
Daca din Meniul Principal am ales <1:Culegere Date>,in acest moment pe ecranul terminalului va apărea:
fig.10
Si in acest caz,utilizatorul poate alege o opțiune fie apăsând direct cifra din meniu, fie deplasând zona cu highlight ce reprezintă opțiunea curentă cu ajutorul săgeților Sus Jos confirmând alegerea cu ajutorul tastei ENTER (dreapta jos).
Ieșirea din orice meniu de acest tip se face cu ajutorul tastei <CLR> (echivalentul tastei ESC) aflată în stânga sus pe tastatura PDT 3100. Revenirea se va face în Meniul Principal.
În acest moment utilizatorul are posibilitatea să specifice scopul adunării de date, fie el Vrificare Podus, Iventar Smplu sau Inventar Pozitii.
Schimbare Tip de Inventar
Dacă dintr-un motiv oarecare ați ieșit din program fără ca să comunicați datele culese la PC și doriți să reluați activitatea, programul vă va avertiza că există date netransmise (linia 1), specificând în același timp și tipul lor și vă va întrewba dacă doriți să le ștergeți sau nu (liniile 2 și 3):
fig.11
Dacă apăsați <ENTER> datele vor fi definitiv pierdute, programul efectuînd ștergerea fișierelor însoțită de un semnal sonor de strivire (squelch). Dacă nu doriți să se întâmple acest lucru, apăsați orice altă tastă.
Și, în acest caz, programul vă va întreba pe liniile 2 și 3 dacă doriți să continuați:
fig.12
Dacă doriți să continuați cu culegerea de date, alegeți <ENTER>, dacă nu, alegeți orice altă tastă.
5.1.1.1.Verificare Produs
După ce alege opțiunea 1:Verificare Produs, ecranul se modifică și apare următorul:
fig.13
În acest moment programul așteaptă să scanați sau să introduceți de la tastatură codul produsului.
În principal codurile vor fi scanate, întrucât scanarea este mult mai rapidă și mai sigură, dar dacă codul de pe etichete nu poate fi citit, sau partea de scanare de la terminal s-a defectat, se poate folosi atunci și tastatura terminalului.
Observații: tastatura terminalului lucrează foarte asemănător cu cea a unui PC normal. Datorită programului, caracterele introduse vor apărea automat cu litere majuscule, întrucât toate codurile din nomenclator sunt cu litere majuscule. Sunt disponibile și tastele <BSP> (BackSPace) care șterge ultimul caracter tastat, precum și <CLR> (CLeaR) care șterge tot rândul introdus de la tastatură.
Tot din program nu se permite ca o dată ce s-a început introducerea de caractere din cod de la tastatură, să se mai scaneze;
Scanerul este activat doar dacă cursorul hardware este poziționat pe prima poziție; el poate ajunge acolo în trei feluri: implicit (atunci când se intră în meniu), sau explicit (prin apăsarea tastei CLR o dată, sau prin apăsări succesive ale tastei BSP). Dacă se încearcă apăsarea tastei BSP dincolo de prima poziție, un mesaj sonor de avertizare va fi emis).
În cazul introducerii manuale a codului, programul admite două situații:
codul este mai scurt de 13 caractere și atunci codul trebuie terminat cu ajutorul explicit al tastei <ENTER>, de exemplu 00001020731101<enter>
codul are 13 caractere și atunci programul pune un “enter” automat după ce s-au introdus 13 caractere;
codurile mai lungi de 13 caractere sunt trunchiate la primele 13 caractere. În principiu toate codurile au maxim 13 caractere, deci oricum un cod mai lung de 13 caractere nu este un cod din nomenclator.
În cazul introducerii unui cod incorect (incomplet sau inexistent în NOMENCLATOR), ecranul terminalului se va albi, se va afișa mesajul “Cod Inexistent!” și terminalul va emite un semnal sonor continuu până la apăsarea tastei <ENTER>.
Toate mesajele de eroare emise de terminal șterg ecranul și afișează un mesaj potrivit cu eroarea întâmplată și vor emite un semnal audio continuu până la apăsarea tastei <ENTER>, care probează luarea la cunoștință a erorii de către operator. Dacă eroarea întâplată poate fi “recuperată” (adică se poate ca printr-un alt curs al acțiunii să se elimine eroarea), programul va reveni într-o instanță de program care permite recuperarea erorii, altfel va ieși în sistemul de operare. În acest ultim caz trebuie contactat personalul specializat de service software al furnizorului.
O scanare reușită este semnalizată atât vizual (becul DECODE de pe scannerul montat pe PDT 3100 se colorează în VERDE) cât și sonor (un beep scurt).
Exemlpu:
Să presupunem că un cod corect a fost introdus, fie de la tastatură, fie prin scanare, de exemplu “98739200150”. Ecranul se modifică după cum urmează:
fig.14
La toate produsele care au preț nul în NOMENCLATOR, programul va alerta operatorul printr-o suită de tonuri înalte-joase rapide (quick_warble), iar la cele care au valoare nulă la numărul de bucăți din pachet printr-un mesaj de eroare (emit_error_tone).
După cum se observă, primul rând cu 35 de caractere conține denumirea produsului, așa cum apare ea în NOMENCLATOR, al doilea arată codul de articol, al treilea arată numărul de bucăți dintr-un pachet, iar pe ultimul rând sunt afișate prețul reperului. Pentru a verifica un nou produs, apăsați orice tastă pentru a continua.
Din această funcție se poate reveni în MENIUL PRINCIPAL tastând <ENTER> cu cursorul hardware pe prima poziție. În acest moment ecranul arată în felul următor:
Fig.15
Confirmarea se face doar prin tastarea tastei <Enter>. Orice altă tastă ne trimite înapoi în funcția de Verificare Produs (fig. 1.5). Dacă mai sunt produse de verificat, apăsați orice tastă în afară de <Enter> și <PWR>, dacă nu alegeți <Enter>.
Tasta <PWR> (PoWeR) are rolul de a pune terminalul în modul somn-trezire-somn. O asemenea funcție este necesară pentru prezervarea bateriei terminalului. Funcția de “somn” se declanșează automat după un minut de inactivitate (nu se transmit date, nu se apasă taste și nu se scanează). Ea se manifestă prin ștergerea ecranului și “insensibilitatea” terminalului la orice acțiuni, în afara acționării tastei <PWR>. Numai această tastă este în masură să “trezească” terminalul, programul fiind reluat din instanța în care se afla înainte să “adoarmă”.
De asemenea tastele de pe primul rând de taste alfanumerice ale PDT 3100 au funcții speciale, după cum urmează: <CLR>(CLeaR), <FNC>(FuNCtion), <SHF> (SHiFt), <CTL> (ConTroL) și <PWR>. Vom folosi drept convenție pe tot parcursul manualului ca fraza “apăsati orice tasta în afară de tasta <tastă>” să se înțeleagă că “apăsați orice tastă în afară de tasta <tastă> și de tastele <CLR>, <PWR>, <CTL>, <BSP>, <FNC> și <SHF>”.
5.1.1.2. Inventar Simplu
Dacă aleg opțiunea 2 (Inventar Simplu), pe ecran apare:
Fig.16
În acest moment programul asteapta sa scanati sau sa introduceti de la tastatura codul produsului. La inventarul simplu se urmareste câte produse din fiecare reper exista în magazie/depozit pe ansamblu, fara luarea în consideratie a informatiei de localizare a marfii pe rafturi.
Să presupunem că un cod corect a fost introdus, fie de la tastatură, fie prin scanare, de exemplu “98739200150”. Ecranul se modifică după cum urmează:
Fig.17
Cantitatea afișată în cazul nostru este unu implicit, pentru că respectivul reper nu a mai fost introdus în inventarul respectiv. Dacă, de exemplu, ar mai fi existat alte cinci produse din acest reper introduse deja, programul ar fi afișat:
Fig.18
Vizualizare Inventar Simplu
Vizualizarea Inventarului Simplu se poate face din Inventar Simplu (vezi ecranul de la fig.10) prin apăsarea tastelor Sus sau Jos. Dacă nu există date, comanda este ignorată. Datele culese sunt sortate crescător după denumire produs, ușurând în acest fel cu mult munca de căutare a unui anume reper după denumire. Implicit se afișează prima poziție de pe Inventarul Simplu.
În cadrul acestei vizualizări se pot utiliza tastele <Sus> și <Jos> pentru deplasare cu o poziție în sus, respectiv în jos pe factură/bon/inventar. Dacă sunteți poziționati pe prima poziție a facturii și apăsați <Sus>, programul va ignora comanda și va emite un mesaj sonor slow_warble (suita de tonuri înalte-joase de frecvență mică). La fel se va întâmpla dacă sunteți pe ultima poziție și apăsați tasta <Jos>.
Există chiar posibilitatea căutării unui anume reper prin tastarea literelor care îl compun. Căutarea începe întotdeauna din poziția curentă de pe factură. Să presupunem că sunteți la începutul facturii, că nu ați mai făcut căutări și că doriți să găsiți reperele care au denumirea începând cu cuvântul “SALTEA”.
In acest caz veti tasta <S> <A> <L> <T>, etc.. Pe masura ce tastati veti observa ca pe ecran se afiseaza mai intai prima pozitie de pe factura care incepe cu “S”, apoi prima pozitie care incepe cu “SA”, s.a.m.d. Daca nu se gaseste un reper cu denumirea corespunzand cu sirul de cautare introdus, programul va afisa prima pozitie de pe Inventarul Simplu care are reperul cel mai apropiat de sirul de cautare.
Daca v-ati razgandit in ceea ce priveste cuvantul cautat, trebuie sa apasati tasta <CLR>. Aceasta nu numai ca va pozitiona ecranul de vizualizare pe prima pozitie din factura, ci va reinitializa si sirul de cautare, fara de care cautarea nu se poate face corect. Deci, inainte de orice cautare, cu exceptia primei intrari in Vizualizare Date, apasati tasta <CLR>.
Daca, de exemplu, dupa ce ati tastat <S> <A> <P> <U> doriti sa cautati “BLUZA” si incepeti sa tastati <B>,<L>, etc. uitand sa tastati <CLR>inainte de <B>, programul va incerca sa caute incepand din pozitia curenta cuvantul “SAPUBL”… cu rezultate pe masura.
Iesirea din functia de vizualizare se face tastand <ENTER>.
5.1.1.3 Inventar Pozitii
Daca se alege optiunea <3:Inventar Pozitii>, pe ecran va aparea:
Fig.19
In acest moment programul asteapta sa scanati sau sa introduceti de la tastatura codul produsului sau al pozitiei, in orice ordine. La inventarul pe pozitii se urmareste cate produse din fiecare reper exista in magazie/depozit pe rafturi.
Sa presupunem ca un cod corect a fost introdus, fie de la tastatura, fie prin scanare, de exemplu “000016265103”. Ecranul se modifica dupa cum urmeaza:
Fig.20
Dupa introducerea pozitiei, ecranul se modifica dupa cum urmeaza:
Fig.21
Cantitatea se introduce urmarind aceleasi consideratii ca la cap.5.1.1.4.
Din acest tip de meniu se iese tastand <ENTER> pe prima pozitie din ecranul din fig. 10. In acest moment va apare urmatorul ecran:
Fig.22
si dupa apasarea oricarea taste se va reveni in MENIUL PRINCIPAL.
Adaugarea de Date Suplimentare Inventar Pozitii
Daca, dupa ce ati confirmat inchiderea inventarului pe pozitii va amintiti ca mai aveti date de cules si nu ati apucat sa descarcati factura la PC, puteti sa alegeti din nou optiunea “Culegere Date” din MENIUL PRINCIPAL. In acest caz programul va va avertiza:
Fig.23
Daca doriti sa continuati cu culegerea de date, fara stergerea inventarului adunat pana in acel moment, tastati orice tasta inafara de <ENTER>, altfel tastati <ENTER>. In acest moment programul mai solicita o confirmare in vederea continuarii culegerii de date:
Fig.24
In cazul in care ati ales sa continuati cu culegerea de date (<ENTER>) se revine la ecranul din fig 10.
Vizualizare Inventar Pozitii
Vizualizarea Inventarului pe Pozitii se poate face din Inventar Pozitii prin apasarea tastelor Sus sau Jos. Daca nu exista date, comanda este ignorata. Datele culese sunt sortate crescator dupa codul pozitiei, usurand in acest fel cu mult munca de cautare a unui anume reper dupa denumire. Implicit se afiseaza prima pozitie de pe Inventarul pe Pozitii. Aceleasi consideratii ca la capitolul 1.3.5 sunt valabile si aici.
Modul de afisare al datelor este pe tipicul ecranului de mai jos:
Fig.25
5.1.1.4. Introducerea Cantității
Cantitatea se introduce incremental, adică se adaugă la cea deja existentă. Dacă de exemplu mai introducem un produs din acest reper apăsând <1> <ENTER>, data viitoare când vom scana din nou acest cod, vom avea afișat:
Fig.26
Cantitatea se poate introduce în două feluri:
de la tastatură
prin scanare
Cele două tipuri de introduceri de date pot fi combinate în cadrul aceleeași sesiuni.
Introducerea de cantități de la tastatură
Se poate face tastând cifrele componente de la tastatură, urmate de <ENTER>. Nu se admit alte caractere în afara celor de la <0> la <9>, a<.> și a caracterelor speciale <M> și <R>, care au aceeași semnificație de Minus, respectiv Retur. Orice alt caracter va face programul să emită un error_tone.
Observație: <M> și <R> au practic aceeași funcționalitate, ele prefixând cantitatea introdusă cu semnul <-> (minus), în acest fel putându-se face corecțiile. Nu se pot face retururi mai mari decât ce s-a introdus deja, adică dacă avem introduse șase produse pe Inventar, nu putem face retur la șapte. Dacă se încearcă acest lucru, programul afișează mesajul de eroare “Err cant totala negativa”.
Dacă se introduce prima dată o cantitate mai mică sau egală cu zero, programul afișează mesajul de eroare “Cantitate<=0”. Dacă se introduce o cantitate care adaugată la cea precedentă este mai mare de 9999 atunci programul afișează un mesaj de eroare.
În cadrul unei introduceri de date, tastele <M>, <R> și <..> pot fi folosite o singură dată, după cum urmează:
<M> cifre <.> cifrezecimale <ENTER>
sau
<R> cifre <.> cifrezecimale <ENTER>
Dacă nu se respectă acest tipic, programul va emite un error_tone.
Tastele <BSP> și <CLR> au aceeași funcționalitate ca mai sus.
Dacă în urma unui retur cantitatea totală ajunge să fie egală cu zero, reperul respectiv nu va mai apărea pe lista produselor din inventar, iar dispariția sa va fi însoțită de un zgomot de strivit (squelch).
La apăsarea tastei <ENTER>, în condițiile unei introduceri valide de cantități, se revine în ciclul de la Inventar Simplu (vezi ecranul de la fig. 10).
Introducerea de cantități prin scanare
Există, de asemenea, posibilitatea că, în urma scanării aceluiași cod, cantitatea să fie incrementată cu unu. O scanare reușită este semnalizată atât vizual (becul DECODE de pe scannerul montat pe PDT 3100 se colorează în VERDE) cât și sonor (un beep scurt). La scanarea unui alt cod se emite un error_tone.
Nu se poate scana decât dacă cursorul hardware de pe ecran se află pe prima poziție. El poate ajunge acolo în trei feluri: implicit (atunci când se intră în meniu), sau explicit (prin apăsarea tastei CLR o dată, sau prin apăsari succesive ale tastei <BSP>). Dacă se încearcă apăsarea tastei <BSP> dincolo de prima poziție, un mesaj sonor de avertizare error_tone va fi emis).
Din acest tip de scanare se iese tastând <ENTER> pe prima poziție. La apăsarea tastei <ENTER>, în condițiile unei introduceri valide de date, se revine în Inventar Simplu (vezi ecranul de la fig. 10).
Pentru încheierea sesiunii de Inventar Simplu se apasă <Enter> pe prima poziție în ecranul din figura 10. În acest moment va apare următorul ecran:
Fig.27
Daca ați ales <D>, programul va mai afișa pentru un timp foarte scurt pe linia 4 mesajul “Închidere Inventar”, după care va reveni în MENIUL PRINCIPAL.
Adăugarea de Date Suplimentare
Dacă, după ce ați confirmat închiderea inventarului vă amintiți că mai aveți date de cules și nu ați apucat să descărcați factura la PC, puteți să alegeți din nou opțiunea “Culegere Date” din MENIUL PRINCIPAL. În acest caz programul vă va avertiza:
Fig.28
Dacă doriți să continuați cu culegerea de date, fără ștergerea inventarului adunat până în acel moment, tastați orice tastă în afară de <ENTER>, altfel tastați <ENTER>. În acest moment programul mai solicită o confirmare în vederea continuării culegerii de date:
Fig.29
In cazul in care ati ales sa continuati cu culegerea de date (<ENTER>) se revine la ecranul din fig 10.
5.1.2. Comunicatii Date Inventare
5.1.2.1. Sesiunea de Comunicatii
Pentru a putea comunica date,revenim la Meniul Principal de unde vom seta pozitia [2:Comunicatii]:
fig.30
La alegerea optiunii de comunicatii, programul afiseaza:
Fig.31
Daca se doreste descarcarea datelor, se va alege optiunea 1,iar daca se doreste reimprospatarea nomenclatorului,se alege optiunea 2. Optiunea 3 este doar pentru debugging si va fi utilizat doar de catre operatori.
In cazul primei optiuni mesajele sunt dupa cum urmeaza:
a. Daca programul NU stie tipul datelor culese(caz in care nu s-a luat o decizie a tipului de date transmis, si s-a ajuns direct in [2:Comunicatii] ) va va solicita sa decideti in ceea ce priveste tipul datelor printr-o serie de ecrane de dialog:
Fig.32
Dupa apasarea unei taste va aparea fig.33,unde avem solicitarea tipului de date transmise.
fig.33
b.Daca programul STIE tipul datelor (in decursul unei sesiuni normale de lucru, asa cum ar trebui sa se intample) programul va solicita asezarea terminalului PDT 3100in oricare din sloturile libere din cradle:
fig.34
In momentul in care programul de comunicatie sesizeaza asezarea terminalului in cradle, el incepe sesiunea de comunicatie cu PC-ul
.
Observatie: Se interzice ridicarea terminalului din cradle odata sesiunea de comunicatie inceputa!
O sesiune de comunicatii cu PC-ul este incununata de succes numai atunci cand programul a transmis toate inregistrarile de date pe care le avea, la PC, iar acesta din urma I-a trimis OK-ul in ceea ce priveste corectitudinea numarului inregistrarilor primite.
Dupa ce a transmis datele si are OK-ul PC-ului,programul de pe terminal STERGE datele culese si revine in MENIUL PRINCIPAL.
Un singur terminal poate sa transmita la un moment dat catre PC date, si de aceea toate terminalele se lupta pentru controlul magistralei de date.Unul singur castiga la un moment dat, si LED-ul COMM din dreptul lui clipeste (avand culoare rosie).Celelalte,care au pierdut au LED-ul COMM aprins continuu. Terminalul care a castigat incearca apoi sa vada daca are un partener de dialog, in speta un PC care sa-l asculte.In cazul in care nu are un asemenea partener, el afiseaza:
Fig.35
Absenta DSR-ului poate avea urmatoarele explicatii:
-PC-ul corespondent nu este pornit;
-cablu de legatura dintre PC si cradle nu este conectat sau este stricat;
-programul executabil nu ruleaza pe PC –ul corespondent.
In principiu ,comunicatia de date dureaza putin, deoarece aceasta are loc la viteze foarte mari(38 kbps).
5.1.2.2.Erori in timpul comunicatiei
Mesajele de eroare care pot fi afisate de catre terimalul portabil PDT 3100 in faza de comunicatie sunt urmatoarele:
/* 7 */ “DSR Lost”
/* 8 */ “Aborted by <CLR>key
/* 9 */ “Recev buffer overrun”
/* 10 */ “Receive timeout”
/* 23 */ “Nr.gresit de inregistrare”
/* 24 */ “eroare de fisier”
/* 28 */ “eroare de programare”
/* 31 */ “nr.MAX incercari dep”
/* 32 */ “Ident. term. Gresit!”
/* 33 */ “PC-raspuns gresit”
/* 34 */ “octeti pierduti RX!”
/* 35 */ “eroare continut inregistrare”
/* 36 */ “comunicare intrerupta”
/* 40 */ “RAMDISC insuficient”
/* 41 */ “TimeOut ETX de la PC”
/* 44 */ “TimeOut Confirm PC”
Erorile 7 , 23 , 34 , 35, 36 , 41 si 44 pot avea ca explicatie o intrerupere a comunicatiei cu PC-ul.
Eroarea 40 semnifica soatiul RAMDISK insuficient pe terminal; poate apare atunci cand se incarca un NOMENCLATOR foate mare.Este o eroare irecuperabila.
Datorita faptului ca terminalul nu renunta la comunicatia de date pana la victorie, eroarea 31 este inutila.
Eroarea 8 apare atunci cand un operator incearca sa opreasca sesiunea de comunicatii apasand tasta <CLR>.
Celelalte erori sunt erori de programare sau conditii de eroare neexplorate.
1.2.2.3.Intreruperea sesiunii de comunicatii
Intreruperea sesiunii de comunicatii, se recomanda a se face numai in cazuri absolut exceptionale,adica in caurile in care s-a ales tipul datelor,s-au cules datele,s-a inceput sesiunea de comunicatie, nu s-au transmis datele si s-a observat ca tipul de date este gresit!
Daca terminalul a apucat sa transmita datele si aprimit confirmarea de la PC a transmisiei corecte, nu se mai poate face nimic, deoarece PC-ul a scris deja datele pe server, iar terminalul le-a sters,emitand sunetul specific: squelch.
Daca transmisia nu s-a terminat, se procedeaza astfe:
Se apasa <CLR>
Se ridica terminalul din crandle si se asteapta mesajul din fig.35.
Se apasa <PWR> si se trece in starea de “somn”
Se apasa simultan tastele < 4> si < 5 >
Se tasteaza din nou <PWR>
Se elibereaza simultan tastele < 4 > si < 5 >
Dupa aceasta secventa, terminalul va face un Reset,si se va putea initia actiunea:
1.2.3. Setare scanner
Scannerul de la terminalul PDT 3100 poate fi asezat in doua pozitii: stanga sau dreapta. Aceasta actiune poate avea loc prin ridicarea cu circa 2-3 mm a capului de scanare, rasucirea acestuia in directia opusa si lasarea acestuia la loc. Rasucirea se va face intotdeauna catre spatele terminalului si nu invers.
Daca nu se modifica pozitia scannerului, NU trebuie aleasa aceasta optiune din meniu, iar daca este aleasa, atunci trebuie avut grija ca ea sa ajunga in cele din urma in concordanta cu pozitia reala a scannerului.
Datorita faptului ca nu exista un mecanism hardware care sa-i spuna terminalului in ce directie este orientat scannerul, programul (operatorul) trebuie sa faca explicit aceasta prin cea de-a treia optiune:
Fig.36
Implicit scanerul este setat din program pe stanga. Alegerea succesiva a acestei optiuni din MENIUL PRINCIPAL va muta scanerul stanga/dreapta/stanga.
5.2. Software-ul de comunicatie dintre terminal si PC
2.1 Componenta
Este format din programul TFT3000.EXE, si fisierele batch de comunicatie GETSTOC.BAT si GETPOZ.BAT (pentru preluarea datelor de la inventarele simplu si respectiv pe pozitii) si SENDNOM.BAT (pentru trimiterea nomenclatorului la terminal). Calculatorul local la care este legat cradle-ul trebuie sa fie echipat cu o interfata seriala COM1 sau COM2: libera si sa poata rula o fereastra DOS. Calea catre aceste fisiere trebuie declarata in sectiunea PATH din AUTOEXEC.BAT.
2.2 Modul de realizare al Comunicatiei
Terminalul este in Modul Comunicatie doar atunci cand pe ecran afiseaza:
fig.37
Iesirea din acest mod se face apasand mai intai tasta <Ctl> apoi tasta <Bsp>. Aceasta actiune duce la intreruperea sesiunii de comunicatie de catre terminal.
DUPA ce terminalul este in Modul Comunicatie, NUMAI ATUNCI se pot lansa fisierele BAT pe PC pentru efectuarea comunicatiei, functie de necesitati.
Continutul fisierului SENDNOM.BAT pentru COM1:
nom_make.exe
tft3000.exe –s38 –p1 –x P PRODUSE.DAT
]
Primul program aduce fisierul PRODUSE.TXT la o forma “redusa” care se numeste PRODUSE.DAT, care sa incapa in PDT si sa permita cautari mai rapide.
Al doilea program incarca efectiv fisierul in PDT3100.
Continutul fisierului GETSTOC.BAT pentru COM1:
tft3000.exe –s38 –p1 G STOC.TXT
tft3000.exe –s38 –p1 E STOC.TXT
tft3000.exe –s38 –p1 –x E DENINDEX.DAT
Continutul fisierului GETPOZ.BAT pentru COM1:
tft3000.exe –s38 –p1 G POZITII.TXT
tft3000.exe –s38 –p1 –x E POZITII.TXT
Continutul fisierului GETSTOC.BAT pentru COM2:
tft3000.exe –s38 –p2 G STOC.TXT
tft3000.exe –s38 –p2 E STOC.TXT
tft3000.exe –s38 –p2 –x E DENINDEX.DAT
Continutul fisierului GETPOZ.BAT pentru COM1:
tft3000.exe –s38 –p2 G POZITII.TXT
tft3000.exe –s38 –p2 –x E POZITII.TXT
Continutul fisierului SENDNOM.BAT pentru COM2:
nom_make.exe
tft3000.exe –s38 –p2 –x P PRODUSE.DAT
2.3 Structuri de date
2.3.1.Generarea unui fisier text in format fix dintr-un DBF:
index on marca tag marca asc &&indecsez crescator tabela produse.dbf
&& dupa campul ‚marca’,de exemplu
copy to produs.txt field codf,nume,marca,pret_g SDF && generez fisierul
&& produs.txt
2.3.2. Structura tabelei „produse.txt”
Structure for table: PRODUSE.DBF
Field Field Name Type Size
––––––––––––––
1 NUME Character 35
2 CODF Character 20
3 MARCA Numeric 8
4 PRET_G Numeric 10
#define COD_RL 13
#define CANTITATE_RL 7
#define POZITIE_RL 6
2.3.3. Strucura fisierului STOC.TXT generat pe PDT 3100
struct stoc // stocul de lucru
{
char cod[COD_RL];
char sep1;
char cantitate[CANTITATE_RL];
char cr;
char lf;
};
2.3.4. Strucura fisierului POZITII.TXT generat pe PDT 3100
struct pozitii // fisierul cu stocul pe pozitii
{
char pozitie[POZITIE_RL];
char sep1;
char cod[COD_RL];
char sep2;
char cantitate[CANTITATE_RL];
char cr;
char lf;
};
Obs: cr =’0x13’ lf=’0x10’ separatorii sunt spatii (blank)
2.4.Mesaje de eroare
Amintim cateva dintre erorile posibile ce pot sa apara:
/* 23 */ “nume incorect, fisier inexistent,sau cale gresita”
/* 26 */ “eroare de paritate”
/* 34 */ “com. Intrerupta la cererea utilizatorului”
/* 35 */ “eroare la config. Port com.”
/* 37 */ “un alt terminal a raspuns”
/* 38 */ “raspuns gresit de la terminal”
/* 46 */ “inreg cu lungime zero”
/* 47 */ “eroare de program”
/* 60 */ “comanda necunoscuta de la terminal”
3. Software-ul de suport PC si de debugging
Este format din fisierele NOM_MAKE.EXE, HSORTPC.EXE, CORRECT.EXE – partea de suport PC si NCEDIT.EXE, FREEMEM.EXE, SENDHEX.EXE, NVMNIC01.HEX, DELX.BAT, GETX.BAT, TX.BAT, RX.BAT, DIRX.BAT ,TFT3000.EXE – partea de debugging pe PC si RX.BAT, PRODUSE.DAT – pe terminalul PDT3100.
ORGANIGRAMELE PROGRAMULUI
Schema bloc a interfetei, realizata cu ajutorul limbajului de programare Visual C++, arata in felul urmator:
Fig.39
Pentru crearea aplicatiei, s-a folosit dezvoltarea cu ajutorul arhitecturii MFC AppWizart, care este o aplicatie de tip “ Dialog Based ”.
Proiectarea ferestrei de dialog a fost realizata utilizand editorul de resurse, pus la dispozitie de mediul Visual C++6.
Fereastra de dialog permite interactiunea dintre utilizator si terminal, prin intermediul controalerelor( editor-box, butoane).
Pentru a exemplifica mai bine ceea ce s-a realizat, vom comenta schemele bloc insotite de liniile de program cu care s-au realizat ferestrele de dialog.
In realizarea ferestrei MENIU PRINCIPAL am inserat o fereastra dialog , selectand meniul Insert_Resurs.
Codul sursa de realizare al Meniului Principal este:
// ADBDModDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "ADBDModDlg.h"
#include "receptie.h"
#include "Generare.h"
#include "inventar.h"
#include "despre.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADBDModDlg dialog
CADBDModDlg::CADBDModDlg(CWnd* pParent /*=NULL*/)
: CDialog(CADBDModDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CADBDModDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CADBDModDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CADBDModDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CADBDModDlg, CDialog)
//{{AFX_MSG_MAP(CADBDModDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN_DIALOG, OnOpenDialog)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADBDModDlg message handlers
BOOL CADBDModDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CADBDModDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() – cxIcon + 1) / 2;
int y = (rect.Height() – cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CADBDModDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
#include "RsCgDlg.h"
void CADBDModDlg::OnOpenDialog()
{
CRsCgDlg dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton3()
{
// TODO: Add your control notification handler code here
CReceptie dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton2()
{
CGenerare dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton1()
{
CInventar dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton5()
{
CDespre dlg;
dlg.DoModal();
}
Pe suprafata interfetei de dialog au fost aplicate opt butoane:
Actualizarea bazei de date
Generare Lista Inventar
Generarea Fisierului Terminal
Receptie Fisier Terminal
Comparare baze de date
Despre proiect
OK
Cancel
Actualizarea bazei de date
Selectand butonul “Actualizarea bazei de date”, se deschide o fereastra de dialog care permite comunicarea dintre utilizator si baza de date. Comunicatia cu baza de date, se realizeaza utilizand controlerul MFC ADO BOUND Data, control care permite navigarea navigarea pe baza de date-acesarea unei anumite inregistrari din baza de date.
Am adus de asemenea imbunatatiri controlerului BOUND Data, in sensul ca l-am complectat cu inca doua optiuni, si anume: salvare si inregistrare.
Fig.40
Generare Lista Inventar
Aceasta fereastra ne permite sa extragem din baza creata anterior, informatii cu privire la produsele cele mai scumpe sau mai ieftine,la cele avand cea mai mica sau mai mare cantitate.
Fig.41
Codul sursa al acestei ferestre este urmatoarea secventa:
// Inventar.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Inventar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInventar dialog
CInventar::CInventar(CWnd* pParent /*=NULL*/)
: CDialog(CInventar::IDD, pParent)
{
//{{AFX_DATA_INIT(CInventar)
m_sEdit2 = _T("");
m_sEdit3 = _T("");
m_sEdit4 = _T("");
m_sEdit5 = _T("");
//}}AFX_DATA_INIT
}
void CInventar::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInventar)
DDX_Text(pDX, IDC_EDIT2, m_sEdit2);
DDX_Text(pDX, IDC_EDIT3, m_sEdit3);
DDX_Text(pDX, IDC_EDIT4, m_sEdit4);
DDX_Text(pDX, IDC_EDIT5, m_sEdit5);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInventar, CDialog)
//{{AFX_MSG_MAP(CInventar)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInventar message handlers
BOOL CInventar::OnInitDialog()
{
CDialog::OnInitDialog();
m_sEdit2="Tigari MONTE-CARLO";
m_sEdit3="Tigari DERBY";
m_sEdit4="Tigari L&M";
m_sEdit5="Tigari Carpati";
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Generarea Fisierului Terminal
Prin apelarea acestei ferestre avem posibilitatea transmiterii de fisiere de la PC la terminalul nostru portabil.
In momentul apelarii acestei optiuni, suntem intrebati daca dorim sa continuam sau nu.
Fig.42
Codul sursa al acestei ferestre este:
// Generare.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Generare.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGenerare dialog
CGenerare::CGenerare(CWnd* pParent /*=NULL*/)
: CDialog(CGenerare::IDD, pParent)
{
//{{AFX_DATA_INIT(CGenerare)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CGenerare::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGenerare)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGenerare, CDialog)
//{{AFX_MSG_MAP(CGenerare)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
CGenerare message handlers
Receptie Fisier Terminal
Cu ajutorul lui vom putea primi de la terminal informatia culeasa in urma scanarii codurilor de pe produse.
Si in acest caz putem vorbi despre schema bloc :
Fig.43
avand codul sursa:
// Receptie.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Receptie.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CReceptie dialog
CReceptie::CReceptie(CWnd* pParent /*=NULL*/)
: CDialog(CReceptie::IDD, pParent)
{
//{{AFX_DATA_INIT(CReceptie)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CReceptie::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReceptie)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CReceptie, CDialog)
//{{AFX_MSG_MAP(CReceptie)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReceptie message handlers
Comparare baze de date
Utilizand aceasta fereastra avem posibilitatea compararii bazei existente cu ceea ce am receptionat de la terminalul portabil.
Observatie: aceasta aplicatie se afla in faza de proiect.
Fig.44
Despre proiect
Este o fereastra care odata ce este apelata ne ofera informatii cu privire la autor, titlul proiectului si data de executie.
Codul sursa este:
// Despre.cpp : implementation file//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Despre.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDespre dialog
CDespre::CDespre(CWnd* pParent /*=NULL*/)
: CDialog(CDespre::IDD, pParent)
{
//{{AFX_DATA_INIT(CDespre)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDespre::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDespre)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDespre, CDialog)
//{{AFX_MSG_MAP(CDespre)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDespre message handlers
BEGIN_EVENTSINK_MAP(CDespre, CDialog)
//{{AFX_EVENTSINK_MAP(CDespre)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
Ultimele doua butoane sunt oferite de casuta de dialog in mod automat, ele reprezentand optiunile: OK si Cancel.
7.REZULTATE EXPERIMENTALE SI OBSERVATII
Informatia obtinuta prin scanarea codului de bare cu ajtorul terminalului portabil PDT 3100, va fi transmisa sub forma de fisier text la porturile seriale COM1 sau COM2 ale PC-ului, prin intermediul unui numit dispozitiv cradler.
Fig.45
Interfata realizata in Visual C++ 6.0, utilizand caseta de dialog MFC, va contine un Meniu Principal cu urmatoarele optiuni:
Fig.46
Fiecare optiune la randul ei, va permite utilizatorului sa selecteze calea dorita pentru a obtine cat mai usor rezultate.
Actualizare Baza de date – permite utilizatorului sa navigheze pe baza de date creata; cu alte
cuvinte vom putea modifica, adauga, si cauta produse in baza de date existenta :
– cu alte cuvinte vom putea modifica, adauga, si cauta produse in baza de date existenta :
fig.47
Generare lista inventar – permite utilizatorului sa urmareasca in baza de
date, care dintre produse are cea mai mica si cea
cantitate mai mare, sau cel mai mic si cel mai mare
prêt :
fig.47
Generare Fisier Terminal – prin apelarea lui vom putea trimite fisiere text de
la PC la terminal ;
odata apelat, vom fi intrebati daca suntem
pregatiti pentru a efectua aceasta operatie:
Fig.48
Receptie Fisier Terminal – cu ajutorul lui vom putea receptiona de la
terminal informatia culeasa in urma citirii
codurilor ;
si in acest caz vom avea optiunea :
fig.49
Comparare baze de date – va permite efectuarea rapida de gestiuni,care vor pune in lumina liste cu produse ce apar cu plus sau cu minus, in functie de tipul de inventariere dorit.
Despre proiect – este o optiune care ofera informatiile : titlul proiectului, data executiei,autor.
Observatia cea mai importanta ce se impune a fi amintita este aceea ca, optiunile Generare, Receptie Fisier Terminal, Comparare baze de date se afla in curs de derulare, aplicatia in sine urmand a fi prezentata intr-un viitor proiect, la care inca mai lucrez.
Suportul oferit de Visual C++ pentru baze de date cu ajutorul MFC, utilizeaza concepte abstracte, care simplifica lucrul cu bazele de date, la care se mai adauga viteza, puterea si flexibilitatea aplicatiei.
8. Concluzii
Codurile de bare trebuiesc traduse în clar pentru ca omul sa le poata descifra si întelege, dar au marele avantaj al redundantei verticale (se pot “citi” la orice nivel, inaltimea barelor nefiind semnificativa) si al controlului caracter cu caracter.
Celelalte mijloace de prelucrare au avantajele lor si-si pastreaza locul. Înregistrarea magnetica se face cu o mare densitate, ea poate fi stearsa si apoi rescrisa. Aceasta metoda este ideala pentru tichetul de metrou, dar in acest mod informatia nu poate fi citita de la distanta sau reprodusa cu cheltuiala minima. Cititoarele optice de caractere sunt lipsite de suplete, sunt mai delicate si mai putin fiabile, informatia neputand fi citita de la distanta.
Erorile prin substituire, de departe cele mai grave, când un caracter eronat este inregistrat in calculator, sunt de multe sute de ori mai frecvente la cititoarele optice de caractere decât în cazul citirii codurilor de bare.
In definitiv, cea mai buna dovada a avantajelor excelente ale codurilor de bare este succesul lor evident. Sunt vazute peste tot, ceea ce nu este deloc intamplator, deoarece ele servesc si fac servicii remarcabile.
Anexe
// ADBDModDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "ADBDModDlg.h"
#include "receptie.h"
#include "Generare.h"
#include "inventar.h"
#include "despre.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CADBDModDlg dialog
CADBDModDlg::CADBDModDlg(CWnd* pParent /*=NULL*/)
: CDialog(CADBDModDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CADBDModDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CADBDModDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CADBDModDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CADBDModDlg, CDialog)
//{{AFX_MSG_MAP(CADBDModDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN_DIALOG, OnOpenDialog)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADBDModDlg message handlers
BOOL CADBDModDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CADBDModDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() – cxIcon + 1) / 2;
int y = (rect.Height() – cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CADBDModDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
#include "RsCgDlg.h"
void CADBDModDlg::OnOpenDialog()
{
CRsCgDlg dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton3()
{
// TODO: Add your control notification handler code here
CReceptie dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton2()
{
CGenerare dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton1()
{
CInventar dlg;
dlg.DoModal();
}
void CADBDModDlg::OnButton5()
{
CDespre dlg;
dlg.DoModal();
}
// Inventar.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Inventar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInventar dialog
CInventar::CInventar(CWnd* pParent /*=NULL*/)
: CDialog(CInventar::IDD, pParent)
{
//{{AFX_DATA_INIT(CInventar)
m_sEdit2 = _T("");
m_sEdit3 = _T("");
m_sEdit4 = _T("");
m_sEdit5 = _T("");
//}}AFX_DATA_INIT
}
void CInventar::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInventar)
DDX_Text(pDX, IDC_EDIT2, m_sEdit2);
DDX_Text(pDX, IDC_EDIT3, m_sEdit3);
DDX_Text(pDX, IDC_EDIT4, m_sEdit4);
DDX_Text(pDX, IDC_EDIT5, m_sEdit5);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInventar, CDialog)
//{{AFX_MSG_MAP(CInventar)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInventar message handlers
BOOL CInventar::OnInitDialog()
{
CDialog::OnInitDialog();
m_sEdit2="Tigari MONTE-CARLO";
m_sEdit3="Tigari DERBY";
m_sEdit4="Tigari L&M";
m_sEdit5="Tigari Carpati";
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// Generare.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Generare.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGenerare dialog
CGenerare::CGenerare(CWnd* pParent /*=NULL*/)
: CDialog(CGenerare::IDD, pParent)
{
//{{AFX_DATA_INIT(CGenerare)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CGenerare::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGenerare)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGenerare, CDialog)
//{{AFX_MSG_MAP(CGenerare)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGenerare message handlers
// Receptie.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Receptie.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CReceptie dialog
CReceptie::CReceptie(CWnd* pParent /*=NULL*/)
: CDialog(CReceptie::IDD, pParent)
{
//{{AFX_DATA_INIT(CReceptie)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CReceptie::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReceptie)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CReceptie, CDialog)
//{{AFX_MSG_MAP(CReceptie)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReceptie message handlers
// Despre.cpp : implementation file
//
#include "stdafx.h"
#include "ADBDMod.h"
#include "Despre.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDespre dialog
CDespre::CDespre(CWnd* pParent /*=NULL*/)
: CDialog(CDespre::IDD, pParent)
{
//{{AFX_DATA_INIT(CDespre)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDespre::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDespre)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDespre, CDialog)
//{{AFX_MSG_MAP(CDespre)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDespre message handlers
BEGIN_EVENTSINK_MAP(CDespre, CDialog)
//{{AFX_EVENTSINK_MAP(CDespre)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
BIBLIOGRAFIE
J. Bates, T. Tompkings – UTILIZARE VISUAL C++ 6.0 –Editura Teora, Bucuresti, 2000
M.Williams – BAZELE VISUL C++4 –Editura Teora, 1995
E.Koller, M.Rosculet – PROGRAMAREA APLICATIILOR WINDOWS cu MFC – Editura Teora, 1998
http://www.microsoft.com
L. Barnea – UBI (UNITED BARCODE INDUSTRY) – 1993
COM NICO SERV – DOCUMENTATIE UTILIZARE SISTEM ACHIZITIE DATE CU AJUTORUL CODURILOR DE BARE, 1997
http://www.symbol.com
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: Gestiune Si Achizitie de Date Utilizand Codurile de Bare (ID: 149097)
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.
