Импорт данных в ресторанный фронт офис
Материал из GedeminWiki
Рассмотрим задачу импорта списка меню (вместе с группами, блюдами, ценами и т.п.) во фронт-офисную программу систему "Гедымин: Ресторан". Данные подготовливаются внешней бухгалтерской программой и предоставляются нам ввиде XML файла, пример которого приведен ниже:
<?xml version="1.0" encoding="windows-1251"?> <!-- 1. Все идентификаторы - целые числа, уникальные для объектов одного типа 2. Для вещественных чисел используется точка в качестве десятичного разделителя. Например, 3.14 3. menu_kind - может принимать значения "B" - меню для бара, "K" - меню для кухни 4. active_from, active_to - задают период дат действия меню 5. Формат даты в строковом представлении дд.мм.гггг --> <MENU_LIST> <MENU name="Обеденное меню" id="1" menu_kind="K" active_from="01.10.2010" active_to="10.10.2010"> <MEAL_GROUP name="Закуски" id="222"> <MEAL name="Caлат летний" id="333" price="7800" /> <MEAL name="Caлат мясной" id="444" price="12800" /> </MEAL_GROUP> <MEAL_GROUP name="Супы" id="2"> <MEAL name="Суп гороховый" id="555" price="12800" /> </MEAL_GROUP> <MEAL_GROUP name="Горячие блюда" id="3"> <MEAL name="Бифштекс" id="3344" price="19800" /> </MEAL_GROUP> </MENU> <MENU name="Вечернее меню" id="2" menu_kind="K" active_from="01.10.2010" active_to="10.10.2010"> </MENU> </MENU_LIST>
Разбор XML документа мы будем вести с помощью стандартного объекта MSXML.DomDocument. Ниже приведен макрос импорта. Алгоритм работы следующий:
- Загрузим файл (имя файла передается в качестве входящего параметра процедуры)
- Пробежимся по списку меню в файле и для каждого вызовем функцию pd_imp_ProcessMenu
- Внутри функции pd_imp_ProcessMenu создадим/найдем меню в базе данных с помощью бизнес-объекта.
- Организуем цикл по группам блюд.
- Для каждой вызовем функцию pd_imp_ProcessGroup
- Внутри функции pd_imp_ProcessGroup создадим/найдем группу в базе данных с помощью бизнес-объекта.
- Организуем цикл по блюдам.
- Для каждой вызовем функцию pd_imp_ProcessMeal
- Внутри функции pd_imp_ProcessMeal создадим/найдем блюдо в базе данных с помощью бизнес-объекта
Option Explicit Sub pd_ImportMenu(FileName) Dim oXML Set oXML = CreateObject("MSXML.DomDocument") oXML.Async = False If Not oXML.Load(FileName) Then MsgBox "Invalid file name" Exit Sub End If oXML.setProperty "SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'" oXML.setProperty "SelectionLanguage", "XPath" Dim Item, Nodes Set Nodes = oXML.documentElement.selectNodes("//MENU") For Each Item In Nodes If Not pd_imp_ProcessMenu(Item) Then _ Exit Sub Next MsgBox "Success!" End Sub Function pd_imp_ProcessMenu(ByRef MenuNode) pd_imp_ProcessMenu = False Dim MenuName, MenuID, MenuKind, ActiveFrom, ActiveTo MenuName = MenuNode.GetAttribute("name") MenuID = CLng(MenuNode.GetAttribute("id")) MenuKind = MenuNode.GetAttribute("menu_kind") ActiveFrom = DateValue(MenuNode.GetAttribute("active_from")) ActiveTo = DateValue(MenuNode.GetAttribute("active_to")) Dim Creator, MenuObj Set Creator = New TCreator ' Работаем с базой данных ' Находим/создаем объект меню в БД Dim Groups, Group Set Groups = MenuNode.SelectNodes("./MEAL_GROUP") For Each Group in Groups If Not pd_imp_ProcessGroup(MenuObj, Group) Then _ Exit Function Next pd_imp_ProcessMenu = True End Function Function pd_imp_ProcessGroup(ByRef MenuObj, ByRef GroupNode) pd_imp_ProcessGroup = False Dim GroupName, GroupID GroupName = GroupNode.GetAttribute("name") GroupID = CLng(GroupNode.GetAttribute("id")) Dim Creator, GroupObj Set Creator = New TCreator ' Работаем с базой данных ' Находим/создаем объект группы блюд в БД Dim Meals, Meal Set Meals = GroupNode.SelectNodes("./MEAL") For Each Meal in Meals If Not pd_imp_ProcessMeal(MenuObj, GroupObj, Meal) Then _ Exit Function Next pd_imp_ProcessGroup = True End Function Function pd_imp_ProcessMeal(ByRef MenuObj, ByRef GroupObj, ByRef MealNode) pd_imp_ProcessMeal = False Dim MealName, MealID, MealPrice MealName = MealNode.GetAttribute("name") MealID = CLng(MealNode.GetAttribute("id")) MealPrice = CCur(MealNode.GetAttribute("price")) Dim Creator, MealObj Set Creator = New TCreator ' Работаем с базой данных ' Находим/создаем объект блюда в БД pd_imp_ProcessMeal = True End Function
Примечание
Для корректной работы макроса импорта на компьютере должны быть установлены:
- Формат даты: дд.мм.гггг
- Использование точки в качестве десятичного разделителя