I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Ja, så skal du bare undlade at bruge (og medtage) paramenteren. Og så lave en .Movenext på organisationsreordsettet (og lidt andre småting). Dette skulle gøre det, vil jeg tro:
Function CopyOrg() As Boolean On Error GoTo err_CopyOrg Dim recOrgOld As Recordset Dim recOrgNew As Recordset Dim recKonOld As Recordset Dim recKonNew As Recordset Dim recAktOld As Recordset Dim recAktNew As Recordset Dim fld As Field
Set recOrgNew = db.OpenRecordset("tblOrganisationer") Set recKonNew = db.OpenRecordset("tblKontaktpersoner") Set recAktNew = db.OpenRecordset("tblAktiviteter")
Set recOrgOld = db.OpenRecordset("SELECT * FROM tblOrganisationer) Do until recOrgOld.EOF Then recOrgOld.MoveFirst recOrgNew.AddNew 'Alle felter kopieres For Each fld In recOrgOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "OrganisationsID" Then recOrgNew.Fields(fld.Name).Value = fld.Value End If Next fld recOrgNew.update recOrgNew.MoveLast Set recKonOld = db.OpenRecordset("SELECT * FROM tblKontaktpersoner WHERE OrganisationsID = " & lngOrgID) If Not recKonOld.EOF Then recKonOld.MoveFirst Do While Not recKonOld.EOF recKonNew.AddNew For Each fld In recKonOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "KontaktpersonID" Then recKonNew.Fields(fld.Name).Value = fld.Value End If Next fld recKonNew.Fields("OrganisationsID").Value = recOrgNew.Fields("OrganisationsID").Value recKonNew.update recKonNew.MoveLast Set recAktOld = db.OpenRecordset("SELECT * FROM tblAktiviteter WHERE KontaktpersonID = " & recKonOld!kontaktpersonid) If Not recAktOld.EOF Then recAktOld.MoveFirst Do While Not recAktOld.EOF recAktNew.AddNew For Each fld In recAktOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "AktivitetsID" Then recAktNew.Fields(fld.Name).Value = fld.Value End If Next fld recAktNew!kontaktpersonid = recKonNew!kontaktpersonid recAktNew.update recAktOld.MoveNext Loop End If recKonOld.MoveNext Loop End If recOrgOld.movenext loop CopyOrg = True Exit Function err_CopyOrg: 'Fejl End Function
grunden til, at OrgID ikke skal med, som parameter, skyldes jo at det ikke længere kun er én organisation, du il kigge på, men alle. Derfor gennemløbes alle OrgID'er via recOrgOld
Hvordan fortæller jeg den at det stadig kun er et OrganisationsID jeg skal have fat i, der findes bare flere med organisationern med det samme id, lidt kryptisk medgiver jeg. Min situation er selvfølgelig tilpasset din kode. Men i hovedtræk setup'et ens.
Jeg har et niveau tbl0, og jeg vil gerne kunne kopiere alle de poster i TBL1 der relaterer sig til TBL0, og derved få kopieret alle relaterede poster i TBL2 og TBL3.
Hvis sagen (organisationen) ikke skal kopieres med, skal du nok bruge den sidste løsning, som jeg nævnte. Altså hvor du beholder den gamle funktion, men blot kalder den et passende antal gange.
Jeg prøvet at tilpasse din kode, der er et lille problem omkring OrganisationsID der ikke længere er autonummeret. Men er det ellers rigtigt?
Function CopyOrgMulti(lngorgid As Long) As Boolean On Error GoTo err_CopyOrg Dim recOrgOld As DAO.Recordset Dim recOrgNew As DAO.Recordset Dim recKonOld As DAO.Recordset Dim recKonNew As DAO.Recordset Dim recAktOld As DAO.Recordset Dim recAktNew As DAO.Recordset Dim fld As DAO.Field
Dim db As Database Set db = CurrentDb
Set recOrgNew = db.OpenRecordset("tblOrganisationer") Set recKonNew = db.OpenRecordset("tblKontaktpersoner") Set recAktNew = db.OpenRecordset("tblAktiviteter")
Set recOrgOld = db.OpenRecordset("SELECT * FROM tblOrganisationer where OrganisationsID = " & lngorgid) Do Until recOrgOld.EOF recOrgOld.MoveFirst recOrgNew.AddNew 'Alle felter kopieres For Each fld In recOrgOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "OrganisationsID" Then recOrgNew.Fields(fld.Name).Value = fld.Value End If Next fld recOrgNew.Update recOrgNew.MoveLast Set recKonOld = db.OpenRecordset("SELECT * FROM tblKontaktpersoner WHERE OrganisationsID = " & recOrgOld!OrganisationsID) If Not recKonOld.EOF Then recKonOld.MoveFirst Do While Not recKonOld.EOF recKonNew.AddNew For Each fld In recKonOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "KontaktpersonID" Then recKonNew.Fields(fld.Name).Value = fld.Value End If Next fld recKonNew.Fields("OrganisationsID").Value = recOrgNew.Fields("OrganisationsID").Value recKonNew.Update recKonNew.MoveLast Set recAktOld = db.OpenRecordset("SELECT * FROM tblAktiviteter WHERE KontaktpersonID = " & recKonOld!kontaktpersonid) If Not recAktOld.EOF Then recAktOld.MoveFirst Do While Not recAktOld.EOF recAktNew.AddNew For Each fld In recAktOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "AktivitetsID" Then recAktNew.Fields(fld.Name).Value = fld.Value End If Next fld recAktNew!kontaktpersonid = recKonNew!kontaktpersonid recAktNew.Update recAktOld.MoveNext Loop End If recKonOld.MoveNext Loop End If recOrgOld.MoveNext Loop CopyOrgMulti = True Exit Function err_CopyOrg: 'Fejl End Function
Jeg har lige prøvet at oprette en database med de relevante tabeller og har afprøvet nedenstående kode. Den virker!
Jeg har lavet lidt smårettelser og fjernet noget overflødig kode.
Function CopyOrgMulti(lngorgid As Long) As Boolean On Error GoTo err_CopyOrg Dim recOrgOld As DAO.Recordset Dim recOrgNew As DAO.Recordset Dim recKonOld As DAO.Recordset Dim recKonNew As DAO.Recordset Dim recAktOld As DAO.Recordset Dim recAktNew As DAO.Recordset Dim fld As DAO.Field
Dim db As Database Set db = CurrentDb
Set recOrgNew = db.OpenRecordset("tblOrganisationer") Set recKonNew = db.OpenRecordset("tblKontaktpersoner") Set recAktNew = db.OpenRecordset("tblAktiviteter")
Set recOrgOld = db.OpenRecordset("SELECT * FROM tblOrganisationer where OrganisationsID = " & lngorgid) recOrgNew.AddNew 'Alle felter kopieres For Each fld In recOrgOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "OrganisationsID" Then recOrgNew.Fields(fld.Name).Value = fld.Value End If Next fld recOrgNew.Update recOrgNew.MoveLast Set recKonOld = db.OpenRecordset("SELECT * FROM tblKontaktpersoner WHERE OrganisationsID = " & recOrgOld!OrganisationsID) If Not recKonOld.EOF Then recKonOld.MoveFirst Do While Not recKonOld.EOF recKonNew.AddNew For Each fld In recKonOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "KontaktpersonID" Then recKonNew.Fields(fld.Name).Value = fld.Value End If Next fld recKonNew.Fields("OrganisationsID").Value = recOrgNew.Fields("OrganisationsID").Value recKonNew.Update recKonNew.MoveLast Set recAktOld = db.OpenRecordset("SELECT * FROM tblAktiviteter WHERE KontaktpersonID = " & recKonOld!kontaktpersonid) If Not recAktOld.EOF Then recAktOld.MoveFirst Do While Not recAktOld.EOF recAktNew.AddNew For Each fld In recAktOld.Fields If Not IsNull(fld.Value) And Not IsEmpty(fld.Value) And fld.Name <> "AktivitetsIDID" Then recAktNew.Fields(fld.Name).Value = fld.Value End If Next fld recAktNew!kontaktpersonid = recKonNew!kontaktpersonid recAktNew.Update recAktOld.MoveNext Loop End If recKonOld.MoveNext Loop End If CopyOrgMulti = True Exit Function err_CopyOrg: MsgBox Err.Description Resume Next End Function
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.