IALweb Homepage
Forum Home Forum Home > MS Office > Microsoft Office > Microsoft Access
  New Posts New Posts RSS Feed - Access VBA - Duplicare record in tabelle collegate
  FAQ FAQ  Forum Search   Events   Register Register  Login Login


REGISTRATEVI su IALWeb forum!

Access VBA - Duplicare record in tabelle collegate

 Post Reply Post Reply
Author
Message
Sally82 View Drop Down
Utente in Prova
Utente in Prova
Avatar

Joined: 10/Dic/2018
Status: Offline
Points: 5
Post Options Post Options   Thanks (0) Thanks(0)   Quote Sally82 Quote  Post ReplyReply Direct Link To This Post Topic: Access VBA - Duplicare record in tabelle collegate
    Posted: 10/Dic/2018 at 15:28
Buongiorno a tutti.

Ho duplicato con successo nella stessa tabella (TAB_OFFERTE) un record aperto in una maschera, utilizzando il codice che segue, innescato ONCLICK su un pulsante. Avrei bisogno, sempre sfruttando il medesimo evento sulla stessa maschera, di duplicare tutti i record con ID_OFFERTA uguale alla variabile id_riferimento (ottenuta sotto)  presenti in 6 tabelle che sono collegate a questa con ID_OFFERTA 1 a molti.

Dim rstSource   As DAO.Recordset
  Dim rstInsert   As DAO.Recordset
  Dim fld         As DAO.Field

  If Me.NewRecord = True Then Exit Sub

  Set rstInsert = Me.RecordsetClone
  Set rstSource = rstInsert.Clone
 
  With rstSource
    If .RecordCount > 0 Then
      ' Go to the current record.
      .Bookmark = Me.Bookmark
      With rstInsert
        .AddNew
          For Each fld In rstSource.Fields
            With fld
                             
                If .Name = "data" Then
                rstInsert.Fields(.Name).Value = Now()
               
                ElseIf .Name = "sconto" Then
                rstInsert.Fields(.Name).Value = rstSource.Fields("sconto").Value
               
                ElseIf .Name = "cliente" Then
                rstInsert.Fields(.Name).Value = rstSource.Fields("cliente").Value
               
            ElseIf .Name = "autore" Then
                rstInsert.Fields(.Name).Value = Me.RIAPERTA_DA.Value
           
            ElseIf .Name = "titolo" Then
                rstInsert.Fields(.Name).Value = rstSource.Fields("titolo").Value
               
                ElseIf .Name = "old_id" Then
                rstInsert.Fields(.Name).Value = rstSource.Fields("id").Value
                id_riferimento = rstSource.Fields("id").Value
               
                ElseIf .Name = "ID" Then
                OFFER_CODE = rstInsert.Fields(.Name).Value
               
                 ElseIf .Name = "alias_id" Then
                 'dcount degli alias da inserire come alias della nuova offerta
                
numero_alias = DCount("alias_id", "tab_offerte", "alias_id Like '" & Val(rstSource.Fields("alias_id").Value) & "*'")

If numero_alias = 0 Then
' non accodo niente
codice_alias = Str(Val(rstSource.Fields("alias_id").Value))
Else
'accodo il numero e basta
codice_alias = Str(Val(rstSource.Fields("alias_id").Value)) & "_" & numero_alias
End If                                 
               rstInsert.Fields(.Name).Value = Trim(codice_alias)
                
                     Else
                 End If
            End With
          Next
        .Update
       
        .Close
      End With
    End If
    .Close
  End With

  Set rstInsert = Nothing
  Set rstSource = Nothing


Alla fine di questa prima parte di codice funzionante, quando provo a replicare l'operazione sulla prima delle tabelle collegate, impostando un codice simile e cambiando il recordset, ma credo di sbagliare nel settare i recordset come segue:
  Set rstSource = CurrentDb.OpenRecordset("SELECT * FROM TAB_DEMAND where ID_OFFERTA =" & Int(id_riferimento))
    Set rstInsert = CurrentDb.OpenRecordset("SELECT * FROM TAB_DEMAND")


perchè ricevo sempre errore di runtime 3022 (modifiche non apportate perchè provocherebbero valori duplicati nell'indice, nella chiave primaria o nella relazione).
Non so come testare il dato che acquisisco con l'apertura del recordset. Non penso che l'errore sia dovuto ai dati che inserisco perchè ho provato a inserire anche solo un campo di testo e mi dà lo stesso problema.

Credo piuttosto di non sapere qualcosa di basilare per il quale non riesco, da una maschera basata su un recordset, ad aprirne altri per effettuare delle modifiche. Qualcuno sa indicarmi dove sbaglio?
Grazie a tutti




Back to Top
Sponsored Links


Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 10254
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 10/Dic/2018 at 22:15
L'errore di runtime 3022 indica che stai tentando di inserire chiavi duplicate in una tabella che non ne prevede.
Devi valutare la chiave primaria (del lato 1 della relazione) e quando questa non è già presente puoi inserirla e, di conseguenza, aggiornare i dati sul lato molti.
Consiglio, inoltre, di inserire una gestione degli errori in modo da valutare, prioritariamente, i valori duplicati:
 
 


Edited by willy55 - 10/Dic/2018 at 22:16
Willy
Back to Top
 Post Reply Post Reply
  Share Topic   

Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 10.17
Copyright ©2001-2013 Web Wiz Ltd.

This page was generated in 0,063 seconds.