Sincronización en/a través de la Nube

Sincronización en/a través de la Nube

Postby Antonio Mart. » Tue Mar 26, 2013 7:25 pm

Hola a todos,

Teniendo ya más o menos encaminado el nuevo programa para las tablets con estilo "touching", viene otra etapa.

Se trataría de que varios comerciales llevarían sus tablets y deberían enviar/ sincronizar sus datos con el server de la empresa.
Como la conexión internet no es "segura", entonces hay que pensar en una base de datos móvil.
Pero como las bases de datos móviles, con capacidades de sincronización, además de caras, son una aventura por explorar para mí, había pensado en utilizar algún servicio de sincronización en/ a través de la nube utilizando nuestras queridas dbfs.

Había pensado que en el server cada comercial tuviera su propia carpeta que sería sincronizada con la suya del tablet a través del "servicio sincronizador" (dropbox/ skydrive/...)

Ahora bien, y aquí vienen las dudas:
¿ Se podría sincronizar varias cuentas distintas en el servidor ?
¿ Alguien tiene experiencia con esto o con los servicios de sincronización que estos programas proporcionan ?

Una pena que Dropbox no provea API para Windows.

Se agradece cualquier comentario. Saludos
Last edited by Antonio Mart. on Wed Mar 27, 2013 8:16 am, edited 1 time in total.
Antonio Mart.
 
Posts: 174
Joined: Sat Feb 23, 2013 10:04 am

Re: Sincronización en/a través de la Nube

Postby wilsongamboa » Wed Mar 27, 2013 2:56 am

Antonio yo uso un servidor FTP en la central y un programa en el server que siempre esta escuchando al servidor FTP cuando hay alguna info actualiza la data, en las netbook de la empresa esta un programa que genera localmente la data y puede enviar o Pedir información
El unico problema que he tenido es que a veces se clava el programa ftp.exe de microsoft que utilizo ya que no pude hacer andar la rutinas del ftp de fivewin
saludos cordiales
Wilson 'W' Gamboa A
Wilson.josenet@gmail.com
User avatar
wilsongamboa
 
Posts: 548
Joined: Wed Oct 19, 2005 6:41 pm
Location: Quito - Ecuador

Re: Sincronización en/a través de la Nube

Postby Antonio Mart. » Wed Mar 27, 2013 8:42 am

Wilson,

Gracias por responder.

Me parece una solución válida la tuya.
Yo había pensado la solución cloud, también pensando en que no fuera necesario transmitir toda la información, es decir, todo el fichero, sino la parte de él que hubiera cambiado. Ciertamente no sé si esto es posible.

Una pregunta... ¿ has establecido algún sistema de semáforos para no tratar la información cuando se esté en el momento de la transmisión ?

Saludos

PD. A propósito de tu comentario estaba pensando si los webserver de harbour o bien el hbNetIO también de harbour me podrían ayudar a este tema.
Antonio Mart.
 
Posts: 174
Joined: Sat Feb 23, 2013 10:04 am

Re: Sincronización en/a través de la Nube

Postby wilsongamboa » Wed Mar 27, 2013 12:10 pm

Antonio
Lo Mio es cobros y pedidos de vendedores tengo un campo de envio y otro de clave única transmito registros zipeados y en el server se recibe se descomprime y se actualiza según el caso
Wilson 'W' Gamboa A
Wilson.josenet@gmail.com
User avatar
wilsongamboa
 
Posts: 548
Joined: Wed Oct 19, 2005 6:41 pm
Location: Quito - Ecuador

Re: Sincronización en/a través de la Nube

Postby benjiben143 » Wed Mar 27, 2013 4:04 pm

hola wenos dias

con la clase tsocket puedes hacer la transmision ( reportes, consultas , actualizaciones ) tanto directamente de un programa en windows con fivewin y tambien lo puedes conectar con php para la we o cgi


en este ejemplo del prg recibo la petecion de la web al servidor dbf que tengo construido

Code: Select all  Expand view


