Está en la página 1de 3

sqldata y sqldata2 acceden a dbf como si fuera un motor, para trabajar

para
en un futuro poder migrar o no. sera opcional
la ventaja es la velocidad la seguridad de los dbf indices y campos
memos. que no se corromperan. ademas de todas las ventajas sqldata2
como es el log y la grabacion del ejecutable centralizado para que
se actualice automaticamente en los clientes.
solo se limita a una red local. una red compartida.
comparte la funcion espejo que tiene la clase, pero se configura de
otra manera.

primero tener un id autoincremental, o tener un id que ustedes


administren, o tener un campo o varios campos que ustedes administren.
como campo identificador unico de registro. debe obligatoriamente
existir un indice que involucre un unico campo o varios (indice
compuesto).
Si ustedes generan un id haciendo el ultimo id de la tabla mas 1.
usen el id que ustedes utilizan para cada tabla

como crear un indice autoincremental automatico, recuerded que tiene la


limitacion de un campo integer, por lo cual para tablas de moviviento
verifique su cantidad de registros.
el limite es 2,147,483,647 cantidad de registros.

para crearlo ejecute estas instrucciones.

como agregar una columna ID autoicremental a una DBF

vtabla="clientes"
ALTER table (vtabla) ADD COLUMN id int &&se agrega una columna id

UPDATE (vtabla) SET id=RECNO() && se colocan los valores


vnextvalue=RECCOUNT()+1
vcadena="ALTER table "+vtabla+" alter COLUMN id int AUTOINC nextvalue
"+TRANSFORM(vnextvalue)+ "PRIMARY KEY"
EXECSCRIPT(vcadena) && se lo convierte a autoincremental

------------------
luego en el prg de inicio de hacerse las siguientes configuraciones
recuerde que sqldata2 para dbf no usa controlador odbc.
y no puede usar ?paramtro

esta diferencia es escencial saberla si se desea llevar el sistema


a un motor en el futuro.
use text endtext con textmerge con <<parametro>> para mantener una
compatibilidad para dbf y odbc.

tambien puede estar esta funcion para indicar un parametro foxqvariable.


ejemplo
la instruccion where de fox no respecta el set exact on
select * from foxkclientes where nombre=foxqvnombre &&esto significa que
empiece con
y esto
select * from foxkclientes where nombre==foxqvnombre &&esto exactamente
igual
tambien pueden usar la clausula LIKE en el WHERE para comparar,
trate de no usar el signo "=" (igual) para comparar cadenas de textos, ya
que tienen comportamiento
distintos en fox y en un motor, reemplacelo por la instruccion like que
tienen el mismo comportamiento
where nombre like 'german%' significa que busque todo lo que comienza
con german
where nombre like 'german' significa que busque todo lo que sea
exactamente
trate de usar comillas simples en lugar de comillas dobles

cuando detecte fox foxq se reemplazado por "", y en un motor odbc


sera reemplazado por ?

especifique la cadena con la direccion a donde estan las dbfs vistas


desde la red
osqldata2.psqlcadena(_screen,"5","fox","C:\descargas\sqldataoledb\
datoscentrales","","","spanish","read uncommitted","basededatos")

y listo puede usar las demas configuraciones para las distintas opciones
de la clase

recuerde que en cada instruccion o comando que utilice debe anteponer


foxk al nombre de todas las tabla mencionadas. ejemplo select * from
foxkclientes where 1=0

*nota importante
*El set exact on no afecta a las instrucciones select, update y delete.
osea select * from clientes where nombre='german'
*trae todo lo que comience con german. si queres que traiga exactamente
igual usa asi select * from clientes where nombre=='german'.
*si queres tener compatibilidad con los motores usa para comparar cadenas
el == o el comando LIKE de esta forma
*select * from clientes where nombre like 'german%' trae todo lo que
comienza con german.
*y select * from clientes where nombre like 'german' trae lo
exactamente igual.
*osea cuando buscas cadenas usa el == o el like, pero no el =
porque es ambiguo
*no usen comillas dobles, usen comillas simples para mantener la
compatibilidad con
*los motores

ya que en fox es distintos a los motores. les explico el = en fox


significa
cuando se comparan caracteres. que comience con en los comandos select
update y delete.
pero en los motores significa exactamente igual. eso genera grandes
diferencias
al pasar a un motor. lo que pueden hacer es usar == (doble igual)
siempre
tanto para comparar numeros como texto o fechas.
esto en los textos significa exactamente igual. si quieren algo igual a
que
comience con como lo hace fox con el signo = utilicen este reemplazo
que
funciona en fox y en los motores where nombre LIKE
CONCAT(foxqvariable,'%')

vea el ejemplo sqldata2-fox.prg


vea el ejemplo sqldata-fox.prg
esta funcion es necesaria solo en los casos que la clave primaria no sea
autonumerada
automaticamente y se calcule como el ultimo mas uno. esta funcion
llenara los ids en 0
con un valor valido en el dbf. esta funcion se ejecuta automaticamente
en el sistema.
para algunos procesos que son necesarios. pero si ustedes consideran
ejecutarla por
algun motivo, lo pueden hacer. solo se ejecutara con se este trabajando
con dbfs

psqlcrearid(_screen,"1","clientes","id")

todo esta pensado para tablas con extension dbf


pero pueden cambiar la extension por ejemplo idt
de esta forma
foxkclientesfoxeidt

considerando que un directorio tiene subdirectorios.


el directorio sera la conexion, y los subdirectorios seran distintas
bases de datos que tendran el mismo nombre que los subdirectorios
para acceder a distintos subdirectorio de una misma conexion, donde cada
subdirectorio
sera el nombre de una base de datos al migrar. utilice "foxs" para
separar

foxksubdirectoriofoxsclientes

todas las tablas deben tener un id con un indice. no lo hagan


autoincremental en dbf.
o campo caracter que ustedes llenan, que permite marcar como registro
unico.

si la tabla ya tiene un idcliente por ejemplo que se calcula sobre la


misma
tabla bloqueando la tabla calculando el maximo y sumarle 1 para agregar
un nuevo
registro, y es del tipo numerico, entonces NO debe crear un id aparte,
este sera
su id, el idcliente tiene que estar indexado.
si tienen otro campo que lo calculen con una tabla de consecutivos, usen
ese
si tienen una tabla que usan varios campos que ustedes les colocan los
valores.
para identificarlo como unico, tambien le pueden o no crear un id aparte
si tienen un idcliente autonumerico, NO deben crear un id, este sera su
id.
crear un id autonumerico le puede traer conflicto con la programacion en
sus otros
formularios ya que si usan scatter y gather deben excluir ese campo para
que no les de error
al ser de solo lectura

También podría gustarte