Aporte. Nueva clase TQRecord. Para el árbol de Navidad
Posted: Thu Dec 13, 2018 8:58 pm
Hola a todos,
Siguiendo la estela de una pregunta de José Luis, os dejo una clase Record, orientada a la versatilidad y la rapidez.
Espero vuestros comentarios. Saludos
Siguiendo la estela de una pregunta de José Luis, os dejo una clase Record, orientada a la versatilidad y la rapidez.
Espero vuestros comentarios. Saludos
Code: Select all
///////////////
// TQRecord.prg - Quick Record
//
/////////////////////////////////////////////////
#include "hbclass.ch"
#Include "\prg\genlib\debug.ch"
//-------------------------------------------------------------------------//
function PruebaTQRecord()
Local oRec
Local cAlias:= "JAlgo", xRegistro
SELECT 0
USE \Algo ALIAS (cAlias)
IF Select(cAlias) == 0
MERROR_("no se pudo abrir !!", cAlias)
ENDIF
*
*
xRegistro:= 2
*
oRec:= TQRecord(cAlias):New(cAlias, xRegistro, .t.)
*
SELECT (cAlias)
GO xRegistro
*
FLOGMSG_("1", oRec, oRec:cAlias, oRec:AlmCod, AlmCod)
*
oRec:AlmCod:= "24"
FLOGMSG_("2", oRec, oRec:cAlias, oRec:AlmCod, AlmCod)
*
oRec:Graba()
FLOGMSG_("3", oRec, oRec:cAlias, oRec:AlmCod, AlmCod)
*
CLOSE (cAlias)
return nil
*
*
//-------------------------------------------------------------------------//
CLASS TQRecord
DATA cAlias
DATA nFCount HIDDEN
DATA aBuffer INIT {=>} HIDDEN
METHOD New() CONSTRUCTOR
METHOD AddField() HIDDEN
DATA nRecNumber HIDDEN
DATA aCampos HIDDEN
METHOD DondeCargar() HIDDEN
METHOD Llena()
METHOD Graba()
DATA lValueNil HIDDEN
ENDCLASS
//-------------------------------------------------------------------------//
// cAlias, Obligatorio
// xDondeCargar, posibles valores son: NIL, nRegistro, "EOF"
// lValueNil, indica si se cargaran las datas-field con NIL
METHOD New(cAlias, xDondeCargar, lValueNil) CLASS TQRecord
Local nArea:= Select()
Local nSitio
Local cName
Local nPos
*
::cAlias:= cAlias
IF lValueNil == NIL
lValueNil:= .f.
ENDIF
::lValueNil:= lValueNil
*
SELECT (cAlias)
::nFCount:= FCount()
nSitio:= Recno()
*
*
::aCampos:= Array(::nFCount)
*
::DondeCargar(xDondeCargar, lValueNil)
*
IF lValueNil
// Carga datas con NIL. Interesante para luego solo grabar los que no son NIL y asi
// permitir grabaciones parciales utiles por ejemplo en registros que tienen campos
// que se deben actualizar de forma separada, por ejemplo campos contador.
FOR nPos:= 1 TO ::nFCount
cName:= FieldName(nPos)
*
::aCampos[nPos] := cName
*
::AddField(cName, NIL)
NEXT
*
ELSE
FOR nPos:= 1 TO ::nFCount
cName:= FieldName(nPos)
*
::aCampos[nPos] := cName
*
::AddField(cName, FieldGet(nPos))
NEXT
*
ENDIF
GO nSitio
SELECT (nArea)
*
RETURN Self
*
//-------------------------------------------------------------------------//
METHOD DondeCargar(xDondeCargar)
*
DO CASE
CASE xDondeCargar == NIL .OR. ValType(xDondeCargar) == "N"
IF xDondeCargar == NIL
xDondeCargar:= Recno()
ENDIF
IF !::lValueNil // No necesario pq para lValueNil = .T. no se cargan datos
GO xDondeCargar
ENDIF
::nRecNumber:= xDondeCargar
*
CASE ValType(xDondeCargar) == "C" .AND. xDondeCargar == "EOF"
IF !::lValueNil
GO BOTTOM
SKIP // Eof(), para datas vacias, y nuevo
ENDIF
::nRecNumber:= 0
*
*
CASE .T.
MERROR_("Opcion no contemplada !!", cAlias, xDondeCargar)
*
ENDCASE
*
RETURN NIL
*
//-------------------------------------------------------------------------//
METHOD AddField(cName, uValue)
*
::aBuffer[cName] := uValue
*
__clsAddMsg( ::ClassH, cName,;
{|Self | Self:aBuffer[cName] }, HB_OO_MSG_INLINE )
*
__clsAddMsg( ::ClassH, "_" + cName,;
{|Self, uValue| Self:aBuffer[cName] := uValue }, HB_OO_MSG_INLINE )
*
return Self
//-------------------------------------------------------------------------//
STATIC FUNCTION Vacia()
::Llena(xDondeCargar)
RETURN NIL
*
//-------------------------------------------------------------------------//
METHOD Llena(xDondeCargar)
Local nArea:= Select()
Local nSitio
Local nPos
Local cName
*
SELECT (cAlias)
nSitio:= Record()
*
::DondeCargar(xDondeCargar)
*
IF ::lValueNil
// Carga datas con NIL. Interesante para luego solo grabar los que no son NIL
FOR nPos:= 1 TO ::nFCount
cName:= FieldName(nPos)
*
::Buffer[cName]:= NIL
*
NEXT
*
ELSE
FOR nPos:= 1 TO ::nFCount
cName:= FieldName(nPos)
*
::Buffer[cName]:= FieldGet(nPos)
*
NEXT
*
ENDIF
*
GO nSitio
SELECT (nArea)
RETURN NIL
//-------------------------------------------------------------------------//
METHOD Graba()
Local nArea:= Select()
Local nSitio
Local nI, nPos
Local lValueNil:= ::lValueNil
*
SELECT (::cAlias)
nSitio:= Recno()
*
IF ::nRecNumber == 0
Add_Rec(0)
ELSE
GO ::nRecNumber
Rec_Lock(0)
ENDIF
*
FOR nI:= 1 TO ::nFCount
// Grabacion segura (cambio de orden de campos entre tabla de origen y
// tabla de destino o bien no existe el campo en destino.)
nPos:= FieldPos(::aCampos[nI])
IF nPos > 0
IF If(lValueNil , ::aBuffer[::aCampos[nI]] != NIL, .t.)
FieldPut(nPos, ::aBuffer[::aCampos[nI]])
ENDIF
ENDIF
NEXT
*
UNLOCK
*
GO nSitio
*
SELECT (nArea)
RETURN NIL
*
*