FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour oRowSet -> Alias()
Posts: 17
Joined: Fri Apr 18, 2008 02:41 PM
oRowSet -> Alias()
Posted: Wed Dec 31, 2025 08:01 PM

Hola amigos, antes que nada, ¡feliz año nuevo a todos!

Comencé a usar Harbour + FW 25.12 + MSVC y me gustaría saber si puedo convertir un objeto "oRowSet" en un "alias". ¿Es posible?

Actualmente:

cCmdSql := "SELECT * FROM cadastro"
oRowSet := oConexao:RowSet( cCmdSql )
xBrowse( oRowSet )

en:
SetAlias( oRowSet, 'tmp' ) // ¿Se vería algo así?
tmp-> ( xbrowse() )

Disculpen, dejé de usar la versión 14.12 de FW y no estoy familiarizado con las nuevas funciones y clases.

Gracias

Alexandre Pereira

Harbour 3.2 - FWH - 25.12 - MSVC - VsCODE - Win11

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: oRowSet -> Alias()
Posted: Thu Jan 01, 2026 02:16 PM

Estimado Alexandre,

No, no es posible convertir directamente un objeto FWMariaRowSet (o FWRowSet) en un alias de xBase tradicional. 0-cite-0

Respuesta

Los objetos FWMariaRowSet y FWRowSet son clases que emulan el comportamiento de un alias de xBase, pero no son áreas de trabajo reales de la RDD (Replaceable Database Driver). 0-cite-1 Estos objetos mantienen los datos en memoria en el array aData y proporcionan métodos como Skip(), GoTo(), FieldGet(), etc., que imitan la interfaz de navegación de DBF. 0-cite-2

No existe una función SetAlias() en FiveWin que convierta un RowSet en un alias tradicional.<cite /> La arquitectura del framework está diseñada para que trabajes directamente con el objeto RowSet, no con alias.<cite />

Alternativas

1. Usar el objeto directamente con xBrowse():

Tu código actual ya es la forma correcta:

Code (harbour): Select all Collapse
cCmdSql := "SELECT * FROM cadastro"
oRowSet := oConexao:RowSet( cCmdSql )
xBrowse( oRowSet )

TXBrowse está diseñado para trabajar directamente con objetos RowSet. 0-cite-3

2. Acceder a los datos del RowSet:

Puedes navegar y acceder a los datos usando los métodos del objeto:

Code (harbour): Select all Collapse
oRowSet:GoTop()
DO WHILE !oRowSet:Eof()
   ? oRowSet:FieldGet("campo")
   oRowSet:Skip()
ENDDO

3. Si necesitas un alias DBF real:

Si realmente necesitas trabajar con un alias tradicional, tendrías que exportar los datos del RowSet a un archivo DBF temporal y luego abrirlo con USE.<cite /> Sin embargo, esto eliminaría las ventajas de trabajar directamente con la base de datos SQL.

Notes

La clase FWMariaRowSet hereda de FWRowSet y proporciona funcionalidad adicional específica para MariaDB/MySQL. 0-cite-4 Ambas clases implementan una interfaz compatible con la navegación de xBase pero no son áreas de trabajo RDD reales, por lo que no pueden usarse con la sintaxis de alias tradicional como tmp->campo.<cite />

Wiki pages you might want to explore:

Citations

File: source/internal/fwrowset.prg (L18-28)

Code (text): Select all Collapse
CLASS FWRowSet

PROTECTED:
   DATA  xBlankRow
   DATA  fld_list
   DATA  aNatural

EXPORT:
   DATA  aData       INIT Array( 0 )
   DATA  cFile       INIT 'ARRAY'
   DATA  cAlias      INIT 'ARRAY'

File: source/internal/fwrowset.prg (L50-88)

