Inserire nuovo campo se non in elenco

di il
8 risposte

Inserire nuovo campo se non in elenco

Salve a tutti,
Sto sviluppando un database in access 2007 (abbiate pazienza ma è il mio primo database con access, sono alle primissime armi soprattutto per quanto riguarda vba) e mi sono bloccato. Vi sarei immensamente grato se qualcuno riuscisse a risolvere il mio problema. Mi spiego meglio:

Sto implementando un db per un magazzino, ho iniziato da poco quindi al momento ci sono solo le classiche tabelle articoli e fornitori. Anche grazie all'aiuto del forum sono riuscito a sviluppare tutte le funzioni che mi sono state richieste tranne una, ovvero: se nella mia maschera articoli, nella casella combinata "nome fornitore" che punta alla tabella fornitori, viene inserito un fornitore non ancora presente nella tabella fornitori, voglio che mi si apra la maschera fornitori già puntata su nuovo ma soprattutto con già scritto il nome del fornitore mancante che ho inserito in precedenza.
Una volta compilato il nuovo fornitore, se torno alla maschera articoli vorrei fosse possibile non dover inserire nuovamente il fornitore appena creato, tenendo quindi il testo inserito inizialmente.

Chiedo anticipatamente scusa per il mio linguaggio poco tecnico, spero comunque di essermi espresso bene per far si di ricevere un aiuto il prima possibile.

Grazie a tutti

8 Risposte

  • Re: Inserire nuovo campo se non in elenco

    Si tratta di gestire in maniera ottimale (ci sono tante varianti) l'evento NotInList (Non in elenco).
    Prova a leggere qui
  • Re: Inserire nuovo campo se non in elenco

    OsvaldoLaviosa ha scritto:


    Si tratta di gestire in maniera ottimale (ci sono tante varianti) l'evento NotInList (Non in elenco).
    Prova a leggere qui
    Ciao Osvaldo, ti sono molto grato per il tuo aiuto, il tuo allegato mi è stato molto utile.

    Purtroppo però non sono riuscito ancora a risolvere il mio problema, probabilmente a causa della mia inesperienza. Cerco di spiegare la situazione attuale:

    Io ho inserito questo codice su l evento non in lista della mia casella combinata Nome_Fornitore:
    
    Private Sub NOME_FORNITORE_NotInList(NewData As String, Response As Integer)
        Dim intReturn As Integer
        intReturn = MsgBox(NewData & " non esiste nella lista fornitori. Vuoi inserirlo?", vbYesNo)
        If intReturn = vbYes Then DoCmd.OpenForm "LISTA FORNITORI", acFormAdd, acDialog, NewData
        Response = acDataErrContinue
    End Sub
    
    Tale codice mi apre una msgbox yesno chiedendomi se voglio inserire il nuovo fornitore (OK), ma successivamente mi apre un form con sopra scritto il testo appena inserito e sotto una textbox vuota (cosa che non voglio!). Andando ancora avanti mi si apre la mia maschera fornitori ma non succede nulla.

    Probabilmente uno di questi errori è dovuto al fatto che non ho ben capito dove inserire la seconda parte di codice, quella per settare la proprietà OpenArgs.
    
    Private Sub Form_Load()
    If IsNull(Me.OpenArgs) = False Then Me!NOME_FORNITORI = Me.OpenArgs
    End Sub
    
    Sarei molto grato a chiunque sappia darmi una mano!
  • Re: Inserire nuovo campo se non in elenco

    AndreaSanta ha scritto:


    e sotto una textbox vuota (cosa che non voglio!)
    Che vuol dire? Tieni presente che tu "sostanzialmente" con il NotInList (secondo la progettazione da me suggerita) vai a stuzzicare il solo campo testuale relativo al NomeFornitore. Aprendo Fornitori tu vedi già scritto il suo nome, ma (immagino) occorrerà anche completare gli altri campi (per es. Indirizzo, Città ecc...). Il pulsante di ritorno in maschera Fornitori provvederà a impostare automaticamente nella maschera Articoli il valore IDFornitore.

    AndreaSanta ha scritto:


    Andando ancora avanti mi si apre la mia maschera fornitori ma non succede nulla.
    Non capisco. Cosa intenti per "andando ancora avanti"?
  • Re: Inserire nuovo campo se non in elenco

    OsvaldoLaviosa ha scritto:


    AndreaSanta ha scritto:


    e sotto una textbox vuota (cosa che non voglio!)
    Che vuol dire? Tieni presente che tu "sostanzialmente" con il NotInList (secondo la progettazione da me suggerita) vai a stuzzicare il solo campo testuale relativo al NomeFornitore. Aprendo Fornitori tu vedi già scritto il suo nome, ma (immagino) occorrerà anche completare gli altri campi (per es. Indirizzo, Città ecc...). Il pulsante di ritorno in maschera Fornitori provvederà a impostare automaticamente nella maschera Articoli il valore IDFornitore.

    AndreaSanta ha scritto:


    Andando ancora avanti mi si apre la mia maschera fornitori ma non succede nulla.
    Non capisco. Cosa intenti per "andando ancora avanti"?
    Scusami, cerco di spiegarmi meglio:

    Dopo la conferma di voler inserire il nuovo fornitore, mi si apre una nuova finestra (e non direttamente la maschera fornitori) con sopra scritto il nome del nuovo fornitore appena inserito e sotto una textbox vuota, con due pulsanti ok e annulla. Premendo su ok mi si apre finalmente la mia maschera LISTA FORNITORI ma purtroppo non è stato passato nessun valore, si apre la maschera come se fosse aperta normalmente.
    Grazie per la tua pazienza e scusa ancora
  • Re: Inserire nuovo campo se non in elenco

    L'errore dovrebbe essere nelle virgole di
    If intReturn = vbYes Then DoCmd.OpenForm "LISTA FORNITORI", , , , acFormAdd, acDialog, NewData
    mi sono accorto che anche nel mio documento avevo messo una virgola in più.
    Se non ti piacciono tutte quelle virgole e preferisci l'indicazione specifica-diretta, puoi scrivere anche così:
    If intReturn = vbYes Then DoCmd.OpenForm "LISTA FORNITORI", DataMode:acFormAdd, WindowMode:acDialog, OpenArgs:NewData
  • Re: Inserire nuovo campo se non in elenco

    OsvaldoLaviosa ha scritto:


    L'errore dovrebbe essere nelle virgole di
    If intReturn = vbYes Then DoCmd.OpenForm "LISTA FORNITORI", , , , acFormAdd, acDialog, NewData
    mi sono accorto che anche nel mio documento avevo messo una virgola in più.
    Se non ti piacciono tutte quelle virgole e preferisci l'indicazione specifica-diretta, puoi scrivere anche così:
    If intReturn = vbYes Then DoCmd.OpenForm "LISTA FORNITORI", DataMode:acFormAdd, WindowMode:acDialog, OpenArgs:NewData
    Aggiornamento: ora se il fornitore non è in lista mi si apre una nuova finestra con all'interno la maschera fornitori settata su nuovo, ma continua a non esserci il passaggio dell'informazione...
    Sarebbe bello restare sempre sulla stessa finestra in modo da non avere più finestre sovrapposte
    Ho tolto il codice
     Private Sub Form_Load()
    If IsNull(Me.OpenArgs) = False Then Me!NOME_FORNITORE = Me.OpenArgs
    End Sub
    
    perchè ogni volta che aprivo i fornitori mi creava un nuovo id anche se io non inserivo nulla.
  • Re: Inserire nuovo campo se non in elenco

    Non vorrei che ci fosse qualche errore di denominazione campi e/o sintassi. Guardando in giro fra miei vari progetti, mi accorgo di gestire in vari modi sta storia. Prova a gestire anche così:
    Private Sub NOME_FORNITORE(NewData As String, Response As Integer)
    Dim intReturn As Integer
    intReturn = MsgBox(NewData & " non esiste nella lista Fornitori. Vuoi inserirlo?", vbYesNo)
    If intReturn = vbYes Then
        DoCmd.OpenForm "LISTA FORNITORI", DataMode:acFormAdd
        Forms![LISTA FORNITORI]![NOME_FORNITORE] = NewData
        Else
    End If
    Response = acDataErrContinue
    End Sub
    Questa soluzione evita la modalità sincrona acDialog, sempre molto consigliata, ma che a me spesso dà rogne di varia natura. Per contro imposto di default la maschera Fornitori con proprietà Popup=Sì. In questo modo puoi non gestire il Load di "LISTA FORNITORI".
  • Re: Inserire nuovo campo se non in elenco

    OsvaldoLaviosa ha scritto:


    Non vorrei che ci fosse qualche errore di denominazione campi e/o sintassi. Guardando in giro fra miei vari progetti, mi accorgo di gestire in vari modi sta storia. Prova a gestire anche così:
    Private Sub NOME_FORNITORE(NewData As String, Response As Integer)
    Dim intReturn As Integer
    intReturn = MsgBox(NewData & " non esiste nella lista Fornitori. Vuoi inserirlo?", vbYesNo)
    If intReturn = vbYes Then
        DoCmd.OpenForm "LISTA FORNITORI", DataMode:acFormAdd
        Forms![LISTA FORNITORI]![NOME_FORNITORE] = NewData
        Else
    End If
    Response = acDataErrContinue
    End Sub
    Questa soluzione evita la modalità sincrona acDialog, sempre molto consigliata, ma che a me spesso dà rogne di varia natura. Per contro imposto di default la maschera Fornitori con proprietà Popup=Sì. In questo modo puoi non gestire il Load di "LISTA FORNITORI".
    Ciao Osvaldo, ho dovuto togliere DataMode perchè mi dava errore, ma ora il mio programma funziona! Ti sono immensamente grato per i ti consigli, alla prossima!
Devi accedere o registrarti per scrivere nel forum
8 risposte