Clonación de una aplicación de base de datos PHP/ MySQL (con algo de automatización) en MS Access o OpenOffice.org Base

StackOverflow https://stackoverflow.com/questions/4824078

Pregunta

No estaba seguro de si preguntar esto aquí o en Superuser, así que me disculpo si no pertenece aquí.

Creé una pequeña aplicación de base de datos PHP/MySQL para administrar los datos de lealtad del cliente para la tienda de mi madre, con la intención de configurarlo localmente en su computadora en la caja registradora con XAMPP. Sin embargo, me han pedido que vuelva a implementar el sistema en una base de datos relacional de GUI como MS Access o OpenOffice Base, principalmente para que pueda hacer cosas como el correo fusionado y los informes gráficos con una GUI (que no tengo que escribir) .

Puedo replicar fácilmente mis estructuras y relaciones de la tabla MySQL, y crear algunas de las formas e informes más básicas, pero nunca he realizado secuencias de comandos, macros, etc. en acceso o base. Mi PHP manejó mucho más que solo la entrada de forma, hubo algunos scripting involucrados que no sé cómo implementar en acceso / base. Vale la pena señalar: si termino usando acceso, será Access 2007.

Aquí hay una visión general rápida de lo que estoy tratando de hacer, en caso de que ayude. Perdón por la longitud.

El negocio es un mercado de alimentos de Take & Bake, y la base de datos está reemplazando un sistema de fidelización de tarjetas de sellos físicos. Cada cliente obtiene un sello en su tarjeta por cada $ 25 que gastan. Ganan comidas gratis de la siguiente manera:
- En el octavo sello, ganan una guarnición gratis.
- En el sello 16, ganan una comida de tamaño regular gratis.
- En el sello 24, ganan una comida de tamaño familiar gratuita y su tarjeta se restablece a cero sellos.
La fecha de cada sello debe registrarse (de lo contrario, solo incrementaría un campo en lugar de tener una tabla de sellos).

Tengo 3 tablas: customers, stamps, y freebies. customers tiene una relación de 1 a muchos con ambos stamps y freebies.

  • customers es una lista simple de contactos.
    columnas: ID, firstname, lastname, email, phone
  • stamps Mantiene los registros de cada sello ganado.
    columnas: ID, customerID, date, index (1-24; el enésimo sello en la tarjeta de ese cliente)
  • freebies Mantiene registros de cada comida gratis que han ganado.
    columnas: ID, customerID, date, size, is_redeemed

Aquí está la magia de mi PHP que no sé cómo implementar en Access/Base:

  1. Cuando un usuario selecciona un cliente y hace clic en un botón "Agregar un sello":

    • stamps se consulta para obtener el índice del último sello para ese cliente => Variable local N
    • Si n == 24, establece n = 0. incremento n por 1.
    • se inserta un registro en stamps con la fecha actual, la identificación del cliente y un índice de n
    • Si n == 8, 16 o 24 se inserta un registro en freebies Con el tamaño apropiado y una alerta aparece para notificar al usuario que el cliente obtuvo una mierda gratis.
  2. Algún tipo de página de "Ver Cliente" (¿Formulario?) Que muestra todos los sellos y regalos que han ganado, con botones de "redimir" al lado de los regalos que no han sido redimidos.

En general, necesito que sea bastante a prueba de idiotas y "Big-Button", automatización siempre que sea posible, los cajeros en la tienda deberían poder usarlo sin conocimiento previo de las bases de datos.

¿Es esto práctico en un programa como Access o Base, o debería convencerla de que use mi versión PHP? Si necesito escribir código, ¿qué idioma (s) necesito enseñarme? ¿Debería estar estructurando mis datos de manera diferente? No estoy seguro de por dónde empezar aquí.

¿Fue útil?

Solución

Mi sugerencia: no lo hagas. Ejecute un servidor MySQL en la PC en cuestión, tenga su aplicación PHP como front -end para los cajeros, y luego, si desea la función de informes de MS Access, solo tenga Access Connect a la base de datos MySQL con ODBC.

