//#include "G20Talle.ch" #include "Gui.ch" /* * Clase TDbGrid. */ Class TGesGrid 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 TGesGrid Super:Create( oOwner ) Return /* * Comprueba si está al final de la fuente de datos. */ Method DataEof() Class TGesGrid Return If( Empty( ::FAlias ), .T., ( ::FAlias )->( Eof() ) ) /* * Desplaza la fila activa a la primera posición. */ Method DataFirst() Class TGesGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbGoTop() ) EndIf Return 1 /* * Desplaza la fila activa a la última posición. */ Method DataLast() Class TGesGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbGoBottom() ) EndIf Return ::DataRecordCount() /* * Desplaza la fila activa una distancia determinada. */ Method DataMoveBy( nDistance ) Class TGesGrid Local nSkip, nCurPos If !Empty( ::FAlias ) If Abs( nDistance ) > 100 nCurPos := ( ::FAlias )->( RecNo() ) nSkip := nDistance nDistance += nCurPos If nDistance < 1 ( ::FAlias )->( DbGoTop() ) nSkip := 1 - nCurPos Else ( ::FAlias )->( DbGoto( 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 TGesGrid 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 TGesGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbSkip() ) EndIf Return /* * Desplaza la fila activa una posición hacia atrás. */ Method DataPrev() Class TGesGrid If !Empty( ::FAlias ) ( ::FAlias )->( DbSkip( -1 ) ) EndIf Return /* * Obtiene el número total de filas de la fuente de datos. */ Method DataRecordCount() Class TGesGrid Local nRecords, nRecord, nFilas nRecords := 0 If !Empty( ::FAlias ) nFilas=Int((Self:Height/Self:RowHeight)-2) nRecord := ( ::FAlias )->( RecNo() ) ( ::FAlias )->( DbGoTop() ) Do While !( ::FAlias )->( Eof() ) If (nRecords>nFilas .and. Empty((::FAlias)->(DBFilter()))) nRecords=(::FAlias)->(RecCount()) Exit EndIf nRecords++ ( ::FAlias )->( DbSkip() ) EndDo ( ::FAlias )->( DbGoTo( nRecord ) ) EndIf Return nRecords /* * Obtiene la fila actual. */ Method GetBookmark() Class TGesGrid /* Local nRecNo, nBookmark ?'Paso' If !Empty( ::FAlias ) If ( ::FAlias )->( Eof() ) ( ::FAlias )->( DbGoBottom() ) EndIf nBookmark := 1 nRecNo := ( ::FAlias )->( RecNo() ) ( ::FAlias )->( DbGoTop() ) Do While !( ::FAlias )->( Eof() ) .And. ( ::FAlias )->( RecNo() ) != nRecNo nBookmark++ ( ::FAlias )->( DbSkip() ) EndDo Return nBookmark EndIf*/ Return Super:GetBookmark() /* * Asigna la fila actual. */ Method SetBookmark( nRow ) Class TGesGrid 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 TGesGrid 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 TGesGrid cAlias := _eInstVar( Self, "ALIAS", cAlias, "C", 1001 ) If ::FAlias == cAlias Return EndIf ::FAlias := cAlias Return /* * Escritura de la propiedad Fields. */ Method SetFields( aFields ) Class TGesGrid aFields := _eInstVar( Self, "FIELDS", aFields, "A", 1001 ) aEval( aFields, { | uValue | _eInstVar( Self, "FIELDS", uValue, "CB", 1001 ) } ) ::FFields := aFields ::FFieldCount := Len( aFields ) Return