Code (text): Select all Collapse
   METHOD RecCount()       INLINE Len( ::aData )
   METHOD LastRec()        INLINE Len( ::aData )
   METHOD RecordCount()    INLINE Len( ::aData )

   METHOD RecNo()          INLINE ::BookMark //::nAt
   METHOD FCount()         INLINE Len( ::aStruct )
   METHOD FieldPos( cFld )
   METHOD FieldName( n )   INLINE ( n := ::FieldPos( n ), ;
                                  If( n > 0 .and. n <= Len( ::aStruct ), ;
                                  ::aStruct[ n ][ 1 ], '' ) )
   METHOD FieldType( n )   INLINE ( n := ::FieldPos( n ), ;
                                  If( n > 0 .and. n <= Len( ::aStruct ), ;
                                  ::aStruct[ n ][ 2 ], '' ) )
   METHOD FieldLen( n )    INLINE ( n := ::FieldPos( n ), ;
                                  If( n > 0 .and. n <= Len( ::aStruct ), ;
                                  ::aStruct[ n ][ 3 ], 0 ) )
   METHOD FieldDec( n )    INLINE ( n := ::FieldPos( n ), ;
                                  If( n > 0 .and. n <= Len( ::aStruct ), ;
                                  ::aStruct[ n ][ 4 ], 0 ) )

   METHOD Bof()            INLINE ( ::nAt < 1 .or. Empty( ::aData ) )
   METHOD Eof()            INLINE ::nAt > ::KeyCount()

   METHOD CellValue( nRow, nCol )
   METHOD CellGet( aRow, nFld ) PROTECTED
   METHOD CellPut( aRow, nFld, uValue ) PROTECTED

   METHOD FieldGet( n )       INLINE ::CellGet( nil, n )
   METHOD FieldPut( nFld, uValue )

   METHOD GoTo( n )           INLINE ( ::BookMark := n )
   METHOD GoTop()             INLINE ::nAt := Min( 1, ::KeyCount() )
   METHOD GoBottom()          INLINE ::nAt := Max( 1, ::KeyCount() )
   METHOD Skip( n )           INLINE ::KeyGoTo( ::nAt + If( n == nil, 1, n ) )
   METHOD Skipper( nToSkip )
   METHOD BookMark( uBm )       SETGET
   METHOD KeyNo()             INLINE ::nAt
   METHOD KeyGoTo( nkeyNo )   INLINE ::nAt := Max( 1, Min( nKeyNo, ::KeyCount() ) )
   METHOD KeyCount()          INLINE Eval( ::bKeyCount )

File: source/internal/fwmaria.prg (L1299-1310)

Code (text): Select all Collapse
CLASS FWMariaRowSet FROM FWRowSet STATIC

   DATA hLastRec  INIT 0 PROTECTED

   DATA oCn //READONLY
   DATA oReplServer  // replication
   DATA bOnReplFail

   DATA hBof AS LOGICAL INIT .f. PROTECTED
   DATA hAt PROTECTED
   ACCESS nAt  INLINE ::hAt
   ASSIGN nAt( x ) INLINE If( ::hAt == x, nil, ( ::CheckSave(), ::hAt := x ) )

File: samples/ui/xbrowse/testxbr3.prg (L435-436)

Code (text): Select all Collapse
   @ 0,0 XBROWSE oBrw OF ownd RECSET oRs AUTOCOLS AUTOSORT FOOTERS FASTEDIT ;
         LINES CELL
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: oRowSet -&gt; Alias()
Posted: Thu Jan 01, 2026 09:41 PM

Primero para que desea hacerlo? Si es solo para hacer eso que indicas, no es necesario, ya que con hacer xbrowse( oRowSet) pues ya muestras los datos. Incluso en fw hay un comando:

Fwdbg date(), time(), oRowSet

Que puedes usar

Ahora sí sería posible tomar un record set y exportarlo a un tabla dbf, la cual luego deberás abrir manipular y cerrar finalmente.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 17
Joined: Fri Apr 18, 2008 02:41 PM
Re: oRowSet -&gt; Alias()
Posted: Fri Jan 02, 2026 03:52 PM

