资料取样组态可绑定日期,只显示某一日的数据,如要显示指定日期范围的数据,参照以下步骤
1.建立资料取样
在工程设置中,建立资料取样并设置,要保存在同一数据文件中,可跨日查询
2.界面设计
在页面中放置【资料取样】控件,2个【变量消息】控件,2个【文本框】控件
3.属性设置
【资料取样】控件依次设置属性:资料取样编号(注意对应的是采样编号,不是名称)、显示类型为历史数据、表格设计
4.绑定变量
【变量消息】【文本框】控件分别绑定变量【起始时间】和【截止时间】,此处用字符串型变量
5. 编写代码
1)重新绑定方法
void refineSample(STTTable* widget, string sid, string str1, string str2) {
string tbl = StringUtil::snprintf("(SELECT * FROM SAMPLE_%s_V WHERE STIME>='%s' AND STIME<'%s') TT"
, sid.c_str()
, str1.c_str()
, str2.c_str());
TTableView* tv = (TTableView*)widget->getData();
tv->refine(tbl, "");
tv->drawData(true);
}
2)两个变量消息的代码
void Frm23::onwMVar1Changed(SttObject *org, IVariable *data) {/*变量消息*/STTTable* widget = wMTable1;string sid = "2";string str1,str2;vm->getChar("起始时间", str1);vm->getChar("截止时间", str2);refineSample(widget,sid,str1,str2);}void Frm23::onwMVar2Changed(SttObject *org, IVariable *data) {/*变量消息*/STTTable* widget = wMTable1;string sid = "2";string str1,str2;vm->getChar("起始时间", str1);vm->getChar("截止时间", str2);refineSample(widget,sid,str1,str2);}
void Frm23::onLoad() {
vm->setChar("起始时间", "2025-03-25 15:28:30");
vm->setChar("截止时间", "2025-03-25 15:28:32");
}
#include "Frm23.h"#include "util/StringUtil.h"Frm23::Frm23(HmiApp* app, STTWidget *par, const string& id, const string& desc) : STTPage(app->getRuntime(), par, id, desc) {hmiApp = app;}Frm23::~Frm23() {}void Frm23::onInit() {}void Frm23::createParts() {setMainArg(0, 0, 1024, 600);setMainStyle(0, 0xffffff, 0xffffff, 0, 255, 0, 0xc0c0c0);/*----------------------------- Table : wMTable1 -----------------------------*/wMTable1 = new STTTable(p_rt, this, "wMTable1");wMTable1->setMainArg(41, 30, 932, 312, "SID,序号,80;STIME,时间,222;TVAR,触发变量,80;TVAL,触发值,80;D1,$second,80;D2,$minute,80;D3,$time,80;D4,$hour,80;D5,$hour12,80;D6,$logintime,80;D7,$worktime,80;D8,记录数2,79", 30, false, 1);wMTable1->setHeadCellStyle(0xf0f0f0, 0xffffff, 0, 1, 0xd0d0d0, 5, 5, 0, 0, 0x0, 16, "文泉驿微米黑", 0);wMTable1->setSelCellStyle(0x1a2b3, 0xffffff, 0, 1, 0xd0d0d0, 5, 5, 0, 0, 0x0, 16, "文泉驿微米黑", 0);wMTable1->setDataCellStyle(0xffffff, 0xffffff, 0, 1, 0xd0d0d0, 5, 5, 0, 0, 0x0, 16, "文泉驿微米黑", 0);wMTable1->setDataSource("2", "", false);/*----------------------------- Text : wMText1 -----------------------------*/wMText1 = new STTTextArea(p_rt, this, "wMText1");wMText1->setMainArg(91, 385, 417, 32, false, true, TextAlign::CENTER, -1, -1, -99999999, 99999999, false);wMText1->setMainStyle(7, 0xffffff, 0xffffff, 0, 2, 0xc0c0c0, 4, 5, 4, 4, 255);wMText1->setPlaceholderText("")->setMaxLength(0)->setAcceptedChars("")->setImeMode(IME::UC);wMText1->setFont(0x0, 16, "文泉驿微米黑", 0);wMText1->bindData(_V("起始时间"));/*----------------------------- Text : wMText2 -----------------------------*/wMText2 = new STTTextArea(p_rt, this, "wMText2");wMText2->setMainArg(91, 431, 417, 32, false, true, TextAlign::CENTER, -1, -1, -99999999, 99999999, false);wMText2->setMainStyle(7, 0xffffff, 0xffffff, 0, 2, 0xc0c0c0, 4, 5, 4, 4, 255);wMText2->setPlaceholderText("")->setMaxLength(0)->setAcceptedChars("")->setImeMode(IME::UC);wMText2->setFont(0x0, 16, "文泉驿微米黑", 0);wMText2->bindData(_V("截止时间"));/*called after widget created.*//*----------------------------- 变量消息 : wMVar1 -----------------------------*/_V("起始时间")->valueChanged.connect(this, &Frm23::onwMVar1Changed);std::function<void()> diswMVar1 = [this]() {_V("起始时间")->valueChanged.disconnect(this, &Frm23::onwMVar1Changed);};addVarMsg(diswMVar1);/*----------------------------- 变量消息 : wMVar2 -----------------------------*/_V("截止时间")->valueChanged.connect(this, &Frm23::onwMVar2Changed);std::function<void()> diswMVar2 = [this]() {_V("截止时间")->valueChanged.disconnect(this, &Frm23::onwMVar2Changed);};addVarMsg(diswMVar2);return; //createParts END}void Frm23::onLoad() {vm->setChar("起始时间", "2025-03-25 15:28:30");vm->setChar("截止时间", "2025-03-25 15:28:32");}void refineSample(STTTable* widget, string sid, string str1, string str2) {string tbl = StringUtil::snprintf("(SELECT * FROM SAMPLE_%s_V WHERE STIME>='%s' AND STIME<'%s') TT", sid.c_str(), str1.c_str(), str2.c_str());TTableView* tv = (TTableView*)widget->getData();tv->refine(tbl, "");tv->drawData(true);}bool Frm23::onClosing() {return true;}void Frm23::onDispose() {}void Frm23::onwMVar1Changed(SttObject *org, IVariable *data) {/*变量消息*/STTTable* widget = wMTable1;string sid = "2";string str1,str2;vm->getChar("起始时间", str1);vm->getChar("截止时间", str2);refineSample(widget,sid,str1,str2);}void Frm23::onwMVar2Changed(SttObject *org, IVariable *data) {/*变量消息*/STTTable* widget = wMTable1;string sid = "2";string str1,str2;vm->getChar("起始时间", str1);vm->getChar("截止时间", str2);refineSample(widget,sid,str1,str2);}
4.运行
修改输入框内容,注意输入法的冒号在大写ABC里
5.导出(仅导出显示的内容)
由于使用了非标准组态的数据源,不能使用STTTable::exportCSV2UDisk导出,需重写导出方法
1)放置【功能键】,修改标题,设置点击事件为执行函数
2)在执行函数中,写入代码
void Frm23::wMButton1_clk_cb(uint16_t code, LvEvent e) {
/*wMButton1(导出)的点击事件*/
TTable* ptmp = wMTable1->getData();//当前显示的数据
string dir = FileUtil::getExportDir("sample");//导出到U盘根目录的sample目录下(如sample目录不存在,会自动创建。但不能创建多层子目录)
if(dir!="") {
string path = dir + "export.csv";//导出文件路径 = 目录+文件名
bool ret =(0==FileUtil::exportTableToFile(*ptmp, path, true));//导出
string tip = ret?"_L(\"导出成功\")":"_L(\"导出失败\")";
getRuntime()->getIPageMgr()->getMessageBox(tip, MSGBOX_TYPE::TIP)->show();//提示
} else {
getRuntime()->getIPageMgr()->getMessageBox("_L(\"未发现U盘\")", MSGBOX_TYPE::TIP)->show();
}
}
6.导出指定时间范围的数据
6.1另写一个导出方法
void exportSample(string sid, string str1, string str2) {
string basename = "SAMPLE_"+sid;
//注意模拟器与屏的路径不一样
#if __arm__
//参数1:数据库路径
string pathdb = "/customer/prm/data/" + basename + ".db";
//参数4:导出目标文件
string pathcsv = "/vendor/udisk_sda1/export.csv";//U盘下的export.csv
#else
//参数1:数据库路径
string pathdb = "./data/"+ basename + ".db";
//参数4:导出目标文件
string pathcsv = "./data/export.csv";
#endif
//参数2:数据库表名
string tbname = basename + "_V";//这是采样表视图名
//参数3: 要导出的内容,用sql语句
string sql = StringUtil::snprintf("SELECT * FROM SAMPLE_%s_V WHERE STIME>='%s' AND STIME<'%s'"
, sid.c_str()
, str1.c_str()
, str2.c_str());
//参数5:返回错误值
string err;
//调用导出
if(FileUtil::exportDB2CSV(pathdb, tbname, sql, pathcsv, err)) {
cout<<"导出成功"<<endl;
} else {
cout<<"导出失败,是文件被占用了吗?"<<endl;
}
}
6.2在按钮中调用导出方法
void Frm23::wMButton2_clk_cb(uint16_t code, LvEvent e) {
/*wMButton2(导出2)的点击事件*/
string sid = "2";
string str1,str2;
vm->getChar("起始时间", str1);
vm->getChar("截止时间", str2);
exportSample(sid, str1,str2);
}