Duplicazione record

di il
16 risposte

Duplicazione record

Buongiorno a tutti, vi espongo questo problema:

Su una maschera riportante i dati di un noleggio con relativa tabella collegata sulla quale sono riportati gli articoli noleggiati, ho creato un pulsante con il quale il cliente mi ha chiesto di poter duplicare, su una nuova scheda, il dettaglio degli articoli noleggiati precedentemente.

Pertanto, tramite VBA e SQL, sono riuscito a risolvere parzialmente. In pratica con questo codice:

    DBEngine(0)(0).Execute "INSERT INTO Noleggi SELECT idCliente, DtNoleggio FROM Noleggi WHERE idNoleggio=" & Me.idNoleggio & ""
Riesco a creare un nuovo record sulla tabella "Noleggi", anche se in questo caso mi vene anche riportata la data del precedente noleggio e, in realtà, dovrei dare la possibilità all'utente di decidere la nuova data (potrei ovviare inserendo una textBox da far compilare all'utente)

Il problema sorge nel momento in cui devo inserire il nuovo record sulla tabella contente il dettaglio degli articoli. Come faccio a memorizzare su tale tabella l'id della chiave primaria del record appena creato?

Ho creato questo codice :

UltimoId = Nz(DMax("idNoleggio", "Noleggi")) 
' con questo codice assegno alla variabile UltimoId il valore dell'ultimo id inserito nella tabella Noleggi
    
DBEngine(0)(0).Execute 
"INSERT INTO Noleggi_DettaglioArticoli 

SELECT Noleggi_DettaglioArticoli.idArticolo, Noleggi_DettaglioArticoli.qtaNoleggiata, Noleggi_DettaglioArticoli.importoNoleggi 

FROM Noleggi_DettaglioArticoli 

WHERE Noleggi_DettaglioArticoli.idNoleggio=" & Me.idNoleggio & ""
Ma non so come scrivere nel campo idNoleggio il valore di UltimoId.

Di seguito lo schema delle due tabelle interessate:

16 Risposte

  • Re: Duplicazione record

    cataland ha scritto:


    Su una maschera riportante i dati di un noleggio con relativa tabella collegata sulla quale sono riportati gli articoli noleggiati, ho creato un pulsante con il quale il cliente mi ha chiesto di poter duplicare, su una nuova scheda, il dettaglio degli articoli noleggiati precedentemente.
    In base a quello che dici poi su UltimoIDCliente io non sono d'accordo (o non ho capito). Se ti trovi in una situazione del genere:
    tabella Noleggi
    IDNoleggio | IDCliente
    1 | Rossi Mario
    2 | Brambilla Dario
    3 | Paoli Gino
    4 | Gazzelloni Severino

    Se Brambilla Dario crea un nuovo IDNoleggio=5 non puoi certo ricopiare i DettagliNoleggi di IDNoleggio=4. Credo occorra andare a ripescare l'UltimoIDNoleggio relativo a Brambilla Dario. Ti serve una query mirata che filtra i Noleggi di Brambilla Dario, li ordina Crescente rispetto a IDNoleggio e vada a pescare poi l'UltimoIDNoleggio (oppure ti basta semplicemente il DMax). Ti consiglio di creare una apposita query così filtrata che converti poi in query di accodamento (da eseguire una sola volta).
  • Re: Duplicazione record

    L'approccio che hai utilizzato a mio avviso è completamente fuori strada. Devi crearti una relazione molti-a-molti e poi come suggerito da Osvaldo crearti una query opportuna. Se guardi su youtube ce ne sono tanti tutorial che approcciano a questo specifico problema. Te ne indico uno tra tanti:
  • Re: Duplicazione record

    Se Brambilla Dario crea un nuovo IDNoleggio=5 non puoi certo ricopiare i DettagliNoleggi di IDNoleggio=4.
    Difatti l'ultimo IdNoleggio lo pesco dalla tabella dei Noleggi subito dopo l'insert, quindi l'ultimo idNoleggio sarà quello relativo al nuovo record accodato nel quale viene anche ricopiato l'IdCliente del record originario.

    Sulla parte di codice che ho incollato, manca l'istruzione sql precedente dove ho già creato il nuovo record, scusatemi.
  • Re: Duplicazione record

    eddy1973 ha scritto:


    L'approccio che hai utilizzato a mio avviso è completamente fuori strada. Devi crearti una relazione molti-a-molti e poi come suggerito da Osvaldo crearti una query opportuna. Se guardi su youtube ce ne sono tanti tutorial che approcciano a questo specifico problema. Te ne indico uno tra tanti:
    Scusa ma non capisco come possa aiutarmi la relazione molti a molti
  • Re: Duplicazione record

    cataland ha scritto:


    Se Brambilla Dario crea un nuovo IDNoleggio=5 non puoi certo ricopiare i DettagliNoleggi di IDNoleggio=4.
    Difatti l'ultimo IdNoleggio lo pesco dalla tabella dei Noleggi subito dopo l'insert, quindi l'ultimo idNoleggio sarà quello relativo al nuovo record accodato nel quale viene anche ricopiato l'IdCliente del record originario
    Continuo a non capire. Faccio un esempio pratico.
    Nel IDNoleggio=2, Brambilla Dario noleggia
    Zappa
    Trattore
    Abbacchiatore
    Decespugliatore

    Nel IDNoleggio=4, Gazzelloni Severino noleggia
    Automobile
    Carro
    Zappa

    Mi fai l'esempio pratico di quello che deve succedere alla nascita del record IDNoleggio=5, nel caso in cui al tuo cospetto si presenti il cliente Brambilla Dario?
    Ad ogni modo, prova in ogni caso a creare una query con le caratteristiche che ti ho detto e vedi che valori ti restituisce.
  • Re: Duplicazione record

    Allora sono io che non capisco... A che tu serve duplicare un record?
  • Re: Duplicazione record

    OsvaldoLaviosa ha scritto:


    cataland ha scritto:


    Se Brambilla Dario crea un nuovo IDNoleggio=5 non puoi certo ricopiare i DettagliNoleggi di IDNoleggio=4.
    Difatti l'ultimo IdNoleggio lo pesco dalla tabella dei Noleggi subito dopo l'insert, quindi l'ultimo idNoleggio sarà quello relativo al nuovo record accodato nel quale viene anche ricopiato l'IdCliente del record originario
    Continuo a non capire. Faccio un esempio pratico.
    Nel IDNoleggio=2, Brambilla Dario noleggia
    Zappa
    Trattore
    Abbacchiatore
    Decespugliatore

    Nel IDNoleggio=4, Gazzelloni Severino noleggia
    Automobile
    Carro
    Zappa

    Mi fai l'esempio pratico di quello che deve succedere alla nascita del record IDNoleggio=5, nel caso in cui al tuo cospetto si presenti il cliente Brambilla Dario?
    Ad ogni modo, prova in ogni caso a creare una query con le caratteristiche che ti ho detto e vedi che valori ti restituisce.
    Sostanzialmente, dalla maschera IdNoleggio=2 deve essere creato IdNoleggio=5 il cui cliente è sempre Brambilla Dario e gli articoli noleggiati sono gli stessi di IdNoleggio=2, cioé:
    Zappa
    Trattore
    Abbacchiatore
    Decespugliatore
  • Re: Duplicazione record

    Bene, ti serve la query con le caratteristiche che ti ho detto prima, rendila di tipo "query di accodamento" e in VBA scrivi l'istruzione
    DoCmd.OpenQuery "NomeQuery"
    Ci sarebbe da chiarire una cosa:
    A) Il record IDNoleggio=5 è stato già in parte digitato e Brambilla Dario già selezionato in IDCliente. In questo caso avresti problemi con il Max di IDNoleggio che sarebbe 5, ma senza articoli in DettagliArticoli e la query non saprebbe cosa accodare.
    B) Vuoi accodare prima di selezionare IDCliente.
  • Re: Duplicazione record

    Ok, soltanto non riesco ad inserire l'ultimo valore del campo IdNoleggio sul QBE
    Mi vengono estratti tutti i record del cliente e tutti gli IdNoleggio nonostante abbia inserito i raggruppamenti ed, al campo IdNoleggio abbia indicato il valore "Max"
  • Re: Duplicazione record

    Scusa...nel frattempo mi ero rimangiato un concetto e ti ho fatto questa domanda

    OsvaldoLaviosa ha scritto:


    Ci sarebbe da chiarire una cosa:
    A) Il record IDNoleggio=5 è stato già in parte digitato e Brambilla Dario già selezionato in IDCliente. In questo caso avresti problemi con il Max di IDNoleggio che sarebbe 5, ma senza articoli in DettagliArticoli e la query non saprebbe cosa accodare.
    B) Vuoi accodare prima di selezionare IDCliente.
  • Re: Duplicazione record

    Allora, quello che potrei fare è di dire al cliente di segnarsi l'idNoleggio del noleggio che vuole duplicare, in modo da sapere quali record di Noleggio_DettaglioArticoli deve andare a pescare, ma sulla query di accodamento, come filtro i dati di origine?
  • Re: Duplicazione record

    cataland ha scritto:


    quello che potrei fare è di dire al cliente di segnarsi l'idNoleggio del noleggio che vuole duplicare
    Nella query includi il campo IDNoleggio. In corrispondenza di Criterio ci scrivi:
    [Digitare IDNoleggio da duplicare]
  • Re: Duplicazione record

    Niente, così mi accoderebbe lo stesso idNoleggio del precedente, mentre l'IdNoleggio deve essere assegnato in base a IdNoleggio=5, cioè il corrente...
  • Re: Duplicazione record

    Credo che nella query devi avere 2 campi [Noleggi].[IDNoleggio] e [Noleggi_DettaglioArt].[IDNoleggio]. Nel primo chiedi [Digitare IDNoleggio da duplicare] (cioè quello precedente...che poi potrebbe essere anche un altro a caso...tanto è l'utente/cliente che sceglie) e non deve avere alcun campo assegnato in "Accoda a", mentre nel secondo scrivi [Maschere]![Noleggi]![IDNoleggio] con Accoda a [Noleggi_DettaglioArt].[IDNoleggio].
Devi accedere o registrarti per scrivere nel forum
16 risposte