j2ee实现循环更新表功能,该如何解决
2012-02-14 21:17
393 查看
j2ee实现循环更新表功能
info表数据表信息:
id 姓名 价格
1 张三 12
2 李四 5
3 张三 11
4 张三 78
5 王五 122
6 李四 12
7 张三 1
需求:
用户张三,使用在一次购物中使用了金额:20元
那么,在程序中要把用户张三所在的info表中扣除20元,javax.net.ssl.SSLHandshakeException。
即:从第一条开始扣,第一条不足就扣第2条,依次类推一直到扣完这20元。
(如果如果当前记录扣光了价格,java.lang.ClassNotFoundException,设置为0,然后继续往下操作,直到扣到20元为止)
更新表后信息如下 :
id 姓名 价格
1 张三 0
2 李四 5
3 张三 8
4 张三 78
5 王五 122
6 李四 12
7 张三 1
请教上面功能的实现方法,谢谢
------------------------------------------------------------------------------------------------------------------
问题补充:
ily 写道
之前做过财政软件,类似的算法很多。
首先定义
希望能帮得上你。
谢谢,这样好像不能更新数据库里面的数据吧????
------解决方案--------------------------------------------------------
先查出张三所有的info信息存在list中
double bill = 20;
for(int i = 0; i < list.size(); i ++) {
Info info = list.get(i);
if (info的价格 > bill) {
更改info的价格为 原价格-20;
break; // 跳出循环
} else {
bill = bill - info的价格;
更改info的价格为0
}
}
------解决方案--------------------------------------------------------
之前做过财政软件,类似的算法很多。
首先定义
希望能帮得上你。
------解决方案--------------------------------------------------------
有个地方漏掉了:
if(amt >= pay){
//修改本条金额信息amt-pay
person.setAmt(amt-pay);
logger.info("可以支付");
break;//跳出循环
}
------解决方案--------------------------------------------------------
嗯 不光要setAmt还需要update(person)
------解决方案--------------------------------------------------------
思路:先把张三的信息都从数据库中查询出来,放在List中,然后去循环减除,每减一次就更新一次,知道减完。
------解决方案--------------------------------------------------------
不知道你用什么数据库,如果数据库压力下的话,最好用触发器。在更新触发,把把剪掉的操作放在数据库上。
------解决方案--------------------------------------------------------
应该先查处该表包含张三的记录,然后进行循环判断价格是否小于20,如果小于20继续循环,直到价格大于或等于20停止循环,同时进行更新数据库操作。。。
------解决方案--------------------------------------------------------
个人觉得直接在数据库中加一条-20的记录会好些,条条明细都清楚,最好不要懂原始数据。只是从设计,业务的角度出发考虑问题。
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
因为无法修改。。。所以发现自己的一个错误,在最后else那里做完跟新的statement之后直接break就可以了
------解决方案--------------------------------------------------------
引用
更新表后信息如下 :
id 姓名 价格
1 张三 0
2 李四 5
3 张三 8
话说LZ张三扣完20怎么第三条记录价格还剩8呢。。。
------解决方案--------------------------------------------------------
思路有问题
不修改记录;插入负数据;
然后月底或什么时候扎帐
------解决方案--------------------------------------------------------
简单的写一下我的思路
List<Person> list = PersonDao.queryByName(String name);
double expenditure = 20.0;//张三的消费金额
for(Person person:list)
{
if(person.getBalance()>=expenditure)//这条记录所拥有的金额
{
person.getBalance() -=expenditure;
PersonDao.updatePerson(person);
break;
}
else
{
expenditrue -= person.getBalance();
person.setBalance(0);
PersonDao.updatePerson(person);
}
}
------解决方案--------------------------------------------------------
我也觉得这样的思路不好...
我觉得每次-20的时候插入多一条数据...
因为个person有个identity, 然后每次消费的时候, sum了那个person的"价格"(column命). 消费值大于sum值就不能进行支付操作
------解决方案--------------------------------------------------------
思路:
取第一条张三价格 12 - 20 = -8 < 0
//如果小于0,把这个-8的绝对值存到一个变量中,同时更新这条张三的价格为0
取第二条张三价格 5 - 8 = -3 < 0
//如果还小于0,继续把这个绝对值存到变量中,同时更新这条张三的价格为0
.
.
.
第n条张三价格 n - m = k > 0
//k>0 循环结束,同时更新这条张三的价格为k。
如果k>0就不要去数据库中再去取了,这样就不用一次性把所有的张三的记录都取出来
如果到把张三的所有记录都循环结束k依然小于0,那么也不用当心,自然结束。
循环的总条件是张三的总记录数 count。
依照这样的思路,编程很简单就能实现了。
------解决方案--------------------------------------------------------
我有种解题思路:将表中所有行取出来,当做一个对象。然后把每行记录的价格取出来,设为a,那么每次用这个a+(-20),如果结果>0,则不需要继续扣下去,如果小于0,说明当前价格不够支付这20元钱。则将当前对象的价格置为0,再将对象放进一个集合中。此时,应记录上一次a+(-20)的值作为还未支付的钱,然后用这个值继续与a相加,直到a+(未支付)的结果为0为止。然后把集合中的对象一个一个取出来,设置到数据库中。我觉得集合最好用键值对的集合,这样应该方便更新数据库。
------解决方案--------------------------------------------------------
简要的思路:
1. 查询含张三的记录,
2. 创建一个待更新的list, 使用batchUpdate,
对要减(更新amt值的info_item),添加到updateList里头,
最后执行一次提交即可。
------解决方案--------------------------------------------------------
select LAST('id') as A, temp-20 as B from info where 20<= (
select sum('价格') from info where '姓名'=XXXXX ADN id<=A
)as temp
然后
update info set id=0 where id<A AND '姓名'=XXXXX, set id=B where id=A;
------解决方案--------------------------------------------------------
1.取出全部张三的记录(按ID顺序)入LIST。
2.从最小ID开始,求价格的和(sum),发现和大于等于20则停止计算(假如停止在第I个)
3.把I之前的价格全部update为0,第I个更新为为sum-20
4.注意更新时要用事务,保证其完整性
------解决方案--------------------------------------------------------
首先不考虑 楼主的这个思路对不对,按照这个要求 我写了下面的代码,功能实现了,思路很简单。按照业务逻辑可以做更多的优化操作。
------解决方案--------------------------------------------------------
可参考:
CEdit在循环中无法更新有关问题 http://www.myexception.cn/vc-mfc/170274.html
相关的主题文章:
POI设置页边距的怪异有关问题,难道是bug
当web工程引用别外一个web工程时,如何发布部署
will_paginate 无法分页,该怎么处理
info表数据表信息:
id 姓名 价格
1 张三 12
2 李四 5
3 张三 11
4 张三 78
5 王五 122
6 李四 12
7 张三 1
需求:
用户张三,使用在一次购物中使用了金额:20元
那么,在程序中要把用户张三所在的info表中扣除20元,javax.net.ssl.SSLHandshakeException。
即:从第一条开始扣,第一条不足就扣第2条,依次类推一直到扣完这20元。
(如果如果当前记录扣光了价格,java.lang.ClassNotFoundException,设置为0,然后继续往下操作,直到扣到20元为止)
更新表后信息如下 :
id 姓名 价格
1 张三 0
2 李四 5
3 张三 8
4 张三 78
5 王五 122
6 李四 12
7 张三 1
请教上面功能的实现方法,谢谢
------------------------------------------------------------------------------------------------------------------
问题补充:
ily 写道
之前做过财政软件,类似的算法很多。
首先定义
Person : 每条数据的对象 amt : Person的可用金额属性(double类型) 存在setXX 和 getXX 的方法 数据访问层省略,朋友自行添加吧。
if(张三.总金额 > 支付金额){ List<Person> persons = 张三金额信息的数组;//order by id //要支付金额 double pay = 20.00; // 循环 一条一条判断 张三单条金额信息是否可以支付 for(Person person : persons){ double amt = ((Person)person.get(i)).getAmt(); if(amt >= pay){ //修改本条金额信息amt-pay person.setAmt(amt-pay); logger.info("可以支付"); } else{ //修改本条金额信息为0.00 person.setAmt(0.00); pay -= amt; } } }
希望能帮得上你。
谢谢,这样好像不能更新数据库里面的数据吧????
------解决方案--------------------------------------------------------
先查出张三所有的info信息存在list中
double bill = 20;
for(int i = 0; i < list.size(); i ++) {
Info info = list.get(i);
if (info的价格 > bill) {
更改info的价格为 原价格-20;
break; // 跳出循环
} else {
bill = bill - info的价格;
更改info的价格为0
}
}
------解决方案--------------------------------------------------------
之前做过财政软件,类似的算法很多。
首先定义
Person : 每条数据的对象 amt : Person的可用金额属性(double类型) 存在setXX 和 getXX 的方法 数据访问层省略,朋友自行添加吧。
if(张三.总金额 > 支付金额){ List<Person> persons = 张三金额信息的数组;//order by id //要支付金额 double pay = 20.00; // 循环 一条一条判断 张三单条金额信息是否可以支付 for(Person person : persons){ double amt = ((Person)person.get(i)).getAmt(); if(amt >= pay){ //修改本条金额信息amt-pay person.setAmt(amt-pay); logger.info("可以支付"); } else{ //修改本条金额信息为0.00 person.setAmt(0.00); pay -= amt; } } }
希望能帮得上你。
------解决方案--------------------------------------------------------
有个地方漏掉了:
if(amt >= pay){
//修改本条金额信息amt-pay
person.setAmt(amt-pay);
logger.info("可以支付");
break;//跳出循环
}
------解决方案--------------------------------------------------------
嗯 不光要setAmt还需要update(person)
------解决方案--------------------------------------------------------
思路:先把张三的信息都从数据库中查询出来,放在List中,然后去循环减除,每减一次就更新一次,知道减完。
------解决方案--------------------------------------------------------
不知道你用什么数据库,如果数据库压力下的话,最好用触发器。在更新触发,把把剪掉的操作放在数据库上。
------解决方案--------------------------------------------------------
应该先查处该表包含张三的记录,然后进行循环判断价格是否小于20,如果小于20继续循环,直到价格大于或等于20停止循环,同时进行更新数据库操作。。。
------解决方案--------------------------------------------------------
个人觉得直接在数据库中加一条-20的记录会好些,条条明细都清楚,最好不要懂原始数据。只是从设计,业务的角度出发考虑问题。
------解决方案--------------------------------------------------------
//首先需要有连接数据库,具体不再阐述 int totalConsumption = 消费值; Connection con = getConnection(); String sql = new String(); sql = "SELECT * FROM TABLE WHERE Table.name=张三"; Statement queryStatement = null; ResultSet rs = null; qureyStatement = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); rs = queryStatement.executeQuery(sql); //这里就已经获得结果集合resultset了 while(rs.next()) { int price = Integer.praseInt(rs.getString("价格")); if(price<totalConsumption) { totalConsumption-=price; //这里再写入一个删除项目的preStatement或者是statement删除该项; } else //当消费额小于条目中的价格时 { //更新的statement,具体参照前面写的查询statement } }
------解决方案--------------------------------------------------------
因为无法修改。。。所以发现自己的一个错误,在最后else那里做完跟新的statement之后直接break就可以了
------解决方案--------------------------------------------------------
引用
更新表后信息如下 :
id 姓名 价格
1 张三 0
2 李四 5
3 张三 8
话说LZ张三扣完20怎么第三条记录价格还剩8呢。。。
------解决方案--------------------------------------------------------
思路有问题
不修改记录;插入负数据;
然后月底或什么时候扎帐
------解决方案--------------------------------------------------------
简单的写一下我的思路
List<Person> list = PersonDao.queryByName(String name);
double expenditure = 20.0;//张三的消费金额
for(Person person:list)
{
if(person.getBalance()>=expenditure)//这条记录所拥有的金额
{
person.getBalance() -=expenditure;
PersonDao.updatePerson(person);
break;
}
else
{
expenditrue -= person.getBalance();
person.setBalance(0);
PersonDao.updatePerson(person);
}
}
------解决方案--------------------------------------------------------
我也觉得这样的思路不好...
我觉得每次-20的时候插入多一条数据...
因为个person有个identity, 然后每次消费的时候, sum了那个person的"价格"(column命). 消费值大于sum值就不能进行支付操作
------解决方案--------------------------------------------------------
思路:
取第一条张三价格 12 - 20 = -8 < 0
//如果小于0,把这个-8的绝对值存到一个变量中,同时更新这条张三的价格为0
取第二条张三价格 5 - 8 = -3 < 0
//如果还小于0,继续把这个绝对值存到变量中,同时更新这条张三的价格为0
.
.
.
第n条张三价格 n - m = k > 0
//k>0 循环结束,同时更新这条张三的价格为k。
如果k>0就不要去数据库中再去取了,这样就不用一次性把所有的张三的记录都取出来
如果到把张三的所有记录都循环结束k依然小于0,那么也不用当心,自然结束。
循环的总条件是张三的总记录数 count。
依照这样的思路,编程很简单就能实现了。
------解决方案--------------------------------------------------------
我有种解题思路:将表中所有行取出来,当做一个对象。然后把每行记录的价格取出来,设为a,那么每次用这个a+(-20),如果结果>0,则不需要继续扣下去,如果小于0,说明当前价格不够支付这20元钱。则将当前对象的价格置为0,再将对象放进一个集合中。此时,应记录上一次a+(-20)的值作为还未支付的钱,然后用这个值继续与a相加,直到a+(未支付)的结果为0为止。然后把集合中的对象一个一个取出来,设置到数据库中。我觉得集合最好用键值对的集合,这样应该方便更新数据库。
------解决方案--------------------------------------------------------
简要的思路:
1. 查询含张三的记录,
2. 创建一个待更新的list, 使用batchUpdate,
对要减(更新amt值的info_item),添加到updateList里头,
最后执行一次提交即可。
------解决方案--------------------------------------------------------
select LAST('id') as A, temp-20 as B from info where 20<= (
select sum('价格') from info where '姓名'=XXXXX ADN id<=A
)as temp
然后
update info set id=0 where id<A AND '姓名'=XXXXX, set id=B where id=A;
------解决方案--------------------------------------------------------
1.取出全部张三的记录(按ID顺序)入LIST。
2.从最小ID开始,求价格的和(sum),发现和大于等于20则停止计算(假如停止在第I个)
3.把I之前的价格全部update为0,第I个更新为为sum-20
4.注意更新时要用事务,保证其完整性
------解决方案--------------------------------------------------------
首先不考虑 楼主的这个思路对不对,按照这个要求 我写了下面的代码,功能实现了,思路很简单。按照业务逻辑可以做更多的优化操作。
float price = 20; String name = "张三"; Connection conn = DBHelp.getConnection();//获得数据库连接 String sql = "update info set price=price-" + price + " where name='" + name + "' and price>" + price; PreparedStatement ps = conn.prepareStatement(sql); int row = ps.executeUpdate(); if (row > 0) { System.out.println("支付成功"); } else { sql = "select sum(price) from info where name='" + name + "' "; ps = conn.prepareStatement(sql); ResultSet pres = ps.executeQuery(); if (pres.next()) { float totalPrice = pres.getFloat(1); if (totalPrice < price) { System.out.println("余额不足,不能完成支付"); return; } } sql = "select * from info where name='" + name + "' "; ps = conn.prepareStatement(sql); ResultSet res = ps.executeQuery(); List<Info> infoList = new ArrayList<Info>(); while (res.next()) { Info info = new Info(); info.setId(res.getInt("id")); info.setName(res.getString("name")); info.setPrice(res.getFloat("price")); infoList.add(info); } boolean over = false; for (Info info : infoList) { if (price >= info.getPrice()) { price = price - info.getPrice(); sql = "update info set price=0 where id=" + info.getId(); } else { sql = "update info set price=price-" + price + " where id=" + info.getId(); over=true; } ps = conn.prepareStatement(sql); ps.executeUpdate(); if (over) { System.out.println("支付成功!"); break; } } }
------解决方案--------------------------------------------------------
可参考:
CEdit在循环中无法更新有关问题 http://www.myexception.cn/vc-mfc/170274.html
相关的主题文章:
POI设置页边距的怪异有关问题,难道是bug
当web工程引用别外一个web工程时,如何发布部署
will_paginate 无法分页,该怎么处理
相关文章推荐
- [教程] 教你如何实现荣耀3C支持OTG功能,解决荣耀3C的唯一缺点
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- 如何实现织梦dedecms表单提交时发送邮箱功能【已解决】
- 关于android程序自动更新功能的实现,如何去除安装提示
- J2EE--如何实现servlet中的发信功能?
- 随机字符串解决大问题之腾讯网如何实现手机扫描二维码登录qq功能的
- Puppet系列之六:如何更加安全高效地实现Puppet的推送更新功能 推荐
- resin2/resin3如何实现“更新class,服务不重启”这样的功能?
- 方法:如何解决用MFC实现的ping功能中把目标主机不可到达的当成ping通的问题
- [置顶] 我们在开发的过程中,难免会有个需求,实现版本更新功能。那我们在版本更新中报解析包错误的问题进行解决
- android中如何实现循环更新UI
- 方法:如何解决用MFC实现的ping功能中把目标主机不可到达的当成ping通的问题
- Android 如何实现 焦点图的 无线循环滑动的状态?
- 如何在asp.net中实现返回上一页的功能
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android应用自动更新功能的实现!!!
- block为什么用copy以及如何解决循环引用
- 自动更新功能简单实现
- dojo:如何用MultiSelect实现类似ListBox风格的FromTo功能
- 如何解决 block 循环引用的问题