Copia ed incolla recordset nella stessa tabella cambiando i valori

di il
9 risposte

Copia ed incolla recordset nella stessa tabella cambiando i valori

Sono a chiedervi un aiuto per far funzionare bene questo codice scopiazziato da un sito . Ho cercato di adattarlo ma il risultato non è quello voluto....e nn so andare avanti. Non so se devo usare un ciclo e soprattutto come impostarlo ...Qualcuno mi può aiutare a sistemare questo codice?

in breve : ho una tabella VociPrev nella quale vorrei che si duplicassero i record ( di numero variabile ) che hanno come riferimento nel campo ID_prev il valore in campo [Copia_num_prev], ovvero la cbo presente nella mia form ( il mio recordset).

Per i nuovi record duplicati nella stessa tabella VociPrev il valore ID_prev cambia e diventa lo stesso che ho nel campo [ incolla_num_prev] della stessa form .
Il mio obiettivo è avere la copia di tutte le voci preventivo nella setta tabella ma con un numero di Id_prev diverso.

Per fare questo richiamo il mio recordset con Id_prev in casella form [Copia_num_prev] ma quando lo duplico invece di duplicare solo i record con Id_Prev selezionato , mi duplica un numero di record variabile e non ben definito....

Private Sub Comando8_Click()
Dim DBCorrente As DAO.Database
Dim Tabella As DAO.Recordset
Dim Tabella1 As DAO.Recordset
Dim strSearchPrev As String
strSearchPrev = CStr(Me!Copia_num_prev)

If IsNull(Me.Copia_num_prev) Then
MsgBox ("inserire il numero del nuovo preventivo")
Me.Copia_num_prev.SetFocus
Exit Sub
End If

'Apro la tabella
Set DBCorrente = CurrentDb
Set Tabella = DBCorrente.OpenRecordset("VociPrev", dbOpenDynaset)
Set Tabella1 = DBCorrente.OpenRecordset("VociPrev")


'Cerco il dato
Tabella.FindFirst "ID_PREV = " & strSearchPrev
'Se non lo trovo non duplica il dato

While Tabella.EOF = False

'If Tabella.NoMatch = False Then
Tabella1.AddNew
Tabella1.Fields("id_prev") = Me.incolla_num_prev
Tabella1.Fields("id_articolo") = Tabella.Fields("id_articolo")
Tabella1.Fields("Prezzo_voce") = Tabella.Fields("Prezzo_voce")
Tabella1.Fields("id_richiesta") = Forms!PreventivoScrivi_crea.id_richiesta_riporto ' Tabella.Fields("Prezzo_voce")
Tabella1.Update

'End If
Tabella.MoveNext
Wend

'Chiusura tabelle
Tabella.Close
Tabella1.Close
DBCorrente.Close

' azioni sulle maschere
DoCmd.Close
Forms!PreventivoScrivi_crea.SetFocus
Forms!PreventivoScrivi_crea.Requery
End Sub