La mejor implementación es con bastante frecuencia la que ya tiene.

Otros consejos

Realmente creo que esto sería un pedazo de pastel. Es cierto como Tony dijo que puedes continuar usando las mismas tablas/backend y esa es probablemente la ruta que recomendaría. Deberá instalar los controladores ODBC de MySQL en cualquier máquina que se vincule a la base de datos MySQL. Después de eso, cree un DSN y luego acceda a las tablas a través de eso desde el acceso dentro del acceso. Es posible que desee agregar código más tarde para volver a relacionar las tablas cada vez que el software se carga con tablas sin DSN. De esta manera, la base de datos puede ejecutarse en una máquina que no tiene un DSN configurado. Le recomiendo que vaya con MySQL o SQL Server Express en lugar de un backend de acceso MS, pero no voy a tomarme el tiempo para explicar por qué.

Creo que en realidad puede obtener mucha más funcionalidad de una aplicación de escritorio Windows tradicional (incorporada MS Access o VB.NET) de lo que podría con PHP. Y es mi opinión que podrás hacerlo con menos código y menos tiempo invertido. Mencioné VB.NET, pero probablemente recomendaría MS Access a través de VB.NET para bases de datos, aunque cualquiera de los dos hará el trabajo.

Como Tony ya mencionó, Access usa el lenguaje VBA. Se necesita un poco de tiempo para recogerlo realmente a menos que ya tenga algo de experiencia con otros lenguajes de programación que usan la sintaxis básica. Descubrí que pasar de VBA/ASP a PHP/JavaScript ha sido lento, aunque no necesariamente tan difícil. PHP usa el código de estilo C con aparatos ortopédicos rizados y VBA no.

Viniendo de PHP, aquí hay algunas cosas que pueden ser nuevas para usted:

Tipo de variable más fuerte: en el acceso puede declarar sus variables con un tipo de datos especificados como cadena, fecha, número entero, largo, único, doble, etc. Recomiendo usar esto tanto como sea posible. Hay muy pocas veces en las que necesitará usar los tipos más generales, como el objeto o la variante. Las variables declaradas con un tipo de datos especificados arrojarán un error si intenta poner el tipo de datos incorrecto en ellas. Esto te ayuda a escribir un mejor código, en mi opinión.

Opción Explícita: la opción Explícita es una declaración que puede colocar en la parte superior de cada módulo de código para hacer cumplir que debe declarar una variable con una instrucción DIM antes de usarla. Le recomiendo que hagas esto. Le ahorrará muchos problemas de solución de problemas.

Establecer myVariable = nada - Limpiar las variables de objetos después de usarlas es una de las mejores prácticas de usar MS Access. Utilizará esto para limpiar las variables DAO RecordSet, variables de conexión de ADO, variables de conjunto de registro de ADO, variables de formulario, etc. Cualquier variable que declare como objeto (o algún tipo específico de objeto) debe limpiarse al ajustarlo en nada Cuando ya no necesita usar la variable.

No incluye: no existe una declaración de incluido en MS Access. Puede importar módulos de código desde otras bases de datos de acceso. Puede llamar a las funciones contenidas en una DLL. Pero no hay incluido en el acceso como en PHP.

Mordaz - Tendrá que usar el objeto DOCMD de MS Access para abrir formularios e informes y realizar otras tareas comunes. Solo una advertencia: es frecuentemente irracional. Los usuarios de acceso desde hace mucho tiempo no piensan mucho, pero he encontrado que estos comandos tienen poca cohesión o consistencia. Dejame darte un ejemplo. Si desea cerrar un formulario, usa este código: Docmd.close ACFORM, "FRMSOMEFORMNAME" Pero si desea abrir un formulario, usa este código: Docmd.openform "frmname" En este ejemplo, ¿por qué la apertura de un formulario obtiene su propia función OpenForm mientras cierre un formulario simplemente usa Close seguido de una constante que le dice a Access que desea cerrar un formulario? No tengo respuesta. DOCMD está lleno de este tipo de inconsistencia. BlueClaw hace un trabajo bastante bueno al enumerar los docmd más comunes, aunque no creo que los ejemplos estén exactamente estelares.

