Newsgroup: it.comp.lang.delphi
Titolo: Problema filtro clientdataset

salve ragazzi,
ho un problema grande quanto una casa... :)
ho un filtro di un dataset:
       filtro :=QuotedStr('%' + Edit2.Text + '%');
            if dm.cdsarticoliFiltro.Active = False then
                  dm.cdsArticoliFiltro.Open;
            dm.cdsArticoliFiltro.Filtered := False;
            dm.cdsArticoliFiltro.Filter := 'DESCRIZIONE LIKE ' + filtro;
            dm.cdsArticoliFiltro.Filtered := True;
funziona solo se i caratteri della stringa filtro sono minori di 6, poi 
va in access violation, premetto che ho provato a cambiare il cds e nada.
idee?
grazie...

C_thelegend ha scritto:

ragazzi nessuna idea?

 idee?
Maggiori dettagli please!
Non e' che il campo e' largo 6 caratteri??
ciao
-- 
Morde

Morde ha scritto:

il campo ï¿œ di 125 caratteri di dettagli te ne posso dare quanti ne vuoi 
ï¿œ una banale query di articoli, li carico nel cds e poi voglio filtrare 
ma mi da questo errore se voui sapere altro dimmi pure...

C_thelegend ha scritto:

altra info
quando uso il numero di caratteri che genera l'errore l'event log mi da 
questo
Debug Output: ERROR in pattern match pcode
   Process Programma.exe (3808)

 
Hai considerato cosa succede se qualche riga contiene caratteri 
"problematici" come '%' ?

Jodi ha scritto:

onestamente no, ma comunque non spiega il mio problema, almeno credo.

 onestamente no, ma comunque non spiega il mio problema, almeno credo.
Non sapendo la spiegazione al problema, io non escluderei mai nulla. ;)
A parte questo, fornisci qualche dato in più, ad esempio qual è la 
struttura completa della tabella (i "Fields" del CDS)? puoi inviare 
l'XML del pacchetto dei dati che carichi dentro al DataSet, così 
chiunque può replicare la cosa, o almeno un insieme di dati 
significativi che causino il problema (se si tratta di dati sensibili)?
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 
se salvo il cds con e passo il contenuto del file va bene?

 se salvo il cds con e passo il contenuto del file va bene?
Salva un progetto di test dove replichi l'errore, inoltre mettici anche 
un xml salvato dal CDS in modo che possa venir caricato. Zippa il tutto 
e uppalo in un servizio di file hosting gratuito (io uso 
box.net
).
Pubblicaci il link al materiale in modo che possiamo scaricarlo senza 
impazzire.
Non dimenticare di includere info quali la versione di delphi 
utilizzata.
Ciao
-- 
Morde

Morde ha scritto:

allora, riprodotto l'errore nel progetto seguente:
http://www.box.net/shared/6td6irgtmy
versione di delphi D2009 con tutti gli update
componenti standard di delphi...
grazie in aticipo :)

 
http://www.box.net/shared/6td6irgtmy
C'ï¿œ qualche stranezza.
L'ho provato con D7 (senza virus :P) e il problema sussiste.
Ma da questo articolo
http://edn.embarcadero.com/article/29271
ho scaricato il tester
http://cc.embarcadero.com/Item/19198
e il filtro funziona su tutti i clietdataset installati nelle demos di 
delphi (Ad es. C:\Programmi\file comuni\borland 
Shared\Data\animals.cds), tranne che col tuo CDS... non riesco a 
capirne i motivi.
Per applicare un filtro con
CAMPO like '%VALORE%'
nel programmino si clicca sul check del case insensitive, poi sul 
pulsante Apply filter expression, infinei su apply filter, e funziona.
Sul cds animals.cds con questa filter expression va:
name like '%cat%'
TRa poco devo uscire, dacci un'occhio e vedi di capire qual'ï¿œ il 
problema del tuo CDS che impedisce il filtering corretto.
Facci sapere ovviamente..
Ciao
-- 
Morde

Risolto.
Il problema e' nella definizione del campo su cui fai la ricerca.
Io l'ho fatto funzionare salvando il tuo CDS come xml, e modificando la 
riga dove definisce il field come segue:
<FIELD attrname="DESCRIZIONE" fieldtype="string" WIDTH="250">
per la cronaca, il fieldtype originale ï¿œ "strin.uni", il famigerato 
unicode...
Spero riesci a risolvere in qualche modo.
Ciao
-- 
Morde

 
http://www.box.net/shared/6td6irgtmy
In effetti, l'errore viene riportato e non ho apparentemente visto 
errori nel codice, quindi il motivo potrebbe essere dovuto ai dati 
(magari un difetto di encoding?).
Purtroppo, non ho molto tempo da dedicare. :-|
Se proprio la libreria non dovesse comportarsi a dovere, puoi sempre 
fare uso dell'evento "OnFilterRecord" per gestire questa condizione:
##########
procedure TForm1.cds1FilterRecord(DataSet: TDataSet;
   var Accept: Boolean);
begin
   Accept := Pos(edt1.Text,
     DataSet.FieldByName('DESCRIZIONE').AsString) > 0;
end;
##########


Morde ha scritto:

scusa morde, il mio cds ï¿œ legato ad una query su db firebird, come 
potrei risolvere?
grazie ancora :)

Marco Breveglieri ha scritto:

ciao marco
ho provato ad aggiungere la condizione ma non cambia il risultato..
grazie :)

 ho provato ad aggiungere la condizione ma non cambia il risultato..
Ti sei ricordato di rimuovere l'impostazione della proprietï¿œ "Filter" 
(che in questo caso non serve piï¿œ)? ;-)


 risolvere?
Innanzitutto cerca su codegear perchï¿œ non sarai l'unico con questo 
problema.
In secondo luogo, se la query e' sempre la stessa ed quella 
tabella/vista non cambierï¿œ mai, purtroppo devi ricorrere al caching: 
fai la query, scorri tutto i record e li metti nel CDS il quale avrï¿œ la 
definizione corretta del field di tipo unicode string.
Non mi piace come soluzione ma puo' essere un buon workaround intanto 
che cerchi di risolvere nel modo piu' corretto.
Ciao
-- 
Morde

 
non mi ero ricordato, ho provato ad inserire il codice che hai riportato 
ma l'errore ï¿œ il medesimo, posso ridefinire il tipo di campo del cds a 
runtime?

 ma l'errore ï¿œ il medesimo
In quel caso, perï¿œ, a me funziona. :-|


 
ho riprovato, ed hai ragione funziona io mi ostinavo a mettere il % 
quindi errore, se hai 2 min mi spieghi meglio onfilterrecord?
ho provato molto tempo fa ad usarlo e non ci sono riuscito ma adesso 
funziona :D
la cosa che mi interesserebbe sapere se ï¿œ possibile usare filtri anche 
su piï¿œ campi.
grazie marco :)

 su piï¿œ campi.
Certo! Tu hai a disposizione il record corrente e puoi impostare il flag 
di accettazione come preferisci, in base ad una condizione 
personalizzata e codificata in linguaggio Delphi (che magari con il 
linguaggio macro della proprietï¿œ "Filter" non potresti realizzare, 
tralasciando la questione del bug riscontrato).
Ciao,
   Marco.


Marco Breveglieri ha scritto:

grazie Marco, gentilissimo voglio provare ad impostare per lo stesso 
testo la ricerca su piï¿œ campi, descrizione, codice, codfornitore, barcode.
so che il tasto F1 sono la miglior risorsa, ma onestamente il nuovo help 
non mi piace proprio...
ciao ;)

C_thelegend ha scritto:

* tasto F1 e sangoogle ;)