Newsgroup: it.comp.lang.visual-basic
Titolo: [VB] - FindFirst

Ciao ragazzi,
Ho un piccolo problema nel eseguire questa istruzione
ho due criteri di ricerca il primo di tipo Long e l'altro Tipo date
S1$ = "ID = " & "'" & cu & "'" & " AND format(Giorno,'mmddyyyy')=" & m & g &
a
.FindFirst S1$
.NoMatch risulta sempre vero, ma il record nel db è presente.
qualcuno mi sa dire dov'è l'errore
grazie.

 m & g & a
perchè formatti la data in quel modo DENTRO la stringa?
Sarebbe meglio formattare le tue variabili nel formato richiesto dal db....
a proposito, che db usi? :)
ciaociao


ciao,
uso MSAccess questo progetto utilizza il DAO


allora le date vanno delimitate dal # e formattate mm/dd/yyyy, quindi:
S1$ = "ID = " & "'" & cu & "'" & " AND Giorno=#" & m & "/" & g & "/" & a &
"#"
ciaociao


E magari m o g sono variabili numeriche, e almeno una vale meno di dieci,
giusto?
Alberto

 uso MSAccess questo progetto utilizza il DAO
ah scusami il tipo long in relatà è definito come stringa nel db

 ah scusami il tipo long in relatą č definito come stringa nel db
e usi gli apici, quindi va bene. Il problema č sicuramente nella data
ciaociao


come concetto è giusto quindi?
passare FindFirst la stringa
allora deve esserci qualche altro tipo di problema perche continua
a darmi che non trova il record


hai visto l'altro post? La data adesso come la passi?
ciaociao


corretta, formato "00/00/0000"

[Maurizio A. = 
circa...@tim.it
 in c4giqc$vjv$
1...@newsreader.mailgate.org
]
ha scritto:

Facci rivedere il codice. Forse ti è sfuggito quel Giorno= suggerito da
Marg.
La tua prima istruzione non citava il nome del campo data...


Veramente nel tuo codice la devi passare come mmggaaaa, altrimenti non andrà
mai in match col format.
Comunque, fai due cose:
- Metti un breakpoint sul findfirst, e posta il contenuto della stringona di
ricerca
- Togli prima l'una e poi l'altra delle condizioni, e verifica se
singolarmente funzionano.
Ciao
Alberto

Codice:
Questa è solo una parte della rutine
cmq ci deve essere dell'altro perchè anche passando un solo criterio
in questo caso l'd non va forse è proprio questo id che non gli piace
non tanto la data tuttavia è una stringa questo id
For Each Tbl In DbDatiAnnoOld.TableDefs
        If Mid(Tbl.Name, 1, 3) = "TB_" Then
            Set Rsac = DB1.OpenRecordset("SELECT * FROM " & Tbl.Name)
            S1$ = "ID = " & "'" & Id & "'"
            SQL =""
           // da sempre vero   NoMatch
           If Rsac.NoMatch Then
               SQL = "INSERT INTO " & Tbl.Name & "(" & NewFil.Name &
",Giorno)" & " VALUES ('" & Trim(ID) &                            "', '" &
RsDatiAnnoOld!Giorno & "')"
               DB1.Execute (SQL)
           else
              SQL=" UPDATE tableName SET .....
           endif
     endif
next
insomma questo controllo mi serve semplicemente per sapere se devo fare
un Update o un Insert Into...Tutto qua
potrei mettere anche una classica select dentro il ciclo
si ok funziona senza tanti problemi ma
Il ciclo o meglio i ciclo sono 4 quindi
il processo diventa lento con una query di select
in mezzo....

            If Rsac.NoMatch Then
Ehhhh? E la FindFirst?


si si lo messa...FindFirst

[Maurizio A. = 
circa...@tim.it
 in c4gk9h$282$
1...@newsreader.mailgate.org
]
ha scritto:

Facciamo una cosa: pubblica il codice che usi, copiandolo pari-pari... per
favore.


Lupo scusami, non posso metterti il codice pari-pari come dici tu, sono dati
sensibili
ti ho scritto un rutine al volo che tuttavia esprime il concetto

[Maurizio A. = 
circa...@tim.it
 in c4gkq0$347$
1...@newsreader.mailgate.org
]
ha scritto:

Copia il codice di quella routine, non lo scrivere, semmai cambia i dati
sensibili...

 ti ho scritto un rutine al volo che tuttavia esprime il concetto
Ma se cosě fosse, e tu sei certo che un record con quell'ID c'č, la
FindFirst funzionerebbe....
vedere il codice please. :)
ciaociao


mi hai fatto riflettere lupo, infatti l'errore non era nel find quello era
OK
ma era a monte nel ciclo.
Ciao
grazie.


a parte che non sono Lupo....devo campare ancora qualche annetto per
arrivare alla sua eta! :-P
quindi stai dicendo che facendo una FindFirst con il campo di tipo data NON
delimitato dai #, e con quel formato, ti ritorna il record giusto?
mmmm.......
ciaociao

 giusto? mmmm.......
