sql >> Databasteknik >  >> RDS >> Access

Visual Basic för applikationer i Microsoft Access

Introduktion

Microsoft Access innehåller ett antal funktioner som gör det möjligt för databasutvecklare att skapa datainmatningsformulär, rapporter och frågor som kan vägleda användare att söka efter befintlig data i databasen och ange ny data. Olika frågebyggare och guideverktyg underlättar denna utvecklingsprocess. Även med dessa verktyg kan det dock finnas situationer där utvecklaren skulle vilja lägga till ännu mer funktionalitet som inte redan tillhandahålls av MS Access-utvecklingsverktygen. Till exempel kan utvecklaren vilja automatiskt korrigera felaktig data innan den sparas i databasen, visa en varning om en affärsregel överträds, hjälpa användaren att navigera från ett datainmatningsformulär till ett annat eller starta en rapport med några anpassade filter. Sättet att åstadkomma sådan anpassning är genom att lägga till kod med hjälp av programmeringsspråket Visual Basic for Applications.

Visual Basic for Applications (VBA) är det programmeringsspråk som används i Microsoft Office-familjen av programvaruprodukter som Excel och Access. VBA-språket kommer från "Basic"-språket som uppfanns 1964 och som blev populärt på persondatorer på 1970-talet. Den "visuella" delen av namnet lades till av Microsoft för att återspegla användningen av det grundläggande programmeringsspråket i Microsoft Windows.

Det finns många tutorials som introducerar grundläggande programmering. Denna handledning kommer att fokusera på en liten delmängd av funktioner i VBA-språket som används i MS Access.

Innehåll

  • Händelser i Microsoft Access
  • VBA-kodexempel:Se till att namnen är korrekta
  • VBA-språket – Deklarera och tilldela variabler, villkorliga uttalanden och kommentarer
  • VBA-språket – funktioner, metoder och exempel
  • VBA-språket – egenskaper
  • VBA-kodningsövningar
  • Hantera fel i VBA
  • Köra anpassade SQL-frågor i VBA

Nästa sida introducerar händelser i Microsoft Access.

Händelser i Microsoft Access

I Access bifogas VBA-programmeringskod till formulär och rapporter och kan ställas in för att köras vid en specifik tidpunkt eller som reaktion på en specifik händelse. Denna programmeringsstil kallas ibland för "händelsebaserad" programmering, vilket betyder att koden utvecklaren skriver kommer att köras som svar på någon händelse .

När ett formulär visas i formulärvyn kommer det i allmänhet att fråga efter befintliga data från de underliggande tabellerna och sedan bara sitta där på tomgång tills användaren gör något. Användaren kan till exempel klicka på en av navigeringsknapparna för att flytta till nästa post, de kan klicka i en textruta och börja skriva in lite ny data eller så kan de klicka på knappen Stäng för att stänga formuläret. Var och en av dessa åtgärder resulterar i en Event händer i formen. Varje klick med musen eller tangentbordet hanteras som en händelse.

För det mesta har händelser ett standardbeteende. Genom att klicka på navigeringsknappen "nästa post" rullar formuläret till nästa datapost. Att skriva bokstaven "C" när markören är i en textruta gör att bokstaven "C" visas i textrutan. Att trycka på TAB-tangenten gör att markören hoppar till nästa textruta (eller kontroll) i formuläret och så vidare. En programmerare kan åsidosätta eller förbättra detta standardbeteende och infoga sin egen kod som ska köras som svar på händelsen.

VBA-programmering på åtkomstformulär och rapporter är huvudsakligen inriktat på att skriva kod för att svara på olika händelser.

Innan du dyker in i händelsernas detaljer kan det vara lärorikt att implementera ett enkelt exempel. För att se lite kod i praktiken ger nästa avsnitt av den här handledningen en genomgång för att lägga till VBA-kod i ett datainmatningsformulär.

VBA-kodexempel:Se till att namnen är korrekta

Vad som följer är ett relativt kortfattat och enkelt exempel på att lägga till VBA-kod till ett datainmatningsformulär i MS Access. Flera detaljer kommer att hoppas över för korthets skull. Efter det här exemplet kommer resten av den här handledningen att fylla i dessa detaljer.

Det här exemplet använder Kund datainmatningsformulär som anpassades i självstudiekursen Advanced MS Access Forms. Du kanske vill slutföra den självstudien (eller åtminstone de delar som handlar om formuläret för kunddatainmatning) innan du fortsätter.

Vid inmatning av ny kundinformation vill vi försäkra oss om att kundens namn skrivs in i "korrekt skiftläge". Det vill säga att den första bokstaven i namnet ska vara en stor bokstav och resten av namnet ska vara med gemener. Om användaren anger:"Joe" vill vi att formuläret automatiskt korrigerar detta till versaler:"Joe".

När det gäller Events kommer vi att lägga till kod som är kopplad till After Update-händelsen för fältet Förnamn på kundformuläret. Det betyder att efter något har ändrats (uppdaterat ) i fältet Förnamn kommer händelsen Efter uppdatering att utlösas och sedan kommer koden vi skriver att träda i kraft för att säkerställa att det namn som än skrevs omvandlas till versaler.

Följande steg sätter den här koden på plats.

  1. Öppna kunddataposten i designläge.
  2. Högerklicka på Förnamn textrutan och välj Egenskaper från popup-menyn.
  3. När Egenskapsbladet visas klickar du på fliken Händelse. Detta visas i figuren nedan:

    Notera listan över händelser som visas. Var och en kan programmeras att svara på den specifika händelse som händer med Förnamn textruta.

  4. Skapa en ny händelsehanterare genom att klicka på de tre prickarna till höger om händelsen Efter uppdatering.
  5. Choose Builder fönstret visas. Välj Code Builder och klicka sedan på OK knapp.
  6. Fönstret för VBA-kodredigering visas. Observera att Access redan har skapat subrutinsubben som börjar med orden Private Sub och slutar med orden End Sub.
    Namnet på subrutinen skapas med namnet på formulärkontrollen (FirstName) och namnet på Händelse som denna subrutin kommer att svara på (AfterUpdate).

    Raden End Sub är där den här subrutinen slutar.

  7. Lägg till följande kod på den tomma raden mellan Private Sub och End Sub.:
    FirstName = StrConv(FirstName, vbProperCase)
    
    

    När den är klar visas koden enligt följande:

    Denna nya kodrad gör följande:

    StrConv är en funktion som tar in innehållet i textrutan FirstName och konverterar den enligt den andra parametern som ges som är vbProperCase i detta exempel. Efter att denna omvandling är klar kommer resultatet att tilldelas (med likhetstecknet) tillbaka till textrutan Förnamn. Detta kommer att skriva över allt som för närvarande finns i textrutan Förnamn. Den här funktionen tar till exempel "sally", konverterar den till "Sally" och lägger sedan in "Sally" i textrutan Förnamn.

  8. Spara den här nya koden genom att dra ned Fil menyn och välj Spara .
  9. Testa den nya koden. Växla tillbaka till skärmen Microsoft Access Design Mode. Ändra vyn till Formulärvy.
  10. Navigera till en tom post. Klicka på fältet Förnamn och skriv in ett namn med alla små bokstäver:

  11. Tryck på fliken för att gå till nästa textruta. Joes namn bör ändras till "Joe" som visas nedan:
  12. Om du får ett fel, växla tillbaka till VBA-kodredigeraren och se till att du har stavat alla delar av koden korrekt. Du kan behöva dra ned Kör menyn och välj Återställ för att stoppa VBA-koden från att köras.

Ovanstående exempel gav en snabb titt på hur man kan anpassa beteendet hos ett formulär för att hjälpa användaren att ange snyggt formaterad data i databasen. Flera detaljer hoppades över under det här exemplet och dessa detaljer kommer att diskuteras i resten av denna handledning.

VBA-språket

Detta avsnitt introducerar kortfattat huvuddelarna av VBA-språket som det används i MS Access. En omfattande översikt av VBA ligger utanför den här handledningen. Referenser till mer omfattande böcker och material finns i slutet av denna handledning.

Deklarera variabler

En variabel är ett namn som ges till en platshållare där programmeraren kan lagra vissa data. Till exempel kan en variabel användas för att lagra ett tal medan vi utför vissa matematiska operationer på det eller jämföra dess värde med andra variabler. Variabler kan deklareras för att hålla värden av en specifik datatyp som heltal, strängar eller datum. För att deklarera en ny variabel, använd Dim-satsen. Till exempel för att deklarera en ny variabel med namnet Mitt Namn och ställ in den för att hålla en sträng (tecken), gör följande:

Dim strMyName As String

För att deklarera en ny variabel med namnet "AccountBalance" och ställa in den för att lagra ett tal med en decimal, använd följande:

Dim dblAccountBalance As Double

Tilldela värden

Ett värde kan tilldelas en variabel eller till en kontroll på formuläret med hjälp av likhetstecknet. För att till exempel lagra namnet "Alex" i variabeln MyName använder du följande:

strMyName =“Alex”

För att kopiera innehållet i textrutan Förnamn till variabeln MyName, använd:

strMyName =[FirstName]

Värden kan också beräknas innan de tilldelas. Till exempel tar följande uttryck den aktuella kundens kontosaldo från textrutan [Saldo], lägger till 1 % ränta (genom att multiplicera saldot med 1,01) och minskar sedan resultatet med 10 USD. Slutligen tilldelas resultatet till variabeln AccountBalance.

dblAccountBalance =( [Saldo] * 1,01 ) – 10,00

Villkorliga uttalanden

En villkorssats använder ett logiskt test för att avgöra vilka rader kod som ska köras härnäst. Den villkorliga satsen If … Then används ganska ofta. Till exempel:

If AccountBalance < 1000 Then
      MonthlyFee = 10
Else
      MonthlyFee = 0
End If

Det logiska uttrycket AccountBalance <1000 utvärderas. Om detta uttryck är sant (till exempel om AccountBalance är $400) körs nästa rad efter Then. I det här exemplet är månadsavgift =10.

Om detta uttryck är falskt körs raden efter Else.

Det logiska uttrycket kan innehålla flera delar som är sammankopplade med de booleska operatorerna OR, AND och NOT. En mer grundlig diskussion om booleska uttryck kan hittas i denna programmeringshandledning. Anta till exempel att vi avstår från månadsavgiften om kontot är mindre än ett år gammalt. Anta att vi har kontoålder som kontots ålder i månader. Då skulle koden vara:

If AccountBalance < 1000 AND AccountAge > 12 Then
      MonthlyFee = 10
Else
      MonthlyFee = 0
End If

Mer än en kodrad kan köras i If … Then-satsen och If … Then-satserna kan kapslas in i varandra.

Kommentarer

När du programmerar på vilket programmeringsspråk som helst, är det bra att inkludera kommentarer som beskriver koden. I VBA kan en kommentar inkluderas genom att börja med ett enda citat. Om vi ​​tar ovanstående som exempel kan vi lägga till följande kommentarer:

Fler delar av VBA-språket diskuteras på nästa sida.

VBA-språk – fortsättning

Funktioner

VBA-språket har ett stort antal inbyggda funktioner och metoder som kan användas för att utföra olika uppgifter såsom matematiska funktioner (sin, cos, tan), strängfunktioner och många andra. Funktioner har vanligtvis en eller flera ingångsparametrar som används av funktionen. Till exempel, i funktionen Cos(45) är "45" den ingångsvinkel som cosinusfunktionen kommer att fungera på. StrConv-funktionen kräver två indataparametrar:strängen som ska konverteras och konverteringsstilen:

StrConv(FirstName, vbProperCase)

Några praktiska funktioner inkluderar:

MsgBox( prompt, knappar, titel) Visa en popup-meddelanderuta med texten, knapparna och rubriken
StrConv( uttryck, stil ) Konvertera stränguttrycket till versaler, gemener eller riktiga bokstäver
Vänster( uttryck, tecken ) Ta bort tecknen längst till vänster från stränguttrycket
Mid(uttryck, start, tecken ) Ta den mittersta uppsättningen av tecken från stränguttrycket från början
IsNull( uttryck ) Testa om stränguttrycket (eller textrutan) inte har något innehåll (är null)
Nz( uttryck, värde_om_null ) Om uttrycket är null, fyll i ett standardvärde
Now() Returnerar aktuellt datum och tid
Runda(uttryck, decimaler ) Avrundar det numeriska uttrycket till ett visst antal decimaler
RGB( röd, grön, blå ) Returnerar färgheltalet baserat på en kombination av rött, grönt och blått

Metoder

Metoder i VBA är som funktioner men de är kopplade till en kontroll eller annat objekt på ett formulär eller en rapport.

Några praktiska metoder inkluderar:

DoCmd.CancelEvent Avbryter den aktuella händelsen som hanteras
DoCmd.Close Stäng det aktuella formuläret (eller databasen)
DoCmd.OpenForm Öppnar ett nytt formulär
DoCmd.OpenReport Kör ett MS Access-kommando som att spara nya eller uppdaterade data, ångra en ändring eller avsluta ett formulär
.SetFocus Sätt fokus på kontrollen på formuläret
.Ångra Ångra den senaste ändringen eller kommandot
.Uppdatera Uppdaterar all data som ligger bakom ett formulär
.Förfrågan Begär data som tillhandahålls till ett formulär
. Måla om Målar om alla kontroller på ett formulär

Många fler funktioner och metoder listas på denna Microsoft-webbplats.

Följande exempel använder sig av olika funktioner och metoder i olika kombinationer.

Exempel

Visa användaren en varning om kontosaldot är under $1 000

If AccountBalance < 1000 Then
      MsgBox("Warning: The Account Balance is now less than $1,000.")
End If

Om textrutan Förnamn i formuläret innehåller något, konvertera det till versaler

If Not IsNull( [FirstName] ) Then
   FirstName = StrConv( [FirstName], vbProperCase )
End If

nästa sida introducerar egenskaper för olika objekt.

Egenskaper

Varje element i ett datainmatningsformulär eller en rapport har en uppsättning egenskaper förknippas med det. Egenskaper styr placering, färg, teckensnitt, bakgrund och andra utseende och formateringsattribut för varje kontroll. Till exempel, några av de många egenskaperna hos en TextBox inkluderar:

Synlig Avgör om textrutan är synlig i formuläret
Låst Avgör om data i textrutan kan ändras
Flikindex Ordningen av varje kontroll när användaren navigerar i formuläret genom att trycka på Tab
Etikett Identifierar namnet på etiketten som är kopplad till textrutan
Bredd, höjd, topp- och bottenposition Indikerar den relativa positionen och storleken på textrutan
Bakgrundsstil och färg Ställer in bakgrundsstil och färg för textrutan
Kantstil och färg Ställer in stil och färg på kanten runt textrutan
Teckenstorlek, vikt, understrykning, kursiv stil, färg och justering Ställer in teckensnitt och stil
Marginaler och utfyllnadsavstånd – Anger marginaler och utfyllnad runt insidan av textrutan

Egenskaper kan ställas in med hjälp av designvyn och sparas med formuläret eller rapporten. Egenskaper kan också ändras med VBA-kod när formuläret körs. För att komma åt en egenskap i VBA, använd namnet på kontrollen, sedan en punkt och sedan namnet på egenskapen. Till exempel ändrar följande kod teckensnittsfärgen i textrutan CustomerID till Röd:

CustomerID.ForeColor =vbRed

Avsnitten som följer ger några övningar som kombinerar olika delar av VBA-programmeringsspråket för att anpassa beteendet hos olika datainmatningsformulär.

VBA-kodövningar

Prova följande övningar som anpassar formulär. Se de tidigare avsnitten för exempel på kod som kan anpassas för att passa den aktuella övningen.

Övning 1

Ändra CustomerDataEntry-formuläret för att lägga till två AfterUpdate-händelsehanterare som konverterar förnamn och efternamn till versaler (Skapa en separat AfterUpdate-hanterare för varje textruta). Skriv kod för att först kontrollera att textrutan inte är null innan du försöker konvertera texten.

Övning 2

Ändra AccountsDataEntry-formuläret för att lägga till en AfterUpdate-händelsehanterare som visar en varningsruta om kontosaldot är under $5 000. Gör också teckensnittsfärgen i textrutan Balans till röd.

Övning 3

Ändra kunddatainmatningsformuläret. Skapa en vid förlorat fokus-underrutin som gör etiketten för textrutan Förnamn röd (vbRed) om användaren lämnar textrutan Förnamn utan att skriva något. Ställ in etiketten på blå (vbBlue) om det finns något i textrutan. I exemplet nedan skrevs ingenting i textrutan FirstName och sedan flikades användaren till nästa textruta vilket gjorde att FirstName-etiketten blev röd.

Nästa sida i denna handledning diskuterar hur man hanterar fel i VBA-kod.

Hantera fel i VBA

Ibland kommer VBA-kod att stöta på ett fel. Till exempel, om en textruta är tom och vi försöker konvertera innehållet i textrutan till versaler, kommer StrCnv-funktionen att misslyckas. Ett annat exempel är när division med noll sker. Utan felhantering kan dessa problem få VBA-programmet att krascha. När ett fel uppstår kan specialkod komma igång för att hantera felet och fortsätta bearbeta VBA-koden.

De två huvudsakliga felhanteringsfunktionerna i VBA är On Error Goto-satsen och Resume Next-satsen. Dessa två VBA-kodsatser arbetar tillsammans för att förhindra att VBA kraschar programmet.

På Error Goto-satsen informerar VBA om vad som ska göras när ett fel uppstår i en subrutin. Goto-delen av uttalandet refererar till en etikett någon annanstans i koden där VBA kommer att fortsätta att fungera. När VBA-programmet kommer till etiketten kommer alla fel att dyka upp i ett objekt som heter Err. Egenskapen Err.Description kommer att innehålla en textbeskrivning av det senaste felet. Resume Next-satsen gör att VBA-programmet fortsätter att köras från punkten efter att felet uppstod.

Följande exempel utökar rutinen FirstName_AfterUpdate som introducerades i början av denna handledning. Nu kan VBA-programmet hantera eventuella fel som kan uppstå i programmet.

Private Sub FirstName_AfterUpdate
     ' Subroutine to convert the FirstName of the customer to Proper Case
    On Error Goto FirstName_AfterUpdate_Error_Handler
     FirstName = StrConv(FirstName, vbProperCase)
     ' If the conversion was successful, exit this subroutine
     Exit Sub
FirstName_AfterUpdate_Error_Handler:
       ' If there is an error show the description of the error
      MsgBox Err.Description
      ' Resume with the next statement In the subroutine
     Resume Next
End Sub

nästa avsnitt i denna handledning diskuterar hur man inkluderar SQL-kod i VBA.

Köra anpassade SQL-frågor i VBA

Structured Query Language (SQL) är programmeringsspråket som används i relationsdatabaser som MS Access, SQL Server, Oracle och många andra. SQL-satser kan användas för att infoga, uppdatera, ta bort och hämta (välja) dataposter från tabeller (bland många andra funktioner). Ett enkelt exempel på en SQL-sats skulle vara:

SELECT customerid, firstname, lastname
FROM  customer

SQL-kod kan skrivas i VBA och köras vid lämplig tidpunkt. Till exempel kan en VBA-subrutin skrivas för att fråga i kundtabellen för att hitta det högsta kund-ID. Sedan kan vi lägga till 1 till det här numret för att få ett nytt oanvänt kund-ID för ett nytt rekord.

De allmänna stegen för att utföra denna typ av uppgift är:

Skapa en SQL-sats

Kör SQL-satsen med den öppna databasanslutningen (som heter CurrentDb i VBA)

Hämta de resulterande posterna och använd den hämtade datan

För att skapa denna VBA-subrutin, öppna CustomerDataEntry-formuläret och hämta egenskaperna för CustomerID-fältet. Under händelsefliken klickar du på de tre prickarna till höger om händelsen On Dbl Click. Välj Kodbyggare så skapas stubben enligt följande:

Private Sub CustomerID_DblClick(Cancel As Integer)

End Sub

Lägg till följande kod:

Private Sub CustomerID_DblClick(Cancel As Integer)
    ' Create a new CustomerID when user double-clicks in the CustomerID field
    On Error GoTo ErrorHandler
    Dim rstResults As Recordset ' This will hold the set of result records
    Dim strSQL As String        ' This variable will hold the text of the SQL Statement
    ' If there is nothing in the CustomerID text box
    If IsNull(CustomerID) Then
       ' Make the SQL statement
       strSQL = "SELECT MAX(customerid) + 1 AS NewID FROM customer"
       ' Run the SQL query against the current database
       Set rstResults = CurrentDb.OpenRecordset(strSQL)
       ' If at least 1 record is returned
       If rstResults.EOF = False Then
          ' Assign the NewID to the CustomerID field
          CustomerID = rstResults!NewID
       End If

        rstResults.Close              ' Close up the result set
       Set rstResults = Nothing      ' Empty out the result set
    End If
    Exit Sub

ErrorHandler:
    Set rstResults = Nothing
End Sub

Koden kommer att se ut så här när allt är på plats:

Spara filen och se sedan CustomerDataEntry-formuläret. Navigera till en ny post och dubbelklicka sedan i fältet Kund-ID. Ett nytt kund-ID bör skapas automatiskt.


  1. MySQL CHAR() vs T-SQL CHAR():Vad är skillnaden?

  2. PowerManager.PARTIAL_WAKE_LOCK android

  3. Lägg till en främmande nyckelrelation mellan två databaser

  4. 4 sätt att lista vyerna i en SQLite-databas