Page 1 of 1

Mi primera Aplicación con Fivetouch

Posted: Sat Sep 16, 2017 10:50 am
by jtscalpe
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 )
//------------------------------------------

Re: Mi primera Aplicación con Fivetouch

Posted: Mon Oct 09, 2017 1:33 am
by ruben Dario
Hola jtscalpe
Quiero empezar , me gustaria compilar tu ejemplo, tu me puedes decir, que debo tener instalado para crear el APK, se puede crear desde Windows

Gracias

Re: Mi primera Aplicación con Fivetouch

Posted: Mon Oct 08, 2018 7:55 pm
by xfood
Es un buen ejemplo, ¿puede 'tener netio_server?, también podría tener un ejemplo de grid (listbox) con un botón de edición para abrir un cuadro de diálogo para cambiar los datos del registro seleccionado en la cuadrícula, muchas gracias



jtscalpe wrote: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 )
//------------------------------------------