CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

di il
11 risposte

CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

Ciao a tutti,
innanzitutto complimenti per il sito che è davvero di aiuto per chi come me si approccia a questo mondo da autodidatta.
Volevo esporvi una questione che mi dà il mal di testa, più che altro penso a vari modi per risolverla ma non capisco quale sia il migliore/corretto.

La problematica è la seguente: in una maschera principale sottostante ad una tabella1 ho una sottomaschera sottostante a tabella2 con la quale è in relazione 1-n e le 2 form collegate da un campo ID. Ovviamente posso imporre dei vincoli su campi obbligatori che vanno inseriti nella form principale, ma nella subform potrebbe teoricamente non essere presente nessun record correlato.
Ecco, io vorrei effettuare proprio questa verifica, ossia che nella subform venga inserito almeno un record dopo ovviamente aver compilato la form principale, ma prima di un eventuale chiusura/cambio record/whatever.

Il classico esempio è quello della tabella documenti; all'intestazione del documento con tutti i campi (form principale) è legata la tabella del dettaglio/corpo del documento con eventuali articoli correlati, ma affinchè il documento sia valido almeno un articolo deve essere inserito.

Nelle mie considerazioni (forse errate) ho pensato questo:
- non mi posso appoggiare all'evento beforeupdate (annullabile) perchè il record principale deve esistere, quindi già salvato, prima di inserire record correlati
- l'evento afterupdate non è annullabile, potrei comunque usarlo per il controllo ma dovrei gestire singolarmente poi ogni evento successivo come chiusura o cambio record
- dovrei forse appoggiarmi a qualche evento della subform? Magari al momento della chiusura/cambio record della form principale potrei verificare se è stato effettuato un'inserimento
- esiste un evento che si scatena al cambio record? potrebbe essere una soluzione..

11 Risposte

  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    1. Pensa a una query parametrica che mostra i campi di Tabella2, la quale deve avere come filtro
    Forms!Maschera1!CampoID1
    2. Considera il DCount di questa query mentre maschera/sottomaschera sono aperti
    3. Se DCount("*";"NomeQuery") = 0 vuol dire che non ci sono record in sottomaschera
    4. Di conseguenza puoi manipolare via codice VBA questo risultato, per esempio un MsgBox
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Ciao Osvaldo, grazie per la risposta.
    In realtà il count dei record sottostanti alla sottomaschera riesco già a verificarlo, il mio problema è come/dove/quando far apparire la famosa msgbox che blocca l'utente dal fare altre operazioni fintanto che il precedente count restituisce zero..
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Ecco, io vorrei effettuare proprio questa verifica, ossia che nella subform venga inserito almeno un record dopo ovviamente aver compilato la form principale, ma prima di un eventuale chiusura/cambio record/whatever.
    Non capisco?
    Se fosse su cambio record l'evento potrebbe essere su current o su nuovo record, ma non li vedo adatti poiche l'evento si dovrebbe scatenare come controllo e dopo aver compilato la form principale, se ho ben capito, conferma?
    Se cosi fosse disabiliterei il pulsante di chiusura inserirei un buton "Salva" che su clik scatena l'evento con un if e relativo impedimento della chiusura.
    Facci sapere
    Saluti
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Confermo, la verifica va fatta dopo la compilazione del record sulla form principale ma prima dell'abbandono dello stesso.
    Il suggerimento del pulsante Salva è valido, ma così facendo dovrei gestire non solo quello ma tutti gli eventi (cambio record, salvataggio, chiusura, nuovo, ecc..).
    Nel weekend mi s'è comunque accesa una lampadina, e per il momento la soluzione che ho adottato è spostare le verifiche direttamente sugli eventi dell'oggetto subform, ossia:
    - nell'evento EXIT verifico il count e annullo l'uscita in caso ritorni 0
    - nell'evento AFTERUPDATE della form principale sposto il focus nella subform, in modo da "ingabbiare" l'utente dentro il controllo
    Si accettano altri suggerimenti..
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Il suggerimento del pulsante Salva è valido, ma così facendo dovrei gestire non solo quello ma tutti gli eventi (cambio record, salvataggio, chiusura, nuovo, ecc..).
    Non ti seguo cosa vuol dire "tutti gli eventi"?

    Stiamo parlando di verificare il dcount dei record presenti nella sottomaschera per cui su Clic del buton scrivi

    Se dcount = 0
    Messaggio = "non esiste nessun record......."
    arresta Macro (se macro exit sub se VBA)....etc l'ho scritta così al volo perchè non so se usi macro o vba.

    Queste due righe bloccano "prima di salvare il record" e fino a quando non vengono inseriti record nella sottomaschera punto

    Le cose che non sto afferrando sono, quali sono le azioni successive:
    1 se non ci sono record nella sottomaschera li devo inserire obbligatoriamente?
    2 non li devo inserire ed eliminare anche il record che fa capo alla maschera?
    Dacci notizia
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Ciao,
    in realtà quello che hai scritto non è completamente esatto, spiego perchè: quelle due righe al limite bloccano la chiusura maschera, non il salvataggio del record principale che avviene comunque, sia che lo forzi io da codice sia che lo faccia automaticamente access già quando l'utente seleziona la sottomaschera.
    Il problema arriva dopo, con il record principale creato (per forza, perchè deve essere presente il campo che mi relaziona eventuali record della sottomaschera) e la sottomaschera sulla quale vorrei che venisse inserito almeno 1 record senza eliminare in caso contrario il record principale (quindi risposta 1 all'ultima domanda).
    Qui un eventuale controllo andrebbe obbligatoriamente fatto su tutti i possibili eventi successivi; per esempio l'utente che non chiude la maschera ma clicca sul pulsante di spostamento al record precedente o successivo (per inserire un ulteriore record nella form principale, per esempio).

    PS: quando possibile preferisco evitare le macro..
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    NNL78 ha scritto:


    ...
    Il problema arriva dopo, con il record principale creato (per forza, perchè deve essere presente il campo che mi relaziona eventuali record della sottomaschera) e la sottomaschera sulla quale vorrei che venisse inserito almeno 1 record senza eliminare ...
    Prova a guardare questa pagina (fino in fondo)
    Force data entry of Main form AND sub form
    C'è anche un file dimostrativo da cui si può trarre spunto.
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Ciao Phil,
    ottimo spunto, in pratica il problema viene aggirato con una insert su evento AFTERUPDATE del record principale che va ad aggiungere un record alla tabella correlata. La insert fa uso della pk precedentemente salvata nell'evento BEFOREUPDATE e setta il record correlato passando valori prestabiliti.
    E' una soluzione, ma con delle limitazioni importanti; due che mi vengono in mente al volo:
    - la insert mi obbliga ad inserire valori di default, che l'utente probabilmente dovrà sostituire manualmente con altri, col rischio di incorrere in errori
    - una volta validato il record nella sottomaschera, niente mi impedisce di eliminarlo e chiudere. Tornerei ad avere il record principale non associato a nessun record della sottomaschera.
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Mah è possibile venire a conoscenza di cosa tratta questo DB, perchè altrimenti si continua a parlare di teoria senza conoscere i vincoli, le difficoltà nell'inserimento e nel reperire i dati da inserire in questa benedetta sottomaschera.
    la insert mi obbliga ad inserire valori di default,
    Potrebbe essere solo la pk correlata?
    che l'utente probabilmente dovrà sostituire manualmente con altri, col rischio di incorrere in errori
    beh gli errori vanno valutati caso per caso... o no?
    una volta validato il record nella sottomaschera, niente mi impedisce di eliminarlo e chiudere
    Mi pare chiaro, domanda: in questo caso cosa hai pensato di far fare al tuo applicativo?
    Io avrei pensato ad un messaggio e ad impedire la chiusura della form
    Tornerei ad avere il record principale non associato a nessun record della sottomaschera.
    Torniamo ad una delle mie prime domande, in questo caso come vuoi gestire l'evento?
    Mi pare che siamo passati dalla verifica dell'esistenza di un record correlato ad una verifica generale della maschera su dati che oggettivamente ignoriamo perchè non ci dici di cosa parla il tuo db.
    Saluti
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    Ciao Gianni,
    come ho scritto nel primo post l'esempio più calzante è quello della tabella documenti correlata alla tabella documenti_dettaglioin relazione 1 a N. La maschera associata alla prima tabella contiene l'intestazione del documento (cliente, data, numero, ecc..), mentre nella sottomaschera associata alla seconda è presente il dettaglio (codice articolo, descrizione, quantità, prezzo, ecc..). In entrambe le tabelle vi sono campi obbligatori e non (x questo la insert non può contemplare solo la pk), e l'utente tramite pulsanti può eseguire svariate azioni come ad es. chiudere la form principale, spostarsi al documento (record) precedente/successivo, salvare o annullare le modifiche, stampare il documento corrente, ecc.
    Il vincolo che vorrei implementare è che ad ogni documento sia associato sempre e comunque almeno 1 articolo.
    Questo vincolo va ovviamente verificato nei molteplici eventi di cui parlavo sopra che l'utente può scatenare, ad esempio il click sul pulsante stampa, per questo non posso limitarmi alla sola verifica della chiusura della form.
    A meno che non esista un vincolo nativo su access che mi obbliga ad avere almeno un record correlato (non credo) questa implementazione la devo realizzare io da codice, preferibilmente in modo unico anzichè gestendo le singole casistiche di cui sopra singolarmente; oltretutto mentre x chiusura form o click su pulsanti funzione tipo stampa un check è possibile, per il cambio record non ho ancora capito come gestirlo.. va da sè inoltre che il check va implementato sia nel caso di un nuovo documento che di uno esistente, in quanto un utente potrebbe aprire un documento inserito e cancellare un dettaglio.
  • Re: CHECK INSERIMENTO SUBFORM DA FORM PRINCIPALE

    come ho scritto nel primo post l'esempio più calzante è quello della tabella documenti correlata alla tabella documenti_dettaglioin relazione 1 a N. La maschera associata alla prima tabella contiene l'intestazione del documento (cliente, data, numero, ecc..), mentre nella sottomaschera associata alla seconda è presente il dettaglio (codice articolo, descrizione, quantità, prezzo, ecc..).
    Io sono dell'avviso che stai facendo confusione sulla operatività logica della gestione del tuo DB mi spiego meglio :
    L'operatore sta inserendo una fattura > sceglie il cliente (è probabile si debba modificare successivamente)
    inserisce gli articoli nella sub, che avevamo segnato in un notes che non troviamo più.
    SCELTA: 1 Conserviamo il documento che modificheremo successimamente
    2 buttiamo tutto ed inseriremo tutto quando avremo tutto
    se optiamo per la scelta 2 su salvataggio inseriamo il CK che ci segnala il fatto ed operiamo la scelta (buttiamo tutto)
    nb. volutamente ho sorvolato su protocolli etc..
    E l'utente tramite pulsanti può eseguire svariate azioni come ad es. chiudere la form principale, spostarsi al documento (record) precedente/successivo, salvare o annullare le modifiche, stampare il documento corrente, ecc.
    Si ripete, secondo me, errore di modus operandi le fasi di INSERIMENTO MODIFICA STAMPA vanno differenziate, scandite e trattate con dei controlli
    mirati all'azione che si sta compiendo ti faccio un esempio :
    Se ho intestato il mio documento al sig Mario Rossi, posso prevedere che il sig Rossi abbia cambiato indirizzo ed effettuare tale modifica successivamente ma mai, una volta definito il documento, intestarlo al sig Bianco Roberto per cui in fase di MODIFICA dovrò prevedere questa cosa.
    preferibilmente in modo unico anzichè gestendo le singole casistiche di cui sopra singolarmente
    NON gestire singolarmente le singole casistiche è un errore grave, mentre si sta inserendo un documento non può essere previsto che si gironzoli per i record, se prima non abbiamo, salvato,sospeso, eliminato il record corrente.
    Spero esserti stato utile,
    saluti.
Devi accedere o registrarti per scrivere nel forum
11 risposte