实际工作中我们经常遇到需要将文件夹中的数据表定期的循环加载到模型中,可以在代码中进行设置。这里借鉴了一些学习资料,如有发现哪里有误,请帮忙指正,谢谢。
# 首先在数据加载编辑器中,创建好新连接-本地工作目录文件夹,命名好文件夹
# 文件夹中存放有多份文件,一般是按月/日/周更新的数据,数据的字段名称、字段数量、字段顺序都是保持一致的
# 假设文件夹datafiles 中的文件的格式都是csv
table:
Load
"Employee Name",
"Job Title",
"Base Pay",
"Overtime Pay",
"Other pay",
"Benefits",
"Total Pay",
"Total Pay & Benefits",
"Year",
"Notes",
"Agency"
FROM (lib://datafiles/经营月报-*.csv)
(txt,codepage is 28591,embedded labels,delimiter is ',',msq);
# 对于以上的加载。可以用循环来直接对文件进行加载
for each a in '经营月报-2015','经营月报-2016','经营月报-2017'
load *
from [lib://datafiles/$(a).csv];
next;
# 如果现在文件中的文件有很多份,不可能一一将文件名字列出,且文件格式不同
# 分成两步,第一步,先将文件夹路径和文件名字提取出来
sub DoDir(Root)
for each ext in 'csv','xls','xlsx'
for each file in filelist(Root&'\*.'&ext) #组成文件的完整路径
temp:
load
'$(file)' as name,
filesize('$(file)') as size,
filetime('$(file)') as filetime
autogenerate 1; #自动生成1
next file
next ext
for each Dir in dirlist(Root&'\*')
call DoDir(Dir)
next Dir
end sub
call DoDir ('lib://datafiles') # 传入当前工作路径
# 提取文件生成表
LET vcount = fieldvaluecount('name')
fro i = 1 to $(vcount)
LET vfile = FieldValue('name',$(i)) //从name 列逐行读取
table:
load
"Employee Name",
"Job Title",
"Base Pay",
"Overtime Pay",
"Other pay",
"Benefits",
"Total Pay",
"Total Pay & Benefits",
"Year",
subfield(subfield('$(vfile)','-',-1),'.',1) as YYY
subfield(subfield('$(vFile)', '-', 1)&'-'&subfield('$(vFile)', '-', 2),'/',-1) as city
from ['$(vFile)'];
next;
drop table temp;
//store table2 into [lib://fornext/table together3.qvd]; //是否要将表table2存入文件tbale together3
实现的逻辑,将历史的数据存放在一张表,这张表不做更新,增量的表每天(周期)更新,存放为另一张表,这张表每天更新
his_data:
load
订单号,
订单日期,
顾客ID
from [lib://在线销售/订单表]
(biff, embedded labels, table is 订单表$)
where 订单日期<='2018/12/31'
//store his_data into [lib://在线销售/hisdata.qvd]; //是否将其存为qvd文件
drop table his_data;
inc_data:
load
订单号,
订单日期,
顾客ID
from [lib://在线销售/订单表]
(biff, embedded labels, table is 订单表$)
where 订单日期>'2018/12/31'
//store his_data into [lib://在线销售/incdata.qvd]; //是否将其存为qvd文件
drop table inc_data;
注意:在sense企业版中,增量刷新可能经常会用到,对于需要实时展示的大量数据,需要将历史不动的数据先存为历史数据文档,将增量的数据存为另一份文件(设定定时刷新的时间,可以是一天等),然后再合并两份文件为总量的数据,合并后的文件的刷新时间设置为增量刷新任务成功时,需要在后台设置刷新时间,刷新的任务在服务器后台qmc的task设置,可在离线的帮助文档中搜qvd
在工作区新建好app,创建好数据连接,并做好前端界面
点击系统后台的apps,点击做好的apps,点击pubish ,选择发布到哪个pubish
点击系统后台的task,create new ,设置好名字,选择app,选择刷新动作类型,对于历史数据,一般仅需要刷新一次,就选择once,增量数据就具体看周期,比如小时,月、日等;而对于全量数据的刷新,一般等增量数据的刷新完成后再刷新,这时就可以选择create new task event trigger,这是一般在订单出选择增量刷新
使用Direct Discovery有很多的限制,阉割了sense的许多功能,在官方帮助文档中有记载,且这种方式十分耗内存
SET DirectDateFormat = 'YYYY-MM-DD';
SET DirectMonthNames = '1;2;3;4;5;6;7;8;9;10;11;12';
DIRECT QUERY DIMENSION
"用户ID",
"咖啡种类",
"杯型",
.......
MESRURE
"数量"
DETAIL
# 此时加载后的两张表的数据字段,前缀分别为table1.和table2.
qulify * ;
table1:
load
用户ID,
产品名称,
数量
from [lib://datafile/sales];
table2:
load
用户ID,
产品名称,
价格
from [lib://datafile/product]
# 但是如果某个字段,想重命名,或者不加前缀,就可以加上unqulify
qulify * ;
unqulify 用户ID;
table1:
load
用户ID,
产品名称,
数量
from [lib://datafile/sales];
table2:
load
用户ID,
产品名称,
价格
from [lib://datafile/product]
# 现在想要实现创建了两张表,分别存放所有的维度和所有的度量,此时想要在前端界面,通过选择这两张表的维度和度量,相应的其他表格显示内容
dimension:
load * inline[
dim
产品类别
产品子类
产品名
地区
供应商
];
mea:
load * inline[
measure
销售额
利润
利润率
]
# 创建好了以上两个表格,在前端界面,维度和度量分别作为一个筛选器
# 新建一个表格,拖原始事实表的字段在里面
# 在每个字段的列条件上新增以下语句:
=substringcount(concat(dim,'|'),'产品类别')
#如果是度量,则为:=substringcount(concat(mea,'|'),'销售额')
# 此时如果筛选器中选择产品类别,则在表格中产品类别出现,如果没选择产品类别,则这字段不展示