Maschera correlata a tabella + sottotabella (istruzioni VBA)

di il
22 risposte

Maschera correlata a tabella + sottotabella (istruzioni VBA)

Da giorni sono restato bloccato sullo stesso punto:
a) nel mio database ho disposto che la tabellaA, col suo bravo ID sia correlata al camponumericoX (chiave esterna) della tabellaB
b) quando vado alla tabellaA, per ogni record ho la possibilità di aggiungere il nuovo sotto record della tabellaB;
c) con la procedura crea maschera riferita alla tabellaA, access mi ha generosamente predisposto una interfaccia grafica con tutti i campi di tale tabella e al di sotto ha predisposto un riquadro della Tabella B, consentendomi così direttamente da un'unica maschera di aggiungere nuovi record della tabellaB sempre correlati al record specifico in quel momento selezionato in maschera. Sottolineo che il riquadro propone una sottotabella e non una sottomaschera.
d) faccio presente che, precedentemente avevo già predisposto una maschera (che qui chiamo mascheraB) per l'inserimento dei dati correlata alla sola tabellaB che funzionava egregiamente fino a quando non ho deciso di mettere in relazione i campi descritti nel mio punto a); da quel momento, se creo un nuovo record non riesco a salvarne i dati immessi perché Access ovviamente mi avvisa che occorre il record correlato alla tabella A e non va avanti.[/list][/list]
Alla mascheraB avevo aggiunto due campi di testo che, grazie alla predisposizione della mia QueryAeB, con istruzione VBA copiavano la chiave primaria e il nominativo riportato nel campo NOMINATIVO della tabellaA e rendevano tali info visibili a schermo.
esempio del codice utilizzato:
Private Sub Form_Current()
If DLookup("[tabellaA.NOMINATIVO]", "QueryAeB") <> "" Then
copiachiaveTxt.Value = DLookup("[tabellaA.ID]", "QueryAeB")
nominativoTxt.Value = DLookup("[tabellaA.NOMINATIVO]", "QueryAeB")
End If
End Sub


Solo per completezza della descrizione della mia QueryAeB, essa interroga le due tabelle ottenendo tre campi che qui descrivo, il primo col nominativo associato alla tabellaA, il secondo ad una data riferita alla tabellaB ed il terzo campo riporta l'ID chiave primaria della tabella A vincolato al seguente criterio: Like [Maschere]![mascheraB]![camponumericoX]

Se dovessi immettere solo io i dati, utilizzerei senza problemi la maschera (che qui chiamo mascheraA visto che è riferita alla tabellaA), che nel riquadro consente l'immissione di nuovi dati nella tabellaB, ma il database dovrà essere a disposizione di altri colleghi meno avvezzi alla tecnologia per cui volevo utilizzare le maschere per l'inserimento con interfacce più friendly.

La mia intenzione per bypassare il problema era quella di utilizzare le istruzioni VBA per consentire, grazie all'utilizzo di una nuova mascheraC (con campi gemelli a quelli della maschera B, privi tutti di relazioni ad altre tabelle), di immettere i dati.

Tramite un pulsante volevo copiare i valori immessi campo per campo memorizzandoli provvisoriamente in apposite variabili, aprire poi la maschera A.
Quindi, spostarmi (anche manualmente) al record della tabellaA corrispondente al campo NOMINATIVO al quale si intende aggiungere il nuovo "sottorecord"; a questo punto, facendo click su di un ulteriore pulsante, una nuova istruzione VBA dovrebbe selezionare la sottotabellaB ivi presente (nello specifico non ho idea di che istruzione VBA utizzare), quindi aggiungervi il nuovo record, incollarvi i dati presenti nelle variabili conservate, finalmente salvare la mascheraA completa di tali nuove info aggiunte, ed in ultimo chiudere la mascheraC, lasciando visibile all'utente la mascheraA.

Ho cercato diverse soluzioni ma questa mi sembra quella più applicabile, ma non ho idea di come selezionare con VBA la sottotabellaB della mascheraA ed il relativo record (in questo caso nuovo record), se riuscite da darmi qualche suggerimento in merito, poi credo che troverò anche il modo di disporre qualche ulteriore istruzione per non dover spostarmi manualmente al record, sfruttando le info dei due campi copiachiaveTxt e nominativoTxt.

Scusate se non sono stato chiaro nell'esporre il problema incontrato e anticipatamente ringrazio per aver pazientemente letto tutto quanto sopra.
NB. non so bene come sintetizzare nell'oggetto una descrizione di questo mio post, vogliate suggerirmi il titolo opportuno che successivamente andr0 a modificare (ove possibile).

22 Risposte

  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    calascibetta ha scritto:


    Sottolineo che il riquadro propone una sottotabella e non una sottomaschera.
    Che vuol dire?
    Hai provato la procedura guidata di creazione maschera/sottomaschera? Non ti piace? Una volta assodata la relazione uno-a-molti, Access individua i 2 campi di relazione e sincronizza automaticamente.
    MascheraA è "maschera singola" o "foglio dati"?
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    La maschera viene automaticamente creata da Access utilizzando la funzione CREA -> maschera. si tratta di una maschera singola che include tutti i campi della tabellaA e sotto di essi un riquadro con la tabellaB (ribadisco non mi sembra essere una sottomaschera, visto che non la trovo tra le maschere (tutte visibili).
    Comunque il problema si pone solo se da una maschera con i soli campi della tabellaB si prova ad aggiungere un nuovo record che resta vincolato alla tabellaA.
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Ripeto a parole mie:
    MascheraA: maschera singola
    sottomascheraB: sottomaschera che sta dentro MascheraA e ha il look del "foglio dati". Giusto?
    MascheraA e sottomascheraB sono sincronizzati o no? Hai controllato le proprietà di:
    1. Vai in visualizzazione struttura MascheraA
    2. Clicca una sola volta dentro il rettangolo di sottomascheraB e vedrai evidenziarsi la cornice
    3. Avvicina il mouse sul bordo di questa cornice e clicca con il mouse destro, quindi scegli Proprietà
    4. Controlla le proprietà:
    Collega campi secondari
    Collega campi master
    Cosa c'è scritto?
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Ripeto a parole mie:
    MascheraA: maschera singola
    sottomascheraB: sottomaschera che sta dentro MascheraA e ha il look del "foglio dati". Giusto?
    MascheraA e sottomascheraB sono sincronizzati o no? Hai controllato le proprietà di:
    1. Vai in visualizzazione struttura MascheraA
    2. Clicca una sola volta dentro il rettangolo di sottomascheraB e vedrai evidenziarsi la cornice
    3. Avvicina il mouse sul bordo di questa cornice e clicca con il mouse destro, quindi scegli Proprietà
    4. Controlla le proprietà:
    Collega campi secondari
    Collega campi master
    Cosa c'è scritto?

    ci sono due diverse procedure, una crea maschera ed una creazione guidata maschera.
    Sicuramente ti riferisci alla seconda, dove puoi stabilire che la maschera deve includere i dati della tabellaA e della tabellaB in un'unica maschera, e come tu descrivi predispone una maschera singola che include una sottomaschera della tabellaB (TabellaB Sottomaschera), tra l'altro questa sottomaschera appare nel pannello di spostamento a SX). Evidentemente se vado sulla cornice del rettangolo, dalle proprietà si evince che si tratta di sottomaschera.
    Relativamente alla verifica delle proprietà la voce collega campi secondari evidenzia "camponumericoX" e la voce collega campi mater evidenzia "ID" (tra l'altro la voce Oggetto origine evidenzia "TabellaB Sottomaschera" e l'oggetto si chiama "TabellaB Sottomaschera" ).

    Io, comunque mi riferisco alla prima procedura di creazione maschera (automaticamente disposta da acces senza alcun intervento o scelta dell'operatore) dove nel rettangolo trovo scritto Tabella.TabellaB e non vi corrisponde alcuna sottomaschera, motivo per cui penso si tratti proprio della tabella. Relativamente alla verifica delle proprietà la voce collega campi secondari evidenzia "camponumericoX" e la voce collega campi mater evidenzia "ID" (qui invece la voce Oggetto origine evidenzia "Tabella.TabellaB" e l'oggetto si chiama "Figlio9").
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Nella procedura guidata, mi pare alla prima finestra, chiede proprio se vuoi utilizzare maschere già esistenti oppure vai a prendere dalla lista tabelle. Se scegli da tabelle, Access creerà comunque la sottomaschera, ma la denominazione resterà quella della tabella originaria. Pertanto il problema è solo di denominazioni. Le logiche di fondo sono coerenti in entrambi i casi.
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Nella procedura guidata, mi pare alla prima finestra, chiede proprio se vuoi utilizzare maschere già esistenti oppure vai a prendere dalla lista tabelle. Se scegli da tabelle, Access creerà comunque la sottomaschera, ma la denominazione resterà quella della tabella originaria. Pertanto il problema è solo di denominazioni. Le logiche di fondo sono coerenti in entrambi i casi.
    Ok, in entrambi i casi le procedure di creazione della maschera sono simili e sfruttano lo stesso principio.
    Ma mi resta il problema che spero di chiarire meglio:
    non è detto che l'utente acceda dalla maschera di livello superiore (mascheraA), visto che magari si trova nella singola mascheraB, dove di norma legge i dati già inseriti, magari ha necessità di implementare un nuovo evento che resta comunque vincolato ad un record della tabellaA (trattandosi infatti di un nuovo "sottorecord" della tabellaB), dopo aver inserito i dati non riesce a salvare il record per problemi di coerenza del database.
    ebbene io , se esiste la possibilità volevo tramite il pulsante "CmdCopiaeApriAltraMaschera" predisposto nella maschera copiare i dati inseriti erroneamente nella maschera bloccata dal vincolo di access, per poi incollarli nella tabella.
    Ovviamente sbaglio nella realizzazione dell'idea, riporto il codice che mi proponevo di inserire che va rivisto e di parecchio visto che al click del mio pulsante mi trovo nella mascheraB, che finchè rimane aperta impedisce di copiare e salvare i dati nella corretta tabella.

    Private Sub CmdCopiaeApriAltraMaschera_Click()
    'operazioni in sequenza:
    
    'seleziono il record dove mi trovo
    DoCmd.RunCommand acCmdSelectRecord
    'copio il record
    DoCmd.RunCommand acCmdCopy
    
    'apro la tabellaA in modalità editabile
    DoCmd.OpenTable "tabellaA", acViewNormal, acEdit
    'vado al record
    DoCmd.GoToRecord , , acGoTo, _______
    'qui sarebbe comodo inserire dove ho riportato "_______" il corrispondente valore  del "camponumericoX" (che ricordo essere correlato con ID della tabellaA)
    
    'a questo punto apro la tabellaB in modalità editabile
    DoCmd.OpenTable "tabellaB", acViewNormal, acEdit
    'vado ad un nuvo record
    DoCmd.GoToRecord , , acNewRec
    
    'incollo quanto precedentemente copiato
    DoCmd.RunCommand acCmdPaste
    
    
    End Sub
    errori evidenti che non so risolvere:
    1) sicuramente è già un limite utilizzare tali istruzioni immediatamente trascritte nel pulsante (infatti presumo che l'incollaggio non va in porto forse perché spostandosi dalla mascheraB alla tabella la memorizzazione si è persa);
    2) conviene copiare l'intero record oppure campo per campo (memorizzando ognuno di questi in altrettante variabili)?
    3) come spiegavo si tratta di un nuovo sottorecord della tabellaB che se viene aperta singolarmente in maniera diretta non consente aggiunzioni di record;
    4) bisogna infatti simulare ciò che avviene materialmente nel database :aprire la tabellaA andare al record specifico, sulla sua Sx spuntare il segno "+" per visualizzare i sottorecord della rabellaB correlati, e da li si può aggiungere il nuovo record
    5) selezionare il record di cui al punto 4
    6) incollare i dati del record (che, dovrebbe essere rimasto memorizzato)
    7) chiudere la mascheraB
    salvare il record incollato
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    calascibetta ha scritto:


    errori evidenti che non so risolvere:
    1) sicuramente è già un limite utilizzare tali istruzioni immediatamente trascritte nel pulsante (infatti presumo che l'incollaggio non va in porto forse perché spostandosi dalla mascheraB alla tabella la memorizzazione si è persa);
    No!...è perchè quel codice sembra più la sceneggiatura di un film che un codice

    3) come spiegavo si tratta di un nuovo sottorecord della tabellaB che se viene aperta singolarmente in maniera diretta non consente aggiunzioni di record;
    Ti sei spiegato perchè?...e cosa sono le relazioni tra "TABELLE"?
    Esempio se la TabA contiene NomiDiPersona e la TabB Autovetture, ed io li metto in relazione 1Nome > Molte Autovetture.
    Ti pare normale inserire un'Autovettura senza specificare a chi appartiene?
    4) bisogna infatti simulare ciò che avviene materialmente nel database :aprire la tabellaA andare al record specifico, sulla sua Sx spuntare il segno "+" per visualizzare i sottorecord della rabellaB correlati, e da li si può aggiungere il nuovo record
    5) selezionare il record di cui al punto 4
    6) incollare i dati del record (che, dovrebbe essere rimasto memorizzato)
    Sulle Tabelle NON si esegue nessuna operazione!
    2) conviene copiare l'intero record oppure campo per campo (memorizzando ognuno di questi in altrettante variabili)?
    Conviene comprare un'ottimo libro che parli di database relazionali.
    Saluti
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Devo essere sincero sincero. Non riesco ad afferrare quale sarebbe il tuo dilemma. I dati in Access vanno gestiti (direi convenientemente) con le maschere. Trattandosi di tabelle madre/figlia puoi gestire tutto con maschera/sottomaschera oppure 2 maschere "collegate". Per maschera/sottomaschera credo che sia tacito il discorso. Per mascheraB collegata è comunque INDISPENSABILE che mascheraA sia aperta e punti sul proprio CampoID. Infatti sarà proprio il valore [Maschere]![MascheraA]![CampoID] ad essere da "guida" per il corrispondente campo X in mascheraB.
    Quando parli di tabelle e dell'uso del +, stai parlando del "Foglio dati secondario". E' uno strumento (come dire) arcaico e minimale. Utile per un uso (perdonami) "scappa e fuggi"...ma non molto di più. Generalmente non deve trovare la stessa applicazione anche nelle maschere, più versatili e più indicate per gestire proprio questo genere di "ostacoli".
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Ho provato anche tramite creazione guidata la predisposizione di 2 maschere collegate (MCollegatatabellaA e MCollegatatabellaB), ma addirittura in questo caso , anche se accedo alla MCollegatatabellaB tramite pulsante di defaut presente nella MCollegatatabellaA, non si può aggiungere il nuovo record.
    Cosa intendi esattamente? Come e dove dovrei inserire il valore [Maschere]![MascheraA]![CampoID] ?
    Stavo solo descrivendo passo passo quello che dovrei svolgere senza l'utilizzo delle maschere, m serviva per spiegare il più correttamnete possibile l'iter delle istruzioni VBA che poi dalla mascheraB consentirebbero di non dover ridigitare tutto da capo nella maschera A (inclusiva della sottoascheraB).
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    calascibetta ha scritto:


    Cosa intendi esattamente? Come e dove dovrei inserire il valore [Maschere]![MascheraA]![CampoID] ?
    Imposta sul campo X di mascheraB
    Valore predefinito: [Maschere]![MascheraA]![CampoID]
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Stavo pensando di cambiare il mio nickname in "Quentin Tarantino"!

    é palese che descrivessi solamente esempi di tabelle e di maschere, semplificate al massimo per discuterne nel post, con pochissimi campi, utili solo a fornire brevi esempi e del tutto privi di informazioni (nel db che mi accingo a preparare le tabelle contengono molti campi).
    Per la cronaca, qualche nozione sulle relazioni credo di averla acquisita, ma sono ovviamente solo agli inizi e sicuramente pretendo risultati superiori alle mie attuali conoscenze.
    non ho idea su quale potrebbe essere più opportuno, potresti suggerirmi cosa digitare sul motore di ricerca per la ricerca di un testo adatto?
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    OsvaldoLaviosa ha scritto:


    calascibetta ha scritto:


    Cosa intendi esattamente? Come e dove dovrei inserire il valore [Maschere]![MascheraA]![CampoID] ?
    Imposta sul campo X di mascheraB
    Valore predefinito: [Maschere]![MascheraA]![CampoID]
    fatto! modificato il valore predefinito di " camponumericoX" ma, sembra che non sia cambiato nulla, almeno visibilmente, la maschera funziona allo stesso modo credo. SE ho ben capito ho imposto al camponumericoX un valore di default che coincide col valore ID della mascheraA. In cosa questo tornerebbe utile per il mio scopo?


    C'è un modo per inviarti il mio file?
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    calascibetta ha scritto:


    In cosa questo tornerebbe utile per il mio scopo?
    Lo sai che non ho capito a pieno tutto il tuo contesto?
    Miei timori al riguardo:
    A) Non hai capito le potenzialità delle maschere. MascheraB da sola non può andare da nessuna parte. Ha sempre bisogno di essere "aiutata" da mascheraA.
    B) Non ho capito io l'intero tuo contesto e perché ti incaponisci al riguardo. Per venirti incontro IO, ho bisogno di una descrizione di più ampio respiro. Descrivi esattamente:
    - nomi propri (quelli veri) delle tabelle madre e figlia
    - nomi propri di tutti i loro campi con indicazione di chiave primaria (quelli veri)
    - nomi propri delle maschere
    - ridescrivi il problema con i nomi propri...magari fai anche qualche esempio pratico

    calascibetta ha scritto:


    C'è un modo per inviarti il mio file?
    Non è molto nello spirito del forum. Sforzati di esplicitare tutto in maniera coerente e discorsiva.
  • Re: Maschera correlata a tabella + sottotabella (istruzioni VBA)

    Più che aiutatadalla mascheraA, sembra non servire a nulla, visto che i dati sono inseribili solo dalla mascheraA e dal rettangolo con la sottomaschera.
    avevo giusto creato un file ad act, mano mano che descrivevo il problema, dove avevo inserito
    2 tabelle denominate tabellaA e tabellaB
    2 maschere denominate MascheraA e MascheraB (prova di crea maschera della tabellaA)
    1 maschera demominata MascheraC (provisoria, con i campi identici a MaschraB ma non correlata ad alcuna tabella)
    2 maschere denominate tabellaA e tabellaB Sottomaschera (prova di creazione guidata di maschera con dati di due tabelle in un unicainterfaccia)
    2 maschere denominate MCollegataTabellaA e MCollegataTabellaB

    la tabellaA contiene i seguenti 3 campi (ID; NOMINATIVO; ALTREINFO)
    la tabellaBcontiene i seguenti 3 campi (IDtabB; data; infoaggiunte;camponumericoX)
    il pulsante della maschera MascheraB l'ho chiamato CmdCopiaeApriAltraMaschera

    Esempio di quello che sto realizzando nel vero e propio DB
    a) la tabellaA corrisponde alla mia tabella AZIENDA con 8 campi: IDazienda; denominazionesociale; tiposocietà; responsabileLegale; indirizzosede; ubicazioneimpiantocontrollato;note

    b) la tabellaB corrisponde alla mia tabella DATAeInfoEventi con 9 campi: IDDataEventiERiferimenti; tipoAttivitàSvolta; Operatori; datariferimento; protocollatocon; allegatodiunaltroprot; rifaltroprot; breviinfo; FKAziendacorrelata (cioè la Foreign Key correlata alla chiave primaria IDAzienda)

    c) per ognuna di esse ho disposto la relativa maschera

    Dalla maschera DATAeInfoEventi c'era modo di consultare i vari eventi inseriti e, fino a quando non ho deciso di correlare il campo numerico FKAziendacorrelata ad IDAzienda, potevo anche aggiungere nuovi record.

    Eccoti un esempio del problema:
    Posto che datale maschera l'operatore stia immettendo i seguenti dati tipoAttivitàSvolta; Operatori; datariferimento; protocollatocon; allegatodiunaltroprot; rifaltroprot; breviinfo;
    Trovo scomodo che si veda costretto a chiudere la maschera che stava visualizzando, debba aprire la maschera AZIENDA, cercare l'azienda, spostare il puntatore del mouse sul rettangolo della sottomaschera; selezionare il nuovo record e solo dopo immettere di nuovo i dati che aveva già inserito.

    Per di più, il DB in futuro sarà più complesso, comprenderà molte tabelle concatenate in relazione tra loro (uno a molti oppure molti a molti).
    Supponiamo di aver quattro o cinque tabelle correlate, ai fini dell'inserimento dei dati sarei costretto a creare una maschera unica che contenga tutte le relative sottomaschere, ovviamente difficilmente visibili in un'unica videata.
    Questo è il reale motivo per cui vedo necessario accedere da una qualsiasi maschera, immettere i miei dati, salvarli nella tabella di destinazione (anche se ciò dovesse comportare di copiare i dati dalla maschera, aprire la maschera corretta, operazione questa visibile o meno non mi riguarda, incollare al posto giusto i dati, chiudere la maschera che altrimenti bloccherebbe il proseguimento del salvataggio, tornare alla maschera corretta e salvare qanto ivi incollato.
    La mia teoria è farraginosa, ma potrebbe essere il modo per aggirare l'ostacolo e magari funzionare. Purtroppo i mei mezzi (conoscenze di VBA e di access sono solo all'inizio).
Devi accedere o registrarti per scrivere nel forum
22 risposte