Newsgroup: it.comp.lang.visual-basic
Titolo: Consiglio su apertura recordset

Ciao a tutti,
il mio è più un problema di sql ma spero possiate aiutarmi.
Dovrei aprire un recordset in cui ho una colonna fissa ad 1
SELECT ALTRICAMPI, '1' AS FLAG
FROM TABELLA
WHERE TABELLA.IDTABELLA BETWEEN '27' AND '46'
ORDER BY FLAG
A me questa sintassi non funziona.
Tutto questo mi serve per una routine, dove a volte entro con quell'1 e a
volte con un codice che cambia
SELECT ALTRICAMPI, CODICEARTICOLO AS FLAG
In questo modo nella routine posso fare dei totali parziali di
CODICEARTICOLO (cioè ogni volta che cambia faccio un'operazione), oppure un
solo totale quando ho sempre 1.
Una cosa del genere per capirsi.
Do until Rs.EOF
  if rs("FLAG")<> FLAG precedente allora stampa totale parziale
  <istruzioni>
Loop
Esiste qualche altro metodo? (non mi piace aprire #n recordset per ogni
CODICEARTICOLO eventuale)
Grazie :)

Andrea ha usato la sua tastiera per scrivere :

Diciamo che non ho capito benissimo il tuo problema.
Se ti serve costruire una query dove l'Order By sia fisso e tu debba 
modificare solo la parte del campo FLAG (pescandolo o meno dalla 
tabella), devi necessariamente fare un sottoquery:
SELECT A.ALTRICAMPI, A.FLAG
FROM (SELECT ALTRICAMPI, '1' AS FLAG
FROM TABELLA
WHERE TABELLA.IDTABELLA BETWEEN '27' AND '46'
) AS A
ORDER BY A.FLAG
Che diventa (quando vuoi un FLAG ricavato dalla tabella)
SELECT A.ALTRICAMPI, A.FLAG
FROM (SELECT ALTRICAMPI, CODICEARTICOLO AS FLAG
FROM TABELLA
WHERE TABELLA.IDTABELLA BETWEEN '27' AND '46'
) AS A
ORDER BY A.FLAG
Ciao
Alberto
-- 
Ma noi no

 SELECT ALTRICAMPI, CODICEARTICOLO AS FLAG
Il problema non è molto chiaro, comunque...
Se il problema è l'order by, al quale dovresti cambiare ogni volta nome
dell'argomento, lo puoi risolvere passando la posizione del campo da
ordinare, anzichè il nome esatto.
Nel caso specifico, se gli dai ORDER BY 2 il risultato della query viene
ordinato sempre per il secondo campo, a prescindere dal nome che gli hai
dato.
Spero di essermi spiegato.
Paolo

 tabella), devi necessariamente fare un sottoquery:
Allora la mia intenzione è avere un recordset di totali, che a seconda del
totale che voglio deve essere un totale globale oppure suddiviso per
articolo (o altro campo).
Quindi avrei il mio recordset:
Select SUM(prezzo), CODIVA, "1" as FLAG
in questo modo otterrei:
100,00 - 20 - 1
135,00 - 30 - 1
110,00 - 35 - 1
In questo caso la routine mi calcola un totale globale a seconda del codice
IVA (il calcolo è un po' più complesso ma il concetto è lo stesso)
Se invece mi serve un totale parziale per ogni tipo di articolo ad esempio
mi deve tirar fuori
50,00 - 20 - ART1
24,00 - 30 - ART1
50,00 - 20 - ART2
20,00 - 30 - ART2
110,00 - 35 - ART3
Ora provo la tua select

Andrea ha usato la sua tastiera per scrivere :

Non provarla neanche, perchè quello che tu vuoi è un'altra cosa.
SELECT SUM(PREZZO) AS TOT_PREZZO,
CODIVA,
CODART
FROM TABELLA
GROUP BY CODIVA,CODART
WITH ROLLUP
(o WITH CUBE, vedi tu).
In questo modo hai un unico recordset con entrambe le informazioni (sia 
i subtotali che il generale), basta filtrare per i NULL.
Comunque giuro che non capisco il problema. Tu vuoi UNA query che ti 
fornisca due informazioni distinte, Ma perchè non fare DUE query?


 fornisca due informazioni distinte, Ma perchè non fare DUE query?
Allora la query reale è questa:
SELECT SUM(FMERCMOV.QTA) AS TOTQTA,SUM(FMERCMOV.QTA*FMERCMOV.PREZZO) AS
TOTPREZZO, SUM(PREZZODATA) AS COSTO,FCAUSALI.CAMPO1,FCAUSALI.CAMPO2,ecc,
FROM FMERCMOV LEFT OUTER JOIN FCAUSALI ON
FMERCMOV.CAUSMOVIM=FCAUSALI.IDCAUSALE
WHERE FMERCMOV.IDMERCMOV BETWEEN '27' AND '46'
GROUP BY FCAUSALI.CAMPO1,CAMPO2 ECC
Con questo record entro in una rountine, che a seconda della stampa scelta,
mi inserisce dei record in una tabella temporanea.
Se la stampa è 1 o 2 mi va bene questa query ( e la rountine inserisce un
solo rigo), se è 3 devo inserire un rigo per ogni FMERCMOV.NARTICOL, se è 4
ne devo inserire uno per ogni FMERCMOV.CODCLIENTE
La routine fa un calcolo abbastanza complesso (a seconda dei campi
FCAUSALI), e volevo evitare di fare 3 copia/incolla della routine a seconda
della stampa.
Semplicemente nella routine mi inserivo un rigo ogni volta che arrivavo a
.EOF oppure mi cambiava questo campo FLAG, che è sempre 1 nelle stampe 1 e
2, ma diventa NARTICOL in stampa 3, e CODCLIENTE in stampa4
La routine è la stessa, solo che devo inserire 1 solo rigo nelle stampe 1 e
2, mentre devo inserire un rigo per ogni cambio di FLAG nelle stampe 3/4.
Spero sia più chiaro :)

 2, mentre devo inserire un rigo per ogni cambio di FLAG nelle stampe 3/4.
Ancora non capisco il problema.
Se l'informazione che estrai deve essere elaborabile *a posteriori* sia 
per NARTICOL che per CODCLIENTE, entrambi questi campi dovranno essere 
nel Group By, e su questo non ci piove.
Quindi li metti sia nel Group By che nell'elenco dei campi estratti. In 
quest'ultimo metti anche un campo fittizio FLAG che vale sempre '1'.
Alla Function passi il nome del campo su cui deve 'elaborare', che 
dipenderà dal tipo stampa.
Ogni volta che hai
If RS.Fields.Item(Campo_di_Raggruppamento).Value <> 
Valore_ciclo_precedente THEN
 
Valore_ciclo_precedente=RS.Fields.Item(Campo_di_Raggruppamento).Value
    '****** elaborazioni e inserimento righe nel recordset disconnesso 
di stampa
End if


 End if
Per ora ho fatto così nel frattempo:
ADORs.Source = "SELECT NARTICOL FROM FMERCMOV WHERE " & WhereK & WhereK2 &
" GROUP BY NARTICOL ORDER BY NARTICOL"
ADORs.Open
Do Until ADORs.EOF
	rs2.source = La select di prima con WHERE NARTICOL=adors("NARTICOL")
	.movenext
loop
.close
In pratica entro nella routine per ogni totale parziale.
A livello di velocità è comunque buona, in effetti posso fare anche come
hai detto tu, per ora lascio così che devo un po' macinare, poi ottimizzo
:)