Клонирование приложения базы данных PHP / MySQL (с некоторой автоматизацией) в MS Access или OpenOffice.org Base - PullRequest
0 голосов
/ 28 января 2011

Я не был уверен, стоит ли спрашивать это здесь или в SuperUser, поэтому я прошу прощения, если он не принадлежит здесь.

Я создал небольшое приложение базы данных PHP / MySQL для управления данными о лояльности клиентов дляМагазин моей мамы, намеревающийся установить его локально на компьютере с кассовым аппаратом с помощью XAMPP.Однако меня попросили переопределить систему в реляционной базе данных с графическим интерфейсом, такой как MS Access или OpenOffice Base, в первую очередь, чтобы она могла выполнять такие вещи, как слияние почты и графические отчеты с графическим интерфейсом (который мне не нужно писать).

Я могу легко воспроизвести структуру и взаимосвязи таблиц MySQL и создать несколько базовых форм и отчетов, но я никогда не делал скриптов, макросов и т. Д. В Access или Base.Мой PHP обрабатывал намного больше, чем просто ввод с формы, были некоторые сценарии, которые я не знаю, как реализовать в Access / Base.Стоит отметить: если я в конечном итоге использую Access, это будет Access 2007.

Вот краткий обзор того, что я пытаюсь сделать, на случай, если это поможет.Приносим извинения за длину.

Бизнес - это продуктовый рынок "возьми и испечь", и база данных заменяет физическую систему лояльности с использованием карт.Каждый клиент получает штамп на своей карте за каждые потраченные 25 долларов.Они получают бесплатное питание следующим образом:
- на 8-й марке они получают бесплатный гарнир.
- на 16-й марке они получают бесплатную еду обычного размера.
- на 24-й марке ониполучить бесплатное питание для семьи, и их карточка сбрасывается до нуля.
Дата каждого штампа должна быть записана (в противном случае я бы просто увеличил одно поле вместо таблицы марок).

Iесть 3 таблицы: customers, stamps и freebies.customers имеет отношение 1-ко-многим с stamps и freebies.

  • customers - простой список контактов.
    столбцы: ID, firstname, lastname, email, phone
  • stamps ведет учет каждой заработанной печати. ​​
    столбцы: ID, customerID, date, index (1-24; N-й штамп на карточке этого клиента)
  • freebies ведет учет каждого бесплатного блюда, которое онизаработали.
    столбцы: ID, customerID, date, size, is_redeemed

Вот волшебство моего PHP, которое я не знаю, как реализовать в Access / Base:

  1. Когда пользователь выбирает клиента и нажимает кнопку «добавить штамп»:

    • stamps запрашивается для получения индекса из последнего штампа для этого клиента => локальная переменная N
    • , если N == 24, установить N = 0. Увеличить N на 1.
    • запись вставляется в stamps с текущей датой, идентификатором клиента и индексом N
    • если N == 8, 16 или 24, в freebies вставляется запись с соответствующим размером, и появляется предупреждение, уведомляющее пользователя о том, что клиент заработал некоторое бесплатное дерьмо.
  2. Какая-то страница просмотра клиента (форма?отчет?), который показывает все штампы и халявы, которые они заработали, с кнопками "выкупить" рядом с халявой, которые не были выкуплены.

В общем, мне нужно сделать это честнозащита от идиотов и «большая кнопка» - автоматизация везде, где это возможно - кассиры в магазине должны иметь возможность использовать ее без предварительного знания баз данных.

Это практично в такой программе, как Accessили Base, или я должен просто убедить ее использовать мою версию PHP?Если мне нужно написать код, на каком языке я должен учить себя?Должен ли я структурировать свои данные по-другому?Я не уверен, с чего начать.

Ответы [ 3 ]

4 голосов
/ 28 января 2011

Действительно, я думаю, что это будет кусок пирога.Это правда, как Тони сказал, что вы можете продолжать использовать те же таблицы / бэкэнд, и я, вероятно, рекомендую этот путь.Вам нужно будет установить драйверы ODBC MySQL на любой компьютер, который будет связываться с базой данных MySQL.После этого создайте DSN, а затем получите доступ к таблицам через Access.Возможно, вы захотите добавить код позже, чтобы связать таблицы каждый раз, когда программное обеспечение загружается с использованием таблиц без DSN.Таким образом, база данных может работать на компьютере, на котором не настроен DSN.Я рекомендую вам использовать MySQL или SQL Server Express в отличие от бэкэнда MS Access, но я не собираюсь тратить время на то, чтобы объяснить, почему.

Я думаю, что вы действительно можете получить гораздо больше функциональностииз традиционного Windows Desktop Application (встроенного в MS Access или VB.Net), чем с PHP.И я лично считаю, что вы сможете сделать это с меньшим количеством кода и меньшими затратами времени.Я упомянул VB.Net, но я бы, вероятно, рекомендовал MS Access через VB.Net для баз данных, хотя любой из них сделает свою работу.

Как уже упоминал Тони, Access использует язык VBA.Требуется некоторое время, чтобы действительно поднять его, если у вас уже нет опыта работы с другими языками программирования, которые используют синтаксис Basic.Я обнаружил, что переход с VBA / ASP на PHP / Javascript идет медленно, но не обязательно так сложно.PHP использует код в стиле C с фигурными скобками, а VBA - нет.

Исходя из PHP, вот некоторые вещи, которые могут быть для вас новыми:

Более сильная типизация переменных -В Access вы можете объявить переменные с указанным типом данных, таким как String, Date, Integer, Long, Single, Double и т. Д. Я рекомендую использовать это как можно больше.Очень редко вам нужно использовать более общие типы, такие как Object или Variant.Переменные, объявленные с указанным типом данных, выдают ошибку, если вы попытаетесь ввести в них неправильный тип данных.На мой взгляд, это поможет вам написать лучший код.

Option Explicit - Option Explicit - это объявление, которое вы можете поместить в верхней части каждого модуля кода, чтобы обеспечить необходимость объявления переменной с помощью оператора Dim перед использованиемЭто.Я настоятельно рекомендую вам сделать это.Это сэкономит вам много времени на устранение неполадок.

Set MyVariable = Nothing - Очистка переменных объекта после их использования - одна из лучших практик использования MS Access.Вы будете использовать это для очистки переменных набора записей DAO, переменных подключения ADO, переменных набора записей ADO, переменных формы и т. Д. Любая переменная, которую вы объявляете как объект (или какой-либо конкретный тип объекта), должна быть очищена, если для нее установлено значение Nothing.когда вам больше не нужно использовать переменную.

Нет включений - в MS Access нет такого понятия, как оператор включения.Вы можете импортировать модули кода из других баз данных Access.Вы можете вызывать функции, содержащиеся в DLL.Но в Access нет включения, как в PHP.

DoCmd - вам придется использовать объект DoCmd MS Access для открытия форм и отчетов и выполнения других общих задач.Просто предупреждение: это часто иррационально.Пользователи с длительным доступом не думают об этом, но я обнаружил, что эти команды имеют небольшую согласованность или последовательность.Позвольте привести пример.Если вы хотите закрыть форму, вы используете этот код: DoCmd.Close acForm, "frmSomeFormName" , но если вы хотите открыть форму, вы используете этот код: DoCmd.OpenForm "frmName" В этом примере, почему открытие формы получает свою собственную функцию OpenForm, а закрытие формы просто использует Close, за которым следует константа, которая сообщает Access, что вы хотите закрыть форму?У меня нет ответа.DoCmd полон этого типа несоответствия.Blueclaw неплохо справляется со списком наиболее распространенных DoCmd, хотя я не думаю, что приведенные здесь примеры являются просто звездными.

Ссылки - Вам не нужно использовать ссылки очень часто.Вам придется использовать их для включения таких вещей, как DAO и ADO (см. Далее) или Microsoft Scripting Runtime (часто используется для доступа, чтения, записи и т. Д. К файлам и папкам).По сути, это то, что вы делаете один раз, и затем вы забываете об этом.

Элементы управления ActiveX - Вероятно, лучше попытаться построить свой проект без их использования.Они требуют одинакового контроля на каждом компьютере, на котором будет запускаться ваше программное обеспечение.Я не знаю много об этом, но я понимаю, что есть некоторые проблемы совместимости, которые могут возникнуть, если вы используете элементы управления ActiveX в своем проекте.

DAO - Объекты доступа к данным - DAO - это доступ Accessоригинальный, нативный набор объектов, используемый для взаимодействия с вашим контейнером данных.Хотя он в основном используется для доступа к дате, хранящейся в бэкэнде / контейнере базы данных Access, он также может использоваться для некоторых задач при использовании таблиц, связанных с ODBC.DAO очень полезен, когда вам нужно перебирать наборы записей для массовых изменений.Вы даже можете использовать его для обхода элементов управления формы.Одно из мест, где я это использую, - это изменение порядка номеров строк в деталях счета-фактуры после удаления строки.Другое типичное использование - это использование в «служебных» функциях, где вам нужно что-то изменить в данном поле или полях, которые нельзя сделать с помощью запроса на обновление.

CurrentDb.Execute («Запрос на обновление или удаление»).здесь ... ") Метод Execute объекта CurrentDb, в моем понимании, является неявным вызовом DAO.Это позволяет запускать запросы на обновление или удаление локальных и связанных таблиц из кода VBA.Вы также можете добиться этого, используя DoCmd.RunSQL, но CurrentDb.Execute является предпочтительным методом, потому что он дает вам улучшенные сообщения об ошибках, если что-то не получается, если вы добавляете «, dbFailOnError» в качестве второго аргумента.

ADO -Объекты данных ActiveX - я рекомендовал не использовать элементы управления ActiveX, но это одна из технологий ActiveX, которая может вам понадобиться.Насколько мне известно, ADO - единственное, что вы можете использовать для запуска хранимых процедур из Access.ADO похож на DAO и должен был заменить DAO, хотя на самом деле это не так.Я склонен использовать их обоих в своих приложениях.Требуется время, чтобы выяснить, кто из вас сделает работу за вас или кто сделает ее лучше.В общем, я придерживаюсь DAO для всего, кроме запуска хранимых процедур или подключения к внешним источникам данных (т.е. без использования связанных таблиц).DAO и ADO являются частью MDAC (Microsoft Access Access Components), который устанавливается вместе с MS Access.

Объект файловой системы - Этот объект, упомянутый выше, часто используется для доступа к файлам и папкам.Возможно, вам придется использовать его для копирования файлов, создания текстовых файлов, чтения текстовых файлов, записи в текстовые файлы и т. Д. Это часть Microsoft Scripting Runtime, которая является частью Windows Script Host (существует на всех компьютерах Windows, хотяэто может стать "сломанным").Access дает вам несколько способов доступа к файлам и папкам с помощью встроенных функций / методов VBA, таких как Dir (), но эти функции не охватывают все основы.

SQL - язык запросов сервера - Вы, вероятно, уже знакомы с SQL, но вам нужно привыкнуть к «расширенному набору» Access языка SQL.Он не сильно отличается, но Access позволяет вам использовать функции Access (например, Len, Left, right) или ваши собственные пользовательские функции.Ваши собственные функции просто должны существовать в модуле кода и быть объявлены как общедоступные.Примером вашей собственной функции будет Repeat (не существует в MS Access, существует в MySQL), который иногда используется для создания отступов на основе Count (*) в таблицах с дочерними родительскими отношениями.Я привожу это в качестве примера, хотя вряд ли вам понадобится использовать такую ​​функцию, если вы не собираетесь использовать модель вложенного набора для хранения иерархических категорий.

