How to Insert a Variable Number of Records into an Access Table Based on a Fields Value

后端 未结 2 1095
猫巷女王i
猫巷女王i 2021-01-26 08:33

I have an Access Table with the following columns: WeeklyID(PrimaryKey), CampaignID(Foreignkey), WeekEnded(Date Field), Duration(Number Field).

I want to automatically a

相关标签:
2条回答
  • 2021-01-26 09:01

    Here's one way to do it. Note that I planned for a scenario where someone changes the duration -- after adding the records.

    Option Compare Database
    Option Explicit
    
    Dim dbs     As DAO.Database
    Dim rs      As DAO.recordSet
    Dim rsOT    As DAO.recordSet
    
    Function Create_New_Rows()
    Dim strSQL          As String
    Dim i               As Integer
    Dim iAdd            As Integer
    Dim iDuration       As Integer
    Dim lCampaignID     As Long
    
    
        On Error GoTo Error_trap
    
        Set dbs = CurrentDb
    
        strSQL = "SELECT Count(Campaign.WeeklyID) AS NbrRecs, First(Campaign.Duration) AS Duration, Campaign.CampaignID " & _
                    "FROM Campaign " & _
                    "GROUP BY Campaign.CampaignID;"
        Set rs = dbs.OpenRecordset(strSQL)
        Set rsOT = dbs.OpenRecordset("Campaign")
        If rs.EOF Then
            MsgBox "No records found!", vbOKOnly + vbCritical, "No Records"
            GoTo Exit_Code
        Else
            rs.MoveFirst
        End If
    
        Do While Not rs.EOF
            Debug.Print "Campaign: " & rs!CampaignID & vbTab & "Duration: " & rs!Duration & vbTab & "# Recs: " & rs!NbrRecs
            iDuration = rs!Duration
            lCampaignID = rs!CampaignID
    
    
            ' Check if already have correct number of records for this ID
            If iDuration = rs!NbrRecs Then
                ' Do nothing... counts are good
            ElseIf iDuration < rs!NbrRecs Then
                MsgBox "Add code to resolve too many records for Campaign: " & lCampaignID & vbCrLf & _
                    "Duration: " & iDuration & vbCrLf & _
                    "Records: " & rs!NbrRecs, vbOKOnly + vbCritical, "Too many records already!"
            Else
                ' Finally, Duration is less than existing records... time to add...
                iAdd = iDuration - rs!NbrRecs
                Do
                    If iAdd > 0 Then
                        ' Add new record
                        Add_Records lCampaignID
                        iAdd = iAdd - 1
                    Else
                        Exit Do
                    End If
                Loop
            End If
            rs.MoveNext
        Loop
    
    Exit_Code:
        If Not rs Is Nothing Then
            rs.Close
            Set rs = Nothing
        End If
        If Not rsOT Is Nothing Then
            rsOT.Close
            Set rsOT = Nothing
        End If
        dbs.Close
        Set dbs = Nothing
    
        MsgBox "Finished"
    
        Exit Function
    Error_trap:
        Debug.Print Err.Number & vbTab & Err.Description & vbCrLf & "In:   Create_New_Rows"
        MsgBox Err.Number & vbTab & Err.Description & vbCrLf & "In: Create_New_Rows"
        Resume Exit_Code
        Resume
    End Function
    
    Function Add_Records(lCampID As Long)
        With rsOT
            .AddNew
            !CampaignID = lCampID
            ' Add code if you want to populate other fields...
            .Update
            'Debug.Print "Added rec for CampaingID: " & lCampID
        End With
    
    End Function
    
    0 讨论(0)
  • 2021-01-26 09:07

    You can modify this function to have lngCount as a fixed value:

    Public Sub CopyEmptyRecords()
    
      Dim rstSource   As DAO.Recordset
      Dim rstInsert   As DAO.Recordset
      Dim fld         As DAO.Field
      Dim strSQL      As String
      Dim lngLoop     As Long
      Dim lngCount    As Long
      Dim booCopy     As Boolean
    
      strSQL = "SELECT * FROM tblStats"
      Set rstSource = CurrentDb.OpenRecordset(strSQL)
    
      strSQL = "SELECT TOP 1 * FROM tblStatsNull"
      Set rstInsert = CurrentDb.OpenRecordset(strSQL)
    
      With rstSource
        .MoveLast
        .MoveFirst
        lngCount = .RecordCount            ' Set to fixed value of 7.
        For lngLoop = 1 To lngCount
          With rstInsert
            booCopy = False
            .AddNew
              For Each fld In rstSource.Fields
                With fld
                  If .Attributes And dbAutoIncrField Then
                    ' Skip Autonumber or GUID field.
                  Else
                    ' Copy field content.
                    rstInsert.Fields(.Name).Value = .Value
                    If Len(Trim(Nz(.Value, vbNullString))) = 0 Then
                      booCopy = True
                    End If
                  End If
                End With
              Next
            If booCopy = True Then
              .Update
            Else
              .CancelUpdate
            End If
          End With
          .MoveNext
        Next
        rstInsert.Close
        .Close
      End With
    
      Set rstInsert = Nothing
      Set rstSource = Nothing
    
    End Sub
    
    0 讨论(0)
提交回复
热议问题