Newsgroup: it.comp.lang.visual-basic
Titolo: [?] [SQL] [~OT] progressivo record?

Domanda su SQL: Se io ho la mia bella
SELECT * FROM MiaTabella WHERE campo = <Valore>
E' possibile avere un campo nel recordset che mi dica il numero di record
per ogni record?
Ok, facciamo un esempio :P
vorrei ottenere un recordset del tipo:
1 | record1    | ...
2 | record3    | ...
3 | record57   | ...
Esiste cioè qualcosa tipo
[pseudo SQL]
SELECT COUNTER, * FROM MiaTabella
?
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

 vorrei ottenere un recordset del tipo:
dimmi cosa hai mente e ti diro' cosa vuoi ottenere :)
ciao, j.


 SELECT COUNTER, * FROM MiaTabella
In FoxPro c'era qualcosa del tipo Select RecordNum,* from Tabella
ma FoxPro era posizionale, per cui la cosa aveva un senso.
Tuttavia, il numero che tornava era la posizione del record nella tabella,
non un progressivo interno alla query stessa (come mi sembra che tu voglia).
Con Access e Sql-Server/MSDE non conosco niente.
Ma seguo con interesse il thread perchè la cosa potrebbe essere utile.
Resta comunque valida la possibilità di leggere Recordset.Bookmark quando ci
si trova sul record desiderato.
ciao
Alberto

 dimmi cosa hai mente e ti diro' cosa vuoi ottenere :)
Lo sapevo... :P
Voglio semplicemente avere un campo nel recordset restituito che mi dica il
numero del record corrente.
Qualcosa cioè come l'AbsolutePosition ma già dall'interno del recordset in
modo da sapere il numero del record corrente con
RecordCorrente = rsMyRecordset("INDICE")
Chiaro ora? ;)


 ha scritto nel messaggio
news:aqqn97$mr3$1...@monty.lombardiacom.it...
...Non credo ai miei occhi:
ZANNA con un [?]...     ;-)
Non ho capito bene: in pratica vuoi un "numero record"?
Usa un campo contatore e includilo nella select.
...ma è questo che vuoi?
ciao
ugo

 ...ma è questo che vuoi?
Albe V° ha capito perfettamente il problema.
Usare un campo contatore non ha senso per me, poichè non è dinamico ne
rispetto alla tabella ne tantomeno rispetto alla query.


 rispetto alla tabella ne tantomeno rispetto alla query.
Solo se esiste un campo su cui si possa usare un operatore <, e
rigorosamente univoco (una chiave o un contatore va benissimo):
select pg1.*,
numero=
    (select count(1)
    from prove_gruppo as pg2
    where pg2.num2<pg1.num2
    and pg2.num1<3)
from prove_gruppo as pg1
where pg1.num1<3
Notare le due condizioni:
pg2.num2<pg1.num2
serve per effettuare il conteggio, quindi num2 nella mia tabella č un campo
univoco (diciamo ad esempio un Identity)
pg1.num1<3 e pg2.num1<3
E' la vera condizione di where, quella che viene dalla logica
dell'applicativo. Purtroppo deve essere ripetuta due volte.
Passando attraverso tabelle # o ## si poteva rendere piů leggibile.
Comunque dimenticati le performance se hai molti record (nel caso, meglio
anche iniziare con un CAST (select count.....) AS DECIMAL, per dare capienza
alla colonna che deve contenere il contatore).
Ciao
Alberto

 Comunque dimenticati le performance se hai molti record
Dimenticavo un'altra limitazione: devi aggiungere un order by pg1.num2 alla
fine, ed è l'unico order by possibile.
Ciao
Alberto

 where pg1.num1<3
Non ho ben capito il <3, comunque nel frattempo ne ho trovata una simile ma
forse più elastica:
SELECT COUNT(0)
FROM t1
INNER JOIN t1 AS t2
ON t1.campochiave <= t2.campochiave
GROUP BY  t1.campochiave
unico vincolo: la group by deve essere fatta sui campi che rendono univoco
il record.


 Non ho ben capito il <3
