#include "Gui.ch" /* * Clase TDbGrid. */ Class TDbGrid From TStringGrid Private: Data FAlias Init "" Data FFields Init {} Data FFieldCount Init 0 Method SetAlias Method SetFields Public: Method Create Constructor Method DataEof Method DataFirst Method DataLast Method DataMoveBy Method DataMoveTo Method DataNext Method DataPrev Method DataRecordCount Method GetData Method GetBookmark Method SetBookmark Property Alias Read Data FAlias Write Method SetAlias Property Fields Read Data FFields Write Method SetFields EndClass /* * Constructor de la clase. */ Method Create( oOwner ) Class TDbGrid Super:Create( oOwner ) Return /* * Comprueba si está al final de la fuente de datos. */ Method DataEof() Class TDbGrid Return If( Empty( ::FAlias ), .T., ( ::FAlias )->( Eof() ) ) /* * Desplaza la fila activa a la primera posición. */ Method DataFirst() Class TDbGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbGoTop() ) EndIf Return 1 /* * Desplaza la fila activa a la última posición. */ Method DataLast() Class TDbGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbGoBottom() ) EndIf Return ::DataRecordCount() /* * Desplaza la fila activa una distancia determinada. */ Method DataMoveBy( nDistance ) Class TDbGrid Local nSkip, nCurPos If !Empty( ::FAlias ) If ( ::FAlias )->( OrdNumber() ) > 0 .And. Abs( nDistance ) > 100 nCurPos := ( ::FAlias )->( OrdKeyNo() ) nSkip := nDistance nDistance += nCurPos If nDistance < 1 ( ::FAlias )->( DbGoTop() ) nSkip := 1 - nCurPos Else ( ::FAlias )->( OrdKeyGoto( nDistance ) ) EndIf Return nSkip EndIf nSkip := 0 If nDistance > 0 Do While nDistance-- > 0 ( ::FAlias )->( DbSkip() ) if ( ::FAlias )->( Eof() ) ( ::FAlias )->( DbSkip( -1 ) ) Exit EndIf nSkip++ EndDo ElseIf nDistance < 0 Do While nDistance++ < 0 ( ::FAlias )->( DbSkip( -1 ) ) if ( ::FAlias )->( Bof() ) Exit EndIf nSkip-- EndDo Else ( ::FAlias )->( DbSkip( 0 ) ) EndIf Return nSkip EndIf Return 0 /* * Desplaza la fila activa a una posición absoluta. */ Method DataMoveTo( nPosition ) Class TDbGrid If !Empty( ::FAlias ) If ( ::FAlias )->( OrdNumber() ) > 0 ( ::FAlias )->( OrdKeyGoto( nPosition ) ) Return ( ::FAlias )->( OrdKeyNo() ) Else ( ::FAlias )->( DbGoto( nPosition ) ) Return ( ::FAlias )->( RecNo() ) EndIf EndIf Return 0 /* * Desplaza la fila activa una posición hacia adelante. */ Method DataNext() Class TDbGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbSkip() ) EndIf Return /* * Desplaza la fila activa una posición hacia atrás. */ Method DataPrev() Class TDbGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbSkip( -1 ) ) EndIf Return /* * Obtiene el número total de filas de la fuente de datos. */ Method DataRecordCount() Class TDbGrid Local nRecords, nRecord nRecords := 0 If !Empty( ::FAlias ) If ( ::FAlias )->( OrdNumber() ) > 0 Return ( ::FAlias )->( OrdKeyCount() ) EndIf nRecord := ( ::FAlias )->( RecNo() ) ( ::FAlias )->( DbGoTop() ) Do While !( ::FAlias )->( Eof() ) nRecords++ ( ::FAlias )->( DbSkip() ) EndDo ( ::FAlias )->( DbGoTo( nRecord ) ) EndIf Return nRecords /* * Obtiene la fila actual. */ Method GetBookmark() Class TDbGrid Local nRecNo, nBookmark If !Empty( ::FAlias ) If ( ::FAlias )->( Eof() ) ( ::FAlias )->( DbGoBottom() ) EndIf If ( ::FAlias )->( OrdNumber() ) > 0 Return ( ::FAlias )->( OrdKeyNo() ) Else nBookmark := 1 nRecNo := ( ::FAlias )->( RecNo() ) ( ::FAlias )->( DbGoTop() ) Do While !( ::FAlias )->( Eof() ) .And. ( ::FAlias )->( RecNo() ) != nRecNo nBookmark++ ( ::FAlias )->( DbSkip() ) EndDo Return nBookmark EndIf EndIf Return Super:GetBookmark() /* * Asigna la fila actual. */ Method SetBookmark( nRow ) Class TDbGrid If !Empty( ::FAlias ) If ( ::FAlias )->( OrdNumber() ) > 0 ( ::FAlias )->( OrdKeyGoto( nRow ) ) Else ( ::FAlias )->( DbGoTop() ) nRow-- Do While !( ::FAlias )->( Eof() ) .And. nRow > 0 ( ::FAlias )->( DbSkip() ) nRow-- EndDo EndIf EndIf Super:SetBookmark( nRow ) Return /* * Obtiene el contenido de la columna. */ Method GetData( nCol ) Class TDbGrid Local uValue, cType If nCol > ::FFieldCount .Or. Empty( ::FAlias ) Return "" EndIf uValue := ::FFields[ nCol ] cType := ValType( uValue ) If cType == "C" Return ( ::FAlias )->( FieldGet( FieldPos( uValue ) ) ) ElseIf cType == "B" Return ( ::FAlias )->( Eval( uValue ) ) EndIf Return "" /* * Escritura de la propiedad Alias. */ Method SetAlias( cAlias ) Class TDbGrid cAlias := _eInstVar( Self, "ALIAS", cAlias, "C", 1001 ) If ::FAlias == cAlias Return EndIf ::FAlias := cAlias Return /* * Escritura de la propiedad Fields. */ Method SetFields( aFields ) Class TDbGrid aFields := _eInstVar( Self, "FIELDS", aFields, "A", 1001 ) aEval( aFields, { | uValue | _eInstVar( Self, "FIELDS", uValue, "CB", 1001 ) } ) ::FFields := aFields ::FFieldCount := Len( aFields ) Return