2017-05-30 6 views
1

の次の行に基づいてデータベースを挿入または更新します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 

database table

+0

負荷のすべての行ファイルをステージングテーブルに追加し、そこからメインテーブルを作成します。 –

答えて

0

私はあなたがそれをもう少しオブジェクト指向行う場合、それはより明確者を得ると思います。このヘルパークラスの

と思います(ゲッター/セッターが答えの息切れのため省略):

public class BookOrder { 
    public String ordernumber; 
    public String customerName; 
    public Date orderDate; 
    public double discount; 
    public float totalamount; 
    public BookOrder(String on, String cn, Date od, double disc) { 
     ordernumber = on; 
     customerName = cn; 
     orderDate = od; 
     discount = disc; 
     totalamount = 0; 
    } 
    public void addAmount(float amount) { 
     totalamount += amount * discount; 
    } 
} 

場所であなたのループがはるかに簡単に書くことができますこの:

static void loadTables() { 
    Scanner lineScanner = new Scanner(new File(orderData)); 
    // skip headers 
    String headerLine = lineScanner.nextLine(); 

    BookOrder currentOrder = null; 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

    while (lineScanner.hasNextLine()) { 
      String[] retrievedOrderLine = lineScanner.nextLine().split("\t"); 

      // if order number exists 
      if (!Objects.equals(retrievedOrderLine[0], "")) { 
       //Ordernumber changed, but not null 
       if(currentOrder != null || 
         !currentOrder.ordernumber.equals(retrievedOrderLine[0])) { 
        //Insert into DB 
        insertBookOrder(currentOrder); 
       } 
       //Ordernumber changed or null (first order) 
       if(currentOrder == null || 
         !currentOrder.ordernumber.equals(retrievedOrderLine[0])) { 
        //Start the next order as ordernumber changed 
        currentOrder =new BookOrder(
          retrievedOrderLine[0], //ordernumber 
          retrievedOrderLine[1], //customer 
          dateFormat.parse(retrievedOrderLine[2]), //date 
          Float.parseFloat(retrievedOrderLine[3]) //discount 
          ); 
       } 
      } 
      //Now add to total (discount is taken care of in method) 
      currentOrder.addAmount(Float.parseFloat(retrievedOrderLine[5]));        
     } 
     //Afterwards we need to insert last item if it exists 
     if(currentOrder != null) { 
      //Insert into DB 
      insertBookOrder(currentOrder); 
     } 
    } 
+0

ありがとう、insertBookOrderとは何ですか? – Silverfin

+0

データの行を挿入する新しい方法 - 既にそのコードをちょっとした方法で – Jan

関連する問題