Gracias @Antonio.

@Carlos, para aprovechar el código del informe anterior, me adaptaré rápidamente al nuevo escenario, que realmente se adapta a mis necesidades.

Alexandre Pereira

Harbour 3.2 - FWH - 25.12 - MSVC - VsCODE - Win11

Posts: 17
Joined: Fri Apr 18, 2008 02:41 PM
Re: oRowSet -&gt; Alias()
Posted: Mon Jan 05, 2026 09:07 PM

Buenas tardes a todos.

Para todo el sistema, usaré el objeto oRowSet debido a su mayor velocidad.

Solo necesitaré usar el alias en los informes que ya he desarrollado en FastReport.

Sin embargo, decidí crear una función de conversión para facilitar el uso del alias y así evitar tener que cambiar nada en los informes existentes.

Esta es la función:

////////////////////////////DADOS DA FUNCAO//////////////////////////////////
// NOME : RowSetToAlias ///
// FINALIDADE : Transformar um objeto de dados em alias ///
// PARAMETROS : <1> oRS - Objeto do database ///
// <2> cAlias - Nome do Alias ///
// RETORNO : cAlias Aberto Alexandre ///
/////////////////////////////////////////////////////////////////////////////
Function RowSetToAlias( oRS, cAlias )
local aDbStruct := {}
local aFullStruct := oRS:aStructure


local cFieldName, cType

local nDec, nFields, nI, nLen

local uVal

// Convertendo a estrutura do SQL para DBF sem limites de nome
for nI := 1 to len( aFullStruct )
    cFieldName := upper( alltrim( aFullStruct[nI, 1] ) )
    cType      := upper( alltrim( aFullStruct[nI, 2] ) )
    nLen       := int( aFullStruct[nI, 3] )
    nDec       := int( aFullStruct[nI, 4] )

    // Ajuste de tipos para compatibilidade com o motor do Harbour
    if cType $ "ITBY+" 
        cType := "N"
    elseif cType == "T"
        cType := "D"
        nLen  := 8
    elseif cType == "C" .and. nLen > 254
        cType := "M"
        nLen  := 10
    endif
    
    // Se o tipo não for numérico o decimal TEM que ser zero
    if cType != "N"
        nDec := 0
    endif

    // Se for numérico aumenta o tamanho para valores negativos/estouros
    if cType == "N"
        nLen ++
    endif

    // Montando a estrutura com o nome original completo
    aadd( aDbStruct, { cFieldName, cType, nLen, nDec } )
next

// Fecha a area se ela ja estiver aberta
if Select( cAlias ) > 0
    ( cAlias )->( dbCloseArea() )
endif

// Cria e Abre a tabela em memoria
try
    dbCreate( "mem:" + cAlias, aDbStruct,, .t., cAlias )
catch oErr
    MsgStop( "Falha na estrutura: " + oErr:Description )
    return nil
end

// Populando a tabela temporária
nFields := len( aDbStruct )

oRS:GoTop()

while !oRS:Eof()
    ( cAlias )->( dbAppend() )
    
    for nI := 1 to nFields
        // Busca pelo nome original (agora idêntico ao do Alias)
        uVal := oRS:FieldGet( aFullStruct[nI, 1] )
        
        if uVal != nil
            ( cAlias )->( FieldPut( nI, uVal ) )
        endif
    next
    
    oRS:Skip()
end

( cAlias )->( dbGoTop() )

return ( cAlias )

¿Qué pensaron los maestros?

Alexandre Pereira

Harbour 3.2 - FWH - 25.12 - MSVC - VsCODE - Win11

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: oRowSet -&gt; Alias()
Posted: Thu Jan 08, 2026 03:40 PM

Muy bien, traspasas los datos del recordset a una tabla dbf en memoria. Así no cambias nada en los reportes. :) facilitando la conversión de la app a c/s.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion