Hi All!
I have created access Application and would like to document it. Do u guys have any samples, or maybe you have documented some aplication before...
Some time ago I did up an Access database for a friend. He told 2 friends and they told 2 friends and now several people would like a demo version of the database with documentation.
I usually don't give much thought to documentation as my databases tend to be stand alone to perform a specific set of functions.
Could someone point me in the right direction for the "generally accepted" method of Microsoft Access documentation. A template or somthing like that would be most helpful.
Lately I've been doing a lot of importing and exporting of data to text files using stored specs. To see what fields and sizes a spec contatins I have been going to the File menu of Tables, click on Get External Data/Import. When the Open menu comes up, I click on any random text file. Then when the Import dialog starts I can get to the spec by clicking the Advanced button. I can then copy it to spreadsheet for documentation. Is there an easier or automated way to document Import/Export specs in ACCESS 2003?
it is possible to Open access application like desk application done with java or vb, or install access application as exe or similar methods. My requirements is to giving a access application to customer with data base for printing an invoice. when he running the aplication he can see access open and tables, queries forms left hand. how to hide these thing ?
We have an extensive reporting application in Access and would like it to be available through a web application. I've went down the road of migrating this application to SQL to use SQL Reporting Services; this is a good tool but I am wondering if MS Access has an easier solution for me other than migration to SQL.
I'm looking for a solution that will make these reports available over the web for many users. Price tag is a consideration...need to know if there is any.
Please help...thanks in advance for any thoughts!!!!
When putting together the final application, you don't want the user to see all the usual default menu options.
1) Which access items should I hide?
2)Let's say I make some modifications after we go live. How can I get the new forms, modules or whatever to the .mdb in use? Would I just delete the tables in the modified .mdb and then import (File/Get External Date/import) the tables with the live data?. It's not a split db, btw.
3) Are there any other options or procedures I should think about for maintainence? For instance, right now I use the compact on close option which has proved to be very useful.
Can anyone point me in the right direction to produce an application diagram.
Sort of a map of an app, what data it hold in laymans terms rathers than table and field definitions. What forms do what, and how the whole application fits together.
Hi, I have a large database containing information that people all over the country want to access. I've designed a main form that contains 3 subforms that queries information from raw data. Now that the database is complete, i'm looking for the best way to distribute it. I've tried to put it on the network drive, but it has been rediculoursly slow. Could somebody tell me what would be the best way to do this? Thanks!
I do not want any menu bar in some application I have made using a switchboard. In the start-up function I unchecked all the checkboxes but some menu functions keep coming back. How can I overrule this?
I have developed an application which I want to keep safe from being tampered with by user.s So once a .mdb database application has been developed what is the best way to then distribute the application to a client (customer who has paid for the application) so that the application can't then be tampered with ?
Hello, I have finished a program with ACCESS 2007 (VBA) at work. Now, my boss wants his employees to use it from different computers. What would I have to do to make this work?? I suppose ACCESS has a runtime version or executable that I can install on every computer of the company? Or do I have to install ACCESS 2007 on every terminal (which would be very bad by the way)?? I would appreciate it if somebody would give me a hand on this since I have never done this before.
I just developed an application and now I want to distibute it. I want to work with licenties and I also want to make shure the software can only be installed according to the number of licences.
Dear all, have tried searching many sites but of no help. hope this is the right place to ask my query.
I would like to develop an application with the help of which I can make phone calls through my PC (windows 2000) and record calls as required. I have come to know that TAPI is the technology to use. However how do i start and what are the requisites.
I have been asked to make changes to an app that is WAY more complicated than anything I've ever done. The changes themselves are no problem (add 3 new fields to each of two tables and modify 2 forms and a report). The problem is after I make the changes the app doesn't work. The database (even stripped of all but 10 records) is too big to upload here. (2.5M)
I need to add 2 text fields (Route and Region) each 10 chars. and a yes/no field (Early Delivery) to the Order Head table and the Location table. I need to add those three fields to the Order Head and Location forms and get the info to copy over from the Location table if they select a reception location from the drop down on the Order Head form.
I have at least two possible problems. The first is as soon as I add the fields to the table and the Order Head form the form doesn't open in Data Entry mode. If I change the Data Entry property on the form to Yes, it works (although I think from looking at the code that it should have been set automatically when the New Order button was clicked on the switchboard). The second problem is that once I change the Data Entry property to Yes I can't add records to the subforms (the message is that a record must be added to Order Head first).
So....something I'm doing appears to be circumventing the code that commits the record.
I'd really appreciate any help.
OrderHead Code (I cut a lot out so the message wasn't too big)
Option Compare Database ' Use database order for string comparisons. Option Explicit ' Requires variables to be declared before they are used.
Private Sub cmdAdd_Click() On Error GoTo Err_cmdAdd_Click Me.cmdAdditionalPayment.Visible = False DoCmd.GoToRecord , , acNewRec Me.frmBridalConsultant.SetFocus
Private Sub cmdDelete_Click() On Error GoTo Err_cmdDelete_Click Dim myVar As Variant Me.cmdAdditionalPayment.Visible = False If IsNull(Me.frmRecordStatus) _ Or IsEmpty(Me.frmRecordStatus) _ Or Me.frmRecordStatus = " " Then myVar = OrdersCleanUp(Me.frmOrder) Me.frmRecordStatus = "P" Me.dspRecordStatus = "DELETED" Me.dspRecordStatus.Visible = True 'Me.cmdDelete.Visible = False 'Me.cmdUndelete.Visible = True Me.Refresh Form.Repaint MsgBox ("Order flagged as deleted . . .") Else If Me.frmRecordStatus = "P" _ Or Me.frmRecordStatus = "D" Then MsgBox "Order is already flagged as deleted" Else End If End If
Private Sub cmdSave_Click() On Error GoTo Err_cmdSave_Click
If IsNull(Me.frmReceptionDate) _ Or IsEmpty(Me.frmReceptionDate) _ Or Me.frmReceptionDate = " " Then Else DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 Me.Refresh MsgBox ("Order saved . . .") End If
Private Sub Form_Activate() If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_Activate" _ & vbCr & vbLf & "Order=" & Me![frmOrder] Else End If If IsNull(Me![frmOrder]) Then intOrder = 0 Else intOrder = Me![frmOrder] End If If blnPackage Then If Me.cmdAdditionalPayment.Visible = True Then Me![frmTotalAdditionalPayments] = rtnTotalAdditionalPayments(intOrder) Me![dspBalanceDue] = Me![dspTotalCharges] - Me![frmTotalAdditionalPayments] Me.cmdMoney.Visible = True Else Me![frmTotalPayments] = rtnTotalPayments(intOrder) Me![dspBalanceDue] = Me![dspTotalCharges] - Me![frmTotalPayments] Me.cmdMoney.Visible = False End If Else Me![frmTotalPayments] = rtnTotalPayments(intOrder) Me![dspBalanceDue] = Me![dspTotalCharges] - Me![frmTotalPayments] End If Form.Repaint End Sub
Private Sub Form_AfterInsert() If IsNull(Me![frmReceptionGuests]) Then intGuests = 0 Else intGuests = Me![frmReceptionGuests] End If blnCoveringCharge = False If IsNull(Me![frmLayers]) Then intLayers = 0 Else intLayers = Me![frmLayers] End If If IsNull(Me![frmTierSets]) _ Or Me![frmTierSets] < 1 Then blnRaised = False Else blnRaised = True End If intLayer = 1 If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_AfterInsert" _ & vbCr & vbLf & "Order=" & Me![frmOrder] _ & vbCr & vbLf & "Guests=" & Me![frmReceptionGuests] _ & vbCr & vbLf & "intLayers=" & intLayers _ & vbCr & vbLf & "blnRaised=" & blnRaised _ & vbCr & vbLf & "intLayer=" & intLayer Else End If End Sub
Private Sub Form_BeforeInsert(Cancel As Integer) If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_BeforeInsert" _ & vbCr & vbLf & "Order=" & Me![Order] Else End If End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer) If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_BeforeUpdate" Else End If End Sub
Private Sub Form_CommandExecute(ByVal Command As Variant) If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_CommandExecute" Else End If End Sub
Private Sub Form_Current() ' MsgBox Me.Name & "Form_Current Order=" & Me.frmOrder If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_Current" _ & vbCr & vbLf & "Order=" & Me![Order] _ & vbCr & vbLf & "NewRecord=" & Me.NewRecord _ & vbCr & vbLf & "DataEntry=" & Me.DataEntry _ & vbCr & vbLf & "AllowAdditions=" & Me.AllowAdditions Else End If If Form.DataEntry Then ' New Order Me![dspMode] = "New Order" 'Me.dspFilter.Visible = False Me.cmdAdd.Visible = True Me.cmdDelete.Visible = True Me.cmdUndelete.Visible = False Me.cmdFilter.Visible = False Me.cmdMoney.Visible = False Me.cmdAdditionalPayment.Visible = False Else ' Order Inquiry Me![dspMode] = "Order Inquiry/Edit" Me.AllowAdditions = False Me.cmdAdd.Visible = False 'Me![dspFilter] = Me.Filter 'Me.dspFilter.Visible = True Me.cmdFilter.Visible = True If IsNull(Me.frmRecordStatus) _ Or IsEmpty(Me.frmRecordStatus) _ Or Me.frmRecordStatus = " " Then Me.cmdDelete.Visible = True Me.cmdUndelete.Visible = False Me.dspRecordStatus = " " Me.dspRecordStatus.Visible = False Else Me.cmdDelete.Visible = False Me.cmdUndelete.Visible = True Me.dspRecordStatus = "DELETED" Me.dspRecordStatus.Visible = True End If End If Me![frmHotelPackage] = Me![dspHotelPackage] If IsNull(Me![frmHotelPackage]) Then Me.cmdMoney.Visible = False Me.cmdAdditionalPayment.Visible = False Else Me.cmdMoney.Caption = "Show Upgrades" Me.cmdMoney.Visible = True End If Me![frmReceptionLocation] = Me![dspReceptionLocation] Me![frmCakeType] = Me![dspCakeType] If IsNull(Me![frmReceptionGuests]) Then intGuests = 0 Else intGuests = Me![frmReceptionGuests] End If Me![dspTotalCharges] = Me![frmCakePrice] _ + Me![frmCoveringCharge] _ + Me![frmFlowersCharge] _ + Me![frmTieringCharge] _ + Me![frmFlatCharge] _ + Me![frmDeliveryCharge] Me![dspBalanceDue] = Me![dspTotalCharges] - Me![frmTotalPayments] If Me![frmCoveringCharge] > 0 Then blnCoveringCharge = True Else blnCoveringCharge = False End If If IsNull(Me.TierSets) Or Me.TierSets < 1 Then blnRaised = False Else blnRaised = True End If 'MsgBox "Trap 3 blnRaised=" & blnRaised, vbInformation intLayer = 0 End Sub
Private Sub Form_DataChange(ByVal Reason As Long) If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_DataChange" _ & vbCr & vbLf & "Reason=" & Reason Else End If End Sub
Private Sub Form_Deactivate() If gTrace Then 'gSequence = gSequence + 1 'MsgBox Me.Name & " " & gSequence & " Form_Deactivate" Else End If End Sub
Private Sub Form_Delete(Cancel As Integer) If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_Delete" Else End If End Sub
Private Sub Form_Filter(Cancel As Integer, FilterType As Integer) If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_Filter" _ & vbCr & vbLf & "FilterType=" & FilterType Else End If End Sub
Private Sub Form_GotFocus() If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_GotFocus" Else End If End Sub
Private Sub Form_Load() If gStartup Then Else gTrace = True gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_Load" End If End Sub
Private Sub Form_LostFocus() If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_LostFocus" Else End If End Sub
Private Sub Form_Open(Cancel As Integer) On Error GoTo Err_Form_Open Dim myFilter As String Dim myBride As String, myCakeType As String, myPackage As String
' MsgBox Me.Name & "Form_Open Current Order=" & Me.frmOrder
If Form.DataEntry Then ' New Order Else ' Order Inquiry If gTrace Then MsgBox ">>>Filter Values" _ & vbCr & vbLf & "Order=" & Forms![OrderFilter]![frmOrder] _ & vbCr & vbLf & "OrderDate=" & Forms![OrderFilter]![frmOrderDate] _ & vbCr & vbLf & "Bride=" & Forms![OrderFilter]![frmBridesLastName] _ & vbCr & vbLf & "Package=" & Forms![OrderFilter]![frmPackage] _ & vbCr & vbLf & "CakeType=" & Forms![OrderFilter]![frmCakeType] _ & vbCr & vbLf & "ReceptionDates=" & Forms![OrderFilter]![rptReceptionDateBegin] _ & "-" & Forms![OrderFilter]![rptReceptionDateEnd] Else End If If Not IsNull(Forms![OrderFilter]![rptReceptionDateBegin]) Then myFilter = "OrderHead.ReceptionDate >= #" _ & Forms!OrderFilter!rptReceptionDateBegin _ & "# And OrderHead.ReceptionDate <= #" _ & Forms!OrderFilter!rptReceptionDateEnd & "#" Else End If If Not IsNull(Forms![OrderFilter]![frmOrder]) Then If IsNumeric(Forms![OrderFilter]![frmOrder]) Then 'Me.Filter = "Order = " & Forms![OrderFilter]![frmOrder] myFilter = "Order = " & Forms![OrderFilter]![frmOrder] Else 'Me.Filter = "Order > 0" myFilter = "Order > 0" End If Else If IsNull(Forms![OrderFilter]![frmBridesLastName]) Then myBride = "*" Else myBride = Forms![OrderFilter]![frmBridesLastName] & "*" End If If myFilter = "" Then If myBride = "*" Then myFilter = "(IsEmpty(BridesLastName) or IsNull(BridesLastName) or BridesLastName like '" & myBride & "')" Else myFilter = "BridesLastName like '" & myBride & "'" End If Else If myBride = "*" Then myFilter = myFilter & " and (IsEmpty(BridesLastName) or IsNull(BridesLastName) or BridesLastName like '" & myBride & "')" Else myFilter = myFilter & " and BridesLastName like '" & myBride & "'" End If End If If IsNull(Forms![OrderFilter]![frmPackage]) Then myPackage = "*" Else myPackage = Forms![OrderFilter]![frmPackage] & "*" End If If myFilter = "" Then If myPackage = "*" Then myFilter = "(IsEmpty(HotelPackage) or IsNull(HotelPackage) or HotelPackage like '" & myPackage & "')" Else myFilter = "HotelPackage like '" & myPackage & "'" End If Else If myPackage = "*" Then myFilter = myFilter & " and (IsEmpty(HotelPackage) or IsNull(HotelPackage) or HotelPackage like '" & myPackage & "')" Else myFilter = myFilter & " and HotelPackage like '" & myPackage & "'" End If End If If IsNull(Forms![OrderFilter]![frmCakeType]) Then myCakeType = "*" Else myCakeType = Forms![OrderFilter]![frmCakeType] & "*" End If If myFilter = "" Then If myCakeType = "*" Then myFilter = "(IsEmpty(CakeType) or IsNull(CakeType) or CakeType like '" & myCakeType & "')" Else myFilter = "CakeType like '" & myCakeType & "'" End If Else If myCakeType = "*" Then myFilter = myFilter & " and (IsEmpty(CakeType) or IsNull(CakeType) or CakeType like '" & myCakeType & "')" Else myFilter = myFilter & " and CakeType like '" & myCakeType & "'" End If End If End If Me.Filter = myFilter Me.FilterOn = True 'Me![dspFilter] = Me.Filter Me.OrderBy = "Order DESC" Me.OrderByOn = True Form.Repaint End If
Private Sub Form_Undo(Cancel As Integer) If gTrace Then gSequence = gSequence + 1 MsgBox Me.Name & " " & gSequence & " Form_Undo" Else End If End Sub
Private Sub Form_Unload(Cancel As Integer) If gTrace Then 'gSequence = gSequence + 1 'MsgBox Me.Name & " " & gSequence & " Form_Unload" Else End If End Sub
Private Sub frmReceptionLocation_AfterUpdate() Dim CurConn As New ADODB.Connection, objRSLocation As New ADODB.Recordset Dim myReceptionLocation As String 'MsgBox Me.Name &" frmReceptionLocation_AfterUpdate", vbInformation If IsNull(Me![frmReceptionLocation]) Then myReceptionLocation = " " Else myReceptionLocation = Me![frmReceptionLocation] End If Me![dspReceptionLocation] = myReceptionLocation CurConn.Open CurrentProject.Connection objRSLocation.Open "Select * from [Location] where [Location] = '" & myReceptionLocation & "'", CurConn, adOpenKeyset, adLockOptimistic If objRSLocation.RecordCount = 1 Then Me![dspReceptionLocationID] = objRSLocation("LocationID") Me![frmReceptionContact] = objRSLocation("Contact") Me![frmReceptionContactTelephone] = objRSLocation("Telephone") Me![frmReceptionStreetAddr1] = objRSLocation("StreetAddr1") Me![frmReceptionStreetAddr2] = objRSLocation("StreetAddr2") Me![frmReceptionTown] = objRSLocation("Town") Me![frmReceptionState] = objRSLocation("State") Me![frmReceptionZipcode] = objRSLocation("Zipcode") Me![frmDeliveryContact] = objRSLocation("Contact") Me![frmDeliveryContactTelephone] = objRSLocation("Telephone") If blnPackage Then Me![frmDeliveryCharge] = 0 Else Me![frmDeliveryCharge] = objRSLocation("DeliveryCharge") End If Else Me![frmReceptionContact] = " " Me![frmReceptionContactTelephone] = " " Me![frmReceptionStreetAddr1] = " " Me![frmReceptionStreetAddr2] = " " Me![frmReceptionTown] = " " Me![frmReceptionState] = " " Me![frmReceptionZipcode] = " " Me![frmDeliveryContact] = " " Me![frmDeliveryContactTelephone] = " " Me![frmDeliveryCharge] = 0 End If objRSLocation.Close Set objRSLocation = Nothing CurConn.Close Set CurConn = Nothing Me![dspTotalCharges] = Me![frmCakePrice] _ + Me![frmCoveringCharge] _ + Me![frmFlowersCharge] _ + Me![frmTieringCharge] _ + Me![frmFlatCharge] _ + Me![frmDeliveryCharge] Me![dspBalanceDue] = Me![dspTotalCharges] - Me![frmTotalPayments] Form.Repaint End Sub
Private Sub frmReceptionLocation_BeforeUpdate(Cancel As Integer) Dim CurConn As New ADODB.Connection, objRSLocation As New ADODB.Recordset Dim myReceptionLocation As String 'MsgBox Me.Name &" frmReceptionLocation_BeforeUpdate", vbInformation If IsNull(Me![frmReceptionLocation]) Then myReceptionLocation = " " Else myReceptionLocation = Me![frmReceptionLocation] End If Me![dspReceptionLocation] = myReceptionLocation CurConn.Open CurrentProject.Connection objRSLocation.Open "Select * from [Location] where [Location] = '" & myReceptionLocation & "'", CurConn, adOpenKeyset, adLockOptimistic If objRSLocation.RecordCount = 1 Then Me![dspReceptionLocationID] = objRSLocation("LocationID") Me![frmReceptionContact] = objRSLocation("Contact") Me![frmReceptionContactTelephone] = objRSLocation("Telephone") Me![frmReceptionStreetAddr1] = objRSLocation("StreetAddr1") Me![frmReceptionStreetAddr2] = objRSLocation("StreetAddr2") Me![frmReceptionTown] = objRSLocation("Town") Me![frmReceptionState] = objRSLocation("State") Me![frmReceptionZipcode] = objRSLocation("Zipcode") Me![frmDeliveryContact] = objRSLocation("Contact") Me![frmDeliveryContactTelephone] = objRSLocation("Telephone") If blnPackage Then Me![frmDeliveryCharge] = 0 Else Me![frmDeliveryCharge] = objRSLocation("DeliveryCharge") End If Else Me![frmReceptionContact] = " " Me![frmReceptionContactTelephone] = " " Me![frmReceptionStreetAddr1] = " " Me![frmReceptionStreetAddr2] = " " Me![frmReceptionTown] = " " Me![frmReceptionState] = " " Me![frmReceptionZipcode] = " " Me![frmDeliveryContact] = " " Me![frmDeliveryContactTelephone] = " " Me![frmDeliveryCharge] = 0 End If objRSLocation.Close Set objRSLocation = Nothing CurConn.Close Set CurConn = Nothing Me![dspTotalCharges] = Me![frmCakePrice] _ + Me![frmCoveringCharge] _ + Me![frmFlowersCharge] _ + Me![frmTieringCharge] _ + Me![frmFlatCharge] _ + Me![frmDeliveryCharge] Me![dspBalanceDue] = Me![dspTotalCharges] - Me![frmTotalPayments] Form.Repaint End Sub
Private Sub frmStacked_AfterUpdate() If IsNull(Me![frmTierSets]) _ Or Me![frmTierSets] < 1 Then blnRaised = False Else blnRaised = True End If End Sub
Private Sub frmStacked_BeforeUpdate(Cancel As Integer) If IsNull(Me![frmTierSets]) _ Or Me![frmTierSets] < 1 Then blnRaised = False Else blnRaised = True End If End Sub
Private Sub cmdLocations_Click() On Error GoTo Err_cmdLocations_Click
Dim stDocName As String Dim stLinkCriteria As String
ption Compare Database ' Use database order for string comparisons. Option Explicit ' Requires variables to be declared before they are used.
Function OpenForms(strFormName As String) As Integer ' This function is used in the onClick event of command buttons that ' open forms on the Main Switchboard. Using a function is more efficient ' than repeating the same code in multiple event procedures. On Error GoTo Err_OpenForms
I have created one MS-Access application. This application will reside on server. The application will be used by many users from there local PC. I want to allow them access to only forms of application and they should not able to inerfere in database tables, queries form designing etc. How can I accomplish this task? In short, only I should able to modify the application and all other should be able to enter the data in form and nothing else. Please help me out...
This works fine, however I noticed that if the path for the specific document contains a space, it does not open up successfully but i get a msgbox saying "the document name or path are not valid"
hi.. i've developed an application in access... and i want to distribute it to some of my collegues who doesnt have an access installed in it.. can anyone please help me in doing this.. i know about runtime.. but i wanna pack my application in disks or cd...
Is there a way to troubleshoot why my application is all of a sudden starting to hang for aobut 10 seconds every few minutes. It is freezing up the entire PC as well as itself.
Wow, been a while since I've had to ask a question here. But I've been looking for a solution (if it's possible) to restart the open database app I've been working on.
I have a form in which I create and set a database property. In order for it to take affect, the database has to be reopened. Sure, this can be done manually, but I'd like it to be automatic. Just like when you use the compact and repair tool; the database closes and reopens. I've tried the OpenCurrentDatabase method, but of course, I can't close the current one before the code runs.
Hi I have succsefully used the code suggested on theis excellent forum to boot user from the db to repair it. It is FE/BE set up and the ONTIMER on the login form is used to chuck people off over the network.
My ug is: I like to give people the waring before I chuck them off, but sometimes when they are using another application with the db running in the background they dont get the message, therefore dont click ok so my Code wont carry on and Quit application when I want it to.
The code is trapped in
MsgBox "Please finish what your doin, as the db will shut down", vbinformation
Is there any way I can make my code bypass this if they user hasnt clicked ok?
I have a shared 2000 db and for the last few days someone has been leaving it open. In '97 you could open the .ldb file and see who it was, is there a way to find out in 2000?
Also, I have seen something on remotely removing users who leave the application open but can't find it now. Does anyone know how this is done? The data must be refeshed daily and hasn't been for the last four days due to this lock.