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

By admin at 2021-06-27 • 1人收藏 • 2478人看过

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;


6 个回复 | 最后更新于 2023-06-25
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

虽然我看不懂,但我大受震撼

2023-06-24   #5

再加个分页就完美了,抄代码

2023-06-25   #6

谢谢分享,再加个分页就完美了。

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...