Maschera, recordset e parametri non facili da inserire

di il
17 risposte

Maschera, recordset e parametri non facili da inserire

Salve, non saprei da dove cominciare.

ho una maschera con due sottomaschere, sulla maschera principale ho due caselle combinare da dove dovrei inserire anno "cBoxAnno" e mese “CboxMese” che saranno i parametri da passare alla query Che ho chiamato “giorni”, basata su una semplice tabella con un solo campo Chiamato "giorno" che contiene i numeri dal 1 al 31, e mi crea tutte le date del mese.

ecco la query giorni.

SELECT DateSerial(2023,1,[Giorno]) AS Data

FROM giorni

WHERE (((DateSerial(2023,1,[Giorno])) Between DateSerial(2023,1,1) And DateSerial(2023,1+1,0)))

ORDER BY DateSerial(2023,1,[Giorno]);

Una sottomaschera ha come recordset una query che viene ottenuta dalla query “giorni” e un'altra query per selezionare i records.

e l'altra Sottomaschera ha come origine dati una tabella, dove dopo scrivere dei dati alleatori sui record, andrò a inserire il tutto in tabella.

le due sottomaschere sono continue e affiancate, in modo che in visualizazione maschera sembri una sola sottomaschera.

ora…

siccome i record presenti nel DB non rappresentano tutti i giorni del mese,(vedi giorni non lavorati, ferie, etc…)

comunque, ho bisogno di questa query “Giorni”, per prendere i record del database e incrociarli con detta query in modo di avere un set di records dove ci siano tutti i giorni del mese. quelli presenti nel DB e non.

la query derivante della query giorni e la query dove seleziono i records mi restituisce esattamente cosa voglio ottenere.

ma il mio problema (chiamiamolo cosi) e come inserire i parametri (Anno e Mese) in una query “giorni” che non è presente dentro la maschera.

ho immaginato di inserire la query giorni come recordset della maschera principale, la query derivante di “Giorni” e la query di selezione come recorset della prima sottomaschera, e lasciare la seconda sottomaschera cosi com'e. ma non ne vengo a capo.

magari ho sbagliato approccio, oppure il mio livello di conoscenza di access non mi fa arrivare alla soluzione?

spero di essere stato chiaro

Gradirei qualche consiglio.

Grazie a tutti.

