Search  
Sunday, August 09, 2020 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Baze de date, tabele, view-uri si indecsi  report conditio...
 report conditionat?
 
 8/7/2011 8:44:32 PM
User is offlineslice3
22 posts


report conditionat?
 (N/A)
sa zicem ca am trei tabele intr-o baza de date: prima contine asa: "denumire: de tip character (50); "conditia1" tip logic; 'conditia2" tip logic; "conditia3" de tip logic  si fiecare conditia poate lua valoare "True(T)" o singura data pentru un articol,
al doilea tabel are doar 3 pozitii si 2 coloane si anume coloana de "conditii" tip char (10): cuprinzand ca si articole conditia1, conditia2 respectiv conditia3 si coloana "imagine" de tip blob, cu  imaginea atasata ca si blob, aici sunt cele trei stari posibile pentru conditiaX indeplinita.
al treilea tabel contine ca si primul: "denumirea" de tip char(50) (identica cu tabelul unu; dar daca e mai usor pentru identificare putem adauga si o coloana de indexare), dupa care alte coloane cu diferite detalii supplimentare de tip chararcter cu diferite lungimi.

intrebarea este: cum pot lega cele trei tabele ca in report sa pot chema astfel:
"denumirea", + alte cimpuri din tabela 3 si imaginea din tabelul doi corespunzatoare fiecarui articol astfel incat fiecare articol sa indeplineasca conditia de "True"

practic ce doresc? doresc sa evit sa introduc in baza de date imaginea de conditie de mai multe ori, vreau sa o introduc o singura data dupa care el sa mi-l afiseze pentru fiecare articol corespunzator.

ma puteti ajuta si cu asta? dar tot ca si pentru un incepator :)
multumesc

Szabolcs
 8/8/2011 7:50:12 AM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
Mai intai citeste articolul asta: http://www.profox.ro/Articole/Tehnicideproiectareabazelordedate/tabid/154/Default.aspx
Mai sunt si pe forum suficiente discutii despre proiectarea bazelor de date, astfel incat sa nu fie nevoie sa o luam de la capat.
Cauta cu butonul Search din stanga jos, si ai grija sa pui la from date ceva acoperitor, cum ar fi 1/1/2005

Apoi incearca sa-ti reproiectezi tabelele. Chiar ai nevoie de 3 tabele pentru acele informatii?

Nu trebuie sa existe tabela fara cheie primara, iar campul denumire nu este potrivit pentru asta.

Cele 3 campuri logice pot fi transformate intr-un singur camp numeric. Conditia1 este 2^0, conditia2 e 2^1, iar conditia3 e 2^2.
Poti obtine campul numeric prin expresia urmatoare:

conditie_numerica=1*cast(conditia1 as i) + 2*cast(conditia2 as i) + 4*cast(conditia3 as i)

Acesta e campul de care ai nevoie in tabela vu imagini, nu un camp caracter..
Poti renunta la campurile logice, iti trebuie doar un camp integer, si nu ai nevoie nici de tabela 2. Valorile le poti selecta dintr-un combobox populat cu datele din tabela cu imagini.
Ai vreun motiv anume pentru care ai facut o tabela separata cu denumire si cele 3 conditii? Iti faciliteaza ceva asta?

Pentru report, poti crea un cursor cu datele combinate si filtrate - cu SELECT SQL - si nu mai ai nevoie sa pui tabelele in relatie in report.


Daniel Buduru
 8/8/2011 1:25:11 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
vreau sa creez o baza de date despre ciuperci (ca si hobby) in care contrar a "n"-spe site-uri specializate unde poti cauta doar dupa denumirea ciuperci, sa pot cauta dupa caracteristicile ei.
de ex. despre trunchi: culoare, cu sau fara inel, cu sau fara bulb, textura  ...., toate conditiile alegandule apoi intr-un form cu combo box-uri.
am o colectie impresionanta de "fise tehnice" care le-as introduce intr-o baza de date. m-am gandit ca pentru fiecare astfel de criteriu un camp de genul logic m-ar fi ajutat in conditionarea tabelelor la report-uri, dar poate ma insel. deci sunt deschis oricarei propuneri de structurare; inca nu sunt constrans de nimic si o optimizare nu strica.

In tabelul pricipal as avea asa: 2 campuri character cu denumirea in latina resp denumirea populara, cateva campuri memo pentru descrierile efective a fiecarei parti a ciuperci, un camp blob pentru imagine. dupa care se poate adauga liber orice altceva e necesar

celelelta tabele m-am gandit ca fiecare sa contina una din crietrii: trunchi-culoare, trunchi-textura s.a.m.d. toate de tip logic, dar inteleg ca merge mult mai usor ca si tip numeric, asa nemaifiind limitat doar la 2 stari. si chiar a-ti recomanda folosirea unui aceluiasi tabel initial pentru declararea valorilor, (in cazul de mai sus, eliminind tabelul intermediar in care spun care de care este, banuiesc ca tot asa a-ti recomanda si pentru restul criteriilor de selectie. )

cele trei conditii de mai sus ar fi fost partea de comestibil, necomenstibil respectiv toxic, dar ca si model general cred ca e extensibil si la categoria culoare ...

tot asa initial m-am gandit ca poate e mai bine sa nu inghesui tot intr-un singur tabel, astfel totul sa fie mai aerisit,  usor de inteles (poate am gresit si doar complic lucrurile). sunt deschis oricaror propuneri. dar luati-ma cu incetisorul, ca pe un incepator.

Szabolcs
 8/8/2011 2:25:24 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
Deci n-ai citit articolul :)

Bun. Campurile care descriu caracteristicile pot ramane logice (sau numeric(1), checkbox-ul poate lucra si cu 0/1).
Dar, in tabela cu imagini, ai cate o imagine corespunzatoare unei combinatii de caracteristici. Combinatia asta se poate descrie numeric, asa cum am aratat deja.
Poti avea in tabela cu caracteristici, pe langa campurile logice, un camp care sa faca insumarea acestor caracteristici intr-un camp numeric, pe care apoi sa-l legi la tabela cu imagini. E mai indicat sa faci legatura intre tabele printr-un singur camp decat printr-o expresie.

