Gå til innhold

Anbefalte innlegg

Skrevet

Sitter her å sløver, og tenkte jeg skulle lære litt VBA. Har laget en liten sak i Access som har to tabeller, "GROUP" og "MEMBER". Dette skal printes slik at rptSide_1 skal være en forekomst av "GROUP" og rptSide_2 skal liste opp MEMBER-forekomster der GROUP_NUMBER tilsvarer den gruppen. Pr nå har jeg fått til å printe den gruppen og members jeg har opp i et skjemaet mitt akkurat nå, men jeg trenger en funksjon for å loope gjennom hele "GROUP"-tabellen å gjøre samme operasjon for alle forekomster.

Side_1 er en rapport på GROUP og Side_2 er en rapport på MEMBER

Slik ser Privat sub som printer en forekomst ut:

    Dim stDocName1 As String
   Dim stDocName2 As String

   stDocName1 = "rptSide_1"
   stDocName2 = "rptSide_2"
   DoCmd.OpenReport stDocName1, acNormal, , "GROUP_NUMBER = " & GROUP_NUMBER
   DoCmd.OpenReport stDocName2, acNormal, , "GROUP_NUMBER = " & GROUP_NUMBER

Jeg har litt erfaring fra php, så jeg antar vi snakker om en for-each på GROUP_NUMBER. Problemet blir vel filteret "GROUP_NUMBER = " & GROUP_NUMBER. Den er jo nå statisk knyttet til skjemaet, men det må jo liksom også settes til neste GROUP_NUMBER for hver loop...

Tips ?

Videoannonse
Annonse
Skrevet (endret)

Det er unødvendig å implementere dette i VBA da Access lett kan gjøre dette for deg dersom du definerer de ulike relasjonene mellom tabellene i databasen. Dette kan du gjøre ved å velge Tools -> Relationships... -> Tables og dernest dobbelklikke på alle tabellene. Trykk så på attributtet i Member-entiteten (Group_Number) og dra den over til primærnøkkelen i den andre entiteten. Dersom alt er i orden, vil du få en èn-til-mange-relasjon mellom henholdsvis Group og Member. Når dette er gjort, kan du ganske enkelt lage en rapport slik du ønsker ved å legge inn attributter fra begge entiteter i rapportveiviseren, og velge By group i neste vindu.

Endret av aadnk
Skrevet

Njeh, det er feigt. Dessuten utelot jag at rptSide_1 og rpt_Side_2 må være 2 separate rapporter, siden disse skal printes fra hver sin skuff, og rptSide_2 vil være et ukjent antall sider (kan være 10 member, kan være 300)

 

Jeg tror jeg er på sporet her, eller ?

Dim DB As DAO.Database, rs As DAO.Recordset, gruppe As String
Set DB = CurrentDb
Set rs = DB.OpenRecordset("GROUP", dbOpenDynaset)

If Not (rs.BOF Or rs.EOF) Then
rs.MoveFirst
   While Not rs.EOF
       gruppe = rs![GROUP_NUMBER]
       
       ' print rptSide_1, print rptSide_2
       
       rs.MoveNext
   Wend

End If
rs.Close
DB.Close

Skrevet

Jeg vil tro det. Jeg har ikke fått anledning til å teste det, men jeg vil tro følgende kode skulle fungere:

Public Sub PrintReports()

 

    Dim dbCurrent As Database, tbGroup As Recordset, sFilter As String

   

    ' Last inn database og tabell

    Set dbCurrent = CurrentDb

    Set tbGroup = dbCurrent.OpenRecordset("GROUP", dbOpenDynaset)

   

    ' Unngår konflikt med MoveFirst om tabellen er tom

    If Not (tbGroup.BOF Or tbGroup.EOF) Then

   

        tbGroup.MoveFirst

       

        ' Går gjennom alle poster

        Do While tbGroup.EOF

       

            ' Generer filter

            sFilter = "GROUP_NUMBER = " & tbGroup!GROUP_NUMBER

           

            ' Skriv ut to rapporter

            PrintReport "rptSide_1", sFilter

            PrintReport "rptSide_2", sFilter

           

            ' Gå til neste post

            tbGroup.MoveNext

           

        Loop

       

    End If

   

    ' Rydd opp

    tbGroup.Close

    dbCurrent.Close

 

End Sub

 

Public Sub PrintReport(ReportName As String, Optional Constraint As String)

 

    ' Skriv den angitte rapport

    DoCmd.OpenReport ReportName, acViewPreview, , Constraint, acHidden

    DoCmd.SelectObject acReport, ReportName, True

    DoCmd.PrintOut

 

End Sub

Skrevet (endret)

Ahh takker. Det var det jeg prøvde på ja. Det filteret for oppdeling av GROUP var konseptuelt vanskelig for meg å forstå, men nå sitter det tror jeg.

 

Vanskeligere å lære vba enn php synes jeg, siden 90% av Google-søkene returnerer komersielle sider som skal selge meg en bok :(

 

OK. Betyr virkelig "Do while tbGroup.EOF" det samme som "Do while tbGoup NOT EOF" i andre språk ?

Endret av RulleRimfrost

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...