Mi primera Aplicación con Fivetouch
Posted: Sat Sep 16, 2017 10:50 am
Buenas a todos.
En 1995 comencé una aplicación con clipper 5.2 especializada en la gestión comercial para Ferreterías con un IDE propio, diseñador de pantallas con radiobuttom y check y todo eso, posteriormente empezé a utilizar Harbour y por supuesto ahora envia Mails, Genera eFacturas y las firma, funciona con LibbreOffice y MicrosoftOffice, Fotografias de Productos, Fichas tecnicas de productos, Tablet de Firma, Informes con Fastreport, etiquetadoras y .... todas esas cosas, está instalada en bastantes ferreterías y tiendas multiprecios y tiendas donde se trabaje con stoks y ahora me gustaría introducir una app para moviles y otra para tablet.
La App de moviles se necesita para el personal en el propio establecimiento, para regularizar inventario, realizar ventas con la correspondiente firma del cliente y mostrando claro está la foto del producto, imprimir etiquetas con codigo de barras, realizar pedidos de compra, ubicar productos y pocas cosas más.
La App de tablet sobre todo es para personal que está fuera del establecimiento y sobre todo está dedicado a la venta externa, por lo tanto, lo que se necesitaría es la posibilidad de pedidos de cliente con foto de productos y firma del cliente, también saber que es lo que mas consume el cliente, los recibos pendientes de cobro, las incidencias o faltas del cliente, etc...
Por lo tanto después de estudiar como hacerlo he visto el producto de fivetouch, puesto que como el tiempo es valioso para todos, necesitaba todo esto y por supuesto lo mas rápido posible, en principio parece que funciona con Android, IOS y Windows.
Así que voy a empezar primero la aplicación para dispositivos móviles y voy a ir documentándola en el foro, por supuesto que cometeré muchos fallos e iré cambiando cosas y volviendo atrás, supongo que estamos familiarizados, espero también por favor que me ayudéis puesto que soy nuevo en esto, también espero que le sirva a mas gente.
El primer módulo será el menú Rad_Main.prg y por cierto no se como subir la foto para que veais como funciona con android
#include "FiveTouch.ch"
Function Main()
Local lOk := .F.
Public cConexion
// Inicializacion RDD DBFCDX Nativo***
REQUEST DBFCDX , DBFFPT
RDDSETDEFAULT( "DBFCDX" )
// DATOS DE INICIALIZACION***
SET DATE FRENCH
SET CENTURY ON
SET DATE FORMAT "dd-mm-yy"
lOk := Conexion( IpConexion, Puerto, Contraseña )
If !lOk
MsgInfo('No existe Conexion')
Else
AbrirTablas()
WndPrincipal()
Endif
Return(NIL)
//--------------------------------------------------------------------------
Function WndPrincipal()
Local oPrincipal
Local aBtn[6]
DEFINE DIALOG oPrincipal TITLE "Radio JJG" ;
SIZE ScreenWidth(), ScreenHeight()
@ (( ScreenHeight()/6 ) * 0) +10, 020 BUTTON aBtn[1] PROMPT "Ventas" OF oPrincipal ;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo( 'Ventas' )
aBtn[1] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 1)+10, 020 BUTTON aBtn[2] PROMPT "Reposici¨®n" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo( 'Reposici¨®n' )
aBtn[2] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 2)+10, 020 BUTTON aBtn[3] PROMPT "Etiquetas" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight() /6 )-40 ACTION MsgInfo( 'Etiquetas' )
aBtn[3] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 3)+10, 020 BUTTON aBtn[4] PROMPT "Inventario" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo('Inventario')
aBtn[4] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 4)+10, 020 BUTTON aBtn[5] PROMPT "Cambio Sec/Fam" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo( 'Cambios Sec/Fam' )
aBtn[5] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 5)+10, 020 BUTTON aBtn[6] PROMPT "Cancel" OF oPrincipal ;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION oPrincipal:End()
aBtn[6] :SetStyleSheet( " font-size: 36px" )
ACTIVATE DIALOG oPrincipal CENTERED
Return( NIL )
//--------------------------------------------------------------------------
Function AbrirTablas()
DbCloseAll()
USE ( cConexion+'DBF/'+'F_ARTCLA') INDEX ( cConexion+'DBF/'+'F_ARTCLA') ALIAS 'F_ARTCLA' NEW SHARED
USE ( cConexion+'DBF/'+'F_ARTICU') INDEX ( cConexion+'DBF/'+'F_ARTICU') ALIAS 'F_ARTICU' NEW SHARED
USE ( cConexion+'DBF/'+'F_CLIENT') INDEX ( cConexion+'DBF/'+'F_CLIENT') ALIAS 'F_CLIENT' NEW SHARED
USE ( cConexion+'DBF/'+'F_DESVIA') INDEX ( cConexion+'DBF/'+'F_DESVIA') ALIAS 'F_DESVIA' NEW SHARED
USE ( cConexion+'DBF/'+'F_MOSTRA') INDEX ( cConexion+'DBF/'+'F_MOSTRA') ALIAS 'F_MOSTRA' NEW SHARED
USE ( cConexion+'DBF/'+'F_PEDIDO') INDEX ( cConexion+'DBF/'+'F_PEDIDO') ALIAS 'F_PEDIDO' NEW SHARED
USE ( cConexion+'DBF/'+'F_TIPIVA') INDEX ( cConexion+'DBF/'+'F_TIPIVA') ALIAS 'F_TIPIVA' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_ETIQUE') INDEX ( cConexion+'DBF/'+'F_ETIQUE') ALIAS 'F_ETIQUE' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_DIRCTE') INDEX ( cConexion+'DBF/'+'F_DIRCTE') ALIAS 'F_DIRCTE' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_PROMOC') INDEX ( cConexion+'DBF/'+'F_PROMOC') ALIAS 'F_PROMOC' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_DESCUE') INDEX ( cConexion+'DBF/'+'F_DESCUE') ALIAS 'F_DESCUE' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_ESTART') INDEX ( cConexion+'DBF/'+'F_ESTART') ALIAS 'F_ESTART' NEW SHARED READONLY
Return( NIL )
//-----------------------------------------------------------------------------------
Function Conexion( cNetServer, nNetPort, cNetPass )
Local lConect := .F.
//--------------------------------------------------------------------
// Conexi¨®n a Tablas a traves de Ip o dynddns
//--------------------------------------------------------------------
lConect := Netio_Connect( cNetServer, nNetPort,, cNetPass )
If lConect
cConexion := "net:" + cNetServer + ":" + hb_ntos( nNetPort ) + ":" + cNetPass + ":/"
Endif
//--------------------------------------------------------------------
// Conexi¨®n a Tablas en Disco Local o Disco de Red
//--------------------------------------------------------------------
If !lConect
cConexion := 'C:\FERRO\'
If HB_DirExists( cConexion )
lConect := .T.
Endif
Endif
Return( lConect )
//------------------------------------------
En 1995 comencé una aplicación con clipper 5.2 especializada en la gestión comercial para Ferreterías con un IDE propio, diseñador de pantallas con radiobuttom y check y todo eso, posteriormente empezé a utilizar Harbour y por supuesto ahora envia Mails, Genera eFacturas y las firma, funciona con LibbreOffice y MicrosoftOffice, Fotografias de Productos, Fichas tecnicas de productos, Tablet de Firma, Informes con Fastreport, etiquetadoras y .... todas esas cosas, está instalada en bastantes ferreterías y tiendas multiprecios y tiendas donde se trabaje con stoks y ahora me gustaría introducir una app para moviles y otra para tablet.
La App de moviles se necesita para el personal en el propio establecimiento, para regularizar inventario, realizar ventas con la correspondiente firma del cliente y mostrando claro está la foto del producto, imprimir etiquetas con codigo de barras, realizar pedidos de compra, ubicar productos y pocas cosas más.
La App de tablet sobre todo es para personal que está fuera del establecimiento y sobre todo está dedicado a la venta externa, por lo tanto, lo que se necesitaría es la posibilidad de pedidos de cliente con foto de productos y firma del cliente, también saber que es lo que mas consume el cliente, los recibos pendientes de cobro, las incidencias o faltas del cliente, etc...
Por lo tanto después de estudiar como hacerlo he visto el producto de fivetouch, puesto que como el tiempo es valioso para todos, necesitaba todo esto y por supuesto lo mas rápido posible, en principio parece que funciona con Android, IOS y Windows.
Así que voy a empezar primero la aplicación para dispositivos móviles y voy a ir documentándola en el foro, por supuesto que cometeré muchos fallos e iré cambiando cosas y volviendo atrás, supongo que estamos familiarizados, espero también por favor que me ayudéis puesto que soy nuevo en esto, también espero que le sirva a mas gente.
El primer módulo será el menú Rad_Main.prg y por cierto no se como subir la foto para que veais como funciona con android
#include "FiveTouch.ch"
Function Main()
Local lOk := .F.
Public cConexion
// Inicializacion RDD DBFCDX Nativo***
REQUEST DBFCDX , DBFFPT
RDDSETDEFAULT( "DBFCDX" )
// DATOS DE INICIALIZACION***
SET DATE FRENCH
SET CENTURY ON
SET DATE FORMAT "dd-mm-yy"
lOk := Conexion( IpConexion, Puerto, Contraseña )
If !lOk
MsgInfo('No existe Conexion')
Else
AbrirTablas()
WndPrincipal()
Endif
Return(NIL)
//--------------------------------------------------------------------------
Function WndPrincipal()
Local oPrincipal
Local aBtn[6]
DEFINE DIALOG oPrincipal TITLE "Radio JJG" ;
SIZE ScreenWidth(), ScreenHeight()
@ (( ScreenHeight()/6 ) * 0) +10, 020 BUTTON aBtn[1] PROMPT "Ventas" OF oPrincipal ;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo( 'Ventas' )
aBtn[1] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 1)+10, 020 BUTTON aBtn[2] PROMPT "Reposici¨®n" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo( 'Reposici¨®n' )
aBtn[2] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 2)+10, 020 BUTTON aBtn[3] PROMPT "Etiquetas" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight() /6 )-40 ACTION MsgInfo( 'Etiquetas' )
aBtn[3] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 3)+10, 020 BUTTON aBtn[4] PROMPT "Inventario" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo('Inventario')
aBtn[4] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 4)+10, 020 BUTTON aBtn[5] PROMPT "Cambio Sec/Fam" OF oPrincipal;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION MsgInfo( 'Cambios Sec/Fam' )
aBtn[5] :SetStyleSheet( " font-size: 36px" )
@ (( ScreenHeight()/6 ) * 5)+10, 020 BUTTON aBtn[6] PROMPT "Cancel" OF oPrincipal ;
SIZE ScreenWidth()-40, ( ScreenHeight()/6 )-40 ACTION oPrincipal:End()
aBtn[6] :SetStyleSheet( " font-size: 36px" )
ACTIVATE DIALOG oPrincipal CENTERED
Return( NIL )
//--------------------------------------------------------------------------
Function AbrirTablas()
DbCloseAll()
USE ( cConexion+'DBF/'+'F_ARTCLA') INDEX ( cConexion+'DBF/'+'F_ARTCLA') ALIAS 'F_ARTCLA' NEW SHARED
USE ( cConexion+'DBF/'+'F_ARTICU') INDEX ( cConexion+'DBF/'+'F_ARTICU') ALIAS 'F_ARTICU' NEW SHARED
USE ( cConexion+'DBF/'+'F_CLIENT') INDEX ( cConexion+'DBF/'+'F_CLIENT') ALIAS 'F_CLIENT' NEW SHARED
USE ( cConexion+'DBF/'+'F_DESVIA') INDEX ( cConexion+'DBF/'+'F_DESVIA') ALIAS 'F_DESVIA' NEW SHARED
USE ( cConexion+'DBF/'+'F_MOSTRA') INDEX ( cConexion+'DBF/'+'F_MOSTRA') ALIAS 'F_MOSTRA' NEW SHARED
USE ( cConexion+'DBF/'+'F_PEDIDO') INDEX ( cConexion+'DBF/'+'F_PEDIDO') ALIAS 'F_PEDIDO' NEW SHARED
USE ( cConexion+'DBF/'+'F_TIPIVA') INDEX ( cConexion+'DBF/'+'F_TIPIVA') ALIAS 'F_TIPIVA' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_ETIQUE') INDEX ( cConexion+'DBF/'+'F_ETIQUE') ALIAS 'F_ETIQUE' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_DIRCTE') INDEX ( cConexion+'DBF/'+'F_DIRCTE') ALIAS 'F_DIRCTE' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_PROMOC') INDEX ( cConexion+'DBF/'+'F_PROMOC') ALIAS 'F_PROMOC' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_DESCUE') INDEX ( cConexion+'DBF/'+'F_DESCUE') ALIAS 'F_DESCUE' NEW SHARED READONLY
USE ( cConexion+'DBF/'+'F_ESTART') INDEX ( cConexion+'DBF/'+'F_ESTART') ALIAS 'F_ESTART' NEW SHARED READONLY
Return( NIL )
//-----------------------------------------------------------------------------------
Function Conexion( cNetServer, nNetPort, cNetPass )
Local lConect := .F.
//--------------------------------------------------------------------
// Conexi¨®n a Tablas a traves de Ip o dynddns
//--------------------------------------------------------------------
lConect := Netio_Connect( cNetServer, nNetPort,, cNetPass )
If lConect
cConexion := "net:" + cNetServer + ":" + hb_ntos( nNetPort ) + ":" + cNetPass + ":/"
Endif
//--------------------------------------------------------------------
// Conexi¨®n a Tablas en Disco Local o Disco de Red
//--------------------------------------------------------------------
If !lConect
cConexion := 'C:\FERRO\'
If HB_DirExists( cConexion )
lConect := .T.
Endif
Endif
Return( lConect )
//------------------------------------------