Acum, revenind la structura bazei de date:
- o tabela de categorii (sau grupe, sau cum vrei sa le zici). Fircare categorie are anumite caracteristici, un nume al categoriei, o suma a caracteriticilor intr-un singur camp, care este un identificator al categoriei, si care poate fi cheie primara.
- o tabela de imagini, in care ai o identificatorul, categoriei, o imagine si un identificator unic al inregistrarii.
- o tabela de ciuperci, in care ai un identificator unic al inregistrarii, identificatorul categoriei din care face parte, si denumirea.

Poti avea mai multe ciuperci care au aceleasi caracteristici, deci fac parte din aceeasi categorie
Daca vrei sa diferentiezi atributele in cadrul categoriei, ai trei variante:
- liniara:  pornesti cu mai multe atribute (caracteristici) si faci mai multe categorii
- arborescenta: creezi subcategorii (in aceeasi tabela cu categoriile, se pune doar un camp suplimentar care indica din ce categorie deriva respectiva subcategorie), in care se completeaza atribute care raman necompletate la categoria de nivel superior
- nerecomandata: faci diferentiarea direct in tabela de ciuperci, adaugand acolo caracteristici.
Varianta arborescenta este cea mai scalabila, numarul de niveluri pe care se poate detalia o categorie fiind practic nelimitat. E insa ceva mai complicat de intretinut decat prima varianta.

Poti avea imagini pentru fiecare ciuperca, sau pentru categorie. Poti sa afisezi imaginea categoriei in cazul in care nu ai o imagine pentru ciuperca respectiva - desi asta poate duce la confuzii.

Daca faci aplicatia ca hobby, te-as sfatui sa treci baza de date pe un server sql express 2008 R2 - e free -, si sa faci interfata in vfp - daca ti-e la indemana.
Serverul sql 2008 are un sistem special pentru stocarea imaginilor, si permite si interogari mult mai complexe decat poti face in vfp.
Pe de alta parte, e mai usor sa inveti sa scrii o interogare foarte complexa in sql, decat in vfp, si e mult mai usor sa modifici si sa intretii baza de date.


Daniel Buduru
 8/8/2011 3:52:34 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
nu fac parte dintre programatori, nici macar nu fac parte dintre cei care au de-a face zilnic cu vre-un aspect a calculatoarelor (software, hardware)
sunt doar un simplu utilizator a calculatorului, poate putin mai indemanatic ca marea majoritate si ce cred ca e una dintre calitatile mele este ca ma deprind mult mai repede cu cate o aplicatie ca si colegii care sa zicem pornesc la "drum" in acelasi timp cu mine (stiu ca in acest caz deja intervine programarea, si nu doar folosirea unei aplicatii gata create, dar cred ca cu ceva ajutor din partea voastra pot rezolva si acest aspect a VFP-ului).

sql server... nu stiu de ce (poate ca nu il cunosc si de asta) dar ma duce la idea de "internet" "web design" ... si nu este ceea ce caut, la sfatul unui amic am ales VFP-ul tocmai in idea ca as putea crea aplicatia de sine statatoare tip *.exe care sa nu necesite absolut nimic. ii dai drumul si gata (nu cere web-broser, nu cere alte programe instalate ....)
sa inteleg ca am ales gresit si nu sunt pe drumul cel bun?

PS. am citit articolul cu toate ca nu mi-a creat o imagine mai buna asupra a ceea ce imi doresc eu. Lipsindu-mi bazele imi e greu sa gandesc altfel decat am facut-o pina acuma.


Szabolcs
 8/8/2011 4:17:18 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
Un server sql poate fi folosit si pentru internet, dar este si ramane o baza de date.
Tabelele dbf si dbc-ul sunt baza de date a vfp, dar vfp poate functiona cu orice baza de date care accepta o conexiune odbc sau ado.

Nu vei realiza o aplicate exe (doar un fisier, plus cele doua biblioteci runtime de care are nevoie pentru a functiona) decat in cazul in care inglobezi in el si baza de date, care devine read-only. Altfel, va trebui sa distribui si baza de date odata cu aplicatia - si asta ete valabil pentru orice limbaj de programare ai folosi.

Poti foarte bine sa o faci si cu baza de date nativa vfp. Baza de date se proiecteaza la fel, indiferent daca e dbf sau pe un server sql.

Ar trebui sa incepi prin a defini foarte bine ce vrei sa obtii din baza de date, si ce interogari vei face asupra ei. De aici va rezulta structura bazei de date, si nu invers.


Daniel Buduru
 8/8/2011 6:27:38 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
 Daniel Buduru wrote

Nu vei realiza o aplicate exe (doar un fisier, plus cele doua biblioteci runtime de care are nevoie pentru a functiona) decat in cazul in care inglobezi in el si baza de date, care devine read-only. Altfel, va trebui sa distribui si baza de date odata cu aplicatia - si asta ete valabil pentru orice limbaj de programare ai folosi.


pina aici este ok, deoarece aplicatia este pentru uz propriu si nu comercial; cel mult distributie pe la prieteni interesati, dar nimic mai mult. baza de date nu este secret, iar chiar daac ar fi read-only nu o bvad ca pe un defect, deoarece daca a trecut prin mana mea, pot oricand sau adaug noi inregistrari si sai zic varianta 1.x si sa-l impachetez iarasi.

 Daniel Buduru wrote

Poti foarte bine sa o faci si cu baza de date nativa vfp. Baza de date se proiecteaza la fel, indiferent daca e dbf sau pe un server sql.

Ar trebui sa incepi prin a defini foarte bine ce vrei sa obtii din baza de date, si ce interogari vei face asupra ei. De aici va rezulta structura bazei de date, si nu invers.


