Newsgroup: it.comp.appl.access
Titolo: Problema con query pass.-through in mysql

Buongiorno a tutti, 
 
ho creato una tabella "clienti" in mysql contenente 10.000 record
in access ho creato una maschera "elencoclienti" in modalità maschere_continue
 
in access ho creato una query pass.-through di nome "Qclienti" cosi definita
Qclienti="select * from clienti where (id>=1 and id<=20) order by id"
 
ho associato tale query Qclienti alla maschera "elencoclienti" e aprendola mi mostra i primi 20 clienti (fin qui tutto ok)
 
nella maschera ho aggiunto 2 pulsanti "indietro" e "avanti" per gestire la paginazione dei record
 
su click "avanti" eseguo quanto segue 
        Me.da = Me.da + 20
        Me.a = Me.a + 20
        Me.pagina = Me.pagina + 1
 
AggiornaElenco("Qclienti" & Me.da & "_" & Me.a)
 
AggiornaElenco verifica se la quey non esiste la crea
 
    If VerificaEsistenzaQuery(nomequery) = False Then
        Dim qDef As DAO.QueryDef
        Set qDef = CurrentDb.CreateQueryDef(nomequery)
        qDef.Connect = "ODBC;DSN=MioMysql32;DATABASE=miomysql;"
        qDef.SQL = "SELECT * FROM Clienti WHERE (Id >= " & Me.da & " and id<=" & Me.a & ") order by id"
        qDef.ReturnsRecords = True
        CurrentDb.QueryDefs.Refresh
    End If
 
    Me.RecordSource = nomequery
    Me.Requery
end sub
 
tutto funziona alla perfezione, se la query esiste la usa oppure la crea
 
 il problema è che crea un elenco infinito di query, ha senso crearle e poi lasciarle oppure andrebbero eliminate una volta che cambio pagina? 
se meglio eliminarle in che modo si può fare?


oppure chiedo, anziché creare ogni volta una nuova query è possibile editare e ridefinire la query di nome "Qclienti" ogni volta che clicco i pulsanti "indietro" e "avanti" ?
 


ho risolto così, non so se sia perfetto ma funziona
 
 
 
    Dim qDef As DAO.QueryDef
 
    If VerificaEsistenzaQuery("QClienti") = False Then
        Set qDef = CurrentDb.CreateQueryDef("QClienti")
        qDef.Connect = "ODBC;DSN=MioMysql32;DATABASE=miomysql;"
        qDef.SQL = "SELECT * FROM Clienti WHERE (Id >= " & Me.da & " and id<=" & Me.a & ") order by id"
        qDef.ReturnsRecords = True
        CurrentDb.QueryDefs.Refresh
 
    'se la query esiste la ridefinisco
    Else
        Set qDef = CurrentDb.QueryDefs("QClienti")
        qDef.SQL = "SELECT * FROM Clienti WHERE (Id >= " & Me.da & " and id<=" & Me.a & ") order by id"
        qDef.ReturnsRecords = True



personalmente la trovo una soluzione senza senso
 
immagina di avere tutti i clienti da id 1 a id 20
ma poi da id 20 a id 40  di averne eliminati 15 nel tempo
 
avresti che quando apri la maschera vedi 20 record
al primo click su avanti ne vedresti solo 5
 
se per assurdo hai un buco di id da 20 a 100 dovresti fare vari click a 
vuoto prima di tornare a vedere risultati
 
una eventuale paginazione la dovresti fare con un select top N...
sempre che abbia senso una maschera che ti mostra una lista di TUTTI i 
clienti come quella che vuoi realizzare
 
di solito a un db client server si chiede al server solo quello che ti 
serve..quindi l'elenco sarebbe vuoto all'apertura. Solo dopo 
l'inserimento di un filtro, tipo "trovami tutti i clienti della 
provincia di treviso" verrebbe fatta la richiesta al server che 
restituisce solo l'elenco che mi interessa. (con filtro ESEGUITO dal 
server ovviamente tramite SP parametriche)
 
per darti uno spunto, se puoò esserti utile, io faccio cosi
questa maschera mostra un elenco di clienti e si apre vuota.
 
https://i.imgur.com/QKcbACk.png
 
 
che senso ha che si apra con dati che non ho chiesto?
 