17 Risposte

  • Re: Maschera, recordset e parametri non facili da inserire

    Scusa ma non ho capito quasi nulla. Probabilmente la scarsa esperienza di progettazione DB non ti ha aiutato.

    Io penso che sia tutto da rifare, con una corretta progettazione delle tabelle a partire da quello che effettivamente deve fare la tua applicazione, cosa che non hai spiegato e che è la questione principale da cui partire.

  • Re: Maschera, recordset e parametri non facili da inserire

    04/02/2024 - Sarri ha scritto:


    ho una maschera con due sottomaschere, sulla maschera principale ho due caselle combinare da dove dovrei inserire anno "cBoxAnno" e mese “CboxMese” che saranno i parametri da passare alla query Che ho chiamato “giorni”, basata su una semplice tabella con un solo campo Chiamato "giorno" che contiene i numeri dal 1 al 31, e mi crea tutte le date del mese.

    Creare due combobox con giorni e mesi non ha senso, basta mettere un datetime e da li selezionare i giorni di interesse.

    Una tabella giorni da 1 a 31 non ha senso sia per quanto esposto prima sia perché avresti un errore al 30 febbraio (a volte anche al 29 febbraio), al 31 novembre con aprile giugno e settembre…

    Fare la query dei giorni quando puoi mettere un calendario non ha senso.

    04/02/2024 - Sarri ha scritto:


    siccome i record presenti nel DB non rappresentano tutti i giorni del mese,(vedi giorni non lavorati, ferie, etc…)

    Se ti serve conoscere i festivi basta una tabella dove inserisci le festività annuali (escluse le domeniche ricavabili dal dayofweek o similare).

    04/02/2024 - Sarri ha scritto:


    magari ho sbagliato approccio, oppure il mio livello di conoscenza di access non mi fa arrivare alla soluzione?

    Purtroppo hai ragione in entrambi i casi.

    Per il primo periodo della frase, basta un ragionamento subordinato al secondo periodo dela frase per il quale posso solo consigliarti di studiare access.

    Nell'immediato, se spieghi cosa vuoi ottenere, possiamo indirizzarti verso la soluzione logica delle tabelle e sulle finzioni access che fanno al caso tuo.

  • Re: Maschera, recordset e parametri non facili da inserire

    Il database ha piu di 20 maschere e 10 tabelle, credo che funzioni molto bene per i miei scopi.

    ripeto ho bisogno che mi restituisca “ora” e solo per uno scopo. i record del giono del mese/anno a mia scelta, presenti nel DB e quelli non presenti, cio se scelgo gennaio mi restitiusca 31 record anche se nel db siano presenti solo 10. quelli vuoti dovranno avere solo la data.

    e ho bisogno di legerli e di scrivere delle cose in una tabella (2°maschera continua affiancata).

    quindi…

    perche dovrei progettare tutto il database con migliaia di record vuoti che mi servono solo per uno scopo e non per le altre funzioni del database?

    la query giorni se la eseguite mi restitiusce il febbraio con 28 0 29 giorni, la tabella giorni e solo di appoggio per estrarre i valori

    per la querry giorni.

    ho creato una maschera continua con recordset:

    SELECT Querygiorni.Data, Query_Calcolata.Totale_Carte, Query_Calcolata.TotaleBuoni, Query_Calcolata.TotaleVarie
    FROM Querygiorni LEFT JOIN Query_Calcolata ON Querygiorni.Data = Query_Calcolata.Data;
    

    che mi restituisce i giorni di tutto il mese che desidero (record nel DB e vuoti con la sola data) ed e perfetto per i mie scopi.

    e solo che non so come passare i parametri alla query giorni per cambiare il mese. visto che e fuori della maschera.

  • Re: Maschera, recordset e parametri non facili da inserire

    Il database ha piu di 20 maschere e 10 tabelle, credo che funzioni molto bene per i miei scopi.

    ripeto ho bisogno che mi restituisca “ora” e solo per uno scopo. i record del giono del mese/anno a mia scelta, presenti nel DB e quelli non presenti, cio se scelgo gennaio mi restitiusca 31 record anche se nel db siano presenti solo 10. quelli vuoti dovranno avere solo la data.

    e ho bisogno di legerli e di scrivere delle cose in una tabella (2°maschera continua affiancata).

    quindi…

    perche dovrei progettare tutto il database con migliaia di record vuoti che mi servono solo per uno scopo e non per le altre funzioni del database?

    la query giorni se la eseguite mi restitiusce il febbraio con 28 0 29 giorni, la tabella giorni e solo di appoggio per estrarre i valori

    per la querry giorni.

    ho creato una maschera continua con recordset:

    SELECT Querygiorni.Data, Query_Calcolata.Totale_Carte, Query_Calcolata.TotaleBuoni, Query_Calcolata.TotaleVarie
    FROM Querygiorni LEFT JOIN Query_Calcolata ON Querygiorni.Data = Query_Calcolata.Data;
    

    che mi restituisce i giorni di tutto il mese che desidero (record nel DB e vuoti con la sola data) ed e perfetto per i mie scopi.

    e solo che non so come passare i parametri alla query giorni per cambiare il mese. visto che e fuori della maschera.

  • Re: Maschera, recordset e parametri non facili da inserire

    Non entro nel merito, ma qualche perplessità viene leggendo… in ogni caso… sei sicuro non ti basti passare Primo gg del Mese ed Ultimo…?

    Calcolare il 1° gg del mese è banale, ti crei una funzione alla quale passi appunto il 1° gg e lei restituisce l'ultimo:

    Public Function LastDayInMonth(Optional ByVal pDate As Variant) As Date
        ' ------------------------------------------------------
        ' Restituisce l'ultimo gg del Mese passando una Data
        ' ------------------------------------------------------
        Dim mDate	As Date
        
        If IsMissing(pDate) Then pDate = Date()
        If Not IsDate(pDate) Then pDate = Date()
        
        mDate=pDate
        LastDayInMonth = Fix(DateSerial(Year(mDate), Month(mDate) + 1, 0))
    End Function

    Questa Funzione è richiamabile da Query in quanto è usata come UDF se la dichiari in un Modulo Public.

  • Re: Maschera, recordset e parametri non facili da inserire

    perche dovrei progettare tutto il database con migliaia di record vuoti che mi servono solo per uno scopo e non per le altre funzioni del database?

    Non ti ho detto questo. La parte di cui hai discusso nel tuo primo post va rifatta tutta perchè non ha senso come ti ha anche detto Andrea.

  • Re: Maschera, recordset e parametri non facili da inserire

    Grazie alex del tuo interesse.

    pero io non ho bisogno di calcolare l'ultimo giorno del mese.

    ho bisogno di avere un set di records che abbini tutti i giorni del mese e anno che indicherò, assieme ai records del DB

    essempio:

    query_Calcolata

    Data          Importo

    3/1/2023  300

    5/1/2023  200 

    etc… fino alla fine del mese

    query desiderata

    Data              Importo

    01/01/2023

    02/01/2023 

    03/01/2023 300

    04/01/2023

    05/01/2023 200

    etc….fino alla fine del mese

    questa query fa il suo lavoro, cie mi restituisce i i giorni del mese anno desiderato.

    SELECT DateSerial(2023,1,[Giorno]) AS Data
    
    FROM giorni
    
    WHERE (((DateSerial(2023,1,[Giorno])) Between DateSerial(2023,1,1) And DateSerial(2023,1+1,0)))
    
    ORDER BY DateSerial(2023,1,[Giorno]);

    se abbimata a quest'altra:

    SELECT Querygiorni.Data, Query_Calcolata.Totale_Carte, Query_Calcolata.TotaleBuoni, Query_Calcolata.TotaleVarie
    FROM Querygiorni LEFT JOIN Query_Calcolata ON Querygiorni.Data = Query_Calcolata.Data;

    Mi retituise i records che voglio. e fin qui fa il mio caso.

    ora…

    come faccio a fare funzionare tutto in maschera se la prima query non e in maschera?

    ho provato a farlo da vba eseguando prima una query e poi l'altra ma non funziona.

    Dim db As dao.Database
    Dim rst As dao.Recordset
    Dim strSQL As String
    Dim strSQL2 As String
    Dim anno As Variant
    Dim Mese As Variant
    
    Set db = CurrentDb
    
    anno = Forms!Maschera_a!CboxAnno.Value
    Mese = Forms!Maschera_a!CboxMese.Value
    
        strSQL = strSQL & "SELECT DateSerial(" & anno & "," & Mese & ",[Giorno]) AS Data "
        strSQL = strSQL & "FROM Tbl_giorni "
        strSQL = strSQL & "WHERE Data Between DateSerial(" & anno & "," & Mese & ",1) And DateSerial(" & anno & "," & Mese & "+1,0) "
        strSQL = strSQL & "ORDER BY DateSerial(" & anno & "," & Mese & ",[Giorno]);"
    
    
        strSQL2 = strSQL2 & "SELECT strSQL.Data, Query_Calcolata.Totale "
        strSQL2 = strSQL2 & "FROM strSQL "
        strSQL2 = strSQL2 & "LEFT JOIN Query_Calcolata ON strSQL.Data = Query_Calcolata.Data;"
    
    
    Set rst = db.OpenRecordset(strSQL2)
                    
    End Sub
  • Re: Maschera, recordset e parametri non facili da inserire

    E ora che hai creato l'oggetto rst cosa cosa ti aspetti che debba avvenire? Io dico nulla.

  • Re: Maschera, recordset e parametri non facili da inserire

    Una macchina con una chiave per lo sportello dx, una per lo sportello sx, una per il bagagliaio e una per l'accensione funzioneranno per millenni ma ha più senso una chiave unica…

    Ti è stato suggerito che hai a disposizione delle funzioni che ti semplificano la vita ma piuttosto che accrescere la tua cultura ti ostini a perseguire le tue ragioni. 

    Vuoi una tabella che ti estrapola 31 record a gennaio? Usa una query e completa con null i dati mancanti (ergo non serve a niente la tabella giorni) ma nulla ti vieta di continuare ad usarla.

    I punti di riflessione sono:

    1. Funziona da anni eppure oggi hai un problema.
    2. Sei in grado di tirare fuori una query che completa i record mancanti? Sei in grado di crearla formando le date attingendo dalle tabelle giorni e mesi?

    Sostituire il codice per estrapolare e elaborare date da due tabelle monocampo (una da 31 record ed una da 12) con una funzione sulle date è complicato?

    Torniamo al caso in questione.

    Beh, già confondi le maschere con i dati…

    05/02/2024 - Sarri ha scritto:


    come faccio a fare funzionare tutto in maschera se la prima query non e in maschera?

    Probabilmente la maschera deve attingere dalla query…

    Se la tabella ha gli stessi campi della query, staccala dalla tabella (la maschera) e attaccala alla query (da codice) appena finisci ripristini la fonte dati della maschera (sempre da codice).

    O rendi visibile in modo alternato due maschere, una con la tabella e una con la query.

  • Re: Maschera, recordset e parametri non facili da inserire

    05/02/2024 - Sarri ha scritto:


    perche dovrei progettare tutto il database con migliaia di record vuoti che mi servono solo per uno scopo e non per le altre funzioni del database?

    Non tutto il database. Solo che i giorni dell'anno li conosci e li ricavi da un datetimecombo… alla data del datetima hai: giorni, mesi e anni senza tormentarti del bisestile ed in più sai se quel giorno è lunedì.

    Fai tu!

  • Re: Maschera, recordset e parametri non facili da inserire

    Ringrazio del'interesse

    05/02/2024 - sihsandrea ha scritto:


    Ti è stato suggerito che hai a disposizione delle funzioni che ti semplificano la vita ma piuttosto che accrescere la tua cultura ti ostini a perseguire le tue ragioni. 

    alex mi ha sugerito una funzione per trovare l'ultimo giorno del mese.

    05/02/2024 - sihsandrea ha scritto:


    Vuoi una tabella che ti estrapola 31 record a gennaio? Usa una query e completa con null i dati mancanti (ergo non serve a niente la tabella giorni) ma nulla ti vieta di continuare ad usarla.

    I punti di riflessione sono:

    1. Funziona da anni eppure oggi hai un problema.
    2. Sei in grado di tirare fuori una query che completa i record mancanti? Sei in grado di crearla formando le date attingendo dalle tabelle giorni e mesi?

    funziona da anni, ma mi sono rotto ogni volta di valorizare la query per farla funzionare.

    05/02/2024 - sihsandrea ha scritto:


    Beh, già confondi le maschere con i dati…

    05/02/2024 - Sarri ha scritto:


    come faccio a fare funzionare tutto in maschera se la prima query non e in maschera?

    Probabilmente la maschera deve attingere dalla query…

    e obbio che l'origine dati della maschera fa capo a una query.

    ma se leggi bene le query que ho proposto, oppure in bva servono per creare l'origine dati.

    e poi cos'e tutta questa arroganza?

    io non sono un programatore, e non voglio nemmeno esserlo, lo faccio per diletto, vi ho esposto un quesito, se vi da fastidio, non rispondete, le mie conoscenze di access sono limitate.

    e a volte mi blocco in problemi non alla mia altezza.

    io ho chiesto solo come faccio ad inserire il parametro anno e mese nella query sopra citata. stop

    Grazie di tutto.

  • Re: Maschera, recordset e parametri non facili da inserire

    05/02/2024 - Sarri ha scritto:


    e poi cos'e tutta questa arroganza?

    Ecco, siamo arrivati… io mi tiro fuori, non voglio che i miei consigli possano tornarti utili e non ho tempo da perdere… arrangiati

  • Re: Maschera, recordset e parametri non facili da inserire

    Premetto che anche io sono un principiante in Access ed ho imparato molto su questo sito e sul “defunto” Masterdrive. Nei post non c'e' mai arroganza, le persone che rispondono lo fanno sempre e solo nell'ottica di spronare chi chiede consigli, a studiare e sperimentare. La “pappa pronta” non e' prevista…

    Ora so che mi sto muovendo borderline, pero' Ti giro un esempio che ho adottato per estrapolare una query con i giorni del mese partendo dalla data del primo giorno.

    Ho creato due tabelle: nella prima sono salvati i numeri da 1 a 31 (tblGMgiornimensili, campo NUMtabGMgi), nella seconda (tblDIdatainiziomese) e' salvato un solo record con il valore del primo giorno del mese richiesto (DATAtabDIdatainiziomese).

    Ora vedi tu come puoi adattarla al tuo uso.

    Di seguito la query:

    SELECT DateSerial(Year([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),Month([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),[NUMtabGMgi]) AS Data
    FROM tblGMgiornimensili, tblDIdatainiziomese
    WHERE (((DateSerial(Year([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),Month([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),[NUMtabGMgi])) Between DateSerial(Year([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),Month([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),1) And DateSerial(Year([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),Month([tblDIdatainiziomese]![DATAtabDIdatainiziomese])+1,0)))
    ORDER BY DateSerial(Year([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),Month([tblDIdatainiziomese]![DATAtabDIdatainiziomese]),[NUMtabGMgi]);

    Sicuramente ci sono altri metodi per arrivare a quello che chiedi, comunque anche questo e' uno spunto da cui partire.

  • Re: Maschera, recordset e parametri non facili da inserire

    Nessuna arroganza, ci mancherebbe. Ho sollevato alcune perplessità sul tuo modo di approcciarti al problema.

    Siamo tutti lavoratori, appena ho un momento libero simulo la tua situazione e ti indirizzo alla soluzione.

    Un po di pazienza.

Devi accedere o registrarti per scrivere nel forum
17 risposte