Buena tarde...
Las soluciones usadas hasta ahora.. tablas, TarrayData y rowSet... tienen metodos de navegacion y ordenaminento,,,,
Navigation:
Supports all methods of TDatabase like GoTop,GoBottom,GoTo,Skip,Eof,Bof,LastRec,
RecCount,KeyCount,KeyGoTo, etc
Also supports aliased methods compatible with ADO
MoveFirst,MoveLast,Move,
BookMark,AbsolutePosition, etc
La técnica que estoy usando para no cambiar mucho código es .. simular el dbsetorder y dbseek con los objetos mencionados...
con tablas temporales ya esta ok, con tarrayData solo falta el SetOrder(multiples columnas) ,, y como ultima opción use el rowSet (la navegación y el setOrder .. están ok),, pero mariaConnect... los trata como un espejo de la tabla sql... lo actualiza en línea ... no me
sirve para manejo de temporales o primera consulta sql.
y asi los he usado con eagle1-... con hash tendria que desarrollarlos...
Uso los hash pero para procesos tipo variable : almacenar y recuperar un valor ... junto con json...
ejp. de un objeto tipo recordSet :
- Code: Select all Expand view
FUNCTION objectoSqlFwToDbf(oObjSql,cAliTab,cPatDes,cFilDes,lAbrTab)
LOCAL nNroCam := 0, II := 0 , nNroReg := 0
LOCAL cAliTem := "ART_XXX"
IF lAbrTab == NIL
lAbrTab := .T.
ENDIF
IF lAbrTab //
ABRETABLA(cAliTab)
COPY_STRUC_A_DBF(cAliTab,cPatDes+cFilDes,"DBFCDX")
CLOSE (cAliTab)
IF !lUsaTab(cPatDes,cFilDes,cAliTem,{},.F.,NIL,"DBFCDX")
RETURN .F.
ENDIF
ELSE // YA VIENE ABIERTA
cAliTem := cAliTab // LA TEMPORAL ES LA QUE VIENE
ENDIF
nNroReg := oObjSql:RecCount()
oObjSql:GoTop()
nNroCam := oObjSql:Fcount()
FOR II := 1 TO nNroReg
SELECT (cAliTem)
IF (cAliTem)->( lReglock( .T. ) )
IF !__CREA_REG_DBF_OF_SQL(nNroCam,cAliTem,oObjSql)
RETURN .F.
ENDIF
ENDIF
oObjSql:Skip( 1 )
NEXT II
(cAliTem)->( DBCOMMIT() )
(cAliTem)->( DBUNLOCK() )
IF lAbrTab
CLOSE (cAliTem)
ENDIF
RETURN .T.
//*****************************************************************
FUNCTION __CREA_REG_DBF_OF_SQL(nNroCam,xAliTab,oSqlTab)
LOCAL nPosCam, J := 0, cTipDat, xConCam
TRY
FOR J := 1 TO nNroCam
nPosCam := (xAliTab)->( FIELDPOS( oSqlTab:fieldname( J ) ) )
IF nPosCam > 0
cTipDat := (xAliTab)->( VALTYPE( &( FIELDNAME( nPosCam ) ) ) )
IF !EMPTY(oSqlTab:FieldGet( J ) )
DO CASE
CASE cTipDat == "N"
xConCam := oSqlTab:FieldGet( J )
CASE cTipDat == "D"
xConCam := oSqlTab:FieldGet( J )
CASE cTipDat == "M"
CASE cTipDat == "C"
xConCam := IF(oSqlTab:FieldGet( J )==NIL,"",oSqlTab:FieldGet( J ) )
// OJO REVISAR LONGITUD
CASE cTipDat == "L"
xConCam := IF(oSqlTab:FieldGet( J )=="1",.T.,.F.)
OTHERWISE
ALERT("Error. Tipo de dato desconocido")
ENDCASE
(xAliTab)->( FIELDPUT(nPosCam, xConCam) )
ENDIF
ENDIF
NEXT J
CATCH
RETURN .F.
END
RETURN .T.