Assegnazione range di valori a variabile temporanea

di il
50 risposte

50 Risposte - Pagina 2

  • Re: Assegnazione range di valori a variabile temporanea

    Buongiorno Sihsandrea ti ringrazio molto per il tuo approfondito e articolato contributo.

    Farò tesoro dei tuoi consigli su come sviluppare e strutturare il report di base.

    All'inizio del tuo scritto dici che Dal tipo di tabelle e richiesta avevo intuito che c'era un errore nel trattare le tabelle”. 

    Non ho capito però a cosa ti riferisci. Ti dispiacerebbe spegarmelo meglio ?

    Ti ringrazio in anticipo.

  • Re: Assegnazione range di valori a variabile temporanea

    07/07/2023 - BarLudwig ha scritto:


    Buongiorno

    Ho una query che mi seleziona i campi di una tabella (Ente, Codice fiscale, idformagiuridica, indirizzo etc.) e che vorrei filtrare sulla base dei valori del campo idformagiuridica che è un campo di tipo numerico.

    Ho poi un menù con due pulsanti di comando, dei quali il primo mi dovrebbe selezionare gli enti che sono costituiti in forma societaria (idforma giuridica da 1 a 10) e il secondo gli altri enti  (idformagiuridica da 11 a 16).

    Se tra i criteri della query nel campo idformagiuridica inserisco : beetween 1 and 10 , ovvero beetween 11 and 16, a seconda dei casi, ottengo il risultato desiderato.

    Ho provato ha impostare una variabile temporanea (VarTempidFormaGiuridica) nei pulsanti di comando, ma non riesco a individuare la sintassi da utilizzare in una routine VBA per assegnare nei pulsanti di comando i criteri che mi consentano di ottenere tramite codice VBA gli stessi risultati che ottengo inserendo i criteri direttamente nella query. Ho provato in tutti i modi possibili senza successo. Qui di seguito solo alcuni esempi.

    TempVars.Add "VarTempidFormaGiuridica", beetween 1 and 10
    TempVars.Add "VarTempidFormaGiuridica", >=10
    TempVars.Add "VarTempidFormaGiuridica",  “>=10”

    Probabilmente mi sto perdendo in un bicchiere d'acqua, ma vi sarei grato se qualcuno mi potesse aiutare. 

    Grazie mille ….. 

    Da quello che ho capito, leggendo anche gli altri interventi è che stai cercando di realizzare una ricerca multivalore.

    Mi dispiace dirti che l'approccio, sia logico che procedurale è completamente sbagliato.

    Per prima cosa, non puoi vincolare la ricerca usando le chiavi primarie in questo modo, perchè le chiavi primarie sono ad uso e consumo di access e le gestisce in modo automatico, indipendentemente dall'operatore, ed in alcuni casi, potrebbe anche cambiarle. Infatti se venisse fatto un “ripristina e compatta database”, access, potrebbe anche cambiarle per delle sue esigenze per correggere eventuali errori interni del database. Le chiavi primarie sono un indice che nel 99% dei casi l'operatore o lo stesso programmatore non conosce.

    Se si ha bisogno di una definizione o di un codice personalizzato, si crea usando un altro campo, che rispecchi una logica e delle regole create dall'utilizzatore o dal programmatore.

    Così facendo, ti sballerebbe del tutto la ricerca.

    Ti sei lasciato forviare dal fatto che tu vedi i codici id associati da access ai dati che hai immesso. Ma usando questo metodo, se dopo un anno di scrittura di codice, vai   ad esempio a cancellare uno o tutti i dati che hai immesso e li reinserisci, i numeri ID cambiano e quindi non ti funziona più niente, costringendoti a ricominciare dall'inizio.

    E' vero che si filtra la chiave primaria, ma sempre in base ad un altro valore  che rimane immutato e soprattutto conosciuto dall'operatore. Quindi la query, il filtro o la ricerca deve essere sempre basata su un valore, scelto a video dall'operatore da cui access andrà a ricavare la rispettiva chiave primaria per eseguire la ricerca o al query.

    Quindi non devi confrontare in modo diretto gli ID, ma andare a recuperare il relativo numero ID corrispondente ad una determinata categoria. Ora tu stai facendo il contrario e non va bene.

    Se hai bisogno di codici, li devi creare manualmente e personalizzati

    Ad esempio se hai la forma societaria SPA, SNC e cooperativa, dovrai creare un relativo campo dove inserirai SPA, codice 1: SNC codice 2 e così via. Se poi il codice ID dei relativi record è 1, 30, o 500 non è un problema che devi gestire. A quello ci pensa access.
    Quindi tu andrai a scrivere una query che ricercherà i codici da 1 a 3 del tuo campo personalizzato. Sarà poi access che provvederà ad usare i relativi codici ID.

    Quindi sarà l'operatore che crea e gestisce i relativi codici

    Usare le vartemps per quello che stai cercando di fare è come sparare ad una zanzara con un cannone e stai solo complicandoti la vita ed inoltre non sono lo strumento adatto per quello che stai cercando di fare. Le var temps sono variabili di ambiente che rimangono fisse e visibili in tutto il database, e solitamente una volta impostate non si cambiano. Le ricerche sono variabili ed una volta usate non c'è bisogno che rimangono in memoria. Le vartemps, sono poi dati variant che occupano un sacco di memoria e risorse.

    Ti sono stati dati molti consigli giusti.

    Quindi puoi usare una comobox, se la ricerca è dettata da un singolo valore.

    Un button flag se è dettata da più di un valore e vuoi realizzare una cosa funzionale, intuitiva e veloce senza dover scrivere codice,

    Oppure una list box per valori multivalore un pochino più professionale, ma sicuramente più ostica da programmare e gestire.

    Oppure usare i pulsanti come stai facendo, ma questo implica che se venisse aggiunta un'altra categoria, ad esempio con codice id 17 non sarebbe considerata nella ricerca e dovresti andare a modificare il codice vba. Se poi, come accadrà, avrai bisogno di compilare il database per impedire modifiche accidentali, sarà impossibile modificare il codice ed avrai un programma inutilizzabile.

    Qualsiasi sia la tua scelta però, devi cambiare approccio logico al problema, altrimenti ti ritroverai sempre dei problemi.

  • Re: Assegnazione range di valori a variabile temporanea

    Buongiorno Fratac

    ti ringrazio per la tua esposizione sull'utilizzo dei campi ID e delle chiavi primarie nelle operazioni di filtro e di ricerca che è chiarissima e mie è risultata molto utile.

    Per quanto riguarda il problema specifico che vi ho sottoposto, probabilmente senza la necessaria chiarezza, considerando che :

    I dati delle società e degli enti sono memorizzati in una unica tabella composta da 4 campi: id, nome, idFormaGiuridica e idTipoPartecipata. I campi  idFormaGiuridica e idTipoPartecipata fanno riferimento a due tabelle in relazione uno a molti con quella contenente i dati delle società e degli enti.

    Ho una form menu con diversi pulsanti di comando, tra i quali uno (cmdVisualizzaSocietà) per aprire un'altra form in cui è presente una cbo che visualizza i nomi delle società ,e un altro (cmdVisualizzaEnti) che apre la medesima form nella quale la cbo visualizza i nomi degli enti non costituiti in forma societaria.

    La cbo attualmente si basa su una query parametrizzata sul campo idFormaGiuridica attraverso la famigerata tempvars (VarTempFormaGiuridica) che assume valore diverso a seconda del comando scelto nella form Menu.

    Forse la soluzione più semplice è ricorrere al button flag. Cosa ne pensi ?

    Grazie nuovamente per il tempo che mi hai dedicato.

  • Re: Assegnazione range di valori a variabile temporanea

    Oppure usare i pulsanti come stai facendo, ma questo implica che se venisse aggiunta un'altra categoria, ad esempio con codice id 17 non sarebbe considerata nella ricerca e dovresti andare a modificare il codice vba.

    Ni. Nel senso che puoi caricare la query da un file.dat o txt o da una tabella miequery dove avrai inserito la query. Tabella accessibile da un form manutenzione magari con utente e pw amministratore.

    Magari anche scritta con una funzione di criptatura decriptatura.

  • Re: Assegnazione range di valori a variabile temporanea

    09/07/2023 - sihsandrea ha scritto:

    Ni. Nel senso che puoi caricare la query da un file.dat o txt o da una tabella miequery dove avrai inserito la query. Tabella accessibile da un form manutenzione magari con utente e pw amministratore.

    Magari anche scritta con una funzione di criptatura decriptatura.

    Siamo passati da un problema che, usando il wizard di access si risolve in 5 secondi e con una semplicissima query di selezione inserita nella fonte dati (quindi senza vba o macro) tipo 

    Select idsocietà from tabella società where [checkbox]= true

    ad una soluzione che implica oltre 250 righe di codice di vba, una crittografia, un salvataggio di file in una cartella predefinita, gestione di utenti e password (e sappiamo che access non brilla sotto questo aspetto, se non creando funzioni molto strutturate e complicate), livelli e l'aggiunta di minimo di altre due tabelle.

    Tutto questo solo per realizzare una cosa che si trova alla terza pagina di qualsiasi manuale di access.

    Inoltre si continua ad usare il numero id come metodo di ricerca esplicita, che ripeto è completamente sbagliato. 
    Ma se per un qualsiasi motivo invece che incrementale, fosse casuale, come si fa a gestire in modo esplicito un id= 1234534E2 e dove il successivo è 3453298E4 ed il terzo -2534523452e4 ?
    Scriviamo una condizione IF o select, ogni volta che aggiungiamo una tipologia?
    E se il database è compilato?
    Il problema nasce proprio dall'approccio logico che è completamente sbagliato e che costringe a mettere toppe di continuo, perchè ad ogni passaggio si crea un nuovo problema.

    Ripeto quello che si sta cercando di fare si fa (a livello basico) con una banalissima query di selezione e con il wizard di access.

  • Re: Assegnazione range di valori a variabile temporanea

    Buonasera a tutti

    in generale dai vostri consigli e osservazioni anche critiche ho appreso molte cose di fondamentale importanza che ignoravo, relative ai principi generali che governano lo sviluppo di un database e che mi sono e saranno molto utili. 

    Tirando le conclusioni su come regolarmi per lo specifico problema per il quale ho chiesto il vostro aiuto, anche in base alle considerazioni di fratac  sui campi da utilizzare per i filtri e le ricerche, e poichè ho bisogno dei pulsanti di comando da inserire nella form che utilizzo come Menu, mi servirò per il momento delle variabili temporanee alle quali assegnerò il valore del campo di testo “forma giuridica” anziché l'idFormaGiuridica. Infatti anche nell'ipotesi che in futuro vengano introdotte nuove tipologie di persone giuridiche,  è abbastanza plausibile che le società verranno sempre identificate con la forma “società per……..” ovvero “società a ……”: di conseguenza uno dei criteri di ricerca/filtro può essere il termine “società” o “s*”.

    Proverò poi a introdurre un ulteriore campo nella tabella tblFormaGiuridica per distinguere a monte le società dagli enti e che dovrà essere inserito dall'utilizzatore del database nella remota ipotesi di introduzione di nuove persone giuridiche, fermo restando l'utilizzo delle Tempvar cui assegnerò il valore di tale campo nelle due diverse ipotesi.

    Probabilmente così facendo continuerò a usare un cannone per sparare una zanzara ma, al momento

    Grazie a tutti per l'aiuto e la disponibilità.

  • Re: Assegnazione range di valori a variabile temporanea

    Buonasera Fratac

    poiché non riesco ad afferrare la tua osservazione che basterebbe una query di selezione per risolvere il problema in 5 secondi “Select idsocietà from tabella società where [checkbox]= true” cerco di precisare i termini della questione sulla quale mi state aiutando.

     Routine che ho inserito nella form Menu:

    Private Sub cmdModSocietà_Click()

    On Error GoTo cmdModSocietà_Err

       DoCmd.Close acForm, "Menu"

       DoCmd.OpenForm "frmDatiEntiSocietà", acNormal, "", "", acFormReadOnly, acWindowNormal

       TempVars.Add "VarTempFormaGiuridica", "s*"

    cmdModSocietà_Exit:

    Exit Sub

    cmdModSocietà_Err:

       MsgBox Error$

       Resume cmdModSocietà_Exit

    End Sub

    Private Sub cmdModEnti_Click()

    On Error GoTo cmdModEnti_Err

    DoCmd.Close acForm, "Menu"

    DoCmd.OpenForm "frmDatiEntiSocietà", acNormal, "", "", acFormReadOnly, acNormal

       TempVars.Add "VarTempFormaGiuridica", "[abcdefgilmnopqrtuvz]*"

    cmdModEnti_Exit:

       Exit Sub

    cmdModEnti_Err:

     MsgBox Error$

       Resume cmdModEnti_Exit

    End Sub

    Entrambe le routine richiamano la medesima form. Nella form c'è una cbo che ha come origine dati la seguente istruzione SQL

    SELECT tblAcronimi.idAcronimo, tblAcronimi.acronimo, tblAcronimi.idFormaGiuridica, tblFormaGiuridica.FormaGiuridica
    FROM tblAcronimi INNER JOIN tblFormaGiuridica ON tblAcronimi.idFormaGiuridica = tblFormaGiuridica.IdFormaGiuridica
    WHERE (((tblFormaGiuridica.FormaGiuridica) Like [TempVars]![VarTempFormaGiuridica]) AND ((tblAcronimi.[Tipo partecipata])="1"))
    ORDER BY tblAcronimi.acronimo;

    In virtù del valore assunto dalla TempVar nella cbo mi mostra in un caso l'elenco delle società, nell'altro l'elenco degli enti non societari.

    Poiché mi farebbe piavere ovviamente risolvere il problema in maniera più semplice, mi potresti chiarire come dovrei modificare l'impostazione probabilmente inefficace che ho utilizzato e dove dovrei inserire la query che mi hai suggerito ?

    Grazie ancora

  • Re: Assegnazione range di valori a variabile temporanea

    09/07/2023 - BarLudwig ha scritto:


    poiché non riesco ad afferrare la tua osservazione che basterebbe una query di selezione per risolvere il problema in 5 secondi “Select idsocietà from tabella società where [checkbox]= true” cerco di precisare i termini della questione sulla quale mi state aiutando

    Chiariamo subito che il codice che ho scritto, non funziona, è solo per indicare la logica per affrontare il problema per impostare la query di selezione. Poi è normale che nella realtà ci siano i join ed altri valori. Ma il concetto logico e di base è sempre lo stesso.

    Ma perchè continui ad usare le tempsvar, quando usando openargs fa tutto da solo e se usi lo split puoi mettere tutti i valori che vuoi in una singola linea di testo e gestire tutto con le select?

  • Re: Assegnazione range di valori a variabile temporanea

    09/07/2023 - fratac ha scritto:


    Ma perchè continui ad usare le tempsvar, quando usando openargs fa tutto da solo e se usi lo split puoi mettere tutti i valori che vuoi in una singola linea di testo e gestire tutto con le select?

    Caro Fratac il motivo è molto semplice: perché sto con difficoltà cercando di imparare ad utilizzare Access e il VBA, mentre contemporaneamente, per motivi professionali, devo realizzare il DB di cui stiamo discutendo.

    Utilizzo le TempVars perchè, studiando le possibili soluzioni al mio problema, consultando un manuale, mi sono imbattuto in questo strumento.

    In realtà non so cosa sia e come si utilizzi openargs e cosa significhi usare lo split.

    Cercherò di documentarmi.

    Grazie ancora

  • Re: Assegnazione range di valori a variabile temporanea

    Ho scartabellato tra i vari database che nel corso degli anni ho realizzato.

    Ne ho trovato uno dove ho una funzione di ricerca praticamente identica a quella che serve a te.

    Un database su cui archiviavo le serie tv che vedevo e volevo vedere, con il numero di episodi, le stagioni,lo stato di avanzamento della visione, lo stato della serie e molto altro.

    Ora ne uso uno diverso, ma è tutto automatizzato tramite json che si collegano ai database di film e wikipedia, che mi riempiono in automatico tutti i dati necessari prelevati dai loro archivi e non fa al caso nostro.

    Premetto che il codice è scritto velocemente e a coda di gatto, ma rende l'idea dell'approccio logico e strutturale.

    E premetto anche che questo è uno dei tantissimi modi con cui si può realizzare.

    Tutto si avvale di due semplici form

    un form serietv, che uso per inserire, modificare, cancellare e ricercare le serie tv

    ed un form ricerche, al quale passo i dati da ricercare al form serietv che saranno filtrati tramite la funzione filter e non tramite query.

    Uso filter perchè serietv essendo un form multifunzione ha una fonte dati propria e quindi al caricamento ha già tutti i dati necessari e quindi non c'è bisogno che vada ad utilizzare una query. Basta semplicemente filtrare i dati già caricati dalla fonte dati.

    Quello che ci interessa è il form di ricerca ed il codice che fa funzionare il tutto.

    L'immagine è questa.

    Ogni controllo che vedi, non è associato, quindi tutte le azioni vengono controllate tramite vba.

    Ogni controllo, con il dato selezionato va ad aprire il form serietv, al cui caricamento, in base ai valori che gli passo, filtra i relativi dati che mi interessano. Se non viene passato nessun dato o viene aperto in modo indipendente, cioè senza passare per la ricerca il form seritv si apre senza filtri, visualizzando tutte le serie tv inserite ed è pronto per l'inserimento di una nuova serie tv, oppure navigare su tutte le relative serie.

    Ora quello che ci interessa è come funziona la combobox stato ed il relativo codice, sia lato form ricerche, sia lato form serietv quando viene caricato.

    vediamo i valori che contiene la combo stato. Valori che posso tranquillamente aggiungere, cancellare o modificare, senza che questo vada ad influire sulla ricerca o che necessitano di modifiche al codice vba.

    La combo box stato ricava i dati da una tabella dove sono contenute tutte le voci corrispondenti.
    Quindi molto simile al tuo scenario.

    Quindi se vado a selezionare la voce Vista, il form serie tv si aprirà con tutte e solo le serie che ho già visto e così via per tutte le altre voci.

    vediamo ora come funziona sia a livello logico che strutturale.

    La combo non è associata, quindi significa che devo gestire tutto manualmente

    Per far funzionare la ricerca e passare i valori al form serie tv che andrò ad aprire, mi avvalgo della funzione nativa “openargs” del metodo openform. Praticamente openarg funziona come una variabile globale o una vartemp, ma è molto più semplice e funzionale da usare perchè:


    - lo si dichiara al momento quando occorre, quindi rende più semplice per il programmatore la lettura e la comprensione del codice. E se lo si deve modificare, non bisogna andarlo a ricercare tra i vari moduli o altri codici, proprio perchè viene dichiarato prima della chiamata openform, sta li, proprio una riga sopra.
    - e' temporaneo e vale solo per la chiamata per il quale lo si usa. Quindi nessuna confusione in caso ci si dimentichi di azzerarlo o lo si usi in modo improprio, cosa invece che accade spesso con le vartemps o le variabili globali.
    - non usa grandi quantità di risorse ed una volta usato non esiste più.
    - con particolari accortezze (come vedremo) si possono passare tutti i valori desiderati.

    Fatte queste premesse vediamo i vari codici vba che stanno dietro.

    Se non conosci o capisci qualche comando che ho usato, ti consiglio di ricercarlo su internet. Non conosco le tue competenze e dovendo spiegare tutto, praticamente ci passiamo la notte.

    Questo è il codice che sta dietro alla combo box stato.

    Private Sub Testo17_AfterUpdate()
    Dim casella As String
    
        If IsNull(casella = Me.Testo17.Value) Then
        Exit Sub
          
        Else
    
            casella = ("3" & Me.Testo17.Value)
    
        End If
    
     DoCmd.OpenForm "Serie_tv2", , , , , , casella
    End Sub
    

    Allora. 
    testo17 è il nome della combobox “stato”

    Casella è una variabile che uso per costruire la stringa che mi servirà per passare i valori con il quale voglio che venga fatta la ricerca su serie tv.
    E' una variabile che è valida esclusivamente per questa sub, quindi non visibile agli altri elementi del progetto ed una volta usata sparisce.

    Naturalmente potresti obiettare che potrei usare una globale o una vartemp.

    Certo, potrei farlo, ma se usassi una variabile globale, ogni volta che la uso, dovrei sapere come è stata dichiarata e ricordarmi di azzerarla se non deve rimanere con un valore,  e se per un qualsiasi motivo mi dimenticassi in fase di stesura del codice di fare una di queste operazioni, avrei un valore sbagliato, che mi sballerebbe la ricerca. E' facile fare il debug di 4 righe di codice, ma quando si hanno migliaia di righe di codice e centinaia di form e tabelle e query, collegate tra di loro, se ci si dimentica di riassegnare una variabile globale, fare il debug diventa una cosa complessa da far vedere i sorci verdi e prendere il calendario in mano, nominando tutti i santi scritti, compresi quelli minori per ogni giorno che si trovano sul calendario di Barbanera.

    Come avrai notato la variabile casella viene costruita in un modo un po' particolare.

    casella = ("3" & Me.Testo17.Value)

    Praticamente è una stringa costruita composta da due elementi

    “3” che è un mio indice personalizzato e che non è salvato da nessuna parte, se non nel codice VBA

    Me.testo17.value è il dato effettivo che userò per filtrare in apertura i dati del form serie tv.

    Perchè ho bisogno di un indice?

    Il form serietv è un form, come detto, multifunzione che riceve comandi diversi da diversi form o controlli esterni, quindi come vedremo poi, ad ogni azione che voglio che venga effettuata, usando un indice personalizzato, con una select andrò ad attivare il relativo codice che venga usato.

    Quindi nel codice degli altri controlli combobox, avremo una variabile casella costruita con un indice “1", ”2" e così via, per selezionare il codice lato form serietv, corrispondente all'azione preposta.

    Naturalmente se dovessi aggiungere un ulteriore controllo che mi fa una ricerca diversa, devo aggiungere anche il relativo indice ed il relativo codice di attivazione sul form serie tv, ma è una modifica strutturale indispensabile anche se non usassi un indice, diversa dal problema che ti ritroveresti con il tuo codice se vai ad inserire un nuovo identificativo delle società.

    veniamo quindi al comando openform e i relativi metodi:

    OpenForm (FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs)

    io ho scritto questo:

    DoCmd.OpenForm "Serie_tv2", , , , , , casella

    Serie_tv2 è il form che andrò ad aprire

    tutte le virgole servono per specificare che tutti i metodi (come View, filtername…) non verranno utilizzati e casella è la variabile composta che andrò ad usare per il metodo OpenArgs.
    Cioè il form serietv, verrà aperto in base ai valori di casella che vengono passati tramite openargs.

    ora vediamo il codice vba lato form serietv che viene eseguito al caricamento del form.

    Private Sub Form_Load()
    Dim variabile As String
    Dim controllo As String
    Dim dato As String
    
    
    If IsNull(variabile = Me.OpenArgs) Then Exit Sub
    
    
    variabile = Me.OpenArgs
    controllo = Left(variabile, 1)
    dato = Mid(variabile, 2)
    
    Select Case controllo
        Case "1"
            Me.Filter = "ID_serietv =" & dato
        Case "2"
        
        dato = Chr(34) & dato & Chr(34)
            Me.Filter = "avanzamento =" & dato
        Case "3"
        
        dato = Chr(34) & dato & Chr(34)
           
            Me.Filter = "stato =" & dato
            
        Case "4"
        dato = Chr(34) & dato & Chr(34)
        Me.Filter = "Nome_serie =" & dato
        
    
    End Select
    
    
    
    
    Me.FilterOn = True
    End Sub

    Da chiarire immediatamente che in questo codice non ho usato la funzione split, cosa che mi avrebbe facilitato molto le cose. Ma purtroppo all'epoca, mi ero proprio dimenticato della sua esistenza e quindi ho usato il metodo arcaico che si usava prima della sua introduzione, cioè usare una serie di variabili, e la manipolazione delle stringhe in base ai dati da dividere ed assegnare alle varie variabili.

    Ma il concetto è praticamente lo stesso.

    variabile = Me.OpenArgs

    Con Me.openArgs, recupero i dati che ho passato dal form ricerche e li assegno alla variabile, “variabile”. (mai chiamare una variabile, con il nome variabile, crea solo confusione, ma come detto il codice è scritto a coda di gatto)

    controllo = Left(variabile, 1)
    dato = Mid(variabile, 2)

    in questa porzione di codice divido l'indice, che assegno alla variabile controllo,  ed il valore da ricercare che assegno alla variabile dato, che userò per eseguire il filtro.

    Dopo di che uso il select per selezionare il codice da eseguire in base al mio indice.

    Il codice chr(34) è solo una formattazione per evitare determinati errori se si usa una stringa invece che un valore numerico.

    Visto che il form serietv ha una sua fonte dati, mi basta usare il metodo filter per selezionare i record che mi interessano.

    Se il form non avesse una fonte dati, basterebbe semplicemente usare una query per ogni casistica, anche se il codice si complicherebbe.
    Quindi se possibile, per semplicità è meglio usare una fonte dati già preimpostata.

    I quattro indici del codice naturalmente fanno riferimento ai 4 controlli del form di ricerca, cioè “serie tv”, “avanzamento”, “stato”, e “ricerca per testo”.

    Questo è solo uno dei tanti metodi che si possono usare per fare quello che vuoi realizzare e tra parentesi è anche uno dei meno funzionali, ma più basici a livello di codice.

  • Re: Assegnazione range di valori a variabile temporanea

    Buongiorno Fratac

    non so come ringraziarti per la tua disponibilità !!!

    Studierò con molta attenzione il materiale che hai messo a mia disposizione e le spiegazioni che mi hai fornito, e, se avrò ancora qualche dubbio spero che me lo vorrai chiarire.

    Grazie ancora

  • Re: Assegnazione range di valori a variabile temporanea

    09/07/2023 - BarLudwig ha scritto:


    Utilizzo le TempVars perchè, studiando le possibili soluzioni al mio problema, consultando un manuale, mi sono imbattuto in questo strumento.

    Beh come avevo detto fin dall'inizio stai facendo una cosa non condivisibile, o comunque l'approccio non è quello più idoneo.
    Ti sei imbattuto su TempVars ? ecco a questo punto abbandona del tutto tale sistema e percorri una strada diversa.

    Non è difficile, basta avere solo un pò di calma e pazienza, poi approfondirai gli argomenti, farai dei test e assimilerai nuove conoscenze e in questo fratac ti ha già fornito un buon esempio di partenza.


    Nel concreto e per andare avanti spedito, potresti postare alcune cose ?

    • la sub del pulsante che avvia la form che contiene la combobox 
    • la select che deve popolare la combobox 
    • il filtro che avevi impostato per come devono essere filtrati i records

    non importa se ci sono errore o cose che non funzionano, è importante vedere il flusso che hai dal Pulsante ad arrivare alla combobox. 

  • Re: Assegnazione range di valori a variabile temporanea

    Ottimo! era quello che tentavo di spiegare.

    Certo, potrei farlo, ma se usassi una variabile globale, ogni volta che la uso, dovrei sapere come è stata dichiarata e ricordarmi di azzerarla se non deve rimanere con un valore…

    in realtà ogni volta che scrivi:

    casella = ("3" & Me.Testo17.Value)

    stai riassegnando la variabile. Se prima casella era “pippo” adesso è “3xyz”

    per ottimizzare:

    If IsNull(Me.Testo17.Value) Then
        DoCmd.OpenForm "Serie_tv2"
      Else
        DoCmd.OpenForm "Serie_tv2", , , , , , ("3" & Me.Testo17.Value)
      End If
    End Sub

    risparmi una variabile e il codice è più conciso.

    In questo caso non serve nessuna variabile ne pubblica ne locale.

  • Re: Assegnazione range di valori a variabile temporanea

    Scusa Andrea, potresti quotare con il tasto “Cita”? Noto che metti in grassetto i testi citati ma così a volte non si segue il discorso, specialmente sullo smartphone. Il tasto “Cita” serve proprio a questo.

  • Re: Assegnazione range di valori a variabile temporanea

    10/07/2023 - By65Franco ha scritto:


    Nel concreto e per andare avanti spedito, potresti postare alcune cose ?

    • la sub del pulsante che avvia la form che contiene la combobox 
    • la select che deve popolare la combobox 
    • il filtro che avevi impostato per come devono essere filtrati i records

    Buongiorno Franco, pensavo di aver già postato le informazioni che mi richiedi. Comunque le ripeto sperando che siano conformi a quanto mi hai chiesto. 

    Routine che ho inserito nella form Menu:

    Private Sub cmdModSocietà_Click()

    On Error GoTo cmdModSocietà_Err

       DoCmd.Close acForm, "Menu"

       DoCmd.OpenForm "frmDatiEntiSocietà", acNormal, "", "", acFormReadOnly, acWindowNormal

       TempVars.Add "VarTempFormaGiuridica", "s*"

    cmdModSocietà_Exit:

    Exit Sub

    cmdModSocietà_Err:

       MsgBox Error$

       Resume cmdModSocietà_Exit

    End Sub

    Private Sub cmdModEnti_Click()

    On Error GoTo cmdModEnti_Err

    DoCmd.Close acForm, "Menu"

    DoCmd.OpenForm "frmDatiEntiSocietà", acNormal, "", "", acFormReadOnly, acNormal

       TempVars.Add "VarTempFormaGiuridica", "[abcdefgilmnopqrtuvz]*"

    cmdModEnti_Exit:

       Exit Sub

    cmdModEnti_Err:

     MsgBox Error$

       Resume cmdModEnti_Exit

    End Sub

    Entrambe le routine richiamano la medesima form. Nella form c'è una cbo che ha come origine dati la seguente istruzione SQL

    SELECT tblAcronimi.idAcronimo, tblAcronimi.acronimo, tblAcronimi.idFormaGiuridica, tblFormaGiuridica.FormaGiuridica
    FROM tblAcronimi INNER JOIN tblFormaGiuridica ON tblAcronimi.idFormaGiuridica = tblFormaGiuridica.IdFormaGiuridica
    WHERE (((tblFormaGiuridica.FormaGiuridica) Like [TempVars]![VarTempFormaGiuridica]) AND ((tblAcronimi.[Tipo partecipata])="1"))
    ORDER BY tblAcronimi.acronimo;

    In virtù del valore assunto dalla TempVar nella cbo mi mostra in un caso l'elenco delle società, nell'altro l'elenco degli enti non societari.

    Spero che le informazioni possano essere utili.

Devi accedere o registrarti per scrivere nel forum
50 risposte