case cToken == "PHP>BASES"       // reciviendo la peticion we    ME GENERA N ARHIVO WE MAS COMODO PERO SE PIERDE AL INICIO
                oStru:=direc()    // funcion que regresa la informacion de las bases de datos
                cCuantos:=len(oStru)   // cuantos archivos son
                empieza= alltrim(StrToken( cData, 2 ))
                xfilename:=substr(empieza,2,len(empieza)-1)
                xtipo:=substr(empieza,1,2)
                cfilename:=substr(cdata,11,len(cdata)-10)
             
                axfiles:=obtfiles(cfilename)     //1 archivo   2  indice   3   filtro1   4 filtro2  8 renglon, 6 tipo
                xtipo:=axfiles[6]
                i:=0
               
                if xtipo="-i"
                   i:=1
                   xaccion:="Inicio de pagina"  
                endif
                if xtipo="-f"
                   i:=2
                   xaccion:="Fin de pagina"
                endif
                if xtipo="-a"
                   i:=3
                   xaccion:="avanze de pagina"
                endif
                if xtipo="-r"
                   i:=4
                   xaccion:="Regreso de pagina"
                endif
               
                if i=0
                   i:=0
                   xaccion:="busqueda incremental we"  
                   
                endif
               
               
             
                cfilename:=substr(cdata,11,len(cdata)-10)
             
                axfiles:=obtfiles(cfilename)     //1 archivo   2  indice   3   filtro1   4 filtro2  8 renglon, 6 tipo
                carchivo:=axfiles[1]
                cindice :=axfiles[2]
                cfiltro1:=axfiles[3]
                cfiltro2:=axfiles[4]
                crenglon:=axfiles[5]
                ctipon  :=axfiles[6]
                xbusqueda:=axfiles[7]
                xusuario:=axfiles[8]
                if i=0
                  ctipon:="--"   // busqueda incremental we
                eNdif
               
                 select (0)
                   use (carchivo) alias (carchivo)   index (carchivo)  VIA "DBFCDX" NEW SHARED       //abrimo el archivo de la peticion k
                   DATABASE oRegi
                   cAlias:=ALIAS()
                   oStru:=DBSTRUCT()          /// copia la estructura
                   cCuantos:=oRegi:fcount()   ///numero de campos
                   cusuario:="perla"+strzero(narchi,3)
                   narchi:=narchi+1
                   // no me lo crea de nuevo si ya esta creado benito
                   SELECT (CARCHIVO)                                    
                 //  HFILTRO(cfiltro1, cfiltro2, cindice)     // REALIZA EL FILTRO DE LA CONDICION QUE SE ESTA MANDANDO DEPENDIENDO DEL INDICE DADO OK
                  // msginfo("ulitma posicion del archiv "+carchivo+"/"+str(d_bandera(osocket:nsocket, carchivo)))
                     
               
               if ctipoN="--"      // BUSQUEDA INCREMENTAL    
                   //CON LA CLASE DATABASE EL LOAD, SAVE SE ME PERDIA MEJOR LO HACEMOS DE VUELTA OKIDOKI
                   SELECT (CARCHIVO)
                   SET SOFTSEEK ON
                   (CARCHIVO)->(DBSEEK(UPPER(XBUSQUEDA)))
                   SET SOFTSEEK OFF
                 
                   cvan:=0
                   PAS:=0
                   manda:=""
                   bandera:=1
                   
           
                manda:="<body>"
       
                manda:=manda+ "<table STYLE="+chr(34)+"position:absolute;top:40 ;left: 80 px"+chr(34)+" CELLPADDING='1' CELLSPACING='1' BORDER='1' WIDTH='80%' id='browse1'>"
                manda:=manda+ "<tr  bgcolor='#00FFFF'>";
     
             
             
                FOR N:=1 TO 4  //CCUANTOS
                    MANDA:=MANDA+"<TD> <font color='#006600'> <b>"+ostru[n][1]+"</B></td>"
                NEXT N
               
               
                   DO WHILE .NOT. EOF()
   
                      select (carchivo)
                     
                      manda:=manda+"<tr>"
                      FOR N:=1 TO 4   ///cCUANTOS  //para irlo metiendo ok
                         ccampo :=carchivo+"->"+alltrim(oStru[N][1])     //el campo ya modificado
                         xdatos:=&ccampo       // toma el valor del campo
                         xdatos:=convierte(xdatos,ostru,n)        // convierte el tipo de datos a texto
                         
                         manda:=manda+"<td onmouseover="+chr(34)+"bgColor='blue'"+chr(34)+" onmouseout="+chr(34)+"bgColor='#FFFFFF'"+chr(34)+" style='cursor:hand' onclick="+chr(34)+"recorrer('browse1',this, $num)"+chr(34)+" <font color='#006600'> <b> "+xdatos+" </b></td>"  
                                           
                      Next n
                      manda:=manda+"</tr>"
                     
                      SELECT (CARCHIVO)
                      (CARCHIVO)->(DBSKIP())
                      cvan:=cvan+1
                      bandera:=recno()
                      if cvan>=crenglon  // los reglones solicitados
                         exit
                      endif
                      // esto para probar que tan rapido seria el pagineo okidoki
                   ENDDO
                   manda:=manda+"</table>"
                   manda:=manda+"</body>"
                     
           
                   c_bandera(xusuario,carchivo,bandera-1)   // con esta funcion llevamos el control de las peticiones y asi mismo el puntero del socket y archivo
                   
                   
               ENDIF    // PAGINEO DEL INICIO OKIDOKI
               ///////////////////////////////////////////////////
                 
                 
                   
                                   
               if ctipoN="-i"      // SI ES EL INICIO ESTA ES LA FORMA OK    
                   
                   //CON LA CLASE DATABASE EL LOAD, SAVE SE ME PERDIA MEJOR LO HACEMOS DE VUELTA OKIDOKI
                   (CARCHIVO)->(DBGOTOP())
                   cvan:=0
                   PAS:=0
                   manda:=""
                   bandera:=1
                   
               
                manda:="<body>"
       
                manda:=manda+ "<table STYLE="+chr(34)+"position:absolute;top:40 ;left: 80 px"+chr(34)+" CELLPADDING='1' CELLSPACING='1' BORDER='1' WIDTH='80%' id='browse1'>"
                manda:=manda+ "<tr  bgcolor='#00FFFF'>";
     
             
             
                FOR N:=1 TO 4  //CCUANTOS
                    MANDA:=MANDA+"<TD> <font color='#006600'> <b>"+ostru[n][1]+"</B></td>"
                NEXT N
               
               
               
                   DO WHILE .NOT. EOF()
   
                      select (carchivo)
                   
                    manda:=manda+"<tr>"
                      FOR N:=1 TO 4   ///cCUANTOS  //para irlo metiendo ok
                         ccampo :=carchivo+"->"+alltrim(oStru[N][1])     //el campo ya modificado
                         xdatos:=&ccampo       // toma el valor del campo
                         xdatos:=convierte(xdatos,ostru,n)        // convierte el tipo de datos a texto
                         manda:=manda+"<td onmouseover="+chr(34)+"bgColor='blue'"+chr(34)+" onmouseout="+chr(34)+"bgColor='#FFFFFF'"+chr(34)+" style='cursor:hand' onclick="+chr(34)+"recorrer('browse1',this, $num)"+chr(34)+" <font color='#006600'> <b> "+xdatos+" </b></td>"  
                       
                      Next n
                       manda:=manda+"</tr>"
                     
                      SELECT (CARCHIVO)
                      (CARCHIVO)->(DBSKIP())
                      cvan:=cvan+1
                      bandera:=recno()
                      if cvan>=crenglon  // los reglones solicitados
                         exit
                      endif
                      // esto para probar que tan rapido seria el pagineo okidoki
                   ENDDO
                   manda:=manda+"</table>"
                   manda:=manda+"</body>"
                     
                   c_bandera(xusuario,carchivo,bandera)   // con esta funcion llevamos el control de las peticiones y asi mismo el puntero del socket y archivo
             
               
             
                   
               ENDIF    // PAGINEO DEL INICIO OKIDOKI
               ///////////////////////////////////////////////////
               
               
               
               if ctipoN="-f"     // SI ES EL final del browse
                   
                   //CON LA CLASE DATABASE EL LOAD, SAVE SE ME PERDIA MEJOR LO HACEMOS DE VUELTA OKIDOKI
                   (caRCHIVO)->(dbgotop())
                   cregistro:=recno()
                   (CARCHIVO)->(DBGOBOTTOM())    //AL FINAL DEL ARCHIVO
                 
                   cvan:=0
                   PAS:=0
                   bandera:=RECNO()
                   // o lo metemos a un arreglo o mejor hacemos el recorrido para tras
                 
                                     
                     
                   (carchivo)->(dbskip(-crenglon+1))        // despues validamos si se pasa del principio
                   manda:="<body>"
       
                   manda:=manda+ "<table STYLE="+chr(34)+"position:absolute;top:40 ;left: 80 px"+chr(34)+" CELLPADDING='1' CELLSPACING='1' BORDER='1' WIDTH='80%' id='browse1'>"
                   manda:=manda+ "<tr  bgcolor='#00FFFF'>";
       
             
             
                   FOR N:=1 TO 4  //CCUANTOS
                      MANDA:=MANDA+"<TD> <font color='#006600'> <b>"+ostru[n][1]+"</B></td>"
                   NEXT N
               
                   
               
                   
                   
                   
                   DO WHILE .NOT. EOF()
   
                     
                      manda:=manda+"<tr>"
                      FOR N:=1 TO 4 //cCUANTOS  //para irlo metiendo ok
                         ccampo :=carchivo+"->"+alltrim(oStru[N][1])     //el campo ya modificado
                         xdatos:=&ccampo       // toma el valor del campo
                         xdatos:=convierte(xdatos,ostru,n)        // convierte el tipo de datos a texto
                         manda:=manda+"<td onmouseover="+chr(34)+"bgColor='blue'"+chr(34)+" onmouseout="+chr(34)+"bgColor='#FFFFFF'"+chr(34)+" style='cursor:hand' onclick="+chr(34)+"recorrer('browse1',this, $num)"+chr(34)+" <font color='#006600'> <b> "+xdatos+" </b></td>"  
                      Next n
                      bandera:=recno()
                      manda:=manda+"<tr>"
                      (CARCHIVO)->(DBSKIP())
                      cvan:=cvan+1
                       
                   ENDDO
                   manda:=manda+"</table>"
                   manda:=manda+"</body>"
                   c_bandera(xusuario,carchivo,bandera)
                 
                   
               ENDIF    // PAGINEO DEL FINAL OKIDOKI
               /////////////////////////////////////////////////////////////////////////////////////
               if ctipoN="-a"     // SI ES EL AVANZE DE PAGINA WE
                   
                   //CON LA CLASE DATABASE EL LOAD, SAVE SE ME PERDIA MEJOR LO HACEMOS DE VUELTA OKIDOKI
                   
                   cvan:=0
                   PAS:=0
                   bandera:=d_bandera(xusuario, carchivo)   // ESTO NOS DA EL PUNTERO OK
                   SELECT (CARCHIVO)
                   GO BANDERA    //NOS POSICIONAMOS EN EL ULTIMO
                   (CARCHIVO)->(DBSKIP())   // LISTO SEGUIMOS CON EL AVANZE DE PAGINA
                   if eof() // si es final del archivo pues no tenemos mas que poner asi que le restamo al bandera algunos skip ok
                     // msginfo("es el final de la pagina ok")
                      (carchivo)->(dbskip(-crenglon))  
                   endif
                   
                   manda:="<body>"
       
                   manda:=manda+ "<table STYLE="+chr(34)+"position:absolute;top:40 ;left: 80 px"+chr(34)+" CELLPADDING='1' CELLSPACING='1' BORDER='1' WIDTH='80%' id='browse1'>"
                   manda:=manda+ "<tr  bgcolor='#00FFFF'>";
       
             
             
                   FOR N:=1 TO 4  //CCUANTOS
                      MANDA:=MANDA+"<TD> <font color='#006600'> <b>"+ostru[n][1]+"</B></td>"
                   NEXT N
               
                   
                   DO WHILE .NOT. EOF()
   
                      select (carchivo)
                      manda:=manda+"<tr>"
                      FOR N:=1 TO 4    //cCUANTOS  //para irlo metiendo ok
                         if n=ccuantos
                            cultimo:=""
                         endif
                         ccampo :=carchivo+"->"+alltrim(oStru[N][1])     //el campo ya modificado
                         xdatos:=&ccampo       // toma el valor del campo
                         xdatos:=convierte(xdatos,ostru,n)        // convierte el tipo de datos a texto
                         manda:=manda+"<td onmouseover="+chr(34)+"bgColor='blue'"+chr(34)+" onmouseout="+chr(34)+"bgColor='#FFFFFF'"+chr(34)+" style='cursor:hand' onclick="+chr(34)+"recorrer('browse1',this, $num)"+chr(34)+" <font color='#006600'> <b> "+xdatos+" </b></td>"  
                      Next n
                      manda:=manda+"</tr>"
                     
                      bandera:=recno()
                      if recno()=cregistro    // si el resgitro es el primero de la tabla pues finalizalo ok
                         exit
                      endif
                         
                      SELECT (CARCHIVO)
                      (CARCHIVO)->(DBSKIP())
                      cvan:=cvan+1
                      if cvan>=crenglon  // los reglones solicitados
                         exit
                      endif
                      // esto para probar que tan rapido seria el pagineo okidoki
                   ENDDO
                   manda:=manda+"</table>"
                   manda:=manda+"</body>"
                   c_bandera(xusuario,carchivo,bandera)      // AQUI MANDAMOS LA ULTIMA POSICION OK PARA EL PUNTERO
                   
                   
               ENDIF    // PAGINEO DEL FINAL OKIDOKI
               ///////////////////////////////////////////////////
               
               if ctipoN="-r"     // SI ES EL REGRESO DE PAGINA WE
                   
                   //CON LA CLASE DATABASE EL LOAD, SAVE SE ME PERDIA MEJOR LO HACEMOS DE VUELTA OKIDOKI
                   
                   cvan:=0
                   PAS:=0
                   bandera:=d_bandera(xusuario, carchivo)   // ESTO NOS DA EL PUNTERO OK
                   
                   
                 
                   SELECT (CARCHIVO)
                   GO BANDERA    //NOS POSICIONAMOS EN EL ULTIMO
                   (CARCHIVO)->(DBSKIP(-(crenglon*2-1)))   // LISTO SEGUIMOS CON EL REGRESO DE PAGINA
                   
                   manda:="<body>"
       
                   manda:=manda+ "<table STYLE="+chr(34)+"position:absolute;top:40 ;left: 80 px"+chr(34)+" CELLPADDING='1' CELLSPACING='1' BORDER='1' WIDTH='80%' id='browse1'>"
                   manda:=manda+ "<tr  bgcolor='#00FFFF'>";
       
             
             
                   FOR N:=1 TO 4  //CCUANTOS
                      MANDA:=MANDA+"<TD> <font color='#006600'> <b>"+ostru[n][1]+"</B></td>"
                   NEXT N
               
                   
                   
                   DO WHILE .NOT. EOF()
   
                      select (carchivo)
                      manda:=manda+"<tr>"
                      FOR N:=1 TO 4 //cCUANTOS  //para irlo metiendo ok
                         if n=ccuantos
                            cultimo:=""
                         endif
                         ccampo :=carchivo+"->"+alltrim(oStru[N][1])     //el campo ya modificado
                         xdatos:=&ccampo       // toma el valor del campo
                         xdatos:=convierte(xdatos,ostru,n)        // convierte el tipo de datos a texto
                         manda:=manda+"<td onmouseover="+chr(34)+"bgColor='blue'"+chr(34)+" onmouseout="+chr(34)+"bgColor='#FFFFFF'"+chr(34)+" style='cursor:hand' onclick="+chr(34)+"recorrer('browse1',this, $num)"+chr(34)+" <font color='#006600'> <b> "+xdatos+" </b></td>"  
                      Next n
                      manda:=manda+"</tr>"
                   
                      bandera:=recno()
                      if recno()=cregistro    // si el resgitro es el primero de la tabla pues finalizalo ok
                         exit
                      endif
                         
                      SELECT (CARCHIVO)
                      (CARCHIVO)->(DBSKIP(1))
                      cvan:=cvan+1
                      if cvan>=crenglon  // los reglones solicitados
                         exit
                      endif
                      // esto para probar que tan rapido seria el pagineo okidoki
                   ENDDO
                   manda:=manda+"</table>"
                   manda:=manda+"</body>"
                     
                   
                   c_bandera(xusuario,carchivo,bandera)      // AQUI MANDAMOS LA ULTIMA POSICION OK PARA EL PUNTERO
                   
                   
               ENDIF    // PAGINEO DEL FINAL OKIDOKI
               ///////////////////////////////////////////////////
               
               
               
               
               /////////////////////////////////////////////////////////////////////////////////////
               close (carchivo)
               oClient:SendData( MANDA, msoc )    // ay que mandale el tamaño si no se pierde   el mendigo desgraciado
               oclient:end()                  
                   


y asi lo pido en la pagina php

Code: Select all  Expand view

<?php
$tipoDato=$_POST['d'];
$cadena=$_POST['d'];
echo $_POST['d'];
if($tipoDato=='-i')
   { $tipoDato="-i";
     echo 'Inicio de pagina we ';
   }
elseif($tipoDato=="-f")
   { $tipoDato="-f";
     echo 'Final de pagina ';
     }
if($tipoDato=='-a')
   { $tipoDato="-a";
     echo 'Avance de pagina ';
    }
elseif($tipoDato=="-r")
   { $tipoDato="-r";
     echo 'Regreso de pagina ';
   }  
 else
   {
     echo "ninguna we";
     
   }
/* Obtener el puerto para el servicio WWW. */
$service_port = 3850;

/* Obtener la dirección IP para el host objetivo. */
$address = gethostbyname('192.168.1.64');

/* Crear un socket TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "\n";
} else {
 
}


$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
}

$usuario = "Benjamino";


$in = "PHP>BASES produ,1,fitrol1,filtro2,15,$tipoDato,$cadena,$usuario";
$out = '';


socket_write($socket, $in, strlen($in));

while ($out = socket_read($socket, 4048)) {
    echo $out;
}

socket_close($socket);
echo "hola we que ondas ";
echo "<script> alert('hola we  kkdkkf') </script>"


?>
 


y este mismo tengo una clase para php,, para el llamado simplificado

que con este codigo ,, puedes generar cualquier tipo de consulta -- reportes --actualizaciones asi mismo realizar un rutina de sincronizacion

todo esto sin depender de advante server, ni sql ni msql


simplemente puro dbf/cdx /ntx


si te fijas en en codigo abre x archivo abre su archivo indexe y automaticamente tu ya puedes hacer consultas de cualquier tipo
este codigo que manda con los sockets genera un codigo html que muestra en la web un browse del archivo seleccionando dinamicamente
y solamante manda los registros que le indiques ,, y hace un pagineo y una busqueda incremental en la web que con ajax y php se ve de pelos


saludos
Benjamin Casarrubias Moreno
Cd. Obregon, Sonora, Mexico
chino72vale@hotmail.com
Fivewin 16.05, Harbour 3.2, xharbour 1.2.1, Fivelinux, visual estudio 2013
benjiben143
 
Posts: 114
Joined: Wed Mar 11, 2009 7:32 pm
Location: Obregon, Sonora, Mexico

Re: Sincronización en/a través de la Nube

Postby Antonio Mart. » Wed Mar 27, 2013 4:33 pm

Hola benji,


Muy bueno tu codigo. Lo revisaré, porque demuestra que con harbour/fwh todo es posible
En general, buscaba una solución que fuera lo más automática posible. Por eso pensé en dropbox o skydrive. Si no es posible su utilización me decantaría por una solución 100% harbour/fwh como hbNetIO.

Gracias de nuevo. Saludos
Antonio Mart.
 
Posts: 174
Joined: Sat Feb 23, 2013 10:04 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 81 guests