Referencias - No debería necesitar usar referencias con mucha frecuencia. Tendrá que usarlos para habilitar cosas como DAO y ADO (ver más abajo) o tiempo de ejecución de Scripting de Microsoft (a menudo utilizado para acceder, leer, escribir, etc. a archivos y carpetas). Básicamente es algo que haces una vez y luego te olvidas de eso.

Controles activos - Probablemente sea mejor intentar construir su proyecto sin usarlos. Requieren que se instale el mismo control en cada computadora que ejecute su software. No sé mucho al respecto, pero entiendo que hay algunos problemas de compatibilidad que pueden surgir si usa controles ActiveX en su proyecto.

DAO - Objetos de acceso a datos - DAO es el conjunto original y nativo de objetos de Access utilizados para interactuar con su contenedor de datos. Aunque se usa principalmente para acceder a la fecha mantenida en un backend/contenedor de base de datos de acceso, también se puede usar para algunas tareas cuando está utilizando tablas vinculadas a ODBC. DAO es muy útil cuando necesita recorrer los registros para hacer cambios a granel. Incluso puede usarlo para recorrer los controles de formulario. Un lugar que uso esto es reordenar los números de línea en los detalles de la factura después de eliminar una línea. Otro uso típico es usarlo en funciones de "utilidad" en las que necesita cambiar algo en un campo o campos que no se pueden hacer con una consulta de actualización.

CurrentDB.Execute ("Actualizar o eliminar consulta aquí ...") El método Ejecutar del objeto CurrentDB es, en mi opinión, una llamada DAO implícita. Le permite ejecutar consultas de actualización o eliminar en tablas locales y vinculadas del código VBA. También puede lograr esto usando DOCMD.RUNSQL Pero CurrentDB.Execute es el método preferido porque le da mensajes de error mejorados si algo falla si se agrega ", dbfailonError" como segundo argumento.

ADO - Objetos de datos ActiveX - Recomendé no usar controles ActiveX, pero esta es una tecnología ActiveX que podría necesitar. Que yo sepa, Ado es lo único que puede usar para ejecutar procedimientos almacenados desde el acceso. ADO es similar a DAO y se suponía que reemplazaría a DAO, aunque en realidad no lo hizo. Tiendo a usarlos en mis aplicaciones. Lleva un tiempo descubrir cuál hará el trabajo por usted o cuál lo hará mejor. En general, me quedo con DAO para todo, excepto para ejecutar procedimientos almacenados o conectarme a fuentes de datos externas (es decir, no usar tablas vinculadas). DAO y ADO son parte de MDAC (componentes de acceso a datos de Microsoft) que se instala con MS Access.

Objeto del sistema de archivos - Este objeto, mencionado anteriormente, a menudo se usa para acceder a archivos y carpetas. Encontrará que debe usarlo para copiar archivos, crear archivos de texto, leer archivos de texto, escribir en archivos de texto, etc. Es parte de Microsoft Scripting Runtime que forma parte del host de Windows Script (existe en todas las computadoras de Windows. Puede volverse "roto"). Access le brinda algunas formas de acceso de acceso y carpetas utilizando las funciones/métodos incorporados de VBA, como Dir (), pero estas funciones no cubren todas las bases.

SQL - Lenguaje de consulta del servidor - Probablemente ya esté familiarizado con SQL, pero deberá acostumbrarse al "Superset" del lenguaje SQL de acceso. No es drásticamente diferente, pero el acceso le permite usar funciones de acceso (por ejemplo, len, izquierda, derecha) o sus propias funciones personalizadas. Sus propias funciones solo necesitan existir en un módulo de código y ser declaradas como públicas. Se repetiría un ejemplo de su propia función (no existe en MS Access, existe en MySQL) que a veces se usa para crear sangría basada en el recuento (*) en las tablas con relaciones de los padres infantiles. Lo estoy dando como ejemplo, aunque es poco probable que necesite usar dicha función a menos que vaya a usar el modelo de conjunto anidado para mantener categorías jerárquicas.

