Avatar billede deepcore Nybegynder
26. august 2005 - 14:41 Der er 8 kommentarer

antallet af records på en side skal være deleligt med to.

Jeg har en rapport der har noget tekst i header, footer og detail sektionerne.

da headeren er af forskellig størelse fra gang til gang ved jeg ikke hvor mange records der er plads til i detail sektionen.

Det er således lavet at de records der bliver skrevet hænger logisk sammen to og to. Som systemet er nu kan jeg ricikerer at to sammenhængende poster bliver delt.

jeg vil gerne have det således at hvis den sidste record på en side er "ulige" bliver den vippet over på den næste...

kan records gruperes således at de skal være to sammen? måske noget med at gruperer og "keep together"... ved bare ikke hvordan.
Avatar billede terry Ekspert
26. august 2005 - 19:52 #1
Avatar billede claesdamlund Nybegynder
26. august 2005 - 23:23 #2
Kan kun lade sig gøre med kode. Hvis du kender detaljesektionens højde og footerens højde, kan du på headerens Format hændelse regne dig frem til hvor mange detalje linier der er plads til på f.eks. et A4 papir (29,7 cm). Fra det antal du (koden) finder frem til trækker du modulus 2 af samme antal, så du runder ned til nærmeste lige tal - husk at VBA-kode regner i Twips (der går 567 Twips på en cm). På deltalje sektionens Format hændelse tæller du nu en global variabel op, op tester på om variablen er nået op til det beregnede antal. Hvis den er det kalder du metoden ForceNewPage på detalje sektionen (Me.Detail.ForceNewPage 1) og nulstiller den globale variabel.
Lyder måske besværligt, men er simpel kode, som primært er en matematisk øvelse, og mig bekendt den eneste måde du kan løse dit problem på.
Avatar billede kjulius Novice
27. august 2005 - 01:08 #3
Det lyder som om du med fordel kunne kigge på den forespørgsel rapporten trækker på, således at de to sammenhængende rækker blev joinet. På den måde ville du kunne udskrive de to linier på en gang (placere felterne i to linier på detail-sektionen.

Er der nogen måde disse data kan relateres til hinanden (samme kontonummer, f.eks.)? Hvorfor hænger de to linier sammen?
Avatar billede deepcore Nybegynder
27. august 2005 - 17:48 #4
claesdamlund... er du sikker på at forcenewpage ikke skipper footeren og drøner videre til næste side hvis den bliver fyret af fra detail sektionen?
Avatar billede claesdamlund Nybegynder
28. august 2005 - 00:52 #5
Hej deepcore

God pointe, men nej, det virker! Jeg havde dog lige lavet et par fejl. Man skal også lige trække top- og bundmargin fra papirets højde (29,7 - 2*2,5 = 24,7  i nedenstående eksempel). Desuden er det ikke på detalje-sektionens format hændelse, men print hændelsen man skal styre antallet (ups!!!). Endelig skal forcenewpage sættes til 2 (after section) i stedet for 1.
Nedenstående eksempel er gjort lidt omstændeligt, men burde til gengæld være nemt at gennemskue - prøv det...

Option Compare Database
Option Explicit

Dim intHeaderHeight As Integer
Dim intDetailHeight As Integer
Dim intFooterHeight As Integer
Dim intDetailCount As Integer
Dim intDetailNumber As Integer

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
intDetailNumber = intDetailNumber + 1
If intDetailNumber = intDetailCount Then
    intDetailNumber = 0
    Me.Detail.ForceNewPage = 2
End If
End Sub

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
intHeaderHeight = Me.PageHeaderSection.Height
intDetailHeight = Me.Detail.Height
intFooterHeight = Me.PageFooterSection.Height

intDetailCount = (24.7 * 567) - intHeaderHeight - intFooterHeight
intDetailCount = intDetailCount \ intDetailHeight
intDetailCount = intDetailCount - (intDetailCount Mod 2)
End Sub


Håber du kan bruge det.
Avatar billede claesdamlund Nybegynder
28. august 2005 - 01:03 #6
Endnu en utilgivelig fejl. Detail.ForceNewPage skal sættes til 0 for hver ny side, så koden skal se således ud:

Option Compare Database
Option Explicit

Dim intHeaderHeight As Integer
Dim intDetailHeight As Integer
Dim intFooterHeight As Integer
Dim intDetailCount As Integer
Dim intDetailNumber As Integer

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
intDetailNumber = intDetailNumber + 1
If intDetailNumber = intDetailCount Then
    intDetailNumber = 0
    Me.Detail.ForceNewPage = 2
End If
End Sub

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
Me.Detail.ForceNewPage = 0
intHeaderHeight = Me.PageHeaderSection.Height
intDetailHeight = Me.Detail.Height
intFooterHeight = Me.PageFooterSection.Height

intDetailCount = (24.7 * 567) - intHeaderHeight - intFooterHeight
intDetailCount = intDetailCount \ intDetailHeight
intDetailCount = intDetailCount - (intDetailCount Mod 2)
End Sub
Avatar billede deepcore Nybegynder
02. september 2005 - 11:37 #7
fantastisk claesdamlund.. points til dig!
svar lige :)
Avatar billede claesdamlund Nybegynder
02. september 2005 - 15:50 #8
Tak ;0)
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

IT-JOB

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Afdelingschef til GDPR & Tech Regulation

Netcompany A/S

Test Consultant

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations