您的位置:首页 > 数据库

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 写道
之前做过财政软件,类似的算法很多。

首先定义
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 无法分页,该怎么处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