listview+sqlite实现数据展示和保存功能

By admin at 2021-06-27 • 0人收藏 • 1093人看过

GIF.gif

一个简单的listview作为数据展示, sqlite作为数据库的简单示例

很多地方获得的数据需要持久化操作(就是保存到本地), 这里利用sqlite既可以保存数据, 也可以方便的进行数据筛选,如果直接保存为excel, 那么插入和修改就比较麻烦, sqlite库小速度快,又不用安装运行环境, 所以可以作为首选.

import win.ui;
/*DSG{{*/
var winform = win.form(text="工作日志表";right=1197;bottom=604)
winform.add(
button={cls="button";text="插入数据";left=525;top=579;right=640;bottom=599;db=1;dl=1;z=2};
button2={cls="button";text="导出数据到excel文件";left=1035;top=579;right=1197;bottom=599;db=1;dr=1;z=10};
button3={cls="button";text="筛选数据";left=843;top=579;right=934;bottom=599;db=1;dr=1;z=12};
button4={cls="button";text="全部数据";left=939;top=579;right=1030;bottom=599;db=1;dr=1;z=13};
car={cls="edit";text="popdes";left=80;top=579;right=149;bottom=599;align="center";border=1;db=1;dl=1;hidesel=1;z=3};
checkbox={cls="checkbox";left=497;top=580;right=521;bottom=599;db=1;dl=1;z=9};
datetimepick={cls="datetimepick";left=739;top=579;right=839;bottom=599;db=1;dr=1;edge=1;z=11};
edit2={cls="edit";text="操作人:";left=3;top=579;right=81;bottom=599;align="center";border=1;db=1;disabled=1;dl=1;hidesel=1;z=4};
edit4={cls="edit";text="机台号:";left=155;top=579;right=233;bottom=599;align="center";border=1;db=1;disabled=1;dl=1;hidesel=1;z=6};
edit6={cls="edit";text="芯片编号:";left=312;top=579;right=390;bottom=599;align="center";border=1;db=1;disabled=1;dl=1;hidesel=1;z=8};
jth={cls="edit";text="JT001";left=232;top=579;right=305;bottom=599;align="center";border=1;db=1;dl=1;hidesel=1;z=5};
listview={cls="listview";left=0;top=0;right=1198;bottom=573;asel=false;db=1;dl=1;dr=1;dt=1;fullRow=1;gridLines=1;msel=false;vscroll=1;z=1};
xpbh={cls="edit";text="PIC001";left=389;top=579;right=497;bottom=599;align="center";border=1;db=1;dl=1;hidesel=1;z=7}
)
/*}}*/

//设置每列的表格 名称和宽度
winform.listview.insertColumn("序号",50) 
winform.listview.insertColumn("芯片种类",100) 
winform.listview.insertColumn("芯片编号",100) 
winform.listview.insertColumn("机台号",100) 
winform.listview.insertColumn("操作人",100) 
winform.listview.insertColumn("第一通道",100)
winform.listview.insertColumn("第二通道",100)  
winform.listview.insertColumn("最后通道",100) 
winform.listview.insertColumn("操作时间",100)  

import win.ui.tooltip; 
var tooltipCtrl = win.ui.tooltip( winform );//在窗口上创建tooltip控件 
tooltipCtrl.addTool(winform.checkbox,"勾选启用自增功能!" )
tooltipCtrl.addTool(winform.xpbh,"勾选启用自增功能!" )

import sqlite
var conn = sqlite("/customData.db")//打开数据库连接

//如果没有则创建一个数据表
if( not conn.existsTable("工作日志表") ) {  
    conn.exec( "CREATE TABLE 工作日志表( 芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间);" );
} 

var 只加载当天数据 = function(){
    winform.listview.clear();
    var dateStart= tostring(time.now(),"%Y-%m-%d","chs");
    var dateEnd= tostring(time.now().addday(1),"%Y-%m-%d","chs");
	//加载当天的数据
	for rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间 in conn.each("SELECT rowid,* FROM [工作日志表] where 操作时间 Between '"++dateStart++"' and '"++dateEnd++"'") {
		winform.listview.addItem({rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间});
	}
	//滚动条运动到最后一条数据位置
	winform.listview.ensureVisible(winform.listview.count)	
}

