¿Mejores prácticas para mover grandes aplicaciones de MS Access hacia .Net?

26

Tenemos una aplicación de MS Access realmente enorme desarrollada internamente inicialmente para nuestras necesidades personales que luego se convirtió en un software comercial y se vendió con éxito. El software es una especie de "software integral para su negocio" y contiene varios módulos que incluyen el Sistema de Gestión de Documentos, Planificación de Recursos Empresariales, Gestión de Inventario, Gestión de Relaciones con el Cliente, Análisis de Datos, etc. Estamos bastante satisfechos con el actual funcionalidad de la aplicación, pero para satisfacer las solicitudes de nuestros clientes nos damos cuenta de que tenemos que pasar a algo nuevo.

Decidimos mover gradualmente nuestra aplicación hacia .Net porque podemos apegarnos a Visual Basic .Net: aunque es un lenguaje nuevo para la mayoría de los desarrolladores aquí, tenemos un profundo conocimiento de VBA y varias docenas de pequeños proyectos implementados en VB6.

Ya comenzamos a mover la funcionalidad de la capa de datos de nuestra aplicación a MS SQL Server, de modo que cada manipulación y búsqueda de datos se realiza directamente en el servidor.

Lo que estamos buscando son las mejores prácticas para mover gradualmente nuestra amplia GUI (alrededor de 500-600 formas diferentes, incluidos subformularios, alrededor de 200 informes con soporte en varios idiomas, etc.). Siguiendo la reciente solicitud de nuestro cliente potencial para implementar el cifrado de datos asíncrono en documentos en DMS, también nos complacería desacoplar completamente esta parte de MS Access e implementarla en .Net.

La pregunta es cómo integrar sin problemas la aplicación .Net con el sistema MS Access existente, de modo que podamos invocarla con ciertos parámetros (derechos de usuario, etc.) y permitir el intercambio de datos entre esta aplicación y la aplicación MS Access en ejecución.


EDITAR:

Intentamos aplicar algunas prácticas del libro " Patrones de integración empresarial " de Martin Fowler para lograr cierta integración entre la aplicación MS Access y algunas pequeñas utilidades que implementamos en .Net para diversas necesidades. Pero solo logramos usar el patrón de "base de datos compartida" y no estábamos realmente satisfechos con nuestra solución.

Por ejemplo, implementamos una pequeña utilidad que se ejecuta como un servicio de Windows que descarga automáticamente todos los mensajes del servidor de correo utilizando la conexión POP3 y los almacena en una tabla, mientras que todos los archivos adjuntos se almacenan en el sistema de archivos.

Lo que hicimos principalmente fue utilizar ADO.NET para acceder directamente a las bases de datos de MS Access en formato MDB y llenar la tabla con algunos datos procesados ​​(como los datos sobre mensajes de correo del ejemplo anterior: tenemos campos para FROM, TO, CC, BCC, Sujeto y cuerpo).

No hay absolutamente ningún problema para trabajar con el formato de datos MDB de .Net , además, no queremos quedarnos con MDB y actualizar casi todo a MS SQL Server 2008, esto nos da mucha más libertad con respecto a la administración y escalabilidad de los datos.

El principal problema aquí es que no sabemos cómo implementar una especie de "devolución de llamada" en Access para poder activar la ejecución de cierto código VBA en la actualización de datos.

Teníamos grandes esperanzas con MS Access 2010 que admite la activación e inserción de activadores para tablas de datos , pero resultó que solo podemos usar Macros de MS Access para estos activadores y no hay forma de ejecutar ningún código VBA personalizado dentro del activador.

También probamos algunas soluciones con el envío de pulsaciones de teclas directamente a la ventana de MS Access para imitar alguna consulta de datos invocada por el usuario. Esto funciona, pero no creemos que sea una solución real que pueda usarse en la producción.

También investigamos DDE para MS Access, pero no pudimos encontrar una buena solución de muestra que implementara comandos DDE y los utilizara para el intercambio de datos y datos en memoria.

Por lo tanto, el problema principal es que MS Access y la aplicación .Net coexistan e interactúen entre sí.

EDIT2 :

Olvidé mencionar que también implementamos la biblioteca MSMQ en VBA para el paso de mensajes entre .Net y MS Access, el problema fue nuevamente la falta de devolución de llamada aquí: realmente tuvimos que sondear la cola para buscar nuevos mensajes y dado que VBA realmente no es compatible multihilo no era realmente una buena solución.

