You are on page 1of 14
Lucrarea 8 — LINQ si Windows Presentation Foundation Resurse necesare '* Sistem de calcul dotat cu sistemul de operare Windows 10 sau Windows 7 in configuratia monitor, mouse, tastaturd; ‘* Mediu de dezvoltare Visual Studio 2019 sau Visual Studio 2017 ifistalat. Obieetive ‘* Exersarea metodelor instrumentului LINQ pentia, manipularea datelor; + Prezentarea actiunilor de bazi realizate ‘Gsupra datelor, respectiv: adaugare, editare, stergere; © Prezentarea instrumental pentiy construirea graficelor; ‘* Exemplificarea importantei_ jinstrumentului LINQ in construirea statisticilor. in cadrul acestui laborator se va cofitinua aplicatia dezvoltat’ in laboratorul numarul 7. Aplicatia 1. Se cere sa se implementeze urmatoarele actiuni: a. Sai se seteze apli€afin sa ruleze in modul fillsereen, iar coloanele trebuie sa aiba 0 repartitie ast! prima coloana va ocupa 95% din spaiul disponibil, iar cea de-a doua coloand festul de 5%; bf Sa $e adau8€ un buton care va deschide o noud fereastrd care va permite adiugarea unt HOW produs, Pentru implementare, se va adauga 0 noua linie in cele dowd figiere text (cel pentru numele produsului si cel pentru pretul produsului); ©. Sa'se adauge posibilitatea de editare a unui produs prin scrierea directa in celula care se doreste a fi modificati, Salvarea trebuie si se realizeze automat; 4. Sa se steargd un produs prin selectia randului care contine produsul, ia la click pe un buton se va realiza stergerea din cele doua fisiere; e. Si se adauge un buton care implementeazi resetarea obiectelor asociate filtratii datelor; £, Sa se adauge un buton care implementeaza comparatia graficd a pretului pentru produsele listate (presupunand cd s-a aplicat o listare filtrata); 2. Si se adauge un buton care calculeaza o serie de statistici: © Cate produse exist pentru fiecare brand identificat in lista de produse; © Cite produse exist pentru fiecare interval de pret: = 0— 1000 RON: 1000 ~ 2000 RON: 2000 — 3000 RON: Rezolvare a. Pentru implementarea primei cerinfe se vor parcurg@urmatoarele etape: - Se adauga in codul XAML, pentru fereastra principal (Wordow), proprietatea WindowState= "Maximized" astfel incit atunci candise initializeaza componentele grafice, fereastra principald si se redimensionez@>in raport cu. rezolutia dispozitivului de redare (monitor); - Pentru redimensionarea coloanelor, in fitnctie” de populare a obiectului dataGridFilter, dupa adaugarea datelor in obiect) se va seta Lifimea fiecdrei coloane, unde DataGridLengthUnitType.Star reprézint& litimea disponibila pentru dimensionarea elementelor: dataGridFilter.ItemsSource = produse; - DUPA ACEASTA LINIE SE ADAUGA dataGridFilter.Columns{0].Width = feW/DataGridLength(0.95, DataGridLengthUnitType.Star); ‘dataGridFilter.Columns[1].Width = new DataGridLength(0.05, DataGridLengthUnitType.star); b. Pentru implementhrea cerintei de addugare produs se vor parcurge urmatgarele etipe: clasa Prodi se ya adiuga o metod numiti adaugaProdus() care primeste doi paramefrii de tip String: numele produsului si pretul acestuia, Metoda concatenieazivla finalul celor dou fisiere nume_produse.trt si pret_20_10.txt cei oj paramettii public voidiadaugaProdus(string denumire, string pret) { Fille. AppendAltText(@ ‘+denumire); File. Appendaltrext(@ pret); ) facultate\idp\laborator\laborator_3\test\nume_produse.te", facultate\idp\laborator\laborator_3\test\pret_20_10.txt", "\n - Seadaugi in proicet o nou fereastra realizand click dreapta pe numele proiectului in Solution Explorer > Add > New Item > Window (WPF) > Name. Adauga_produs.xam! (conform figutii 8.1); “— Bw 0D Noeenineanenon = EF wan coe Ss vo ume = ae Bom woe oe = Bsns i wee FE teetce a SI =a a cee BD sores a Dh woes a B sotensi ce 2D) sxemrcrmmane ve Fig, 8.1, Adiugarea in proiect tinei ferestre pentru adaugarea unui produs. - Se adaugi obiectele grafieepe forma de lucru, respectiv: © dow textBox-uri pentrippreluarea numelui si pretului produsului, numite numeProdusT¥ si pretProdusTxt, © douti label-tri care specifica ce se introduce in cele dou textBox-uri; (© un but6n care permite adaugarea produsului. Figura 8.2 predintd fiterfata grafica a ferestrei de addugare a produsului. Obiectele grafice Wor fi sétate conform exemplului din figura 8.2. aeons 2 Ss] Fig. 8.2. Interfafa grafica a ferestrei de adaugare a yng prods, La click pe butonul Salveaza, se va realiza © initializarea instantei produsului; © apelarea metodei adaugaProdus() cw-eei doi parametrii preluati din cele doui textBox-ur © afigarea unei mesaj de suéces pentritinformarea utilizatorului eu privire la adiugarea produsului; © inchiderea ferestrei pentrujreyenirea la fereastra principal. private void Button_Click(object send, RoutedEventArgs e) 4 Produs p = new Produs(}? p.adaugaProdus(numeProdisTxt.Text, pretProdusTxt.Text); MessageBox Show("Produs adaugat cu succes!"); this.Close(); - in fereagtra principal, se adauga un controler de tip Buton al cirui proprietate Content Wa.fvsetatd cu “Adauga produs”. La click pe acest buton se va Tansa in execufie fereastra secundari creat anterior. Dupa inchiderea ferestrei secundare, Sontinutului obiectului dataGridFilter trebuie actualizat, deoarece in listare trebuie sd §€ regiseasci si noua valoare adugati. Pentru aceasti, se vor executa instructiunile: © Se declari obiectul ap al clasei Adauga_produs(); © Pentru obiectul ap se va seta evenimentul de inchidere (Close) pentru care se va executa metoda actualizareDate, Metoda este apelat’ fri paranteze, deoarece reprezinta un eveniment care in mod normal ar fi trebuit sa se genereze din interfata grafica de care utilizator. Deoarece in aceast situatie evenimentul se genereaza la indeplinirea conditiei de inchidere a ferestrei secundare, evenimentul trebuie declarat explicit in cod, Metoda actualizareDate care implementeaza evenimentul apelea7d functia de populare cu date a obiectului dataGridPilter, © Se deschide fereastra secundara: private void adaugaBtn_click(object sender, RoutedEventArgs e) 4 ‘Adauga_produs a ap.Closed += actualizareDate apShow(); y public void actualizareDatetobject sender, EventArgs e) t populeazaGrid(); ) Figura 8.3a prezinta fereastra secundara care permite adaugarea ufti nou produs. in figura 8.3b se arata listarea produselor care s-a actualiZat automat la inchiderea ferestrei secundare. renee IBPEM MM Sy SSspeph fio seg aca omens 1 a) b) Fig. 8.3, a) Fereastra de adaugare a unui produs; b) Interfata graficd pentru listarea produselor care se actualizeazi automat dupa adaugarea unui nou produs, c. Pentru implementarea editirii unui produs, trebuie remarcat faptul ct obiectul dataGridFilter este similar unui tabel, fiind format de celule dispuse pe randuri si coloane. Pentru modificarea confinutului unei celule se va utiliza metoda CellEditEnding a obiectului dataGridFilter care va executa urmitoarele instructiuni: - Se va identifica indexul coloanei pe care se afld celula in care s-a modificat continutul; - Se va identifica indexul randului pe care se afla celula in care s-a modificat continutul; - Se preia continutul celulei sub forma unui obiect de tip textBox pentru a putea prelua textul; Se instantiaza obiectul p de tip Produs; Se apeleaz metoda de editare, numita editeazaProdus care este definitigde tei parametri © Textul din celula; © Coloana pe care se afld celula: (© Randul pe care se afla celula private void dataGridFilter_CellEditEnding( object sender, DataG?ldCellEitEndingEventArgs e) A ‘coloana = e.Column.Displayindex; rand = eRow.Getindex(); TextBox t= e-EditingElement as TextB6x; Produs p= new Produs(}; p.editeazaProdus(t.Text, coloana, rand); ) = inclasa Produs se va adiuga metoda editeazaProdus() © Daca valoarea cofoatie) este zero, atunci inseamna ci modificarea realizat de utilizator corespunde coloanei denumirii produsului: ‘Se eXtrage|continutul fisierului cu denumirile de produse sub forma uuiui Veetor de string-wr + “Valéirea de pe pozitia rind se modificd cu valoarea introdusi de utilizator in celuli; + Se rescrie figierul produselor; fo DaGi’Valoarea coloanei este 1, atunci inseamni c& modificarea realizata de ‘utilizator corespunde coloanei denumii prefului Se extrage conginutul figierului cu preturile de produse sub forma unui vector de string-uri; + Valoarea de pe pozitia rand se mod utilizator in celuli, * Se resctie fisierul preturilor J cu valoarea introdusa de Public void editeazaProdus(string valoare, int coloana, int rand) 4 ) if (coloana { stringl] produse = . ReadAlltines{@"E:\facultate\idp\aborator\laborator_3\test\nume_produse.txt"); produsefrand] = valoare; File.WriteAlltines{@"E:\facultate\idp\Iaborator\laborator_3\test\nume_produse.txt", produse}; y else if (coloana == 1) { string] preturi = File.ReadAlllines(@"E:\facultate\idp\|aborator\laborator_3\test\pret_20_10.0 preturifrand File,WriteAllLines(@"E:\facultate\idp\laborator\laborator_3\¢est\pret)20_10.txt", preturi); y ) Figura 8.4a prezinté modalitatea de moditicare a unei Vafori pentru care ~ Utilizatorul realizeaza dublu click’pe' celuli, = Introduce nova valoare; ~ Realizeazi click oriunde inafara celulei pentru salvarea modifiearii. in figura 8.4b se poate observa cai fisierul de produse a fost modificat conform interfetei grafice. avid ‘Tinme poaeeort Sptop WP TEs-rqozIng co proc 6. anton Gaming EP Pays Tien lice ‘lapp oP oreprg co pomaor Reo a) b) Fig. 8.4, a) Editarea denumirii unui produs; b) Salvarea valorii editate in figierul nume_produse.txt Aceasté modalitate de lucru cu datelor este utila in situatiile in care datele necesiti o modificare simpla, fara a mai irosi timp cu deschiderea unei noi ferestre. De asemenea, datele modificate in acest mod nu reprezinti date cu o insernnatate majora, a c4ror alterare s§ produca efecte majore in semnificatia aplicatici. De exemplu, modificarea notei unui student nu ar trebui si se poati r liza niciodata intr-o astfel de manieri. intr-o astfel de situatie, se va utiliza o fereastrd separata pentru a responsabiliza wilizatorul cu privire la modificarea pe care o realizeaz, dupa cum s-a procedat in cazul adaugaii unui produs. 4. Pentru implementarea stergerii, se va selecta printr-un singur click randul care se doreste a fi sters si se actiona butomul de stergere. Pentru aceasta, in interfata graficd se va adauga un obiect, al cérui click va executa urmatoarele instructitni: Se va prefua indexul randului selectat; Daca indexul are o valoare valida si mai mare sau egala ea zero, atiinely © Se instantiaza obiectul p de tip Produs; © Se apeleaz metoda de stergere numita stergeProdus dintelasa)Produs. Aceasti metoda va primi ca parametru index-ul radtilui cafe trebuie sters; © Se apeleazi metoda de actualiza a datelor in obieetul data GridFilter. Daca indexul nu are o valoare valida, atunci se va afiga mesajul "Nu a fost selectat niciun rand!" pentru a instiinta utilizatorul cu privire la tnotivul imposibilitatii de stergere a randului. private void stergeBtn_Click(object sender, RoutedEventArgs ¢} 4 int index = dataGridFilter-Selectedindex; if index >= 0) Produs p = new Produs| pastergeProdus(index); populeazaGrial) MessageBox Show("Nu a fost selectat niciun rand" Se/adaugi metoda stergeProdus a clasei Produs care primeste ea parametru ‘indexul rindului care se va sterge; Se €xtrag din cele doud fisiere vectorii denumirilor de produse si preturilor; Se aplica pentru cei doi vectorii metoda Where care pistreaza in vector toate clementele care au indexul diferit de cel primit ca parametru prin referinta de metoda. in acest fel, stergerea se va implementa fri necesitatea parcurgerii acestora prin intermediu! unei structuri repetitive, ceea ce permite o executia mai rapida si o scriere mult mai compactati si mai usor de citit a codului; Se rescriu cele doua fisiere cu noii vector. public void stergeProdusfint index) { string{] produse = File-ReadallLines{ @"E:\facultate\idp\|aborator\laborator_3\test\nume_produse.txt" string{] preturi = ile ReadAlllines(@"E:\facultate\idp\laborator\laborator_3\test\pret_20_10.txt"); produse = produse. Where{(val, pos) => pos != index).ToArray(); preturi = preturi Where((val, pos) => pos != index).ToArray(); File. WriteAllLines(@"E:\facultate\idp\laborator\laborator_3\test\nume_produse.tit", produse}; File WriteAllLines(@"E:\facultate\idp\laborator\laborator_3\test\pret_20 10.tt", pretur); ) in figura 8.4 este prezentat un exemplu de selectie pentru stetgere a tinni produs la actionarea butonului Sterge produs. Fig. 8.4. Exemplu de selectie pentru produst’care se va sterge; e. Pentru resetarea biéstelor se adaugi un buton cu continutul Reseteaza filtre a cdruivactiune ya executa urmatoarele instructiuni = Seteazi indexul obiectulai comboBox numit criteriuFiltrare cu valoarea zero; = Sterge contingiful obi8etului textBox numit expresieFiltrare; ~ Seteazi valoaréa primului slider numit pretFiltrare/ cu valoarea minima; - Seteaziialoatea'Gelui de-al doilea slider numit pretFiltrare? cu valoarea maxim; -_ Repopuileaza obiectul daaGridPilter cu toate produsele, prin apelarea metodei populeazaGrid). private void reset 4 tn_Click(object sender, RoutedEventArgs ¢) criteriuFiltrare Selectedindex expresiefiltrare.Clear( pretfiltrared. Value = pretfiltrare1. Minimum; pretfiltrare?. Value = pretfiltrare2. Maximum; populeazaGrid(); f. Un textBox in care utilizatorul va insera expresia de filtrare. Proprietatea Text a acestui controler va fi setati cu string alb, Numele obiectului va fi expresieFiltrare: g. Un buton care determina filtrarea datelor si pentru care se va seta proprietatea Content cu valoarea Filtreaza, iar numele va fi tot filtreaza 2, Se identifica in cod initializarea componentelor (linia Initialize Component()). Dupii aceasti linie se va realiza popularea comboBox-ului si se va selecta valoarea predefinita prin care utilizatorul trebuie indrumat sa aleaga una dintre opfidini: Initialzecomponent(); Se adaug’ dup’ aceastlinie criteriuFltrare Selectedindex = 0; criteriuFiltrare.Items.Add{"Incepe cu criteriuFltrare.Items.Add{"Contine"); 3. Se genereazi evenimentul de click pe buton, iar in é&drul metodei se va verifica daca exista selectie pentru criteriul de filtrare, private void filtreaza_Click{object sender, RoutedEventarge) 4 if ((criteriuFitrare.Selectedindex > 0) 82 (expresi@fitfare.Text |=") { populeazaGrid{expresiefiltrare.Text, citeriuFiltrare.SelectedValue.ToString!)}; y y Figura 7.4a prezinta un ecran de Iuertcu executia aplicatiei fara aplicarea de filtre, in timp ce figura 7.4b prezinta executia aplicatiei dupa filtrarea produselor care sunt dotate procesoare i5. Ti nsrow Ee Se Sw orice a Slecesa vate rune 41 app 1Sefevng ca prem nel Cre SSC7, 154 fal DTS, 1200 5S, as Xp eee O08 Ratu Siver_ ~ “Fe Lapp canirg i Sen c0 Ting cupremorie Cow G/N ha Ho. e0H Set Tn Glove Ge SIGE “Lapp Garg > Pon 1051 rce el Coe 5-000 161,668, 2658 SSD ~ TE HDD, Wi Gere GK 16ST 5i- Lapin Goring ONEN Teng specs nel ere 7-150 155 Fut Hah (6G ST2GE SSD, ND GFeree X36 SL Lapop HP Ey 1b OO el Cote 71169 ps TGR 1 fu HO TEC, SD AGH ls Ye robs Tr Fenenee (BE taptp HP Fanon gig eu reer Cone TTT, Ful HO, 9, 126859, el is XGrpes, re, fog Be Lapp uiaporabine 2 Geau pce AO yan SG 4 ul HD Sok aca So AMD Taaeon Gaps Windows To Heme 5. Lapp HE 25 Tes eesti Coe OSGI pars S.A Gaz 155 Ful HESS, 258 SSO Nii Gore MRTIO 2B, ee 005, 56 Lapinp HP 250 Gey proeer nt Cae 2105S, “5 Fal AGB 256GE SD, UMD Gabi Fee DOS Assos SLi Gaming pier 1-2325ng ey presse lov. 130H 73 fH) a Oc S55 SOD «11860, NUDGE 5 Laptop HP 250 Tes proeer re Coei- 1051p n30 Gis 156 Ful HD 3, 25658 S50, el UNO Grp Fee DOS Dare ‘Sr Laptpuraponsba i Pston aetog Wo ha so Teer cae Ves” pana 40H FoF Soe TCE SS a) vio FEDS Shoe = ramon 2 stp Gang HF av sine coe Cone 00 15 Fa 40 8 S258 SD cs Gof 55458 Fe 05 = 5. Lstp Goro H Tov 1 cbr poor or HTH 63, FIMO, GG, 2963 S0, Noi Gefore TE ISSO AG re TO pip HP 180203 goer Cre 1137, 1 Fu HO. 8H 51258550, ez Wor TO ore Natal he app HP 20 Ec ocr le Core EIST, Ra HO OG TUG SD NVI Geforce ND 28, ee 005 Sher 1p npg ees Ce TSS pana 4708, 196 FALAD AR, ST SST Wd TC Hosa 55 pp Gaming Porn san res nel oe 100163, Ta 1,0, SEG) 5, AIA Geter DUIS 7B app apart wc procesr we Care 6-105, 14 Fa WO, 296055, ris Und Gop Fee OCS, Dae "i Laplop HP 250 Gs roel ae 1501 para 350 16 FH, OR, 26085, UMD Gps Fes DOS A SLi HP 1.027 eer tl Cone 11357156, Fal, 2582958 Sle Xe Win 10 ot “2 aun 0 he ps el Core SET pana GR a, TR. ATRSCD, Wi A AR rei kr “Lapp Goring IF Perle 16005ng oa pecerr il Cre ONL 16, 00 25SGDESD~ TT IDD Wid fee TK 1E0T 3 ale Garg He Foner T-zng cpr Ie Core S108 73 Ful, et 2G SD + TBS, TDI Grr Epi HP 25 7c ocr el Core ICIS pars 2 32D, 5 Ful HD 0, EGE SD el HO Grapes Fe OS, Dar b) Fig. 7.4. Captura de ecran cu executia aplicatiei: a) Afigarea datelor la incrcarea aplicatiei; b) Afigarea filtrata a datelor. Aplicatia 2. Se cere sa se modifice aplicatia anterioard astfel incat si permita filtrarea produselor in fuunctie de pret. Aplicatia trebuie si permit selectia unui interval de pret Pentru implementarea cerintei se vor utiliza doua obiecte grafice de tip Slider. La incdrcarea aplicatiei, valorile minime si maxime ale obiectelor Slider vor fi setate cu valoatea celui mai ieftin produs din lista produselor, respectiv cel mai scump produs. Modificarea valorii unui Slider se realizeaza la aparitia evenimentului ValueChanged(. Pentru implementare se vor parcurge urmatoarele etape: - Se adaugi obiectele grafice necesare in sectiunea de filtrare: © Se adauga cele doua obiecte grafice Slider, numite pretFiltraPel, si pretPiltrare2; © Se adaugi doud obiecte Label care afigeaza valoarea sellgctatdir Sliderul pretFiltrare!, respectiv pretFiltrare2 in cel de-al doilea Slider; = Se modifica in cod astfel: ©. Se declara variabila logica globala filtruPret gare valprimi valoarea true du initializarea celor doud Slidere cu valotile Maxime si minime. Initial, variabila este setat& cu valoarea false, bool fitruPret = false; ©. In functia populeazéGrid(), dupa extragerea listei de produse, se vor seta valorile maxime si minime ale_Sliderelor ce preful minim si maxim de produs. Pentru cel de-al doif€a slider, valoarea curenti va fi setatd ca fiind valoarea maxim Aweste setiri sunt necesare o singurd dati, 1a initializarea componentelor. Totisijacest cod a trebuit plasat in aceastdi metoda deoarece aici s-a realigat extragerea produselor, deci aici s-au putut identifica preturile minime_si maximhe. De asemenea, cele dowi Label-uri corespunzitoare afisarif_prefului minim si maxim selectat de utilizator pentru filtrare, vor fi setate\initial-cu preful minim si maxim. © Tot in functia populeazdGrid() se filtreazi produsele care indeplinese cOnditia ca pretul si fie cuprins intre valorile curent ale celor doul Slidere. Daca utilizatorul nu a modificat valorile de filtrare preturi, atunci se vor filtra folosind valorile minim si maxim, deci se vor pastra toate produsele in listae: public void populeazaGrid{string expresi { ", string eriteriu = "") 1/ Sterg inteegul continut al obiectului dataGrid dataGridfilter.ClearValue(ItemsControl. temsSourceProperty); 1/ Se instantiaza obiectul si se preia lista produselor Produs pObject = new Produs(); List produse = pObject.preiaLista()-ToList(); // Daca exista expresie de fltrare if (expresie f=") ( 1/ Se verifica daca este criteriul de incepere cu expres [fin ca2 contrar, criteriul este de existenta a expresiei in numele produsului i (eriteriu.€quale("Contine” produse = produse.Where(x => x.numeProdus.ToLower().Contains{expresie ToLower()))-Tolist(); else produse = produse.Where(x => XnumeProdus.ToLower() StartsWith(expresie.ToLower()).ToList() y if (fteuPre ‘ false) pretfltrare1. Minimum = produse.Select(c => ¢ pretProdu8).Min(); pretfiltrare1.Maximum = produse.Select(c => c.pretProdus}.Nax(); pretfiltrare2.Minimum = produse.Select(c => e;pretProdus).Min(); pretfiltrare2.Maximum = produse.Select(c => epretProdus).Max(); pretFitrare?. Value = pretFiltrare2. Maxim pretMax.Content = pretfiltrafe2.Value; pretMin.Content = pretfiltrarel.Value; filteuPret = true; y produse = produse, Where(y=23upretProdus >= Double.Parse(pretMin.Content.ToString()) 8& xprétProdus <=Double Parse(pretMax.Content.Tastring()).Tolist(); dataGriditer-ItemsSource 2 produse; © Se gener€azi metodele de modificare a valorii curent pentru cele dou Sfidefe, Aeéste metode vor implementa urmitoarele instruetiuni © Se identi a Sliderului; pozitia caracterului ",” in valoarea curen © Dac se identifica acest caracter, atunci se extrag caracterele din valoarea curent& pind la pozitia virgulei, astfel ineat si se afigeze doar partea intr © in caz contrat, se va afiga direct valoarea. private void pretFiltrare1_ValueChanged{object sender, RoutedPropertyChangedEventArgs e) { int potitieVirgula = pretfiltrarel. Value. ToString().IndexOf("," if (pozitievirgula > 0) pretMin.Content = pretfiltrare1.Value.ToString()-Substring(0, pozitieVirgula); else pretMlin.content = pretfiltrarel.Value.ToString(}; y private void pretFltrare2_ValueChanged{object sender, RoutedPropertyChangedEventArgs { irgula = pretfiltrare2.Value.ToString().IndexOr","); if (pozitievirgula > 0) pretMax Content = pretfiltrare2.Value.ToString() Substring(0, pozitiéVirgula); else pretMax.Content = pretfiltrare2.Value.ToString(); ) Figura 7.5 prezinta executia aplicatiei cu filtre pentru pret cuprinse intre valorile 2000 si 2500 RON si procesor i5, Hi MeinWindon |B WER eo Groce c) - ao x retoane sy 000g por Ce 30H 161, Fut, S, S168 SS, Ni eres GDC 16S0 AG, Fee OOS Shaw ee 210959 ae pao el Coe 13557, 155 FAN HO, 58, 5125S 50, IS Wa Wands 1 Howe NSLS [eres Fig, 7.5. Captira de €efan cu executia aplicatiei la adiugarea filtrului de pret in cadrul acestei Mcrffi, au fost exemplificate modalititile de listare a datelor, cu posibjlitate de filtrare a acestora, De asemenea, s-a pus in evident prin exemplificare Utilifatea instrumentelor Ling in procesarea datelor.

You might also like