var 读取全部数据 = function(){
    winform.listview.clear();
	//读取数据库中的已有数据
	for rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间 in conn.each("SELECT rowid,* FROM [工作日志表]") {
		winform.listview.addItem({rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间});
	}
	//滚动条运动到最后一条数据位置
	winform.listview.ensureVisible(winform.listview.count)	
}

读取全部数据();
//只加载当天数据();//只显示当天数据,可避免数据多的时候卡顿

//使最后一列自适应宽度
winform.listview.adjust = function(cx,cy){
    winform.listview.fillParent(winform.listview.columnCount);
}

//预设插入数据指令
var cmd = conn.prepare("INSERT INTO [工作日志表] VALUES ( @芯片种类,@芯片编号,@机台号,@操作人,@第一通道,@第二通道,@最后通道,@操作时间 );")
var 插入数据 = function(d1,d2,d3,d4,d5,d6,d7,d8){
	//插入测试数据, 模拟随机数据
	cmd.step(
    	芯片种类 = d1;
    	芯片编号 = d2;
    	机台号 = d3;
    	操作人 = d4;
    	第一通道 = d5;
    	第二通道 = d6;
    	最后通道 = d7;
    	操作时间 = d8;
	);
	for rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间 in conn.each("SELECT rowid,* FROM [工作日志表]",{rowid = conn.lastInsertRowid();}) {
		winform.listview.addItem({rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间});
	}
	winform.listview.ensureVisible(winform.listview.count) 
}