chiar daca o expun mai neindemanatec, stiu foarte bine ceea ce doresc sa obtin.
poate ca este un proiect putin prea ambitios pentru mine, dar nu am de gand sa ma las pagubas si cred in ambitia (prostia) mea ca pina la urma voi reusi.

daca doriti (tu sau si altii) sa ma ajutati, am sa incerc sa fac o expunere cat mai buna asupar a ceea ce doresc si cum a vad ca sa va faceti o idee: aplicatia trebuie sa stie sa imi execute doar o singura comanda principala si anume,: search-ul din imagine. (optional pot sa ii mai cer ordonarea bazei de date alfabetic sau mai stiu eu ce alte subcautari dar nimic care sa implice altceva decat tabela principala cu denumirile.)(cautare dupa nume daca stiu ce ciuperca caut)
http://i56.tinypic.com/2lxf7k1.png cam asa vad eu forma de cautare (ma rog foarte simplificata aici, criteriile vor fi mult mai multe si cu referire la fiecare parte a ciuperci. pentru ca cautarea sa fie declarata cu succes. toate conditiile alese din acel form trebuie sa se indeplineasca simultan. unele campuri cum sunt ultimele 2 au doar 2 stari, dar primele 2 pot lua mult mai multe stari.

search-ul imi aduce in fata reportul cu solutiile gasite , iar ca si modelul 2 din linkul urmator http://msdn.microsoft.com/en-us/library/ms947688.aspx mi-as dori ca rezultatele afisate doar cu denumirea sa fie sub format hyperlink, ca in momentul in care apelez oricare din ele, sa imi deschida DOAR fisa ciuperci aferente.

pe aceasta fisa se vor regasi informatiile generale, precum o poza a ciupercii si o a DOUA poza  cu comestibilitatea ei (poza care nu vreau sa o incarc pentru fiecare ciuperca in parte ci doar sa il apelez dintr-un sa zicem tabel secundar), de fapt subiectil acestui topic care pina la urma a divagat.

este VFP alegerea cea mai buna pentru ceea ce doresc? ma puteti ajuta sa il construiesc?


Szabolcs
 8/8/2011 9:59:51 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
VFP e o solutie corespunzatoare, si te putem ajuta sa o construiesti.

O sa abstractizam un pic subiectul: avem o baza de date cu articole, care au anumite caracteristici (atribute, proprietati). Vrei sa cauti dupa caracteristici.
Trebuie sa definesti mai intai toate caracteristicile pe care vrei sa le urmaresti. De exemplu, culoarea este o caracteristica. Ea poate avea un numar nelimitat de valori. Forma este o alta caracteristica,; si ea, la randul ei, poate avea un numar nelimitat de valori.
Comestibila / necomestibila insa nu sunt caracteristici distincte, ci valori ale aceleiasi caracteristici. Toxicitatea poate fi o alta caracteristica - o ciuperca poate fi necomestibila, fara insa a fi toxica,  dar nu poate fi comestibila si toxica ....Poate fi o singura caracteristica, cu valorile comestibil, necomestibil, toxic.
Dupa ce ai stabilit caracteristicile, trebuie sa le pui valorile intr-o tabela.
Poti avea cate o tabela pentru fiecare caracteristica, sau poti avea o tabela comuna, in care ai un camp pentru identificarea caracteristicii, un altul pentru identificarea atributului si unul pentru valoarea atributului.
De exemplu:
idcaracteristica=1 &&culoare
idvaloare=1
valoare='alb'
idcaracteristica=1 &&culoare
idvaloare=2
valoare='cafeniu'
idcaracteristica=2 &&textura
idvaloare=1
valoare='neteda'

Pentru a popula combobox-ul culoare:
Select valoare, caracteristica from caracteristici where idcaracteristica =1 order by valoare into cursor crscombo1
La fel pentru celelalte.
Varianta asta este mai scalabila, poti oricand sa adaugi noi caracteristici fara a fi nevoie sa adaugi pentru fiecare o alta tabela.

Acum se pune problema filtrarii tabelei.
Conditia de filtrare poate fi restrictiva sau laxa. Asta pentru raspunsul "nu stiu". Nu stiu ce culoare avea. Nu tin minte daca avea inel ...
Deci, in fiecare combo, trebuie sa adaugi si o astfel de valoare.
Asta se face simplu:
Select valoare, caracteristica from caracteristici where idcaracteristica =1 ;
Union;
Select '- Indiferent', null from caracteristici ;
order by valoare into cursor crscombo1

Acum, la construirea filtrului, trebuie sa incluzi toate valorile caracteristicii pentru care s-a selectat valoarea null in combo.
Se poate face un select sql parametrizat sau unul dinamic.
pcIdCuloare=TRIM(NVL(thisform.combo1.value,''))+'%'
pcIdTextura=TRIM(NVL(thisform.combo2.value,''))+'%'
pcIdInel=NVL(thisform.combo3.value,'')+'%'
pcSql='Select a.*, b.image from articole a left join imagini b on a.idcomestibil=b.idimagine  where  tran(a.idculoare) like ?pcIdCuloare AND tran(a.idtextura) like ?pcIdtextura and tran(a.idInel) like ?pcIdInel into cursor crsselect'

Acest cursor poate fi afisat intr-un grid sau int-un list, chiar in formul in care faci interogarea, si poate fi sursa pentru report.

Tot in formul de cautare poti avea poza cipuercii si poza cu comestibilitatea, precum si restul informatiilor, care se vor completa automat cu date corespunzatoare ciupercii selectate in grid sau lista, si se schimba automat cand te deplasezi de pe o inregistrare pe alta.
E un exemplu foarte pe scurt, dar, in mare, cam asta e aplicatia.



Daniel Buduru
 8/8/2011 10:26:24 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
Daca vrei sa pui poze pentru fiecare ciuperca, baza de date se va mari destul de mult. O vreme nu va fi un impediment, totusi ...
Poti pune toate pozele intr-un subfolder al aplicatiei, iar in baza de date sa tii doar numele pozei.
Vei pune folderul respectiv in calea de acces vfp (comanda Set path ), iar aplicatia va gasi poza pe disc, in loc sa o ia din baza de date.

