Newsgroup: it.comp.lang.visual-basic
Titolo: rs.EOF e rs.BOF...PUF CIAFF e SUZOK!

A parte l'ironia dell'oggetto, ma l'argomento e' sorto qualche mio post fa
con Lupo se non sbaglio.
Ora ve lo porgo sotto l'aspetto di un nuovo thread:
o ho un form dove visualizzo ogni singolo record di un recordset.
Nel form ci sono due frecce per scorrere in avanti e indietro i
record(classicissimo), come faccio per disabilitare un tasto quando mi trovo
all'ultimo record o al primo?
Io ora faccio il controllo su rs.recordcount. Se e' 1 disabilito la freccia
"precedente", poi ogni volta che visualizzo faccio una count dei record e
sempre con rs.recordcount se questo è uguale alla count disabilito il tasto
"next".
Funziona.
Ma io mi domando, EOF e BOF diventano true una volta passato il record e mi
trovo oltre il recordset giusto?
Io non ho,ad esempio, EOF quando sto all'ultimo (ma non ho "sforato"
cercando di leggere il successivo) vero?
...cacchio piu' cerco di essere semplice e piu' invece faccio discorsi
contorti. Se non capite premete F1.
'notte
Capellaus

 contorti. Se non capite premete F1.
Cerca di capire che il primo e l'ultimo record sono comunque all'interno del
recordset, pur se ai limiti.
Cosa c'è prima del primo o dopo l'ultimo elemento di una qualsisa serie
(lattine di birra, sigarette o gnocche)?
Il vuoto, il nulla! Ovvero, guardacaso, il BOF e l'EOF...

 cercando di leggere il successivo) vero?
allora ho provato a fare un test, nuova form ,
oggetto data boundato a un db con una tabella con 3-4 record
un textbox boundato per visualizzare il campo
ho messo 2 tasti e 2 label
------------------
Option Explicit
Private Sub Command1_Click()
 Data1.Recordset.MovePrevious
 stato
End Sub
Private Sub Command2_Click()
 Data1.Recordset.MoveNext
 stato
End Sub
Private Sub stato()
    Label1.Caption = Data1.Recordset.EOF
    Label2.Caption = Data1.Recordset.BOF
End Sub
------------------
ora ho notato una cosa , che prima che mi venga generato un errore si
valorizzano le variabili Eof e Bof
quindi cosa puoi fare ? fai un movenext in + o un moveprevius in +
prova questa variante brutale :
--------------------
Option Explicit
Private Sub Command1_Click()
 Data1.Recordset.MovePrevious
 stato ("prev")
End Sub
Private Sub Command2_Click()
 Data1.Recordset.MoveNext
 stato ("next")
End Sub
Private Sub stato(direzione As String)
    'valuto se c'e' qualcosa prima
            Data1.Recordset.MovePrevious
            Command1.Enabled = Not Data1.Recordset.BOF
            Data1.Recordset.MoveNext
    'valuto se c'e' qualcosa dopo
            Data1.Recordset.MoveNext
            Command2.Enabled = Not Data1.Recordset.EOF
            Data1.Recordset.MovePrevious
    Label1.Caption = Data1.Recordset.EOF
    Label2.Caption = Data1.Recordset.BOF
End Sub
--------------------
bene, quindi ora non ti resta che rendere decente il codice, il concetto e'
quello cmq !
-- 
<Gigio2K>
Sito Comune
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/

 valorizzano le variabili Eof e Bof
No, cazzarola, non diffondiamo notizie false e ... tendenziose ;-) :
se il recordset non è vuoto, si valorizza la variabile (proprietà) Eof
_OPPURE_ la variabile (proprietà) Bof
Se poi i Data-eccetera fanno quel che dici, sono merde ben più puzzolenti di
quanto già non siano già universalmente (tranne qualche masochista)
riconosciute.

 masochista) riconosciute.
ma dai scusa io la vedo logica :
Dentro il recordset ho :
EOF FALSE
BOF FALSE
se sono al primo record e mi muovo PRIMA avro' :
EOF FALSE
BOF TRUE
se mi muovo ancora viene generato errore !
se sono all'ultimo record sto :
EOF FALSE
BOF FALSE
se mi muovo avanti avro'
EOF TRUE
BOF FALSE
se mi muovo avanti ancora mi si genera un errore , perche' scusa senza
l'oggetto data (da me amato e da te odiato) come funziona la cosa ?
prova il codicillo un secondo e te ne renderai conto che e' tutto normale
:-/
maro' sento aria di una delle nostre diatribe !!! (bello bello, non vedo
l'ora di iniziare)


 Il vuoto, il nulla! Ovvero, guardacaso, il BOF e l'EOF...
Ma allora vedi che ce l'ho dopo?

 valorizzano le variabili Eof *e* Bof
Quella "e" fra Eof e Bof, doveva essere una "o".
Non sono un sofista della lingua, ma sai bene quanto, in informatica (anche
nella lingua), una And sia mooolto diversa da una Or.
No?!

 quindi cosa puoi fare ? fai un movenext in + o un moveprevius in +
Si vabbe' ma a questo punto utilizzo la .Recordcount, no?
ciao
Capell1

 Ma allora vedi che ce l'ho dopo?
Sě, lo vedo, lo vedo cosa c'hai dopo...

 Si vabbe' ma a questo punto utilizzo la .Recordcount, no?
Nooooooooooooooooooooooo!!!
Il RecordCount ti dice quanti record ci sono e sarà sempre quello, non ti
dice se sei prima dell'inizio, all'interno o dopo la fine. Non c'entra 'na
mazza!!!

 Quella "e" fra Eof e Bof, doveva essere una "o".
a si , informaticamente ci vuole la Or ma era una scorciatoia grammaticale
per non scrivere "si valorizza la variabile eof prima dell'uscita dal rcs e
della bof prima del entrata nel rcs..."
^_^ PIGNOLO !


 c'entra 'na mazza!!!
e poi il recordcount e' soggetto a scatenare errori ANCHE senza tener conto
di eof e bof , in pratica a capellone non gli serve il Rcount !!!!


 ... per non scrivere "si valorizza la variabile eof dopo l'uscita dal rcs
...
ora che hai combinato il guiai, in altri rami te la scazzi tu, vero?! ;-)

 chiacchierare :-/
Non t'arrabbiare.
Mi riferivo a quella erronea *e* che, come vedi, è stata immediatamente
recepita, sempre erroneamente.

 ora che hai combinato il guiai, in altri rami te la scazzi tu, vero?!
O_o oddio ma l'ho scritto io quella cosa ? emm emm ... vabbe' HO SBAGLIATO
CI VOLEVA LA "O" ... qui mi inguaio ogni nuovo post ... :-/


 Il RecordCount ti dice quanti record ci sono e sarà sempre quello, non ti
.... :o|
hai ragione..su questo.
A Lu', non voglio provocare nessuno (sono un pacifista...pero' un po
polemico:) ),
pero' secondo te perche se il recordset e' vuoto ho eof/bof a true? Se non
ci sono record vuol dire che sto fuori dal recordset, no?
Comunque fai un debug, e vedi quando eof e bof diventano true.Non quanto sto
al primo/ultimo, ma quando li supero.
Cap.

 rs.movenext.
Fermi con quel rasoio ...volevo dire rs.movelast. !!!!!

 Fermi con quel rasoio ...volevo dire rs.movelast. !!!!!
Azz.. salvato in corner....


 al primo/ultimo, ma quando li supero.
Confermo e preciso ancora: Se il recordset ha records, BOF è vero quando ti
sposti prima del primo, EOF è vero quando ti sposti dopo l'ultimo. Se, lo
ribadisco, il recordset ha records, non saranno MAI veri entrambi!!!!

 wrote in message

Non esagerare, ora: MoveLast non ti darà mai EOF (nè BOF) se il rs ha
records. Va sull'ultimo (non oltre l'ultimo). Se il rs non ha records non
puoi, non devi far altro (niente altro!) che chiuderlo!

 ribadisco, il recordset ha records, non saranno MAI veri entrambi!!!!
*************************************************************
...ma stai dicendo quello che intendo io.
Forse non mi sono spiegato bene....Gigio, ma tu mi avevi capito?Dai dimmi
che mi capisci ti prego...
se non rispondo e' perche' sono andato a letto.
Lupo risparmiati la risposta "va che e' meglio" :)

 dimmi che mi capisci ti prego...
io ho capito quello che ho capito, e non rispondo fino a domani che qui ogni
post che faccio mi infogno :p
cmq si, ho capito entrambi !


[*Lupo* : 
LupoOrmaiR...@libero.it
] ha scritto:

Insomma, e per finire (non provato):
Supponiamo di aver appena aperto il recordset su rs:
If rs.BOF And rs.EOF Then
    If MsgBox ("Non ci sono records! Vuoi comunque triturarti i
gioielli?",vbYesNo+vbDefaultButton2+vbQuestion)=vbYes Then
        Stop
        End
        SystemShutDown
        SystemExplosion
        KillUserAndHeatIt
        VaporizeWindows
    End If
End If
    If rs.BOF Then
        MsgBox "Sei prima dell'inizio"
    End If
    If rs.EOF Then
        MsgBox "Sei oltre la fine"
    End If
Do
    azione=MsgBox("Avanti=Sì/Yes, Indietro=No/No, Fine=Annulla/Cancel
(ovviamente ti cucchi ogni eventuale errore)",vbYesNoCancel+vbQuestion)
    Select case azione
        case vbYes
            rs.MoveNext
        case vbNo
            rs.MovePrevious
        case vbCancel
            Exit Do
    End select
Loop
MsgBox "Capito???!!!"
End

 Lupo risparmiati la risposta "va che e' meglio" :)
Affatto! Ora leggi anche l'altro post e lo provi, magari correggendo quello
che ho scritto e non provato.
Vai a letto quando avrai compreso perfettamente.
Seriamente: Ne va della corretta funzionalitą di ogni tuo programma.

[*Lupo* : 
LupoOrmaiR...@libero.it
] ha scritto:
Anzi, sposta il Do prima di queste istruzioni:


 Vai a letto quando avrai compreso perfettamente.
'notte..ptchiu!(se non leggi/leggevi i fumetti sappi che non sto sputando)
CapelBof!

 Non dico altro altrimenti andiamo in loop.
Finalmente siamo d'accordo. Insoddisfatti, ma d'accordo.

 > > ...ma stai dicendo quello che intendo io.
Credo tutto sia nato da questa mia frase:
"> Ma io mi domando, EOF e BOF diventano true una volta passato il record e
mi trovo oltre il recordset giusto?"<
io qui non intendevo che se vado oltre l'ultimo ho anche .BOF a vero.
Quello che intendevo e' che se dall'ultimo faccio ancora una movenext allora
rs.eof = true.
O ancora, se sto al primo record e faccio una rs.moveprevious allora rs.bof
diventa true.
e con questo concludo veramente.
rinotte.

 e con questo concludo veramente.
Ora capisci che BOF e EOF entrambi a True hanno un altro significato, pur se
convenzionale, ma assolutamente preciso e non riproducibile con un rs CON
records?

> e con questo concludo veramente.
anche perche' qui siamo ormai nella fantainformatica :-(
Ma un c@%%0 di libro non se lo studia proprio nessuno?
-- 
ciao, hal
p.s. invidio Lupo per la tenacia e la pazienza ;-)

Capellone da casa wrote:
Non ho letto tutto il 3ad...mi son perso nella discussione tra li "o " e li
"e" tra Lupo e Gigio
Non me ne frega un caz della teoria...ma solo della pratica (come diceva
John Holmes!)
SE e ripeto SE
apri un recordset per vedere se contiene qualcosa "basta" fare il test
if rs.bof then
.....
Spostamento
indietro
rs.open
If.rs.bof then
    rs.movefirst
    disattiva il tasto di "indietro"
    cmdIndietro.enable=false
end if
ribaltalo per il "muovi avanti"
e integralo per riattivare i tasti che hai disabilitato
Come faccio a vedere dove sono???
eh eh
rs.recordcount (o una query se lavori server) ti da il numero di records
totali
il record corrente???
che ci sta a fare absolutePosition?
quindi ....pensa di piazzarlo nella statusBar o in una label o dove vuoi tu
"Record " & rs.Absoluteposition " di " &  rs.RecordCount
AVVERTENZE:
sono idee didattiche... il codice cosi come è non va!
Schiaccia f1 e guarda come vanno usate 'ste proprietà!Usa Cstr() per
convertire numeri in testo etc etc...
Attenzione ad absoluteposition non farti tentare! Usala solo per
visualizzare record...se ne cancelli uno prima o inserisci...non puoi farci
affidamento!...va benissimo per fare giochetti del tipo "Sei al record 12 di
1241 " se ne inserisci uno devi fare un requery e riaggiornarlo!Ma non farci
altro...checchè ne dicano molti!
E' una forzatura ed è a tuo rischio e pericolo!
P.s.
è una forzatura anche il testare all'apertura di un recordset SOLO il bof!
ma la documentazione dice che se un recordset è vuoto EOF e BOF son veri e
va testai entrambi!
Ma io .....
... sfruttando il fatto che se apri un recordset si posiziona se c'è
qualcosa AL PRIMO record...io testo SOLO il bof....certo che se M$ mi cambia
'sto fatto son fottuto!ma fino ad ado 2.7 funziona sto metodo!
ma ....
Il futuro è nelle pazze mani di quegli ubriaconi di microsoft!
Saluti!
:-)
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

 p.s. invidio Lupo per la tenacia e la pazienza ;-)
Anchio

E i messaggi non se li legge mai nessuno 2 volte?
Certi messaggi e' gia' troppo leggerli una volta sola ;-)
-- 
ciao, hal