Re: Why Some Browses with ADS are slow?
Posted: Tue Apr 12, 2011 5:17 pm
We are aware that OrdKeyNo() ( which in turn calls AdsKeyNo(...) ) consumes more time in case of large tables on ADS Server and each call involves roundtrip to the server and thus increasing network traffic too.
The objective is to achieve pajama effect without calling OrdKeyNo() at all or if that is not possible to greatly minimize the number of calls to this function.
Here is an attempt, which greatly reduces the calls but does not totally avoid. Though I have used DBFCDX, the same logic applies to ADS.
Still, I am of the opinion to avoid any calls to these slow functions while browsing large tables on ADS server, even it means we can not show pajama effect.
The objective is to achieve pajama effect without calling OrdKeyNo() at all or if that is not possible to greatly minimize the number of calls to this function.
Here is an attempt, which greatly reduces the calls but does not totally avoid. Though I have used DBFCDX, the same logic applies to ADS.
- Code: Select all Expand view
- #include "FiveWin.Ch"
#include "ord.ch"
#include "xbrowse.ch"
//----------------------------------------------------------------------------//
REQUEST DBFCDX
static nRowNo
//----------------------------------------------------------------------------//
function Main()
local oDlg, oBrw
USE CUSTOMER
SET ORDER TO TAG FIRST
SET FILTER TO !DELETED()
GO TOP
nRowno := 1
DEFINE DIALOG oDlg SIZE 600,600 PIXEL
@ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
AUTOCOLS ALIAS 'CUSTOMER' AUTOSORT CELL LINES NOBORDER
WITH OBJECT oBrw
:bClrStd := { || If( nRowNo % 2 == 1, { CLR_BLACK, CLR_WHITE }, { CLR_BLACK, CLR_YELLOW } ) }
:bGoTop := { || ( oBrw:cAlias )->( DbGoTop() ), nRowNo := 1 }
:bGoBottom := { || ( oBrw:cAlias )->( DbGoBottom(), nRowNo := OrdKeyCount() ) }
:bBookMark := { |x| If( x == nil, ( oBrw:cAlias )->( RecNo() ), ( oBrw:cAlias )->( DbGoTo( x ), nRowNo := OrdKeyNo(), x ) ) }
:bSkip := { |n| ( oBrw:cAlias )->( MySkipper( n ) ) }
:bRClicked := { || oBrw:Refresh() }
:CreateFromCode()
END
ACTIVATE DIALOG oDlg CENTERED
return (0)
//----------------------------------------------------------------------------//
init procedure PrgInit
SET DATE ITALIAN
SET CENTURY ON
SET DELETED ON
SET EXCLUSIVE OFF
RDDSETDEFAULT( "DBFCDX" )
XbrNumFormat( 'E', .t. )
return
//----------------------------------------------------------------------------//
static function MySkipper( nToSkip )
local nSkipped := DbSkipper( IfNil( nToSkip, 1 ) )
nRowNo += nSkipped
return nSkipped
//----------------------------------------------------------------------------//
Still, I am of the opinion to avoid any calls to these slow functions while browsing large tables on ADS server, even it means we can not show pajama effect.