solo dopo che imposto uno dei filtri mi viene popolata in base ai filtri 
impostati. quindi il server non fa lavoro inutile
 
se poi la mole di dati è talmente alta potrei valutare la paginazione 
dei risultati tramite un menu a tendina dove selezionare quanti 
risultati max ottenere...ma con 10.000 record non mi porrei neppure il 
problema
 
BFS
 
 
 
 
 
 
 
 
-- 
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
 
 

Soluzione tecnicamente sbagliata.
 
La paginazione si fa così:
 
SELECT TOP 10 *
     FROM Tabella
 WHERE campochiave
        NOT IN (SELECT TOP 10 campochiave
                 FROM Tabella
                 ORDER BY  Campordinamento)
 ORDER BY Campordinamento
 
Selezioni blocchi di 10 con passo 10, se cambi i 2 numeri cambi i Blocchi e l'inizio paginando N Row partendo dalla Row+1
 
Quindi per avanzare di Pagina con Bocco 10 avrai:
 
SELECT TOP 10 *
     FROM Tabella
 WHERE campochiave
        NOT IN (SELECT TOP 20 campochiave
                 FROM Tabella
                 ORDER BY  Campordinamento)
 ORDER BY Campordinamento
 
ecc...
 
Saluti
@Alex


aprendo la maschera senza nessun record non visualizza nei campi #ERRORE?


di solito la sottomaschera io la metto invisibile all'apertura
e la rendo visibile al click del "filtra"
 
altra soluzione mettere una select come origine che restiuisca zero record
 
BFS
 
 


ok grazie.


Discordo  :)
Non e' questione di 10K o 100K o 10M di record, e' questione che 
paginare il risultato rende la visalizzazione della singola pagina 
SEMPRE a velocita' fulminanti
Parte l'interrogazione, tornano le 20 righe pagina, vengono visualizzate 
sulla griglia, totale 30 millisecondi
Ad esempio se selezioni "..tutti gli imbriaconi del Veneto.." la query 
ti restituisce milioni di righe, e paginare il risultato e' il metodo 
ideale per avere alte prestazioni
Ma anche se la selezione restituisce qualche migliaio di righe la 
paginazione sarebbe l'ideale, perche' dal punto di vista prestazioni e' 
sempre migliore rispetto alla lettura di 4K righe di dati
Purtroppo, necessita di un bel po' di codice in piu' rispetto alla 
modalita' semplice (avvio query, restituzione dati, visualizzazione) e 
quindi finche' e' sufficiente, si usa la form continua e vai andare
Dopo becchi la query che ti restituisce 20K righe e stai la' ad 
aspettare che finisca, inchiodando tutto
Chiaramente il cliente in quel momento ti sta guardando di fianco e 
ripensa al pagamento delle ultime fatture  :)
 


tutto vero
ma stiamo parlando a della del OP di
 
"10.000 record "
 
e non andrei a scomodare la paginazione per questo
 
e infatti a fine post ho scritto
 
"se poi la mole di dati è talmente alta potrei valutare la paginazione "
 
 
qualcosa contro i veneti? :-)



No, ma co i se careghe de clinton, no se po' starghe vissin
:)
 


Ti ringrazio, ho provato ma non funziona
 
ho scritto
SELECT TOP 10 * FROM clienti WHERE id NOT IN (SELECT TOP 20 id FROM clienti ORDER BY id) ORDER BY cognome, nome
 