Quello è solo un esempio.
Equivale al Where Campo='Pippo', cioè è solo un filtro per prendere solo
alcuni record di una tabella più grande.
Ciao
Alberto

 Non funziona :( e non capisco il perchč...
Prova cosě (secondo me mancava un AS)
SELECT COUNT(0)
FROM prove_gruppo as t1
INNER JOIN prove_gruppo AS t2
ON t1.num2 <= t2.num2
GROUP BY  t1.num2
Perň ho un dubbio:
Secondo me, facendo cosě quando poi devi aggiungere gli altri campi del
record ti viene un poccio non indifferente, con tutti i max, min, avg,
ecc..., i campi testo, gli uniqueidentifier che non sono gruppabili, ecc...
Comunque se riesci ad utilizzarla cosě postala che mi interessa.
Ciao
Alberto

 GROUP BY  t1.campochiave
Non funziona :( e non capisco il perchč...

 ecc..., i campi testo, gli uniqueidentifier che non sono gruppabili,
ecc...
infatti così dovrebbe risultare read-only...
ciao
ugo

 infatti cosě dovrebbe risultare read-only...
A parte quello, mi riferivo a questo caso (notare che aggiungo un campo
t1.num1 che non č codice univoco, ma un campo numerico qualunque...)
SELECT COUNT(0),t1.num2,t1.num1
FROM prove_gruppo as t1
INNER JOIN prove_gruppo AS t2
ON t1.num2 >= t2.num2
GROUP BY  t1.num2
Server: messaggio 8120, livello 16, stato 1, riga 1
Column 't1.num1' is invalid in the select list because it is
not contained in either an aggregate function or the GROUP BY clause.
Da risolvere con
SELECT COUNT(0),t1.num2,max(t1.num1) as num1
FROM prove_gruppo as t1
INNER JOIN prove_gruppo AS t2
ON t1.num2 >= t2.num2
GROUP BY  t1.num2
Ma se ho cento campi, oppure se non so a priori quanti e quali campi ho,
questo sistema mi sembra di difficile applicazione.
ciao
Alberto

 questo sistema mi sembra di difficile applicazione.
Beh, certo, la "rogna" rimane in pieno.
ciao
ugo

 numero del record corrente.
un contatore ?

 un contatore ?
ops ho letto solo ora la fine del 3ad , devo smettere di rispondere a volo ,
cmq se vuoi una cosa del tipo :
RecordCorrente = rsMyRecordset("INDICE")
con indice che indica il primo campo io non riesco a trovare la difficolta'
oppure come al solito non ci ho capito na mazza : /
1 | record1    | ...
2 | record3    | ...
3 | record57   | ...
se per indice intendi il primo campo :
scusa un recordset.move(indice) ti porta direttamente al campo che vuoi nel
tuo recordset
se invece intendi il secondo campo puoi usare un contatore nella tabella
completa , quidi ora ti chiedo , in pubblico :
presa la tabella
posizionequery3 | posizionetabella200  | ...
posizionequery4 | posizionetabella210  | ...
posizionequery5 | posizionetabella220  | ...
intendi avere
A)  RecordCorrente = rsMyRecordset("posizionequery4")
( e quindi un .move dovrebbe bastare )
B)  RecordCorrente = rsMyRecordset("posizionetabella200")
(e qui il contatore nella tabella originaria fa al caso tuo )
Oddio adesso fammi capire perche' senno' esplodo con sti ragionamenti ^_^

 Oddio adesso fammi capire perche' senno' esplodo con sti ragionamenti ^_^
Gigio, immagina una query qualsiasi che restituisce un numero qualsiasi di
campi.
Zanna vuole che un campo (che in realtà non esiste nella tabella) del
recordset creato valga 1 per il primo record, 2 per il secondo e 100 per il
centesimo.
Ora applica una Where e una Order By alla stessa query e immagina che
vengano restituiti meno records di prima, oltretutto in un ordine diverso.
Zanna vuole, esattamente come prima, che un campo (che in realtà non esiste
nella tabella) del recordset creato valga 1 per il primo record, 2 per il
secondo e 50 per il cinquantesimo.
Insomma un contatore progressivo dei records restituiti, da 1 e crescente in
ragione di 1.

 ragione di 1.
ok quindi nessun problema , lo so non e' un campo del recordset , ma non
serve averlo nel rs in quanto lo abbiamo gia' disponibile usando :
 recordset.move(indice) ?

  recordset.move(indice) ?
