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去过滤只选取一条;但可以通过建立多个临时表查询,然而语句就要写很多!