9 Risposte

  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    Non ho capito quello che devi fare.

    RAFPI ha scritto:


    ho una tabella VociPrev nella quale vorrei che si duplicassero i record ( di numero variabile ) che hanno come riferimento nel campo ID_prev il valore in campo [Copia_num_prev], ovvero la cbo presente nella mia form ( il mio recordset).
    Potresti elencare tutti i campi?
    Potresti spiegare con un esempio quello che io ho evidenziato?

    P.S.: Secondo il regolamento, quando scrivi codice, abbi cura di cliccare sul tasto sottostante "Editor completo & Anteprima", appare un editor più completo, quindi selezioni la porzione di testo-codice e poi clicca sul tasto in alto </> (codice). Così poi apparirà con i tipici caratteri monotype più familiari ai programmatori.
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    Ciao.
    Non so se ho ben capito, ma fai la ricerca con il nome del preventivo. Dovresti usare invece il campo id_preventivo. In questo modo copierai solo il preventivo che hai selezionato. Come stai facendo ora, se hai preventivi con lo stesso nome te li copia tutti.
    Inoltre gli id delle tabelle, li hai impostati come incremento automatico con duplicati non ammessi?
    Tra parentesi, se non sbaglio, con il while impostato in quel modo ti incolla lo stesso record per la quantità totale dei record che contiene la tabella, fino a quando non arriva alla fine della tabella.
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    Il codice che scrivi ha molti errori principalmente concettuali, ma devi inserirlo tra i TAG del codice.

    Intanto se devi copiare/duplicare un Record identificabile con una PK come nel tuo caso [ID_PREV] mi chiedo perchè apri tutta la tabella per poi cercarlo e non apri un RS con WHERE condition che ha efficienza estremamente più alta, riduce drasticamente il traffico di dati....?

    Parlo di questo:
    
    Tabella.FindFirst "ID_PREV = " & strSearchPrev
    Da fare così
    
    Set Tabella1 = DBCorrente.OpenRecordset("SELECT * FROM Tabella WHERE ID_PREV = " & strSearchPrev VociPrev")
    Controlli BOF ed EOF per verificare se il Dato è stato trovato, anche se mi chiedo che possibilità ci siano di non trovarlo, questo al posto del Nomatch...

    Detto questo dal momento che la Tabella di Origine e Destinazione è la medesima... perchè apri 2 RS sulla stessa tabella, peraltro entrambi in R/W cosa che potrebbe creare non pochi problemi...?

    Memorizza quei 2 Valori da recuperare o copiare, gli altri 2 sono recuperabili da fonti esterne... quindi sul RS aperto per la Ricerca fai un ADDNEW e sei a posto.

    Altra cosa non comprensibile è il LOOP... quanti dati devi duplicare...? a mia comprensione... si tratta di SOLO 1... anche perchè altrimenti sarebbero sempre uguali... ma in ogni caso la Selezione dell'ID è unica perchè mai fare un LOOP...?

    Insomma il tutto è decisamente poco logico.
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    1) impara ad usare i tag code (vedi regolamento)
    2) ti basta una semplicissima SQL di accodamento, via vba possibilmente
    
    "INSERT INTO tuaTabella (ID_PREV, campo1, campo2, ...) " & _
    "SELECT " & me.cbo_ID_PREV_DaCopiare & ", campo1, campo2, ... " & _
    "FROM tuaTabella " & _
    "WHERE ID_PREV=" & me.cbo_ID_PREV_ACuiCopiare
    
    chiaramente se l'id non è un numerico ma una stringa devi aggiungere gli apici

    EDIT: ecco, mi sono sovrapposto ad Alex

    EDIT2: nel titolo andrebbe sostituita la parola RECORDSET con RECORD
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    Intanto grazie per le risposte. 
    La mia esigenza è fare il clone di tutti i record ( di numero variabile , non uno solo ) che hanno come in comune il valore nella colonna ID_prev. La colonna Id_prev non è l' ID univoco della tabella, che invece è nominatao ID_VocePrev. Non mi occorre duplicare il singolo record ma bensì N record che hanno lo stesso valore in colonna Id_prev.
    
    Mi rendo conto di non aver specificato bene nel precedente post la tabella, e quindi lo faccio ora sperando di potervi fornire elementi utili a chiare la mia necessità. 
    
    Tabella : VociPrev
    Id_VocePrev (  id univoco - incrementale automatico )
    
    id_Prev ( campo numerico : è la colonna in cui riporto il riferimento numerico al numero del preventivo . 
    Il num in Id_prev è il criterio che adotto per cercare e fare il clone di tutti i [u]records[/u] - dal numero indefinito - che hanno lo stesso valore : Es. clona tutti i record con Id_prev = 178 - per questo parlo di recordset -. Devo duplicare TUTTI I RECORD con lo stesso Id_prev , nella stessa tabella e cambiare il numero id_prev  nei " nuovi doppioni " riportando il valore che ho nel campo nella form chiamato incolla_num_prev  es. incollare nei doppioni in Id_prev = 183)
    
    id_richiesta ( campo numerico riferito al numero id_richiesta pervenuta : Forms!PreventivoScrivi_crea.id_richiesta_nuova)
    
    id_articolo ( campo numerico : duplicare il valore -copia/incolla -)
    Prezzo_voce ( campo valuta :  duplicare il valore -copia/incolla -)
    descrizione ( campo testo :  duplicare il valore -copia/incolla -)
    ..altri campi di testo  e numerici da duplicare il valore - copia/incolla -
    
    Mi occorre quindi copiare tutti i record accomunatati dallo stesso Id_prev es.178 , e duplicarli con un nuovo Id_prev presente in incolla_num_prev es. Id_prev = 183. Grazie
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    Ahaha ok i tag code ma ... non così!


    ok, quindi la mia risposta precedente non fa proprio questo?
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    Grazie mille muttly005, il tuo suggerimento è stato utilissimo !
    scrivo comunque il codice si sa mai che può servire ai posteri !
    
    Private Sub duplica_voci_preventivo_Click()
    Dim sSQL As String
    
    If IsNull(Me.Copia_num_prev) Then
    MsgBox ("selezionare il preventivo da copiare")
    Me.Copia_num_prev.SetFocus
    Exit Sub
    End If
    
    
    sSQL = "INSERT INTO VociPrev ( Id_prev, id_articolo, Q_voce, Prezzo_voce,sconto_valore, Note_esecuzione, art_desc, id_bonus, id_richiesta) " & _
    "SELECT " & Me.incolla_num_prev & ", id_articolo, Q_voce, Prezzo_voce,sconto_valore, Note_esecuzione, art_desc, id_bonus," & Me.riporto_id_richiesta & " " & _
    "FROM VociPrev " & _
    "WHERE  Id_prev=" & Me.Copia_num_prev
    
    DoCmd.RunSQL sSQL
    
    DoCmd.Close
    Forms!PreventivoScrivi_crea.SetFocus
    Forms!PreventivoScrivi_crea.Requery
    End Sub
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    I tag code!!! usali correttamente
    vedi che il tuo messaggio è diverso da quelli che usano tutti gli altri?

    il testo scritto per rispondere non deve essere messo tra tag ma solo citazioni e codice
  • Re: Copia ed incolla recordset nella stessa tabella cambiando i valori

    Mi sa che non l'ha capito ancora.
Devi accedere o registrarti per scrivere nel forum
9 risposte