No. Lui vuole, indipendentemente dal record sul quale è posizionato, poter
fare rs!numero, così come può fare rs!codice_cliente. Come dici tu è
certamente fattibile, ma occorre crearsi un contatore interno, in memoria,
da gestire in funzione degli spostamenti. Immagina che voglia rappresentare
il recordset in una griglia bound-ata allo stesso, senza alcun intervento da
codice. Ecco, lui vuole vedere la colonna Numero record.

 centesimo.
sto continuando a seguire il thread, a capire pochissimo delle
soluzioni proposte, e a pensare che senza un ciclo non se ne esce in
modo molto pulito. fra l'altro non ho mai ben capito come vengano
restituite le query a parita' di condizioni where e order. con access
direi secondo la cronologia della memorizzazione dei record, con altri
db non so.
zanna, per favore, mi spieghi lo scopo di una cosa del genere ?
grazie, j.

 modo molto pulito.
IMHO non c'è una soluzione, non con una sola query, almeno. Con due (e con
del codice, ignorando le prestazioni) basterebbe riservare un campo in
tabella e assegnargli un valore scorrendo tutti i records restituiti, poi
ricomponendo il recordset, compreso il campo "numerato" e nel suo ordine.
Inoltre non credo che Z voglia sfruttare qualche dialetto particolare per
sfruttare le caratteristiche di uno o dell'altro db.

 sfruttare le caratteristiche di uno o dell'altro db.
ri-ok. e ri-continuo a non capire lo scopo.
zanna, perche' non mandi la tua query in output su una tabella vuota
strutturata con un suo bel contatore ?
dai a cesare quel che e' di cesare, e scherza con i fanti :)
ciao, j.

 codice. Ecco, lui vuole vedere la colonna Numero record.
no , non riesco proprio a trovarne un senso logico , la colonna numero
record e' un valore che abbiamo COMODAMENTE fuori dal recordset , o legata
agli spostamenti del RS o abbinata ad un index di una griglia dati , quindi
l'unico modo per fare quella cosa e' :
[ pseudo codice peggio di quello di J , altro che panbagnato]
  esegui una query
   for campocorrente
        insert into querycorrente il contatore come campo "NUMERO"
   next campocorrente
  riesegui la stessa query
mi immagino gia' i pezzi di db che fuggono dal server per maltrattamento ^_^

 dai a cesare quel che e' di cesare, e scherza con i fanti :)
Un amico diceva "se sei titubante gioca un fante!"...
...mai visto nessuno perdere così facilmente a carte...  ;-)
ciao
ugo

 ...Zanna... Zanna... Zanna... ci senti???   ;-P
niet. e' da ieri che sta numerando una query sui post di lupo in
google.
col pennarello :P
ciao, j.

 record e' un valore che abbiamo COMODAMENTE fuori dal recordset ,
Appunto, lui la vuole dentro al recordset

 col pennarello :P
ROTFL... anche questa è una soluzione!
ciao
ugo

 col pennarello :P
Nein! Fonti attendibili mi dicono che sta affrontando una questione che pare
irrisolta. E' nelle caratteristiche di Z. Non gliene importa nulla, vuole
solo risolvere il non-problema. Usa il pennarello solo per OTizzare qualche
post di J in più. ;-PP

 IMHO non c'è una soluzione, non con una sola query, almeno.
