Solved

ListView Slow Unloading

Posted on 2001-08-18
31
373 Views
Last Modified: 2012-08-14
'I have the following code where i load records(about 40,000) from access Table


Dim itm As ListItem
DIM FilesRs as recordset
.....
.....
.....

'When  i wan't to unload form2 i use the following Code
...
...
Set itm = Nothing
Set FilesRs = Nothing
Unload form2
'after finishing  the previous line  system hangs for     about 3-5 minutes .
'what should i do to make this form unload completly and quickly



Dim C As Control
For Each C In Form2.Controls
Debug.Print C.Name
Set C = Nothing
Next
Set Form2 = Nothing
End



Thanks
0
Comment
Question by:Balshe
  • 15
  • 6
  • 5
  • +4
31 Comments
 
LVL 12

Expert Comment

by:roverm
ID: 6401778
How do you load the recordset into the listview?
Want kind of recordset (ForwardOnly, KeySet...) ?

First impression:
FilesRs.Close 'add this line
Set FilesRs = nothing
Unload Form2

D'Mzzl!
RoverM
0
 
LVL 17

Expert Comment

by:smozgur
ID: 6401800
Compact your database file.

suat
0
 
LVL 17

Expert Comment

by:smozgur
ID: 6401807
When i saw this kind of trouble last time, my database file became 36 MB from 3MB. So it could be possible reason to load or unload it into recordset or other object.

suat

0
 
LVL 17

Expert Comment

by:smozgur
ID: 6401815
I mean reason of "slow" load or unload.

(I think i am getting old :))

suat
0
 
LVL 1

Author Comment

by:Balshe
ID: 6401827
original dataBase File is 900 KB
Grow to become 1.2MB not much
0
 
LVL 1

Author Comment

by:Balshe
ID: 6401833
original dataBase File is 900 KB
Grow to become 1.2MB not much
0
 
LVL 17

Expert Comment

by:smozgur
ID: 6401844
hmm, yes. It is not the reason. Actually it was the first reason i though.

So i think you could better answer the questions of the roverm to make it is clear for us.

suat

0
 
LVL 17

Expert Comment

by:smozgur
ID: 6401847
to roverm:

sorry for unnecessary "the". You know my English :)

suat
0
 
LVL 1

Author Comment

by:Balshe
ID: 6401850
original dataBase File is 900 KB
Grow to become 1.2MB not much
0
 
LVL 1

Author Comment

by:Balshe
ID: 6401856
original dataBase File is 900 KB
Grow to become 1.2MB not much
0
 
LVL 1

Author Comment

by:Balshe
ID: 6401858
Private Sub FIllList(Lv As ListView)
Dim Clm As ColumnHeader
Dim itm As ListItem
Dim Rs As Recordset
Dim St As String
Dim SearchOption As String
Dim Mtch As String
If Check1.Value = vbChecked Then
    Mtch = ""
ElseIf Check1.Value = vbUnchecked Then
    Mtch = "*"
End If

If Option1 Then
    SearchOption = "AND"
Else
    SearchOption = "OR"
End If

St = ""
Db.Execute "Update files set name='" & St & "' where name =null"
Db.Execute "Update files set description='" & St & "' where description =null"
Db.Execute "Update files set version='" & St & "' where version =null"

Lv.ListItems.Clear
Lv.ColumnHeaders.Clear
Lv.View = lvwReport
Lv.LabelEdit = lvwManual
 
 Set Clm = Lv.ColumnHeaders.Add(, , "Name")
 Set Clm = Lv.ColumnHeaders.Add(, , "Description")
 Set Clm = Lv.ColumnHeaders.Add(, , "Date")
 Set Clm = Lv.ColumnHeaders.Add(, , "Version")
 Set Clm = Lv.ColumnHeaders.Add(, , "Cd No")
'1
If Chk1(0).Value = vbChecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbChecked Then
Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'" & SearchOption & "  DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'" & SearchOption & "  DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#" & SearchOption & " version like '" & Trim(Text2(3).Text) & "'")


'2
ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbUnchecked Then

Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'" & SearchOption & "  DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'" & SearchOption & "  DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#")

'3
ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbUnchecked And Chk1(3).Value = vbUnchecked Then

Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'" & SearchOption & " DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'")
'4
ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbUnchecked And Chk1(3).Value = vbChecked Then

Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'" & SearchOption & " version like '" & Trim(Text2(3).Text) & "'")
'5
ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbUnchecked Then

Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'" & SearchOption & " DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#")
'6
ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbChecked Then

Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'" & SearchOption & " DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#" & SearchOption & " version like '" & Trim(Text2(3).Text) & "'")

'ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbChecked Then


'7
ElseIf Chk1(0).Value = vbUnchecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbChecked Then

Set Rs = Db.OpenRecordset("select * from files WHERE   DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'" & SearchOption & " DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#" & SearchOption & " version like '" & Trim(Text2(3).Text) & "'")

'8
ElseIf Chk1(0).Value = vbUnchecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbUnchecked And Chk1(3).Value = vbChecked Then

Set Rs = Db.OpenRecordset("select * from files where  DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'" & SearchOption & "  version like '" & Trim(Text2(3).Text) & "'")

'9
ElseIf Chk1(0).Value = vbUnchecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbUnchecked Then

Set Rs = Db.OpenRecordset("select * from files where   DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'" & SearchOption & " DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#")

'10
ElseIf Chk1(0).Value = vbUnchecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbChecked Then

Set Rs = Db.OpenRecordset("select * from files where   DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#" & SearchOption & " version like '" & Trim(Text2(3).Text) & "'")

'11
ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbUnchecked And Chk1(3).Value = vbUnchecked Then

Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'")

'12
ElseIf Chk1(0).Value = vbUnchecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbUnchecked And Chk1(3).Value = vbUnchecked Then

Set Rs = Db.OpenRecordset("select * from files where   DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'")
'13
ElseIf Chk1(0).Value = vbUnchecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbChecked And Chk1(3).Value = vbUnchecked Then
Set Rs = Db.OpenRecordset("select * from files where  DATE= #" & Format(Text2(2).Text, "mm/dd/yyyy") & "#")
'14
ElseIf Chk1(0).Value = vbUnchecked And Chk1(1).Value = vbUnchecked And Chk1(2).Value = vbUnchecked And Chk1(3).Value = vbChecked Then
Set Rs = Db.OpenRecordset("select * from files where  version like '" & Trim(Text2(3).Text) & "'")

'15
ElseIf Chk1(0).Value = vbChecked And Chk1(1).Value = vbChecked And Chk1(2).Value = vbUnchecked And Chk1(3).Value = vbChecked Then
Set Rs = Db.OpenRecordset("select * from files where  [Name] like '" & Mtch & Trim(Text2(0).Text) & Mtch & "'" & SearchOption & "  DESCRIPTION LIKE '" & Mtch & Trim(Text2(1).Text) & Mtch & "'" & SearchOption & "  version like '" & Trim(Text2(3).Text) & "'")

End If







'Set Rs = Db.OpenRecordset("select * from files where  Name like=" & Val(CDRNO))
Lv.ListItems.Clear
If Rs.EOF Then Exit Sub
Rs.MoveLast
Rs.MoveFirst
Form2.Caption = "Find Files ..." & "Matches ..  " & Rs.RecordCount
 Do While Not Rs.EOF
  Set itm = Lv.ListItems.Add(, "Row" & Rs!id, Rs!Name)
        itm.SubItems(1) = Rs!Description
        itm.SubItems(2) = IIf(IsNull(Rs!Date), "", Format(Rs!Date, "mm/dd/yyyy"))
        itm.SubItems(3) = IIf(IsNull(Rs!Version), "", Rs!Version)
        itm.SubItems(4) = Rs!CDS_ID
        Rs.MoveNext
Loop
Set itm = Nothing
End Sub
0
 
LVL 3

Expert Comment