Dal suo ultimo codice (in due pezzi) la data non c'è più... :-(

 giusto? mmmm.......
Questo non sarebbe un problema.
Fa il format proprio per convertire la data in Char, e poi confronta i char.
Il problema al limite era che nel secondo operando del confronto, non ci
sono gli apicini.
Ciao
Alberto

[Albe V° = 
circa_vac...@hotmail.com
 in
c4goui$2ie154$
1...@ID-222113.news.uni-berlin.de
] ha scritto:

Albe, ehm, si parlava di FindFirst e di DAO+Access, mondo ... particolare
;-)

 particolare ;-)
Può essere. In effetti mi è un po' sconosciuto.
Vado però a logica:
format(Giorno,'mmddyyyy')=01012004
è un confronto strano.
Non è un confronto fra date (nessuno dei due operandi è data)
Non è un confronto fra char (il secondo operando non è char)
Non è un confronto fra numerici (il primo operando non è numerico).
Anche ammettendo che ci sia una sorta di conversione implicita da qualche
parte, la più probabile è la seconda, ossia la conversione del secondo
operando nel tipo del primo.
A questo punto entrerebbero in ballo gli 0, in quanto se le variabili con
cui compone la stringa sono in realtà dei numeri convertiti implicitamente
durante la concatenazione, la data che riporto sopra apparirebbe come
112004, e sicuramente il match non funzionerebbe.
O proprio non ho capito niente di Dao?
Alberto

 O proprio non ho capito niente di Dao?
Hai ragione, ma parti da presupposti standard.
Io non escludo che qualche altro formato funzioni, ma verso Access (DAO o
ADO che sia) le date nel formato (comunque sia la localizzzione)
#MM/GG/AAAA#, senza apici e con / come separatore, vanno sempre.

[Lupo = 
circa_LupoOrm...@libero.it
 in
c4gpih$2i8fbt$
1...@ID-174464.news.uni-berlin.de
] ha scritto:

Dall'help di FindFirst:
Quando si eseguono ricerche in campi contenenti date è necessario utilizzare
il formato data americano (mese-giorno-anno) anche se non si sta utilizzando
la versione americana del modulo di gestione di database Microsoft Jet;
altrimenti i dati potrebbero non essere individuati. Per convertire la data,
utilizzare la funzione Format di Visual Basic. Ad esempio:
rstImpiegati.FindFirst "DataDiAssunzione > #" & Format(miadata, 'm-g-aa' ) &
"#"


E inoltre per fare un format(Giorno,"mmddyyyy"), il campo Giorno *deve*
essere di tipo data.
Dico bene o dico male?
ciaociao


Certo. Infatti avrebbe più senso convertire il confronto in un confronto fra
date.
Quello che facevo notare era semplicemente che di confronti fra date, in
quel findfirst postato, non ce ne sono.
Alberto

 Dal suo ultimo codice (in due pezzi) la data non c'è più... :-(
Credo sia solo per prova (leggasi "spero") ;-)
ciaociao

[Marg = 
circa...@inwind.it
 in
c4gpqr$2iqa0e$
1...@ID-193795.news.uni-berlin.de
] ha scritto:

Diresti bene, ma non è vero (salvo conversioni implicite...)
Dim giorno As String    'Va anche senza questa istruzione (quindi per giorno
pari a un Variant)
giorno = "01-04-2004"    'Il mio separatore date è -
a = Format(giorno, "mmddyyyy")

 'm-g-aa' ) & "#"
Lupo, quello è il Format di visualBasic, che agisce prima della
concatenazione.
Maurizio usava il Format del motore (Dao, Jet, e chi lo sa...), che agisce
dopo la concatenazione.
Quindi l'operatore = la data non la vedeva neppure...
Ciao
Alberto

 agisce dopo la concatenazione.
Mmmm, non ne sono così sicuro... VB viene prima e il format ... anche
Forse non ho ben capito cosa intendi... a me pareva che componesse una
stringa da passare alla FindFirst...

[Lupo = 
circa_LupoOrm...@libero.it
 in
c4gq7b$2glvuu$
1...@ID-174464.news.uni-berlin.de
] ha scritto:

Arghhhh! Hai ragionissima: la Format stava all'interno della stringa ("...
AND Format..."), passato pari pari al motore. Oltretutto mancava il nome del
campo dopo l'AND). Pardon.

 stringa da passare alla FindFirst...
Esatto:
S1$ = "ID = " & "'" & cu & "'" & " AND format(Giorno,'mmddyyyy')=" & m & g &
a
'Format' č DENTRO alla stringa. Giorno č un CAMPO di Access.
Il risultato della stringa composta sarebbe:
ID='123' AND format(Giorno,'mmddyyyy')=01012004
a meno che, m, g ed a non fossero numerici, nel qual caso la data potrebbe
essere 112004
Ciao
Alberto
-- 
Santo cielo, Magnum, si puň sapere cos'č questo baccano?
Higgins, posso spiegarle...
Credo non sia necessario.
Zeus, Apollo, a voi...


Ok, ma io intendevo dire il format all'interno della stringa, quindi quello
lasciato a JET, non quello di vb.
ciaociao

 ciaociao

 'Format' č DENTRO alla stringa. Giorno č un CAMPO di Access.
Sě, sě, avevo letto male (vedi mio post sopra). Credo che quella stringa
nemmeno funzioni.
Del resto Maurizio non ha mai pubblicato codice "vero", l'ha sempre "scritto
al volo, esemplificato", a volte aggiungendo, altre togliendo...

 stringa nemmeno funzioni.
Bene.
La cosa perň mi intrippa.
Adesso, se vuoi, potresti riprendere dal mio post delle 12.03?
ciao
Alberto

[Marg = 
circa...@inwind.it
 in
c4gqkd$2ia68f$
1...@ID-193795.news.uni-berlin.de
] ha scritto:

Sě, capito, ma ... ehm, io non credo che Maurizio volesse passare un Format
al motore, insomma nel suo post iniziale mancano un po' di doppie virgolette
aperte e chiuse, come tu hai correttamente indicato nel tuo secondo/terzo
post e anche il nome del campo.
Quando dico che bisogna sempre pubblicare il codice che _si sta_ usando....

 Adesso, se vuoi, potresti riprendere dal mio post delle 12.03?
Non ho niente da dire su quel post, nel senso che lo trovo logico.
Riferendoci però alla sintassi che Access s'aspetta, le date vanno passate
in quel modo che abbiamo detto.
Non so, in tutta sincerità, come funzioni il "Format del motore", non l'ho
mai usato...

 Non ho niente da dire su quel post, nel senso che lo trovo logico.
Allora si spiega tutto in un altro modo: c'č da qualche parte un On Error
Resume Next, il Findfirst genera errore, l'esecuzione prosegue ma non
risulta niente di trovato, e alla via cosě...
Ciao
Alberto

 usando....
quoto sicuramente!
ciaociao

 m & g & a
In una FindFirst?
Non insisto (anche perchč non credo di averla usata molto), ma che senso
avrebbe?
La Find-eccetera cerca su un recordset (o sbaglio?), mica cambia i contenuti
(o formati restituiti) dello stesso... Mi sbaglio?

 contenuti (o formati restituiti) dello stesso... Mi sbaglio?
No, non cambia i formati restituiti, ma è possibile convertire un tipo di
dato semplicemente per il confronto. Poi i tipi di dato dei campi del record
trovato rimangono ovviamente quelli originali del recordset.
E' come se tu avessi un campo di tipo testo, ma volessi confrontare il suo
valore numerico con un integer per cercare il record:
dim i as Integer
dim xr as recordset
i=145
'poniamo che il campo "pippo" sia testo ma che contenga numeri,
'questa ricerca si può fare, e il record restituito avrà comunque "pippo" di
tipo testo
xr.FindFirst "Val(pippo)=" & i
allo stesso modo ha fatto lui con il campo Giorno, solo che non ha
convertito il tipo di dato, ma l'ha solamente formattato
ciaociao

 convertito il tipo di dato, ma l'ha solamente formattato
Emh...
Alberto

 .NoMatch risulta sempre vero, ma il record nel db è presente.
scusatemi...
di cose da dire ne avete....cmq non è importate questo...
il codice che ho postato si effettivamente lo scritto al volo
non ho fatto un copy paste pertanto mancavo parti che
probabilmente vi avrebbero fatto capire meglio
il costrutto
usare: format(campodata"Type=date",'ddmmyyyy')=" & dataquery
funziona perfettamente... certo con l'istruzione format sono io che decido
il formato non access.
quest'ultima si può usare benessimo dentro una normalissima select in DAO
e solo un dei tanti modi di passare un criterio date....
c'è chi usa #mm/dd/yyyy# e che no.
se non credete provateci.
ciao


non è questione di crederci o no, è solo che se la "regola generale"
(passatemi il termine) per l'utilizzo delle date in Access, è quella di
usare # come delimitatore e di passare le date nel formato "mm/dd/yyyy",
sarebbe meglio farlo. Tutto qui.
Se credi che i nostri consigli non siano utili, pazienza. (il tutto senza
offesa)
ciaociao

 Alberto
ciaociao

 ciaociao
no... io i vs. consigli gli accetto volentieri ci mancherebbe altro
non sono mica arrivato eh...
cmq lo so la regola, almeno dalla guida di access, si capisce
la vuole con il "#" il punto è che mi sembra poco pulito...
tutto qua.


Ok, come vuoi. Comunque alla fine non ci hai detto cosa c'era che non
andava! ;-)
ciaociao

 ciaociao
ah vero...
avevo messo in posizione sbagliata la riga di apertura
alla tabella...
ciao
Maurizio