Ehmmm, mi permetto di dissentire.
Nell'altro ramo del post c'è una query da me postata, che consente di
generare il campo indice con una sola query.
Per quanto riguarda il dibattito 'dentro o fuori dal recordset', è stato
precisato fin dall'inizio che fra le proprietà del recordset c'è anche il
modo di avere questo indice.
Ma potrebbe servire anche come campo del recordset, o, meglio, come campo di
una tabella temporanea, visto che io spesso uso tabelle temporanee che di
fatto sono memorizzate dal server (# e ##), e all'interno delle quali potrei
trovarmi a volere un indice (anzi, mi era già capitato in passato, per cui
la query che ho postato non è un'invenzione del momento).
Ciao
Alberto

 la query che ho postato non è un'invenzione del momento).
Per questo mi chiedo che uso voglia farne Zanna.
La tua soluzione è perfetta se poi salviamo il risultato della query in una
tabella temporanea per successive rielaborazioni.
Ma è questo che serve a Zanna?    ;-)
ciao
ugo

 la query che ho postato non è un'invenzione del momento).
ho visto la tua soluzione, dicevo appunto che il thread l'ho seguito.
e continuo a essere stupefatto e ammirato da come riesci a maneggiare
sql.
pero' dicevo anche "in modo pulito".
cioe' utilizzando una normale query su una normale tabella con un
campo vuoto che possa essere riempito col contatore. p.e.
    cli_id
    cli_nome
    cli_cognome
    cli_pseudocont
e non mi sembrava molto il caso. non ne so molto di db, ma tabelle
come quella che presupponi non mi sembrano tipiche.
in questi casi (anche se, come direi altri, sto ancora sperando che
zanna spieghi lo scopo :) cerco una soluzione il piu' possibile
semplice, cioe' robusta e generalizzabile (riutilizzabile). se devo
ricorrere ad artifici eccessivi o non ho chiaro il cosa/come o, se
invece ne sono convinto, ristrutturo la tabella (o piu' probabilmente
l'interrogazione).
pero', ripeto, sto ancora cercando di capire bene come funziona la tua
query :)
ciao, j.

 Ehmmm, mi permetto di dissentire.
Alberto, certo, ma le condizioni che poni possono risultare troppo rigide e
non sempre rispettabili.
Quello che intendevo dire è che (sempre IMHO, ma ben felice di imparare) non
esiste (nello standard SQL o anche solo in Access) una parola chiave (o
anche un artificio che però non preveda condizioni particolari) che serva a
restituire un contatore di record relativo al record "corrente" di una
query. Giusto?

 Ma è questo che serve a Zanna?    ;-)
s'e' perso. l'oracolo sara' stato sibillino. non potendo andare a vb,
dovra' andare a delphi.
j.q-mana

 query. Giusto?
Giusto. Per quanto ne so, serve un accrocchio come quello postato.
Se un giorno qualcuno mi dirà che esiste un modo più semplice, ne sarò molto
felice.
Alberto

 Appunto, lui la vuole dentro al recordset
a ok , allora basta dirlo : la voce del niubbo dice "NON SE PO FA" ^_^

 a ok , allora basta dirlo : la voce del niubbo dice "NON SE PO FA" ^_^
Ora comprendi il perchè quel "no"? ;-)
Vedi anche l'idea di Albe, anche se presume alcune cose non sempre
possibili.

 dovra' andare a delphi.
Allora, spiego l'arcano :) (se ci riesco)
Ho due tabelle testata-dettagli strutturate cosě (non voglio commenti su
questa scelta :P )
Testata
    ID
    ID_primo_dettaglio
    Numero_dettagli
    Numero_dettagli_tipo_1
    Caratteristica_dettagli_1
    Caratteristica_dettagli_2
Righe
    ID_dettaglio
    <...>
dato che mi serviva una join tra le due in modo da avere
| ID_Dettaglio | Caratteristica |
Se avessi avuto un campo indice, sapendo che i primi n dettagli anno una
caratteristica e i secondi n un'altra mi sarebbe stata piů facile la vita :)
Comunque ho risolto con salti mortali tra array temporanei :P
Ciao

 caratteristica e i secondi n un'altra mi sarebbe stata più facile la vita
:)
Vediamo se può andare...
SELECT *,
INDICE=(
    SELECT COUNT(1)
    FROM Dettagli AS P2
    WHERE P2.ID_Dettaglio<P1.ID_Dettaglio
    AND P2.ID_Testata=<inserire qui l'ID della testata>
 )
FROM Dettagli AS P1
WHERE P1.ID_Testata=<inserire qui l'ID della testata>
ORDER BY 
P1.ID
Il primo dettaglio ha indice=0.
Ciao
Alberto

 possibili.
no che se po fare l'ho gia visto solo che analizzando il "costo" del tutto ,
difronte all'utilizzo concreto che se ne puo' fare , credo di bollarlo con
un bel "NUN SE PO FA' " o meglio : "si puo fare ma se sei cosi masochista
sono fatti tuoi" ^_^