Machera continua con numero righe variabili

di il
43 risposte

43 Risposte - Pagina 3

  • Re: Machera continua con numero righe variabili

    https://www.transfernow.net/dl/20250507Va9HMxzn

    per lanciare la maschera i_portafoglio e poi clicca su dossier o titolo

  • Re: Machera continua con numero righe variabili

    07/05/2025 - Scolaretto ha scritto:

    per lanciare la maschera i_portafoglio e poi clicca su dossier o titolo

    ok, perfetto....

    Se imposti il progetto in Visualizzazione a Schede, allora non puoi ridimensionare le Form a meno che siano definite in Popup o Modali o entrambi.

    Questo perchè msaccess con tali impostazioni è come se tenesse le Form in Visualizzazione Maximized

    E questo è normale. E' giusto che si comporti in tale modo.

    Pertanto o imposti :

    • la Finestra in Popup o Modale
    • oppure altra soluzione :
      • crei una nuova form come normalmente le crei
      • all'interno di questa form imposti la tua finestra (per esempio Titolo) come SubForm ( questa SubForm può anche occupare tutta l'area della nuova Form che hai Creato)
      • e a questo punto usi la funzione ridimensionamento SubForm come abbiamo visto in precedenza.
  • Re: Machera continua con numero righe variabili

    Un alternativa, per tenere la riga dei totali vicino ai dati,  può essere quella di non ridimensionare la Form e spostare tale riga in testata pagina

    A questo punto puoi fare a meno di ridimensionare :

    ESEMPIO:

  • Re: Machera continua con numero righe variabili

    Altra alternativa è quella di aggiungere come ultimo record una riga che conterrà i totali :

    1. Elaborare il RecordSource da Vba
      1. Popolare un nuovo recordset con i records da visualizzare
      2. Aggiungere come ultimo Record i Totali
    2. Passare alla Form il nuovo RecordSource
      1. con la formattazione puoi cambiare aspetto a questa ultima riga inserita

    .
    Come risultato vedrai tutti i records come prima ma con una riga aggiuntiva che rappresenta i totali

    • Svataggi:
      • se il numero dei records accupano più pagine, per visualizzare i totali dovrai necessariamente andare sull'ultima pagina
      • richiede una maggiore programmazione/personalizzazione
      • si possono perdere : fessibilità, automatismi, etc...

    .
    Metodo Sconsigliabile !... ma si può fare, dipende dai scenari e obbiettivi

  • Re: Machera continua con numero righe variabili

    Ti ringrazio per tutte le informazioni date, sicuramente non adotterò la soluzione di incrementare il recordset, per il resto ci lavoro e vedo di trovare , tra le n possibilità fornite, quella che più mi piace.

    Ciao e grazie di nuovo.

  • Re: Machera continua con numero righe variabili

    Ottimo... bene così.

    L'importante tu abbia capito la logica di come si comporta MsAccess e da qui sai se certe cose si possono o meno fare o se conviene e come farle.

    Come si dice... il sapere non ha mai limiti, l'importante è sapere perchè solo con la conoscenza si ha coscienza (...hmmm  più o meno nà cosa del genere)  ;-)

    Ho dato una piccola occhiata al Vba ... se posso di darei alcuni piccoli suggerimenti:

    1. Non sempre hai usato "Option Explicit" ... usalo e Compila, in questo modo MsAccess ti segnala le mancate dichiarazioni e/o eventuali errori di sintassi e/o altro
    2. Non sempre chiudi gli oggetti che hai dichiarato... per esempio :
      1. quando occorre a fronte di dichiarazioni DAO.Database (non sempre necessita eseguire la Close e basta un Nothing per rilasciarlo)
      2. oppure DAO.Recordset che necessariament eè bene chiuderlo con la Close e rilasciarlo conil Nothing
      3. oppure Object generici per i quali basta rilasciarli con il Nothing
    3. In alcuni casi hai dichiarato DAO.Database e lo hai usato... ma al tempo stesso, nella stessa routine, poi usi anche CurrentDb.Execute al posto di Db.Executive. Direi delle due una... qui puoi semplificare usandoo una tecnica o l'altra.
      1. alternativa usare DBEngine(0)(0) ... più performante (ho visto che in un solo caso l'hai utilizzato)
    4. La gestione Errori andrebbe usata con criterio e parsimonia... Personalmente evito di utilizzare la gestione errori. Cerco sempre di affinare e implementare i controlli per non avere errori a  prescindere. Se uso la gestione degli Errori è solo in certi contesti imponderabili, dove l'eventuale errore non si può intercettare diversamente con controlli preventivi etc...
    5. I commenti, mancano tantissimo... mio cruccio ;-)
      1. Mancano i Titoli delle ROUTINE per descrivere i compiti svolti dalle Sub e dalle Function
      2. Mancano i commenti alle righe di codice. Sono indispensabili per descrivere il flusso del codice. Aumenta la chiarezza, leggibilità e rileggibilità indispensabile a distanza di tempo. Perchè un conto è scrivere e rileggere nell'immediato il codice appena scritto... ma a distanza di un mese o di un anno? magari non hai più in testa l'intero flusso del progetto e farai tanta fatica a rileggerlo se occorre apportare modifiche, correzioni e implementazioni.

    .
    Insomma, personalmente tenevo a evidenziare alcune cose utilii per migliorare e rendere più robusto l'intero progetto.

    Buon lavoro,alla prox...  ;-)

  • Re: Machera continua con numero righe variabili

    Ti ringrazio per i suggerimenti e ne farò tesoro. Alla prossima

  • Re: Machera continua con numero righe variabili

    07/05/2025 - Scolaretto ha scritto:

    Ti ringrazio per i suggerimenti e ne farò tesoro. Alla prossima

    Ma di nulla, ci mancherebbe... è solo un piacere se ti torna utile...  ;-)

    Vorrei lasciarti un esempio concreto peri 5 punti/spunti che ho lasciato in precedenza. (spero ti torni utile)

    Per realizzare questa funzione esistono diversi metodi e tecniche. Ne prendiamo solo due per fare l'esempio.

    Primo ESEMPIO utilizzando DBEngine(0)(0) , nessuna Gestione degli Errori, etc etc...

    Analisi Function:

    • Viene dichiarata una variabile di tipo Variant che conterrà i risultati restituiti dalle Stringhe Sql eseguite con DBEngine
    • Il primo DBEngine : si fa carico di verificare l'esistenza della tabella TraceNumber e restituisce 1 se la tabella esiste, restituisce 0 se la tabella non esiste
    • Il secondo DBEngine : se esiste la tabella TraceNumber, allora si fa carico di verificare se la somma dei valori della colonna TraceNumber > 0
      • se > di 0 viene impostato il valore di ritorno della Function = True
      • altrimenti viene impostato il valore di ritorno della Function = False
    • Cosa non fa la Function:
      • nessuna gestione degli errori per verificarese la tabella esiste o meno
      • nessuna dichiarazione nuovi oggetti Database e Recordet
      • nessuna operazione di chiusura e di rilascio dalla memoria degli oggetti Database e Recordset

    ..


    Secondo ESEMPIO utilizzando Oggetti Espliciti per la connessione al database, al recordset e una gestione degli errori

    Analisi Function:

    • Viene impostatoun valore di Default = False che restituirà la Function in caso di errori
    • Viene dichiarato un oggetto Dao.Database
    • Viene dichiarato un oggetto Dao.Recordset
    • Viene attivata una Gestione Errori
    • Viene impostato CurrentDb per aprireun Recordset
    • Viene impostato un Recordset per ricevere dalla connessione al Db il risultato di una Stringa Sql
    • Viene letto il Recordset (rst) per determinare se esiste almeno un record
      • se esiste almeno un record allora si prende il Valore della somma della Colonna TraceNumber
        • se > di 0 viene impostato il valore di ritorno della Function = True
        • altrimenti la Function ritorna il valore di Default che ha assunto  all'inizio della routine - Function = False
    • Vengono eseguite le operazioni al termine della Function sia per la condizione di errori intercettati oppure no
      • si deve verificare se necessario chiudere il Recordset, dipende se si sono verificati errori oppure no e in quale punto della Function
      • si rilasciano dalla memoria gli oggetti Database e Records
    • Cosa non fa la Function o cosa potrebbe fare ?
      • si potrebbe eliminarela gestione degli errori e in tal caso:
        • dichiarare un nuovo oggetto TableDef - Dim tdf As DAO.TableDef
        • enumerare con TableDef gli oggetti presenti in MsAccess
          • determinare se la tabella MyTableTrace esiste
          • se esiste allora procedere nel verificare se esiste il Recordset e ricavare il valore della somma nella colonna TraceNumber, etc...
        • allafine della function aggiungere il rilascio dell'oggetto TableDef

    .

    Come puoi vedere le due function, anche se in modo diverso, fanno la stessa cosa e restituiscono lo stesso risultato.
    Il codice è documentato riga per riga nelle parti salienti. Quindi sappiamo, oggi come fra enne anni, cosa fa e come lo fa.

    Considerazioni finali:

    1. Il primo ESEMPIO con due semplici Stringhe Sql estrae le informazioni che necessitano e con un solo controllo restituisce il valore di ritorno per la Function
      1. usa pochissime righe di codice rendendo la Function coincisa, di facile leggibilità e manutenibilità
      2. controlla eventuali errori prima di procedere
      3. utilizza e libera la memoria in automatico 
      4. è molto performante

        .

    2. Il secondo ESEMPIO utilizza più oggetti
      1. più righe di codice
      2. una gestione errori con le sue problematiche se non gestita in modo dettagliato
      3. utilizza più oggetti per fare riferimento al database e per estrarre e popolare un recordset
      4. alla fine dei processi si deve controllare/verificare quali oggetti chiudere e quali rilasciare dalla memoria
      5. meno performante del primo Esempio
        1. utilizza esplicitamente degli oggetti
        2. gli oggetti devono poi essere rilasciati manualmente dalla memoria 

    .

    .Personalmente preferisco usare il primo esempio di codice.
    Ecco qua... questi due esempi riepilogano i 5 piccoli consigli che in precedenza mi ero permesso di dare.

    Tra le altre cose con DBEngine puoi fare proprio tutto.
    Tutte le operazioni che esegui con gli oggetti DAO.Database e DAO.Recordset, le puoi tranquillamente eseguire con DBEngine.
    Rendi il codice più performante, coinciso e robusto soprattutto se devi leggere un valore di ritorno dalle varie stringhe Sql.
    Oppure poni il recordset estratto con DBEngine nel tuo DAO.Recordset per poter leggere e scorrere i records estratti, etc... etc...:
    Esempio:

    Oppure senza dichiare un nuovo oggetto Recordset ... basta leggere quello restituito direttamente da DBEngine
    (ANCORA PIU' SEMPLICE, COINCISO E PERFORMANTE)

    .
    Stessa cosa per eseguire Insert / Update / Delete / Drop / Etc...

    In questi casi non devi dichiare oggetti, chiuderli e rilasciarli. Ti basta eseguire la riga di codice DBEngine.
    Si semplifica tantissimo, si migliorano le performance, puoi controllare eventuali errori di ritorno con dbFailOnError, etc... 

     
    mo' basta ... non ti annoio più con ste' cose, era solo per chiudere una parentesi aperta nel Thread... Prova a Provare...  ;-)

  • Re: Machera continua con numero righe variabili

    L'unica cosa certa è che non mi annoi, per chi come me è un autodidatta apprendere nuove cose non fà che piacere  ringrazio e grazie

  • Re: Machera continua con numero righe variabili

    @By65Franco: hai il dono di far sembrare semplice anche le cose piu' complesse. Un grande aiuto per gli autodidatti..

    Domanda: l'immagine seguente e' presa da un libro o qualche documentazione in particolare, o la hai scritta tu? E' molto interessante e scritta bene. Se fosse in un libro, e' sicuramente da acquistare...

    Grazie

  • Re: Machera continua con numero righe variabili

    08/05/2025 - Mailman ha scritto:

    @By65Franco: hai il dono di far sembrare semplice anche le cose piu' complesse. Un grande aiuto per gli autodidatti..

    Domanda: l'immagine seguente e' presa da un libro o qualche documentazione in particolare, o la hai scritta tu? E' molto interessante e scritta bene. Se fosse in un libro, e' sicuramente da acquistare...

    Ciao, 

    no no no ... oggi ho messo quasi tutto in Immagini, testo e codice per via del fatto di aver impiegato tanto tempo per scrivere la documentazione e avevo paura di perdere fino al punto in cui ero arrivato tenendo così tanto tempo aperto il Post da Inviare 
    (non è la prima volta che mi capita di perdere tutto e dover rifarsi da capo)  ;-)

    Quindi via via ho scritto in Word e poi ho fatto gli screeshot da incollare qui.  Solo per semplicità e sicurezza e per la formattazione del testo ;-))    Esempio:

    Per quanto riguarda la documentazione di DBEngine, si trova veramente poco o niente. 
    https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/dbengine-object-reference-dao
    https://learn.microsoft.com/en-us/office/vba/api/access.application.dbengine
    https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/dbengine-object-dao
    https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/dbengine-members-dao

    Ma in pratica è simile a CurrentDb, con la differenza che poi il CurrentDb internamente utilizza DBEngine motore del DAO. 

    Bisogna stare attenti ad utilizzare DBEngine perchè è come se fosse una unica istanza sempre aperta gestita direttamente dal DAO.
    In determinati casi (molto raro) si rischia di andare avanti con altre operazioni mentre lui sta ancora rilasciando le disposizioni impartite. Ma è più performante.
    Mentre con una nuova istanza CurrentDb, al termine della stessa le transazioni sono sicuramente terminate e sincronizzate. Ma è meno performante.
    Quindi va utilizzato nei contesti giusti e con criterio. (come negli esempi che ho postato in precedenza)

    Ad ogni modo un vero esperto in merito è @Alex, un guru del Vba.

  • Re: Machera continua con numero righe variabili

    08/05/2025 - Mailman ha scritto:

    Se fosse in un libro, e' sicuramente da acquistare...

    eh no, non è un libro ;-)

    Ma non consiglierei mai e poi mai di acquistare libri, prendono polvere, diventano subito vecchi e costano... ;-)
    per MsAccess si trova tutta la documentazione nel support tecnico Microsoft
    Esempio: https://support.microsoft.com/it-it/access?utm_source

    Già da qui si può iniziare a conoscere, testare, approfondire e imparare dalle basi in poi l' MsAccess

    Per il VBA puoi fare riferimento partendo da qui : https://learn.microsoft.com/en-us/office/vba/api/overview/ c'è veramente tutto quello che serve.

  • Re: Machera continua con numero righe variabili

    Direi, prima di andare a cercare di fare certi preziosismi, di preoccuparti di rendere efficente la struttura del database che è la cosa più importante.

    Di seguito vedi quella tua attuale, migliorata solo nella visibilità:

    manca:

    • una corretta gestione delle relazioni, vedi A_TblConti-D_MovimentiV1-D_AnaDossier ecc...
    • una corretta gestione dei campi, vedi la ridondanza del campo Idconto
    • la mancanta relazione per diverse tabelle, che non si capisce quindi perchè siano state create
    • ecc...

    Mi auguro che la struttura reale del tuo database non sia uguale a quella di questo che hai postato.

  • Re: Machera continua con numero righe variabili

    Stifone, ti ringrazio per in consigli ma le relazione che ho inviato non sono quelle reali, ci stò ancora lavorando sopra.

Devi accedere o registrarti per scrivere nel forum
43 risposte