Newsgroup: it.comp.lang.visual-basic
Titolo: AbsolutePosition

Ciao a tutti.
Dopo la cancellazione di un record utilizzo la proprietą
AbsolutePosition per posizionarmi sul record precedente a quello appena
cancellato.
Ho notato perņ una cosa che non mi č chiara.
Se cancello il primo record (che ha AbsolutePosition=0) e poi faccio la
requery mi aspetterei di volermi riposizionare ancora sul valore 0 che
identificherebbe il primo record della nuova query, ma quando lo faccio
il compilatore mi dą errore. Diversamente funziona se setto il valore di
AbsolutePosition=1.
Questo č logico?
Grazie!
Max
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG





Max Bertoli wrote:
non ho il vb6 sotto mano...ma 
l'msdn di net comprende anche l'help di ado 2.7


che spiega bene!


cito:




AbsolutePosition 
Property


Indicates the ordinal position of a 
Recordset
 object's current 
record.


Settings and Return Values


Sets or returns a Long value from 1 to the number of 
records in the Recordset object (
RecordCount
), or returns 
one of the 
PositionEnum
 
values.


Remarks


Accessing the AbsolutePosition property of a 
Recordset that was opened with either a forward-only or dynamic cursor raises 
the error adErrFeatureNotAvailable. With other cursor types, the correct 
position will be returned as long as the provider supports the IRowsetScroll 
interface. If the provider does not support the IRowsetScroll interface, the 
property is set to adPOSUnknown. See the documentation for your provider to 
determine whether it supports IRowsetScroll.


Use the AbsolutePosition property to move to a record 
based on its ordinal position in the Recordset object, or to determine the 
ordinal position of the current record. The 
provider
 must support the 
appropriate functionality for this property to be available.


Like the 
AbsolutePage
 property, 
AbsolutePosition is 1-based and equals 1 when the current record is the first 
record in the Recordset. You can obtain the total number of records in the 
Recordset object from the 
RecordCount
 
property.


When you set the AbsolutePosition property, even if 
it is to a record in the current cache, ADO reloads the cache with a new group 
of records starting with the record you specified. The 
CacheSize
 property 
determines the size of this group.




Note   You should not use the 
  AbsolutePosition property as a surrogate record number. The position of a 
  given record changes when you delete a preceding record. There is also no 
  assurance that a given record will have the same AbsolutePosition if the 
  Recordset object is requeried or reopened. Bookmarks are still the recommended 
  way of retaining and returning to a given position and are the only way of 
  positioning across all types of Recordset objects.


-- 
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



"Wodka4u(Nbook)"  ha scritto:
(snip)
Leggendo e traducendo sembrerebbe che AbsolutePosition non possa mai essere
0.
Capito, Max?
Salutoni
Sergio


e mi permetto di dire anche....che è sbagliato
considerarlo come un Bookmark!
Quindi se cancelli o aggiungi absolute non serve...come dice chiaramente la
strada sono in questo caso i bookmark....
ANZI a consiglio mio ....se devi ritornare in un punto preciso del db dopo
aver fatto qualcosa....
"SELECT * FROM Tabella Where CODunivoco= " & cstr(ValoreACuideveTornare)
butta via un campo (se non ce l'hai già) per "segnare" i records e campa
tranquillo!
(si capisce che odio bookmarks e roba affine....anche perchè...bookmark lato
server li accetta???..boh mai provato...Sergio hai provato?)


 Sergio
Ciao!!


 hai provato?)
Mai.
Credo di non aver, in assoluto, mai utilizzato i bookmark.
Salutoni
Sergio

 di AbsolutePosition valeva 0
Lo snip della guida riportato da wodka sembrerebbe indicare che
AbsolutePosition non vale mai 0, tu affermi che qualche volta succede?
Non è che per caso sei al BOF?
Altra domanda: quella variabile pos che utilizzi nel codice, che cosa
rappresenta e come viene determinata?
Salutoni
Sergio

 [Max Bertoli] scrisse:
Caro MAX...mi hai messo la "pulce nell'orecchio"
e in questi 15 min....tel permettendo ho buttato giù un esempio
NO NO NO NO NO
scazzi qualcosa
la guida ha ragione....Absolute parte da 1 !!!
se non ci credi ti metto on line un esempio e ti convinci da te!
io mi concentrerei sul pezzetto che ti ho postato
"
Note   You should not use the AbsolutePosition property as a surrogate
record number. The position of a given record changes when you delete a
preceding record. There is also no assurance that a given record will have
the same AbsolutePosition if the Recordset object is requeried or reopened.
Bookmarks are still the recommended way of retaining and returning to a
given position and are the only way of positioning across all types of
Recordset objects.
"
il succo è tutto li!
Occhio che se è una applicazione "della domenica" a scopo didattico...siamo
un po tolleranti e ti diciamo che è sbagliato
MA
se è una app "seria" OCCHIO!!! che è causa di possibili "ARROSTI"
e sai come si dice
"ci metti una vita a farti una reputazione (commerciale)
ed un minuto a rovinarla!"
Usa altro per riposizionarti.....poi fa te!


*CSSoft* ha scritto:

