Parametri insufficienti previsto 2

di il
13 risposte

Parametri insufficienti previsto 2

Salve,
Dim db As DAO.Database
Set db = CurrentDb
Dim rs As DAO.Recordset

Dim strsql As String

....

strsql = strsql & "WHERE (((q_Calendario.Giorno) Between forms!m_Riepilogo.inizio And forms!m_Riepilogo!fine) ....

Set rs = db.OpenRecordset(strsql)
ho un problema con questo codice

vorrei aprire un recordset dove come condizione ho due date che sono presenti in due caselle di testo di una maschera

senza la condizione tutto passa senza problemi, con la condizione ottengo parametri insufficienti previsto 2

--ooo--

lo scopo sarebbe quello di aprire un recordset e accodare i dati in un'altra tabella riga per riga

lo stesso risultato (o quasi) l'ho ottenuto gia' con una query di accodamento dove nei criteri inserisco la condizione

non ottengo il risultato voluto perche' vorrei che l'accodamento venisse fatto in un certo modo da me ordinato (da qui l'esigenza di aprire un recordset e scrivere riga per riga)

sebbene avessi inserito l'ordinamento nella query di accodamento ho visto che il risultato dei dati accodati non è quello ordinato in partenza

grazie a tutti in anticipo

13 Risposte

  • Re: Parametri insufficienti previsto 2

    Non conosciamo cosa dovrebbe esserci dentro strsql prima di WHERE. Immagino tu non abbia dichiarato i PARAMETERS (indispensabili) all'inizio della stringa SQL.
  • Re: Parametri insufficienti previsto 2

    Immagini corretto, non li avevo mai messi perche' nella query di accodamento non erano mai stati dichiarati e le condizioni venivano messe solo nei criteri (prelevava i dati da due caselle di testo di una maschera) ed ottenevo come risultato quello che volevo,
    mi sa che devo studiare le query parametriche
  • Re: Parametri insufficienti previsto 2

    Risolvi i valori fuori dalla stringa e non dentro... e poi fai debug della stringa
    strsql = strsql & "WHERE (((q_Calendario.Giorno) Between " & Me.inizio & " And " & Me!fine & ") ....
    Se lasci risolvere alla query i parametri fai fare 3 passaggi invece di 1...
  • Re: Parametri insufficienti previsto 2

    Eccomi qua

    questo e' il codice completo
    
    strsql = strsql & "PARAMETERS [forms]![m_Riepilogo_presenze]![inizio] DateTime, [forms]![m_Riepilogo_presenze]![fine] DateTime;  "
    strsql = strsql & "SELECT q_Calendario.Giorno, q_Riepilogo_presenze.Id_bambino, Switch([Giornodellasettimana]=1,[Frequenza_Domenica],[Giornodellasettimana]=2,[Frequenza_Lunedi],[Giornodellasettimana]=3,[Frequenza_Martedi],[Giornodellasettimana]=4,[Frequenza_Mercoledi],[Giornodellasettimana]=5,[Frequenza_Giovedi],[Giornodellasettimana]=6,[Frequenza_Venerdi],[Giornodellasettimana]=7,[Frequenza_Sabato]) AS Frequenza  "
    strsql = strsql & "FROM q_Calendario, q_Riepilogo_presenze  "
    strsql = strsql & "WHERE (((q_Calendario.Giorno) Between [forms]![m_Riepilogo_presenze]![inizio] And [forms]![m_Riepilogo_presenze]![fine]) AND ((q_Calendario.Aperto_o_chiuso)=True))  "
    strsql = strsql & "ORDER BY q_Calendario.Giorno, q_Riepilogo_presenze.Sort_bambino, q_Riepilogo_presenze.Id_bambino;  "
    
    Set rs = db.OpenRecordset(strsql)
    
    
    ho sempre il problema di parametri insufficienti previsto 2 (premetto che se lancio l'sql da una query va perfettamente e che la maschera e' aperta e le due caselle di testo sono valorizzate

    non ho capito cosa significa quello che mi diceva Alex: cosa significa risolvere i valori fuori dalla stringa ?
  • Re: Parametri insufficienti previsto 2

    Significa costruire il predicato con i valori ESPLICITI e non con i riferimenti a controlli nella form che poi impongono a JET di andarseli a cercare per convertirli... siccome dalla Form in cui stai costruendo il predicato li hai già espliciti... tanto vale costruire la query in modo da non essere necessaria la interpretazione.

    GIORNO che tipo di campo è...?
  • Re: Parametri insufficienti previsto 2

    Ciao,
    giorno e' un campo data/ora
    ora do un'occhiata a quanto mi dici,
    grazias
  • Re: Parametri insufficienti previsto 2

    Grazie ad Alex ho risolto il problema, o almeno penso di averlo risolto come mi aveva consigliato

    apro il recordset senza il where e sposto la condizione con un if sulla scrittura (quindi se soddisfa i criteri scrive se no no)

    non ho capito perche' avere la condizione nella query porta a 3 passaggi anziche' 1

    cosi' il recordset non deve essere passare tutti i record (dato che e' senza la condizione), quindi non e' un lavoro piu' lungo? (deve scorrere piu' record)

    Alex mi ha fatto ragionare anche sul campo data e chiaramente c'era anche li' l'errore dell'assenza della formattazione (ho sistemato quindi anche questo)

    ma veniamo a noi, risultato ottenuto ma... è il medesimo della query di accodamento

    non capisco perchè se accodo, per esempio, i record di maggio 2019 se apro la tabella (confermo che e' una tabella e non una query ordinata) in visualizzazione dati non li trovo tutti alla fine accodati (avevo fatto un ciclo con addnew) ma sempre ordinati per id_bambino e Giorno
    Do Until rs.EOF
        If (Format(rs![Giorno], "\#mm\/dd\/yyyy\#") >= Format(var_inizio, "\#mm\/dd\/yyyy\#")) Then
            rsDao.AddNew
            rsDao![Id_bambino] = rs![Id_bambino]
            rsDao![Giorno] = rs![Giorno]
            rsDao![Id_retta] = rs![Frequenza]
            rsDao.Update
            rs.MoveNext
        Else
            rs.MoveNext
        End If
    Loop
    questa la situazione

    Immagine.jpg
    Immagine.jpg


    Immagine2.jpg
    Immagine2.jpg

    magari non cambierà nulla ma perche' non accoda?
  • Re: Parametri insufficienti previsto 2

    Non sono sicuro di aver capito tutti i passaggi, ma:
    1. Prova a creare una query "di accodamento" vera e propria, comprensiva dei parametri
    2. Esegui la query facendo in modo che i parametri passino attraverso campi/controlli di maschera

    Ti consiglio di fare una copia backup del database e fai qualche prova se non ti senti sicuro di questo suggerimento.
  • Re: Parametri insufficienti previsto 2

    Salve Osvaldo,
    la query di accodamento l'avevo gia' creata all'inizio con i parametri ed il risultato e' il medesimo:

    esempio:
    -nella tabella A, prima della copia, ci sono i giorni fino al 30/04/2019
    -query di accodamento selezionando dalla tabella B alla tabella A dei giorni con i parametri >=01/05/2019 <=31/05/2019
    -nella tabella A ci sono i giorni fino al 31/05/2019

    mi aspetto pero' che i giorni dal primo al 31 maggio siano accodati alla fine (dopo quelli del 30/04/2019 inizialmente presenti), invece li vedo ordinati per Id_bambino ed id_giorno
  • Re: Parametri insufficienti previsto 2

    Se la tabella A è ordinata per id_bambino e Giorno...tale resta.
    Nella query di accodamento includi l'Ordinamento Crescente sul Giorno.
  • Re: Parametri insufficienti previsto 2

    Perdona la mia ignoranza, ma come si setta un ordinamento su dei campi in una tabella?
    magari l'ho fatto involontariamente
    io pensavo che la tabella fosse sequenziale: vengono aggiunti record non ordinati

    la query poi da' la possibilita' di ordinare i campi
  • Re: Parametri insufficienti previsto 2

    ocrot ha scritto:


    Grazie ad Alex ho risolto il problema, o almeno penso di averlo risolto come mi aveva consigliato

    apro il recordset senza il where e sposto la condizione con un if sulla scrittura (quindi se soddisfa i criteri scrive se no no)

    non ho capito perche' avere la condizione nella query porta a 3 passaggi anziche' 1

    cosi' il recordset non deve essere passare tutti i record (dato che e' senza la condizione), quindi non e' un lavoro piu' lungo? (deve scorrere piu' record)
    Se scrivi una Query simile:
    
    SELECT * FROM Tabella WHERE Id=Forms!NomeForm!ControlloId
    Il motore JET, ma come NESSUN altro motore di Database, quando legge [Forms!NomeForm!ControlloId] gli scappa da ridere... non riconosce questa cosa..., ma JET che è strettamente connesso ad Access, invia la richiesta ad Access per capire cosa sia quel pezzo..., Access va nella maschera, se aperta altrimenti errore..., accede al Controllo, legge il valore(25) e lo rimanda a JET che converte il tutto in
    
    SELECT * FROM Tabella WHERE Id=25
    Ora sei fortunato che JET sa a chi chiedere... ma se come DB avessi SQL SERVER... lui nemmeno saprebbe a chi chiedere di quel pezzo...
    Sicchè, SQLSERVER leggendo la richiesta che arriva da Access, e non potendola tradurre farebbe così:
    SELECT * FROM Tabella
    Restituisce ad Access tutto il Dataset della Tabella, ed Access che ha inviato la Query con il Parametro, in LOCALE, fa intervenire JET, che si smazza l'applicazione della WHERE condition come sopra..., come convertire una Ferrari in una Bicicletta.

    Questo è il modo migliore per scrivere Applicazioni che non vanno, non scalabili ad altri Database... o meglio è il modo migliore per AMMAZZARE un RDBMS serio...

    ocrot ha scritto:


    Alex mi ha fatto ragionare anche sul campo data e chiaramente c'era anche li' l'errore dell'assenza della formattazione (ho sistemato quindi anche questo)

    ma veniamo a noi, risultato ottenuto ma... è il medesimo della query di accodamento

    non capisco perchè se accodo, per esempio, i record di maggio 2019 se apro la tabella (confermo che e' una tabella e non una query ordinata) in visualizzazione dati non li trovo tutti alla fine accodati (avevo fatto un ciclo con addnew) ma sempre ordinati per id_bambino e Giorno
    Do Until rs.EOF
        If (Format(rs![Giorno], "\#mm\/dd\/yyyy\#") >= Format(var_inizio, "\#mm\/dd\/yyyy\#")) Then
            rsDao.AddNew
            rsDao![Id_bambino] = rs![Id_bambino]
            rsDao![Giorno] = [color=#BF0000]rs![Giorno][/color]
            rsDao![Id_retta] = rs![Frequenza]
            rsDao.Update
            rs.MoveNext
        Else
            rs.MoveNext
        End If
    Loop
    questa la situazione

    Immagine.jpg

    Immagine2.jpg

    magari non cambierà nulla ma perche' non accoda?
    La 2° non ho capito nulla, ma quando scrivi nel campo rsDao![Giorno] devi scrivere con l'accezione Anglosassone... altrimenti non capisco nemmeno questo che hai scritto:
    If (Format(rs![Giorno], "\#mm\/dd\/yyyy\#") >= Format(var_inizio, "\#mm\/dd\/yyyy\#")) Then
    Per le Date puoi leggere questo:
    http://forum.masterdrive.it/microsoft-office-access-vba-23/vba-jet-tutorial-uso-campi-data-56461/
  • Re: Parametri insufficienti previsto 2

    Ottimo davvero, grazie Alex!
Devi accedere o registrarti per scrivere nel forum
13 risposte