restituisce quanto segue:
ODBC: chiamata non riuscita.
[MySQL][ODBC 8.0(w) Driver][mysqld-5.7.33]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 
'10 * FROM clienti WHERE (id NOT IN (SELECT TOP 20 id FROM clienti OR' at line 1 (#1064)


perchè devi parlare la lingua di mysql
 
select top 10 * from clienti
 
diventa
 
select * from clienti limit 10



santa cleopatra, quante bisogna saperne! 
 
grazie.


ho provato a tradurre questa stringa SQL in MySQL senza successo
 
stringa sql server
 
SELECT TOP 10 *
FROM Tabella
WHERE campochiave
NOT IN (SELECT TOP 10 campochiave
FROM Tabella
ORDER BY Campordinamento)
ORDER BY Campordinamento
 
mia traduzione in mySQL
 
SELECT * FROM clienti WHERE id NOT IN(SELECT id FROM clienti LIMIT 20) LIMIT 10
 
qualche suggerimento?

Se usi MySQL sei sicuro che il metodo in questione vada bene...?
Hai cercato e studiato come si usa LIMIT...?
 
https://www.mysqltutorial.org/mysql-limit.aspx
 
 
Questo ad esempio restituisce dal 6÷15 Records...
 
SELECT * FROM tbl LIMIT 5,10
 
La paginazione poi hai un VINCOLO fondamentale ... l'ORDINAMENTO dei dati in base al Campo di criterio.
 
Poi non ti offendere se ti si fa notare che manchi spesso di approfondimento.
 
@Alex


cosi sembra funzionare ma non capisco se è l'esatta traduzione dell'esempio in SQL SERVER 
 
SELECT * FROM clienti LIMIT 10 OFFSET 50

 SELECT * FROM clienti LIMIT 10 OFFSET 50
 
SQL_Server non ha la funzione LIMIT quindi si ovvia come suggerito.
 
Va bene così come fatto.
 
@Alex


scusa se insisto
ma perchè ti danni l'anima con mysql quando con MS SQL Server hai al 99% 
la stessa sintassi di access?
se la banca dati è come hai detto di 10.000 record è una bazzecola per 
sql express.
condividi mysql con siti/portali?
devi per qualche motivo usarlo in un ambiente <> da windows?
 
 
BFS
 
 
 
 
 
 


ok si continua sono il tuo pungiball personale!!!


rimane gratuito sempre, questo è il motivo


Mi sembra di ricordare che 'rimane gratuito' se il codice che lo usa 
viene rilasciato open source
Se tu realizzi una rubrica telefonica, basata su db Mysql, ed il 
programma rubrica telefonica NON e' open source, allora
"..you must enter into a commercial license agreement with Oracle.."
Gli unici realmente gratuiti, anche per prodotti commerciali, sono 
Postgresql e Firebird, oltre alle varie versioni express che hanno un 
po' tutti

 ok si continua sono il tuo pungiball personale!!!
 
Prendila come vuoi, ti dico cose che magari pensano in molti... però tu facci quello che vuoi, io continuo a dirtele se non migliori, abbiamo entrambi la libertà che ci pare...
 
@Alex


Da oggi sei promosso mio motivatore personale access.

Il giorno martedì 5 aprile 2022 alle 18:08:51 UTC+2 @Alex ha scritto:

se questa è sintassi mySQL ---> SELECT * FROM clienti LIMIT 10 OFFSET 50
e l'altra era SQL Server scelgo 1000 volte MySQL molto più concisa

 e l'altra era SQL Server scelgo 1000 volte MySQL molto più concisa
 
Non ti pare una considerazione un po semplificata se confrontata con i suggerimenti che hai ricevuto che probabilmente hanno una visione d'insieme più ampia...?
 
Giusto per pesare adeguatamente il senso tecnico delle cose.
 
Bene
@Alex

Il giorno martedì 5 aprile 2022 alle 18:08:51 UTC+2 @Alex ha scritto:
 

'Azz ... sempre di buon umore eh? 
Ma sì, concediamoci qualche buon vecchio flame: potrebbe essere l'ultimo tra Covid e Scaramucce termonucleari.
 
Saluti   ;-)


Sono sicuro che avresti qualcosa da ridire anche se scrivo che ti faccio un bonifico di 100 mila euro.
Il problema non è quello che scrivo ma il fatto che sia io a scriverlo, credo sia evidente a tutti

 Il problema non è quello che scrivo ma il fatto che sia io a scriverlo, credo sia evidente a tutti
 
Temo di doverti deludere... non sei interessante a tal punto da appassionarmi nella contestazione... anzi...
Tuttavia le posizioni di discutibile competenza e di scarsa capacità analitica, e probabilmente poco interesse al miglioramento personale... che  che sia tu o pinco pallino cambia poco sono atteggiamento divertente a prescindere.
 
Perché invece di sentirti il Calimero della situazione non provi a migliorare approccio, magari ottieni risultati positivi.
 
;-)
 
Saluti
@Alex

 Saluti ;-)
 
Ciao
@Alex


non ci crederai ma i risultati positivi non mi mancano. :)


Hai fatto il test rapido di recente?
Pure te risultato positivo? Porcccc....
 
Scusa eh, ma non ho resistito  :)  :)  :)