Access 2007 ™ Programming by Example with VBA, XML, and ASP Julitta Korol Wordware Publishing, Inc. LibraryofCongressCataloging-in-PublicationData Korol,Julitta. Access2007programmingbyexamplewithVBA,XML,andASP/byJulittaKorol. p. cm. Includesindex. ISBN-13:978-1-59822-042-1 ISBN-10:1-59822-042-X(pbk.) 1. MicrosoftAccess. 2. Databasemanagement. 3. MicrosoftVisualBasic forapplications 4. XML(Documentmarkuplanguage) 5. Activeserver pages I. Title. QA76.9.D3K657332007 005.75'65--dc22 2007044561 CIP ©2008,WordwarePublishing,Inc. AllRightsReserved 1100SummitAvenue,Suite102 Plano,Texas75074 Nopartofthisbookmaybereproducedinanyformorby anymeanswithoutpermissioninwritingfrom WordwarePublishing,Inc. PrintedintheUnitedStatesofAmerica ISBN-13:978-1-59822-042-1 ISBN-10:1-59822-042-X 10 9 8 7 6 5 4 3 2 1 0711 MicrosoftisaregisteredtrademarkandAccessisatrademarkofMicrosoftCorporationintheUnitedStatesand/orother countries. Otherbrandnamesandproductnamesmentionedinthisbookaretrademarksorservicemarksoftheirrespective companies.Anyomissionormisuse(ofanykind)ofservicemarksortrademarksshouldnotberegardedasintenttoinfringeon thepropertyofothers.Thepublisherrecognizesandrespectsallmarksusedbycompanies,manufacturers,anddevelopersasa meanstodistinguishtheirproducts. Thisbookissoldasis,withoutwarrantyofanykind,eitherexpressorimplied,respectingthecontentsofthisbookandany disksorprogramsthatmayaccompanyit,includingbutnotlimitedtoimpliedwarrantiesforthebook’squality,performance, merchantability,orfitnessforanyparticularpurpose.NeitherWordwarePublishing,Inc.noritsdealersordistributorsshallbe liabletothepurchaseroranyotherpersonorentitywithrespecttoanyliability,loss,ordamagecausedorallegedtohavebeen causeddirectlyorindirectlybythisbook. AllinquiriesforvolumepurchasesofthisbookshouldbeaddressedtoWordwarePublishing,Inc., attheaboveaddress.Telephoneinquiriesmaybemadebycalling: (972)423-0090 Contents Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Part I — Introduction to Access 2007 VBA Programming Chapter1 WritingProceduresinModules . . . . . . . . . . . . . . . . . . . . . 3 ProcedureTypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 ModuleTypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 StandardModules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 WritingProceduresinaStandardModule . . . . . . . . . . . . . . . . . . . . 6 ExecutingYourProceduresandFunctions. . . . . . . . . . . . . . . . . . . . 9 ClassModules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Events,EventProperties,andEventProcedures . . . . . . . . . . . . . . . . . . . . . 13 WhyUseEvents? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 WalkingThroughanEventProcedure. . . . . . . . . . . . . . . . . . . . . . . . 14 CompilingYourProcedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 PlacingaDatabaseinaTrustedLocation . . . . . . . . . . . . . . . . . . . . . . 19 ChapterSummary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Chapter2 TheVisualBasicEditor(VBE). . . . . . . . . . . . . . . . . . . . . . 22 UnderstandingtheProjectExplorerWindow . . . . . . . . . . . . . . . . . . . . . . . 22 UnderstandingthePropertiesWindow . . . . . . . . . . . . . . . . . . . . . . . . . . 23 UnderstandingtheCodeWindow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 OtherWindowsintheVBE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 On-the-FlySyntaxandProgrammingAssistance . . . . . . . . . . . . . . . . . . . . . 28 ListProperties/Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 ParameterInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 ListConstants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 QuickInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 CompleteWord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Indent/Outdent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 CommentBlock/UncommentBlock. . . . . . . . . . . . . . . . . . . . . . . . . 32 UsingtheObjectBrowser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 UsingtheVBAObjectLibrary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 UsingtheImmediateWindow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 ChapterSummary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Chapter3 Variables,DataTypes,andConstants . . . . . . . . . . . . . . . . . 40 WhatIsaVariable? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 WhatAreDataTypes? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 CreatingVariables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 DeclaringVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 iii iv | Contents SpecifyingtheDataTypeofaVariable . . . . . . . . . . . . . . . . . . . . . . . . . . 46 UsingTypeDeclarationCharacters. . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 AssigningValuestoVariables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 ForcingDeclarationofVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 UnderstandingtheScopeandLifetimeofVariables. . . . . . . . . . . . . . . . . . . . 52 Procedure-Level(Local)Variables. . . . . . . . . . . . . . . . . . . . . . . . . . 52 Module-LevelVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Public(Global)Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 UnderstandingandUsingTemporaryVariables. . . . . . . . . . . . . . . . . . . . . . 56 CreatingaTemporaryVariablewithaTempVarsCollectionObject. . . . . . . . . 57 RetrievingNamesandValuesofTempVarObjects . . . . . . . . . . . . . . . . . 57 UsingTemporaryGlobalVariablesinExpressions. . . . . . . . . . . . . . . . . . 58 RemovingaTemporaryVariablefromaTempVarsCollectionObject. . . . . . . . 58 UnderstandingandUsingStaticVariables. . . . . . . . . . . . . . . . . . . . . . . . . 59 UnderstandingandUsingObjectVariables . . . . . . . . . . . . . . . . . . . . . . . . 61 FindingaVariableDefinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 WhatTypeIsThisVariable? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 UsingConstantsinVBAProcedures . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 IntrinsicConstants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 GroupingConstantswiththeEnumType. . . . . . . . . . . . . . . . . . . . . . . . . 67 ChapterSummary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Chapter4 PassingArgumentstoProceduresandFunctions . . . . . . . . . . . . 70 WritingaFunctionProcedure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 SpecifyingtheDataTypeforaFunction’sResult. . . . . . . . . . . . . . . . . . . . . 72 PassingArgumentsbyReferenceandbyValue. . . . . . . . . . . . . . . . . . . . . . 74 UsingOptionalArguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 UsingtheIsMissingFunction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Built-inFunctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 UsingtheMsgBoxFunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 ReturningValuesfromtheMsgBoxFunction . . . . . . . . . . . . . . . . . . . . 84 UsingtheInputBoxFunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 ConvertingDataTypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 UsingMasterProceduresandSubprocedures. . . . . . . . . . . . . . . . . . . . . . . 89 ChapterSummary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Chapter5 DecisionMakingwithVBA. . . . . . . . . . . . . . . . . . . . . . . 94 If…ThenStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Multi-LineIf…ThenStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 DecisionsBasedonMoreThanOneCondition. . . . . . . . . . . . . . . . . . . . . . 98 If…Then…ElseStatement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 If…Then…ElseIfStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 NestedIf…ThenStatements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 SelectCaseStatement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 UsingIswiththeCaseClause . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 SpecifyingaRangeofValuesinaCaseClause. . . . . . . . . . . . . . . . . . . 108 SpecifyingMultipleExpressionsinaCaseClause . . . . . . . . . . . . . . . . . 110 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Chapter6 RepeatingActionsinVBA. . . . . . . . . . . . . . . . . . . . . . . 112 UsingtheDo…WhileStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 AnotherApproachtotheDo…WhileStatement. . . . . . . . . . . . . . . . . . . . . 114 Contents | v UsingtheDo…UntilStatement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 AnotherApproachtotheDo…UntilStatement . . . . . . . . . . . . . . . . . . . . . 116 For…NextStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 ForEach…NextStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 ExitingLoopsEarly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 NestedLoops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Chapter7 WorkingwithArrays . . . . . . . . . . . . . . . . . . . . . . . . . 124 DeclaringArrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 ArrayUpperandLowerBounds. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 UsingArraysinVBAProcedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 ArraysandLoopingStatements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 UsingaTwo-DimensionalArray. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 StaticandDynamicArrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 ArrayFunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 TheArrayFunction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 TheIsArrayFunction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 TheEraseFunction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 TheLBoundandUBoundFunctions . . . . . . . . . . . . . . . . . . . . . . . . 137 ErrorsinArrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 ParameterArrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Chapter8 CustomCollectionsandClassModules. . . . . . . . . . . . . . . . 142 Terminology. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 WorkingwithCollections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 DeclaringaCustomCollection. . . . . . . . . . . . . . . . . . . . . . . . . . . 144 AddingObjectstoaCustomCollection . . . . . . . . . . . . . . . . . . . . . . 144 RemovingObjectsfromaCustomCollection . . . . . . . . . . . . . . . . . . . 146 CreatingCustomObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 CreatingaClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 VariableDeclarations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 DefiningthePropertiesfortheClass . . . . . . . . . . . . . . . . . . . . . . . . 148 CreatingthePropertyGetProcedures. . . . . . . . . . . . . . . . . . . . . 150 CreatingthePropertyLetProcedures . . . . . . . . . . . . . . . . . . . . . 150 CreatingtheClassMethods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 CreatinganInstanceofaClass. . . . . . . . . . . . . . . . . . . . . . . . . . . 153 EventProceduresintheClassModule . . . . . . . . . . . . . . . . . . . . . . . 153 CreatingtheUserInterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 RunningtheCustomApplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 WatchingtheExecutionofYourVBAProcedures. . . . . . . . . . . . . . . . . . . . 164 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Chapter9 DebuggingVBAProceduresandHandlingErrors . . . . . . . . . . . 167 TestingVBAProcedures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 StoppingaProcedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 UsingBreakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 RemovingBreakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 UsingtheImmediateWindowinBreakMode . . . . . . . . . . . . . . . . . . . 174 UsingtheStopStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 AddingWatchExpressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 vi | Contents RemovingWatchExpressions. . . . . . . . . . . . . . . . . . . . . . . . . 179 UsingQuickWatch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 UsingtheLocalsWindowandtheCallStackDialogBox. . . . . . . . . . . . . . . . 181 SteppingThroughVBAProcedures . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 SteppingOveraProcedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 SteppingOutofaProcedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 RunningaProceduretoCursor. . . . . . . . . . . . . . . . . . . . . . . . . . . 185 SettingtheNextStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 ShowingtheNextStatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 StoppingandResettingVBAProcedures . . . . . . . . . . . . . . . . . . . . . . . . 186 UnderstandingandUsingConditionalCompilation . . . . . . . . . . . . . . . . . . . 186 NavigatingwithBookmarks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 TrappingErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 GeneratingErrorstoTestErrorHandling . . . . . . . . . . . . . . . . . . . . . . . . 193 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Part II — Access VBA Programming with DAO and ADO Chapter10 DataAccessTechnologiesinMicrosoftAccess . . . . . . . . . . . . 197 UnderstandingDatabaseEngines:Jet/ACE . . . . . . . . . . . . . . . . . . . . . . . 197 UnderstandingAccessVersionsandFileFormats . . . . . . . . . . . . . . . . . . . . 198 UnderstandingLibraryReferences. . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 OverviewofObjectLibrariesinMicrosoftAccess . . . . . . . . . . . . . . . . . . . 203 TheVisualBasicforApplicationsObjectLibrary(VBA) . . . . . . . . . . . . . 203 TheMicrosoftAccess12.0ObjectLibrary. . . . . . . . . . . . . . . . . . . . . 203 TheMicrosoftOffice12.0AccessDatabaseEngineObjectLibrary . . . . . . . . 203 TheMicrosoftAccessDAO3.6ObjectLibrary . . . . . . . . . . . . . . . . . . 204 TheMicrosoftActiveXDataObjects2.8Library(ADO) . . . . . . . . . . . . . 205 CreatingaReferencetotheADOLibrary . . . . . . . . . . . . . . . . . . . . . . . . 206 UnderstandingConnectionStrings. . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 UsingODBCConnectionStrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 CreatingandUsingODBCDSNConnections . . . . . . . . . . . . . . . . . . . 209 CreatingandUsingDSN-lessODBCConnections. . . . . . . . . . . . . . . . . 213 UsingOLEDBConnectionStrings . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 ConnectionStringviaaDataLinkFile . . . . . . . . . . . . . . . . . . . . . . . . . 215 OpeningMicrosoftAccessDatabases . . . . . . . . . . . . . . . . . . . . . . . . . . 218 OpeningaMicrosoftJetDatabaseinRead/WriteModewithDAO . . . . . . . . 218 OpeningaMicrosoftJetDatabaseinRead/WriteModewithADO . . . . . . . . 220 OpeningaMicrosoftAccessDatabaseinRead-OnlyModewithDAO . . . . . . 223 OpeningaaMicrosoftJetDatabaseinRead-OnlyModewithADO. . . . . . . . 224 OpeningaMicrosoftJetDatabaseSecuredwithaPassword. . . . . . . . . . . . 224 OpeningaMicrosoftJetDatabasewithUser-LevelSecurity. . . . . . . . . . . . 228 ConnectingtotheCurrentAccessDatabase . . . . . . . . . . . . . . . . . . . . . . . 230 OpeningOtherDatabases,Spreadsheets,andTextFilesfromAccess2007 . . . . . . . 232 ConnectingtoanSQLServerDatabase. . . . . . . . . . . . . . . . . . . . . . . 232 OpeningaMicrosoftExcelSpreadsheet . . . . . . . . . . . . . . . . . . . . . . 233 OpeningaTextFileUsingADO . . . . . . . . . . . . . . . . . . . . . . . . . . 237 CreatingaNewAccessDatabase . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 CreatingaDatabasewithDAO. . . . . . . . . . . . . . . . . . . . . . . . . . . 239 CreatingaDatabasewithADO. . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Contents | vii CopyingaDatabase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 CopyingaDatabasewithDAO. . . . . . . . . . . . . . . . . . . . . . . . . . . 241 CopyingaDatabasewithFileSystemObject . . . . . . . . . . . . . . . . . . . . 242 DatabaseErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 CompactingaDatabase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Chapter11 CreatingandAccessingDatabaseTablesandFields . . . . . . . . . 249 CreatingaMicrosoftAccessTableandSettingFieldProperties(DAOMethod) . . . . 249 CreatingaMicrosoftAccessTableandSettingFieldProperties(ADOMethod) . . . . 254 CopyingaTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 DeletingaDatabaseTable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 AddingNewFieldstoanExistingTable. . . . . . . . . . . . . . . . . . . . . . . . . 260 RemovingaFieldfromaTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 RetrievingTableProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 RetrievingFieldProperties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 LinkingaMicrosoftAccessTable. . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 LinkingadBASETable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 LinkingaMicrosoftExcelSpreadsheet . . . . . . . . . . . . . . . . . . . . . . . . . 268 ListingDatabaseTables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 ListingTablesandFields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 ListingDataTypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 ChangingtheAutoNumber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Chapter12 SettingUpPrimaryKeys,Indexes,andTableRelationships . . . . . . 275 CreatingaPrimaryKeyIndex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 CreatingaSingle-FieldIndex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 AddingaMultiple-FieldIndextoaTable . . . . . . . . . . . . . . . . . . . . . . . . 280 ListingIndexesinaTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 DeletingTableIndexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 CreatingTableRelationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Chapter13 FindingandReadingRecords . . . . . . . . . . . . . . . . . . . . 287 IntroductiontoDAORecordsets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 OpeningVariousTypesofRecordsets . . . . . . . . . . . . . . . . . . . . . . . 288 OpeningaSnapshotandCountingRecords. . . . . . . . . . . . . . . . . . . . . 290 RetrievingtheContentsofaSpecificFieldinaTable . . . . . . . . . . . . . . . 292 MovingbetweenRecordsinaTable . . . . . . . . . . . . . . . . . . . . . . . . 292 FindingRecordsinaTable-TypeRecordset . . . . . . . . . . . . . . . . . . . . 293 FindingRecordsinDynasetsorSnapshots. . . . . . . . . . . . . . . . . . . . . 295 FindingthenthRecordinaSnapshot. . . . . . . . . . . . . . . . . . . . . . . . 297 IntroductiontoADORecordsets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 CursorTypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 LockTypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 CursorLocation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 TheOptionsParameter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 OpeningaRecordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 OpeningaRecordsetBasedonaTableorQuery . . . . . . . . . . . . . . . 306 OpeningaRecordsetBasedonanSQLStatement . . . . . . . . . . . . . . 310 OpeningaRecordsetBasedonCriteria . . . . . . . . . . . . . . . . . . . . 311 viii | Contents OpeningaRecordsetDirectly. . . . . . . . . . . . . . . . . . . . . . . . . 312 MovingAroundinaRecordset. . . . . . . . . . . . . . . . . . . . . . . . . . . 312 FindingtheRecordPosition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 ReadingDatafromaField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 ReturningaRecordsetasaString. . . . . . . . . . . . . . . . . . . . . . . . . . 315 FindingRecordsUsingtheFindMethod. . . . . . . . . . . . . . . . . . . . . . 317 FindingRecordsUsingtheSeekMethod. . . . . . . . . . . . . . . . . . . . . . 318 FindingaRecordBasedonMultipleConditions . . . . . . . . . . . . . . . . . . 320 UsingBookmarks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 UsingBookmarkstoFilteraRecordset. . . . . . . . . . . . . . . . . . . . . . . 323 UsingtheGetRowsMethodtoFilltheRecordset . . . . . . . . . . . . . . . . . 324 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 Chapter14 WorkingwithRecords. . . . . . . . . . . . . . . . . . . . . . . . 326 AddingaNewRecordwithDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 AddingaNewRecordwithADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 ModifyingaRecordwithDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 ModifyingaRecordwithADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 EditingMultipleRecordswithADO. . . . . . . . . . . . . . . . . . . . . . . . . . . 332 DeletingaRecordwithDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 DeletingaRecordwithADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 CopyingRecordstoanExcelSpreadsheet. . . . . . . . . . . . . . . . . . . . . . . . 336 CopyingRecordstoaWordDocument . . . . . . . . . . . . . . . . . . . . . . . . . 339 CopyingRecordstoaTextFile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 FilteringRecordsUsingtheSQLWHEREClause. . . . . . . . . . . . . . . . . . . . 344 FilteringRecordsUsingtheFilterProperty . . . . . . . . . . . . . . . . . . . . . . . 346 SortingRecords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 Chapter15 CreatingandRunningQuerieswithDAO/ADO . . . . . . . . . . . 350 CreatingaSelectQueryManually. . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 CreatingaSelectQuerywithDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 CreatingaSelectQuerywithADO . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 ExecutinganExistingSelectQuerywithADO . . . . . . . . . . . . . . . . . . . . . 358 ModifyinganExistingQuerywithADO . . . . . . . . . . . . . . . . . . . . . . . . 361 CreatingandRunningaParameterQuerywithDAO . . . . . . . . . . . . . . . . . . 362 CreatingandRunningaParameterQuerywithADO . . . . . . . . . . . . . . . . . . 364 CreatingandRunningaMake-TableQuerywithDAO . . . . . . . . . . . . . . . . . 367 CreatingandRunninganUpdateQuerywithDAO . . . . . . . . . . . . . . . . . . . 369 ExecutinganUpdateQuerywithADO . . . . . . . . . . . . . . . . . . . . . . . . . 370 RunninganAppendQuerywithDAO/ADO. . . . . . . . . . . . . . . . . . . . . . . 372 RunningaDeleteQuerywithDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 CreatingandRunningaPass-ThroughQuerywithDAO . . . . . . . . . . . . . . . . 376 CreatingandExecutingaPass-ThroughQuerywithADO . . . . . . . . . . . . . . . 378 PerformingOtherOperationswithQueries . . . . . . . . . . . . . . . . . . . . . . . 382 RetrievingQueryPropertieswithDAO. . . . . . . . . . . . . . . . . . . . . . . 382 ListingAllQueriesinaDatabasewithDAO/ADO. . . . . . . . . . . . . . . . . 383 DeletingaQueryfromaDatabasewithDAO/ADO. . . . . . . . . . . . . . . . . . . 384 DeterminingifaQueryIsUpdatable . . . . . . . . . . . . . . . . . . . . . . . . . . 386 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 Contents | ix Chapter16 UsingAdvancedADO/DAOFeatures . . . . . . . . . . . . . . . . 389 FabricatingaRecordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 DisconnectedRecordsets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 SavingaRecordsettoDisk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 CloningaRecordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 IntroductiontoDataShaping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 WritingaSimpleSHAPEStatement . . . . . . . . . . . . . . . . . . . . . . . . 413 WorkingwithDataShaping . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 WritingaComplexSHAPEStatement . . . . . . . . . . . . . . . . . . . . . . . 418 ShapedRecordsetswithMultipleChildren . . . . . . . . . . . . . . . . . . 418 ShapedRecordsetswithGrandchildren . . . . . . . . . . . . . . . . . . . . 421 TransactionProcessing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 CreatingaTransactionwithADO . . . . . . . . . . . . . . . . . . . . . . . . . 431 CreatingaTransactionwithDAO . . . . . . . . . . . . . . . . . . . . . . . . . 433 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 Chapter17 ImplementingDatabaseSecurity . . . . . . . . . . . . . . . . . . 437 TwoTypesofSecurityinMicrosoftAccess . . . . . . . . . . . . . . . . . . . . . . . 437 Share-LevelSecurity(inAccessACCDBandMDBFileFormats) . . . . . . . . 438 User-LevelSecurity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 UnderstandingWorkgroupInformationFiles . . . . . . . . . . . . . . . . . . . . . . 438 CreatingandJoiningWorkgroupInformationFiles. . . . . . . . . . . . . . . . . 441 CreatingandManagingGroupandUserAccounts . . . . . . . . . . . . . . . . . . . 449 DeletingUserandGroupAccounts. . . . . . . . . . . . . . . . . . . . . . . . . 452 ListingUserandGroupAccounts . . . . . . . . . . . . . . . . . . . . . . . . . 453 ListingUsersinGroups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 SettingandRetrievingUserandGroupPermissions. . . . . . . . . . . . . . . . . . . 456 DeterminingtheObjectOwner. . . . . . . . . . . . . . . . . . . . . . . . . . . 456 SettingUserPermissionsforanObject. . . . . . . . . . . . . . . . . . . . . . . 458 SettingUserPermissionsforaDatabase . . . . . . . . . . . . . . . . . . . . . . 461 SettingUserPermissionsforContainers . . . . . . . . . . . . . . . . . . . . . . 462 CheckingPermissionsforObjects . . . . . . . . . . . . . . . . . . . . . . . . . 464 SettingaDatabasePasswordUsingtheCompactDatabaseMethod . . . . . . . . 466 SettingaDatabasePasswordUsingtheNewPasswordMethod . . . . . . . . . . 468 ChangingaUserPassword. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 EncryptingaSecuredMDBDatabase . . . . . . . . . . . . . . . . . . . . . . . . . . 471 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 Chapter18 DatabaseReplication . . . . . . . . . . . . . . . . . . . . . . . . 474 CreatingaDesignMaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475 CreatingaFullReplica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477 CreatingaPartialReplica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478 ReplicatingObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 KeepingObjectsLocal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 SynchronizingReplicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 RetrievingReplicaProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 SynchronizationConflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 ChapterSummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493