Solved

Duplicate the main record and related detail records

Posted on 2012-12-26
6
608 Views
Last Modified: 2012-12-26
Hello All!  I have run into an issue cloning records in Microsoft Access.  I have modified code from Allen Browne's website.  The code clone's the main record first after prompting the end user for a new date.  That part works flawlessly.  The problem arises when I get to the detail records.  All of the information for the detail records gets cloned; however I can't get the new date inserted into the records.  It leaves it as a null value which displays as 12/30/1899 in SQL Server 2005.  I believe it must have something to do with a date delimiter, but I am not quite sure.  Any help would be greatly appreciated.

Public Function DupRec()
On Error GoTo err_handle
'Purpose:   Duplicate the main form record and related records in the subform.
'Provided by Allen Browne, November 2005

Dim lngEventID As Long, lngSetupID As Long
Dim Msg, Style, Title, Response, MyString   'Message Box
Dim datStart As Date, datEnd As Date, strEName As String
Dim strSetup As String, strMeals As String, strBvgSvc As String
Dim strEquip As String, db As DAO.Database

    
Set db = DBEngine(0)(0)

'Get dates for new record from temporary table.
datStart = DLookup("[datStart]", "zttblDupDate")
datEnd = DLookup("[datEnd]", "zttblDupDate")
strEName = Forms!fdlgDupDate!txtEName
    
'Make sure there is a record to duplicate
If Me.NewRecord Then
    'Notify the user there is no record to duplicate
    Msg = "Select a record to duplicate."
    Style = vbOKOnly + vbInformation
    Title = "No Data"
    Response = RichBox(Msg, Style, Title)
Else
    'Duplicate the main record: add to form's clone.
    With Me.RecordsetClone
        .AddNew
        !EventName = strEName
        !Client = Me.cboClient
        !Category = Me.cboCategory
        !Status = Me.cboStatus
        !Location = Me.cboLocation
        !StartDate = datStart
        !EndDate = datEnd
        !ProgramStartTime = Me.txtProgramStart
        !ProgramEndTime = Me.txtProgramEnd
        !ArrivalTime = Me.txtArrivalTime
        !SetupDate = Me.txtArrivalDate
        !SetupTime = Me.txtSetupTime
        !RegistrationTime = Me.txtRegStart
        !iMISCode = Me.txtiMISCode
        !SvcChg = Me.txtSvcChg
        !PartnerDiscount = Me.cboDiscount
        !CleaningFee = Me.txtCleaningFee
        .Update
            
        'Save the primary key value, to use as the foreign key for the related records.
        .Bookmark = .LastModified
        lngEventID = !EventID
            
        'Duplicate the related event setup records: append query.
        If Me.[Event Setup Subform].Form.RecordsetClone.RecordCount > 0 Then
            strSetup = "INSERT INTO todbEventSet ( Event, MeetingDate, MeetingLocation, RentalRate, Rate, " & vbCrLf & _
                "PrimarySetup, SecondarySetup, RegTable, ExtraChairs, ProgramStartTime, " & vbCrLf & _
                "ProgramEndTime, ExpectedPrimary, ExpectedSecondary ) " & vbCrLf & _
                "SELECT " & lngEventID & " As NewEvent, " & datStart & " As NewDate, " & vbCrLf & _
                "todbEventSet.MeetingLocation, todbEventSet.RentalRate, " & vbCrLf & _
                "todbEventSet.Rate, todbEventSet.PrimarySetup, " & vbCrLf & _
                "todbEventSet.SecondarySetup, todbEventSet.RegTable, " & vbCrLf & _
                "todbEventSet.ExtraChairs, todbEventSet.ProgramStartTime, " & vbCrLf & _
                "todbEventSet.ProgramEndTime, todbEventSet.ExpectedPrimary, " & vbCrLf & _
                "todbEventSet.ExpectedSecondary" & vbCrLf & _
                "FROM [todbEventSet] WHERE Event = " & Me.txtID & ";"
            db.Execute strSetup, dbFailOnError
        Else
            'Notify the user there is no record to duplicate
            Msg = "Select a record to duplicate."
            Style = vbOKOnly + vbInformation
            Title = "No Data"
            Response = RichBox(Msg, Style, Title)
            MsgBox "Main record duplicated, but there were no related event setup records."
        End If
                       
        'Duplicate the related meal records: append query.
        If Me.[Event Meals Subform].Form.RecordsetClone.RecordCount > 0 Then
            strMeals = "INSERT INTO [todbMeals] ( Event, MealDate, MealType, FoodSetup," & vbCrLf & _
                "SetupTime, ServingTime, Expected) " & vbCrLf & _
                "SELECT " & lngEventID & " As NewEvent, " & datStart & " As NewDate, " & vbCrLf & _
                "todbMeals.MealType, todbMeals.FoodSetup, todbMeals.SetupTime, " & vbCrLf & _
                "todbMeals.ServingTime, todbMeals.Expected" & vbCrLf & _
                "FROM [todbMeals] WHERE Event = " & Me.txtID & ";"
            db.Execute strMeals, dbFailOnError
        Else
            MsgBox "Main record duplicated, but there were no related meal records."
        End If
            
        'Duplicate the related beverage records: append query.
        If Me.[Beverage Expenses].Form.RecordsetClone.RecordCount > 0 Then
            strBvgSvc = "INSERT INTO [todbBevSvc] ( Event, ExpenseDate, Beverage, Quantity, UnitPrice ) " & vbCrLf & _
                "SELECT " & lngEventID & " As NewEvent, " & datStart & " As NewDate, " & vbCrLf & _
                "todbBevSvc.Beverage, todbBevSvc.Quantity, todbBevSvc.UnitPrice " & vbCrLf & _
                "FROM [todbBevSvc] WHERE Event = " & Me.txtID & ";"
            db.Execute strBvgSvc, dbFailOnError
        Else
            MsgBox "Main record duplicated, but there were no related beverage records."
        End If
            
        'Display the new duplicate.
        Me.Bookmark = .LastModified
    End With
End If

'Update details records using the new dates.
DoCmd.RunSQL "UPDATE todbEventSet SET [MeetingDate] = " & datStart & " WHERE [Event] = " & Me.txtID
            
'Delete temporary table
DoCmd.DeleteObject acTable, "zttblDupDate"
        
Exit_Proc:
Exit Function

err_handle:
Call ErrorLog(Err.Description, Err.Number, Me.Name, Erl, "DupRec()")
Resume Exit_Proc
End Function

Open in new window

0
Comment
Question by:schaIT
  • 4
  • 2
6 Comments
 
LVL 74

Expert Comment

by:Jeffrey Coachman
ID: 38721435
<I have modified code from Allen Browne's website.>
Please post the link to this original code...
Have you tried contacting the author?
Perhaps something is awry in your modification?
Many experts here are wary of modifying another top developer's code...

< The code clone's the main record first after prompting the end user for a new date.  That part works flawlessly.  The problem arises when I get to the detail records.  All of the information for the detail records gets cloned; however I can't get the new date inserted into the records. >
Why would a date in the Parent record be needed to be stored in the Child table?
For example:
Orders (Main) and Order Details (Sub)
The Order Date need only exists in the main form/table, there is no need to duplicate this date in the subform because that would create duplicate/redundant data.  Besides, you can pull the OrderDate into the subform via a query.

I mean you can probably get an answer to your question as posted, ...

I am just wondering about the need to store the Date in many places instead of one.

Let's see what other Experts post, in case I misunderstood something...


JeffCoachman
0
 

Author Comment

by:schaIT
ID: 38721496
Thank you so much for your quick reply!  You have mentioned some good points.  Let me provide more background information on why the date is stored in the main record and the child records.  This database is used to book events for meeting spaces.  Meetings can booked as one day events or multiple day events.  

Example:  
The main record indicates ABC Company would like to have a meeting in Conference Room A from 12/26/2012 to 12/28/2012.  The first set of child records needs to store a date to indicate how Conference Room A should be setup on each of the days listed in the main record.  The second set of child records needs a date to store the lunch menu for each of the days listed in the main record.

The dates seems redundant, but without them we would not be able to tell what pieces of information belong to each day of the event.
0
 
LVL 74

Expert Comment

by:Jeffrey Coachman
ID: 38721523
Pesuming that there is a valid reason for duplicating this data...

You could:
1. Store the "Date" as a variable
2. Insert this date variable into the child records after the child records are duplicated.

Pseudo code:
'Code to store the date as a variable
'Code to copy main records
'Code to Copy the Child records
'Code to Insert the date variable into the child records
0
Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

 
LVL 74

Accepted Solution

by:
Jeffrey Coachman earned 175 total points
ID: 38721628
*Roughly* like this, on a button on the main form:
Dim lngOrderID As Long
Dim dtmOrderdate As Date
Dim strSQL As String

lngOrderID = Me.OrderID
dtmOrderdate = Me.OrderDate

strSQL = "Update tblOrderDetails SET OrderDate=" & "#" & dtmOrderdate & "#" & " WHERE OrderID=" & lngOrderID

CurrentDb.Execute strSQL, dbFailOnError
[frmOrderDetails].Form.Requery

Sample attached
Database17.mdb
0
 

Author Closing Comment

by:schaIT
ID: 38721666
That does the trick!  The date delimiters were missing in the original update query.  After reviewing the syntax in your last post, I modified the code in the actual cloning of the details using the correct syntax and removed the update query.  

Originial:
 "SELECT " & lngEventID & " As NewEvent, " & datStart & " As NewDate, " & vbCrLf & _

Open in new window


New:
"SELECT " & lngEventID & " As NewEvent, # " & datStart & " # AS NewDate, " & _

Open in new window


It works perfectly now!  Thanks so much for your help.
0
 
LVL 74

Expert Comment

by:Jeffrey Coachman
ID: 38721688
;-)
0

Featured Post

Migrating Your Company's PCs

To keep pace with competitors, businesses must keep employees productive, and that means providing them with the latest technology. This document provides the tips and tricks you need to help you migrate an outdated PC fleet to new desktops, laptops, and tablets.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When you are entering numbers in a speadsheet, and don't remember what 6×7 is, you just type “=6*7" instead. It works in every cell! This is not so in Access. To enter the elusive 42 in a text box, you have to find a calculator, and then copy the re…
Regardless of which version on MS Access you are using, one of the harder data-entry forms to create is one where most data from previous entries needs to be appended to new records, especially when there are numerous fields and records involved.  W…
What’s inside an Access Desktop Database. Will look at the basic interface, Navigation Pane (Database Container), Tables, Queries, Forms, Report, Macro’s, and VBA code.
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question