目录
站长
4320
2017 年 11 月 20 日
Simphony导出菜单

文章目录[隐藏]

Simphony没有导出菜单的报表,借助SQL Developer通过SQL查询后导出到Excel;

查询结果要求有餐厅、菜单中英文名、价格、成本价、菜单类别、打印类别、SLU、大类、小类等;

连接的数据库名:v2.7的为MICROSDB,v2.9的为MCRSPOSDB;

需要用到的表:

序号 表名 表含义
1 MENU_ITEM_DEFINITION 餐厅层菜单表
2 MENU_ITEM_MASTER 酒店层菜单表
3 MENU_ITEM_PRICE 菜单价格表
4 REVENUE_CENTER 餐厅表
5 HIERARCHY_UNIT 关联餐厅编号的表
6 HIERARCHY_STRUCTURE 关联餐厅编号的表
7 FAMILY_GROUP 报表小类表
8 MAJOR_GROUP 报表大类表
9 MENU_ITEM_CLASS 菜品属性类别表
10 PRINT_CLASS 打印属性类别表
11 STRING_TABLE STRING值,存储各类名称的表
SQL查询语句如下
---------------------------------------------------
--Ctrl+H将所有 MCRSPOSDB 替换为 MICROSDB 后可用于V.2.7查询
---------------------------------------------------------
SELECT RVC#,CENTER,MI#,ENG,CHN,PRICE,COST,MI_CLASS#,MI_CLASS_NAME,PRINT_CLASS#,PRT_CLASS_NAME,SLU,MAJOR#,MAJOR_GROUP,FAMILY#,FAMILY_GROUP FROM
(SELECT TB.* FROM 
(SELECT TB.*,row_number()over(partition by RVC#,MI# order by MI_CLASS_NAME desc,PRT_CLASS_NAME desc) RN FROM 
--row_number根据每个菜品选择属于酒店层或餐厅层的MICLASS和PRTCLASS产生的数量进行编号
(SELECT RVC.OBJECTNUMBER RVC#
,STR0.STRINGTEXT Center
,MST.ObjectNumber MI#
,STR1.STRINGTEXT ENG
,STR2.STRINGTEXT CHN
,PRC.Price PRICE
,PRC.PREPCOST COST
,DEF.MENUITEMCLASSOBJNUM MI_CLASS#
-------------------------------------
--STR5和STR6不可查询没有选择MI_CLASS或者PRT_CLASS的菜品,此两行需同时启用或禁用
--CASE WHEN 可以查询没有选择MI_CLASS或者PRT_CLASS的菜品,此两行需同时启用或禁用
--,STR5.STRINGTEXT MI_CLASS_NAME
,case when DEF.MENUITEMCLASSOBJNUM is null then null else STR5.STRINGTEXT end MI_CLASS_NAME
-------------------------------------
,DEF.PRINTCLASSOBJNUM PRINT_CLASS#
-------------------------------------
--,STR6.STRINGTEXT PRT_CLASS_NAME
,case when DEF.PRINTCLASSOBJNUM is null then null else STR6.STRINGTEXT end PRT_CLASS_NAME
-------------------------------------
,DEF.SLUINDEX SLU
,MGP.OBJECTNUMBER MAJOR#
,STR3.STRINGTEXT MAJOR_GROUP
,FGP.OBJECTNUMBER FAMILY#
,STR4.STRINGTEXT FAMILY_GROUP
FROM 
mcrsposdb.MENU_ITEM_DEFINITION DEF
,mcrsposdb.MENU_ITEM_PRICE PRC
,mcrsposdb.MENU_ITEM_MASTER MST
,mcrsposdb.REVENUE_CENTER RVC
,mcrsposdb.HIERARCHY_UNIT HIEU
,mcrsposdb.HIERARCHY_STRUCTURE HIES
,mcrsposdb.FAMILY_GROUP FGP
,mcrsposdb.MAJOR_GROUP MGP
,mcrsposdb.MENU_ITEM_CLASS MIC
,mcrsposdb.PRINT_CLASS PRT
,mcrsposdb.STRING_TABLE STR0
,mcrsposdb.STRING_TABLE STR1
,mcrsposdb.STRING_TABLE STR2
,mcrsposdb.STRING_TABLE STR3
,mcrsposdb.STRING_TABLE STR4
,mcrsposdb.STRING_TABLE STR5
,mcrsposdb.STRING_TABLE STR6
WHERE 
-------------------------------------
--修改下行数字的餐厅编号按照餐厅查看,启用此行时下一行命令加“AND”
--RVC.OBJECTNUMBER IN (1)
-------------------------------------
--修改下行条件可以显示无价格或加价配料或正常菜品
 PRC.PRICE <> 0--价格不为0
--AND PRC.PRICE is null--(价格为0,显示配料) 
--AND MST.ObjectNumber>=199990001(配料开始的编号)
------------------------------------- 
AND PRC.IsVisible = 1
AND DEF.MenuItemMasterID=MST.MenuItemMasterID--关联餐厅层菜品
AND DEF.MenuItemDefID=PRC.MenuItemDefID--关联价格
AND HIEU.OBJECTNUMBER=RVC.OBJECTNUMBER--关联餐厅编号
AND HIES.HIERUNITID=HIEU.HIERUNITID--关联餐厅编号
AND DEF.HIERSTRUCID=HIES.HIERSTRUCID--关联餐厅菜品
AND MST.MAJGRPOBJNUM=MGP.OBJECTNUMBER--关联菜品大类
AND MST.FAMGRPOBJNUM=FGP.OBJECTNUMBER--关联菜品小类
--------------------------------------------------------
--AND MIC.OBJECTNUMBER=DEF.MENUITEMCLASSOBJNUM
--AND PRT.OBJECTNUMBER=DEF.PRINTCLASSOBJNUM
--此两行需同时启用或禁用,不可查询没有选择MI_CLASS或者PRT_CLASS的菜品
--启用此两行时,也要启用SELECT中的STR5和STR6
--同时禁用SELECT中的两行CASE WHEN和下两行语句
--------------------------------------------------------
AND (MIC.OBJECTNUMBER=DEF.MENUITEMCLASSOBJNUM OR DEF.MENUITEMCLASSOBJNUM is null)
AND (PRT.OBJECTNUMBER=DEF.PRINTCLASSOBJNUM OR DEF.PRINTCLASSOBJNUM is null)
--此两行需同时启用或禁用,可查询没有选择MI_CLASS或者PRT_CLASS的菜品
--启用此两行时,也要启用SELECT中的两行CASE WHEN语句
--同时禁用SELECT中的STR5和STR6和上两行语句
--------------------------------------------------------
AND (MIC.HIERSTRUCID=HIES.HIERSTRUCID OR MIC.HIERSTRUCID=2) 
--MIC.HIERSTRUCID=HIES.HIERSTRUCID--筛选出MI_CLASS属于餐厅级别的菜单;
--MIC.HIERSTRUCID=2--筛选出MI_CLASS属于酒店层的菜单;
--所以MI_CLASS属于酒店层的菜单会出现两次,通过Group BY合并
--------------------------------------------------------
AND (PRT.HIERSTRUCID=HIES.HIERSTRUCID OR PRT.HIERSTRUCID=2)
--PRT.HIERSTRUCID=HIES.HIERSTRUCID--筛选出PRT_CLASS属于餐厅级别的菜单;
--PRT.HIERSTRUCID=2--筛选出PRT_CLASS属于酒店层的菜单;
--所以PRT_CLASS属于酒店层的菜单会出现两次,通过Group BY合并
--------------------------------------------------------
--修改以下所有的LANGIN=2后,都会选为中文名
--餐厅名
AND STR0.STRINGNUMBERID=HIEU.NAMEID
AND STR0.LANGID=1
--菜单英文名
AND STR1.STRINGNUMBERID=DEF.NAME1ID
AND STR1.LANGID=1
--菜单中文名
AND STR2.STRINGNUMBERID=DEF.NAME1ID
AND STR2.LANGID=2
--MAJOR GROUP
AND STR3.STRINGNUMBERID=MGP.NAMEID
AND STR3.LANGID=1
--FAMILY GROUP
AND STR4.STRINGNUMBERID=FGP.NAMEID
AND STR4.LANGID=1
--MI Class
AND STR5.STRINGNUMBERID=MIC.NAMEID
AND STR5.LANGID=1
--Print Class
AND STR6.STRINGNUMBERID=PRT.NAMEID
AND STR6.LANGID=1
-------------------------------
--Group BY合并所有字段相同的记录
Group By 
RVC.OBJECTNUMBER ,STR0.STRINGTEXT ,MST.ObjectNumber,STR1.STRINGTEXT ,STR2.STRINGTEXT ,PRC.Price ,PRC.PREPCOST ,DEF.MENUITEMCLASSOBJNUM ,DEF.PRINTCLASSOBJNUM ,STR5.STRINGTEXT  ,STR6.STRINGTEXT ,DEF.SLUINDEX ,MGP.OBJECTNUMBER ,STR3.STRINGTEXT ,FGP.OBJECTNUMBER,STR4.STRINGTEXT 
)TB)TB
WHERE RN IN (1))
ORDER BY RVC#,Center,MI#;

启用case when 函数时,查询结果包含没有选择MI_CLASS或PRINT_CLASS的菜品,此类菜品一般没有使用,如图

禁用case when 函数时,查询结果只有同时选择MI_CLASS和PRINT_CLASS的菜品,如图

Mark弊端:

Simphony数据库的菜单记录较少,所以查询的快;若对于百万级的数据库记录用此语句查将很耗时,因为要体现菜品的MI_CLASS和PRT_CLASS的名称,却被酒店层Override要么被餐厅层Override,所以一条记录就会产生上千条上万条记录要通过row_number函数和Group By去过滤只选取一条;但可以通过建立多个临时表查询,然而语句就要写很多!

 

 

转载原创文章请注明,转载自: Klaus Yao » Simphony导出菜单
  1. Dance to the death Cut in love
  2. Annabelle
  3. Dream Of A Dream Epistra
  4. City
  5. Flower Fly 邱有句/李德奎
  6. In Love
  7. 繁华的寂静 文武贝
  8. 克罗地亚第三狂想曲
  9. 克罗地亚第二狂想曲