Intermittant xBrowse ADO error ( again )

User avatar
Rick Lipkin
Posts: 2677
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA
Been thanked: 2 times

Intermittant xBrowse ADO error ( again )

Post by Rick Lipkin »

To All

Again I continue to have probles with xBrowse and closure on valid .. here is the error code :

Code: Select all | Expand

Application===========   Path and name: J:\VEHICLE\VEH32.EXE (32 bits)   Size: 3,496,448 bytes   Time from start: 4 hours 23 mins 9 secs    Error occurred at: 08/06/2009, 14:00:54   Error description: Error ADODB.Recordset/6  DISP_E_UNKNOWNNAME: RECORDCOUNT   Args:Stack Calls===========   Called from: source\rtl\win32ole.prg => TOLEAUTO:RECORDCOUNT(0)   Called from: xbrowse.prg => (b)TXBROWSE:SETADO(3765)   Called from: xbrowse.prg => TXBROWSE:PAINT(1254)   Called from: xbrowse.prg => TXBROWSE:DISPLAY(957)   Called from: .\source\classes\CONTROL.PRG => TXBROWSE:HANDLEEVENT(1423)   Called from: .\source\classes\WINDOW.PRG => _FWH(3333)   Called from:  => DIALOGBOXINDIRECT(0)   Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE(273)   Called from: .\source\function\ERRSYSW.PRG => ERRORDIALOG(343)   Called from: .\source\function\ERRSYSW.PRG => (b)ERRORSYS(27)   Called from: source\rtl\win32ole.prg => TOLEAUTO:RECORDCOUNT(0)   Called from: xbrowse.prg => (b)TXBROWSE:SETADO(3765)   Called from: xbrowse.prg => TXBROWSE:PAINT(1254)   Called from: xbrowse.prg => TXBROWSE:DISPLAY(957)   Called from: .\source\classes\CONTROL.PRG => TXBROWSE:HANDLEEVENT(1423)   Called from: .\source\classes\WINDOW.PRG => _FWH(3333)   Called from:  => DIALOGBOXINDIRECT(0)   Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE(273)   Called from: .\source\function\ERRSYSW.PRG => ERRORDIALOG(343)   Called from: .\source\function\ERRSYSW.PRG => (b)ERRORSYS(27)   Called from: source\rtl\win32ole.prg => TOLEAUTO:RECORDCOUNT(0)   Called from: xbrowse.prg => (b)TXBROWSE:SETADO(3765)   Called from: xbrowse.prg => TXBROWSE:PAINT(1254)   Called from: xbrowse.prg => TXBROWSE:DISPLAY(957)   Called from: .\source\classes\CONTROL.PRG => TXBROWSE:HANDLEEVENT(1423)   Called from: .\source\classes\WINDOW.PRG => _FWH(3333)   Called from:  => WINRUN(0)   Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(952)   Called from: MAIN.PRG => MAIN(381


Here is Line 957

Image

Here is line 1254

Image

Here is line 3765

Image

Here is the valid close for the browse :

Code: Select all | Expand

IF oRsVEH:eof   oRsVEH:MoveFirst()ENDIFcTITLE := "SELECT * from VEHICLES where AGENCY = '"+xAGENCY+"'"nWd := GetSysMetrics(0) * .79nHt := GetSysMetrics(1) * .8lOK := .F.DEFINE ICON oICO RESOURCE "KEY"DEFINE WINDOW oWnd1                        ;      FROM 10,10 to nHt, nWd PIXEL         ;      TITLE cTITLE                         ;      MENU BuildMenu( oRsVeh )             ;      ICON oICO                            ;      NOMINIMIZE                           ;      NOZOOM                               ;      MDICHILD@ 0, 0 xBROWSE oBrw of oWnd1               ;       RECORDSET oRsVeh                    ;       COLUMNS 'VNUMBER',                  ;              'TYPE',                      ;              'LICENSE',                   ;              'AGENCY',                    ;              'MEMO',                      ;              'MAKE',                      ;              'TYPE',                      ;              'YEAR',                      ;              'PROG',                      ;              'MOTORPOOL',                 ;              'REGION',                    ;              'LASTSERVCE',                ;              'NEXTSERVCE',                ;              'NEXTMILAGE',                ;              'SERIALNUMB',                ;              'ACTIVE',                    ;              'READONLY'                   ;       COLSIZES 48,50,80,50,70,120,120,55,95,95,140,80,80,80,190,80,80  ;       HEADERS "Vnum",                     ;               "Type",                     ;               "License",                  ;               "Agency",                   ;               "See Memo",                 ;               "Make",                     ;               "Model",                    ;               "Year",                     ;               "Program",                  ;               "Mtrpool",                  ;               "Location",                 ;               "LastServ",                 ;               "NextServ",                 ;               "NextMilage",               ;               "Serial#",                  ;               "Act",                      ;               "ReadOnly"                  ;       AUTOSORT AUTOCOLS LINES CELL       oBrw:bClrStd := {|| {CLR_BLACK, if( oRsVeh:Fields("readonly"):Value = 'Y', RGB(179,203,204), CLR_WHITE ) } }       oBrw:CreateFromCode()       oWnd1:oClient := oBrw       oBrw:aCols[2]:bEditValue := { |x|DispType( oRsVeh) }       oBrw:aCols[5]:bEditValue := { |y|DispMemo( oRsVeh) }       oBrw:bLDblClick := { |nRow,nCol | _VehView( "V", oRsVeh ) }       oBrw:bKeyDown   := { |nKey| _Manual( nKey,oRsVeh ) }ACTIVATE WINDOW oWND1 ;         ON INIT( oBrw:SetFocus(), .F. ) ;         VALID ( IIF( !lOK, ( oBrw:lCreated := .f., _VehClose(.T.) ), .F. ))       *  VALID ( IIF( !lOK, ( oBrw:End(), _VehClose(.T.) ), .F. ))       *  VALID ( IIF( !lOK, _VehClose(.T.), .F. ))RETURN( .T. )//------------------------static FUNCTION _VehClose( lCLEAN ) //, oRsVEH )IF lCLEAN = .T.   lOK := .T. *  VEHNUM := oRsVEH:Fields("LICENSE"):Value *  FERASE( "C:\DBOVL\VEHNUM.MEM" ) *  SAVE All like VEHNUM to C:\DBOVL\VEHNUM.MEM  * oBRW:cALIAS:=NIL  oBrw:End()  oRsVEH:CLose()  oRsVeh := NIL*  _CleanUP()ENDIFRETURN(.T.)//----------------------------------// fix for recordcount errorStatic function GetKeyCount( oRs )local nKeyCount := 0if empty( oRs )   msginfo( "oRs is nil" )   RETURN( 0 )ENDIFTRY  nKeyCount := oRs:RecordCount()CATCH  nKeyCount := 0ENDreturn( nKeyCount ) 


As you can see .. there is nothing special here and I have taken everyones advice on closing the browse .. there somewhere from line 957 in the xbrowse code .. the chain of events are still fireing that lead to this intermittant failure.

Any Hints ??

Rick Lipkin
User avatar
nageswaragunupudi
Posts: 10733
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 11 times
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by nageswaragunupudi »

Mr Rick

I had earlier suggested a trick, which I don't think you tried till now.
Please try this once.
Instead of

Code: Select all | Expand

  oBrw:End()  oRsVEH:CLose() 

substitute

Code: Select all | Expand

oBrw:lCreated := .f.oRsVEH:CLose() 


What is happening now is, after closing the RecordSet, Browse is being called to Display. Display calls Paint Method "if ::lCreated is .t.". Paint method gives error because by that time recordset is closed.

I am sure Display method does not do anything if oBrw:lCreated is .f. Then paint method won't be called.

If this trick succeeds, we can suggest adding some flag to oBrw:End() method which will inform Display method not to call Paint method.
Regards

G. N. Rao.
Hyderabad, India
User avatar
Rick Lipkin
Posts: 2677
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA
Been thanked: 2 times

Re: Intermittant xBrowse ADO error ( again )

Post by Rick Lipkin »

Rao

Your suggestion is currently in place :-(

Code: Select all | Expand

ACTIVATE WINDOW oWND1 ;         ON INIT( oBrw:SetFocus(), .F. ) ;         VALID ( IIF( !lOK, ( oBrw:lCreated := .f., _VehClose(.T.) ), .F. ))       *  VALID ( IIF( !lOK, ( oBrw:End(), _VehClose(.T.) ), .F. ))       *  VALID ( IIF( !lOK, _VehClose(.T.), .F. ))//------------------------static FUNCTION _VehClose( lCLEAN ) //, oRsVEH )IF lCLEAN = .T.   lOK := .T. *  VEHNUM := oRsVEH:Fields("LICENSE"):Value *  FERASE( "C:\DBOVL\VEHNUM.MEM" ) *  SAVE All like VEHNUM to C:\DBOVL\VEHNUM.MEM  * oBRW:cALIAS:=NIL  oBrw:End()  oRsVEH:CLose()  oRsVeh := NIL*  _CleanUP()ENDIFRETURN(.T.) 


Code: Select all | Expand

Application===========   Path and name: J:\VEHICLE\VEH32.EXE (32 bits)   Size: 3,496,448 bytes   Time from start: 4 hours 23 mins 9 secs    Error occurred at: 08/06/2009, 14:00:54   Error description: Error ADODB.Recordset/6  DISP_E_UNKNOWNNAME: RECORDCOUNT   Args:Stack Calls===========   Called from: source\rtl\win32ole.prg => TOLEAUTO:RECORDCOUNT(0)   Called from: xbrowse.prg => (b)TXBROWSE:SETADO(3765)   Called from: xbrowse.prg => TXBROWSE:PAINT(1254)   Called from: xbrowse.prg => TXBROWSE:DISPLAY(957)   Called from: .\source\classes\CONTROL.PRG => TXBROWSE:HANDLEEVENT(1423)   Called from: .\source\classes\WINDOW.PRG => _FWH(3333)   Called from:  => DIALOGBOXINDIRECT(0)   Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE(273)   Called from: .\source\function\ERRSYSW.PRG => ERRORDIALOG(343)   Called from: .\source\function\ERRSYSW.PRG => (b)ERRORSYS(27)   Called from: source\rtl\win32ole.prg => TOLEAUTO:RECORDCOUNT(0)   Called from: xbrowse.prg => (b)TXBROWSE:SETADO(3765)   Called from: xbrowse.prg => TXBROWSE:PAINT(1254)   Called from: xbrowse.prg => TXBROWSE:DISPLAY(957)   Called from: .\source\classes\CONTROL.PRG => TXBROWSE:HANDLEEVENT(1423)   Called from: .\source\classes\WINDOW.PRG => _FWH(3333)   Called from:  => DIALOGBOXINDIRECT(0)   Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE(273)   Called from: .\source\function\ERRSYSW.PRG => ERRORDIALOG(343)   Called from: .\source\function\ERRSYSW.PRG => (b)ERRORSYS(27)   Called from: source\rtl\win32ole.prg => TOLEAUTO:RECORDCOUNT(0)   Called from: xbrowse.prg => (b)TXBROWSE:SETADO(3765)   Called from: xbrowse.prg => TXBROWSE:PAINT(1254)   Called from: xbrowse.prg => TXBROWSE:DISPLAY(957)   Called from: .\source\classes\CONTROL.PRG => TXBROWSE:HANDLEEVENT(1423)   Called from: .\source\classes\WINDOW.PRG => _FWH(3333)   Called from:  => WINRUN(0)   Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(952)   Called from: MAIN.PRG => MAIN(381



Why is this only happening intermittantly .. I have no problems myself and can not re-create the error .. but yet .. the error.log exists.

Rick Lipkin
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by James Bott »

Rick,

I am confused by your error listing. I cannot find a call to setAdo() anywhere in the TXBrowse:Paint() method.

What version of FW are you using? Do you see a call to setAdo() in your Paint() method? Are you using a modified version of TXBrowse?

I am using FWH 9.05.

Regards,
James
User avatar
Rick Lipkin
Posts: 2677
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA
Been thanked: 2 times

Re: Intermittant xBrowse ADO error ( again )

Post by Rick Lipkin »

James

Using FWH 9.06 .. look at xbrowse.prg around line 3758 ..

Rick
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by James Bott »

Rick,

>Using FWH 9.06 .. look at xbrowse.prg around line 3758 ..

I still don't see a call to setAdo().

There are only two calls to setAdo() in my source, one in each of these methods:

Initiate()
XbrwSetDataSource()

That's all.

Is line 3758 in the Paint() method of your version? Can you email me your version of TXBrowse.prg?

jbott at compuserve dot com

James
User avatar
Rick Lipkin
Posts: 2677
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA
Been thanked: 2 times

Re: Intermittant xBrowse ADO error ( again )

Post by Rick Lipkin »

James

Just sent you the xbrowse class .. from 9.04 ( not 9.06 .. my mistake ) .. the SetAdo method is around line 3754. Hope your extra set of eyes can shed some light on this problem .. and I think it may be related to the 'print screen' utility these specific users have ..

I have run into something like this before when this 'print screen' utility will force an ON PAINT event when the capture is complete .. forcing Windows to send the event to the OS.

I will wait to see what you think when you receive my e-mail..

Rick Lipkin
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by James Bott »

Rick,

I have looked at your version of TXBrowse (9.04) and I still don't quite understand the error sequence you are getting. This is your error stack:

Stack Calls
===========
Called from: source\rtl\win32ole.prg => TOLEAUTO:RECORDCOUNT(0)
Called from: xbrowse.prg => (b)TXBROWSE:SETADO(3765)
Called from: xbrowse.prg => TXBROWSE:PAINT(1254)


Paint() line 1254

nBookMark := Eval( ::bBookMark )

SetADO() line 3765

::bKeyCount := {|| GetKeyCount( ::oRs ) }


In SetADO() line 3759, ::bBookmark is difined as:

::bBookMark := {| n | If( n == nil,;
If( ::oRs != nil .and. ::oRs:RecordCount() > 0, ::oRs:BookMark, 0 ), ;
If( ::oRs != nil .and. ::oRs:RecordCount() > 0, ( ::oRs:BookMark := n ), 0 ) ) }, ;

So the Paint() method is eval'ing ::bBookmark, but I don't see how that then gets you to line 3765 in the setAdo() method. Perhaps UltraEdit's line numbers don't match with the error stacks line numbers, and I don't know why the error stack would say that SetADO() was called just because a codeblock was defined there. Strange.

However, it does appear that a call to ::oRs:RecordCount() is what is triggering the error.

As I suggested before I would try a sysrefresh(). I think the event queue is still holding the oBrw:End() when oRsVEH:Close() is being executed. I don't know why this sort of thing happens, but I have had sysrefresh() solve such problems that seemed to defy logic before.

James

Code: Select all | Expand

static FUNCTION _VehClose( lCLEAN ) //, oRsVEH )IF lCLEAN = .T.   lOK := .T. *  VEHNUM := oRsVEH:Fields("LICENSE"):Value *  FERASE( "C:\DBOVL\VEHNUM.MEM" ) *  SAVE All like VEHNUM to C:\DBOVL\VEHNUM.MEM  * oBRW:cALIAS:=NIL  oBrw:End()  sysrefresh()  // Add this line - J Bott  oRsVEH:CLose()  oRsVeh := NIL*  _CleanUP()ENDIFRETURN(.T.)
User avatar
Rick Lipkin
Posts: 2677
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA
Been thanked: 2 times

Re: Intermittant xBrowse ADO error ( again )

Post by Rick Lipkin »

James

I will try your suggestion and let you know ..

Thanks
Rick
User avatar
Armando
Posts: 3279
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Been thanked: 4 times
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by Armando »

Rick, James:

When you create an empty Record Set and test using RecordCount() you will have an error.

This code will send you an error with an empty record set

MsgInfo(oRs:RecordCount() > 0)

I use to as follow

IF oRs:BOF() .AND. oRs:EOF()
MsgInfo("The record set is empty !")
ELSE
MsgInfo(oRs:RecordCount())
ENDIF

And I have no problems at all.

I hope this can help you

Regards
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by Daniel Garcia-Gil »

Hello Rick...

Please try put oBrw:CreateFromCode() last command to create xbrowse

Code: Select all | Expand

       ....       ....       oBrw:bClrStd := {|| {CLR_BLACK, if( oRsVeh:Fields("readonly"):Value = 'Y', RGB(179,203,204), CLR_WHITE ) } }       oWnd1:oClient := oBrw       oBrw:aCols[2]:bEditValue := { |x|DispType( oRsVeh) }       oBrw:aCols[5]:bEditValue := { |y|DispMemo( oRsVeh) }       oBrw:bLDblClick := { |nRow,nCol | _VehView( "V", oRsVeh ) }       oBrw:bKeyDown   := { |nKey| _Manual( nKey,oRsVeh ) }       oBrw:CreateFromCode() // <<======HERE 
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by James Bott »

Armando,

So, if I understand correctly, if the record set record count is zero then oRs:RecordCount() will error out? If so, then we can try changing bBookMark to (in the SetADO() method):

::bBookMark := {| n | If( n == nil,;
                     If( ::oRs != nil .and. If( ::oRs:BOF() .AND. oRs:EOF(),0, ::oRs:RecordCount() ) > 0, ::oRs:BookMark, 0 ), ;
                     If( ::oRs != nil .and. If( ::oRs:BOF() .AND. oRs:EOF(),0, ::oRs:RecordCount() ) > 0, ( ::oRs:BookMark := n ), 0 ) ) }, ;

Then this should prevent the errror.

Rick, maybe you should try this first. If we can fix xbrowse to prevent the error it would be the best solution.

James
User avatar
Rick Lipkin
Posts: 2677
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA
Been thanked: 2 times

Re: Intermittant xBrowse ADO error ( again )

Post by Rick Lipkin »

Gentleman

All GREAT ideas .. James .. I will modify the xbrowse code for eof, bof ( thanks Armando ) .. this seems to be the root cause !! .. Daniel, I will insert your recommendation as well.

I will vpn into work and make the changes and let everyone know.

Rick
User avatar
Rick Lipkin
Posts: 2677
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA
Been thanked: 2 times

Re: Intermittant xBrowse ADO error ( again )

Post by Rick Lipkin »

To All

I have put all the recommendations together ( Daniel, James, and Armando ) .. compiled and tested the applications and it seems to be stable for me ..

I have put the executable in place with the folks that seem to generate the error and will monitor any error.log's ..

Hopefully the eof, bof will be the key ..

Thanks
Rick
User avatar
Armando
Posts: 3279
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Been thanked: 4 times
Contact:

Re: Intermittant xBrowse ADO error ( again )

Post by Armando »

James:

James Bott wrote:So, if I understand correctly, if the record set record count is zero then oRs:RecordCount() will error out?

Yes.

Rick:
I'm glad to hear that.

Regards
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Post Reply