Witam!
Problem polega na tym, ze stronka JSP przy uzyciu JSTL powinna mi wyswietlic wiersz po wierszu zawartosc listy, a wyswietla tylko ostatni wiersz, ale powtorzony tyle razy ile jest wierszy.
Lista zawiera dane z bazy PostgreSQLowej, ale nie bezposrednio z ResultSeta, lecz przepuszczone przez dodatkowa tablice.
Jako poczatkujacy domyslam sie, ze problem jest w miare banalny.
Zalezy mi na tym, zeby ten kod jak najszybciej zaczal dzialac. Wszelkich wygladzan bede dokonywal pozniej.
Istotne wg mnie fragmenty kodu:
z JSP:
<% String inv_id=request.getParameter("id"); %>
<% AccessDB accessDB=new AccessDB(); %>
<% List prods=accessDB.getProducts(inv_id); %>
<% request.setAttribute("prods", prods); %>
(...)
<c:forEach var="prod" items="${requestScope.prods}" >
<tr>
<td rowspan="2" style="vertical-align:top;"><%= lp %></td><td colspan="5">${prod.prodName}</td>
</tr>
<tr>
<td>${prod.prodPkwiu}</td><td>${prod.prodPrice}</td><td>${prod.prodQuantity} ${prod.prodUnit}</td><td>${prod.prodVat}</td><td>${prod.prodBrutto}</td>
</tr>
<c:set var="sumaBrutto" value="${sumaBrutto + prod.prodBrutto}" />
<c:set var="sumaNetto" value="${sumaNetto + prod.prodNetto}" />
<% lp=lp+1; %>
</c:forEach>
z AccessDB.java:
public List getProducts(String inv_id){
Connection connection=null;
InvoiceShow prod=null;
List list=new ArrayList();
try{
DataSource dataSource=getJdbcConnectionPool2();
connection=dataSource.getConnection();
PreparedStatement stat=null;
stat=connection.prepareStatement(sqlCountPart);
stat.setString(1, inv_id);
ResultSet rs_s=stat.executeQuery();
rs_s.next();
int rs_size = rs_s.getInt(1);
stat=connection.prepareStatement(sqlSalePart);
stat.setString(1, inv_id);
ResultSet rs=stat.executeQuery();
String[][] sumator = new String[rs_size][8];
int count=0;
while(rs.next()){
(...)
stat=connection.prepareStatement(sqlProducts);
stat.setString(1, id_part_v01s);
ResultSet rs2=stat.executeQuery();
rs2.next();
unit=rs2.getString("unit");
dalej podobnie
(...)
if (discount == null){
if (price_spec == null){
price_final = price_base;
} else {
price_final = price_spec;
}
}
/////sumowanie produktów o różnych numerach a tym samym modelu
int ile=-1;
for (int i=0;i<sumator.length;i++){
if (sumator[i][0]==null){
}else {
}
if (stanimex_key.equals(sumator[i][0])){
if (sumator[i][1]==null){
ile = 0;
} else {
ile = Integer.parseInt(sumator[i][1]);
}
ile++;
sumator[i][1]=Integer.toString(ile);
} else {
}
}
if (ile == -1){
sumator[count][0]=stanimex_key;
sumator[count][1]=Integer.toString(1);
sumator[count][2]=""+price_final;
sumator[count][3]=prod_name+" ("+quantity+" "+unit+")";
sumator[count][4]=pkwiu;
sumator[count][5]=unit;
sumator[count][6]=Integer.toString(quantity);
sumator[count][7]=Integer.toString(vat_base);
count++;
}
//zamkniecie while(rs.next()):
}
for (int j=0;j<sumator.length;j++){
if (sumator[j][0]!=null){
prod.setProdPrice(BigDecimal.valueOf(Double.parseDouble(sumator[j][2])));
prod.setProdName(sumator[j][3]);
prod.setProdPkwiu(sumator[j][4]);
prod.setProdUnit(sumator[j][5]);
prod.setProdQuantity(Integer.parseInt(sumator[j][1]));
prod.setProdVat(Integer.parseInt(sumator[j][7]));
list.add(prod);
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
return list;
}
Z InvoiceShow.java:
package org;
import java.math.BigDecimal;
import java.util.Date;
import java.lang.String;
public class InvoiceShow {
public InvoiceShow() {
}
private String prodName;
private String prodPkwiu;
private BigDecimal prodPrice;
private int prodVat;
private int prodQuantity;
private String prodUnit;
private BigDecimal prodNetto;
private int prodVatId;
private int partId;
private String partName;
private String stanimexKey;
private BigDecimal priceSell;
(...)
//settery
public void setProdName(String proN) {
this.prodName=proN;
}
public void setProdPkwiu(String proPk) {
this.prodPkwiu=proPk;
}
public void setProdPrice(BigDecimal proP) {
this.prodPrice=proP;
}
public void setProdVat(int proV) {
this.prodVat=proV;
}
public void setProdQuantity(int proQ) {
this.prodQuantity=proQ;
}
public void setProdUnit(String proU) {
this.prodUnit=proU;
}
public void setProdNetto(BigDecimal prodNetto) {
this.prodNetto = prodNetto;
}
public void setProdVatId(int prodVatId) {
this.prodVatId = prodVatId;
}
public void setPartId(int partId) {
this.partId = partId;
}
public void setPartName(String partName) {
this.partName = partName;
}
public void setStanimexKey(String stanimexKey) {
this.stanimexKey = stanimexKey;
}
public void setPriceSell(BigDecimal priceSell) {
this.priceSell = priceSell;
}
(...)
//gettery
public String getProdName() {
return prodName;
}
public String getProdPkwiu() {
return prodPkwiu;
}
public BigDecimal getProdPrice() {
return prodPrice;
}
public int getProdVat() {
return prodVat;
}
public int getProdQuantity() {
return prodQuantity;
}
public String getProdUnit() {
return prodUnit;
}
public BigDecimal getProdBrutto() {
BigDecimal prodQuantityy = BigDecimal.valueOf(Double.parseDouble(Integer.toString(prodQuantity)));
BigDecimal prodVatt = BigDecimal.valueOf(Double.parseDouble(Integer.toString(prodVat)));
BigDecimal jeden = BigDecimal.valueOf(1);
BigDecimal sto = BigDecimal.valueOf(100);
BigDecimal prodBrutto = prodPrice.multiply(prodQuantityy.multiply(jeden.add(prodVatt.divide(sto))));
return prodBrutto;
}
public BigDecimal getProdNetto() {
BigDecimal prodQuantityy = BigDecimal.valueOf(Double.parseDouble(Integer.toString(prodQuantity)));
prodNetto=prodPrice.multiply(prodQuantityy);
return prodNetto;
}
public int getProdVatId() {
return prodVatId;
}
public int getPartId() {
return partId;
}
public String getPartName() {
return partName;
}
public String getStanimexKey() {
return stanimexKey;
}
public BigDecimal getPriceSell() {
return priceSell;
}
(...)
Dodam jeszcze, ze przed dodaniem tablicy, w ktorej odbywa sie sumowanie wszystko dzialalo, a sama tablice w ostatniej petli wyrzucam sobie do logow i widze, ze zawiera poprawne wartosci (System.outy powycinalem, coby skrocic post).
Mam nadzieje, ze ktos mi cos podpowie.
Pozdrawiam