softheart
asked on
Run-time error 3021 retrieving bookmark from listview object in Visual Basic 6 compiled program.
I am using Visual Basic 6 (SP6) on Microsoft Windows 98 2nd Edition with Microsoft DAO 3.6 Object Library.
Inside the source I open a recordset in dynaset mode and assign it to a global variable:
'
Global gRsPage as Recordset
Set gRsPage = gDb.OpenRecordset(strSQL, dbOpenDynaset)
'
Then I show all records by a ListView Object, assigning at each row a single record data:
'
lngRow = 0
'
While Not gRsPage.EOF
lngRow = lngRow +1
lvwPage.ListItems.Add lngRow, , gRsPage(0) 'Numeric data, ie '93999393'
'
lvwPage.ListItems(lngRow). Tag = gRsPage.Bookmark
'
gRsPage.MoveNext
Wend
'
When the operator click on a ListView row, inside the ItemClick event I get the selected record and show the other record fields:
'
Private Sub lvwPage_ItemClick(ByVal Item as MSComctlLib.ListItem)
'
If Len(Item.Tag) > 0 Then
gRsPage.BookMark = Item.Tag
'
*** ShowAllData(gRsPage(1), gRsPage(2), etc.) routine ***
'
End If
'
End Sub
'
By Visual Basic IDE interface all run OK but:
1. when I use the COMPILED program (.EXE);
2. when, on the first time, I click on the SECOND listview row (the first listview row is selected automatically);
3. the "Run-time error '3021'. No currend record.' appears when the "gRsPage.BookMark = Item.Tag" instruction is executed.
This error never is shown:
1. on interpreted version (by IDE);
2. on listview contains alfanumeric data ("Mr. Smith") and not only numeric data ("93999393");
3. clicking on listview rows different from the second (first, third, etc).
Inside the source I open a recordset in dynaset mode and assign it to a global variable:
'
Global gRsPage as Recordset
Set gRsPage = gDb.OpenRecordset(strSQL, dbOpenDynaset)
'
Then I show all records by a ListView Object, assigning at each row a single record data:
'
lngRow = 0
'
While Not gRsPage.EOF
lngRow = lngRow +1
lvwPage.ListItems.Add lngRow, , gRsPage(0) 'Numeric data, ie '93999393'
'
lvwPage.ListItems(lngRow).
'
gRsPage.MoveNext
Wend
'
When the operator click on a ListView row, inside the ItemClick event I get the selected record and show the other record fields:
'
Private Sub lvwPage_ItemClick(ByVal Item as MSComctlLib.ListItem)
'
If Len(Item.Tag) > 0 Then
gRsPage.BookMark = Item.Tag
'
*** ShowAllData(gRsPage(1), gRsPage(2), etc.) routine ***
'
End If
'
End Sub
'
By Visual Basic IDE interface all run OK but:
1. when I use the COMPILED program (.EXE);
2. when, on the first time, I click on the SECOND listview row (the first listview row is selected automatically);
3. the "Run-time error '3021'. No currend record.' appears when the "gRsPage.BookMark = Item.Tag" instruction is executed.
This error never is shown:
1. on interpreted version (by IDE);
2. on listview contains alfanumeric data ("Mr. Smith") and not only numeric data ("93999393");
3. clicking on listview rows different from the second (first, third, etc).
ASKER
1. is it possible that the recordset is getting rebuilt?
No, because the recordset is built only in a specific point, before the routine that shows its data. Moreover this is a program that is used at least 5 years.
2. you need to use the Item parameter to get to the tag.
I am not according with you but I have used your modifications.
The result do not change: 'run-time error 3021'.
Thanks.
No, because the recordset is built only in a specific point, before the routine that shows its data. Moreover this is a program that is used at least 5 years.
2. you need to use the Item parameter to get to the tag.
I am not according with you but I have used your modifications.
The result do not change: 'run-time error 3021'.
Thanks.
ASKER
I would like underline that the error appears ONLY on compiled program.
I suppose that it could be an listview object error.
I suppose that it could be an listview object error.
3. There was a change in the DAO Bookmark property, probably beginning with 3.6. It used to be a string and then became a variant data type, due to an internal change to a byte array.
You will need to do a pair of conversions into Unicode and out of Unicode, since the .Tag property is a string.
Example:
lvwPage.ListItems(lngRow). Tag = StrConv(gRsPage.Bookmark, vbUnicode)
...
gRsPage.BookMark = StrConv(lvwPage.ListItems. Item(Item. Index).Tag , vbFromUnicode)
You will need to do a pair of conversions into Unicode and out of Unicode, since the .Tag property is a string.
Example:
lvwPage.ListItems(lngRow).
...
gRsPage.BookMark = StrConv(lvwPage.ListItems.
ASKER
The indication sounds good but, unfortunately, it do not run.
now we need to look at environmental issues...
4. Are you running the compiled program on the same PC as your development PC? If not, did you do a proper installation/setup of the program?
5. There are maintenance issues for both Win98 and VB to consider. Are all the service packs installed on both development and target systems?
4. Are you running the compiled program on the same PC as your development PC? If not, did you do a proper installation/setup of the program?
5. There are maintenance issues for both Win98 and VB to consider. Are all the service packs installed on both development and target systems?
Although not part of your problem, if you have a large recordset, you might consider using the Key instead of the Tag property. It eliminates two of the listview control references. Also, you don't need the lngRow variable any more.
Example:
Do Until gRsPage.EOF
lvwPage.ListItems.Add , StrConv(gRsPage.Bookmark, vbUnicode), gRsPage(0)
Loop
...
gRsPage.BookMark = StrConv(Item.Key , vbFromUnicode)
Example:
Do Until gRsPage.EOF
lvwPage.ListItems.Add , StrConv(gRsPage.Bookmark, vbUnicode), gRsPage(0)
Loop
...
gRsPage.BookMark = StrConv(Item.Key , vbFromUnicode)
Ignore my last comment. I had only fed relatively small recordsets when I'd posted my comment. The creation of the hash table more than offsets the reduction of listview control references and makes it SLOWER than using the tag property with an Index.
ASKER
Answer at your questions number 4 and 5.
The error was identified by my client but
I can reproduce it on my development system when I COMPILE IT and use the client's database.
We are using Visual Basic 6.0 SP6 with Dao360.dll (ver. 03.60.2521.8) and MSComctl.ocx (ver. 6.01.9782).
Microsoft Windows 98 2nd edition is not updated to avoid differences with the software on my client's instruments.
The first time I told to my client to delete all record and to retry (to avoid errors on records). In short time the error came out again.
I have also converted the database in Microsoft Access 2000 version but the result does not change.
I have tried to assign the bookmark to the listview key, according to your indications (ID:20118029), but it does not resolve the error.
The error was identified by my client but
I can reproduce it on my development system when I COMPILE IT and use the client's database.
We are using Visual Basic 6.0 SP6 with Dao360.dll (ver. 03.60.2521.8) and MSComctl.ocx (ver. 6.01.9782).
Microsoft Windows 98 2nd edition is not updated to avoid differences with the software on my client's instruments.
The first time I told to my client to delete all record and to retry (to avoid errors on records). In short time the error came out again.
I have also converted the database in Microsoft Access 2000 version but the result does not change.
I have tried to assign the bookmark to the listview key, according to your indications (ID:20118029), but it does not resolve the error.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
According to Microsoft (http://support.microsoft.com/kb/239114/) the Dao360.dll ver. 3.60.8618.04.0.8618.0 is for Windows XP SP2 and Security Bulletin MS04-014.
So I have downloaded and installed the Jet 4.0 Service Pack 8 ("http://download.microsoft.com/download/4/3/9/4393c9ac-e69e-458d-9f6d-2fe191c51469/jet40sp8_9xnt.exe") for computers that are running Windows 98.
This service pack contains the Dao360.dll ver. 3.60.8025.0.
I run the compiled program and the error does not exist!
Thank you.
So I have downloaded and installed the Jet 4.0 Service Pack 8 ("http://download.microsoft.com/download/4/3/9/4393c9ac-e69e-458d-9f6d-2fe191c51469/jet40sp8_9xnt.exe") for computers that are running Windows 98.
This service pack contains the Dao360.dll ver. 3.60.8025.0.
I run the compiled program and the error does not exist!
Thank you.
2. you need to use the Item parameter to get to the tag:
Example:
gRsPage.BookMark = lvwPage.ListItems.Item(Ite