Newsgroup: it.comp.lang.visual-basic
Titolo: problema un po' strano ...

Salve a tutti.Il mio problema e' un po' strano. Spero di riuscire a
speigarmi e che qualcuno sappia aiutarmi.
Dunque ho un dbgrid che popolo con una select del tipo :
sqlsel = "Select * From docenti Where ATTIVO = 'S' AND COgnome LIKE '" &
StrConv(Text1, vbUpperCase) & "*'" & IIf(c1 = "", "", " AND [sede] like '" &
c1 & "*'") & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'") & "
order by cognome"
ora vorrei inserire un ulteriore parametro : vorrei " saltare " un certo
numero di record selezionati : ovvero se il risultato della query e'
A-B-C-D-E-F, se io indico in un text il valore 2, sul dbgrid dovrebbe
comparire C-D-E-F.
E' possibile fare questo ?
Grazie

Ma e' proprio un problema impossibile, quindi ? ...


Ma e' proprio un problema impossibile, quindi ? ...
No! E' che forse fra sabato e domenica c'era di meglio da fare
Ad ogni modo io vedo due soluzioni:
1) Sai che si possono fare query all'interno di altr query vero?
2) Potresti filtrare il recordset
Non riesco a dirti molto di più, anche perchè non sò cosa usi DAO,
ADO...?
Ciao

 ADO...?
Ciao, utilizzo VB5, e il problema e' per me un po' piu' complesso. Infatti
quello che devo fare e' questo :
il mio prg stampa delle tessere sindacali, ora, impostata la query e
lanciata la stampa,  puo' capitare che la carta le tessere si inceppino o
che vada via la luce o mille altre cose e la stampa non venga completata.
Reimpostando la query, ottengo (ovviamente) lo stesso risultato, e quindi se
al primo tentativo erano state stampate (per es. 50 tessere su 150) io devo
indicare di saltare le prime 50 (gia' stampate).
Il problema (per altro risolvibile e gia' risolto con un ciclo for/next a
vuoto in fase di stampa) e' che poiche' i risultati della query vengono
mostrati su un dbgrid prima della stampa, io volevo fare in modo che se il
valore di text4 (= numero di tessere da non stampare) era diverso da 0 gli
n. nominativi che vanno da 1 a val(text4) non dovevano essere mostrati nel
dbgrid.
E' possibile questo ?
Probabilmente mi sono espresso male al primo post, spero di essere stato
piu' chiaro.
Grazie.

 ha scritto nel messaggio
news:LoaK8.6079$t47.1...@twister1.libero.it...

Volendo selezionare le prime 2:
SELECT TOP 2 * FROM DOCENTI WHERE ... ORDER BY COGNOME
Non mi pare che esista una funzione "contaria" al TOP quindi ... il trucco,
visto che l'ordinamento č fondamentale, potrebbe essere quello di dire
"Seleziona quello che non č fra le prime 2"
SELECT * FROM DOCENTI WHERE COGNOME NOT IN (SELECT TOP 2 COGNOME FROM
DOCENTI WHERE ... ORDER BY COGNOME) ORDER BY COGNOME

 DOCENTI WHERE ... ORDER BY COGNOME) ORDER BY COGNOME
Anzi, più correttamente:
SELECT * FROM DOCENTI WHERE ... AND COGNOME NOT IN (SELECT TOP 2 COGNOME
FROM DOCENTI WHERE ... ORDER BY COGNOME) ORDER BY COGNOME
dove "..." sono le varie scelte.


Ciao Lupo.
Ecco la mia query modificata come da tuo suggerimento, ma ... non va, nel
senso che non mi toglie i primi due, ma lascia tutto invariato.
Commetto qualche errore ?
sqlsel = "Select * From docenti Where ATTIVO = 'S' AND COgnome NOT IN
(SELECT TOP 2 FROM docenti Where ATTIVO = 'S' AND COgnome LIKE '" &
StrConv(Text1, vbUpperCase) & "*'" & IIf(c1 = "", "", " AND [sede] like '" &
c1 & "*'") & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'") & "
order by cognome)) ORDER BY COGNOME"
Grazie.

... ed alla luce delle correzioni effettuate :
sqlsel = "Select * From docenti Where ATTIVO = 'S' AND AND COgnome LIKE '" &
StrConv(Text1, vbUpperCase) & "*'" & IIf(c1 = "", "", " AND [sede] like '" &
c1 & "*'") & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'") & "
order by cognome) and COgnome NOT IN (SELECT TOP 2 FROM docenti Where ATTIVO
= 'S' AND COgnome LIKE '" & StrConv(Text1, vbUpperCase) & "*'" & IIf(c1 =
"", "", " AND [sede] like '" & c1 & "*'") & IIf(c2 = "", "", " AND
[sede_circo] like '" & c2 & "*'") & " order by cognome)) ORDER BY COGNOME"
Ma il risultato non cambia.
Ciao

 order by cognome)) ORDER BY COGNOME"
Non hai riportato tutte le scelte nella prima parte e hai sbagliato la
select interna. Prova così:
sqlsel = "Select * From docenti
 Where ATTIVO = 'S' AND COgnome LIKE '" &
 StrConv(Text1, vbUpperCase) & "*'" & IIf(c1 = "", "", " AND [sede] like '"
&
 c1 & "*'") & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'"
 AND COgnome NOT IN
 (
SELECT TOP 2 COGNOME FROM docenti Where ATTIVO = 'S' AND COgnome LIKE '" &
 StrConv(Text1, vbUpperCase) & "*'" & IIf(c1 = "", "", " AND [sede] like '"
&
 c1 & "*'") & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'") & "
order by cognome
)
 ORDER BY COGNOME"

 > [cut]
anzi (sono andato un po' a capo per leggerla meglio, ovviamente metti degli
spazi al posto dei ritorno a capo):
sqlsel =
"
Select * From docenti
 Where
 ATTIVO = 'S'
 AND COgnome LIKE '" & StrConv(Text1, vbUpperCase) & "*'"
 & IIf(c1 = "", "", " AND [sede] like '" & c1 & "*'")
 & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'")
 & " AND COgnome NOT IN


 spazi al posto dei ritorno a capo):
[cut]
ma ora il problema e' questo : li elimina " a casaccio ", nel senso che se
inserisco 2, mi toglie i primi 4, se inserisco 1 i primi 5, 6 i primi 8 ...
e cosi via. Li toglie senza un senso logico (almeno in apparenza).
Naturalmente io al posto di 2 nella select ho inserito  ... " & val(text3) &
" dove text3 e' il numero di quelli da eliminare.
Ciao

 ha scritto nel messaggio
news:fcwK8.10214$t47.2...@twister1.libero.it...

Puoi postare l'intera SQL? Grazie.

 Puoi postare l'intera SQL? Grazie.
Certo !!
Set myDb = Workspaces(0).OpenDatabase("C:\doc-arch.MDB")
Set MYTB = myDb.OpenRecordset("docenti", dbOpenDynaset)
c2 = StrConv(Combo4, vbUpperCase)
c1 = StrConv(Combo3, vbUpperCase)  '' sede circolo
sqlsel = "Select * From docenti Where ATTIVO = 'S' AND COgnome LIKE '" &
StrConv(Text1, vbUpperCase) & "*'" & IIf(c1 = "", "", " AND [sede] like '" &
c1 & "*'") & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'") & "
AND COgnome NOT IN (SELECT TOP " & Val(Text3) & " COGNOME FROM docenti Where
ATTIVO = 'S' AND COgnome LIKE '" & StrConv(Text1, vbUpperCase) & "*'" &
IIf(c1 = "", "", " AND [sede] like '" & c1 & "*'") & IIf(c2 = "", "", " AND
[sede_circo] like '" & c2 & "*'") & " order by cognome) ORDER BY COGNOME"
selcount = "SELECT DISTINCT Count(COGNOME) AS TOTALI from DOCENTI Where
ATTIVO = 'S' AND COgnome LIKE '" & StrConv(Text1, vbUpperCase) & "*'" &
IIf(c1 = "", "", " AND [sede] like '" & c1 & "*'") & IIf(c2 = "", "", " AND
[sede_circo] like '" & c2 & "*'")
Data3.RecordSource = sqlsel
Data3.Refresh
Set rst2 = myDb.OpenRecordset(selcount)
Text2 = rst2![TOTALI]
Ne approfitto : (dovrei postare un nuovo messaggio) : la variabile selcount
(= mi riporta i record selezionati) come va modificata alla luce della
modifica della variabile sqlsel ?
Ciao.

 modifica della variabile sqlsel ?
Direi di prendere la stessa parte di composizione della sqlsel (quando a
posto) e modificarla cosě:
 sqlsel = "Select DISTINCT COUNT(COGNOME) AS TOTALI
... il resto č uguale...


"Ehm, ... togliendo l'ultimo ORDER BY...

 istruzione SQL. Vedi cosa ti dice.
non e' che sia molto pratico di visdata, comunque, se nella finistra sql
metto la stringa cosi' com'e' mi dice che vuole 'SELECT' 'INSERT' ecc. cosi'
tolgo sqlsel = " e le virgolette alla fine, ma mi dice "errore di sintassi
(operatore mancante) nell'espressione 'ATTIVO = ..... (tutta la stringa)
errore 3075 .
Boh ?!?!

 ha scritto nel messaggio
news:QBwK8.10424$t47.2...@twister1.libero.it...

Certo, devi togliere le virgolette iniziale e finale e verifica se ti ha
troncato a capo qualche riga. Deve essere cosě se nel tuo programma
nell'apertura non ti segnala errori di sintassi.

 nell'apertura non ti segnala errori di sintassi.
non e' che per caso e' perche' le variabili c1 e c2 inserite nella stringa
in visdata non sono dichiarate ?

 ha scritto nel messaggio
news:VUwK8.10512$t47.2...@twister1.libero.it...

Carmelo, nella finestra di Visdata devi mettere l'istruzione completamente
compilata, quella cioč che sta nella tua variabile dopo la composizione e
immediatamente prima dell'uso. Hai seguito quello che ti ho scritto a
proposito del Debug.Print?

 proposito del Debug.Print?
Quindi, nella finestra istruzione SQL di visdata devi mettere una stringa
(la puoi anche scrivere a mano) del tipo :
Select * From docenti Where ATTIVO = 'S' AND COgnome LIKE 'BAUDO*' AND
[sede] like 'CATANIA*' AND [sede_circo] like 'MILITELLO*' AND COgnome NOT IN
(SELECT TOP 2 COGNOME FROM docenti
Where ATTIVO = 'S' AND COgnome LIKE 'BAUDO*' AND [sede] like 'CATANIA*' AND
[sede_circo] like 'MILITELLO*' order by cognome) ORDER BY COGNOME

 proposito del Debug.Print?
Fatto, sbagliavo..infatti.
Ora la variabile e' compilata, ha i valori inseriti, e nell'errore che e'
sempre lo stesso mi viene proposto nella parte della riga :
COGNOME COgnome NOT IN (SELECT TOP 2 COGNOME FROM docenti Where ATTIVO = 'S'
AND COgnome LIKE 'A*' order by cognome)
a quanto pare solo in questa parte di stringa c'e' un errore, e non prima o
dopo.
Riesci a vederci qualcosa di errato ?

E questa e' la riga completa generata :
Select * From docenti Where ATTIVO = 'S' AND COgnome LIKE 'A*' AND COgnome
NOT IN (SELECT TOP 2 COGNOME FROM docenti Where ATTIVO = 'S' AND COgnome
LIKE 'A*' order by cognome) ORDER BY COGNOME COgnome NOT IN (SELECT TOP 2
COGNOME FROM docenti Where ATTIVO = 'S' AND COgnome LIKE 'A*' order by
cognome) ORDER BY COGNOME

 ha scritto nel messaggio
news:A4xK8.10651$QT3.2...@twister2.libero.it...

COGNOME COgnome ... proprio all'inizio di quello che hai scritto. Riesci a
vederci qualcosa di errato? ;-))

 ha scritto nel messaggio