Daca vrei totusi sa tii pozele in baza de date, scaleaza pozele la o dimensiune rezonabila sa zicem 1200x800, sau ce crezi tu ca e ok.
Totul e ca dimensiunea fisierului fpt sa ramana <2GB, e maximum ce poate adresa vfp pe 32 de biti.

Daniel Buduru
 8/9/2011 12:26:57 AM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
deocamdata o sa ignor primul reply deoarece inteleg ca practic acolo este tot ajutorul cu care trebuie sa incep, si voi raspunde celui de al doilea urmand ca zilele ce urmeaza sa disec/disecam ceea ce mi-ai scris in cateva randuri.

vreau ca pozele sa fie in baza de date tocmai pentru a nu trebui pastrate ca si fisiere individuale, ceea ce la un moment dat din neatentie sau ... poate sa imi creeze probleme;
sub format blob sunt perfecte, nu se pierd ... ramane doar pericolul ca la o suprascriere sa nu il stearga ci doar sa adauge noua poza astfel marindu-se baza de date inutil. dar mai bine imi asum acest risc.
pe de alta parte pozele nu vreau sa fie nici pe departe de ordinu 1200x800, nu vreau nici macar jumatate din aceste valori, vreau sa fie decente si bine vizibile, dar pina la urma nu ele sunt esenta, ele fiind doar o confirmare a bunei recunoasteri.
am citit despre aceasta limitare de 2Gb, dar nu vreau sa ajung atat de departe.

momentan am fost inceput sa pregatesc tabelele dupa cum am fost amintit, ca fiind variabile logice, cate un tabel pentru fiecare caracteristica, dar cred ca renunt la aceasta idee si merg pe varianta oferita de catre tine si anume un singur tabel cu variabile tip integer.
o sa postez imaginea cu tabelul final de la care voi proni si de acolo incolo sper doar sa pot tine pasul cu sfaturile voastre.

Szabolcs
 8/9/2011 4:22:23 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
ha sa vedem daca am inteles bine cosntruirea tabelelor pentru cazul meu:
http://i54.tinypic.com/11cdyl1.png
am tabelul principal cu id (index) denumiri (char)descrieri (memo), poze (blob) respectiv variabile (integer)(vor lua valori de genu "1", "2", "3"...)
si tabelul secundar in care am: id (index), variabile (aceasi denumire ca camp cu tabelul initial ) (integer) respectiv valorile acestor variabile (char) (de genul: culoarea: 'alb','galben' ...)

pina aici e bine?

Szabolcs
 8/9/2011 5:45:24 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
Binisor. Inceputul e bun, mai trebuie lucrat la structurare.
Din pacate, sun foarte prins in acest moment. Abia pe seara sper sa-mi fac ceva timp.
Pana atunci, completeaza cateva integistrari in ambele tabele, ca sa avem o oarecare idee despre informatiile pe care le pui acolo.
Mai trebuie o tabela de caracteristici:
idatribut, atributname
si o alta tabela cu valorile atributelor
idatribut, idatributvalue,atributvalue
Cum se vor completa:

idatribut=1, atributname='hatsurface'
idatribut=2, atributname='hatshape'

idatribut=1, idatributvalue=1, atributvalue='neted'
idatribut=1, idatributvalue=2, atributvalue='reticulat'
idatribut=2, idatributvalue=1, atributvalue='plata'
idatribut=2, idatributvalue=2, atributvalue='bombata'

Ideea este ca toate caracteristicile sa fie tratate intr-un mod unitar, indiferent cum se numesc si ce semnificatie au.
O situatie speciala are culoarea. E un atribut care apare si la palarie, si la tulpina. O sa vedem cum se face pentru a nu repeta valorile unui atribut.
De fapt, avem partile componente ale ciupercii, parti care au atribute comune: culoare, forma, textura.

Am sa explic mai in detaliu cum se leaga cele doua tabele, acum insa trebuie sa inchei.


Daniel Buduru
 8/9/2011 7:41:48 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
 Daniel Buduru wrote

Pana atunci, completeaza cateva integistrari in ambele tabele, ca sa avem o oarecare idee despre informatiile pe care le pui acolo.


ca sa nu cosntruiesc inca odata tabelele pe care am uitat sa le iau cu mine, o sa introduc ceva date cu care sa avem si exemplificari abia miine dimineata.

 Daniel Buduru wrote

Mai trebuie o tabela de caracteristici:
idatribut, atributname
si o alta tabela cu valorile atributelor
idatribut, idatributvalue,atributvalue
Cum se vor completa:

idatribut=1, atributname='hatsurface'
idatribut=2, atributname='hatshape'

idatribut=1, idatributvalue=1, atributvalue='neted'
idatribut=1, idatributvalue=2, atributvalue='reticulat'
idatribut=2, idatributvalue=1, atributvalue='plata'
idatribut=2, idatributvalue=2, atributvalue='bombata'

Ideea este ca toate caracteristicile sa fie tratate intr-un mod unitar, indiferent cum se numesc si ce semnificatie au.


cred ca n-am inteles bine ceva;      http://i54.tinypic.com/11cdyl1.png
in mushroomdata.dbf  coloanele de variabile sunt cele de tip integer, care se identifica cu "idatributvalue", iar acest camp se repeta in al doilea tabel datarelated.dbf, iar fiecare are imediat linga el coloana de "atributvalue" de tip carachter. ceea ce imi scapa este "idatribut", asta unde sa il definescsi sa fie tot integer? (coloana de index nu tine loc de "idatribut"?)

 Daniel Buduru wrote

O situatie speciala are culoarea. E un atribut care apare si la palarie, si la tulpina. O sa vedem cum se face pentru a nu repeta valorile unui atribut.


