Claro que si, aquí verás que los nombres de los campos se usan como DATAS dinámicas ya que no se de finen en la clase TDbRecord.
Recuerda crear un PRG llamado "TDbRecord.prg" con el código del mensaje anterior para que no de error esta linea del final: #include "TDbRecord.prg"
//----------------------------------------------------------------------------//
// AUTOR.....: Manuel Expósito Suárez //
// eMails....: <!-- e --><a href="mailto:xmessoft@gmail.com">xmessoft@gmail.com</a><!-- e --> //
// CLASE.....: TDbRecord //
// FECHA MOD.: 21/09/1997 //
// VERSION...: 1.5 //
// PROPOSITO.: Clase para el manejo del BUFFER de registros //
//----------------------------------------------------------------------------//
// PROPOSITO.: Ejemplo de mantenimiento de una tabla con TDbRecord //
//----------------------------------------------------------------------------//
//-- Definiciones ------------------------------------------------------------//
#define B_BOX ( CHR( 218 ) + CHR( 196 ) + CHR( 191 ) + CHR( 179 ) + ;
CHR( 217 ) + CHR( 196 ) + CHR( 192 ) + CHR( 179 ) + " " )
#define ID_CONSUTA 0
#define ID_MODIFICA 1
#define ID_ALTA 2
#define ID_BORRA 3
//-- Includes ----------------------------------------------------------------//
#include "InKey.ch"
REQUEST HB_GT_WIN
//-- Modulo principal --------------------------------------------------------//
procedure main()
local oRec
SET DATE FORMAT TO "DD/MM/YYYY"
SET DELETED ON
cls
// Creamos objeto Record y abrimo la DBF es igual que hacer:
// USE Test NEW SHARED
// oRec := TDbRecord():New()
// La sitaxis es:
// METHOD Use( cDBF, lNewWA, cRDD, cAlias, lShare, lReadOnly )
oRec := TDbRecord():Use( "Test", .t.,,, .t. )
if oRec:Used()
// Abrimos el Browse
GestBrw( oRec )
else
Alert( "No se pudo abrir el fichero..." )
endif
DbCloseAll()
return
//-- Modulos auxiliares ------------------------------------------------------//
//----------------------------------------------------------------------------//
// Gestion completa de una tabla MySQL
static procedure GestBrw( oRec )
local oBrw, oCol
local lEnd := .f.
local nKey, n, nFld
oBrw := TBrowseDb( 1, 0, MaxRow() - 1, MaxCol() )
oBrw:colorSpec := "W+/B, N/BG"
oBrw:ColSep := " ³ "
oBrw:HeadSep := "ÄÅÄ"
oBrw:FootSep := "ÄÁÄ"
nFld := oRec:nFields
FOR n := 1 TO nFld
oBrw:AddColumn( TBColumnNew( ( oRec:nArea )->( FieldName( n ) ), GenCB( oRec, n ) ) )
NEXT
cls
@ 0, 0 SAY PadC( "Ojeando la tabla: " + ;
upper( ( oRec:nArea )->( Alias() ) ), MaxCol() + 1, " " ) COLOR "W+/G+"
@ MaxRow(), 0 SAY "INSERT" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Altas" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "ENTER" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Modifica" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "SUPR" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Bajas" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F4" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY " " COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F5" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY " " COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F6" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY " " COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "ESC" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Salir" COLOR "W+/R+"
while !lEnd
oBrw:ForceStable()
nKey = InKey( 0 )
do case
case nKey == K_ESC // Salir
SetPos( MaxRow(), 0 )
lEnd = .t.
case nKey == K_DOWN // Fila siguiente
oBrw:Down()
case nKey == K_UP // Fila anterior
oBrw:Up()
case nKey == K_LEFT // Va a la columna antrior
oBrw:Left()
case nKey == K_RIGHT // Va a la columna siguiente
oBrw:Right()
case nKey = K_PGDN // Va a la pagina siguiente
oBrw:pageDown()
case nKey = K_PGUP // Va a la pagina antrior
oBrw:pageUp()
case nKey = K_CTRL_PGUP // Va al principio
oBrw:goTop()
case nKey = K_CTRL_PGDN // Va al final
oBrw:goBottom()
case nKey = K_HOME // Va a la primera columna visible
oBrw:home()
case nKey = K_END // Va a la ultima columna visible
oBrw:end()
case nKey = K_CTRL_LEFT // Va a la primera columna
oBrw:panLeft()
case nKey = K_CTRL_RIGHT // Va a la ultima columna
oBrw:panRight()
case nKey = K_CTRL_HOME // Va a la primera página
oBrw:panHome()
case nKey = K_CTRL_END // Va a la última página
oBrw:panEnd()
case nKey = K_DEL // Borra fila
Borrar( oRec, oBrw )
case nKey = K_INS // Inserta columna
Insertar( oRec, oBrw )
case nKey = K_ENTER // Modifica columna
Modificar( oRec, oBrw )
endcase
end
return
//----------------------------------------------------------------------------//
// Crea los codeblock SETGET de las columnas del browse
static function GenCB( oRec, n )
return( { || ( oRec:nArea )->( FieldGet( n ) ) } )
//----------------------------------------------------------------------------//
// Pantalla de datos de la tabla
static function PantMuestra( oRec, nTipo )
local GetList := {}
local cTipo, cId
do case
case nTipo == ID_ALTA
cTipo := "Insertando"
cId := "nuevo"
case nTipo == ID_BORRA
case nTipo == ID_CONSUTA
case nTipo == ID_MODIFICA
cTipo := "Modificando"
cId := AllTrim( Str( ( oRec:nArea )->( RecNo() ) ) )
end
SET CURSOR ON
DispBox( 3, 2, 18, 74, B_BOX )
@ 04, 03 SAY cTipo + " registro en tabla " + ( oRec:nArea )->( Alias() ) + " - Numero: " + cId
@ 06, 03 SAY "First....:" GET oRec:First PICTURE "@K"
@ 07, 03 SAY "Last.....:" GET oRec:Last PICTURE "@K"
@ 08, 03 SAY "Street...:" GET oRec:Street PICTURE "@K"
@ 09, 03 SAY "City.....:" GET oRec:City PICTURE "@K"
@ 10, 03 SAY "State....:" GET oRec:State PICTURE "@K"
@ 11, 03 SAY "Zip......:" GET oRec:Zip PICTURE "@K"
@ 12, 03 SAY "Hiredate.:" GET oRec:Hiredate PICTURE "@K"
@ 13, 03 SAY "Married..:" GET oRec:Married PICTURE "@K"
@ 14, 03 SAY "Age......:" GET oRec:Age PICTURE "@K"
@ 15, 03 SAY "Salary...:" GET oRec:Salary PICTURE "@K"
@ 16, 03 SAY "Notes:"
@ 17, 03 GET oRec:Notes PICTURE "@K"
return( GetList )
//----------------------------------------------------------------------------//
// Inserta una fila
static procedure Insertar( oRec, oBrw )
local GetList := {}
local cPant := SaveScreen( 3, 2, 18, 74 )
oRec:Blank()
GetList := PantMuestra( oRec, ID_ALTA )
READ
set cursor off
RestScreen( 3, 2, 18, 74, cPant )
if LastKey() != K_ESC .and. Updated()
if oRec:Insert( .t. )
Alert( "Tupla insertada" )
oBrw:RefreshAll()
else
Alert( "No se pudo insertar el registro;" +;
"El reistro está bloqueado por otro" )
endif
endif
return
//----------------------------------------------------------------------------//
// Modifica la fila actual
static procedure Modificar(oRec,oBrw )
local GetList := {}
local cPant := SaveScreen( 3, 2, 18, 74 )
oRec:Load()
GetList := PantMuestra( oRec, ID_MODIFICA )
READ
set cursor off
RestScreen( 3, 2, 18, 74, cPant )
if LastKey() != K_ESC .and. Updated()
if oRec:Update( .t. )
Alert( "Tupla Modificada" )
oBrw:RefreshCurrent()
else
Alert( "No se pudo actualizar el registro;" +;
"El reistro está bloqueado por otro" )
endif
endif
return
//----------------------------------------------------------------------------//
// Borra la fila actual
static procedure Borrar( oRec, oBrw )
local nRec := ( oRec:nArea )->( RecNo() )
if Alert( "Realmente quieres borrar el registro?", { "Si", "No" } ) == 1
if oRec:Delete( .t. )
Alert( "Borrado..." )
oBrw:RefreshAll()
else
Alert( "No se pudo borrar el registro;" +;
"El reistro está bloqueado por otro" )
endif
else
Alert( "No se ha borrado..." )
endif
return
//----------------------------------------------------------------------------//
#include "TDbRecord.prg"
//----------------------------------------------------------------------------//