の次の行に基づいてデータベースを挿入または更新します1つ以上の書籍のは、私はテキストファイルとして持っているファイル
顧客が1回の注文で費やした合計金額を計算したいので、注文の各ISBNに対してnumCopies * bookPriceを計算します。最初の注文は(1 * 15.99)= 15.99となります。 2番目の(10 * 11.99 + 20 * 14.99)= 419.70。そして3回目(1 * 15.99)。
私はスキャナを使ってテキストファイルを調べ、テキストファイルの要素をテキストファイルに追加します。注文合計を計算するために、orderNumが変更される行に達するまで、1つの行に存在する各書籍のコストを累積しようとしています。次に、その合計注文金額をデータベースに挿入します。
Im確かに注文の合計をリリースして次の注文番号に対してリセットし、この合計をデータベースに挿入する時期を正しく確認できます。または、すべての注文データを読み込んだら、データベースを更新しながら、基本的には合計を計算します。
関連するコード:
class TestConnect {
static final String DROP_TABLE_BOOKORDER = "drop table if exists bookorder;";
static final String CREATE_TABLE_BOOKORDER =
"create table bookorder (" +
" ordernumber VARCHAR(13) NOT NULL," +
" customername VARCHAR(100)," +
" orderdate DATE NOT NULL," +
" discount NUMERIC(8,2) NOT NULL," +
" totalamount INT NOT NULL," +
" PRIMARY KEY (ordernumber));";
static final String INSERT_BOOKORDER_DATA = "insert into bookOrder (orderNumber, customerName, orderDate, discount, totalAmount) values (?, ?, ?, ?, ?);";
createTables();
loadTables();
static void createTables() throws SQLException {
Statement stmt = conn.createStatement();
stmt.execute(DROP_TABLE_BOOKORDER);
stmt.execute(CREATE_TABLE_BOOKORDER);
}
static void loadTables() throws SQLException, FileNotFoundException, ParseException {
Scanner lineScanner = new Scanner(new File(orderData));
String headerLine = lineScanner.nextLine();
float totalOrderAmount = 0.0f;
String previousKnownOrderNum = null;
while (lineScanner.hasNextLine()) {
String[] retrievedOrderLine = lineScanner.nextLine().split("\t");
// if order number exists
if (!Objects.equals(retrievedOrderLine[0], "")) {
previousKnownOrderNum = retrievedOrderLine[0];
// order number
bookOrderStmt.setString(1, retrievedOrderLine[0]);
//customer name
bookOrderStmt.setString(2, retrievedOrderLine[1]);
//order date
//handle date format conversion
String orderDate = retrievedOrderLine[2];
System.out.println("now processing book order date as " + retrievedOrderLine[2]);
SimpleDateFormat formattedDate = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = formattedDate.parse(orderDate);
java.sql.Date sqlFormattedDate = new java.sql.Date(date.getTime());
bookOrderStmt.setDate(3, sqlFormattedDate);
// discount
bookOrderStmt.setFloat(4, Float.parseFloat(retrievedOrderLine[3]));
}
// if line contains a book isbn
if(!Objects.equals(retrievedOrderLine[4], "")) {
// if next line contains an orderNumber (the length of the line = 10), then insert accumulated orderTotal into database
if (lineScanner.nextLine().length() == 10) {
float thisLinesAmount = Float.parseFloat(retrievedOrderLine[5]) * Float.parseFloat(retrievedOrderLine[6]);
totalOrderAmount = totalOrderAmount + thisLinesAmount;
bookOrderStmt.setFloat(5, totalOrderAmount);
// reset total amount
totalOrderAmount = 0.0f;
// else continue to accumulate
} else {
// insert a temp value for totalAmount
totalOrderAmount = totalOrderAmount + Float.parseFloat(retrievedOrderLine[5]) * Float.parseFloat(retrievedOrderLine[6]);
bookOrderStmt.executeUpdate();
bookOrderStmt.close();
}
}
}
}
}
テストファイル:
OrderNum CustName OrderDate Discount ISBN NumCopies BookPrice ShipmentID ShipmentDate ShipCopies
N201700001 John Doe 2017-4-24 1 1234567891 1 15.99 S0000003 2017-4-25 1
N201700002 Jane Doe 2017-3-1 41.97 1234567890 10 11.99 S0000001 2017-3-2 5
S0000002 2017-3-15 5
1234567891 20 14.99 S0000001 2017-3-2 15
S0000002 2017-3-15 5
N201700003 John Jones 2017-5-1 0 1234567891 1 15.99
負荷のすべての行ファイルをステージングテーブルに追加し、そこからメインテーブルを作成します。 –