este singura situatie speciala culoarea, deoarece restul nu mai au "atributvalue" identice intre ele ( de aceea le-am si grupat una linga alta).
dar ceea ce initial nu mi-a scapat (cand gandeam in sensul variabilelor logice dar mi-a scapat ulterior este ca)
singura variabila care comparativ cu restul difera esential este culoarea pentru ca culoarea fata de restul variabilelor pentru aceasi "articol" poate lua mai multe valori.
o ciuperca poate sa isi scimbe culoarea pe parcursul imbatrinirii sau sa difere in nuante de la o zona la alta (deci aceasta variabila trebuie sa permita inregistrarea de valori multiple pentru acelasi articol, iar la cautare va primi doar una dintre aceste valori si va trebui sa o recunoasca ca fiind atribuita si acestui articol.)

 Daniel Buduru wrote
De fapt, avem partile componente ale ciupercii, parti care au atribute comune: culoare, forma, textura.


doar culoarea e comuna, o sa completez  miine tabelul cu cateva exemple ca sa iti faci idee mai buna.

Szabolcs
 8/9/2011 10:14:56 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
In Datarelated.dbf ai, pentru un id, mai multe atribute. Daca am inteles bine, acesta este tabelul in care pui valorile atributelor.
Ei bine, trebuie sa ai un singur atribut pe o linie, nu mai multe.
Pentru ca inca nu ai scris cod care sa exploateze baza de date, nu vezi inca diferenta intre extinderea pe orizontala si cea pe verticala.
Modelul celor doua tabele pe care ti l-am dat in postul anterior transpune tabelul tau datarelated de pe orizontala pe verticala. Asta se numeste crosstabulare, coloanele trec pe linii (sau liniile pe coloane).

In proiectarea bazelor da date se foloseste o metoda numita "normalizare". In mare, este o tehnica de reducere  a redundantei informatiei. Orice informatie care se repeta se izoleaza intr-o tabela, apoi ea este doar referita, si nu copiata, in tabelele in care apare aceasta informatie. Asta este ceea ce ai facut trecand datele ce definesc ciuperca in doua tabele.
Acum eliminam din cea de-a doua tabela redundantele si o structuram pe verticala.
Normalizarea bazei de date poate crea un numar mai mic sau mai mare de tabele. Vom sti cate abia cand vom termina procesul.
Daca un articol (o ciuperca) poate avea mai multe culori, insemna ca trebuie sa cream inca o tabela, asociata tabelei mushroomdata, in care sa punem toate culorile pe care le poate avea acea ciuperca. Tabela va avea un camp idciuperca (vom reveni la numele campurilor) si idculoare. Eventual, inca un camp care sa precizeze carei etape din viata ciupercii ii corespunde culoarea. Dar si aici pot fi mai multe etape in care are aceeasi culoare, deci fie renuntam la camp, fie mai adaugam o tabela pentru etape: idciuperca, idculoare, idetapa ... Pentru inceput, e mai bine sa renuntam la acest camp.
Cand  vom avea tabelele completate cu ceva valori, vom putea executa un select, si va fi mai usor de inteles ce facem si ce urmarim.

Trebuie sa precizez un lucru: eu postez cand am un pic de timp, si nu intotdeuna am timp s ama uit pe posturile anterioare, asa ca se poate sa fiu inconsecvent cu ceva nume de campuri, variabile, etc. Mai pot sa am si erori in cod, cand il scriu, il scriu direct aici si nu-l verific in vfp. Asa ca urmareste mai degraba ideea.

Acum, in ceea ce priveste acel "index": ID vine de la Identifier, Identificator, Identitate. De obicei, este un cod generat intern in baza de date, care nu are nici un fel de semnificatie pentru utilizator, si este utilizat pentru a identifica in mod unic o inregistrare. In tabela in care este definit, un identificator este cheie primara, respectiv nu permite decat valori unice. Pe acest camp, identitate, se creeaza un index primar, de aici oarecare confuzie intre id si index. Indexul este cel care rejecteaza valorile repetate, nu campul in sine. Denumirea de cheie primara vine de la cheia de indexare a indexului primar.
In tabela in care sunt definite atributele, idatribut este cheie primara, si defineste in mod unic un atribut, al carui nume este tinut in campul atributname.
Acum aceasta tabela se afla in relatie 1-to-many cu tabela cu valorile atributelor, tabeal care are structura idatribut, idatributvalue, atributvalue. In aceasta tabela idatribut este cheie straina (o cheie straina este o cheie unica in alta tabela), si, impreuna cu idatributvalue,  constituie cheia primara a acestei tabele. Este o cheie compusa, idatribut se repeta pentru toate valorile atributului, in timp ce idatributvalue este unica pentru un idatribut, dar nu este unica in tabela. Am putea simplifica lucrurile, punand idatributvalue cheie primara, un camp autoincrement, astfel incat idatributvalue sa fie unic in tabela. In acest caz, daca vrem sa pastram numerotarea valorilor de la 1 pentru fiecare atribut, ar trebui sa introducem un nou camp, codatributvalue.

Vom relua discutia asta dupa ce lucram putin cu talelele completate.


Daniel Buduru
 8/10/2011 9:22:32 AM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
nu vreau sa te deranjez inutil, de acea nu te intreb  daca ai vreun ID de mesenger, dar in schimb te intreb daca poti cumva sa imi dai o adresa de mail, nu de alta dar mi-e mai usor asa sa iti trimit atasamente pe aceasta cale decat sa le tot leg la cate un post al forumului.

intre timp am inceput popularea tabelelor si il regandesc pe cel cu atributele asa cum cred ca le-am inteles din descrierea ta.

pentru cel cu culorile inca nu am idee, deocamdata il voi exclude din tabelul cu atributele.

Szabolcs
 8/10/2011 10:54:09 AM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A) Modified By Daniel Buduru  on 8/10/2011 10:54:46 AM)
Gasesti id-ul/ adresa yahoo  in profilul meu de utilizator. Click pe nume, te duce acolo.

Daniel Buduru
 8/10/2011 3:53:56 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
