Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Capturar datos bd mssql a ms access (https://www.clubdelphi.com/foros/showthread.php?t=66479)

darkone2k4 22-02-2010 22:06:59

Capturar datos bd mssql a ms access
 
salu2 amigos.

Les escribo por lo siguiente:

Tengo que realizar una aplicación que capture los datos de facturas de una bd en ms sql y la traspase a un archivo ms access.
Sé como conectarme a la bd SQL y obtener los datos que necesito y traspasarlos a access, mi duda es como poder hacer que el programa quede residente en memoria y al momento de que se ingrese una nueva factura o se realice una nota de crédito, el programa automáticamente traspase los datos a access.
Es posible realizar de esa forma el proceso????

desde ya, muchas gracias.


Neftali [Germán.Estévez] 23-02-2010 09:32:25

Para conectar a las dos Base de datos puedes hacerlo directamente desde un programa Delphi utilizando dos conexiones una (ADOConnection a cada BD) o realizar la conexión desde Access utilizando tablas vinculadas y desde el programa Delphi trabajar sólo con la Base de Datos de Access.

Podrías hacer la prueba a ver si alguna de las dos te da mejor rendimiento que la otra.

en cuanto a dejar el programa "residente", basta con que lo ejecutes y lo ocultes el formulario (si lo seseas) o crees un icono en la bandeja de sistema (junto al reloj). Para detectar las actualizaciones, puedes utilizar un Timer cada X tiempo que compruebe si hay nuevas facturas (1), o utilizar una tabla de avisos para optimizar la consultas (2).

(1) Consiste en consultar la tabla de facturas y destectar si hay alguna factura posterior a la última hora en que hiciste esta misma consulta.

(2) Si la tabla de Facturas es muy grande y no quieres consultarla constantemente, lo que se hace a veces es utilizar una tabla de avisos (muy pequeña y rápida de consultar). Cada vez que añades una factura añades también un aviso a la tabla de avisos. Cuandos el programa consulta la tabla de avisos y detecta algun aviso, sabe que hay facturas nuevas y realiza el trabajo estipulado (y borra los avisos); Si la tabla de avisos está vacía, te evitas consultar la tabla grande (facturas).

Espero haberme explicado bien. Hay más opciones y mejoras, pero esto te puede dar una idea de por donde empezar.

darkone2k4 23-02-2010 12:50:57

Muchas gracias por la respuesta Neftali.

Respecto a la solución Nº 2, no puedo hacerlo porque esa BD SQL es de un sistema comercial, por lo que no puedo crear una tabla avisos cuando se almacene una factura.

Respecto a la solución Nº 1, como podría detectar si hay alguna factura posterior a la última hora en que hice esta misma consulta???

Neftali [Germán.Estévez] 23-02-2010 13:27:59

Cita:

Empezado por darkone2k4 (Mensaje 354737)
Respecto a la solución Nº 1, como podría detectar si hay alguna factura posterior a la última hora en que hice esta misma consulta???

Cada vez que haces la consulta te quedas con la hora en que la has hecho. Luegos revisas sólo las posteriores a ese momento.
Por ejemplo, imagina que quieres hacer la comprobación cada minuto:

(1) Al arrancar la aplicación buscas la última factura que sincronizaste en la tabla Access y te quedas con esa fecha. Me imagino que las facturas tendrán un campo FechaHora o lo puedes hacer utilizando el IDFactura.
(2) Lanzas tu consulta en la tabla SQL para detectar inserciones posteriores.

Código SQL [-]
  Select * from TFactura where ID> 342654652
o 
  Select * from TFactura where FechaHora > '20/02/2001 18:45:00'

(3) Procesas todas las facturas encontradas y te quedas con el IDFactura o FechaHora de la última(*).

(4) La siguiente consulta la haces utilizando los valores encontrados aquí (*), con la SQL similar a la de arriba.

Con este sistema, cada consulta se hace sólo para averiguar las facturas posteriores a la última que ya has procesado.

Importante que tengas índices definidos sobre el campo sobre el que haces la búsqueda o que selecciones un campo por el que exista índice.

darkone2k4 23-02-2010 14:56:52

nuevamente muchas gracias por la respuesta.

Revisando la tabla de facturas, si posee un campo llamado fechaingreso del tipo datetime, por lo que podría realizar la consulta que me indicas.

Entonces una vez realizada la consulta:
Código SQL [-]
Select * from TFactura where FechaHora > '20/02/2001 18:45:00'
Capturo el resultado y lo inserto en las tablas en access y además en una tabla "control" almaceno la fecha y hora del último de los registros capturados o la fecha y hora del momento en que se realizó la captura.

Y esto último:
Cita:

Importante que tengas índices definidos sobre el campo sobre el que haces la búsqueda o que selecciones un campo por el que exista índice.
Para qué sería???




Neftali [Germán.Estévez] 23-02-2010 15:38:31

Cita:

Empezado por darkone2k4 (Mensaje 354752)

Y esto último:Para qué sería???

Porque la consulta que vas a realizar sobre la tabla de facturas será mucho menos costosa, si existe un índice por el campo que vas a utilizar en el WHERE.

De ahí que revises si te sirve el número de factura, la fecha, un autoincremental,... (a ver cual de ellos tiene índice definido).
Es importante que exista índice por ese campo, mejor si el índice es UNIQUE. Si es la clave principal, es probable que el íundice en SQL Server sea CLUSTERED. ¡¡Eso sería lo máximo!! :D
Siempre es mejor filtrar/ordenar/... por campos numéricos (eso incluye los DateTime) frente a otros tipo String.

darkone2k4 23-02-2010 19:01:06

gracias nuevamente.

Pero si la consulta la hago comprobando el campo "fechaingreso", el cual no es indice. habrá algún problema en la bd si agrego ese campo como indice??? o no puedo hacer eso??

Neftali [Germán.Estévez] 24-02-2010 09:38:29

Cita:

Empezado por darkone2k4 (Mensaje 354799)
Pero si la consulta la hago comprobando el campo "fechaingreso", el cual no es indice. habrá algún problema en la bd si agrego ese campo como indice??? o no puedo hacer eso??

No se me ocurre que agregar el índice pueda darte problemas.
Eso si, debe ser un índice normal. No asignes CLUSTERED y no asignes UNIQUE.

darkone2k4 24-02-2010 14:49:46

gracias por toda tu ayuda!!!

Una última consulta, es posible saber si existe un indice por código???

Neftali [Germán.Estévez] 24-02-2010 16:10:42

Cita:

Empezado por darkone2k4 (Mensaje 354880)
Una última consulta, es posible saber si existe un indice por código???

Sí.
Para esa información y toda la que necesites están las tablas de sistema.
Empieza por SysObjects y SysIndexes, aunque si revisas la ayuda verás que hay para consultar todo lo que necesites.

Código SQL [-]
select top 200 * from SysIndexes
Select Top 1000 * from Sysobjects where name like 'I%'

darkone2k4 24-02-2010 16:26:42

Cita:

Empezado por Neftali (Mensaje 354888)
Sí.
Para esa información y toda la que necesites están las tablas de sistema.
Empieza por SysObjects y SysIndexes, aunque si revisas la ayuda verás que hay para consultar todo lo que necesites.

Código SQL [-]
select top 200 * from SysIndexes
Select Top 1000 * from Sysobjects where name like 'I%'

muchas gracias nuevamente...

has sido muy amable.

salu2


La franja horaria es GMT +2. Ahora son las 00:33:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi