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;
}
}
}
------解决方案--------------------------------------------------------