This is cabase.prg edited for my needs:
Define Class CaBase As CursorAdapter
DataSourceType = "ODBC"
Flags = 0
CompareMemo = .F.
FetchMemo = .T.
FetchAsNeeded = .T.
FetchSize = 10
BatchUpdateCount = 100
WhereType = 1
AllowSimultaneousFetch = .T.
MapVarchar = .T.
MapBinary = .T.
UseCursorSchema = .T.
BufferModeOverride = 5
FilterExpr = ''
FilterExprMerge = ''
Handle = 0
lAutoOpen = .T.
Order = ''
Procedure AutoOpen
If This.lAutoOpen
If Not Pemstatus(This, '__VFPSetup', 5)
This.AddProperty('__VFPSetup', 1)
This.Init()
Endif
Endif
Endproc
Procedure Init(tcAlias,tcParamBlock,tcOrder)
IF VARTYPE(oApp)!='O' AND VARTYPE(_screen.oApp) = 'O'
oApp = _screen.oApp
endif
Local lnPcount
lnPcount = Pcount()
This.Tag = oApp.DataConnectionString
Local llReturn
Do Case
Case Not Pemstatus(This, '__VFPSetup', 5)
This.AddProperty('__VFPSetup', 0)
Case This.__VFPSetup = 1
This.__VFPSetup = 2
Case This.__VFPSetup = 2
This.__VFPSetup = 0
Return
Endcase
If !Empty(m.tcAlias)
This.Alias = m.tcAlias
Endif
This.Order = Evl(m.tcOrder,'')
Set Multilocks On
llReturn = DoDefault()
This.DataSourceType = ;
IIF(Lower(Trim(Getwordnum(oApp.DataConnectionString,1,'= ')))=='driver','ODBC','ADO')
Store This.DataSourceType To ;
this.InsertCmdDataSourceType, ;
this.UpdateCmdDataSourceType, ;
this.DeleteCmdDataSourceType
Do Case
Case Upper(This.DataSourceType) == "ODBC"
IF VARTYPE(oApp.SQLHandle) = 'N' AND oApp.SQLHandle > 0
this.Handle = oApp.SQLHandle
else
This.Handle = Sqlstringconnect(oApp.DataConnectionString)
endif
Store This.Handle To ;
This.Datasource,;
This.InsertCmdDataSource,;
This.UpdateCmdDataSource,;
This.DeleteCmdDataSource
Case Upper(This.DataSourceType) == "ADO"
Local loConnDataSource
loConnDataSource = Createobject('ADODB.Connection')
loConnDataSource.ConnectionString = oApp.DataConnectionString
loConnDataSource.Open()
If oApp.DataMode = 'VFP'
loConnDataSource.Execute('set null off')
endif
This.Datasource = Createobject('ADODB.RecordSet')
This.Datasource.CursorLocation = 3
This.Datasource.LockType = 3
This.Datasource.ActiveConnection = loConnDataSource
loCommand = Createobject('ADODB.Command')
loCommand.ActiveConnection = loConnDataSource
This.AddProperty('oCommand',loCommand)
This.UpdateCmdDataSource=loCommand
This.InsertCmdDataSource=loCommand
This.DeleteCmdDataSource=loCommand
Case Upper(This.DataSourceType)="NATIVE"
Case Upper(This.DataSourceType)="XML"
Endcase
If !Empty(m.tcParamBlock)
If Occurs('<p>', m.tcParamBlock) > 0
SetCAParameters(This, m.tcParamBlock)
This.CursorFill(.T., .F., 0, loCommand)
This.lAutoOpen = .F.
Else
This.FilterExpr = m.tcParamBlock
Endif
Endif
If oApp.DataMode = 'VFP'
This.BatchUpdateCount = 1
Endif
If Type('oApp.owner') = 'C' And LOWER(Evl(oApp.Owner,'dbo')) <> 'dbo'
this.SelectCmd = this.PrefixOwner( this.SelectCmd, 'from', oApp.Owner)
endif
If This.__VFPSetup = 1
This.__VFPSetup = 2
Endif
Return llReturn
Endproc
Procedure BeforeCursorFill
Lparameters lUseCursorSchema, lNoDataOnLoad, cSelectCmd
If !Empty(This.FilterExprMerge)
cSelectCmd = m.cSelectCmd +" where "+Textmerge(This.FilterExprMerge)
Else
If !Empty(This.FilterExpr)
cSelectCmd = m.cSelectCmd +" where "+This.FilterExpr
Endif
Endif
Endproc
Procedure AfterCursorFill
Lparameters lUseCursorSchema, NoDataOnLoad, cSelectCmd, lResult
CursorSetProp("Buffering",5,This.Alias)
Endproc
Procedure BeforeCursorRefresh
Lparameters cSelectCmd
Tablerevert(.T., This.Alias)
Endproc
Procedure AfterCursorRefresh
Lparameters cSelectCmd, lResult
ENDPROC
Procedure PrefixOwner(tcSQL, tcPrefix, tcOwner)
Local lnOccurance,ix, lcRest
lnOccurance = Occurs( Upper(m.tcPrefix), Upper(m.tcSQL) )
For ix = 1 To m.lnOccurance
lcRest = Substr(m.tcSQL,Atc(m.tcPrefix, m.tcSQL, m.ix)+Len(m.tcPrefix))
If Left(Ltrim(m.lcRest,1,Chr(32),Chr(13),Chr(10)),1) <> '('
lcRest = Textmerge('[<<TRIM(m.tcOwner)>>].')+Ltrim(m.lcRest,1,Chr(32),Chr(13),Chr(10))
tcSQL = Left(m.tcSQL,Atc(m.tcPrefix, m.tcSQL, m.ix)+Len(m.tcPrefix)) + ' ' + m.lcRest
Endif
Endfor
Return m.tcSQL
ENDPROC
Cetin