Anmeldelse af Microsoft Access XP (2002)

af Joakim Dalby

 

Det er altid en stor fornøjelse at få en ny Access version i hænderne, og i den ak­tuelle Office XP findes Access XP (eller Access 2002) med versionsnummer 10, selv­om hi­sto­rien kun omfatter Access 1.0 (version 1), Access 1.1, Access 2.0 (version 2), Access 95 (version 7 så nummer svarer til Word og Excel versioner), Access 97 (version 8), Access 2000 (version 9), men hvorfor gå glip af en rund fødselsdag med version 10.

 

Access har altid fulgt de små skridts udvikling med hensyn til nye faciliteter til forms og programmeringssproget. Fra version 2000 blev der indført en egentlig front-end til SQL Server, og i Access XP får man en mini SQL Server 2000 database med, samt at Access Basic endelig er blevet ren VBA; så er Access XP på fuld højde med andre professionelle database-applika­tions­værk­tø­jer. Jeg ved godt, at mange VB, C++ og Java programmører kalder Access for et legetøjsprogram, men den eneste begrundelse her for er faktisk kun, at en Access applikation med skærmbilleder, rapporter og masser af programme­ring fortsat ikke kan blive til en exe-fil. Men man har jo lov at håbe på exe-fil, når Access på et tids­punkt lægges ind under .NET strategien hos Microsoft, især nu hvor integrationen med SQL Serveren faktisk er næsten fuldendt.

 

SQL-server fordele – ægte Client-Server database solution

Det er åbentlyst, at når databehandling og genfinding af data sker på en central server der er toptunet til disse gøremål, så opnås der store performanceforbe­drin­ger. Access Data Project (ADP) kom i Access 2000 sammen med ADO og fungerer sammen med SQL Server 2000 der følger med Access XP som miniudgave. SQL Server 2000 viser tabeldesign a la Access med felt-egenskaberne  forneden inkl. feltbeskrivelse som ses i status­linien. Access XP har som følge heraf valgt at med­tage muligheden for Input Mask, Format og Lookup til hjælp ved indtastning og visningen af data samt Validation Text, når en sql-server constraint brydes på enten et unikt felt eller en feltvalide­ring. SQL Server 2000 har også arvet Access 2.0’s kaskadevis opdatering/sletning, så en Access bruger vil næsten ikke opleve nogen forskelle ved at droppe jet-motoren til fordel for sql2000-motoren, og en senere opgradering til en rigtig bagvedliggende server database vil være piece of cake, mens Access XP bibeholdes som front-end og ap­pli­ka­tions­ud­vik­lings­værk­tøj.

 

Det tog Access flere versioner før relationsvinduet kunne udskrives, og desværre er faciliteten i SQL Serveren ikke særlig fleksibel, når et ER-diagram enten skal til­passes en A4-side eller udskrives over flere sider, men mon ikke Microsoft kunne finde på noget smart, gerne kombineret med klynger af entiteter/tabeller m.v.

 

Views og In-Line Function

I Database-vinduet for et Access Data Project er Stored procedures og Views slået sammen til Queries sammen med den nye User Defined Functions, så det er de små ikoner som fortæller, hvad der er hvad, hvis man ikke selv angiver pre­fixes.

 

En herlig nyhed er, at laves et View i Access, så kan der nu tilføjes sorteringsor­den, selvom order by jo er bandlyst i views, fordi Access på sql-serveren selv laver en top forespørgsel, hvor sortering er lovligt!

 

Som følge af User Defined Functions har Access projektet fået tilføjet In-Line Function som kaldes »view med parameter og order by«, og designes i det kend­te forespørgselsvindue, mens tekstbaseret editor også kan fås. Det er i øvrigt pussigt, at det ikke er lykkedes Microsoft at få udviklet det grafiske forespørgsels­vindue til at håndtere en union-forespørgsel.

 

Parameterforespørgsel

Angivelse af en parameter i en forespørgsel i et projekt kan ske på normal Access vis: [Afdeling], idet den automatisk laves om til sql-server: =@Afdeling med rigtig da­tatype. Parameter benyttes til Stored procedures og til den nye In-Line Function. Normalt vil Access bede om en værdi til parameteren når enten stored procedure el­ler in-line function bliver udført, men er forespørgslen knyttet til eksempelvis en listboks i en form, og en drop-down kombiboks i formen har samme navn som parameteren, så tages værdien automatisk der fra, så kombiboksen kan be­stemme listboksens indhold, hvis der lige angives en programlinie under kombi­boksens AfterUpdate event med en requery på listboksen.

 