by:Hornet241
ID: 6402173
Just a way to help you get rid of all those "IF" statements

ChkCnt = 0
If Chk1(0).Value = vbChecked then
  ChkCnt = ChkCnt + 1
End If

If Chk1(1).Value = vbChecked
  ChkCnt = ChkCnt + 2
End If

If Chk1(2).Value = vbChecked
  ChkCnt = ChkCnt + 4
End If

If Chk1(3).Value = vbChecked
  ChkCnt = ChkCnt + 8
End If

Select Case ChkCnt
    Case is = 1 ' Chk1(0) = True
    Case is = 2 ' Chk1(1) = True
    Case is = 3 ' Chk1(0) & Chk1(1) = True
    Case is = 4 ' Chk1(2) = True
    Case is = 5 ' Chk1(0) & Chk1(2) = True
    Case is = 6 ' Chk1(1) & Chk1(2) = True
    Case is = 7 ' Chk1(0) & Chk1(1) & Chk1(2) = True
    Case is = 8 ' Chk1(3) = True
    .
    .
    .
End Select

0
 
LVL 14

Expert Comment

by:wsh2
ID: 6402837
Folks.. from what I see here.. this is a ListView with 40,000 ListItems in it.. that is 4-ZERO-ZERO-ZERO-ZERO !!!
With that many items.. this puppy is going to be slow to LOAD and just as slow to UNLOAD while Windows goes and does all of its memory allocate, deallocate, swap-to-disk, etc. kinda things. The only way to improve this situation is simple.. DO NOT LOAD SO MANY RECORDS AT ONE TIME!!! I mean really.. who the heck can (or wants to for that matter) read 40,000 records?.. <groan>.

Your choices are kinda simple.. reexamine your design to reduce the amount of data being contained in your grid -or- buy everyone that is going to run your application a MUCH faster computer (gigahertz+) with lots of ultrafast memory and hi-speed disk swapping on it. Personally?.. I vote for number 2.. new computers for everyone.. I can't wait until you send me mine!!! <lol> and a <wink>.
0
 
LVL 27

Expert Comment

by:Ark
ID: 6402841
Hi
Take a look at this PAQ:
http://www.experts-exchange.com/jsp/qShow.jsp?ta=visualbasic&qid=10753321

In brief:
Q. >>When I unload a form with a very long Listview, there is a long delay (the longer the listview, the
longer the delay). If I do a listview.listitems.clear first, then the clear takes a long time, but the
unload is quick.
Do you know of any quick way to get the listview to release its resources, or whatever it is doing to
cause this delay.<<
Two fastest ways:

Public Sub ClearLV(lvw As ListView)
  If GetParent(lvw.hwnd) = 0 Then Exit Sub
  OldProc = SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, AddressOf WinProc)
  Call SendMessage(lvw.hwnd, LVM_DELETEALLITEMS, 0&, ByVal 0&)
  Call SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, OldProc)
End Sub

Public Sub ClearLV1(lvw As ListView)
  Dim nCount As Long, h As Long
  h = lvw.hwnd
  nCount = SendMessage(h, LVM_GETITEMCOUNT, 0, 0&)
  Do While nCount > 0
     SendMessage h, LVM_DELETEITEM, nCount - 1, 0&
     nCount = SendMessage(h, LVM_GETITEMCOUNT, 0, 0&)
  Loop
End Sub

Public Function WinProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If uMsg = WM_NOTIFY Then
     Dim nh As NMHDR
     CopyMemory nh, ByVal lParam, Len(nh)
     If nh.code = LVN_DELETEALLITEMS Then
        WinProc = 1
       Exit Function
     End If
  End If
  WinProc = CallWindowProc(OldProc, hwnd, uMsg, wParam, lParam)
End Function

There is alspo 'memory hack' trick with copymemory, but it cause memory leak.

Cheers
0
 
LVL 1

Author Comment

by:Balshe
ID: 6404035
Thanks Ark ,I'll try it
0
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 
LVL 1

Expert Comment

