Pulsante copia

di il
12 risposte

Pulsante copia

Ciao a tutti, sono un novello con Access ed avrei una problema da risolvere. Nel database che sto creando vorrei realizzare una funzione che mi sta dando non poche difficoltà. Vi faccio un esempio così è più facile da capire. Ho la seguente tabella:

Nome Cognome data di nascita luogo di nascita Residenza ecc....
giulio rossi 01/01/2001 Roma Milano ecc....

e così via...E fino a qua tutto è semplice.
Ora Giulio ha una moglie e 2 figli che abitano nel suo stesso paese e sarebbe faticoso scrivere altre 3 righe nella tabella aventi in comune quasi li stessi dati.
Quello che io sto tentando di fare è di creare una funzione, nella maschera, che cliccando su un pulsante mi ricopi i dati in comune di Giulio, i quali serviranno per la moglie e per i figli, e me li inserisca nella riga successiva.
Spero di essere stato chiaro, il mio italiano non è perfetto.

Ciao a tutti

12 Risposte

  • Re: Pulsante copia

    Se normalizzi la tua tabella su più tabelle relazionate risolvi almeno il problema del Comune (portandoti appresso automaticamente anche CAP, Provincia e Regione).
    Poi non sottovaluterei il comando CTRL+apostrofo che ti consente di ripetere lo stesso valore di campo del record precedente.
    Se poi descrivi lo scopo generale del tuo database, forse si potrebbero ottimizzare altre cose.
  • Re: Pulsante copia

    Ciao Osvaldo e grazie per la risposta.
    Cerco di spiegarmi meglio.
    Dopo aver creato il record Giulio, vorrei avere un pulsante che quando lo clicco copi alcuni campi di Giulio e che li incolli nel record successivo. Spiego meglio il procedimento con un altro esempio:

    - compilo i form di Giulio e clicco sul tasto "Aggiungi" (che ho già nella maschera) il quale crea il record nella tabella (come nell'esempio precedente).
    Nome Cognome data di nascita luogo di nascita Residenza Cap
    Giulio Rossi 01/01/2001 Roma Milano 00001

    - Cliccando sul pulsante "Nuovo" mi resetta tutti i form in modo da inserire un nuovo record.
    - inserisco i dati della moglie come il nome, cognome e data di nascita.
    Rosa Bianchi 15/08/2002 Palerno ma non metto gli altri dati
    A questo punto vorrei che tramite un pulsante mi ricopi, nei restanti campi, i valori dei campi di Giulio.

    Chiaro?
    Mi potresti spiegare meglio il secondo e il terzo metodo, non li conosco.
  • Re: Pulsante copia

    Sei stato abbastanza chiaro. Questa frase

    OsvaldoLaviosa ha scritto:


    Se poi descrivi lo scopo generale del tuo database, forse si potrebbero ottimizzare altre cose
    non ha alcun senso.

    A) Soluzione facilissima.
    Quando il cursore si trova nel campo Residenza, premi CTRL+' (il carattere ' si chiama apostrofo e si trova, sulla tastiera, sotto ? (punto interrogativo)). Vedrai apparire lo stesso valore del record precedente. Poi il cursore va a finire nel campo successivo, premi di nuovo CTRL+', ecc...fino all'ultimo campo.

    B) Soluzione facile.
    Se la tua maschera è in visualizzazione foglio dati, basta selezionare trascinando più campi adiacenti del record precedente, quindi copia. Seleziona gli stessi campi adiacenti sul record ultimo e incolla.

    C) Soluzione da te richiesta (complessa da progettare).
    Sicuramente occorre creare una macro o codice VBA che faccia esattamente quello che hai chiesto. Però io aggirerei qualche ostacolo. Invece di compilare subito i primi campi, "clonerei" tutto il record precedente e correggerei i soli campi diversi, quindi:
    1. Crea una nuova macro in visualizzazione struttura
    2. Imposta le seguenti azioni:
    VaiARecord--->Record: Precedente
    EseguiComando--->Comando: SelezionaRecord
    EseguiComando--->Comando: Copia
    VaiARecord--->Record: Successivo
    EseguiComando--->Comando: SelezionaRecord
    EseguiComando--->Comando: Incolla
    3. Salva la macro con nome Ripeti
    4. Vai in visualizzazione struttura maschera
    5. Crea un pulsante di comando, vai alle Proprietà, scheda Eventi, Su clic: Ripeti
    6. Salva tutto
    Cosa succede quando clicchi sul pulsante. La macro ti copierà tutti i dati del record precedente. Tu, manualmente, correggi Nome, Cognome, DataNascita.
  • Re: Pulsante copia

    La 1a soluzione è più che facilissima , però mi attira molto la 3a appena posso la provo e ti faccio sapere come va. Grazie mille.
  • Re: Pulsante copia

    Per consentire all'utilizzatore di selezioanre i campi da Copiare in modo flessibile funzionale, ci sono vari metodi...
    Personalmente, opto per utilizzare una Maschera Popup con una ListBox in modalità Selezione Estesa Multipla, popolata con i Nomi dei Campi della Tabella, che poi sono quelli della Maschera visualizzati dalle TextBox, ad eccezione della PK che probabilmente è un Counter.
    A quel punto dato il Record attivo, premo il pulsante copia campi o duplica, si apre la mascherina con l'elenco dei campi e relativo valore, seleziono quelli che mi servono e li applico al NUOVO Record come DEFAULTVALUE.
    Il tutto è abbastanza semplice e molto funzionale...
  • Re: Pulsante copia

    OsvaldoLaviosa ha scritto:


    C) Soluzione da te richiesta (complessa da progettare).
    Sicuramente occorre creare una macro o codice VBA che faccia esattamente quello che hai chiesto. Però io aggirerei qualche ostacolo. Invece di compilare subito i primi campi, "clonerei" tutto il record precedente e correggerei i soli campi diversi, quindi:
    1. Crea una nuova macro in visualizzazione struttura
    2. Imposta le seguenti azioni:
    VaiARecord--->Record: Precedente
    EseguiComando--->Comando: SelezionaRecord
    EseguiComando--->Comando: Copia
    VaiARecord--->Record: Successivo
    EseguiComando--->Comando: SelezionaRecord
    EseguiComando--->Comando: Incolla
    3. Salva la macro con nome Ripeti
    4. Vai in visualizzazione struttura maschera
    5. Crea un pulsante di comando, vai alle Proprietà, scheda Eventi, Su clic: Ripeti
    6. Salva tutto
    Cosa succede quando clicchi sul pulsante. La macro ti copierà tutti i dati del record precedente. Tu, manualmente, correggi Nome, Cognome, DataNascita.
    Errato. Chiedo scusa, ieri sera era tardi e mi sono fatto prendere la mano. Questa soluzione "clona" un record con TUTTI i campi. Ma ciò è impossibile perchè non si può ripetere lo stesso valore per il campo chiave primaria.
    La soluzione di @Alex è certamente una di quelle più pertinenti.
  • Re: Pulsante copia

    @osvaldo la chiave primaria è un'altra che non compare nella maschera e non viene mostrato all'utente.

    @alex mi potresti spiegare meglio nei dettagli come posso applicare la tua soluzione?
  • Re: Pulsante copia

    La cosa non è così semplice... ma ovviamente è relativamente semplice.
    In sostanza io ho fatto una Form Data(Unbound) che associo solo in un secondo momento leggendo il Recordset della Maschera da gestire.
    Creo un Recordset ADO in memoria con 3 campi:
    Flag
    NomeCampo
    ValoreCampo
    Leggo la collection Fields del Recordset della Maschera, e dopo aver spostato il Pointer al Record attivo popolo il Recordset in memoria con il NomeCampo e ValoreCampo, in sola Visualizzazione.
    Il Campo Flag è di tipo Boolean che associo ad una CheckBox.
    Quindi consento all'utente di selezionare i campi da copiare, se poi vuoi puoi anche definire per quante volte....
    Poi la parte più complessa è la fase di intercettazione degli errori per tentativo di duplicazione della PK dal momento che da un Recordset non è possibile capire quale sia la PK devi lavorare in BruteForce e scrivere gestendo l'errore...

    Ora... potrebbe sembrare tutto molto complesso... ma dipende da quanto è solida la ta preparazione.
  • Re: Pulsante copia

    Alex ti ringrazio ma non essendo un esperto di Access ho trovato un po di difficoltà nel capire di preciso cosa dovrei fare. Ho delle basi però non sono abbastanza approfondite, se potresti spiegarmi più nel dettaglio te ne sarei grato.



    P.S.:premetto che ho una buona conoscenza di C++ e penso che possa aiutare.
  • Re: Pulsante copia

    Prova così. Chiamerò CampoX, CampoY, CampoZ (presupponendo che siano di tipo Testo) i campi che tu prevedi devono avere lo stesso valore del record precedente. Un pulsante Copia che funziona così:
    Private Sub Copia_Click()
    Dim X, Y, Z As String
    DoCmd.GoToRecord acActiveDataObject, , acPrevious
    X = Me!CampoX
    Y = Me!CampoY
    Z = Me!CampoZ
    DoCmd.GoToRecord acActiveDataObject, , acNext
    Me!CampoX = X
    Me!CampoY = Y
    Me!CampoZ = Z
    End Sub
    Ho fatto un test e funziona.
    Ideale sarebbe preservare l'utilizzo del pulsante da un clic accidentale, ad esempio avere effetto o essere visibile solo se il record corrente è Ultimo o Nuovo...ma qui le mie conoscenze in VBA scarseggiano...
  • Re: Pulsante copia

    Intendevo una cosa simile:
    http://forum.masterdrive.it/access-79/copia-records-85917/#post314812
  • Re: Pulsante copia

    Ok grazie Alex. Senti ti posso chiedere un'ultima cosa, io ho creato una funzione ricerca di un campo fra tutti i record, tuttavia il risultato della ricerca me lo mostra nella tabella mentre io vorrei che me lo mostrasse nella maschera. Come posso fare per visualizzare il risultato della ricerca nella maschera??
Devi accedere o registrarti per scrivere nel forum
12 risposte