Compatibilmente col cursore, li accetta. Vedasi ESP0DAMA.

 Recordset objects.
Se AbsolutePosition mi ritorna il numero del record 
(diciamo così per semplicità) allora prima di cancellare io posso
verificarne il valore e sapere dove mi trovo esattamente.
Tolto il record e rifatta la stessa query (quindi stessi dati a meno
di un record) io otterrò uno shiftamento dei valori di posizione del
record. Sui test che ho fatto non ho riscontrato problemi, fino al caso
limite: sul primo record. Quando sono su questo primo record verifico 
il valore della AbsolutePosition e mi dà 0! Io mi chiedo perchè se tu 
mi insegni che deve essere 1? Tutto qua. Io non faccio altro...
Sto testando col codice aggiornato e sembra funzionare bene... Terrò
comunque d'occhio il problema perchè una cosa non chiara può portare 
a problemi imprevisti.
Non ho utilizzato i bookmark semplicemente perchè ho fatto un
ragionamento
 (magari sbagliato) e cioè: se metto un bookmark su un record che poi
cancello, quando ci ritorno come va a finire? Allora ho pensato
all'absoluteposition...


 cancello, quando ci ritorno come va a finire?
caso mai ti da un errore che puoi intercettare e muoverti di conseguenza???


 all'absoluteposition...
ehm... il bookmark servirebbe proprio a quello...
Salutoni
Sergio

 indirizzo...secondo te il tuo record 10 corrisponde al SUO record 10???
Questo č chiaro. Ma perchč allora io mi ritrovo con il valore 0 se non č
possibile averlo?
Scusa se insisto, ma ti porto un esempio e tu dimmi se č sbagliato per te!
prima della cancellazione su una tabella con chiave primaria (tra parentesi
l'absoluteposition):
(1) Ciccio
(2) Mario
(3) Pippo
(4) Titti
Cancellazione di Mario e Requery.
(1) Ciccio
(2) Pippo
(3) Titti
Secondo te non avviene cosě? Le prove empiriche mi hanno confermato che č
cosě.
Purtroppo non riesco a spiegarmi perchč nel primo caso (Ciccio) mi ritrovo
con AbsolutePosition = 0.

 Secondo te non avviene così?
non importa come la penso io...non l'ho fatto io!
Importa come la pensano gli ingegneri di Microsoft
e loro ti dicono ESPLICITAMENTE di non farci affidamento!...poi è 3 post che
ci "rintigni"!
Probabilmente si fa la sua struttura nella cache...tu cancelli ...'stà cache
vien toccata e non riporta più il vero...che ne so!
Manda una email alla microsoft e chiedili il perchè
quello che so è che (per l'ennesima volta):
"
Note   You should not use the AbsolutePosition property as a surrogate
record number. The position of a given record changes when you delete a
preceding record. There is also no assurance that a given record will have
the same AbsolutePosition if the Recordset object is requeried or reopened.
Bookmarks are still the recommended way of retaining and returning to a
given position and are the only way of positioning across all types of
Recordset objects.
"
NOTA QUESTO
The position of a given record changes when you delete a
preceding record.
probabilmente fa un redim e si trova con un buco lì.... che ne so!Anzi
probabilmente il primo record varrebbe uno....lo cancelli ...la variabile
viene distrutta...ma siccome fa parte di una cache....la distruzione
equivale a porre a zero quella posizione di memoria...
Siccome NON hai un puntatore alla variabile in memoria
ho il sospetto che se cancelli il record 45 in quella posizione di memoria
ci scrive 0...ma non la vedi perchè è mascherato...
caso particolare il primo record coincide (forse) con la zona di memoria e
Absolute leggendo quel record, legge quella locazione, ed  entra in inganno
e riporta ZERO
Ecco un motivo in + per non usarla!!!
Ma questo lo ipotizzo e NON LO SO!
SO INVECE  che la usi in modo improprio.......non lo dico io lo dice
Microsoft....
POI se continui a usarla così.....non chiedere a noi...chiedi a
Microsoft...e poi facci sapere che rispondono!
Aiuterai la cultura di tutto il NG! Ciao!
:-)


 record number.
D'accordo al 100%, infatti io intendo sapere in modo ASSOLUTO la posizione
di un record all'interno della tabella.
Ad ogni modo terrò d'occhio il comportamento che ho ottenuto facendo la
modifica citata nei post precedenti e se si mantiene stabile assumerò una
mia verità.
Grazie di nuovo.
Max

 Max
Ciao e in bocca a Lupo!
:-P


 :-P
Chiamato esplicitamente in causa, ho voluto vedere 'sta AbsolutePosition che
non ho mai usato (nei database il concetto di numero record dovrebbe essere
bellamente ignorato). Comunque, come dice la quida (che riporto in calce):
In DAO:
======
Ho provato:
E' in base 0, ovvero 0 indica che si sta sul primo record, RecordCount-1 che
si sta sull'ultimo. -1 se si è in BOF e/o in EOF. Cos'altro c'è da capire?
Aprire un recordset e, se ha records, fare rs.MoveFirst. AbsolutePosition
vale 0. Fare (se lo supporta) rs.MoveLast e t=rs.recordCount.
AbsolutePosition vale rs.Recordcount-1. Fare ora rs.MoveNext. Si alza EOF e
AbsolutePosition vale -1 (così come se si fosse in BOF).
Si noto il palese consiglio di non usare tale proprietà per "numerare" i
record e la nota in caso di eliminazione:
La proprietà AbsolutePosition ha un valore basato sullo zero, ossia
l'impostazione fa riferimento al primo record nell'oggetto Recordset. Non è
possibile pertanto impostare un valore maggiore o uguale al numero di record
contenenti dati, poiché tale operazione provoca un errore intercettabile. È
possibile determinare il numero di record contenenti dati nell'oggetto
Recordset controllando l'impostazione della proprietà RecordCount.
L'impostazione massima consentita per la proprietà AbsolutePosition è il
valore della proprietà RecordCount meno 1.
Se non c'è un record corrente, come avviene quando non ci sono record
nell'oggetto Recordset, viene restituito il valore –1. Se il record corrente
viene eliminato, il valore della proprietà AbsolutePosition non viene
definito e se il record ha un riferimento, si verifica un errore
intercettabile. I nuovi record vengono aggiunti alla fine della sequenza.
Questa proprietà non deve essere utilizzata come un numero di record
sostitutivo. I segnalibri costituiscono sempre il modo più consigliabile per
mantenere e ritornare ad una determinata posizione e rappresentano l'unico
modo per posizionare il record corrente per tutti i tipi di oggetti
Recordset. In particolare, la posizione di un determinato record cambia con
l'eliminazione di uno o più record che lo precedono. Non è sicuro inoltre
che un determinato record avrà la stessa posizione assoluta nel caso in cui
l'oggetto Recordset sia creato di nuovo, perché l'ordine dei singoli record
all'interno di un oggetto Recordset non è garantito a meno che non sia stato
creato con un'istruzione SQL utilizzando la proposizione ORDER BY.
 IN ADO:
=======
Ho provato:
E' in base 1, ovvero 1 indica che si sta sul primo record, RecordCount che
si sta sull'ultimo. -2 (chissà perchè) se si è in BOF e -3 (chissà perchè)
se si è in EOF. Sembrerebbe quindi che non possa mai valere 0, in ADO.
Cos'altro c'è da capire?
Aprire un recordset e, se ha records, fare rs.MoveFirst. AbsolutePosition
vale 1. Fare (se lo supporta) rs.MoveLast e t=rs.recordCount.
AbsolutePosition vale rs.Recordcount. Fare ora rs.MoveNext. Si alza EOF e
AbsolutePosition vale -3 (se si fosse in BOF vale -2).
Si noto il palese consiglio di non usare tale proprietà per "numerare" i
record e la nota in caso di eliminazione:
AbsolutePosition Property
Indicates the ordinal position of a Recordset object's current record.
Settings and Return Values
Sets or returns a Long value from 1 to the number of records in the
Recordset object (RecordCount), or returns one of the PositionEnum values.
Remarks
Use the AbsolutePosition property to move to a record based on its ordinal
position in the Recordset object, or to determine the ordinal position of
the current record. The provider must support the appropriate functionality
for this property to be available.
Like the AbsolutePage property, AbsolutePosition is 1-based and equals 1
when the current record is the first record in the Recordset. You can obtain
the total number of records in the Recordset object from the RecordCount
property.
When you set the AbsolutePosition property, even if it is to a record in the
current cache, ADO reloads the cache with a new group of records starting
with the record you specified. The CacheSize property determines the size of
this group.
Note   You should not use the AbsolutePosition property as a surrogate


Lupo wrote:
CUT
č beh!
son...conta quanti post che glielo diciamo....
vediamo se a te da piů retta!
Ciao!
ed il solito Bau e Miao!
:-)
--
Il Wodkino Nazionale č a : 
www.martek.it


 vostri (pratica diffusa e vista in varie occasioni purtroppo!)
CONCORDO, PERO'...
Ripeto: questa applicazione non viene fatta pagare a nessun cliente.
Ti assicuro che quando devo far pagare un'app a terzi lascio da parte
le prove e le ricerche (salvo nei casi in cui è necessario non farlo)
e mi affido alle *poche* conoscenze acquisite.
La stiamo forse mettendo sul personale??????


 La stiamo forse mettendo sul personale??????
NO!
ADO č nato come tecnologia di accesso ai dati
Usa Absolute insieme alla paginazione in una pagina ASP
ad esempio in un catalogo con tanti artioli divisi su piů pagine
serve a fare
Rec 78/129
Ad esempio!
č una indicazione di dove sei rispetto al principio o alla fine ....serve a
poco...ma quando serve c'č!
Ciao!
--
Il Wodkino Nazionale č a : 
www.martek.it


 CUT
Altro uso...battuto troppo in fretta invio....
Stai processando in maniere lenta tanti record....
ti conta quello che stai processando......
aggancia recordCount al volore Max
e absolute al valore di una progressBar
che ottieni?.....
AD ESEMPIO!
ri ciao!
--
Il Wodkino Nazionale è a : 
www.martek.it
