Problema su duplicazione record

di il
13 risposte

Problema su duplicazione record

Ciao a tutti,

ho creato questo semplice codice sotto un commandbutton per duplicare un record completo, ma mi da errore tipo non corrispondente sul comando INSERT INTO
dove sbaglio?
Il campo Cod é il contatore chiave primaria quindi l'ho eliminato dal recordset prima di copiare il tutto nella tabella.
Private Sub cmdDupl_Click()
Dim NewR As DAO.Recordset
Set NewR = CurrentDb.OpenRecordset("SELECT * FROM Tabella1 WHERE Cod = " & Me.Cod & "")
NewR.Edit
NewR.Fields.Delete ("Cod")
NewR.Update
CurrentDb.Execute "INSERT INTO Tabella1 Select * From " & NewR & ""
NewR.Close
End Sub
Grazie

13 Risposte

  • Re: Problema su duplicazione record

    Puoi tradurre meglio il senso del codice che hai scritto...?
    Soprattutto:
    1) la parte del Delete sull'Oggetto Field... che è indispnesabile tu ci spieghi cosa dovrebbe fare per te...!
    2) Come dovrebbe considerare la Stringa questa roba:
    "INSERT INTO Tabella1 Select * From " & NewR & ""
    dal momento che newR è un Recordset...
  • Re: Problema su duplicazione record

    Dunque io vorrei che da una maschera, tramite un CmdButton si possa duplicare tutti i campi del record corrente, in un nuovo record naturalmente con campo Cod diverso.

    Quindi la mia idea era di copiare il record corrente in una variabile Recordset, eliminare il campo Cod per non duplicarlo, e dopo accodare il tutto nella tabella1 con il comando Insert INTO che dovrebbe creare il Cod In automatico.
  • Re: Problema su duplicazione record

    fabionik2004 ha scritto:


    Dunque io vorrei che da una maschera, tramite un CmdButton si possa duplicare tutti i campi del record corrente, in un nuovo record naturalmente con campo Cod diverso.
    Ma poi hai intenzione di cambiare "pochi" valori-campo, spero? Altrimenti che senso ha?
  • Re: Problema su duplicazione record

    Ma poi hai intenzione di cambiare "pochi" valori-campo, spero? Altrimenti che senso ha?
    Esatto, pero' diciamo che su 100 Campi ne dovro' cambiare 3 o 4 per questo mi servirebbe questo tasto
  • Re: Problema su duplicazione record

    OK.
    Se vuoi usare il Recordset, devi farlo correttamente. Altrimenti:
    1. Crea una query che filtra il tuo RECORD CORRENTE
    2. Trasformi questa query in "query di accodamento"

    Se proprio vuoi tutto in VBA, preleva l'SQL della query di accodamento e lo piazzi nel codice VBA.
  • Re: Problema su duplicazione record

    fabionik2004 ha scritto:


    Dunque io vorrei che da una maschera, tramite un CmdButton si possa duplicare tutti i campi del record corrente, in un nuovo record naturalmente con campo Cod diverso.

    Quindi la mia idea era di copiare il record corrente in una variabile Recordset, eliminare il campo Cod per non duplicarlo, e dopo accodare il tutto nella tabella1 con il comando Insert INTO che dovrebbe creare il Cod In automatico.
    Il metodo che usi è estremamente errato il recordset non è una variabile ma un oggetto e non può essere usato come hai fatto.
    Non devi usare ne la cancellazione del campo PK ne la query insert... devi aprire 2 recordset
    1° sul record da copiare in sola lettura questo lo hai fatto... quasi..
    2° sulla tabella in cui aggiungere il record.

    Quindi ti predisponi in addnew sul 2° e cicli tutti i fields del 1° inserendo nel 2 tutti i campi ad esclusione della pk.

    4 righe.
  • Re: Problema su duplicazione record

    Il metodo che usi è estremamente errato il recordset non è una variabile ma un oggetto e non può essere usato come hai fatto.
    Non devi usare ne la cancellazione del campo PK ne la query insert... devi aprire 2 recordset
    1° sul record da copiare in sola lettura questo lo hai fatto... quasi..
    2° sulla tabella in cui aggiungere il record.

    Quindi ti predisponi in addnew sul 2° e cicli tutti i fields del 1° inserendo nel 2 tutti i campi ad esclusione della pk.
    Ho capito il concetto ma ho provato ad applicarlo e con le mie conoscenze è impossibile.
    Quindi ho cercato ancora so google ed ho trovato un codice che ho adattato e sembra funzionare:

    Grazie
    Private Sub cmdDupl_Click()
    On Error GoTo ErrcmdDupl
    
        Dim dbs As DAO.Database
        Dim rst As DAO.Recordset
        Dim myTable As TableDef
        Dim varCustID As Variant
        Dim Arr() As Variant
        Dim intCount As Integer
        Dim intI As Integer
        Dim strMsg As String
    
        Set dbs = CurrentDb
        Set myTable = dbs.TableDefs("Tabella1")
        Set rst = dbs.OpenRecordset("Tabella1", dbOpenDynaset)
    
        intCount = myTable.Fields.Count
    
        ReDim Arr(intCount)
    
        'ID field is Primary Key rst(0)
        rst.FindFirst "[Cod] = " & Me.Cod & ""
    
        If rst.NoMatch = False Then
            'Record Found
            intI = 0
    
            'Temp store Cust Record in Array
            Do Until intI = intCount
                Arr(intI) = rst(intI)
                Debug.Print "Field " & intI & " = " & rst(intI)
                intI = intI + 1
            Loop
    
            'Copy Array contents into new record
            rst.AddNew
    
            intI = 0
    
            Do Until intI = intCount
                'Field 0 is Primary Key, do not copy
                If intI > 0 Then
                    rst(intI) = Arr(intI)
                End If
    
                intI = intI + 1
            Loop
    
            rst.Update
    
            rst.Bookmark = rst.LastModified
            varCustID = rst![Cod]
    
            rst.Close
            Set rst = Nothing
            Set dbs = Nothing
            Form_NewContract.Refresh
            TabCtl0.Value = 0
            MsgBox ("Contract Copy Done")
            
    
            'Additional Code as needed based on varCustID
    
        Else
            'No Record found
            strMsg = "The specified record was not found."
            MsgBox strMsg, vbInformation, "Aspire - Record not found"
    
        End If
    
    Exit_cmdDupl:
        Exit Sub
    ErrcmdDupl:
        strMsg = "The procedure to copy a record into a new record failed."
        MsgBox strMsg, vbInformation, "Aspire - Copy procedure failed."
        Resume Exit_cmdDupl
    
    End Sub
  • Re: Problema su duplicazione record

    Scusa ma non la posso vedere quella cosa li...
    
    Private Sub cmdDupl_Click()
    	On Error Goto Err_Handler
    	Dim rsSource  	As DAO.Recordset
            Dim rsDest     	As DAO.Recordset
    	Dim fld       	As DAO.Field
            Set rsSource = DbEngine(0)(0).OpenRecordset("SELECT * FROM Tabella1 WHERE Cod = " & Me.Cod ,dbOpenSnapshot,dbReadOnly)
    	If NOT(rsSource.eof and rsSource.Bof) then
    		Set rsDest = DbEngine(0)(0).OpenRecordset("Tabella1")
    		
    		rsDest.AddNew
    		For each fld in rsSource.Fields
    			If not fld.name="Cod" then
    			    rsDest.fields(fld.name)=fld.value
    			End If
    		Next
    		rsDest.Update
    	End if
    Exit_Here:
    	On error ResumeNext
    	If not rsDest is nothing then rsDest.close
    	If not rsSource id Nothing then rsSource.close
    	Set rsDest=Nothind
    	set rsSource=nothing
    	Exit Sub
    Err_Handler:
    	Msgbox Err.Number & " " & err.Description
    End Sub
  • Re: Problema su duplicazione record

    Ovviamente se la Maschera in cui fai il CLONE, ha come RecordSource la "Tabella1" va leggermente modificato:
    Private Sub cmdDupl_Click()
    	On Error Goto Err_Handler
    	Dim rsSource  	As DAO.Recordset
    	Dim fld       	As DAO.Field
    	Set rsSource = DbEngine(0)(0).OpenRecordset("SELECT * FROM Tabella1 WHERE Cod = " & Me.Cod ,dbOpenSnapshot,dbReadOnly)
    		
    		Me.RecordsetClone.AddNew
    		For each fld in rsSource.Fields
    			If not fld.name="Cod" then
    			    Me.RecordsetClone.fields(fld.name)=fld.value
    			End If
    		Next
    		Me.RecordsetClone.Update
    	End if
    
    Exit_Here:
    	On error ResumeNext
    	If not rsSource id Nothing then rsSource.close
    	set rsSource=nothing
    	Exit Sub
    Err_Handler:
    	Msgbox Err.Number & " " & err.Description
    End Sub
  • Re: Problema su duplicazione record

    Domani proverò il tuo codice.
    In che senso non si può vedere quello precedente? Nel senso che é contorto o che ci sono errori?
    Io ho fatto dei test ed ha funzionato
  • Re: Problema su duplicazione record

    Ciao,
    ho trovato un paio di errori in questo codice
    Private Sub cmdDupl_Click()
    	On Error Goto Err_Handler
    	Dim rsSource  	As DAO.Recordset
    	Dim fld       	As DAO.Field
    	Set rsSource = DbEngine(0)(0).OpenRecordset("SELECT * FROM Tabella1 WHERE Cod = " & Me.Cod ,dbOpenSnapshot,dbReadOnly)
    		
    		Me.RecordsetClone.AddNew
    		For each fld in rsSource.Fields
    			If not fld.name="Cod" then
    			    Me.RecordsetClone.fields(fld.name)=fld.value
    			End If
    		Next
    		Me.RecordsetClone.Update
    	End if
    
    Exit_Here:
    	On error ResumeNext
    	If not rsSource id Nothing then rsSource.close
    	set rsSource=nothing
    	Exit Sub
    Err_Handler:
    	Msgbox Err.Number & " " & err.Description
    End Sub
    c'é un end if che secondo me é di troppo e si puo eliminare

    Next
    Me.RecordsetClone.Update
    End if

    e poi mi da un errore di sintassi sulla riga
    If not rsSource id Nothing then rsSource.close
  • Re: Problema su duplicazione record

    L'ho scritto senza provarlo più per farti capire il concetto... mi aspetto che gli errori di scrittura o banali siano all'ordine della correzione da parte tua...!
    Secondo te cosa non va in questo...?
    
    If not rsSource id Nothing then rsSource.close
    la versione giusta
    
    If not rsSource Is Nothing then rsSource.close
    L'End If si può eliminare...
  • Re: Problema su duplicazione record

    Ah ecco,
    Serve a chiudere il recordset se non è ancora chiuso. La parola id mi ha mandato in confusione, perché pensavo che ti riferissi al mio campo cod
    Grazie
Devi accedere o registrarti per scrivere nel forum
13 risposte