Este es el segundo artículo sobre modelo de datos, en este estudiaremos las clases TFactura y TLineasFactura.
Desde la clase TFactura accederemos a objetos de las clases TCliente y TLineasFactura; y de la clase TLineasFactura accederemos a un objeto de la clase TArticulo.
Observando el código de las clases notaremos que el nivel de automatización al que se llega y que nos facilitará mucho el trabajo de codificación de nuestra aplicación.
CLASS TFactura FROM TQuery
DATA cConsulta
DATA oCli
DATA oLin
METHOD Init( cQuery )
METHOD Delete( nId_Articulo )
METHOD Change( oSender )
ACCESS oCliente
ACCESS oLineas
END CLASS
METHOD Init( cQuery ) CLASS TFactura
DEFAULT cQuery TO “SELECT * FROM cabfac”
::New()
::OnChange := { | oSender | Change( oSender ) }
::cConsulta := cQuery
::Query( ::cConsulta )
RETURN Self
METHOD Delete( nId_Factura ) CLASS TFactura
IF !Empty( nId_Factura )
::Command( “DELETE FROM cabfac “ + ;
“WHERE id = “ + Str( nId_Factura ) + “ “ + ;
“LIMIT 1” )
::Change()
END IF
RETURN Nil
METHOD Change( oSender ) CLASS TFactura
::oCli := NIL
::oLin := NIL
RETURN Nil
METHOD oCliente CLASS TFactura
IF Empty( ::oCli )
::oCli := TCliente():Init( “SELECT * FROM cliente “ + ;
“WHERE id = “ + Str( ::Id_Cliente ) )
END IF
RETURN ::oCli
METHOD oLineas CLASS TFactura
IF Empty( ::oLin )
::oLin := TLineasFactura():Init( “SELECT * FROM detfac “ + ;
“WHERE id_factura = “ + Str( ::Id ) + ” ” + ;
“ORDER BY linea” )
END IF
RETURN ::oLin
//——————————————————————-//
CLASS TLineasFactura FROM TQuery
DATA cConsulta
DATA oArt
METHOD Init( cQuery )
METHOD Delete( nId_Articulo )
METHOD Change( oSender )
ACCESS oArticulo
END CLASS
METHOD Init( cQuery ) CLASS TLineasFactura
DEFAULT cQuery TO “SELECT * FROM detfac”
::New()
::OnChange := { | oSender | Change( oSender ) }
::cConsulta := cQuery
::Query( ::cConsulta )
RETURN Self
METHOD Delete( nId_Factura, nLinea ) CLASS TLineasFactura
IF !Empty( nId_Factura )
::Command( “DELETE FROM derfac “ + ;
“WHERE id_factura = “ + Str( nId_Factura ) + “ “ + ;
“AND linea = ” + Str( nLinea ) + ” ” + ;
“LIMIT 1” )
::Change()
END IF
RETURN Nil
METHOD Change( oSender ) CLASS TLineasFactura
::oArt := NIL
RETURN Nil
METHOD oArticulo CLASS TLineasFactura
IF Empty( ::oArt )
::oArt := TArticulo():Init( “SELECT * FROM articulo “ + ;
“WHERE id = “ + Str( ::Id_Articulo ) )
END IF
RETURN ::oArt
//——————————————————————-//
Para acceder a una factura, símplemente tendremos que escribir el siguiente código:
oFactura := TFactura():Init( “SELECT * FROM cabfac WHERE id = ” + Str( nNumFac )
para acceder a los datos del cliente de una factura:
oCliente := oFactura:oCliente
MsgInfo( oCliente:Nombre )
para acceder a las lineas de la factura:
nTotal := 0
oFactura:oLineas:GoTop()
WHILE !oFactura:oLineas:Eof()
nTotal += oFactura:oLineas:Cantidad * oFactura:oLineas:Precio
oFactura:oLineas:Skip()
END DO
MsgInfo( nTotal )
para acceder al nombre de un artículo:
oFactura:oLineas:oArticulo:Nombre
Con esto terminamos el segundo artículo dedicado a la introducción al modelo de datos. En el próximo estudiaremos como ir mejorando poco a poco las estructuras de datos para, por ejemplo, poder refrescar las consultas, aplicar el uso de vistas, crear métodos que proporcionen totales, etc. Veremos como el modelo básico que hemos definido en estos dos artículos puede completarse hasta conseguir una funcionalidad tan amplia que aumentará el ahorro y claridad posterior de nuestro código.