Newsgroup: it.comp.lang.delphi
Titolo: Ricerca nulli

Ho una tabella TRic con due campi uno Cognome e l'altro Sex ,riesco a fare
delle ricerche multiple con il codice di cui sotto dove inserisco  le
stringhe di ricerca in due edit (Cognome.text e Sex.text),il tutto funziona
perfettamente, se tutti i due campi contengono delle stringhr e non dei
valori nulli,per esempio
Cognome            Sex
Rossi                  M
Bianchi                F
Verdi
Gialli                   M
                          M
Viola                   M
Se nella edit SEx.text digito M la ricerca mi da' solo
Rossi             M
Gialli              M
Viola              M
mentre io vorrei
Rossi  M
Gialli   M
          M
Viola   M
Qualcuno mi puo' aiutare?
Diciamo che avrei risolto in fase di digitazione,aggiungendo alla tabella
due altri campi (CognomeB e SexB)con la condizione che se il campo e' vuoto
viene inserita per esempio una X mentre se non e' vuoto viene inserita la
stringa del campo sorgente, e poi faccio la ricerca sui nuovi campi,pero'
vorrei evitare codesto passaggio in piu' se e' possibile.
Grazie per la risposta
With Query1 do
 begin
  SQL.Clear;
  SQL.text:='select * FROM TRic WHERE cognome like ' + QuotedStr('%'+
Cognome.Text +'%')
  + ' + and sex like ' + QuotedStr('%'+ sex.Text +'%') ;
   query1.Open;
Paolo

 Ho una tabella TRic con due campi uno Cognome e l'altro Sex ,riesco a
Sarebbe utile sapere che db usi.
--
Jax
====
Spesso, la gelosia non è che un presentimento.

 ha scritto nel messaggio
news:RuHyb.131400$hV.47...@news2.tin.it...


    query1.Open;
Probabilmente non ti tira fuori i null proprio perché tu gli chiedi che
cognome sia comunque valido con quella like.
Io la riscriverei cosě:
var
    bAnd: Boolean;
...
With Query1 do
begin
    bAnd := False;
    SQL.Clear;
    SQL.Lines.Add('SELECT * FROM TRIC');
    if (Cognome.Text <> '') or (Sex.Text <> '') then
        SQL.Lines.Add('WHERE');
    if (Cognome.Text <> '') then
    begin
        SQL.Lines.Add('cognome like ' + QuotedStr('%'+ Cognome.Text +'%'));
        bAnd := True;
    end;
    if (Sex.Text <> '') then
    begin
        if bAnd then SQL.Lines.Add('AND');
        SQL.Lines.Add('sex like ' + QuotedStr('%'+ sex.Text +'%'));
        bAnd := True;
    end;
    // qui puoi metterci altre clausole where, se ci sono, usando come
    // esempio quella di Sex
    Open;
end;
Non l'ho testata neh!
--
Jax
====
All'avvocato bisogna raccontare le cose chiare: a lui tocca poi
imbrogliarle.(Manzoni)

Ti ringrazio per la risposta,funziona perfettamente,sei un mago!
C'e' un solo problema,ho provato il tuo codice su una tabella di 50.000
record,e la ricerca diventa lenta,specialmente se scelgo solo il campo
Cognome e lascio vuoto il campo sex,i campi sono indicizzati,vorrei sapere
se e' possibile non usare una query,ma usare il metodo Filter per
velocizzare il tutto,ottenendo pero' gli stessi risultati di ricerca.
Grazie di nuovo
Paolo


 stessi risultati di ricerca. Grazie di nuovo
Beh, se vuoi provare è abbastanza semplice, basta che usi una TTable (o il
componente relativo alla TTable della suite che usi) e imposti la proprietà
Filter in modo simile alla query.
Supponendo che la TTable la chiamerai Table1:
var
    bAnd: Boolean;
...
With Table1 do
begin
    bAnd := False;
    Filter := '';
    if (Cognome.Text <> '') then
    begin
        Filter := Filter + 'cognome = ' +
            QuotedStr('*'+ Cognome.Text +'*'));
        bAnd := True;
    end;
    if (Sex.Text <> '') then
    begin
        if bAnd then Filter := Filter + ' and ';
        Filter := Filter + 'sex = ' +
            QuotedStr('*'+ sex.Text +'*'));
        bAnd := True;
    end;
    Open;
end;
Non ti garantisco:
1) che funzioni :)
2) che abbia delle prestazioni migliori
--
Jax
====
Quando sento qualcuno parlare di Cultura la mano mi corre al revolver.
(Goering)

 Grazie di nuovo
Andrea

 stessi risultati di ricerca. Grazie di nuovo
Tieni presente che l'esecuzione di una query fa sě che sulla rete viaggino i
soli dati che rispondono alle condizioni specificate nella sua clausola
"where", mentre l'esecuzione di un filtro viene effettuata lato client:
sulla rete viaggiano tutti i dati della tua tabella che poi vengono filtrati
dalla tua TTable / TADOTable / TIbTable ecc..
Secondo te qual'č il metodo piů veloce?
Saluti
        Marco Bortolani
        info<NOSPAM>@
marcobortolani.it
P.S.
Per velocizzare l'esecuzione della query prendi in considerazione l'ipotesi
di indicizzare la tabella sui campi che utilizzi come criteri di ricerca
("cognome" e "sex").