Avatar billede hugopedersen Nybegynder
13. september 2001 - 14:58 Der er 13 kommentarer og
1 løsning

Sidenummerering

Jeg har en rapport der henter data fra 2 tabeller. 1. tabel indeholder stamdata og 2. tabel indeholder oplysninger om udførte kalibreringer på et værktøj.
Når jeg så skriver rapporten ud, vil jeg gerne have den til at skrive side x af y hvor y er sidetallet for hver enkelt værktøj.
Forstået på den måde at hvis kalibreringsdata for et værktøj fylder mere end 1 side, så skal den skrive side 1 af 2 f.eks.
Standardmetoden tæller jo ALLE sider og det dur ikke i dette tilfælde.
Avatar billede proaccess Nybegynder
13. september 2001 - 15:24 #1
Du kan nok tage udgangspunkt i nedenstående, som jeg rodede med for et godt stykke tid siden...

I just ran across this yesterday and haven\'t had a chance to try it out.

Copied from http://home.att.net/~dashish/
--Posted by James H Brooks---

Printing First and Last Page Numbers for Report Groups

Often times it is necessary to print page numbers for groups of records, and not just the overall pages for a report. Access has no
built in way to do this, and some workarounds can be very cumbersome. Here\'s a simple code sample that does the job well, using
arrays to handle the group page numbers; an often overlooked method of handling multidimensional data. Open any report in
design view and open its Code-Behind-Reports module. Enter the code as listed.

Note: the line Me!Salesperson should be changed to the control name of the group you wish to track pages for. Me!ctlGrpPages is
the name of a control you should place in the page footer. You can also change this line to whatever form you wish your page
numbers to take.

The code works by filling two arrays with page numbers. GrpArrayPage() holds the group page number, and GrpArrayPages()
hold the total number of pages for the group.

When Access formats a report, it often times must make two passes through the report for information such as Page 1 of 10; since
Access cannot know how many pages the report will contain until the entire report is formatted. You can use the fact that access
makes two passes to create your group page numbers. Because the code listed uses the Pages Property (Total number of pages),
you automatically force access to format the report twice.

ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)

Since arrays take up memory, and we have no way of knowing how many pages will be in the report, we can dynamically resize
the arrays with each pass. Using the Preserve keyword allows you to resize the array without losing any data.

If Me.Pages = 0 Then
...
Else
Me!ctlGrpPages = \"Group Page \" & GrpArrayPage(Me.Page) & \" of \" & GrpArrayPages(Me.Page)
End If

How the code works:

Until access has finished formatting the report for the first pass, the value of the Pages property will be 0; so you can check this
value to determine if this is the first or second pass. The first pass is explained below, and the second pass just sets the control in the
page footer to the value in the arrays.

On the first pass through the formatting of the report, the code uses the group name and page property to build the group page
numbers. Using the current page number as the index number for the array, makes the code a bit simpler.

GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1

This code sets the value of GrpArrayPage(me.page) to the value of the previos page, GrpArrayPage(Me.Page - 1), then adds one to
that to get the next page number.

GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next I

GrpPages, a variable used to temporarily store the page number is then set to the value of the current page. Then the loop sets the
value of GrpArrayPages to the value of GrpPages for all of the Array items.

To look at this a bit simpler; assume we are at page three of the group, the values would be:

GrpArrayPage( ) GrpArrayPages( )
1 3
2 3
3 3

When you move to page four you get:

GrpArrayPage( ) GrpArrayPages( )
1 4
2 4
3 4

...and so on.

If the code detects that the group name has changed \" GrpNameCurrent <> GrpNamePrevious\" then it resets the group page
values to 1.

Arrays are often overlooked when developing code and people often create temporary or permanent tables to handle temporary
data. Not only does this make your code more diffiuclt to manage and debug, it makes it less portable. Arrays can often substitute as
a very efficient replacement for these temporary tables.

Complete Code Listing:

\'************ Code Start *************
Option Compare Database
Option Explicit

Dim GrpArrayPage(), GrpArrayPages()
Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant
Dim GrpPage As Integer, GrpPages As Integer