by:Wippie
ID: 6404058
Had the same problem once, but it's very simple to solve!
It's the listview itself that slows everything!
Not the database at all!

Just place the Listview1.Listitems.Clear in the Form_Unload event and it's all fixed!
(but it will still slow if you stop your app with the stop-button in VB)
The "Set (...) = Nothing" wont help a bit!
0
 
LVL 1

Author Comment

by:Balshe
ID: 6404317
Hi Ark
Thank You for your Answer
But i had the following problems using the code you gave me
First

Public Sub ClearLV(lvw As ListView)
 If GetParent(lvw.hwnd) = 0 Then Exit Sub
 OldProc = SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, AddressOf WinProc)
 Call SendMessage(lvw.hwnd, LVM_DELETEALLITEMS, 0&, ByVal 0&)
 Call SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, OldProc)
End Sub



""AddressOf  WinProc"" ??? Error Message is :Expected SUb,Function Or Property ,,,, what is wrong ?


Second:
LVM_DELETEALLITEMS ??? what is the value of  LVM_DELETEALLITEMS

0
 
LVL 1

Author Comment

by:Balshe
ID: 6404321
Hi Ark
Thank You for your Answer
But i had the following problems using the code you gave me
First

Public Sub ClearLV(lvw As ListView)
 If GetParent(lvw.hwnd) = 0 Then Exit Sub
 OldProc = SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, AddressOf WinProc)
 Call SendMessage(lvw.hwnd, LVM_DELETEALLITEMS, 0&, ByVal 0&)
 Call SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, OldProc)
End Sub



""AddressOf  WinProc"" ??? Error Message is :Expected SUb,Function Or Property ,,,, what is wrong ?


Second:
LVM_DELETEALLITEMS ??? what is the value of  LVM_DELETEALLITEMS

I Would Be Grateful If You Help me On This

thank you
0
 
LVL 1

Author Comment

by:Balshe
ID: 6404337
Hi Ark
Thank You for your Answer
But i had the following problems using the code you gave me
First

Public Sub ClearLV(lvw As ListView)
 If GetParent(lvw.hwnd) = 0 Then Exit Sub
 OldProc = SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, AddressOf WinProc)
 Call SendMessage(lvw.hwnd, LVM_DELETEALLITEMS, 0&, ByVal 0&)
 Call SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, OldProc)
End Sub



""AddressOf  WinProc"" ??? Error Message is :Expected SUb,Function Or Property ,,,, what is wrong ?


Second:
LVM_DELETEALLITEMS ??? what is the value of  LVM_DELETEALLITEMS

I Would Be Grateful If You Help me On This

thank you
0
 
LVL 1

Author Comment

by:Balshe
ID: 6404353
Hi Ark
Thank You for your Answer
But i had the following problems using the code you gave me
First

Public Sub ClearLV(lvw As ListView)
 If GetParent(lvw.hwnd) = 0 Then Exit Sub
 OldProc = SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, AddressOf WinProc)
 Call SendMessage(lvw.hwnd, LVM_DELETEALLITEMS, 0&, ByVal 0&)
 Call SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, OldProc)
End Sub



""AddressOf  WinProc"" ??? Error Message is :Expected SUb,Function Or Property ,,,, what is wrong ?


Second:
LVM_DELETEALLITEMS ??? what is the value of  LVM_DELETEALLITEMS

I Would Be Grateful If You Help me On This

thank you
0
 
LVL 27

Expert Comment

by:Ark
ID: 6404505
Hi
This techique named "Subclassing"
OldProc = SetWindowLong(GetParent(lvw.hwnd), GWL_WNDPROC, AddressOf WinProc)

Above statement redirect all windows messages to your function WinProc (Note - function should be in bas module!):

Public Function WinProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As
Long) As Long
' I Check all messages and wait for predefined one
 If uMsg = WM_NOTIFY Then
    Dim nh As NMHDR
    CopyMemory nh, ByVal lParam, Len(nh)
    If nh.code = LVN_DELETEALLITEMS Then
