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.comFivewin 16.05, Harbour 3.2, xharbour 1.2.1, Fivelinux, visual estudio 2013