Private Sub PageFooter_Format(Cancel As Integer, FormatCount As Integer)
Dim i As Integer
If Me.Pages = 0 Then
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
GrpNameCurrent = Me!Salesperson
If GrpNameCurrent = GrpNamePrevious Then
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next i
Else
GrpPage = 1
GrpArrayPage(Me.Page) = GrpPage
GrpArrayPages(Me.Page) = GrpPage
End If
Else
Me!ctlGrpPages = \"Group Page \" & GrpArrayPage(Me.Page) & \" of \" & GrpArrayPages(Me.Page)
End If
GrpNamePrevious = GrpNameCurrent
End Sub
\'************ Code End *************

Avatar billede fdata Forsker
13. september 2001 - 17:42 #2
Der er vist en lidt enklere version:

1. Gruppér rapporten pr. værktøj, opret et gruppehoved.
2. Placér en tekstbox i sidefoden (vi kalder den Snr)

Medtag følgende kode:
----------------------------
Dim P As Integer

Private Sub Gruppehoved0_Format(Cancel As Integer, FormatCount As Integer)
  P = 1
End Sub

Private Sub Sidefod_Format(Cancel As Integer, FormatCount As Integer)
  Me.Snr = P
  P = P + 1
End Sub
----------------------------

Avatar billede fdata Forsker
13. september 2001 - 17:45 #3
... uuuups. Jeg overså lige Side x AF N. Ovenstående giver dig kun sidenummeret.

Sorry (gælder også proaccess)  :o)
Avatar billede hugopedersen Nybegynder
14. september 2001 - 10:19 #4
Borset fra at det ikke virker, så ser det da meget tilforladeligt ud.
Den skriver konsekvent side 1 af 1, side 2 af 2, side 3 af 3 på min testrapport på 3 sider ;-(

Avatar billede hnteknik Novice
19. september 2001 - 14:30 #5
Hej hugopedersen

Jeg pinger dig lige nu, da jeg har tilladt at gramse lidt i dine kodeeks.(hermed sagt) - ( Jeg skal lige have lavet et backup/kopieringsprog til ACC97, men API kaldet til kernel32 giver mig en DR Watson hver gang - nogen forslag ??)

Nå men jeg har tilsvarende kode kørende i Mainprogrammet ( hvortil jeg skal bruge backup af data), som jeg skal have ud af døren.

i rapporten skrives:

\' til gruppe side inddeling
Dim GrpArrayPage(), GrpArrayPages()
Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant
Dim GrpPage As Integer, GrpPages As Integer

Private Sub Sidefod2_Format(Cancel As Integer, FormatCount As Integer)
Dim i As Integer
  If Me.Pages = 0 Then
    ReDim Preserve GrpArrayPage(Me.Page + 1)
    ReDim Preserve GrpArrayPages(Me.Page + 1)
    On Error Resume Next
    GrpNameCurrent = Me!GrpBygn \' antal sider per bygning
   
    If GrpNameCurrent = GrpNamePrevious Then
        GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
        GrpPages = GrpArrayPage(Me.Page)
            For i = Me.Page - ((GrpPages) - 1) To Me.Page
                GrpArrayPages(i) = GrpPages
            Next i
    Else
        GrpPage = 1
        GrpArrayPage(Me.Page) = GrpPage
        GrpArrayPages(Me.Page) = GrpPage
    End If
  Else
    Me!ctlGrpPages = \"Gruppe Side \" & GrpArrayPage(Me.Page) & \" af \" & GrpArrayPages(Me.Page)
  End If
  GrpNamePrevious = GrpNameCurrent
End Sub

BEMÆRK - på formatteringstidspunktet kender rapporten ikke dine variable, så Me!GrpBygn er navnet på den kontrolbox, som indeholder din gruppevariabel - for mig \"Bygn: \" & me.bygn.

Virker det ikke for dig, som send mig en mail

Henrik
Avatar billede hugopedersen Nybegynder
19. september 2001 - 14:40 #6
Du må lige forklare mig lidt nærmere hvad det er for et eksempel du har kigget på ( det er derfor de er på sitet :-)  )

Avatar billede hnteknik Novice
19. september 2001 - 15:43 #7
Jeg har kigget på din Backup udgave af
Dev Ashish\' \'API: Copy a database\' på http://www.mvps.org/access/api/api0026.htm og har svare problemer med functionen:

Private Declare Function apiSHFileOperation Lib \"Shell32.dll\" _
            Alias \"SHFileOperationA\" _
            (lpFileOp As SHFILEOPSTRUCT) _
            As Long

som crasher Access 97 hver gang den kaldes. Det har ikke umiddelbart noget med din kode at gøre medmindre der er noget galt med lpFileOp som er af type:

Private Type SHFILEOPSTRUCT
    hwnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Boolean
    hNameMappings As Long
    lpszProgressTitle As String
End Type

Den crasher og går i Dr. Watson på tre forskellige Accessinstallationer.

Jeg kommer vel ikke udenom denne funktion, når man skal kopiere ? Har du en working example
Henrik
Avatar billede hnteknik Novice
19. september 2001 - 16:45 #8
Jeg har noget SHFileOperationA kode, der funker nu både med delete, copy og rename. Du må have nedarvet en fatal bug fra eksemplet på http://www.mvps.org/access/api/api0026.htm

Mit eks. bruger en bytearray til oploading via

Public Declare Sub CopyMemory Lib _
    \"KERNEL32\" Alias \"RtlMoveMemory\" (hpvDest As Any, hpvSource _
    As Any, ByVal cbCopy As Long)

Jeg ser videre på det i morgen

Henrik
Avatar billede hugopedersen Nybegynder
20. september 2001 - 07:14 #9
Så vidt jeg kan se er din kode identisk med den jeg allerede har prøvet og ikke har kunnet få til at fungere.

Angående min backuprutine, så kan jeg kun sige at jeg har brugt den på Access 2000 uden umiddelbare problemer. Om der er forskelle på Access 97 og 2000 på det område skal jeg ikke kunne sige, men når man kender M$ så er det vel ikke usandsynligt.
Avatar billede hnteknik Novice
20. september 2001 - 12:27 #10
Jeg finder ud af et eller andet mht backupdelen.

Det undrer mig, at du afviser gruppepagingen - den virker udmærket her. Man skal blot huske, at bruge gruppekontrollen og ikke variablen, man grupperer over.  Eller hvad ?

Henrik
Avatar billede hugopedersen Nybegynder
20. september 2001 - 12:44 #11
Hej

Det beklager jeg også at jeg har gjort - det var et andet spørgsmål jeg regnede med at jeg afviste.
Kan du ikke lige lave et nyt svar, så skal du få dine point.

Hugo
Avatar billede hnteknik Novice
20. september 2001 - 13:15 #12
Ok tak
Henrik
Avatar billede hnteknik Novice
20. september 2001 - 14:21 #13
Jeg lovede at vende tilbage til BACKUP routinen og brug af API SHFileOperationA i shell32.dll

En kopi af din backup routine virker nu hos mig med følgende ændringer:

  With  shFileOp                                          \'Setup filestructure
    .wFunc = FO_COPY
    .hWnd = 0 \' hWndAccessApp
    .pFrom = fhpLinkedMDBname & vbNullChar & vbNullChar  \'Work on linked db
    .pTo = strSaveFile & vbNullChar & vbNullChar          \'File to save to
    .lpszProgressTitle = \"Vent venligst, foretager backup ...\"
    .fFlags = lngFlags                                    \'Flags used by copyfunction
  End With


Den væsentlige ændring har været at sætte handlen til 0 ( Desktoppen som owner). Dette forhindrede ACCESS i at crashe. Det var nok fordi jeg startede rutinen med F5 og ikke fra en form.

Desuden er der tilføjet et ekstra null i til og fra.

Sluttelig bør man kalde API funktionen via en wrapper, der byte aligner typen fora t være sikker på, at den arbejder ordentlig.

Ikke mere om den sag - slut herfra og tak Hugo for dit input. Nu har jeg min backupper. Mail mig, hvis nogen skulle ønske koden.

Henrik
Avatar billede hugopedersen Nybegynder
20. september 2001 - 14:33 #14
Hej

Om muligt vil jeg da gerne lige snuse til den kode.

Du kan mail mig på  hugo@jamo.com

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