Переменные не могут быть в буквальных строках - это огромная разница между Access и PHP.PHP позволяет писать: «SELECT * FROM tag, ГДЕ tagtext = '$ mytag'» В MS Access вам нужно написать это так: «SELECT * FROM tag, ГДЕ tagtext = '" & strMyTag & "'" (Вы можетене нужно беспокоиться об этом, если только вы не форматируете запрос в VBA для получения набора записей DAO или ADO. То, что я только что указал, обычно не влияет на источник записей вашей формы или отчета или сохраненные запросы, потому что вы обычно не используетепеременные в них.)

Запрос - не сложно понять, но в Access запрос - это в основном представление MySQL.Я на самом деле не сохраняю запросы очень часто.Обычно я использую их только для получения своего «кода» SQL, а затем беру этот SQL и вставляю его в свою форму в качестве источника записей вместо привязки формы к сохраненному запросу.Неважно, каким образом вы хотите это сделать.Есть плюсы и минусы, так или иначе, вы решите это сделать.Как примечание, не бойтесь создавать представления в MySQL и ссылаться на них в Access.Когда вы ссылаетесь на них, Access видит их как таблицы.Возможность обновления или записи будет зависеть от конструкции представления.Некоторые типы запросов / представлений (например, союзы) доступны только для чтения.

В качестве заключительного замечания я рекомендую MS Access через OpenOffice.org Base.Я опробовал Base пару лет назад и обнаружил, что в ней не так много возможностей.Тем не менее, я уже имел опыт работы с MS Access, поэтому не уверен, что предоставил OpenOffice Base справедливое испытание.Что я пропустил, так это события.Я привык настраивать свои формы в MS Access, чтобы дать пользователям очень отзывчивый пользовательский интерфейс с большим количеством отзывов, и я не мог понять, как это сделать в Base.Может быть, что-то изменилось с тех пор, как я в последний раз попробовал это, я не знаю. Вот статья, сравнивающая Base с доступом к MS.

Другие гуру SO SO Access, не стесняйтесь указывать на любые ошибки в моем ответе.Я все еще считаю себя новичком в программировании.

2 голосов
/ 28 января 2011

Я не могу говорить за Базу. Однако Access может напрямую связываться с базой данных MySQL, так что вам не нужно переделывать данные. Что касается создания кусочков кода в Access, это было бы довольно просто. Access, Word и Excel используют VBA, который идентичен, кроме Access, Word или Excel, специфичной для объектной модели, Visual Basic 6.0. Действительно, небольшая неясная ошибка при использовании редактора VBA также присутствует в редакторе VB6.

Я также добавлю, что в одной из моих баз данных Access было 160 таблиц, 1200 запросов, 350 форм, 450 отчетов и 70 тыс. Строк кода. Таким образом, ваше приложение довольно мало по сравнению с ним.

В таблице freebies я бы изменил поле is_redeemed на date_redeemed. Я определенно согласен с записью каждого штампа и полученной халявой в виде отдельных записей в таблицах. Таким образом, действительно легко показать клиенту историю, а не просто заявить, что вы получили только x штампов.

Также рассмотрите возможность считывания штрих-кода и выдачи пользователям пластиковых карточек со штрих-кодом. Это значительно ускорит время, необходимое клерку для просмотра своих записей. В самом деле, рассмотрите возможность использования общих для вашего региона карт лояльности, которые у них уже могут быть, например карты Safeway или AirMiles. Я бы положил этот номер в отдельную таблицу, хотя на случай, если они потеряют первую полученную карту. Или чтобы они могли отслеживать несколько карт. Семья может захотеть накапливать баллы на одном счете.

Спасибо за длинную публикацию. Это позволяет нам дать вам несколько советов по различным аспектам, о которых вы, возможно, даже не подумали.

1 голос
/ 22 апреля 2011

Мое предложение: не делай этого. Запустите сервер mysql на соответствующем ПК, используйте приложение PHP в качестве внешнего интерфейса для кассиров, а затем, если вам нужна функция отчетов MS Access, просто подключите Access к базе данных mysql через ODBC.

Лучшая реализация довольно часто - та, что у вас уже есть.

...