j2ee实现循环更新表功能,该如何解决

来源:互联网 发布:java jlabel dialog 编辑:程序博客网 时间:2024/05/31 06:23
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 写道
之前做过财政软件,类似的算法很多。

首先定义
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中,然后去循环减除,每减一次就更新一次,知道减完。[b][/b]
------解决方案--------------------------------------------------------
不知道你用什么数据库,如果数据库压力下的话,最好用触发器。在更新触发,把把剪掉的操作放在数据库上。
------解决方案--------------------------------------------------------
应该先查处该表包含张三的记录,然后进行循环判断价格是否小于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 无法分页,该怎么处理