Alexander Galkin
fuente
¿Has hecho una pequeña aplicación .NET de prueba de concepto para ver qué tan bien puedes hacer que las dos partes cooperen? ¿Qué problemas has encontrado?
sq33G
¿Cómo se implementa su aplicación de Access? ¿Y cuál es la técnica de autenticación?
Skrol29
@ sq33G: edité mi pregunta para abordar estos temas.
Alexander Galkin
@ Skrol29: generalmente lo implementamos como MDB compilado (.MDE) junto con el tiempo de ejecución de MS Access. Utilizamos la autenticación de Windows administrada a través de Active Directory para la conexión de la base de datos y los permisos.
Alexander Galkin
3
Gran pregunta Este es un problema muy práctico que muchas empresas que no son de software que crecen rápidamente a menudo enfrentan y se ven obligadas a dejar atrás a los desarrolladores, cuando la base de datos de Access "hacer todo" no puede adaptarse a sus crecientes necesidades.
bunglestink

Respuestas:

17

Este será un proyecto grande y muy complicado. He sido responsable de migrar bases de datos de Access a .NET muchas veces, pero nunca a esta escala. Estoy de acuerdo en que un enfoque gradual probablemente sea el más realista. Intentar asumir todo de una vez es una manera fácil de fallar.

Como en otras respuestas, el primer y más importante paso será mover todo a SQL Server. Mientras hace esto, documente la base de datos si esto aún no se ha hecho e identifique las áreas para refactorizar si existen. Las bases de datos de acceso que crecen para satisfacer las necesidades cambiantes a menudo tienen modelos de datos que se pueden mejorar cuando se observa el panorama general.

A continuación, identifique los módulos de la aplicación que están "autocontenidos". Debido a que esta es una base de datos de hacer todo, probablemente habrá módulos de ella que son casi completamente disjuntos entre sí. Después de tener estas piezas disjuntas, identifique uno de los módulos más pequeños que tenga más que ganar al actualizarse y emprenda primero.

Al migrar a .NET, no solo haga una simple copia 1 a 1 de la aplicación. Recopile información de los usuarios para identificar puntos débiles con la aplicación actual. Desea que su primera unidad de migración sea un gran éxito para obtener la aceptación completa de todos los demás.

Una vez que haya terminado la primera unidad, mire lo que sucedió en términos de desafíos, dificultades, etc., y use esto para avanzar.

Una cosa que desalentaría encarecidamente sería implementar módulos que funcionen parcialmente (por ejemplo, "migramos el CRM, pero las características X, Y, Z aún no están en el nuevo sistema"). Esto hará que los usuarios se sientan frustrados rápidamente por tener un sistema incompleto cuando el anterior para ellos estaba "perfectamente bien". Este tipo de desarrollo puede funcionar bien para otros dominios, pero no en empresas donde los usuarios no ven "nada malo" con el antiguo monolito de Access y no entienden las necesidades de migración.

bunglestink
fuente
1
Ser capaz de soportar múltiples idiomas será mucho más fácil. Si bien debe tomar decisiones de diseño que permitan admitir varios idiomas, debe concentrarse como bunglestink sugirió en elementos específicos. También propondría un diseño y un flujo para todos los formularios, claramente evite vincular a cualquier formulario que no esté 100% completo, esto evita la funcionalidad parcial.
Ramhound
7

Aquí hay un tipo de plan para convertir su aplicación MS Access en una aplicación VB.Net por mutación.

Este no es un plan general, el siguiente plan depende del proyecto que haya descrito.

Paso 1: migre todos los datos a SQL Server

No use ODBC para el acceso de conexión a SQL Server, use un proyecto de acceso (ADP) en su lugar. Un proyecto de acceso es un archivo de acceso con una extensión .adp, tiene características de acceso completas (macros, formularios, informes, módulos) pero la conexión está directamente en una base de datos de SQL Server en lugar de un archivo MDB. Los archivos ADP son muy compatibles con los archivos MDB. Parece que no son compatibles con Access 2010, mientras que, de hecho, la función está oculta, pero es muy compatible. Al igual que MDE, los archivos ADP se pueden "compilar" en archivos ADE.

La migración a SQL Server costará pocas modificaciones en la estructura de datos y el código, pero todo es bastante fácil de migrar. Y es un objetivo final después de todo.

Olvídate de desencadenar eventos de base de datos a código VBA o VB.Net. Esto se puede hacer técnicamente usando los procedimientos almacenados extendidos de SQL Server, pero es un truco muy malo. Su proyecto tiene una vida futura, por lo que es mejor hacer cumplir su estructura de datos evitando este tipo de puente de desestructuración. En general, minimice los desencadenantes de la base de datos, es inteligente pero bastante difícil de mantener.

Paso 2: haga que la autenticación sea uniforme

Es bueno que su aplicación no se base en la seguridad de acceso (archivo MDW).

Haga un plan para la autenticación de destino para la aplicación VB.Net, y luego defina una forma de migrar la autenticación de Access a este objetivo para tener una autenticación uniforme entre las dos aplicaciones.

Dado que la autenticación es transversal en una arquitectura de aplicación, será más fácil dividirla entre la versión de Access y la versión de VB.Net.

Paso 3: prepare una característica de token para hacer un puente entre Access y VB.Net

Usted dijo que la interfaz de usuario de Access tendrá que abrir una interfaz de usuario de VB.Net con algunos parámetros precisos y también autenticación. Y probablemente tendrá que hacer lo mismo de la otra manera.

Una buena solución es construir una pequeña característica de token basada en una tabla de token: las columnas pueden ser un identificador de token (entero), una clave de token (cadena larga), una fecha de token y una lista de parámetros (cadena larga o texto). Cada vez que Access necesita abrir una pantalla VB.Net, luego guardar un token en la base de datos con los parámetros, y luego abrir su aplicación VB.Net con solo la identificación del token y la clave del token. Se abre VB.Net, busca la identificación del token en la base de datos, verifica la clave (esto se aplica como una autenticación) y lee los parámetros. Luego se abre en la forma correspondiente y hace lo que se requiere. No olvides dar una duración a las fichas y limpiar las fichas antiguas.

Si necesita volver a llamar desde VB.Net a Access (probablemente lo hará), entonces creo que es posible activar algún código VBA en un archivo de acceso MDB abierto, usando OLE.

Paso 4: migre la IU y los módulos pantalla por pantalla, módulo por módulo

Ahora lo mejor de la preparación está hecho. Puede comenzar a migrar la interfaz de usuario de Ms Access a VB.Net.

No hay buenas herramientas automáticas para hacer esto. VBA y .Net son muy diferentes. Tienes que preparar tu trabajo para tal migración. Comience con un formulario pequeño, como el cuadro "Acerca de", y continúe desde formularios simples hasta formularios complicados. Por supuesto, tendrá que agrupar y programar algunas migraciones, pero gradualmente migrará sus pantallas, informes y bibliotecas de Ms Access a VB.Net.

Skrol29
fuente
1

Me sorprende que hayas hecho todo eso con Access. Hay una pregunta muy importante que no debe hacer .NET Windows Forms o .NET WPF. WPF tiene una curva de aprendizaje más pronunciada, pero en mi opinión es más potente con una mejor interfaz de usuario. Recientemente convertimos nuestra aplicación comercial de Formularios a WPF y ya estamos obteniendo más ventas. También agregamos nuevas funciones, pero la interfaz de usuario de WPF es más sexy. Revise el diseño de su mesa y límpiela: ahora es el momento. Asegúrate de declarar todos tus FK. En Access, puede agregar cosas sobre la marcha bastante fácil algunas veces que las cosas se deslizan. Si esta es tu primera interfaz de usuario WPF, crea algunos prototipos. Podríamos incluir más en WPF que la nueva aplicación tiene más funciones, menos pantallas y menos código. Pasarás de odiar XAML a cómo amarlo. Considere una estructura como MVVM.

paparazzo
fuente
Hemos desarrollado varias aplicaciones .Net pequeñas utilizando WinForms, WPF y Silverlight (tanto como RIA como fuera del navegador) y estoy de acuerdo en que WPF (y Silverlight) proporcionan un aspecto mucho más atractivo para las aplicaciones.
Alexander Galkin
0

Dado que ya conoce bien el modelo de objetos de Access, creo que desea utilizar Access Interop desde su aplicación .NET. Debería (más o menos) permitirle automatizar el control de una aplicación de Access, sin la opacidad de DDE.

sq33G
fuente
Si bien creo que es una buena idea, si usan una versión anterior de Access, es posible que no tengan el nivel de funcionalidad que necesitan.
jfrankcarr
-1

No conozco un conocimiento profundo sobre su capa de lógica de negocios, pero también puede acceder a sus bases de datos de MS Access en su aplicación .NET. Si no se trata simplemente de obtener datos, puede implementar una conexión TCP / IP entre sus programas (aplicaciones VB6 y VB.NET). Por favor, eche un vistazo a un artículo sobre CodeProject .

Osman Turan
fuente
"... habilite el intercambio de datos entre esta aplicación y la ejecución de la aplicación MS Access". si esa afirmación no está relacionada con mi respuesta. Entonces tampoco sé nada.
Osman Turan
Okay. Mis disculpas. Voto negativo eliminado.
Arseni Mourzenko
@MainMa: No hay problema.
Osman Turan
1
Creo que mi respuesta sigue siendo válida después de su edición. Mencioné acerca de dos formas. Uno de ellos tiene acceso directo que se revela inútil después de su edición, y el otro es hacer una aplicación N-Tier. Creo que debe implementar un protocolo TCP / IP entre su aplicación. Recomiendo especialmente este método incluso si desea ejecutar sus aplicaciones en la misma máquina. Porque, en mi experiencia anterior, he descubierto que DDE no es muy confiable para tales usos y es realmente molesto. Otro enfoque para las aplicaciones locales puede ser utilizar mensajes del sistema personalizados (mensajes de ventana).
Osman Turan
1
Parece que tiene un problema mayor de lo que parece :) Porque, después de cada uno de mis comentarios, reveló algo nuevo. No estoy familiarizado con MSMQ BTW. Lo siento.
Osman Turan
-1

Estás pidiendo una mejor práctica sobre cómo hacer lo incorrecto. No hay uno Las mejores prácticas abarcan cómo crear de manera efectiva un sistema que se pueda mantener, de modo que incluso si un autobús se bloquea y un equipo completamente nuevo necesita quedarse en frío, el desarrollo y el soporte pueden continuar. El sistema que describas enviará a la mayoría de los desarrolladores a correr por las colinas. Tiene un producto construido con tecnología obsoleta y desea interactuar con la tecnología actual. Y desea hacerlo sin abordar ninguno de los patrones anti que ha descrito para el producto principal. Es probable que los desarrolladores que estén dispuestos a abordarlo no estén dispuestos a hacerlo con las condiciones que proponga.

Sin embargo, su autobús no se ha estrellado, por lo que puede aprovechar el equipo existente que comprende el sistema. La mejor manera de desarrollar gradualmente que he encontrado es usar la metodología ágil. Es compatible con un proceso iterativo que aborda los requisitos de alto riesgo desde el principio y aborda bien las necesidades del negocio.

SoylentGray
fuente
-2

Decidimos mover gradualmente nuestra aplicación hacia .Net

A menudo un error. La mejor práctica es no intentar "gradualmente".

A pesar de que es un lenguaje nuevo para la mayoría de los desarrolladores aquí, tenemos un profundo conocimiento de VBA y varias docenas de pequeños proyectos implementados en VB6.

No es una muy buena base para una decisión. Si desea aprender un nuevo idioma, no aprenda VB. Aprende C # o algo aún mejor como Java.

"un nuevo lenguaje para la mayoría de los desarrolladores aquí, tenemos un profundo conocimiento de VBA" es una frase de código común para "tenemos un VBA Guru a quien no queremos irritar". Eso es algo que posiblemente sea malo, también.

Lo que estamos buscando son las mejores prácticas para mover gradualmente nuestra amplia GUI

Las mejores prácticas no involucran "Gradual". Implican "Descartar completamente".

Las migraciones graduales que he visto se han roto porque es muy difícil.

Es mejor que hagas esto.

  1. Preservar el activo más valioso . Los datos. Mueva todos los datos a SQL Server. Todo ello. Reescriba todo el MS-Access para usar conexiones ODBC a SQL Server. Ahora mismo.

  2. Despida a cualquiera que cree tablas o datos temporales o cualquier cosa en MS-Access. Todos los datos deben vivir en una base de datos fuera de MS-Access. Los datos en MS-Access son los que causan los problemas, así que deténgase ahora y asegúrese de que todos estén de acuerdo. Si no están de acuerdo, búsqueles un nuevo trabajo que no implique piratear MS-Access mientras intenta deshacerse de MS-Access.

  3. Encuentre un marco de informes que generará automáticamente informes cercanos a los que tiene ahora. Sin programación ¡Solo dale una mesa o una vista y golpea! está hecho.

  4. Enumere los 500 informes. Partícelos en informes que se crean fácilmente con la herramienta e informes que son más difíciles. Priorice los difíciles en "Debe tener", "Debería haber", Podría haber "y" No lo haré hasta más tarde ". Reemplace los informes automatizados y los informes imprescindibles de esta herramienta de informes completamente fuera de MS-Access.

    Mi experiencia es que una vista de base de datos a menudo se reutiliza en aproximadamente 20 informes. A partir de eso, supongo que tiene 25 vistas relevantes de las cuales se derivan los 500 informes. Cualquier herramienta que pueda automatizar la producción de informes debe manejar la mayoría de sus informes desde un pequeño conjunto de vistas SQL bien diseñadas. Algunos informes serán demasiado complejos o difíciles para una herramienta automatizada.

  5. Encuentre un marco de desarrollo que construya transacciones CRUD automáticamente.

  6. Particione sus 200 formularios en formularios CRUD (que se pueden construir automáticamente) y en formularios que no sean CRUD. Entre los que no son CRUD, priorice el uso de las reglas MoSCoW (Debe, Debería, Podría, No lo hará).

    A menudo, el 60-80% de los formularios de solicitud son formularios CRUD simples y automatizados. 20-40% son más complejos y requieren una programación más experta. En base a esto, tiene de 120 a 160 formularios CRUD que no necesita reescribir, solo automatizar. Tienes 40-80 transacciones seriamente complejas.

  7. Cree los formularios CRUD y los formularios imprescindibles que no sean CRUD.

  8. Evaluar las brechas. Vuelva a priorizar y comience a trabajar en las partes más importantes de la lista "Debería haber".

Probablemente sea más fácil descartar Access por completo. Evita el gradualismo.

Vas a gastar todo el dinero eventualmente.

También puede presupuestarlo y gastarlo ahora.

Intentar hacerlo gradualmente puede ser más costoso debido a la complejidad de tratar de gestionar la convivencia.

S.Lott
fuente
99
Todo esto es bueno, pero no realista. Especialmente la parte con "despedir a cualquiera" y "descartar por completo". No podemos simplemente tirar todo y comenzar desde un campo verde, tanto desde el punto de vista financiero, estratégico como personal.
Alexander Galkin
8
-1 Tu experiencia no es la suma total del universo. Si bien a todos nos encantaría vivir en un mundo perfecto donde podemos cambiar la cultura de inmediato, eso no es realidad. Además, su sesgo hacia algunas tecnologías probadas nubla su capacidad de ver otras posibles soluciones. Usted ha explicado la mejor manera para que USTED resuelva el problema, no para el OP.
SoylentGray
44
Lo siento, tuve que -1 esto a menudo un error. La mejor práctica es no intentar "gradualmente". - ¿Tiene alguna cita para esta 'mejor práctica'? Porque la mayoría de la gente diría lo contrario - joelonsoftware.com/articles/fog0000000069.html
MattDavey
2
"Porque la mayoría de la gente diría lo contrario". La mayoría de las personas son más inteligentes que los clientes con los que he trabajado. Bien por ellos. Lamentablemente, tuve que trabajar con varios clientes con grandes y malas aplicaciones de MS-Access que necesitaban reescrituras al por mayor porque no podían migrar gradualmente. Es mi experiencia Esa es mi cita. Lo siento, mi experiencia parece ser única.
S.Lott
44
@ S.Lott Creo que es extremo decir que el código es más una responsabilidad que un valor. Nada de lo que dijo el OP indicaba que no funcionaba o no satisfacía las necesidades del negocio; de hecho, "Estamos bastante satisfechos con la funcionalidad actual de la aplicación" . No parece haber una necesidad urgente de agrupar perfectamente el código que funciona: no hay cáncer que eliminar. Pero el OP ha identificado que para realizar mejoras en el futuro necesita romper el techo de cristal impuesto por Access; esto puede ser un proceso gradual.
MattDavey