winform.button.oncommand = function(id,event){
	//插入测试数据, 模拟随机数据
	插入数据(
		"1x8",
		winform.xpbh.text,
		winform.jth.text,
		winform.car.text,
		string.format("%.02f", -9.58+math.round(math.random(),2)),
		string.format("%.02f", -9.83+math.round(math.random(),2)),
		string.format("%.02f", -9.77+math.round(math.random(),2)),
		time.now()
	)
	//是否要自动更新芯片编号
	if(winform.checkbox.checked){
		try{
			var ret = string.match(winform.xpbh.text,"\d+$");
			var cNum = string.format("%0"++#ret++"s", (tonumber(ret))+1);
        	winform.xpbh.text = string.replace(winform.xpbh.text,"\d+$",cNum );	
		}
		catch(e){
			winform.msgboxErr("编号框里填入的值,结尾不是数字,不能开启自增模式!")
			winform.checkbox.checked = false;
		}
	}
}

winform.datetimepick.setFormat("yyyy'-'MM'-'dd");
winform.button3.oncommand = function(id,event){
    //获取筛选日期
	var datestart = winform.datetimepick.text;
	//从筛选日期+1天
	var dateend = tostring(winform.datetimepick.time.addday(1),"%Y-%m-%d","chs");
	//清空表格
	winform.listview.clear();
	//加载筛选日期当天的数据
	for rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间 in conn.each("SELECT rowid,* FROM [工作日志表] where 操作时间 Between '"++datestart++"' and '"++dateend++"'") {
		winform.listview.addItem({rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间});
	}
	winform.listview.ensureVisible(winform.listview.count)
}

winform.button4.oncommand = function(id,event){
	读取全部数据();
}

//导出数据到excel
import string.database;
var strDb = string.database(",");
var 实时保存数据 = function(path){
	strDb.save(path,winform.listview.items);
}

import fsys.dlg;
winform.button2.oncommand = function(id,event){
    var path = fsys.dlg.save("EXCEL文件|*.csv","数据另存为...","/data",,,(tostring(time.now(),"%Y年%m月%d日","chs"))++".csv");
	if(path){
		实时保存数据(path);
	}
}

winform.show();
win.loopMessage();
return winform;


3 个回复 | 最后更新于 2021-07-01
2021-06-27   #1

之前推荐的easyui,本来也想做成这样的界面.但是实在没前后端经验,交互部分卡了很久..

2021-06-27   #2

回复#1 @周山下樵夫 :

webui一般都有个类似设置setData(json)的函数, 我觉得应该可以自定义一个交互函数,函数功能就是读取数据库返回json, js里调用这个函数

2021-07-08   #3

增加主键设定, 加上插入或者更新判断 , 增加记录数量功能

主键设定, 再创建create的时候, 增加以下关键词, 这样这个列里就不能有重复的数值, 有的话就更新而不是新增, 因为增不进去.

芯片编号 PRIMARY KEY
import win.ui;
/*DSG{{*/
var winform = win.form(text="工作日志表";right=1197;bottom=604)
winform.add(
button={cls="button";text="插入数据";left=525;top=579;right=640;bottom=599;db=1;dl=1;z=2};
button2={cls="button";text="导出数据到excel文件";left=1035;top=579;right=1197;bottom=599;db=1;dr=1;z=10};
button3={cls="button";text="筛选数据";left=843;top=579;right=934;bottom=599;db=1;dr=1;z=12};
button4={cls="button";text="全部数据";left=939;top=579;right=1030;bottom=599;db=1;dr=1;z=13};
car={cls="edit";text="popdes";left=80;top=579;right=149;bottom=599;align="center";border=1;db=1;dl=1;hidesel=1;z=3};
checkbox={cls="checkbox";left=497;top=580;right=521;bottom=599;db=1;dl=1;z=9};
count={cls="edit";text="0";left=661;top=579;right=718;bottom=599;align="center";border=1;db=1;dl=1;hidesel=1;z=14};
datetimepick={cls="datetimepick";left=739;top=579;right=839;bottom=599;db=1;dr=1;edge=1;z=11};
edit2={cls="edit";text="操作人:";left=3;top=579;right=81;bottom=599;align="center";border=1;db=1;disabled=1;dl=1;hidesel=1;z=4};
edit4={cls="edit";text="机台号:";left=155;top=579;right=233;bottom=599;align="center";border=1;db=1;disabled=1;dl=1;hidesel=1;z=6};
edit6={cls="edit";text="芯片编号:";left=312;top=579;right=390;bottom=599;align="center";border=1;db=1;disabled=1;dl=1;hidesel=1;z=8};
jth={cls="edit";text="JT001";left=232;top=579;right=305;bottom=599;align="center";border=1;db=1;dl=1;hidesel=1;z=5};
listview={cls="listview";left=0;top=0;right=1198;bottom=573;asel=false;db=1;dl=1;dr=1;dt=1;fullRow=1;gridLines=1;msel=false;vscroll=1;z=1};
xpbh={cls="edit";text="PIC001";left=389;top=579;right=497;bottom=599;align="center";border=1;db=1;dl=1;hidesel=1;z=7}
)
/*}}*/

import console
 console.open()
//设置每列的表格 名称和宽度
winform.listview.insertColumn("序号",50) 
winform.listview.insertColumn("芯片种类",100) 
winform.listview.insertColumn("芯片编号",100) 
winform.listview.insertColumn("机台号",100) 
winform.listview.insertColumn("操作人",100) 
winform.listview.insertColumn("第一通道",100)
winform.listview.insertColumn("第二通道",100)  
winform.listview.insertColumn("最后通道",100) 
winform.listview.insertColumn("操作时间",100)  
 
import win.ui.tooltip; 
var tooltipCtrl = win.ui.tooltip( winform );//在窗口上创建tooltip控件 
tooltipCtrl.addTool(winform.checkbox,"勾选启用自增功能!" )
tooltipCtrl.addTool(winform.xpbh,"勾选启用自增功能!" )
 
import sqlite
var conn = sqlite("/customData.db")//打开数据库连接
 
//如果没有则创建一个数据表
if( not conn.existsTable("工作日志表") ) {  
    conn.exec( "CREATE TABLE 工作日志表( 芯片种类,芯片编号 PRIMARY KEY,机台号,操作人,第一通道,第二通道,最后通道,操作时间);" );
} 
 
var 只加载当天数据 = function(){
    winform.listview.clear();
    var dateStart= tostring(time.now(),"%Y-%m-%d","chs");
    var dateEnd= tostring(time.now().addday(1),"%Y-%m-%d","chs");
    //加载当天的数据
    var index = 0;
    for rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间 in conn.each("SELECT rowid,* FROM [工作日志表] where 操作时间 Between '"++dateStart++"' and '"++dateEnd++"'") {
        winform.listview.addItem({rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间});
    	index++;
    }
    //滚动条运动到最后一条数据位置
    winform.listview.ensureVisible(winform.listview.count) ;
    winform.count.text = index;
    //return index; 
}
 
var 读取全部数据 = function(){
    winform.listview.clear();
    //读取数据库中的已有数据
    var index = 0;
    for rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间 in conn.each("SELECT rowid,* FROM [工作日志表]") {
        winform.listview.addItem({rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间});
    	index++;
    }
    //滚动条运动到最后一条数据位置
    winform.listview.ensureVisible(winform.listview.count)
    winform.count.text = index;
}
 
读取全部数据();
//只加载当天数据();//只显示当天数据,可避免数据多的时候卡顿
 
//使最后一列自适应宽度
winform.listview.adjust = function(cx,cy){
    winform.listview.fillParent(winform.listview.columnCount);
}
 
//预设插入数据指令
var cmd = conn.prepare("INSERT INTO [工作日志表] VALUES ( @芯片种类,@芯片编号,@机台号,@操作人,@第一通道,@第二通道,@最后通道,@操作时间 );")
var 插入数据 = function(d1,d2,d3,d4,d5,d6,d7,d8){
    var result = conn.stepQuery("SELECT count(rowid) FROM [工作日志表]"
		,{ 芯片编号 = d2} //可选使用表对象指定where条件参数
	) 
	console.dump(result["count(rowid)"])
	if(result["count(rowid)"]!=0){
		console.log("UPDATE",result["count(rowid)"])
		conn.exec("UPDATE [工作日志表] SET 第一通道=@第一通道,第二通道=@第二通道,最后通道=@最后通道,操作时间=@操作时间 WHERE 芯片编号 = @old芯片编号;",{
			第一通道 = d5;
			第二通道 = d6;
			最后通道 = d7;
			操作时间 = d8;
			old芯片编号 = d2;
		} );
	}else {
		//插入测试数据, 模拟随机数据
    	var ret = cmd.step(
        	芯片种类 = d1;
        	芯片编号 = d2;
        	机台号 = d3;
        	操作人 = d4;
        	第一通道 = d5;
        	第二通道 = d6;
        	最后通道 = d7;
        	操作时间 = d8;
    	);
	}

	只加载当天数据();
}
 
 
winform.button.oncommand = function(id,event){
    //插入测试数据, 模拟随机数据
    插入数据(
        "1x8",
        winform.xpbh.text,
        winform.jth.text,
        winform.car.text,
        string.format("%.02f", -9.58+math.round(math.random(),2)),
        string.format("%.02f", -9.83+math.round(math.random(),2)),
        string.format("%.02f", -9.77+math.round(math.random(),2)),
        time.now()
    )
    //是否要自动更新芯片编号
    if(winform.checkbox.checked){
        try{
            var ret = string.match(winform.xpbh.text,"\d+$");
            var cNum = string.format("%0"++#ret++"s", (tonumber(ret))+1);
            winform.xpbh.text = string.replace(winform.xpbh.text,"\d+$",cNum );  
        }
        catch(e){
            winform.msgboxErr("编号框里填入的值,结尾不是数字,不能开启自增模式!")
            winform.checkbox.checked = false;
        }
    }
}
 
winform.datetimepick.setFormat("yyyy'-'MM'-'dd");
winform.button3.oncommand = function(id,event){
    //获取筛选日期
    var datestart = winform.datetimepick.text;
    //从筛选日期+1天
    var dateend = tostring(winform.datetimepick.time.addday(1),"%Y-%m-%d","chs");
    //清空表格
    winform.listview.clear();
    //加载筛选日期当天的数据
    var index = 0;
    for rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间 in conn.each("SELECT rowid,* FROM [工作日志表] where 操作时间 Between '"++datestart++"' and '"++dateend++"'") {
        winform.listview.addItem({rowid,芯片种类,芯片编号,机台号,操作人,第一通道,第二通道,最后通道,操作时间});
    	index++;
    }
    winform.listview.ensureVisible(winform.listview.count)
    winform.count.text = index;
}
 
winform.button4.oncommand = function(id,event){
    读取全部数据();
}
 
//导出数据到excel
import string.database;
var strDb = string.database(",");
var 实时保存数据 = function(path){
    strDb.save(path,winform.listview.items);
}
 
import fsys.dlg;
winform.button2.oncommand = function(id,event){
    var path = fsys.dlg.save("EXCEL文件|*.csv","数据另存为...","/data",,,(tostring(time.now(),"%Y年%m月%d日","chs"))++".csv");
    if(path){
        实时保存数据(path);
    }
}
 
winform.show();
win.loopMessage();
return winform;

image.png

登录后方可回帖

登 录
信息栏
公 告:

专注分享

谢绝纯提问

谢谢合作!
本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...