Newsgroup: it.comp.appl.access
Titolo: i primi dieci record

Salutoni a tutto l'NG
in premessa specifico:
A/97 su win 95 - PC P II 333 128 Mb Ram
Il mio problema è questo:
In una tabella ho una serie di clienti per ciascuno dei quali c'è un campo
ordini ed un campo zona.
Vorrei ottenere un report nel quale, per ciascuna zona figurano solo i primi
dieci clienti per ordine decrescente di ordini.
Con una normale query questo è impossibile. Al momento tanta pazienza ed un
accurato copia e incolla mi hanno aiutato a risolvere il problema, ma vorrei
arrivare ad una automazione via codice, non so però da dove cominciare.
Ringrazio chiunque potrà essermi di aiuto
Antonio

 Con una normale query questo č impossibile.
Ma dai? Dě lo giuro!!!
Oppure prova a vedere l'help sulla parola chiave SQL TOP
Chiaramente dopo aver ordinato per numero decrescente di ordini
Antonio

 ha scritto nel messaggio
news:3zYU5.2964$tS2.1...@news.infostrada.it...

Perché impossibile? Nelle proprietà della query c'é la possibilità di
indicargli quanti record deve restituire: menù visualizza - proprietà -
primi valori...
Ciao.

dieci clienti per ordine decrescente di ordini.
premesso che forse con qualche triplo salto mortale carpiato in sql si
potrebbe fare, e premesso anche che non dici come/dove registri gli
ordini, e se ti interessa il numero di ordini o l'importo complessivo
(meglio un ordine da 100 milioni o mille ordini da 10mila?) la prima
cosa che mi viene in mente è questa:
1. group by per recuperare i campi zona,
2. scorrere il raggruppamento dei campi,
3. riversare in una tabella temporanea i record da una query del tipo:
select top 10 * from tabella where zona =... order by... desc
e qui viene il bello, ad occhio suppongo che avrai una tabella ordini,
dove per ogni ordine è indicato il cliente ecc., però senza sapere
questa cosa non si può andare molto avanti.
una volta ottenuta questa tabella temporanea la usi come sorgente del
report, magari raggruppando per zona all'interno del report stesso.
o forse si potrebbe anche fare qualcosa con i sottoreport, ma è un po'
che ho lasciato da parte access e non ricordo bene...
--------------------------------------------------
ATTENZIONE!
it.comp.database.access diventera' it.comp.appl.access!
cercalo tra i nuovi ng e linkalo!
-----------------------------------
rimuovere NOSPAM. per mandare email
-----------------------------------
il sito comune di it.comp.database.access:
http://members.xoom.it/it_db_access


Grazie per il consueto interessamento e faccio subito alcune precisazioni:
Tutti i miei dati sono contenuti in una sola tabella nella quale ci sono tra
gli altri i seguenti campi:
zona
cliente
ordine
ma qui ordine si riferisce all'importo dell'unico ordine del mese in corso.
Dunque il mio problema è quello di estrapolare i dieci ordini più grossi (di
maggiore importo) e  quindi i dieci clienti con i maggiori ordini
nell'ambito di ciascuna zona.
Spero che il chiarimento possa servire a meglio comprendere i termini del
problema.
Grazie ancora
Antonio

nell'ambito di ciascuna zona.
non so se si riesce a farlo con un passaggio solo...  
vedo due modi per farlo.  uno: recupera un rscordset di zone, crea una
query per prendere i dieci maggiori da ogni zona, accoda tutto in una
tabella, usala come sorgentedati del report, nel report crea un
raggruppamento per zona e ordina per ordine decrescente.
due: recupera un recordset di zone e usalo per creare dinamicamente la
stringa sql di una query di unione con i primi dieci di ogni zona.
assegna questa stringa ad un oggetto querydef ed usalo come sorgente
dati del report.  il report raggruppalo per zona come sopra.  con
questa soluzione eviti di creare tabelle temporanee e i problemi di
spazio e compattazione, anche se non credo siano gran problemi.
(scusa eventuali errori di sintassi ma è da un mese o due che lavoro
quasi per niente con access e solo con asp...)
prima soluzione:
dim ssql as string
dim rstZ as recordset
' creo una tabella temporanea vuota eventualmente riscrivendo 
' la precedente
ssql = "SELECT * INTO tTempClassificaZone FROM Tabella WHERE 1 = 2"
' il where 1 = 2 è un errore voluto in modo da creare una 
' tabella sicuramente vuota
docmd.setwarnings false
docmd.runsql ssql
docmd.setwarnings true
ssql = "SELECT zona FROM Tabella GROUP BY zona"
set rstZ = currentdb.openrecordset(ssql)
do until rstZ.eof
	ssql = "INSERT INTO tTempClassificaZone "  &_
	           "SELECT TOP 10 * " & _
	           "FROM tabella " & _
	           "WHERE zona = '" & rstZ!zona & "' " & _
	           "ORDER BY Ordine DESC"
' ho supposto che il codice zona sia una stringa, 
' se non lo è togli gli apici
	docmd.setwarnings false
	docmd.runsql ssql
	docmd.setwarnings true
	rstZ.movenezt
loop
a questo punto hai la tabella tTempClassificaZone che puoi usare per
il report.
seconda soluzione:
dim dbs as database
dim ssql as string
dim rstZ as recordset
dim qdf as querydef
' suppongo che tu abbia già creato una query qClassificaZone
' non importa la sua struttura, tanto viene "sovrascritta"
' con l'assegnazione della proprietà sql
ssql = "SELECT zona FROM Tabella GROUP BY zona"
set rstZ = currentdb.openrecordset(ssql)
ssql = ""
do until rstZ.eof
	ssql = ssql & " SELECT TOP 10 * " & _
	          "FROM Tabella " & _
	          "WHERE zona = '" & rst!zona & "' " & _
	           "ORDER BY Ordine DESC "
	if not rst.eof then
		ssql = ssql & " UNION "
	end if
	rstZ.movenext
loop
set dbs = currentdb
set qdf = dbs.querydefs("qClassificaZone")
qdf.sql = ssql
e usi la query qClassificaZone cone sorgente del report.
--
non studio non lavoro non guardo la tv
non vado al cinema non faccio sport
----------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access


Se non vuoi incrociare (o raggruppare) i dati (cliente x zona); la soluzione
proposta prima non cambia di molto se non per il fatto di mettere in ordine
decrescente il campo ordine (se è quello che contiene l'importo) e farti
restituire i primi 10 record...
Ciao.

 quasi per niente con access e solo con asp...)
[cut]
ben ti sta brutto str... (cito un tal lbo), fedifrago. Finalmente
qualcuno ti ha costretto  a guadagnarti un po' di caviale onestamente. A
meno che per niente intendi le  800.000 orarie invece dei soliti 2Mega
a.cara
P.S. Vergognati mi hai costretto a fare il programmatore pensante.Bello
boccianti.org
 quando mi assumi?

 meno che per niente intendi le  800.000 orarie invece dei soliti 2Mega
[cut]
io evidentemente e' un po' di tempo che non lavoro con l'italiano
(intendesi lingua)  
a.cara


boccianti.org
 quando mi assumi?
ti vengo a trovare e ne parliamo... :-)