'Don't responce (ignore) this message, so ListView don't redraw - this increas speed.
       WinProc = 1
      Exit Function
    End If
 End If
'Pass all other messages to original process
 WinProc = CallWindowProc(OldProc, hwnd, uMsg, wParam, lParam)
End Function

Const LVM_FIRST = &H1000
Const LVN_FIRST = -100
Public Const LVM_DELETEALLITEMS = (LVM_FIRST + 9)
Public Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
Public Const LVM_SETITEMCOUNT = (LVM_FIRST + 47)
Const LVM_DELETEITEM = (LVM_FIRST + 8)
Const LVN_DELETEITEM = (LVN_FIRST - 3)
Const LVN_DELETEALLITEMS = (LVN_FIRST - 4)
Const WM_NOTIFY As Long = &H4E&

Cheers
0
 
LVL 27

Expert Comment

by:Ark
ID: 6404508
PS - Subclassing is dangerous in VB IDE. Don't stop app with subclassing with VB menu Stop button, close main form with [x] button instead, or your VB hang. When compiled, everything is OK.

Cheers
0
 
LVL 1

Author Comment

by:Balshe
ID: 6432622
After I Tried Ark's Solution:
Performance got better, before using Ark's solution it took about 3-5 minutes to unload completely, after using Ark?s solution it took 30-40 seconds to unload, but when I tried to close the program using ?pview95.exe? it took no more than 1 second to unload completely.
How does ?pview95.exe? do it?
0
 
LVL 1

Author Comment

by:Balshe
ID: 6432657
By The way The Subclassing ,it didn't work
i don't know why
0
 
LVL 27

Expert Comment

by:Ark
ID: 6434361
Hi
Did you look on my  'memory hack' method with CopyMemory API function at previous thread? It also close ListView in a second. But ListItems collection stay in memory and it couse memory leakage.

Cheers
0
 
LVL 14

Expert Comment

by:wsh2
ID: 6434457
I suspect pview95.exe.. "chunks" it way through the data.. only loading into the ListView what it needs.. when it absolutely needs it.. and only enough to fill the display area. Think about it.. why load 40,000 records when all you can see on the screen at any given time is 20 records?
0
 
LVL 1

Author Comment

by:Balshe
ID: 6436833
Hi Ark
Last Time You Told Me This "There is alspo 'memory hack' trick with copymemory, but it cause memory leak."
but you didn't tell me how to do it?



I used the following API to terminate the program

ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)

this is good if you want to terminate the program but if you still want to use the same form or exit the form and still using other forms in the program then it will not work

So if you can tell me about "memory Hack" i'll Appreciate it

Thanks

0
 
LVL 1

Author Comment

by:Balshe
ID: 6436876
hi Ark
Do You Mean this:
CopyMemory Lv.ListItems, 0&, 4&
0
 
LVL 1

Author Comment

by:Balshe
ID: 6436940
if This Way Casues cause memory leak , is there is a way to free memory and not harming any other applications and my application too
0
 
LVL 27

Accepted Solution

by:
Ark earned 300 total points
ID: 6438665
>>CopyMemory Lv.ListItems, 0&, 4& <<
Yes, this is the fastest method. I try to explain what it does: it copies 0 to the ListItems collection's pointer, so collection become Nothing. But what is VB ListItems collection? It's collection of pointers to ListItem's objects (structures). So, we free pointers, but don't free objects, though VB think that we free all, because collection is Nothing and unload quickly, and these objects stay resident in memory. To free them, we need need
CopyMemory Lv.ListItems(i), 0&, 4&
for every item, and VB does this or smth like this with LV.ListItems.Clear, but it increase time needed.

Cheers
0
 
LVL 27

Expert Comment

by:Ark
ID: 6443220
Thanks for points, glad I could help you
0

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

There are many ways to remove duplicate entries in an SQL or Access database. Most make you temporarily insert an ID field, make a temp table and copy data back and forth, and/or are slow. Here is an easy way in VB6 using ADO to remove duplicate row…
Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now