Det kan næsten ikke gøres smartere at arbejde med indholdsvarierede listbokse, og det er bl.a. her jeg synes Access adskiller fra mange af de andre udviklings­værk­tø­jer, at netop kombi- og især listboksenes indhold direkte kan hentes fra en forespørg­sel oven i købet med en parameter fremfor at foretage additems i en løkke. Nu mangler vi blot at få treeview som indbygget Access komponent, så den også kan referere til en forespørgsel.

 

Pages og XML

I Access 2000 var en af de store nyheder html-dataadgangssider til generering af hjemmesider til opdatering af databasen via formlignende skærmbilleder. Denne fa­ci­li­tet er blevet udvidet kraftigt med mulighed for programmering og en række andre smar­te ting. Desværre er der langt igen for at få pages til at ligne de mere a­van­ce­re­de forms, men Access er da godt på vej, og understøttelsen af XML har også en stor fremtid for sig både som importering af xml data og som eksportering af data til xml. Dog eksporteres et tomt (null) felt ikke som et tomt tag, eksempelvis således:

<farvekode></farvekode>, og en importering kræver at en xml linie indeholder alle tags, for kommer der udfyldte tags længere nede i xml filen, så har Access ikke fanget disse tags og får dem ikke importeret til et felt i en tabel.

 

Report

Det er ikke de store ting der er sket i rapportdesign i Access siden version 1.0, men denne gang nærmer report sig form ved bl.a. at have fået tilføjet egenska­berne Auto Resize der kan sættes til No så man selv kan bestemme preview vin­duets størrelse og via AutoCenter få det automatisk centreret, samt Border Style så vinduets størrelse ikke kan ændres af brugeren plus at vinduet kan gøres modal og sågar pop­up. Endvidere kan man få preview at se i 500% og 1000% hvis ens langsynethed dril­ler foran skærmen.

 

Report og form har også fået egenskaben Moveable der ved No angiver, at brugeren ikke må kunne flytte vinduet på skærmen. Så i næste Access version kan man jo hå­be på muligheden for at lave Drag&Drop knapper, så er det hele snart flytbart.

 

Og hurra, DoCmd.OpenReport har fået OpenArgs tilføjet, så en knap kan sende en ekstra oplysning til rapportens programdel. Det er i øvrigt herligt, at man kan pro­gram­mere alt muligt bag en Access rapport og hente værdier fra forms og arrays m.v. Her synes jeg igen, at Access viser store muligheder i forhold til andre rap­port-værktøjer.

 

Jeg vil lige nævne en ofte overset facilitet fra Access 2000, nemlig at en rapport i preview uanset grafik og layout kan gemmes i en snapshot fil, der kan mailes til en kollega som ikke har Access men som via et gratis Snapshot Viewer program fra Microsoft kan se og udskrive rapporten. Det er uundværligt nu hvor emails har over­ta­get fax.

 

Form

Frem til Access 2000 blev en subform vist som en hvid firkant, og et dobbeltklik her på åbnede den underliggende form. I 2000 blev så subformens indhold direkte vist i designet af mainformen, men til gengæld forsvandt dobbeltklikket. I Access XP kan man igen få subformen frem ved et højreklik/menuvalg, og det tror jeg mange form­de­signere bliver glade for. Form har fået en række nyttige udvidelser så som, at an­tallet af indlejrede subforms er steget fra tre til syv, at man kan for­tryde/undo flere trin bagud, og at der er kommet nye genvejstaster.

 

Access XP form har endvidere fået fuld integration af Pivot, så ikke mere Excel, når man ønsker fleksible analysemuligheder på sine data, og det tror jeg vil sætte endnu mere fokus på Pivot. Access normale krydstabulering lader sig nemlig ikke gøre på en sql-server database, da Access har haft sin helt egen sql-kommando, så Pivot må nok regnes for erstatningen.

 

Tillykke med Access 10.0

Alt i alt synes jeg godt man kan fejre Access version 10.0 med stor lagkage for den indeholder mange store og mindre forbedringer. En meget nyttig forbedring her til sidst er, at ved ændring af et feltnavn i en tabel, vil Access XP selv foretage æn­drin­gen i gemte forespørgsler, forms og rapporter, tak for det!

 

 

Figur 1. View er la Access forespørgsel hvor felter og sort order angives på nor­mal­vis, mens sql-sætningen automatisk bliver opbygget og lagret på serveren.

 

 

Figur 2. En Pivot i Access hvor der ses nærmere på salgsafdelingens kursusudgifter og specifik på kurserne i år 1996.

 

 

Figur 3. Når der er relationer mellem tabellerne, får man gratis drill-down mu­ligheder i Access selvom databasen fysisk findes på en SQL2000-server.

 

Dato tip

Egenskaber til feltet Leveringsdato

Format:     Short Date  eller dd-mm-yyyy

Inputmask: 00-00-0000;0;#   eller i et bestemt år: 00-00-"2009";0;#

Validation rule: Is Null Or [Leveringsdato] Between Date() And

                     DateAdd("d";364;Date())

Validation text: Datoen kan ikke være før i dag, og kan ikke være senere end 364 dage frem.

 

Kan også angive en bestemt startdato Between #01-01-2013#.

 

Valideringsregel der sikrer, at Fødselsdato ikke indtastes meget forkert:

Is Null Or [Fødselsdato] Between DateAdd("yyyy";-120;Date()) And Date()

 

Private Sub Form_BeforeUpdate(Cancel As Integer)

  If Not IsNull(Me![ Fødselsdato]) And

     (Me![ Fødselsdato] < DateAdd("yyyy", -120, Date) Or

      Me![ Fødselsdato] > Date) Then

      MsgBox " Fødselsdato skal være inden for 120 år og i dag.", vbOKOnly, "Fejl"

     Cancel = True

  End If

End Sub

 

' Hvis året i Leveringsdato automatisk skal været aktuelle år.

Private Sub Leveringsdato_Enter()

  If IsNull(Me![Leveringsdato]) Then

     Me![Leveringsdato].InputMask = "00-00-""" +

     Right(Str(Year(Date)), 4) + """;0;#"

  Else

     Me![Leveringsdato].InputMask = "00-00-0000;0;#"

  End If

End Sub

 

' Hvis klik i Leveringsdato automatisk skal placere cursoren yderst til

' venstre klar til dato indtastning, indsættes dette kode ved egenskab VedKlik

Private Sub Leveringsdato_Click()

  If IsNull(Me![Leveringsdato]) Then

     DoCmd.GoToControl "Leveringsdato"

     SendKeys "{F2}", True

     SendKeys "{Home}", True

  End If

End Sub

 

' Eller som en generel funktion der kaldes fra feltet i formen VedKlik:

' =DatoClick([Leveringsdato])

Public Function DatoClick(feltnavn As Control)

  On Error Resume Next

  If IsNull(feltnavn) Then

     feltnavn.SetFocus

     SendKeys "{F2}", True

     SendKeys "{Home}", True

  End If

  On Error GoTo 0

End Function

 

DLookup med en dato som kriterie

Der ønskes i en rapportudskrift vist en bemærkning fra en KUNDE_ORDRE tabel på en givet Ordredato. I en søgekriterie form dialogboks kaldet KundeUdskrift indsættes en tekstboks Søgdato og i rapporten indsættes en tekstboks med følgende Kilde formel der anvender DLookup funktionen til at finde den rette bemærkning, og hvor dato skal være for­ma­teret på en særlig måde:

 

I en Access database dansk eller engelsk version:

=DLookUp("Bemærkning";"KUNDE_ORDRE";

"[OrdreDato]=#" & Format([Forms]![KundeUdskrift]![SøgDato];"mm/dd/yyyy") & "#")

 

I et Access projekt mod en SQL Server database, d.v.s. ' fremfor #:

=DLookUp("Bemærkning";"KUNDE_ORDRE";

"[OrdreDato]='" & Format([Forms]![KundeUdskrift]![SøgDato];"mm/dd/yyyy") & "'")

 

Et andet eksempel hvor ! refererer til felt i form/rapport f.eks. ![Kundenummer]:

="Batch No: " & DLookUp("[Certifikatnummer]";"[KONSTANTER]") & "-" &

DLookUp("[Batchnummer]";"[BATCHNUMMER]";"[Kundenummer]=![Kundenummer]

AND [Sortiment]=![Sortiment]

AND [FraDato]<=#" & Format(Forms![Kriterier]!FraDato;"mm/dd/yyyy") & "#

AND [TilDato]>=#" & Format(Forms![Kriterier]!FraDato;"mm/dd/yyyy") & "#")

 

SQL til en fil

Når der er behov for at skrive en tekst f.eks. en sql sætning til en txt fil

Private Sub DeleteFile(Filename As String)

  If Dir(Filename) <> "" Then

     Kill Filename

  End If

End Sub

Private Sub WriteToFile(tekst As String)

  Dim Filnavn As String

  Dim FileId As Integer

  Filnavn = "c:\tekst.txt"

  DeleteFile Filnavn

  FileId = FreeFile

  Open Filnavn For Append As #FileId

  Print #FileId, tekst

  Close #FileId

  Reset

End Sub

 

Ændre underdel i en multi-form

Når der er behov for ændre sub underdelen i en multi-form til en anden sub form

Me![Sub].SourceObject = "Subform"

 

Flere Access versioner

Som nævnt var Access XP (også kaldet 2002) version 10. Næste versioner fik navnene: Access 2003 = version 11, Access 2007 = version 12, Access 2010 = version 14, da Microsoft er bange for versionsnummer 13, Access 2013 = version 15, Access 2016 = version 16.

 

Access bagud kompatibel

Access 97 og 2000 kan åbne alle tidligere versioner 95, 2.0, 1,1, 1.0 mdb fil.

Access 2002 (XP) og 2003 kan åbne versioner 2000, 97 og 95 mdb fil.

Access 2007 og 2010 kan åbne versioner 2003, 2002, 2000, 97 mdb fil. Der blev tilføjet en filtype accdb som en slags ny version af mdb filen.

Access 2013 kan åbne versioner 2010, 2007, 2003, 2002, 2000 men ikke 97 fordi den er baseret på JET 3.5 motor, og version 2000 og frem er JET 4.0.

Desværre understøtter Access 2013 ikke ADP (Access Data Project fra Access 2000-2010) så man skal igen an­ven­de sam­men­kæde (link or attach table) via ODBC (Open Database Connectivity) som var med i Access 1.0 mod SQL Server 1.1 fra efteråret 1992 (jævnfør User’s Guide side 660) og bruge SQL pass-through query og ADO recordset (ActiveX Data Objects). En adp fil kan ikke en gang konverteres i Access 2013 så forms, rapporter og pro­gram­me­ring i moduler kan gemmes i en accdb fil. Det lader sig kun gøre i Access 2007/2010. I Access 2000/2002/2003 kan man oprette en ny mdb fil og importere fra adp filen, og så konvertere mdb til accdb i Access 2013. Mere herom i et andet indlæg. »Mi­cro­soft ended support for Windows XP and Office 2003/2002 on April 8, 2014« ja og desværre dropper man den geniale ADP forbindelse til SQL Server med alle de fordele den gav for lynhurtig rapid appli­cation development (RAD). Firma Joakim Dalby har udarbejdet en model der giver en række ADP funktioner i en Access 2013 - 2016 accdb fil, læs artiklen her ADP+.

 

Konvertere mdb til accdb i Access 2007/2010/2013/2016

Access 97 mdb fil kan konverteres til accdb fil i Access 2007 og 2010.

Access 2000/2002/2003 mdb fil konverteres eksempelvis i Access 2013 ved at åb­ne for mdb filen og i Filer menuen vælge {Gem som} og klik på "accdb filtypen", klik på "Gem som" og angiv mappe og filnavn.

 

Access 2013 programmering referencer

Visual Basic For Applications

Microsoft Access 15.0 Object Library

Microsoft Excel 15.0 Object Library

Microsoft Office 15.0 Access database engine Object Library (der erstatter DAO 3.6 Data Access Object i tidligere Access versioner bl.a. til datatyper Database og Recordset så programmeringen skal ikke ændres).

Evt. Microsoft Visual Basic for Applications Extensibility 5.3 og OLE Automation.

I Access 2016 er versionsnummeret 16.0.

 

Access fra version 2007 tip

Ønsker man den nye sortering filter pil (sort filter arrow as column heading) i dataark fjernet f.eks. i en sub form, så sættes formens egenskab Genvejsmenu til Nej (ShortcutMenu til No). Evt. også Tillad Filter/Allow Filters til No.

Skift hurtig mellem design og formvisning via knappen i båndet, sæt formegenskaben Tillad Layoutvisning til Nej. Sæt også Allow Design Changes til Design View Only.

I design af en rapport slås RapportHoved/Fod og SideHoved/Fod til via højreklik i designet og vælge i menuen.

I en underdel (sub rapport) er det muligt at anvende SideHoved hvilket er praktisk ved kolonneoverskrifter når underdelen har mange rækker der strækker sig over flere sider. Husk i hoveddelen (super rapport) at tilrette underdelens egenskab Vis Sidehoved og Sidefod til Ja.

 

Problem med SQL tabel

Når en SQL server tabel åbnes via Access, kan man for talfelter fås denne fejlmelding: The setting for the decimalplaces property must be from 0 through 15. or 255 for Auto (Default).

I SQL Server Enterprise Manager åbnes SQL Query Analyser, og under menuen Tools vælges Object Browser og Show. Herefter findes tabellen i vinduet til venstre side, og under tabellen åbnes Columns, hvor der højresklikkes på feltet og vælges Extended properties. I vinduet sættes egenskaben MS_DecimalPlaces til 255.

 

Windows 7 skrifttype problem

Ved de nye bredskærme f.eks. 1680 x 1050 eller 1920 x 1080 har Windows 7 valgt at forstørre nogle af de gamle skrifttyper til 125% mod standard 100%. Det gælder bl.a. skrifttypen MS Sans Serif og anvendes den på felter og knapper i Access form, så vil teksten ikke mere kunne være inden for feltet eller knappens størrelse når teksten bliver forstørret til 125%. Derfor skal der anvendes 100%, hvilket gøres på følgende måde. I Start vælges Kør (Run) og angives regedit d.v.s. der åbnes for Win­dows Regi­stre­rings­database. Her søges der efter:

"MS Sans Serif 8,10,12,14,18,24" og der højreklikkes og vælges Rediger hvorefter SSERIFF.FON ændres til SSERIFE.FON (d.v.s. F ændres til E). Tilsvarende for "MS Serif 8,10,12,14,18,24" ændres til SERIFE.FON og "Courier 10,12,15" ændres til COURE.FON. Luk vinduet og genstart computeren og tekster og knapper i Access ser igen pænt ud og vises inden for knappens størrelse.

Der kan også være et problem hvis standard Smaller (100%) er ændret for DPI (dots per inch (DPI)), læs mere her:

http://windows.microsoft.com/en-US/windows7/Make-the-text-on-your-screen-larger-or-smaller

Husk at anvende Clear Type:

http://windows.microsoft.com/en-US/windows7/Make-text-easier-to-read-using-ClearType

BeforeUpdate felt validering, når feltet er et Required felt i tabellen

Når der indføres BeforeUpdate Cancel = True på et felt i en form, og feltet samtidig er et obligatorisk/tvunget udfyldt felt i tabellen, så giver Access en ekstra fejl­be­sked, når man indsætter en ny række i formen og angiver forkert værdi i feltet, så Cancel sættes til True og feltet ikke kan forlades.

"The value in the field or record violates the validation rule for the record or field."

For at undgå den ekstra fejl­be­sked fra Acccess skal der kontrolleres for at den fo­re­kom­mer i formens error metode, og der skal angives at man blot skal fortsætte:

 

Private Sub Form_Error(DataErr As Integer, Response As Integer)

  If DataErr = 2116 Then

     Response = acDataErrContinue

  ' Else

  '    MsgBox DataErr & " " & Response

  End If

End Sub

 

Private Sub Antal_BeforeUpdate(Cancel As Integer)

  If Me![Antal] >= 10 Then

     If MsgBox("Kan indtastet antal godkendes?",

        vbQuestion + vbYesNo + vbDefaultButton2,

        "Godkendelse af antal") = vbNo Then

        Cancel = True

     Else

        Cancel = False

     End If

  Else

     Cancel = False

  End If

End Sub

 

Postvælger i dataark (record selector in data view) , den sorte pil

Dataark enten til en tabel eller indbygget som en subform i et multi-form skærm­bil­le­de har før Access 2007 vist en sort pil ud for den post eller række som cursoren står ved, hvil­ket er prak­tisk ved to eller flere dataark som subforms så brugeren kan se via den sorte pil. hvilken række man er ved at knytte data til i det andet dataark, eksem­pel­vis i en tidligere Access version:

 

 

Men fra Access 2007 er den sorte pil erstattet af en gul markering, og desværre for­svin­der den gule markering, når dataarket ikke har fokus. Når et dataark kun har en kolonne, som midten i skærmbilledet, så er der ingen markering til brugeren om hvil­ken række cursoren stod i, når der skal indtastes i højre dataark. Det kan løses ved at indsætte en post-farve via lidt programmering:

 

 

Gid den sorte pil kunne til/fra vælges i en indstilling, når man har haft den siden Access 1.0 i 1993, og den har en praktisk betydning for brugeren, så han ved, hvilken række / post cursoren står i og som andre objekter refererer til :)

 

Farveværdi fra design til programmering

Når design af en baggrundsfarve viser #00366C man den oversæt­tes til en værdi med: MsgBox RGB(&H00, &H36, &H6C) der kan bruges i pro­gram­me­rin­gen til et felt i form eller rapport: Me![Navn].BackColor = 7091712

 

Subform og subreport uden rækker

I en multiform mainform ønskes en textbox der viser antal rækker fra en subform textbox =Count(*) med navn AntalRækker, men når subform ingen rækker har, så viser textboxen i mainformen #Error eller #Fejl. Det kan undgås med en IIf og IsError true/false funktion i textboxen i mainformen:

 

=IIf(IsError([<subform>].Form![AntalRækker]);0;[<subform>].Form![AntalRækker])

 

I dansk version af Access skal der skrives Formular selvom det bagefter vises som Form:

 

=IIf(IsError([<subform>].Formular![AntalRækker]);0;[<subform>].Formular![AntalRækker])

 

I subform er indsat en textbox i Form bund med formlen: =Count(*) eller =Antal(*)

 

En alternativ metode er at undersøge antallet af rækker med

Recordset.RecordCount:

 

=IIf([<subform>].Form.Recordset.RecordCount>0;[<subform>].Form![AntalRækker];0)

 

En anden metode er at undlade textbox AntalRækker i subformen og i stedet i pro­gram­merin­gen tildele en værdi til textboxen AntalRækker i mainformen, hvilket også giver en hurtigere opdatering og derved performance.

 

Me![AntalRækker] = Me![<subform>].Form.Recordset.RecordCount

 

Ovenstående skal indsættes i Form_Load, Insert og Delete og andre steder som måt­te opdatere antallet af viste rækker.

 

I en multirapport undersøges om en subreport har rækker med brug af kom­man­do: HasData = 0 der betyder har ingen data, -1 betyder har data, eksempelvis om en tom subreport skal skjules:

 

Private Sub Report_Activate()

  If Me![<subreport>].Report.HasData = 0 Then

     Me![<subreport>].Visible = False

  End If

End Sub

 

Subform opdatering

Brug af Me.Refresh eller Me.Requery til opdatering af subformen betyder, at der springes til første række i subformen, hvilket er upraktisk når brugerne indtaster i sidste * række. I den situation kan man i stedet få mainformen til at udføre re­que­ry og så undgås det i subformen at springe til første række.

I mainformen indsættes følgende:

 

Public Sub Form_Subform_Requery()

  Me![<subform>].Requery

End Sub

 

I subformen hvor opdateringen ønskes indsættes følgende, hvor der kaldes sub fra mainformen ved brug af Parent:

 

DoCmd.RunCommand acCmdSaveRecord

Parent.Form_Subform_Requery

 

PNG som icon billede på knap med gennemsigtig baggrund

Filtyperne BMP og JPG har ikke mulighed for gennemsigtig baggrundsfarve som ICO har det, men PNG har det også og kan sagtens bruges på en knap i en Access form sammen med tekst og billedet ændrer ikke størrelse som ICO fil gør det.

Gennemsigtig baggrundsfarve er praktisk når der er valgt Windows tema og mu­sen sættes på knappen og baggrundsfarven ændrer sig.