Duplicare record in subform foglio dati

di il
5 risposte

Duplicare record in subform foglio dati

Buongiorno,

ho una form con una subform in visualizzazione foglio dati in cui inserisco la testata ordine (nella form) e le righe d'ordine nella subform.

Avrei la necessita' di duplicare il record corrente (quello che ha il focus) della subform.

Quale e' il metodo piu' consono?

Pensavo di creare una Routine da associare ad una combinazione di tasti, ma non so se ci sono altri metodi.

In alternativa avevo pensato di modificare la subform in maschera continua in modo da rendere visibile il pulsante di duplica, ma la visualizzazione foglio dati mi permette di avere tutti i controlli a disposizione in una unica schermata per la larghezza del monitor, se aggiungessi anche il button non ci starei…

Grazie in anticipo

5 Risposte

  • Re: Duplicare record in subform foglio dati

    Sono sicuro che cercando su internet qualcosa di fatto e finito si trova. Sono pigro e provo ad arrangiarmi con la fantasia: metti un pulsante nella maschera principale e da quello lanci una query di inserimento/accodamento nella tabella/query associata alla sottomaschera, facendo attenzione però ad escludere il campo chiave primaria se a numerazione automatica.

    Una query di quel tipo si scrive così

    INSERT INTO Tabella (campo1, campo2, campo3, ...campoN)
    SELECT campo1, campo2, campo3, ...campoN 
    FROM Tabella 
    WHERE CampoIDOrdine = NumeroIdentificativoOrdineCorrente AND AltroCampo = UltimoValoreUtile

    ovviamente devi costruire la SQL indicando il numero identificativo dell'ordine che puoi prelevare dalla maschera principale e l'altra condizione  in AND per andare a prendere l'ultima riga d'ordine, altrimenti le duplica tutte. Sottolineo ancora: non mettere nei campi di provenienza e destinazione la chiave primaria se è a numerazione automatica.

    La stringa SQL così creata va passata al metodo Execute dell'oggetto Database, all'interno di una transazione. E' probabile che dopo questa operazione si debba fare un Requery della sottomaschera.

    Sono andato di fantasia/logica, ora spetta a te metterla in pratica ma non dovrebbe essere difficile.

  • Re: Duplicare record in subform foglio dati

    Grazie Phil per il suggerimento; il problema e' che, in questo modo, andrei a duplicare l'ultimo record creato, mentre io dovrei duplicare il record che ha il focus (che non necessariamente e' l'ultimo). Mettendo il pulsante esterno perdo il focus sul record per cui non ho piu' il riferimento…

    Comunque ci studio su, la query di accodamento non l'avevo presa in considerazione.

  • Re: Duplicare record in subform foglio dati

    12/07/2023 - Mailman ha scritto:


    …il problema e' che, in questo modo, andrei a duplicare l'ultimo record creato, mentre io dovrei duplicare il record che ha il focus (che non necessariamente e' l'ultimo)…

    Ah, sì, l'avevi pure scritto, è vero.

    Scrivi il codice sul doppio click su un controllo della subform: fai doppio click su un controllo specifico e duplica quel record specifico. Anche se non ha senso visualizzarlo, potrebbe essere la PK di quel record, che solitamente non si visualizza nemmeno o al massimo si disabilità, così non succede di fare doppio click per errore su un altro campo/controllo che si intende invece solo selezionare e modificare.

  • Re: Duplicare record in subform foglio dati

    Grazie Phil, ottimo suggerimento: a volte la soluzione e' lampante ma ci si complica la vita inutilmente…

    Risolto con Doppioclick su ID riga d'ordine che comunque rimane un controllo abilitato ma bloccato. Di seguito la routine ad uso e consumo degli utenti:

    Private Sub sfrmDOctrIDtabDOid_DblClick(Cancel As Integer)
    On Error GoTo Err_sfrmDOctrIDtabDOid_DblClick
    
        Dim rs  As DAO.Recordset
        Dim fld As DAO.Field
        Dim vID As Variant
        
        Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM TblDOdettagliordine WHERE IDtabDOid=" & Me.sfrmDOctrIDtabDOid, dbOpenSnapshot, dbReadOnly)
        With Me.RecordsetClone
            .AddNew
            For Each fld In rs.Fields
                If fld.Name <> "IDtabDOid" Then 'IDtabDOid e' PK contatore automatico che non va duplicato
                    .Fields(fld.Name) = fld
                End If
            Next
            .Update
            .Bookmark = .LastModified
            vID = .Fields("IDtabDOid") 'associo alla vID l'ultimo ID creato
            Me.Requery ' faccio il requery della form
            .FindFirst "IDtabDOid=" & vID 'trovo l'utimo ID creato e sposto il bookmark sul record
            Me.Bookmark = .Bookmark
        End With
        rs.Close
        Set rs = Nothing
        
    sfrmDOcboNUMtabDOcommessa.SetFocus
    
    Exit_sfrmDOctrIDtabDOid_DblClick:
        Exit Sub
    
    Err_sfrmDOctrIDtabDOid_DblClick:
        MsgBox Err.Description
        Resume Exit_sfrmDOctrIDtabDOid_DblClick
    
    End Sub
  • Re: Duplicare record in subform foglio dati

    12/07/2023 - Mailman ha scritto:


    Grazie Phil, ottimo suggerimento: a volte la soluzione e' lampante ma ci si complica la vita inutilmente…

    Risolto con Doppioclick su ID riga d'ordine che comunque rimane un controllo abilitato ma bloccato. Di seguito la routine ad uso e consumo degli utenti:

    Vabbè, non è una query di INSERT ma scorri tutti i campi, ad eccezione della chiave primaria. Alla fine trattandosi di aggiungere un record solo non è una cosa terribile.

    Per la cronaca (visto che anche a me è servito quel tipo di cronaca) con quel codice ti sei pescato la PK agendo sul bookmark, spostandolo al LastModified. Se avessi usato la query di inserimento e avessi voluto reperire la PK assegnata al nuovo record, per poi posizionarti su quello, si doveva usare l'IDENTITY.

    DbEngine(0)(0).OpenRecordset("SELECT @@IDENTITY).Fields(0)
Devi accedere o registrarti per scrivere nel forum
5 risposte