![]() |
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. |
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. |
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??? |
Cita:
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.
(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. |
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: 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:
|
Cita:
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. |
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?? |
Cita:
Eso si, debe ser un índice normal. No asignes CLUSTERED y no asignes UNIQUE. |
gracias por toda tu ayuda!!!
Una última consulta, es posible saber si existe un indice por código??? |
Cita:
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.
|
Cita:
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