Command button to open form and find record

S

Song Su

Access 2007

I have a continous form frmIncomplete. I put a command button in detailed
section. When clicked, I want to open frmMaster and locate the same record
by ID (primary key AutoNumber).

Private Sub cmdEdit_Click()
DoCmd.OpenForm "frmMaster", , , "[ID] = " & Me![ID]
End Sub

Above code will only display the record and filtered out rest. I don't want
to filter out. I just want to locate and display that record. Before
clicking the button, frmMaster may or may not already open. I use tabbed
browsing and I don't want to hide frmIncomplete form. How to do that?
Thanks.
 
A

Allen Browne

Song Su said:
I have a continous form frmIncomplete. I put a command button in detailed
section. When clicked, I want to open frmMaster and locate the same record
by ID (primary key AutoNumber).

Private Sub cmdEdit_Click()
DoCmd.OpenForm "frmMaster", , , "[ID] = " & Me![ID]
End Sub

Above code will only display the record and filtered out rest. I don't
want to filter out. I just want to locate and display that record. Before
clicking the button, frmMaster may or may not already open. I use tabbed
browsing and I don't want to hide frmIncomplete form. How to do that?

There are so many scenarios this could need to cover that it's not a simple
piece of code. For example:
- frmMaster could be open, but filtered in such as way that the desired
record is not present.
- frmMaster could be open, and dirty with a record that cannot be saved, so
it cannot move to the desired record.
- The target record may not exist, in which case you have to define the
response you want (e.g. no opening the form, or opening it to a new record.)
- The target form could be open in DataEntry mode.
- The current record could be a new (unsaved) entry, so it won't be found in
the target unless you explicitly save it first.

Below find some code that addresses some if these things. Paste it into a
new standard module, along with the error handler from here (or substitute
your own):
http://allenbrowne.com/ser-23a.html

Your example would then call the code like this:
Private Sub cmdEdit_Click()
If Me.Dirty Then Me.Dirty = False
Call OpenFormTo("frmMaster", "ID = " & Nz(Me.ID,0), IsNull(Me.ID))
End Sub

This is essentially what the code does:
a) Opens the form if it is not already open.
b) Saves any edits in the target form.
c) Sends the target form to a new record if the 3rd argument is true or the
2nd argument is blank.
d) Calls Move2Record() to find the desired record.
e) Tries to match the record.
f) If not found, turns the filter off and tries again.

Watch the line breaks: the newsreader will probably mess up the longer
lines.

Hope that's useful for you Song Su. Note that you will need to do your own
debugging and testing here.

--
Allen Browne - Microsoft MVP. Perth, Western Australia

Reply to group, rather than allenbrowne at mvps dot org.

-----------code starts-------------
Public Function OpenFormTo(strForm As String, strWhere As String, Optional
bGotoNewRecord As Boolean, _
Optional strMsg As String, Optional strOpenArgs As String) As Boolean
On Error GoTo Err_OpenFormTo
'Purpose: Open a form loaded with all records, but displaying a
particular one.
'Return: True if successful.
'Arguments: strForm = Name of form.
' strWhere = Where string to match.
' bGotoNewRecord = what to do if not found. False = give
error. True = display new.
' strMsg = string to append any error message to.
'Usage: Call OpenFormTo("frmClient", "ClientID = 64",
IsNull(Me.ClientID))
Dim frm As Form
Dim bFormWasOpen As Boolean

'Get the form open.
If IsLoaded(strForm) Then
bFormWasOpen = True
Else
If strOpenArgs <> vbNullString Then
DoCmd.OpenForm strForm, WindowMode:=acHidden,
OpenArgs:=strOpenArgs
Else
DoCmd.OpenForm strForm, WindowMode:=acHidden
End If
End If
Set frm = Forms(strForm)

'Move to the desired record.
If Len(strWhere) = 0& Then
frm.SetFocus
If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
OpenFormTo = True
Else
If Move2Record(frm, strWhere, bGotoNewRecord, strMsg) Then
OpenFormTo = True
ElseIf Not bFormWasOpen Then
If strMsg <> vbNullString Then
MsgBox strMsg, vbExclamation, "Not opened."
End If
DoCmd.Close acForm, strForm
End If
End If

Exit_OpenFormTo:
Set frm = Nothing
Exit Function

Err_OpenFormTo:
Select Case Err.Number
Case 2046& 'Can't go to record.
'do nothing
Case Else
Call LogError(Err.Number, Err.Description, conMod & ".OpenFormTo",
Left$(strForm & ": " & strWhere, 255))
End Select
Resume Exit_OpenFormTo
End Function

Public Function HasProperty(obj As Object, strPropName As String) As Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant

On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function

Public Function Move2Record(frm As Form, strWhere As String, Optional
bGotoNewRecord As Boolean, Optional strMsg As String) As Boolean
On Error GoTo Err_Move2Record
'Purpose: Move the bound form to the record matching the Where string.
'Return: True if successful.
'Arguments: frm = reference to the form.
' strWhere = the WHERE clause to match.
Dim rs As DAO.Recordset

If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If

If bGotoNewRecord Then
'Go to a new record.
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
If frm.AllowAdditions Then
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
Move2Record = True
Else
strMsg = strMsg & "Form does not allow additions." & vbCrLf
End If
Else
'Find an existing record.
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
If rs.NoMatch Then
If frm.FilterOn Then 'Not found: try again without the
filter.
Set rs = Nothing
frm.FilterOn = False
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
End If
End If

If rs.NoMatch Then
strMsg = strMsg & "Unable to locate the record." & vbCrLf
Else
'Display the record.
frm.Bookmark = rs.Bookmark
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
Move2Record = True
End If
End If

Exit_Move2Record:
Set rs = Nothing
Exit Function

Err_Move2Record:
If Err.Number = 2449 Then 'Invalid expression: can't set focus to form
(perhaps subform?)
Resume Next
Else
Call LogError(Err.Number, Err.Description, conMod & ".Move2Record",
"Form = " & frm.Name & "; Where = " & strWhere)
Resume Exit_Move2Record
End If
End Function
-----------code ends-------------
 
S

Song Su

All the senarios do not present in my situation:

-frmMaster has no filter
-frmMaster record has to be saved before opening my frmIncomplete
-target record always present in frmMaster form as they use same record
source
-I do not use data entry mode in target from
-current record is never be new as Add is disabled in curent from

So, simple code would do without standard module. How to do that?

In the mean time, I want to learn from your very robustic standard module as
well. Upon compiling, close to top, it pointed on If IsLoaded(strFrom) and
it says sub or function not defined. I don't know how to debug this.

Song Su

Allen Browne said:
"Song Su" wrote in message
I have a continous form frmIncomplete. I put a command button in detailed
section. When clicked, I want to open frmMaster and locate the same
record by ID (primary key AutoNumber).

Private Sub cmdEdit_Click()
DoCmd.OpenForm "frmMaster", , , "[ID] = " & Me![ID]
End Sub

Above code will only display the record and filtered out rest. I don't
want to filter out. I just want to locate and display that record. Before
clicking the button, frmMaster may or may not already open. I use tabbed
browsing and I don't want to hide frmIncomplete form. How to do that?

There are so many scenarios this could need to cover that it's not a
simple piece of code. For example:
- frmMaster could be open, but filtered in such as way that the desired
record is not present.
- frmMaster could be open, and dirty with a record that cannot be saved,
so it cannot move to the desired record.
- The target record may not exist, in which case you have to define the
response you want (e.g. no opening the form, or opening it to a new
record.)
- The target form could be open in DataEntry mode.
- The current record could be a new (unsaved) entry, so it won't be found
in the target unless you explicitly save it first.

Below find some code that addresses some if these things. Paste it into a
new standard module, along with the error handler from here (or substitute
your own):
http://allenbrowne.com/ser-23a.html

Your example would then call the code like this:
Private Sub cmdEdit_Click()
If Me.Dirty Then Me.Dirty = False
Call OpenFormTo("frmMaster", "ID = " & Nz(Me.ID,0), IsNull(Me.ID))
End Sub

This is essentially what the code does:
a) Opens the form if it is not already open.
b) Saves any edits in the target form.
c) Sends the target form to a new record if the 3rd argument is true or
the 2nd argument is blank.
d) Calls Move2Record() to find the desired record.
e) Tries to match the record.
f) If not found, turns the filter off and tries again.

Watch the line breaks: the newsreader will probably mess up the longer
lines.

Hope that's useful for you Song Su. Note that you will need to do your own
debugging and testing here.

--
Allen Browne - Microsoft MVP. Perth, Western Australia

Reply to group, rather than allenbrowne at mvps dot org.

-----------code starts-------------
Public Function OpenFormTo(strForm As String, strWhere As String, Optional
bGotoNewRecord As Boolean, _
Optional strMsg As String, Optional strOpenArgs As String) As Boolean
On Error GoTo Err_OpenFormTo
'Purpose: Open a form loaded with all records, but displaying a
particular one.
'Return: True if successful.
'Arguments: strForm = Name of form.
' strWhere = Where string to match.
' bGotoNewRecord = what to do if not found. False = give
error. True = display new.
' strMsg = string to append any error message to.
'Usage: Call OpenFormTo("frmClient", "ClientID = 64",
IsNull(Me.ClientID))
Dim frm As Form
Dim bFormWasOpen As Boolean

'Get the form open.
If IsLoaded(strForm) Then
bFormWasOpen = True
Else
If strOpenArgs <> vbNullString Then
DoCmd.OpenForm strForm, WindowMode:=acHidden,
OpenArgs:=strOpenArgs
Else
DoCmd.OpenForm strForm, WindowMode:=acHidden
End If
End If
Set frm = Forms(strForm)

'Move to the desired record.
If Len(strWhere) = 0& Then
frm.SetFocus
If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
OpenFormTo = True
Else
If Move2Record(frm, strWhere, bGotoNewRecord, strMsg) Then
OpenFormTo = True
ElseIf Not bFormWasOpen Then
If strMsg <> vbNullString Then
MsgBox strMsg, vbExclamation, "Not opened."
End If
DoCmd.Close acForm, strForm
End If
End If

Exit_OpenFormTo:
Set frm = Nothing
Exit Function

Err_OpenFormTo:
Select Case Err.Number
Case 2046& 'Can't go to record.
'do nothing
Case Else
Call LogError(Err.Number, Err.Description, conMod & ".OpenFormTo",
Left$(strForm & ": " & strWhere, 255))
End Select
Resume Exit_OpenFormTo
End Function

Public Function HasProperty(obj As Object, strPropName As String) As
Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant

On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function

Public Function Move2Record(frm As Form, strWhere As String, Optional
bGotoNewRecord As Boolean, Optional strMsg As String) As Boolean
On Error GoTo Err_Move2Record
'Purpose: Move the bound form to the record matching the Where
string.
'Return: True if successful.
'Arguments: frm = reference to the form.
' strWhere = the WHERE clause to match.
Dim rs As DAO.Recordset

If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If

If bGotoNewRecord Then
'Go to a new record.
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
If frm.AllowAdditions Then
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
Move2Record = True
Else
strMsg = strMsg & "Form does not allow additions." & vbCrLf
End If
Else
'Find an existing record.
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
If rs.NoMatch Then
If frm.FilterOn Then 'Not found: try again without the
filter.
Set rs = Nothing
frm.FilterOn = False
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
End If
End If

If rs.NoMatch Then
strMsg = strMsg & "Unable to locate the record." & vbCrLf
Else
'Display the record.
frm.Bookmark = rs.Bookmark
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
Move2Record = True
End If
End If

Exit_Move2Record:
Set rs = Nothing
Exit Function

Err_Move2Record:
If Err.Number = 2449 Then 'Invalid expression: can't set focus to
form (perhaps subform?)
Resume Next
Else
Call LogError(Err.Number, Err.Description, conMod & ".Move2Record",
"Form = " & frm.Name & "; Where = " & strWhere)
Resume Exit_Move2Record
End If
End Function
-----------code ends-------------
 
A

Allen Browne

Sorry: missed that function

Here it is:
Function IsLoaded(strName As String, Optional ObjType As AcObjectType =
acForm) As Boolean
' Returns True if the specified object is open.
IsLoaded = (SysCmd(acSysCmdGetObjectState, ObjType, strName) <> 0)
End Function

--
Allen Browne - Microsoft MVP. Perth, Western Australia

Reply to group, rather than allenbrowne at mvps dot org.

Song Su said:
All the senarios do not present in my situation:

-frmMaster has no filter
-frmMaster record has to be saved before opening my frmIncomplete
-target record always present in frmMaster form as they use same record
source
-I do not use data entry mode in target from
-current record is never be new as Add is disabled in curent from

So, simple code would do without standard module. How to do that?

In the mean time, I want to learn from your very robustic standard module
as well. Upon compiling, close to top, it pointed on If IsLoaded(strFrom)
and it says sub or function not defined. I don't know how to debug this.

Song Su

Allen Browne said:
"Song Su" wrote in message
I have a continous form frmIncomplete. I put a command button in
detailed section. When clicked, I want to open frmMaster and locate the
same record by ID (primary key AutoNumber).

Private Sub cmdEdit_Click()
DoCmd.OpenForm "frmMaster", , , "[ID] = " & Me![ID]
End Sub

Above code will only display the record and filtered out rest. I don't
want to filter out. I just want to locate and display that record.
Before clicking the button, frmMaster may or may not already open. I use
tabbed browsing and I don't want to hide frmIncomplete form. How to do
that?

There are so many scenarios this could need to cover that it's not a
simple piece of code. For example:
- frmMaster could be open, but filtered in such as way that the desired
record is not present.
- frmMaster could be open, and dirty with a record that cannot be saved,
so it cannot move to the desired record.
- The target record may not exist, in which case you have to define the
response you want (e.g. no opening the form, or opening it to a new
record.)
- The target form could be open in DataEntry mode.
- The current record could be a new (unsaved) entry, so it won't be found
in the target unless you explicitly save it first.

Below find some code that addresses some if these things. Paste it into a
new standard module, along with the error handler from here (or
substitute your own):
http://allenbrowne.com/ser-23a.html

Your example would then call the code like this:
Private Sub cmdEdit_Click()
If Me.Dirty Then Me.Dirty = False
Call OpenFormTo("frmMaster", "ID = " & Nz(Me.ID,0), IsNull(Me.ID))
End Sub

This is essentially what the code does:
a) Opens the form if it is not already open.
b) Saves any edits in the target form.
c) Sends the target form to a new record if the 3rd argument is true or
the 2nd argument is blank.
d) Calls Move2Record() to find the desired record.
e) Tries to match the record.
f) If not found, turns the filter off and tries again.

Watch the line breaks: the newsreader will probably mess up the longer
lines.

Hope that's useful for you Song Su. Note that you will need to do your
own debugging and testing here.

--
Allen Browne - Microsoft MVP. Perth, Western Australia

Reply to group, rather than allenbrowne at mvps dot org.

-----------code starts-------------
Public Function OpenFormTo(strForm As String, strWhere As String,
Optional bGotoNewRecord As Boolean, _
Optional strMsg As String, Optional strOpenArgs As String) As Boolean
On Error GoTo Err_OpenFormTo
'Purpose: Open a form loaded with all records, but displaying a
particular one.
'Return: True if successful.
'Arguments: strForm = Name of form.
' strWhere = Where string to match.
' bGotoNewRecord = what to do if not found. False = give
error. True = display new.
' strMsg = string to append any error message to.
'Usage: Call OpenFormTo("frmClient", "ClientID = 64",
IsNull(Me.ClientID))
Dim frm As Form
Dim bFormWasOpen As Boolean

'Get the form open.
If IsLoaded(strForm) Then
bFormWasOpen = True
Else
If strOpenArgs <> vbNullString Then
DoCmd.OpenForm strForm, WindowMode:=acHidden,
OpenArgs:=strOpenArgs
Else
DoCmd.OpenForm strForm, WindowMode:=acHidden
End If
End If
Set frm = Forms(strForm)

'Move to the desired record.
If Len(strWhere) = 0& Then
frm.SetFocus
If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
OpenFormTo = True
Else
If Move2Record(frm, strWhere, bGotoNewRecord, strMsg) Then
OpenFormTo = True
ElseIf Not bFormWasOpen Then
If strMsg <> vbNullString Then
MsgBox strMsg, vbExclamation, "Not opened."
End If
DoCmd.Close acForm, strForm
End If
End If

Exit_OpenFormTo:
Set frm = Nothing
Exit Function

Err_OpenFormTo:
Select Case Err.Number
Case 2046& 'Can't go to record.
'do nothing
Case Else
Call LogError(Err.Number, Err.Description, conMod & ".OpenFormTo",
Left$(strForm & ": " & strWhere, 255))
End Select
Resume Exit_OpenFormTo
End Function

Public Function HasProperty(obj As Object, strPropName As String) As
Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant

On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function

Public Function Move2Record(frm As Form, strWhere As String, Optional
bGotoNewRecord As Boolean, Optional strMsg As String) As Boolean
On Error GoTo Err_Move2Record
'Purpose: Move the bound form to the record matching the Where
string.
'Return: True if successful.
'Arguments: frm = reference to the form.
' strWhere = the WHERE clause to match.
Dim rs As DAO.Recordset

If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If

If bGotoNewRecord Then
'Go to a new record.
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
If frm.AllowAdditions Then
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
Move2Record = True
Else
strMsg = strMsg & "Form does not allow additions." & vbCrLf
End If
Else
'Find an existing record.
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
If rs.NoMatch Then
If frm.FilterOn Then 'Not found: try again without the
filter.
Set rs = Nothing
frm.FilterOn = False
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
End If
End If

If rs.NoMatch Then
strMsg = strMsg & "Unable to locate the record." & vbCrLf
Else
'Display the record.
frm.Bookmark = rs.Bookmark
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
Move2Record = True
End If
End If

Exit_Move2Record:
Set rs = Nothing
Exit Function

Err_Move2Record:
If Err.Number = 2449 Then 'Invalid expression: can't set focus to
form (perhaps subform?)
Resume Next
Else
Call LogError(Err.Number, Err.Description, conMod &
".Move2Record", "Form = " & frm.Name & "; Where = " & strWhere)
Resume Exit_Move2Record
End If
End Function
-----------code ends-------------
 
S

Song Su

In addition to IsLoaded error in my previous posting, another error is
conMod - not defined.
If I commented out these lines, everything works fine.

Allen Browne said:
Song Su said:
I have a continous form frmIncomplete. I put a command button in detailed
section. When clicked, I want to open frmMaster and locate the same
record by ID (primary key AutoNumber).

Private Sub cmdEdit_Click()
DoCmd.OpenForm "frmMaster", , , "[ID] = " & Me![ID]
End Sub

Above code will only display the record and filtered out rest. I don't
want to filter out. I just want to locate and display that record. Before
clicking the button, frmMaster may or may not already open. I use tabbed
browsing and I don't want to hide frmIncomplete form. How to do that?

There are so many scenarios this could need to cover that it's not a
simple piece of code. For example:
- frmMaster could be open, but filtered in such as way that the desired
record is not present.
- frmMaster could be open, and dirty with a record that cannot be saved,
so it cannot move to the desired record.
- The target record may not exist, in which case you have to define the
response you want (e.g. no opening the form, or opening it to a new
record.)
- The target form could be open in DataEntry mode.
- The current record could be a new (unsaved) entry, so it won't be found
in the target unless you explicitly save it first.

Below find some code that addresses some if these things. Paste it into a
new standard module, along with the error handler from here (or substitute
your own):
http://allenbrowne.com/ser-23a.html

Your example would then call the code like this:
Private Sub cmdEdit_Click()
If Me.Dirty Then Me.Dirty = False
Call OpenFormTo("frmMaster", "ID = " & Nz(Me.ID,0), IsNull(Me.ID))
End Sub

This is essentially what the code does:
a) Opens the form if it is not already open.
b) Saves any edits in the target form.
c) Sends the target form to a new record if the 3rd argument is true or
the 2nd argument is blank.
d) Calls Move2Record() to find the desired record.
e) Tries to match the record.
f) If not found, turns the filter off and tries again.

Watch the line breaks: the newsreader will probably mess up the longer
lines.

Hope that's useful for you Song Su. Note that you will need to do your own
debugging and testing here.

--
Allen Browne - Microsoft MVP. Perth, Western Australia

Reply to group, rather than allenbrowne at mvps dot org.

-----------code starts-------------
Public Function OpenFormTo(strForm As String, strWhere As String, Optional
bGotoNewRecord As Boolean, _
Optional strMsg As String, Optional strOpenArgs As String) As Boolean
On Error GoTo Err_OpenFormTo
'Purpose: Open a form loaded with all records, but displaying a
particular one.
'Return: True if successful.
'Arguments: strForm = Name of form.
' strWhere = Where string to match.
' bGotoNewRecord = what to do if not found. False = give
error. True = display new.
' strMsg = string to append any error message to.
'Usage: Call OpenFormTo("frmClient", "ClientID = 64",
IsNull(Me.ClientID))
Dim frm As Form
Dim bFormWasOpen As Boolean

'Get the form open.
If IsLoaded(strForm) Then
bFormWasOpen = True
Else
If strOpenArgs <> vbNullString Then
DoCmd.OpenForm strForm, WindowMode:=acHidden,
OpenArgs:=strOpenArgs
Else
DoCmd.OpenForm strForm, WindowMode:=acHidden
End If
End If
Set frm = Forms(strForm)

'Move to the desired record.
If Len(strWhere) = 0& Then
frm.SetFocus
If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
OpenFormTo = True
Else
If Move2Record(frm, strWhere, bGotoNewRecord, strMsg) Then
OpenFormTo = True
ElseIf Not bFormWasOpen Then
If strMsg <> vbNullString Then
MsgBox strMsg, vbExclamation, "Not opened."
End If
DoCmd.Close acForm, strForm
End If
End If

Exit_OpenFormTo:
Set frm = Nothing
Exit Function

Err_OpenFormTo:
Select Case Err.Number
Case 2046& 'Can't go to record.
'do nothing
Case Else
Call LogError(Err.Number, Err.Description, conMod & ".OpenFormTo",
Left$(strForm & ": " & strWhere, 255))
End Select
Resume Exit_OpenFormTo
End Function

Public Function HasProperty(obj As Object, strPropName As String) As
Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant

On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function

Public Function Move2Record(frm As Form, strWhere As String, Optional
bGotoNewRecord As Boolean, Optional strMsg As String) As Boolean
On Error GoTo Err_Move2Record
'Purpose: Move the bound form to the record matching the Where
string.
'Return: True if successful.
'Arguments: frm = reference to the form.
' strWhere = the WHERE clause to match.
Dim rs As DAO.Recordset

If HasProperty(frm, "Dirty") Then
If frm.Dirty Then
frm.Dirty = False
End If
End If

If bGotoNewRecord Then
'Go to a new record.
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
If frm.AllowAdditions Then
If Not frm.NewRecord Then
RunCommand acCmdRecordsGoToNew
End If
Move2Record = True
Else
strMsg = strMsg & "Form does not allow additions." & vbCrLf
End If
Else
'Find an existing record.
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
If rs.NoMatch Then
If frm.FilterOn Then 'Not found: try again without the
filter.
Set rs = Nothing
frm.FilterOn = False
Set rs = frm.RecordsetClone
rs.FindFirst strWhere
End If
End If

If rs.NoMatch Then
strMsg = strMsg & "Unable to locate the record." & vbCrLf
Else
'Display the record.
frm.Bookmark = rs.Bookmark
If Not frm.Visible Then
frm.Visible = True
End If
frm.SetFocus
Move2Record = True
End If
End If

Exit_Move2Record:
Set rs = Nothing
Exit Function

Err_Move2Record:
If Err.Number = 2449 Then 'Invalid expression: can't set focus to
form (perhaps subform?)
Resume Next
Else
Call LogError(Err.Number, Err.Description, conMod & ".Move2Record",
"Form = " & frm.Name & "; Where = " & strWhere)
Resume Exit_Move2Record
End If
End Function
-----------code ends-------------
 
A

Allen Browne

conMod is meant to hold the name of the module (for the error handling.)
So, if you saved this in a module named basSongSu, at the top of the module
(immediately below the Option statements), add:
Private Const conMod = "basSongSu"
 
S

Song Su

Delaaa! No error. Everything works perfect. I can use the module to my other
applications. Thank you very much, Allen Browne. You are great!
 
J

jogger

????? "Song Su said:
Access 2007

I have a continous form frmIncomplete. I put a command button in detailed
section. When clicked, I want to open frmMaster and locate the same record
by ID (primary key AutoNumber).

Private Sub cmdEdit_Click()
DoCmd.OpenForm "frmMaster", , , "[ID] = " & Me![ID]
End Sub

Above code will only display the record and filtered out rest. I don't
want to filter out. I just want to locate and display that record. Before
clicking the button, frmMaster may or may not already open. I use tabbed
browsing and I don't want to hide frmIncomplete form. How to do that?
Thanks.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top