2017-05-30 74 views
1

我有一個文本文件的下一行數據庫:插入或更新基於文件

enter image description here

其中包含的信息與書的順序在一個單一的訂單可以包含多個副本一本或多本書。

我想計算客戶在單個訂單中花費的總金額,因此numCopies * bookPrice爲訂單中的每個ISBN。第一個命令是(1 * 15.99)= 15.99。第二個(10 * 11.99 + 20 * 14.99)= 419.70。第三個(1 * 15.99)。

我正在瀏覽帶有掃描器的文本文件,隨着文本文件的添加,將文本文件的元素添加到文本文件中。爲了計算訂單總額,我試圖累積每本書在一行上出現的成本,直到達到orderNum發生變化的一行爲止。然後將該總訂單數量插入數據庫。

不確定我可以正確檢查何時應該釋放訂單總額並重置爲下一個訂單號並將此總計插入到數據庫中。或者基本上按照我的計算總計,然後在讀完所有訂單數據後更新數據庫。

相關代碼:

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

我認爲它得到的更清楚,如果你做更多的面向對象的。

這個助手類思(省略回答短促getter/setter方法):

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