listview+sqlite实现数据展示和保存功能
By
admin
at 2021-06-27 • 1人收藏 • 2729人看过

一个简单的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,本来也想做成这样的界面.但是实在没前后端经验,交互部分卡了很久..
增加主键设定, 加上插入或者更新判断 , 增加记录数量功能
主键设定, 再创建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;
登录后方可回帖

