Импорт данных в ресторанный фронт офис

Материал из 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

Примечание

Для корректной работы макроса импорта на компьютере должны быть установлены:

  • Формат даты: дд.мм.гггг
  • Использование точки в качестве десятичного разделителя
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты