PDA

Ver la Versión Completa : Actualizar ClientDaset en otra base de datos


StartKill
02-04-2012, 18:11:06
Buenas foro.:cool:

Saludarlos y solicitarles ayuda.

- Estoy con Dephi XE.
- Sql Server 2008.
- Tengo 2 bases de datos en el mismo servidor (Movil-1 y Movil-2).
- Basicamente las dos base de datos son identicas en la estructura.

Aqui mi duda: :confused:
- Hay una tabla llamada "Almacenes" en cada base de datos.
- Uso un ClientDataSet para "Almacenes" de Movil-1 (el resultado de una query)
* Existe algun metodo/forma para utilizar el "resultado/filas" del ClientDataSet para añadir las filas a la tabla "Almacenes" de la base de datos Movil-2

- Basicamente mi deseo no es solo añadir el resultado de este clientDataset, tambien deseo hacer update o delete de las filas de este clientDaset a la otra tabla de la otra base de datos. (segun sea el caso a una condicion que manejariá)


Your friend

Startkill
Lima-Perú

gatosoft
26-04-2012, 22:13:47
StartKill,

Lo que buscas es una replicación en línea... para esto la mayoría de las bases traen esta funcionalidad para que se haga de forma automática en línea o periódicamente, pero esperando que la base destino no sea transaccional, es decir, solo es un repositorio de replciación como medida de seguridad....

Pero creo que lo que tu esperas es algo diferente ¿no es cierto?, pues estoy suponiendo que tus bases Movil-1 y Movil-2 son ambas transaccionales, lo cual querría decir que lo que buscas es una Sincronización o conciliación de datos entre las bases....

Todo lo que sea "en línea" tiene un costo, por lo menos de procesamiento, y es algo que debes evaluar....

Hay un articulo muy interesante de Pablo Reyes en "Embarcadero Developer Network" llamado Reconciliación de errores de actualización (http://edn.embarcadero.com/print/32358). revisa especialmente el apartado: "Registros modificados", en este muestra una forma para Visualizar los registros que han sufrido modificaciones en el ClientDataset.... el código clave es:

procedure TForm1.Button3Click(Sender: TObject);
var
stStatusFiler: TUpdateStatusSet;
begin
stStatusFiler := [];
if CHKModified.Checked then
stStatusFiler := stStatusFiler + [usModified];
if CHKInserted.Checked then
stStatusFiler := stStatusFiler + [usInserted];
if CHKDeleted.Checked then
stStatusFiler := stStatusFiler + [usDeleted];
(DSParts.DataSet as TClientDataSet).StatusFilter := stStatusFiler;
end;


Esto tal vez te de una idea de como podrías conocer los cambios de tu ClientDataset antes de aplicarlos en una base, para intentar replicarlos en la otra....

Espero que te haya servido...

Un saludo,

StartKill
05-06-2012, 02:39:00
Excelente respuesta

Startkill dice:
... Aqui mi duda:
- Hay una tabla llamada "Almacenes" en cada base de datos.
- Uso un ClientDataSet para "Almacenes" de Movil-1 (el resultado de una query)
* Existe algun metodo/forma para utilizar el "resultado/filas" del ClientDataSet para añadir las filas a la tabla "Almacenes" de la base de datos Movil-2

- Basicamente mi deseo no es solo añadir el resultado de este clientDataset, tambien deseo hacer update o delete de las filas de este clientDaset a la otra tabla de la otra base de datos. (segun sea el caso a una condicion que manejariá) ...


gatosoft responde:
Lo que buscas es una replicación en línea... para esto la mayoría de las bases traen esta funcionalidad para que se haga de forma automática en línea o periódicamente, pero esperando que la base destino no sea transaccional, es decir, solo es un repositorio de replciación como medida de seguridad....

Hay un articulo muy interesante de Pablo Reyes en "Embarcadero Developer Network" llamado Reconciliación de errores de actualización (http://edn.embarcadero.com/print/32358). revisa especialmente el apartado: "Registros modificados", en este muestra una forma para Visualizar los registros que han sufrido modificaciones en el ClientDataset.... el código clave es:


procedure TForm1.Button3Click(Sender: TObject);
var
stStatusFiler: TUpdateStatusSet;
begin
stStatusFiler := [];
if CHKModified.Checked then
stStatusFiler := stStatusFiler + [usModified];
if CHKInserted.Checked then
stStatusFiler := stStatusFiler + [usInserted];
if CHKDeleted.Checked then
stStatusFiler := stStatusFiler + [usDeleted];
(DSParts.DataSet as TClientDataSet).StatusFilter := stStatusFiler;
end;






Gracias gatosoft

Your friend

Startkill
Lima-Perú