菜单

资料取样示例1:显示指定日期范围的数据及导出

下载

资料取样组态可绑定日期,只显示某一日的数据,如要显示指定日期范围的数据,参照以下步骤

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);
}
3)onLoad中初始化一下时间
void Frm23::onLoad() {
    vm->setChar("起始时间", "2025-03-25 15:28:30");
    vm->setChar("截止时间", "2025-03-25 15:28:32");
}
4)整体代码如下
#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);
}

7.运行

上一个
表格控件使用
下一个
采样值的线性变换及控制小数位数
最近修改: 2025-05-06Powered by