Avatar billede foldager Novice
01. oktober 2004 - 11:53 Der er 19 kommentarer og
1 løsning

Kopi af relaterede data

Jeg har en TBL1, hvor hver post er relateret til TBL2 med en til mange.

Hver af posterne i TBL2 er ligeledes relateret til TBL3 med en til mange.

Jeg vil gerne kunne kopiere en post i TBL1 og derved få kopieret alle relaterede poster i TBL2 og TBL3.


Hvordan gør jeg det?
Avatar billede overchord Nybegynder
01. oktober 2004 - 12:18 #1
Ja det burde nok kunne lave sig goere via kode idet du jo kender felt-vaerdien i tabel 1 som er relateret til tabel 2 osv.

List svaert at formulere praecist unde mere info, men du kan bruge et SQL udtryk i stil med:
INSERT INTO TBL2 SELECT * FROM TBL2 WHERE TBL2.Relationsfelt = vaerdien fra TBL1
01. oktober 2004 - 23:03 #2
Hej Foldager,

Jeg havde selv samme problem engang og spurgte her: http://www.eksperten.dk/spm/417284

Måske kan du bruge det til noget?
Avatar billede foldager Novice
05. oktober 2004 - 13:23 #3
Hej
Tak for jeres bud. Jeg har forsøgt mig med  http://www.eksperten.dk/spm/417284.
Jeg mangler desværre nogle basale færdigheder.

Jeg har lavet en DB med de beskrevne tabeller, et modul indeholdende koden, en formular med en knap der starter koden.
Det virker ikke....
Jeg har forsøgt at sætte lngOrgID = "1" ....

Den kommer til  Set recOrgNew = db.OpenRecordset("tblOrganisationer")hvorefter den springer til fejl.
Avatar billede foldager Novice
05. oktober 2004 - 14:36 #4
Er det noget med at jeg skal: erklære db og sat den lig currentdb ?
Hvordan gør jeg det?
05. oktober 2004 - 14:48 #5
Du skal have en reference til DAO. Denne sætter du ved at gå i VBA-editoren og vælge menuen Tools->References. Her finder du "Microsoft DAO 3.x Object Library" på listen.

Herefter erklærer du db således:

Dim db as database
Set db = Currentdb

Dette gøres i starten af proceduren.
Avatar billede foldager Novice
05. oktober 2004 - 15:01 #6
Det er hermed gjort, men der er stadig bøvl...
Type mismatch (Error 13)
05. oktober 2004 - 15:14 #7
i Hvilken linie?
Avatar billede bruger_pil Nybegynder
05. oktober 2004 - 15:45 #8
Jeg sidder her og prøver det samme og får en identisk fejl i følgende linie:
Set recOrgNew = db.OpenRecordset("tblOrganisationer")
05. oktober 2004 - 15:48 #9
Hvis I har reference til ADO, skal I specificere, at jeres recordset er et DAO-recordset.
Det gøres ved at skrive:
Dim rs as DAO.Recordset

...alle steder, hvor i erklærer recordsets. Ellers vil den forvente ADO-syntaks, som er anderledes.
Avatar billede foldager Novice
05. oktober 2004 - 16:04 #10
Super!
nu virker det.
05. oktober 2004 - 16:15 #11
Perfekt, tak :o)
Avatar billede bruger_pil Nybegynder
08. oktober 2004 - 13:19 #12
Vil du mod passende point kommentere de afsnit af koden hvor der arbejdes med recordset. Det er ikke helt logisk for mig :-)
fra linie:
If Not recOrgOld.EOF Then
08. oktober 2004 - 13:46 #13
Jeg skal prøve....:o)
I bund og grund er det et spørgsmål om at holde tungen lige i munden.
Princippet er, at den gennemløber 3 recordset i 3 loops/løkker - startende 'oppefra'. Dvs fra øverste niveau i strukturen (Organisation):

Den starter med at finde 1. post i tblOrganisationer (f.eks. OrganisationsID = 1). Herefter finder den alle kontaktpersoner, som er knyttet til OrganisationsID = 1.
Herefter gennemløbes alle disse kontakter (startende med f.eks. KontaktpersonID = 1) og tilhørende aktiviteter findes.
Først når alle aktiviteter er fundet (og kopieret) hopper RecKonOld (kontaktpersoner) videre til næste kontaktpersonID. Osv osv.

...
...     
    '->Hvis ikke recordsettet er tomt (dvs hvis ikke recordsettet står på EndOfFile) starter det hele   
    If Not recOrgOld.EOF Then
        '->Hop til første post - denne linie er kun relevant, hvis man ønsker at gennemløbe flere organisationer. Ellers vil et nyt recordset altid stå på første liinie
        recOrgOld.MoveFirst
        '->I vores parallelle recordset opretter vi en ny post
        recOrgNew.AddNew
        '->Alle felter kopieres undtagen OrganisationsID, som er autonummereret
        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
        '->Den nye organisation gemmes (hvorved OrganisationsID også bliver oprettet)
        recOrgNew.update
        '->Hop til den nyoprettet post igen (ved .Update flyttes cursoren væk fra den aktuelle post)
        recOrgNew.MoveLast
       
        '->Der oprettes et recordset med de kontaktpersoner, som hører til organisationen
        Set recKonOld = db.OpenRecordset("SELECT * FROM tblKontaktpersoner WHERE OrganisationsID = " & lngOrgID)
        '->Hvis ikke recordsettet er tomt (dvs hvis ikke recordsettet står på EndOfFile) fortsættes...
        If Not recKonOld.EOF Then
            recKonOld.MoveFirst
            Do While Not recKonOld.EOF
                recKonNew.AddNew
                    '->Alle felter i tblKontakpersoner kopieres (undtagen KontaktpersonID, som er autonummereret)
                    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
                    '->I den nye kontaktperson, står nu det gamle OrganisationsID. Dette rettes til det OrganisationsID, som befinder sig i recKonNew
                    recKonNew.Fields("OrganisationsID").Value = recOrgNew.Fields("OrganisationsID").Value
                '->Kontaktpersonen gemmes og KontaktpersonID genereres
                recKonNew.update
                '->Hop til den nyoprettet kontaktperson igen
                recKonNew.MoveLast
...
...
'-> og så fremdeles...


gav det mening?

mvh
Thomas
Avatar billede bruger_pil Nybegynder
08. oktober 2004 - 13:46 #14
Tillægsspørgsmål: Kan man ændre lngOrgId til string uden at ødelægge koden:
"Function CopyOrg(lngOrgID As Long) As Boolean"
08. oktober 2004 - 13:48 #15
Du skal lave lidt om på koden, hvis du skal benytte string. F.eks. skal denne linie:
Set recKonOld = db.OpenRecordset("SELECT * FROM tblKontaktpersoner WHERE OrganisationsID = " & lngOrgID)

laves om til:
Set recKonOld = db.OpenRecordset("SELECT * FROM tblKontaktpersoner WHERE OrganisationsID = '" & lngOrgID & "'")
Avatar billede bruger_pil Nybegynder
08. oktober 2004 - 14:26 #16
Det gav straks mere mening, mange tak
Mhv
Jesper
Avatar billede bruger_pil Nybegynder
08. oktober 2004 - 15:12 #17
Jeg har stadig lidt knas med at forstå følgende:
Hvilket formål tjener at sætte "copyorg = true"
Kan man "slæbe" 3 variable med i Function'en eller er det bedre at pege ud på formularen og flyde de to sidste variable herfra?

Din hjælp er meget værdsat.
Jesper
08. oktober 2004 - 15:15 #18
CopyOrg er blot for at returnere, at processen er gennemført (uden fejl), således at den kode som kaldte CopyOrg ved hvordan den skal forholde sig

Du kan sagtens parameteroverfører (næsten) lige så mange variable, som du vil. Det er pænere at bruge parametre end at referere direkte til formularen.
Avatar billede bruger_pil Nybegynder
08. oktober 2004 - 15:22 #19
Takker
08. oktober 2004 - 15:40 #20
Det var så lidt (jeg går ud fra, at du vil oprette et spm med point, som du skrev? :o)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester