usando este metodo no necesitaran hacer cambios en el sistema
al pasar de identity integer o numeric a bigint. ya que bigint
se convierte en fox como char(20)
que es id (identity)?. este es un numero consecutivo que
identifica como unico a 1 registro de una tabla.
cuando se maneja con tablas en facturas cabecera-detalle,
este id relacionara un registro de la cabecera,
con uno o varios del detalle. pero este id de cada registro
se debe obtener despues de grabar un registro, si 2 usuarios
estan insertando a la vez 10 registros nuevos, este id sera
unico para cada registro, pero pueden ser intercalados,
si se insertan varios registros dentro de una transaccion,
estos tambien pueden ser con numeracion intercalada.
debido a esto es necesario averiguar el id generado cada vez que
se inserta cada registro nuevo 1 por 1, no se puede saber
que numeros dio si se insertan 10 registros a la vez,
hay que preguntar al servidor despues de insertar cada registro.
para esto sqldata y sqldata2 tiene una funcion sqlultimoid,
que devuelve el ultimlo id insertado, pero hay ocaciones donde
se nececita metodos mas avanzados para relacionar tablas.
por ejemplo si se necesita insertar 10 facturas con sus detalles
respectivos. asi que sqldata ahora incorporan 2 metodos mas,
para poder desarrollar estas operaciones mas simplemente.
sqldata y sqldata2. Manejo de relaciones con campos identity, simples y
complejos.
mostrare 3 metodos para obtenerlos.
con estos 3 metodo tendran cubierta toda la posible complejidad
sqldata permite trabajar con estos campos, ID al intentar relacionarse
con otras,
y tambien si esta ultima se relaciona con otra, y asi sucesivamente.
(cadena de id)
madre-hija o, hija-nieta
clientes-detalle unidos por ID de cliente e IDCLIENTE del detalle
y todas estas ser grabadas en la misma transaccion.
es importante que nunca pongan un valor de id principal en las tablas,
este debe
permanecer con su valor positivo o negativo o cero (0). la funcion
psqlgrabar le
asignara el valor y lo asignara a las otras tablas relacionadas
el id es un valor que se obtiene despues de grabar un registro en el
servidor, usando
el comando insert. a diferencia de los correlativos que se obtienen
antes se grabar
Metodo 1
obtenerlos con la funcion psqlultimoid
despues de grabar una tabla esta funcion devolvera el ultimo id generado
en el servidor.
luego este se copiara a la tabla relacionada y luego se grabara la
segunda tabla
ejemplo
[Link](_screen,"1")
[Link](_screen,"1")
[Link](_screen,"1",thisform,"clientes")
select detalle
replace idcliente with
[Link](_screen,"1",thisform,"clientes")
[Link](_screen,"1",thisform,"detalle")
[Link](_screen,"1")
[Link](_screen,"1")
metodo2
obtener todos los ids al grabar una tabla
la clase obtiene todos los ids que se generan y los coloca en el cursor
ejemplo
[Link](_screen,"1")
[Link](_screen,"1")
[Link](_screen,"1",thisform,"clientes",.T.)
select detalle
replace idcliente with [Link]
[Link](_screen,"1",thisform,"detalle")
[Link](_screen,"1")
[Link](_screen,"1")
metodo 3
se crean IDs temporales. que al grabar, convierte a definitivos, en
todas las tablas relacionadas.
osea hay que grabar cada idcliente de la tabla detalle con valores
negativos, que luego al grabar
las tablas ira conviertiendo
nunca colocar un valor al id principal de cada tabla, solo a las
relaciones. los ids principales
deben permanecer en 0 para registros nuevos o mayor que cero para otros
registros.
y en el caso de trabajar offline deben asignarle el valor con
[Link]("clientes")
ejemplo
select clientes
append blank
replace nombre with "german"
SELECT cuentas
append blank
replace idcliente with [Link]("[Link]") &&si el id del
cliente no es 0 pone su valor
de lo contrario coloca un valor negativo temporal, que la funcion
psqlgrabar se encargara de
reemplazarlos por los permanentes
SELECT suceso
append blank
replace idcuentas with [Link](thisform,"[Link]")
select cabecera
append blank
replace idcliente with [Link](thisform,"[Link]")
select detalle
append blank
replace idcabecera with [Link](thisform,"[Link]")
y al grabar deben hacer asi
grabar primero madre y luego la hija, y por ultimo la nieta
no debe quedar en 0 el campo idcliente, idsucesos, etc, deben contener
valores negativos
antes de iniciar el proceso de grabado
LOCAL osqldata as sqldata OF [Link]
osqldata=CREATEOBJECT("[Link]")
SELECT clientes
[Link](_screen,"1")
[Link](_screen,"1")
[Link](_screen,"1",thisform,"clientes",,"[Link],c
[Link]")
[Link](_screen,"1",thisform,"cuentas",,"[Link]")
[Link](_screen,"1",thisform,"suceso")
[Link](_screen,"1",thisform,"cabecera",,"[Link]"
)
[Link](_screen,"1",thisform,"detalle")
[Link](_screen,"1")
[Link](_screen,"1")
WAIT "Grabado." WINDOW NOWAIT
lo que hace la funcion psqlgrabar es cambiar los id de la tabla madre
negativos temporales a los valores
que se obtienen al grabar cada nuevo registro
recuerden que el id se sabe despues de grabar una tabla, asi que una vez
obtenido, lo copia
a las tablas hijas automaticamente
transacciones
como se manejan los campos id idenity usando transacciones?.
suponiendo que 2 usuarios tengan en cada transaccion la insercion de 10
registros a la vez,
el servidor empezara a asignar valores por registro que se inserte, osea
que quedaran
con valores intercalados entre ambos. cuando se confirma los comandos
insert del primer
usuario, estos se grabaran definitivamente en el servidor. peero
suponiendo que en el
registro 9 del insert del segundo usuario hay un error, entonces los 10
no se grabaran.
pero que pasa con los valores de ids asignados?, estos se pierden,
queda el hueco,
el servidor seguira asignando valores de ids identity siempre mayores al
ultimo que asigno