RESTITUISCI N RECORD

di il
17 risposte

RESTITUISCI N RECORD

Ciao a tutti,
vorrei sapere da voi esperti se è possibile creare una query che mi restituisca "n" records dove "n" è il numero di records che vorrei visualizzare e può essere impostato da una maschera. E' una cosa realizzabile?
Grazie

17 Risposte

  • Re: RESTITUISCI N RECORD

    Non ho capito bene se è quello che vuoi tu cmq...
    per vedere solo i primi NUM record di una tabella devi andare nella "Visualizzazione SQL" della query che si basa su tale tabella e, dopo l'istruzione "SELECT", devi aggiungere "TOP" lasci 1 spazio e poi metti il numero di record da visualizzare... es.
    SELECT TOP 10 Tabella1.ID, Tabella1.aaa FROM Tabella1 ;
    se è questo che vuoi poi analizzaremo come associare automaticamente il numero di record da visualizzare tramite la maschera...
  • Re: RESTITUISCI N RECORD

    Vuoi fare tipo PAGINAZIONE WEB...?
    Visualizzare N Records per volta...?

    In questo caso, pur non condividendo questa cosa, è fattibile in questo modo(prendo spunto da un vecchio suggerimento di Giorgio Rancati):
    
    SELECT TOP 10 *
         FROM Tabella
     WHERE campochiave
            NOT IN (SELECT TOP 10 campochiave
                     FROM Tabella
                     ORDER BY  Campordinamento)
     ORDER BY Campordinamento
    
    in questo modo selezioni le righe da 11 a 20, campo chiave deve essere
    univoco e può essere ad esempio un contatore.
    Per selezionare dalla riga 21 alla 30 metterai nella
    
    NOT IN (SELECT TOP 20 ....)
  • Re: RESTITUISCI N RECORD

    Innanzitutto grazie per le risposte.

    In pratica devo gestire delle lezioni di equitazione, e ogni allievo ha una tessera, oggi ogni tessera è di 8 lezioni. Quando un allievo ha terminato la tessera, questa deve essere rinnovata quindi devo selezionare le prime 8 lezioni (records) per azzerare la tessera.
    Quello che ho fatto è questo:
    Tab_Lezioni_Agenda - qui vengono inserite tutte le lezioni e da qui vengono conteggiate quelle di ogni allievo. Ho una tabella Tab_Lezioni_Tessere dove ho un campo "NumeroLezioniAcquistate" Quando rinnovo la tessera la query in questione mi seleziona le prime 8 lezioni di quel allievo e le accoda in un'altra tabella Tab_Lezioni_Statistiche. Ogni tabella è associata a relativa maschera.
    Fin qui tutto bene. Il problema è che se domani vorrei fare tessere di 10 lezioni dovrei modificare la query, ma essendo un db installato tramite pacchetto di Windows Installer dovrei rifare l'installazione. Quello che vorrei è che il numero di records selezionati dalla query sia in funzione del numero inserito in "NumeroLezioniAcquistate" della maschera.
    L'idea del Select Top mi va bene, ma posso mettere il riferimento del "NumeroLezioniAcquistate" piuttosto che un numero fisso?
    Grazie ancora...
  • Re: RESTITUISCI N RECORD

    Ciao,
    immagino tu abbia posizionato un pulsante nella maschera che ha la funzione di selezionarti i primi NUM records della tabella. (TOP infatti si limita a selezionarti i primi NUM records che trova).

    SE vuoi che "NUM" sia in funzione di ciò che hai impostato in "NumeroLezioniAcquistate" (che immagino sia un textbox da te inserito nella medesima maschera) imposta il valore predefinito di NumeroLezioniAcquistate pari a 8 e poi devi accedere alla parte di codice dell'evento click del textbox (tasto destro, Genera evento, genera codice) e devi inserire il codice sotto stante.
    
    me.RecordSource = "SELECT TOP " & cstr(me.NumeroLezioniAcquistate) & " Tab_Lezioni_Agenda.* FROM Tab_Lezioni_Agenda;" 
    
    mentre nell'evento load della maschera potresti mettere
    
    me.RecordSource = "SELECT TOP " & cstr(me.NumeroLezioniAcquistate) & " Tab_Lezioni_Agenda.* FROM Tab_Lezioni_Agenda;" 
    
    (è lo stesso codice per tutti e due gli eventi.)
  • Re: RESTITUISCI N RECORD

    Ciao angelo,

    ho provato a fare come mi hai suggerito, ma devo sbagliare qualcosa!!!
    Nella Form_load va correttamente e mi mostra n records in base a quanto immesso nel campo NumeroLezioniAcquistate, ma nella query non riesco a capire dove è il problema.

    SELECT TOP " & cstr(NumeroLezioniAcquistate) & " * FROM [Tab Lezioni Agenda] INNER JOIN [Tab Lezioni Tessera] ON ([Tab Lezioni Agenda].CognomeAllievo = [Tab Lezioni Tessera].CognomeAllievo) AND ([Tab Lezioni Tessera].NomeAllievo = [Tab Lezioni Agenda].NomeAllievo) WHERE ((([Tab Lezioni Agenda].CognomeAllievo)=[Maschere]![Mas Query Lezioni Tessera]![CognomeAllievo]) AND (([Tab Lezioni Agenda].NomeAllievo)=[Maschere]![Mas Query Lezioni Tessera]![NomeAllievo]) AND (([Tab Lezioni Agenda].Svolta)=True)) ORDER BY [Tab Lezioni Agenda].DataLezione, [Tab Lezioni Agenda].IDLezione;

    Il messaggio di errore è: l'istruzione SELECT include una parola riservata o un argomento scritto in modo errato o mancante oppure la punteggiatura non è corretta.
    Se vado a cambiare " & cstr(NumeroLezioniAcquistate) & " con un qualsiasi numero va tutto bene.

    Grazie ancora!!!
  • Re: RESTITUISCI N RECORD

    Prova cosi, ma non cambiare la stringa SQL... incollala uguale a come la posto sotto:

    evento load:
    
    me.RecordSource = "SELECT TOP 8 [Tab Lezioni Agenda].* FROM [Tab Lezioni Agenda];" 
    ho messo il numero 8 fisso...

    nel evento click del pulsante:
    me.RecordSource = "SELECT TOP " & cstr(me.NumeroLezioniAcquistate) & " [Tab_Lezioni_Agenda].* FROM [Tab Lezioni Agenda];" 
    solo per sicurezza confermami una cosa:
    il "nome elemento" del textbox che usi per inserire le lezioni (lo vedi dalle proprietà) è uguale a = "NumeroLezioniAcquistate" ? (NB: non mi sto riferendo al nome campo della tabella ma al nome elemento del controllo)
  • Re: RESTITUISCI N RECORD

    Ciao Angelo, grazie per la celere risposta...
    Ho provato a fare come hai detto ma il risultato non è quello sperato. Ti confermo che il nome elemento della textbox è NumeroLezioniAcquistate.
    Probabilmente il motivo per cui non riesco ad ottenere quello che vorrei seguendo le tue istruzioni è che il pulsante "RinnovaTessera" si trova su una maschera che ha come origine una query la cui stringa SQL è la seguente:

    SELECT [Tab Lezioni Tessera].NomeAllievo, [Tab Lezioni Tessera].CognomeAllievo, [Tab Lezioni Agenda].Svolta, Count([Tab Lezioni Agenda].Svolta) AS ConteggioDiSvolta, [Tab Lezioni Tessera].IDTessera, [Tab Lezioni Tessera].DataTessera, [Tab Lezioni Tessera].CostoTessera, [Tab Lezioni Tessera].Pagato, [Tab Lezioni Tessera].NumeroLezioniAcquistate
    FROM [Tab Lezioni Tessera] INNER JOIN [Tab Lezioni Agenda] ON ([Tab Lezioni Tessera].CognomeAllievo = [Tab Lezioni Agenda].CognomeAllievo) AND ([Tab Lezioni Tessera].[NomeAllievo] = [Tab Lezioni Agenda].[NomeAllievo])
    GROUP BY [Tab Lezioni Tessera].NomeAllievo, [Tab Lezioni Tessera].CognomeAllievo, [Tab Lezioni Agenda].Svolta, [Tab Lezioni Tessera].IDTessera, [Tab Lezioni Tessera].DataTessera, [Tab Lezioni Tessera].CostoTessera, [Tab Lezioni Tessera].Pagato, [Tab Lezioni Tessera].NumeroLezioniAcquistate
    HAVING ((([Tab Lezioni Tessera].NomeAllievo)=[NOME ALLIEVO?]) AND (([Tab Lezioni Tessera].CognomeAllievo)=[COGNOME ALLIEVO?]) AND (([Tab Lezioni Agenda].Svolta)=True));

    Mi sbaglio?

    Grazie
  • Re: RESTITUISCI N RECORD

    In pratica devo gestire delle lezioni di equitazione, e ogni allievo ha una tessera, oggi ogni tessera è di 8 lezioni. Quando un allievo ha terminato la tessera, questa deve essere rinnovata quindi devo selezionare le prime 8 lezioni (records) per azzerare la tessera.
    Quello che ho fatto è questo:
    Tab_Lezioni_Agenda - qui vengono inserite tutte le lezioni e da qui vengono conteggiate quelle di ogni allievo. Ho una tabella Tab_Lezioni_Tessere dove ho un campo "NumeroLezioniAcquistate" Quando rinnovo la tessera la query in questione mi seleziona le prime 8 lezioni di quel allievo e le accoda in un'altra tabella Tab_Lezioni_Statistiche. Ogni tabella è associata a relativa maschera.
    Secondo me è un percorso contorto.
    A che serve selezionare le prime 8 lezioni e accodarle in un'altra tabella statistiche.
    Forse bastava un semplice campo calcolato lezioni acquistate - lezioni fatte.
  • Re: RESTITUISCI N RECORD

    Secondo me è un percorso contorto.
    A che serve selezionare le prime 8 lezioni e accodarle in un'altra tabella statistiche.
    Forse bastava un semplice campo calcolato lezioni acquistate - lezioni fatte.
    premetto che sono d'accordo... comunque... prova questo:

    evento load maschera:
    Dim strSQL As String
    
    
    strSQL = "SELECT TOP 8 [Tab Lezioni Tessera].NomeAllievo, [Tab Lezioni Tessera].CognomeAllievo, [Tab Lezioni Agenda].Svolta, [Tab Lezioni Tessera].IDTessera, [Tab Lezioni Tessera].DataTessera, [Tab Lezioni Tessera].CostoTessera, [Tab Lezioni Tessera].Pagato, Count([Tab Lezioni Agenda].Svolta) AS ConteggioDiSvolta FROM [Tab Lezioni Tessera] INNER JOIN [Tab Lezioni Agenda] ON "
    strSQL = strSQL & "([Tab Lezioni Tessera].CognomeAllievo = [Tab Lezioni Agenda].CognomeAllievo) AND ([Tab Lezioni Tessera].[NomeAllievo] = [Tab Lezioni Agenda].[NomeAllievo]) "
    strSQL = strSQL & "GROUP BY [Tab Lezioni Tessera].NomeAllievo, [Tab Lezioni Tessera].CognomeAllievo, [Tab Lezioni Agenda].Svolta, [Tab Lezioni Tessera].IDTessera, [Tab Lezioni Tessera].DataTessera, [Tab Lezioni Tessera].CostoTessera, [Tab Lezioni Tessera].Pagato, [Tab Lezioni Tessera].NumeroLezioniAcquistate "
    strSQL = strSQL & "HAVING ((([Tab Lezioni Tessera].NomeAllievo)=[NOME ALLIEVO?]) AND (([Tab Lezioni Tessera].CognomeAllievo)=[COGNOME ALLIEVO?]) AND (([Tab Lezioni Agenda].Svolta)=True)); "
    
    Me.RecordSource = strSQL
    nell'evento click di un pulsante:
    Dim strSQL As String
    
    
    strSQL = "SELECT TOP " & CStr(Me.NumeroLezioniAcquistate) & " [Tab Lezioni Tessera].NomeAllievo, [Tab Lezioni Tessera].CognomeAllievo, [Tab Lezioni Agenda].Svolta, [Tab Lezioni Tessera].IDTessera, [Tab Lezioni Tessera].DataTessera, [Tab Lezioni Tessera].CostoTessera, [Tab Lezioni Tessera].Pagato, Count([Tab Lezioni Agenda].Svolta) AS ConteggioDiSvolta FROM [Tab Lezioni Tessera] INNER JOIN [Tab Lezioni Agenda] ON "
    strSQL = strSQL & "([Tab Lezioni Tessera].CognomeAllievo = [Tab Lezioni Agenda].CognomeAllievo) AND ([Tab Lezioni Tessera].[NomeAllievo] = [Tab Lezioni Agenda].[NomeAllievo]) "
    strSQL = strSQL & "GROUP BY [Tab Lezioni Tessera].NomeAllievo, [Tab Lezioni Tessera].CognomeAllievo, [Tab Lezioni Agenda].Svolta, [Tab Lezioni Tessera].IDTessera, [Tab Lezioni Tessera].DataTessera, [Tab Lezioni Tessera].CostoTessera, [Tab Lezioni Tessera].Pagato, [Tab Lezioni Tessera].NumeroLezioniAcquistate "
    strSQL = strSQL & "HAVING ((([Tab Lezioni Tessera].NomeAllievo)=[NOME ALLIEVO?]) AND (([Tab Lezioni Tessera].CognomeAllievo)=[COGNOME ALLIEVO?]) AND (([Tab Lezioni Agenda].Svolta)=True)); "
    
    Me.RecordSource = strSQL
    non ho potuto testarli perchè non ho le tabelle compilate con i dati opportuni... ma il codice dovrebbe essere esatto...

    ma "NumeroLezioniAcquistate", dove dovresti scrivere il numero lez da visualizzare, è un controllo non associato vero?

    saluti
  • Re: RESTITUISCI N RECORD

    Grazie ancora Angelo...
    sono d'accordo anche io che è un percorso contorto e sicuramente se fossi più esperto in access riuscirei a trovare una strada più semplice.
    Penso di aver trovato una strada più semplice!!!
    Ho creato una query che mi dia tutte le lezioni svolte dell'allievo selezionato dalla data della tessera in avanti. Associata alla query ho una maschera continua che all'apertura mi mostra i primi n records in base al numero di lezioni acquistate impostate nella tessera... e fin qui tutto funziona.
    Adesso dovrei eliminare tutti i records mostrati nella maschera continua... qualche suggerimento??
    Grazie.
  • Re: RESTITUISCI N RECORD

    Potresti usare una query di eliminazione basata sulla stessa select della maschera e la richiami da un pulsante...

    fai una copia della query... vai in struttura... cambi in query eliminazione...salvi... la richiami da un pulsante

    saluti
  • Re: RESTITUISCI N RECORD

    Ma cosi facendo me li elimina tutti, mentre io vorrei eliminare solo quelli che sono visualizzati nella maschera continua... sbaglio?
  • Re: RESTITUISCI N RECORD

    Dipende da come imposti i criteri della query di eliminazione: se utilizzi gli stessi criteri che hai usato per la visualizzazione, l'eliminazione dovrebbe riguardare gli stessi record visualizzati...
  • Re: RESTITUISCI N RECORD

    Ciao Angelo,

    Se alla stringa SQL che mi hai suggerito
    me.RecordSource = "SELECT TOP " & cstr(me.NumeroLezioniAcquistate) & " [Tab Lezioni Agenda].* FROM [Tab Lezioni Agenda];"

    Volessi porre la condizione WHERE CheckBox "Svolta" = True
    come mi devo muovere? E' Fattibile?
    Ho fatto delle prove ma non riesco a trovare la sintassi corretta

    Me.RecordSource = "SELECT TOP " & CStr(Me.NumeroLezioniAcquistate) & " Tab Lezioni Agenda.* FROM [Tab Lezioni Agenda] WHERE Me.Svolta = True;"

    Grazie
Devi accedere o registrarti per scrivere nel forum
17 risposte