Las variables no pueden estar en cadenas literal: esta es una gran diferencia entre el acceso y el PHP. Php le permite escribir: "Seleccione * de la etiqueta Where tagText = '$ mytag'" En MS Access, tendría que escribirlo así: "Seleccione * de la etiqueta Where tagText = '" & strmytag & "" (puede Ni nunca deben preocuparse por esto a menos que esté formatando una consulta en VBA para recuperar un DAO o un conjunto de registros ADO. Lo que acabo de señalar generalmente no afecta a los registros de su formulario o un informe. variables en aquellos.)

Consulta: no es difícil de entender, pero en el acceso una consulta es básicamente una vista MySQL. De hecho, no guardo consultas muy a menudo. Generalmente los uso solo para obtener mi "código" SQL y luego tomo ese SQL y lo pego en mi formulario como RecordsOurce en lugar de vincular un formulario a una consulta guardada. No importa de qué manera quieras hacerlo. Hay pros y contras de cualquier manera que elija hacer esto. Como nota al margen, no tenga miedo de crear vistas en MySQL y vincularlas en el acceso. Cuando vinculas a ellos, el acceso los ve como tablas. Si es actualizable/escritable o no dependerá de la construcción de la vista. Ciertos tipos de consultas/vistas (como los sindicatos) son de solo lectura.

Como nota final, recomiendo MS Access sobre la base de OpenOffice.org. Probé la base hace un par de años y me pareció que carecía de tantas características. Sin embargo, ya tenía experiencia en MS Access, así que no estoy seguro de darle a OpenOffice Base una prueba justa. Lo que encontré desaparecido fueron eventos. Estoy acostumbrado a poder ajustar mis formularios en MS Access para dar a los usuarios una interfaz de usuario muy receptiva con muchos comentarios y no pude entender cómo hacerlo en la base. Tal vez las cosas hayan cambiado desde que lo probé por última vez, no lo sé. Aquí hay un artículo que comparó la base con MS Access.

Otros Gurús de So Access, siéntase libre de señalar cualquier error en mi respuesta. Todavía me considero un novato en la programación.

No puedo hablar por la base. Sin embargo, el acceso puede vincular directamente a la base de datos MySQL para que no tenga que rehacer los datos. En cuanto a crear los bits y las piezas de código en el acceso, serían bastante fáciles. Acceso, Word y Excel, use VBA, que es idéntico, excepto para el Acceso, el Modelo de Objeto Word o Excel, al Visual Basic 6.0. De hecho, un error oscuro menor cuando se usa el editor VBA también está presente en el editor VB6.

También agregaré que una de mis bases de datos de acceso tenía 160 tablas, 1200 consultas, 350 formularios, 450 informes y 70k líneas de código. Entonces su aplicación es bastante pequeña en comparación.

En la tabla de regalos cambiaría el campo IS_REDEMED a una date_REDEMED. Definitivamente estoy de acuerdo con la grabación de cada sello y el regalo de transmisión ganado como registros separados en las tablas. La forma en que es realmente fácil mostrarle al cliente un historial en lugar de solo afirmar que solo tiene X sellos.

También considere un lector de código de barras y emita las tarjetas de billetera de plástico codificadas por los usuarios. Esto acelerará enormemente el tiempo requerido por el empleado para buscar sus registros. De hecho, considere usar las tarjetas de lealtad de su área que ya pueden tener, como una tarjeta Safeway o Airmiles. Pondría ese número en una tabla separada, aunque en caso de que pierdan la primera tarjeta que se le dieron. O eso pueden rastrear múltiples tarjetas. Una familia podría querer acumular puntos en una cuenta.

Gracias por la publicación de Lenghty. Esto nos permite darle algunas sugerencias sobre diferentes facetas que quizás no haya pensado en primer lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top