multumesc pentru datele de contact,
pe de o parte am refacut tabelul cu atributele (fara cele patru caracteristici egale, "culoarea") (astept propuneri si pentru acest tip de tabel deoarece fiecare "articol" poate lua in acelasi timp mai multe stari, am descris mai inainte)

deci atributele dezvoltate nu pe linie ci pe coloana ar trebui sa arate in felul asta?
http://i52.tinypic.com/wah8nc.png
am fost adaugat si o a patra coloana cu "atributname" mai mult ca si o legenda ca sa stiu la ce fac referire, este bine pina aici?

tabelul principal inca nu l-am populat dar cred ca de acolo te intereseaza doar campurile de tip integer la care le voi da cate o valoare din coloana de "idatributvalue" din imaginea atasata. zic bine , da? ar trebui sa redenumesc si fiecare astfel de coloana cu aceste valori ale lui "idatribut" adica in loc de "hatsurface" sa denumesc coloana pur si simplu "1"?, este mai usor de integrat asa?

Szabolcs
 8/10/2011 5:18:27 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
E bine.
Atributname e, intr-adevar, o "legenda", si vom crea si acel tabel, ca sa nu repetam valoarea la fiecare inregistrare. Acum putem lucra si fara acea tabela, asa ca e ok.

Pune si culorile in acest tabel, cu atributname="color", si atributvalue = ce culori ai tu. Aici nu diferentiem culoare pe hatcolo, stemcolor, ne trebuie numai valori pentru culoare, ca sa avem cu ce popula o lista de selectie.

Mai fa un tabel, cu idciuperca, atributname, idcolor.
Completat astfel:
1, hatcolor, 1
1, hatcolor, 2
1, stemcolor, 1
1, stemcolor, x
Avem cate o inregistrare pentru fiecare culoare pe care o poate avea palaria sau tulpina fiecarei ciuperci din tabelul principal, la fel cum in tabelul de atribute avem cate o inregistrare pentru fiecare valoare pe care o poate avea un atribut.

In tabelul principal lasa numele atributelor in clar, le vom folosi pentru a regasi idatribut si atributvalue. Utilizatorul nu trebuie sa lucreze cu coduri, asta e treab aplicatiei. Utilizatorul trebuie sa vada informatia in clar, pentru asta folosim nomenclatoare (ceea ce ai numit "legenda", este corect ca sens). Programul face corelatia intre nume si coduri si lucreaza cu ele.

Intr-adevar, in tabelul principal nu trebuie toate datele, ci numai cat sa putem face un select, ca sa vezi cum functioneaza si ce mai trebuie facut.


Daniel Buduru
 8/10/2011 6:14:19 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
Tabelul nomenclator atribute poate fi obtinut acum direct din tabela atributes printr-un select:

Select distinct idatribut, atributname From atributes order by idatribut into table atributnames



Daniel Buduru
 8/10/2011 6:46:55 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
 Daniel Buduru wrote

Mai fa un tabel, cu idciuperca, atributname, idcolor.
Completat astfel:
1, hatcolor, 1
1, hatcolor, 2
1, stemcolor, 1
1, stemcolor, x
Avem cate o inregistrare pentru fiecare culoare pe care o poate avea palaria sau tulpina fiecarei ciuperci din tabelul principal, la fel cum in tabelul de atribute avem cate o inregistrare pentru fiecare valoare pe care o poate avea un atribut.




ceva nu inteleg, idciuperca de unde il iau? numerotez fiecare ciuperca? fiecare ciuperca il introduc asa manual cu cate culori are el individual? nu este nici o medoda mai usoara? sau am inteles gresit?


Szabolcs
 8/10/2011 8:37:43 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A) Modified By Daniel Buduru  on 8/10/2011 10:39:28 PM)
Idciuperca este id din mushroomdata.
Se stabileste o relatie 1-to-many intre mushroomdata si aceasta tabela, sa-i zicem mushroomcolors.
Pentru fiecare culoare pe care o poate avea o ciuperca se introduce o inregistrare in aceasta tabela.
Se poate simplifica doar modul de introducere.
Odata stabilita structura tabelelor se creeaza un form pentru introducerea datelor. Atributele se pot prelua din combobox-uri.
In cazul culorilor, se poate face un grid, cu cate o celula cu un checkbox pentru fiecare culoare, permitand setarea tuturor culorilor odata. Mai departe, va exista un algoritm care va crea inregistrarile necesare in tabela de culori.
O alta metoda pentru facilitarea introducerii datelor este copierea unui alt articol. Daca o ciuperca seamana destul de mult cu o alta deja introdusa, se poate copia acea inregistrare la noua ciuperca, apoi se modifica ce este de modificat.

Avem nevoie sa validam structura tabelelor cu cateva inregistrari, pentru a trece la crearea interfetei, atat cea pentru intretinerea bazei de date, cat si  cea pentru interogarea ei.


Daniel Buduru
 8/10/2011 11:13:16 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
am completat tabelul de atribute cu culori, care cred ca este ok, dar tabelul pentru culori nu stiu daca este bine,
asa l-am inteles din explicatiile tale dar parca nu-mi suna bine acea "idciuperca"

http://i56.tinypic.com/21m9aux.jpg

in tabelul mare mushroomdata am introdus pe linag campoul "id"(integer(AutoIncrement)) si un camp "idciuperca", incrementarea am vazut ca sare peste cate un numar de fiecare data cand reiau editarea,
este necesar sa introduc acest camp, sau cel cu autoincrementare poate ramane fara probleme?

Szabolcs
 8/10/2011 11:53:24 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A)
Tabelul colors din poza s-ar numi mushrooumcolor, pentru ca tinem in el culorile asociate unei ciuperci.

IDCiuperca din acest tabel este o cheie straina (foreign key), respectiv id din tabelul mushroomdata. Cand vrem sa regasin culorile unei ciuperci,  cautam in tabela mushroomcolor inregistrarile care au idciuperca=mushroomdata.id.

Nu e nevoie sa adaugi un camp idciuperca in tabelul mushroomdata, dar poti redenumi campul id in idciuperca (sau idmushroom, ca sa ramanem la denumirile in engleza).
Un camp numit simplu id intr-o tabela, sugereaza ca este identificatorul unic al inregistrarilor din acea tabela. Cand insa ne referim la el in cod, trebuie sa ii dam un nume care sa sugereze carei tabele ii apartine id-ul respectiv. De regula, campul se numeste id+numele tabelei sau al obiectului pe care il identifica, asa cum avem idcolor, idatribut.
Vom revizui toate numele inainte de a incepe sa le utilizam in cod. In acest moment e important doar sa stim ce reprezinta fiecare.

Exista diferite metode pentru crearea numelor. De ex, id se pune ca sufix (userid, colorid ) sau ca prefix (iduser, idcolor). Alegerea unei metode sau a alteia este subiectiva, e in functie de modul de lucru al programatorului. Daca te intereseaza sa regasesti imediat un atribut, indiferent carui obiect ii apartine, pui atributul in fata si apoi numele obiectului. Daca insa vrei sa regasesti mai usor toate atributele unui obiect, pui in fata numele obiectului, si apoi atributul. Eu folosesc o metoda mixta, pentru identificator pun id in fata obiectului, pentru restul pun obiectul in fata atributului. Cheile primare (identificatorii unici) sunt folosite la legarea tabelelor intre ele. De accea ai nevoie intotdeuna sa gaseti rapid identificatorul, si cel mai rapid este sa te uiti dupa incepultul cuvantului, nu dupa sfarsitul lui.  Restul informatiilor sunt atribute, si le cauti intotdeauna dupa obiectul pe care il descriu. E mai semnificativ hatcolor, stemcolor decat colorhat, colorstem. Nu e mai putin adevarat ca suna mai bine in engleza decat in romana. In romana, culoare_palarie suna mai bine decat palarie_culoare, desi e mai incomod de utilizat asa.
Oricum, asta priveste doar programatorii. Utilizatorii vor vedea doar denumirile date in interfata, nu trebuie sa vada si sa lucreze cu campurile.

Mai trebuie un tabel pentru culori, in care ai campurile idcolor, color (caracter, numele culorii ) si, eventual, un camp ncolor, integer, in care sa tii codul RGB al culorii (poti colora o celula de grid sau alt element de interfata folosind aceasta valoare, astfel incat utilizatorul sa o poata alege sau recunoaste si dupa aspect, nu numai dupa nume)
Acest tabel este nomenclatorul de culori, cu care se populeaza lista de selectie sau gridul din care se aleg culorile.



Daniel Buduru
 8/11/2011 10:55:59 AM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
 Daniel Buduru wrote
Tabelul colors din poza s-ar numi mushrooumcolor, pentru ca tinem in el culorile asociate unei ciuperci.

IDCiuperca din acest tabel este o cheie straina (foreign key), respectiv id din tabelul mushroomdata. Cand vrem sa regasin culorile unei ciuperci,  cautam in tabela mushroomcolor inregistrarile care au idciuperca=mushroomdata.id.

Nu e nevoie sa adaugi un camp idciuperca in tabelul mushroomdata, dar poti redenumi campul id in idciuperca (sau idmushroom, ca sa ramanem la denumirile in engleza).
Un camp numit simplu id intr-o tabela, sugereaza ca este identificatorul unic al inregistrarilor din acea tabela. Cand insa ne referim la el in cod, trebuie sa ii dam un nume care sa sugereze carei tabele ii apartine id-ul respectiv. De regula, campul se numeste id+numele tabelei sau al obiectului pe care il identifica, asa cum avem idcolor, idatribut.
Vom revizui toate numele inainte de a incepe sa le utilizam in cod. In acest moment e important doar sa stim ce reprezinta fiecare.

Exista diferite metode pentru crearea numelor. De ex, id se pune ca sufix (userid, colorid ) sau ca prefix (iduser, idcolor). Alegerea unei metode sau a alteia este subiectiva, e in functie de modul de lucru al programatorului. Daca te intereseaza sa regasesti imediat un atribut, indiferent carui obiect ii apartine, pui atributul in fata si apoi numele obiectului. Daca insa vrei sa regasesti mai usor toate atributele unui obiect, pui in fata numele obiectului, si apoi atributul. Eu folosesc o metoda mixta, pentru identificator pun id in fata obiectului, pentru restul pun obiectul in fata atributului. Cheile primare (identificatorii unici) sunt folosite la legarea tabelelor intre ele. De accea ai nevoie intotdeuna sa gaseti rapid identificatorul, si cel mai rapid este sa te uiti dupa incepultul cuvantului, nu dupa sfarsitul lui.  Restul informatiilor sunt atribute, si le cauti intotdeauna dupa obiectul pe care il descriu. E mai semnificativ hatcolor, stemcolor decat colorhat, colorstem. Nu e mai putin adevarat ca suna mai bine in engleza decat in romana. In romana, culoare_palarie suna mai bine decat palarie_culoare, desi e mai incomod de utilizat asa.
Oricum, asta priveste doar programatorii. Utilizatorii vor vedea doar denumirile date in interfata, nu trebuie sa vada si sa lucreze cu campurile.

Mai trebuie un tabel pentru culori, in care ai campurile idcolor, color (caracter, numele culorii ) si, eventual, un camp ncolor, integer, in care sa tii codul RGB al culorii (poti colora o celula de grid sau alt element de interfata folosind aceasta valoare, astfel incat utilizatorul sa o poata alege sau recunoaste si dupa aspect, nu numai dupa nume)
Acest tabel este nomenclatorul de culori, cu care se populeaza lista de selectie sau gridul din care se aleg culorile.



Szabolcs
 8/11/2011 10:56:46 AM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
numele tabelului nu cred ca are mare importanta,  il vom apela identic ca si cum ar fi muschroomcolor
numele campurilor in engleza sau romana, nu le-am ales pe baza a cum suna, ci din doua considerente: 1. m-i sau parut a fi mai scurte in engleza; 2.engleza e mai universal folosita mai ales in programare, iar daca vreodata cineva (indiferent de natie) vrea sa il mai imbunatateasca, sau sa ii mai adauge ceva, cred ca se va descurca mai usor cu termeni in engleza, cu atat mai mult cu cat si comenzile ...  sunt tot in engleza. (dar uite ca deja le amestec  din moment ce m-am luat dupa tine si am pus idciuperca)

 Daniel Buduru wrote

IDCiuperca din acest tabel este o cheie straina (foreign key), respectiv id din tabelul mushroomdata. Cand vrem sa regasin culorile unei ciuperci,  cautam in tabela mushroomcolor inregistrarile care au idciuperca=mushroomdata.id.


deci am inteles bine? tabelul meu "colors" nu este bine completat (nu ca si campuri ci  ca si valori), adica atata timp cat tabelul "atributes" e mai mult un tabel de ghidaj care contine toate variantele posibile pentru cate un atribut, valoarea atributelor fiind completate in mushroomdata; cel de "colors" pe de alta parte elimina cele 4 coloane ce contin informatii despre culoare din tabelul principal "mushroomdata" si voi introduce in acest tabel "colors" manual doar acele coduri de culoare care sunt specifice ciuperci nr "1" respectiv fiecarei urmatoare si nu toate culorile posibile cum am facut in imaginea atasata aseara.
da?

am redenumit si campul id in idciuperca in tabelul principal.

 Daniel Buduru wrote

Mai trebuie un tabel pentru culori, in care ai campurile idcolor, color (caracter, numele culorii ) si, eventual, un camp ncolor, integer, in care sa tii codul RGB al culorii (poti colora o celula de grid sau alt element de interfata folosind aceasta valoare, astfel incat utilizatorul sa o poata alege sau recunoaste si dupa aspect, nu numai dupa nume)
Acest tabel este nomenclatorul de culori, cu care se populeaza lista de selectie sau gridul din care se aleg culorile.



un camp ncolor, integer, in care sa tii codul RGB al culorii, asta ma nedumereste putin
un camp integer vad ca are latimea standard de 4, iar pentru definirea culorilor prin RGB cunosc doua metode din html: varianta xxx.xxx.xxx sau #xxxxxx (rosu: 255.0.0 sau  #FF0000 ) cum introduc una din aceste variante intr-un camp integer de lungime 4?


PS scuze reply-ul dinainte, m-il la facut din cauza re-login-ului

Szabolcs
 8/11/2011 11:58:23 AM
User is offlineDaniel Buduru
3522 posts
1st




Re: report conditionat?
 (N/A) Modified By Daniel Buduru  on 8/11/2011 12:01:14 PM)
Eu imi botez tabelel, campurile, obiectele, metodele, variabilele tot in engleza, din aceleasi motive: sunt mai scurte, au un sens mai bine definit si pot fi intelese de orice programator.

Pentru consecventa, boteaza campul idmushroom pe unde apare.

Numele tabelei, ca orice nume utilizat in informatica, nu are nici o importanta. Dar, daca pastrezi o regula pentru atribuirea numelor, e mai usor sa reintri intr-o aplicatie dupa ceva vreme - acum iti spui ca nu vei uita niciodata ce nume ai dat in aplicatia asta, cu totii am trecut prin asa ceva - sau pentru altcineva sa depaneze aplicatia.
Regula mea este ca tabelele in care este divizata informatia apartinand unui obiect sa aiba aceeasi radacina.
De ex, ai tabela mushrooms (cred ca pe asta ai botezat-o mushroomdata) cu informatiile singulare, iar mushroomcolor cu culorile pe care le poate avea o ciuperca.
Mai avem o tabela-nomenclator cu culori, in care definim idcolor, cod pe care il utilizam in mushroomcolor in locul denumirii culorii.

Acum, sa luam o ciuperca, sa zicem champignon. Ea va avea un idmushroom in tabela mushroomdata, sa zicem 3.
Acum, ciuperca asta are hatcolor alb sau cafeniu, stemcolor alb sau cafeniu. In tabela colors, alb ar avea idcolor=1 iar cafeniu idcolor=25.
In tabela mushroomcolor trebuie sa avem 4 inregistrari pentru champignon:
idmushroom, atributname, idcolor .
3, hatcolor, 1
3, hatcolor, 25
3, stemcolor, 1
3, stemcolor, 25

Cun pui RGB(64,128,255) in integer pe 4 octeti?  Pai, culoarea are doar 3 octeti :) .Functia RGB(x,y,z) returneaza o valoare numerica, de ex 0 pentru negru si 16777215 pentru alb. Fiecarei valori r, g, b ii corespunde un octet (asezati in ordine inversa, bgr)
Pune in fereastra de comenzi asta (#FF8040):
? 0xFF8040
? RGB(64,128,255)
? TRANSFORM(16744512, '@0')
Extragem componentele de culoare din ncolor:
? BITAND(16744512,255) && Blue
? BITAND(BITRSHIFT(16744512,8),255) &&  Green
? BITAND(BITRSHIFT(16744512,16),255) &&  Red
 
Bine, si cum alegem culoarea? Cu un colorpicker.
? GETCOLOR()

M-am repetat cu tabela de culori ...
Trimite-mi tabelele in faza asta, e suficient de avansata.

Daniel Buduru
 8/11/2011 1:00:56 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
ti-am trimis tabelele pe mail, completate cu cateva exemple, mai putin codu culorii, care incerc sa il aflu si pe acela intre timp.
da, ai perfecta dreptate, pot afla codurile dorite foarte usor cum ai zis.

acelea in acest moment nu te incurca, asa ca uitate peste restu informatiei

Szabolcs
 8/11/2011 1:01:46 PM
User is offlineslice3
22 posts


Re: report conditionat?
 (N/A)
nu cauta pe yahoo ci pe g.mail, am trimsi cu reply

Szabolcs
  Visual FoxPro  Baze de date, tabele, view-uri si indecsi  report conditio...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement