[SQL] Cautare nume intr-o tabela

Acest forum este dedicat intrebarilor de programare care nu-si au locul in unul din celelalte forumuri
Post Reply
User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

[SQL] Cautare nume intr-o tabela

Post by Silviu Ardelean » 17 Oct 2011, 11:27

nedo wrote: Tot incerc sa fac o functie pentru a verifica daca un nume exista in baza de date.Problema e ca nu imi iese.
Ideea e urmatoarea.
In baza de date se intampla sa am de mai multe ori un nume
Exemplu: MARIN ALEXANDRU, MARIN ALEXANDRU 1, MARIN ALEXANDRU 2 smd.
Functia de verificare are un bug. Daca in baza de date exista MARIN ALEXANDRU 1, MARIN ALEXANDRU 2, dar nu mai exista MARIN ALEXANDRU, functia mea v-a avea ca output MARIN ALEXANDRU 2.

Voi cum ati proceda in cazul asta?
Functia executa un statement de genul Select Customers.ContactLastName FROM Customers;
Lasa engine-ul SQL sa-si faca treaba si nu o fa tu in locul lui. :)
Schimba statementul adaugand o clauza WHERE cu conditie de egalitate si obtii doar intregistrarile ce indeplinesc conditia.

Code: Select all

string tempQuerry = "SELECT Customers.ContactLastName FROM Customers WHERE Customers.ContactLastName = \'" + name +"\'";
Daca ai mai multi Customers cu acelasi nume vei avea mai multe inregistrari. Mai departe e treaba ta cum ii distingi (ex. folosesti o cheie primara unica auto increment, un UID unic, etc).



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: [c++]Ajutor utilizare metoda in interiorul altei metode

Post by Ovidiu Cucu » 17 Oct 2011, 13:08

nedo wrote:[...]
Tot incerc sa fac o functie pentru a verifica daca un nume exista in baza de date.Problema e ca nu imi iese.
Ideea e urmatoarea.
In baza de date se intampla sa am de mai multe ori un nume
Exemplu: MARIN ALEXANDRU, MARIN ALEXANDRU 1, MARIN ALEXANDRU 2 smd.
Functia de verificare are un bug. Daca in baza de date exista MARIN ALEXANDRU 1, MARIN ALEXANDRU 2, dar nu mai exista MARIN ALEXANDRU, functia mea v-a avea ca output MARIN ALEXANDRU 2.
[...]
Acum m-am prins si eu la ce ai fi vrut sa folosesti acea "minune" de functie Codbc::verificare. (credeam ca-i doar asa ca sa-ti verifici tu ca merge un select batut in cuie). :)
Completand ce-a spus Silviu, nu trebuie sa verifici tu din cod atata timp cat orice sistem de baze de date relationale care se respecta cat de cat, are asa ceva built-in.
Concret, adaugi o cheie primara (primary key) la tabela, adica un camp care-ti identifica in mod unic o inregistrare.
Nume/prenume nu-i OK sa fie cheie primara pentru ca deh, nu e unic. Cel mai bine e sa folosesti un ID numeric cu auto increment (in Access ai AutoNumber). Asta o sa-ti asigure sa ma ai client si pe mine si pe un eventual tiz de-al meu fara sa ne incurci conturile si fara sa ne pocesti numele. :)

// Iarasi, la bunul simt, fara sa vorbim de concepte, normalizari si alte sofisticarii. :)
Recomand totusi sa tragi un ochi printr-un tutorial SQL si/sau de baze de date relationale.

nedo
Junior
Junior
Posts: 32
Joined: 14 Oct 2011, 20:18
Judet: Bucureşti

Re: [c++]Ajutor utilizare metoda in interiorul altei metode

Post by nedo » 17 Oct 2011, 19:20

Multumesc de sfaturi, o sa am grija sa ascult de ele.
Acum ca sa ma si explic pentru ca realizez(ca de obicei un pic cam tarziu) ca nu am explicat tot.
Pentru ce anume folosesc eu in prima faza aceasta clasa.
Am o baza de date care are urmatoarele coloane in tabelul Customers:
CustomerID (cheie primara)
ContactFirstName (indicator judet)
ContactLastName (nume)
CompanyOrDepartment (comanda preluata din ...)
BillingAddress (strada,numar, smd)
City (sat,comuna, oras)
StateOrProvince (judet)
PostalCode (data)
ContactTitle (contract semnat)
PhoneNumber (numar telefon)
Extensions (tip comanda)
FaxNumber(comanda onorata)
Observatii

Aceasta baza de date o folosim la servici pentru a tine evidenta unor comenzi ca sa le zic asa.
Problema pe care eu incercam de fapt sa o rezolv prin clasa asta ar fi fost urmatoarea.
Preluarea comenzilor dintr-un fisier cu un anumit format si introducerea datelor in aceasta baza de date.
(chestie ce in mod normal o fac manual adica: listare tabel, si scriere de mana a chestiilor respective)
Baza de date este o varianta mult simplificata a bazei de date northwind.
Nu e facuta de mine asa am "mostenit-o".
Deci in prima faza clasa asta am gandit-o strict pentru ceea ce aveam eu nevoie, urmand ca un pic mai tarziu sa o generalizez dupa ce termin proiectul.
Problema ar fi urmatoarea.
Spre exemplu statementul prezentat de Silviu Ardelean imi returneaza ceea ce trebuie, dar daca spre exemplu incerc un loop si creez alt statement cu un nou nume de tipul "nume + 1" acesta nu mai returneaza.
Daca incerc spre exemplu un statement de genul :

Code: Select all

SELECT Customers.ContactLastName FROM Customers WHERE (((Customers.ContactLastName) Like '" + nume + "*'));" 
Acesta nu returneaza nimic.
Din ce am observat imi da eroare la executare. Am facut output intr-un fisier cu querry-ul respectiv cu numele adaugat si am testat acel querry direct in baza de date a functionat. Prin program insa nu.
Deci mai am de invatat.
O sa vad ce anume reusesc sa mai fac.
Multumesc din nou pentru sfaturi.
Puteti da tc. Daca e ceva o sa deschid un topic nou cu tot proiectul in stadiul in care se afla.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: [c++]Ajutor utilizare metoda in interiorul altei metode

Post by Ovidiu Cucu » 17 Oct 2011, 20:50

nedo wrote:Baza de date este o varianta mult simplificata a bazei de date northwind.
Baza de date northwind arata cam asa:
NORTHWIND.gif
NORTHWIND.gif (35.85 KiB) Viewed 4182 times
Ce inseamna "varianta mult simplificata?"
Mai putine tabele sau chiar una singura?
Ce cauta campurile legate de o comanda in tabela cu clientii (Customers)?

Si, din nou: renunta la stupizenia cu "nume + x", chiar daca e "mostenita"!

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: [c++]Ajutor utilizare metoda in interiorul altei metode

Post by Silviu Ardelean » 18 Oct 2011, 00:08

nedo wrote: Spre exemplu statementul prezentat de Silviu Ardelean imi returneaza ceea ce trebuie, dar daca spre exemplu incerc un loop si creez alt statement cu un nou nume de tipul "nume + 1" acesta nu mai returneaza.
Daca incerc spre exemplu un statement de genul :

Code: Select all

SELECT Customers.ContactLastName FROM Customers WHERE (((Customers.ContactLastName) Like '" + nume + "*'));" 
Acesta nu returneaza nimic.
Din ce am observat imi da eroare la executare. Am facut output intr-un fisier cu querry-ul respectiv cu numele adaugat si am testat acel querry direct in baza de date a functionat. Prin program insa nu.
Poti sa ne explici la ce te-ai gandit si de ce ai nevoie de un loop pentru alt statement care face cam acelasi lucru? La nevoie, in functie de situatie, poti scrie chiar SELECT in SELECT (al doilea in clauza WHERE).
Daca a functionat in Access nu inseamna ca ai si scris corect statementul. Pentru operatorul LIKE trebuie sa folosesti semnul % in locul unde valoarea poate diferii.

Code: Select all

string tempQuerry = "SELECT ContactLastName FROM Customers WHERE (ContactLastName LIKE \'" + nume + "%\')";
nedo wrote: Acesta nu returneaza nimic.
Din ce am observat imi da eroare la executare. Am facut output intr-un fisier cu querry-ul respectiv cu numele adaugat si am testat acel querry direct in baza de date a functionat. Prin program insa nu.
Ce eroare?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: [SQL] Cautare nume intr-o tabela

Post by Ovidiu Cucu » 18 Oct 2011, 10:48

Problema de fond aici nu e cum compunem un query cu LIKE (ca la Facebook :)), ci din cauza unei gugumanii din designul bazei de date.
Probabil, Gigel de la IT si-a zis ca cel mai bun criteriu de a asigura unicitatea unui client in tabela Customers este nume+prenume asa ca l-a decorat repde cu UNIQUE.
Buuuun... si-a rezolvat omu problema, si-a luat salariul / prima de Craciun / mielul de Pasti si-n cele din urma si-a bagat mainile-n fund si-a iesit la pensie sau a emigrat in Australia. :)

Numai ca, intre timp, dom'soara Fiffy de la Desfacere a fost pusa in fata unei dileme: de fiecare data cand venea Badea Gheorghe de la Tara sa cumpere superfosfat, ii dadea niste erori ciudate. Asa ca l-a rebotezat cu Badea Gheorghe 1, Badea Gheorghe 2 s.a.m.d.
Timpul a trecut, leafa a mers,.. baza de date crescut si a inflorit pana n-a mai stiut nici darku' ce-i acolo.

Acuma, sa zicem ca vine Badea Gheorghe cu capsa pusa, urland ca merge la OPC daca nu-i dam, asa cum scrie in contract, un raport cu superfosfatu pe care i l-am dat in 2011.
Ce facem?
Dam un SELECT cu LIKE? Like care Badea Gheorghe? cu 1, 2, n-1, de la i la j, pe sarite, toti la un loc?.. ;)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: [SQL] Cautare nume intr-o tabela

Post by Ovidiu Cucu » 18 Oct 2011, 11:36

Mai pe scurt: nu are nici un sens sa declari un camp UNIQUE daca inregistrarile din el din el nu sunt unice (ex. "Badea Gheorghe 1" si "Badea Ghoeghe 2" pot foarte bine sa fie una si aceeasi persoana).

Deci, sfatul meu: scoate UNIQUE de la Customers.ContactLastName si cauta alt criteriu, sa zicem CNP/CIF.

Post Reply