news:V5xK8.10657$QT3.2...@twister2.libero.it...

Hai fatto il debug.print con la finestra immediata non pulita. Deve essere
cosě (con l'esempio fatto):


 vederci qualcosa di errato? ;-))
Andiamo per ordine :
1) maiscolo minuscolo crea un errore ? Comunque sia pare proprio di si. Ho
modificato COgnome in COGNOME ed ora non c'e' piu' l'errore.
2) Visdata mi fornisce lo stesso risultato che ottengo sul dbgrid..
Guarda il mio mdb contiene questi primi 6 cognomi :
ABBATE/ABBATE/ABBATE/ADAMO/ADAMO/ADAMO
sia in visdata che in vb se chiedo di eliminare n. 1 o n. 2 nominativi mi
vengono evidenziati a partire da ADAMO.

 ha scritto nel messaggio
news:ifxK8.10618$t47.2...@twister1.libero.it...

Ora č chiaro (no! il minuscolo/maiuscolo non fa la benchč minima
differenza!) hai dei cognomi duplicati. Lui toglie i primi due ABBATE, ma
poi trova un altro ABBATE e quindi lo include.
Prova a modificarla cosě:
Select * From docenti Where ATTIVO = 'S' AND COgnome LIKE 'A*' AND COgnome
 NOT IN (SELECT DISTINCT TOP 2 COGNOME FROM docenti Where ATTIVO = 'S' AND
COgnome
 LIKE 'A*' order by cognome) ORDER BY COGNOME

  LIKE 'A*' order by cognome) ORDER BY COGNOME
Bada bene, ho solo inserito DISTINCT prima di TOP

Però, pensando bene al tuo applicativo e ai cognomi duplicati, credo che non
ci sia soluzione. Se, nel tuo esempio, hai già stampato due schede (per i
primi due ABBATE) con quell'istruzione ti elimina tutti gli ABBATE, anche il
terzo. Non va bene perchè non stamperesti la scheda del terzo, mai stampata.
Anche pensando a Cognome e Nome c'è sempre la possibilità di duplicati.
Occorrerebbe un codice univoco per ogni docente, ma bisognerebbe
ristrutturare un po' la SQL. Ora andiamo a nanna. 'Notte.

> Bada bene, ho solo inserito DISTINCT prima di TOP
Mi dispiace doverti comunicare che purtroppo il problema non si e' risolto.
Siamo sempre allo stesso punto.
Pensi, per caso, che se ordinassi il tutto per cognome+nome si potrebbe
risolvere il problema ?

 ha scritto nel messaggio
news:LpxK8.10718$QT3.3...@twister2.libero.it...

Carmelo, se le condizioni sono quelle che hai detto, ti garantisco (!) che
deve funzionare. Però ti ho già risposto, servirebbe a poco... Prova a
mettere insieme due note (domani) sui campi e il loro tipo e funzione, i
duplicati e le univocità possibili e previste e poi scrivile qui. Domani ci
pensiamo. Hai un codice univoco per ogni docente?

[cut]
Notte.
ok. Sei stato gentilissimo ( e non e' la prima volta )
Ti contraddistingui , come sempre, nel NG per la tua dsponibilita' (senza
nulla togliere agli altri validi componenti).
Grazie e buona notte.

 ha scritto nel messaggio
news:bsxK8.10731$QT3.3...@twister2.libero.it...

Ho simulato il tutto e si può risolvere, a condizione che tu abbia un campo
univoco per ogni docente (che chiamerò CODICE) e che l'ordine sia per
COGNOME, NOME e CODICE:
sqlsel =
"
Select * From docenti
 Where
 ATTIVO = 'S'
 AND COGNOME LIKE '" & StrConv(Text1, vbUpperCase) & "*'"
 & IIf(c1 = "", "", " AND [sede] like '" & c1 & "*'")
 & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'")
 & " AND COGNOME & NOME & CODICE NOT IN
 (
SELECT TOP " & val(Text3) & " COGNOME & NOME & CODICE FROM docenti
 Where ATTIVO = 'S'
 AND COGNOME LIKE '" & StrConv(Text1, vbUpperCase) & "*'"
 & IIf(c1 = "", "", " AND [sede] like '" & c1 & "*'")
 & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'")
 & " ORDER BY COGNOME & NOME & CODICE
)
 ORDER BY COGNOME, NOME, CODICE
"
Ho provato e funziona perfettamente. Dovrebbe andar bene anche se quel
"CODICE" fosse un campo ID.
Occhio, però: La " TOP 0 " non è ammessa, quindi se non devi saltare niente
devi usare una SQL "normale", come questa:
sqlsel =
"
Select * From docenti
 Where
 ATTIVO = 'S'
 AND COGNOME LIKE '" & StrConv(Text1, vbUpperCase) & "*'"
 & IIf(c1 = "", "", " AND [sede] like '" & c1 & "*'")
 & IIf(c2 = "", "", " AND [sede_circo] like '" & c2 & "*'")
 ORDER BY COGNOME, NOME, CODICE
"

[.... CUT ....]
Ok, Lupo. La sintassi della query ora e' ok, e il risultato pure. Ma non
avevo considerato il fattore "tempo" :
il mio mdb contiene circa 1800 record, sul mio pc P4 1.8 Mhz, dicendo di
escludere i primi (n) docenti (es. 8 o 3) ci vogliono circa 25 secondi
affinche' sul mio dbgrid appaiano i record selezionati...., sul pc del
cliente (PII, 350 Mhz,) non voglio neppure immagginarlo !!!
Ma devo comunque ringraziarti, per il tempo che mi hai dedicato e per la
VALIDA soluzione che hai saputo propormi.
Ed ora subito una domanda a bruciapelo :
perche', secondo te, il seguente codice :
sqlsel = "Select * From docenti order by cognome,nome,codicedocente"
Data3.RecordSource = sqlsel
mi produce un recordset ordinato solo per cognome, (nel dbgrid collegato a
DATA3 l'ordine e' solo per cognome), mentre se riempio un listview leggendo
di seguito i record, sono nel giusto ordine = cognome e all'interno di
cognomi uguali per nome) ?
Grazie e ciao.

 Grazie e ciao.
E' stato un piacere. Ciao.

 te (lo stimolo iniziale), ma anche una "questione di principio" per me.
... del tutto normale ....
Il bello della programmazione e' proprio questo : crearsi dei problemi per
superarli .... e dopo averli superati e risolti porsene di nuovi.
Al prossimo post.
Ciao

 
Puoi dirgli di selezionare le ultime n cosě
SELECT TOP n FROM DOCENTI WHERE ... ORDER BY COGNOME DESC
Se vuoi selezionare tutto tranne le prime n, prima fai una query per
determinare il numero di record, (SELECT COUNT(*) FROM DOCENTI) e lo
metti in una variabile m, poi fai
"SELECT TOP " & m - n & " FROM DOCENTI WHERE ... ORDER ..."
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

 "SELECT TOP " & m - n & " FROM DOCENTI WHERE ... ORDER ..."
Samuele, ciao.
La tua soluzione č certamente valida, ma, se leggi tutto il topic, noterai
che ci sono stati vari problemi: Mi pare si volesse un'unica query e poi
c'era il problema dei cognomi doppi, poi risolto introducendo altri campi di
ordinamento.