JAVA學習作品之銷售管理系統V1.0


     這套管理系統是本人學習JAVA一個月的作品,開發周期近10天左右。代碼量約1500行,基於Eclipse JDK1.7,運用了Swing/SWT 開發工具Windowbuilder,配套的還包含JDBC驅動、以及微軟的SQL Server數據庫。

源代碼所有開放,本人多輪測試。結果OK。

因為本人初學JAVA,代碼漏洞及不足之處難免,還請多多指正!

有用方面,假設增加掃碼器接口,軟件應該會更完美!僅僅是條件有限。僅為學習。

第一部分:首先看下軟件信息,大小600k不到。雙擊執行。前提JDK1.7及以上環境配置好, SQL Server數據庫安裝好,數據庫配置3個table例如以下圖:





雙擊.jar程序,打開系統。界面如圖:


工具欄兩個選項:數據庫管理、關於,主界面5大功能塊進貨、定價、銷售、報廢、報表。

其它(未開發功能)。

點開工具欄數:據庫管理。能夠選擇清除系統中舊數據,防止系統執行幾年后數據累積增導致執行速度變慢:


點擊兩年前數據,彈出對話框,提示是否刪除yyyy-mm-dd之前的數據,點擊確定彈出清理成功。


點擊關於,顯示版本號等信息:


點擊主界面進貨。進入進貨管理界面,輸入我們進貨的信息:品名(商品名稱)、數量、單位(銷售單位。不支持單位換算)、總價(該數量下的總金額),錄入例如以下信息



點擊提交button,提示成功!

(假設商品之前有記錄過,輸入商品名后,按Enter鍵,會自己主動帶出商品單位)。 我們繼續多輸入一些其它商品。。。



點擊定價,進入定價界面。界面左邊兩個button。

查找button:首先選擇日期區間(系統默認一個月。我們調整為近期三天)。起始和結束日期,對這一時間區間進貨的商品指定銷售價格



我們點擊查找button,顯示我們2016/03/20-2016/03/28的全部進貨商品。系統自己主動計算出進貨的價格。以此作為銷售價格的參考



再看左下角的統一按比例加價(進貨單位價格*比例)和 統一按固定值加價(進貨單位價格+固定值),我們模擬比例加價25%,點擊確定button。看下銷售單位價格變化



當然銷售單位價格能夠手動修改,比方我們將雀巢咖啡的價格修改為22元/盒。直接更改后按Enter就可以


確定好銷售價格后,我們點提交button。提示提交成功!


再點擊我們的銷售功能,進入銷售管理界面:下拉框直接選擇商品,系統自己主動帶出商品單位。假設上一步你有維護價格,系統也會自己主動帶出銷售價格,你僅僅須要輸入數量就可以。

當然,假設沒有維護銷售價格,你能夠手動輸入單位價格,單位價格能夠被手動調整


比方客戶要買薯片2個。選擇百事薯片,系統帶出價格4.75(能夠被改動)。輸入數量2個,點擊>>button,增加購物車,總價9.5。我們多購買一些商品



假設我想將真彩水筆從購物車移除。選中點擊刪除button就可以


假設同一商品多次增加購物車。系統會提示反復增加。請刪除后,又一次輸入數量再次增加。

最后。我們點擊提交button,系統會計算購物車的總金額。提示是否提交


點是(Y)。顯示提交結果。交易成功。


回到主界面。點擊報廢功能。如有過期等原因導致報廢,這個功能最有用了。選擇商品,輸入數量,按Enter鍵。顯示成本,點擊提交,顯示報廢成功!



再回到主界面。進入報表功能,這部分略微復雜點,首先看報表界面。包括三大功能:記錄、庫存、利潤。

在未鎖定日期區間前,你不能進行不論什么操作。



我們選擇近期一個月的記錄,然后鎖定日期,展開左邊功能節點——記錄:進貨記錄、銷售記錄、報廢記錄。   庫存:當前庫存(與日期區間無關)。  最后是利潤分析(計算銷售收入、成本之凈利潤。 

 比方我們點擊銷售記錄:


假設在實際中,進貨、報廢、或者銷售錄入出錯了,我們都能夠在這里鎖定日期。找到記錄然后選中。鼠標右鍵選擇刪除記錄



點擊刪除記錄。提示刪除的數據不增加報表計算。確認刪除,提示刪除成功


我們再看看當前剩余商品庫存,幫助核對商品數量



最后是利潤分析,這份報表十分重要


最后從這份報表來驗證我們的操作結果:

1.康師傅紅燒牛肉面:銷售了5袋。每袋銷售價格2.5,進貨價格2.0。銷售利潤2.5,沒有報廢記錄,凈利潤2.5

2.百事薯片:銷售2份。每份銷售價格4.75。進貨價格3.8。銷售利潤1.9。當中有一份由於過期導致成本添加3.8。所以凈利潤虧1.9

........

最后總計銷售利潤和報廢成本,得到凈利潤


好了,功能部分最終說完了。直接貢獻代碼部分。不用多做說明了,本人凝視一向清楚:


第二部分:源代碼

主界面:

package org.screen;

import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.SwingConstants;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import javax.swing.JToolBar;

public class screen {

	private JFrame frame;
	private JButton button_4;
	private JButton button_5;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {    //同意多次運行
			public void run() {
				try {
					screen window = new screen();  //new一個窗體(全屏)
					window.frame.setVisible(true);  //設置fram可見
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public screen() {
		initialize();  
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame("零售業管理系統");
		frame.getContentPane().setFocusTraversalPolicyProvider(true);
		int screenWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width; //依據用戶屏幕,自己主動調整屏幕元素位置
		int screenHeight = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;

		frame.setBounds(0, 0, screenWidth, screenHeight); //設置fram的位置和長寬
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //定義close動作
		frame.getContentPane().setLayout(null); 

		JLabel lblNewLabel = new JLabel("零售業管理系統 V1.0"); //設置系統標題
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel.setForeground(Color.BLUE);
		lblNewLabel.setFont(new Font("仿宋", Font.BOLD | Font.ITALIC, 36));
		lblNewLabel.setBounds((screenWidth-400)/2, (screenHeight-350)/2 - 80, 400, 50);
		frame.getContentPane().add(lblNewLabel);		
		
		JButton newButton = new JButton("進貨");   //點擊進貨按鈕。調用進貨管理程序界面
		newButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				stock_screen.main(null);
			}
		});
		newButton.setFont(new Font("仿宋", Font.BOLD, 20)); //設置按鈕字體,大小,位置
		newButton.setBounds((screenWidth-400)/2, (screenHeight-350)/2, 400, 50);
		frame.getContentPane().add(newButton); //放入fram容器中
		
		JButton button = new JButton("定價");  //設置銷售按鈕
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				pricing_screen.main(null);
			}
		});
		button.setFont(new Font("仿宋", Font.BOLD, 20));
		button.setBounds((screenWidth-400)/2, (screenHeight-350)/2+60*1, 400, 50);
		frame.getContentPane().add(button);
		
		JButton button_1 = new JButton("銷售");  //設置報廢按鈕
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				sales_screen.main(null);
			}
		});
		button_1.setFont(new Font("仿宋", Font.BOLD, 20));
		button_1.setBounds((screenWidth-400)/2, (screenHeight-350)/2+60*2, 400, 50);
		frame.getContentPane().add(button_1);
		
		JButton button_2 = new JButton("報廢");  //設置庫存按鈕
		button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				waste_screen.main(null);
			}
		});
		button_2.setFont(new Font("仿宋", Font.BOLD, 20));
		button_2.setBounds((screenWidth-400)/2, (screenHeight-350)/2+60*3, 400, 50);
		frame.getContentPane().add(button_2);
		
		JButton button_3 = new JButton("報表"); //設置利潤按鈕
		button_3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				report_screen.main(null);
			}
		});
		button_3.setFont(new Font("仿宋", Font.BOLD, 20));
		button_3.setBounds((screenWidth-400)/2, (screenHeight-350)/2+60*4, 400, 50);
		frame.getContentPane().add(button_3);
		
		JButton btnNewButton = new JButton("其它");
		btnNewButton.setFont(new Font("仿宋", Font.BOLD, 20));
		btnNewButton.setFocusPainted(false);
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
		        JOptionPane.showMessageDialog(null, "功能暫未開放!

"); } }); btnNewButton.setBounds((screenWidth-400)/2, (screenHeight-350)/2+60*5, 400, 50); frame.getContentPane().add(btnNewButton); //toolbar上添加兩個按鈕選項 數據管理和關於 button_4 = new JButton("數據管理"); button_4.addActionListener(new ActionListener() { //點擊按鈕事件 public void actionPerformed(ActionEvent e) { JPopupMenu popupMenu = new JPopupMenu();//載入popupMenu選項 JMenu menu = new JMenu("清空");//清理舊數據。優化數據庫 JMenuItem item_1 = new JMenuItem("1年前數據"); JMenuItem item_2 = new JMenuItem("2年前數據"); JMenuItem item_3 = new JMenuItem("3年前數據"); JMenuItem item_4 = new JMenuItem("4年前數據"); JMenuItem item_5 = new JMenuItem("5年前數據"); menu.add(item_1); menu.add(item_2); menu.add(item_3); menu.add(item_4); menu.add(item_5); popupMenu.add(menu); popupMenu.show(button_4, 0, button_4.getY() + button_4.getHeight()); //選擇toolbar里item事件。運行舊數據清理 item_1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { GregorianCalendar gc=new GregorianCalendar(); //當前日期的前一年 gc.setTime(new Date()); gc.add(1, -1); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 設置指定格式的當前日期時間 String date = df.format(gc.getTime()); new OperationSqlData().DeleteSqlDataByYear(date); } }); item_2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { GregorianCalendar gc=new GregorianCalendar(); //當前日期的前一年 gc.setTime(new Date()); gc.add(1, -2); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 設置指定格式的當前日期時間 String date = df.format(gc.getTime()); new OperationSqlData().DeleteSqlDataByYear(date); } }); item_3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { GregorianCalendar gc=new GregorianCalendar(); //當前日期的前一年 gc.setTime(new Date()); gc.add(1, -3); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 設置指定格式的當前日期時間 String date = df.format(gc.getTime()); new OperationSqlData().DeleteSqlDataByYear(date); } }); item_4.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { GregorianCalendar gc=new GregorianCalendar(); //當前日期的前兩年 gc.setTime(new Date()); gc.add(1, -4); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 設置指定格式的當前日期時間 String date = df.format(gc.getTime()); new OperationSqlData().DeleteSqlDataByYear(date); } }); item_5.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { GregorianCalendar gc=new GregorianCalendar(); //當前日期的前一年 gc.setTime(new Date()); gc.add(1, -5); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 設置指定格式的當前日期時間 String date = df.format(gc.getTime()); new OperationSqlData().DeleteSqlDataByYear(date); } }); } }); button_4.setBorder(null); button_4.setFont(new Font("仿宋", Font.PLAIN, 14)); JToolBar toolBar = new JToolBar(); toolBar.setToolTipText("配置"); toolBar.setRollover(true); toolBar.add(button_4); toolBar.setBounds(0, 0, screenWidth, 25); frame.getContentPane().add(toolBar); //分隔功能欄 toolBar.addSeparator(); //添加開發相關信息 button_5 = new JButton("關於"); button_5.setBorder(null); button_5.setFont(new Font("仿宋", Font.PLAIN, 14)); toolBar.add(button_5); frame.getContentPane().add(toolBar); button_5.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { about_screen.main(null); } }); } }


主界面——關於:

package org.screen;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextPane;

public class about_screen {

	private JFrame frame;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					about_screen window = new about_screen();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public about_screen() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(50, 80, 400, 200);
		JTextPane textPane = new JTextPane();
		textPane.setBounds(00, 00, 400, 200);
		frame.getContentPane().add(textPane);
		textPane.setText("此管理軟件。僅為個人學習Java語言作品之中的一個。源代碼所有開放,如有疑問聯系QQ,初學Java不足之處還請指正。相互學習!

" +"\r"+"\r"+ "版本號 V1.0"+"\r"+"2016/03/25"+"\r"+"CSDN:居士愛吃泡面"+"\r"+"QQ:461356592"); textPane.setEditable(false); } }


進貨管理:

package org.screen;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;

public class stock_screen {
	private JFrame frame;
	private JTextField textField;
	private JTextField textField_1;
	private JTextField textField_2;
	private JTextField textField_3;
	private JButton btnNewButton;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					stock_screen window = new stock_screen();  //創建進貨窗體界面
					window.frame.setVisible(true);  //設置窗體可見
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public stock_screen() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame("進貨管理");  //new一個Jfram容器
		int screenWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width/2;;  //依據用戶屏幕。自己主動調整控件的顯示位置
		int screenHeight = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height/2;;
		
		frame.setBounds(screenWidth/2, screenHeight/2, screenWidth, screenHeight);
		frame.getContentPane().setLayout(null);	
		
		JLabel lblNewLabel = new JLabel("品名");  //設置label控件屬性,位置
		lblNewLabel.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel.setBounds((screenWidth-180)/2, (screenHeight-180)/2, 50, 20);
		frame.getContentPane().add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("數量");  //設置label控件屬性,位置
		lblNewLabel_1.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel_1.setBounds((screenWidth-180)/2, (screenHeight-180)/2+30*1, 50, 20);
		frame.getContentPane().add(lblNewLabel_1);
		
		JLabel lblNewLabel_2 = new JLabel("單位");  //設置label控件屬性,位置
		lblNewLabel_2.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel_2.setBounds((screenWidth-180)/2, (screenHeight-180)/2+30*2, 50, 20);
		frame.getContentPane().add(lblNewLabel_2);
		
		JLabel lblNewLabel_3 = new JLabel("總價");  //設置label控件屬性。位置
		lblNewLabel_3.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel_3.setBounds((screenWidth-180)/2, (screenHeight-180)/2+30*3, 50, 20);
		frame.getContentPane().add(lblNewLabel_3);
		
		textField = new JTextField();  //設置輸入Field控件屬性,位置
		textField.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				textField_2.setText(new OperationSqlData().getUnitByGoodsName(textField.getText()));
			}
		});
		textField.setBounds((screenWidth-180)/2+60, (screenHeight-180)/2, 180, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		textField_1 = new JTextField(); //設置輸入Field控件屬性。位置
		textField_1.setBounds((screenWidth-180)/2+60, (screenHeight-180)/2+30*1, 120, 20);
		frame.getContentPane().add(textField_1);
		textField_1.setColumns(10);
		
		textField_2 = new JTextField(); //設置輸入ComboBox控件屬性,位置 ,默認下拉框兩個選項
		textField_2.setBounds((screenWidth-180)/2+60, (screenHeight-180)/2+30*2, 120, 20);
		frame.getContentPane().add(textField_2);
		textField_2.setText(new OperationSqlData().getUnitByGoodsName(textField.getText()));
		
		textField_3 = new JTextField();  //設置輸入Field控件屬性,位置
		textField_3.setBounds((screenWidth-180)/2+60, (screenHeight-180)/2+30*3, 120, 20);
		frame.getContentPane().add(textField_3);
		textField_3.setColumns(10);
		
		btnNewButton = new JButton("提交");
		btnNewButton.setMnemonic(KeyEvent.VK_ENTER);
		btnNewButton.setFont(new Font("仿宋", Font.BOLD, 16));
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (textField.getText().isEmpty()||textField_1.getText().isEmpty()||textField_3.getText().isEmpty()||textField_2.getText().isEmpty()) //檢查商品名字段是否為空
				{
				   JOptionPane.showMessageDialog(null, "輸入欄位不能為空!

"); return; } int ret = new OperationSqlData().StockIn(textField.getText(), textField_1.getText(), (String) textField_2.getText(), textField_3.getText()); if (ret == 1) //依據SQL返回值推斷運行結果,並顯示對話框 { JOptionPane.showMessageDialog(null, "存儲成功"); textField.setText(null); textField_1.setText(null); textField_2.setText(null);; textField_3.setText(null); } else { JOptionPane.showMessageDialog(null, "存儲失敗!

"); } } }); btnNewButton.setBounds((screenWidth-180)/2+60, (screenHeight-180)/2+30*3+40, 120, 20); frame.getContentPane().add(btnNewButton); } }


定價界面

package org.screen;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerModel;
import javax.swing.JSpinner;

public class pricing_screen {

	private JFrame frame;
	private JTable table;
	private DefaultTableModel model;
	private JTextField textField;
	private JTextField textField_1;
	private JSpinner spinner;
	private JSpinner spinner_1;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					pricing_screen window = new pricing_screen();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public pricing_screen() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	@SuppressWarnings("serial")
	private void initialize() {
		frame = new JFrame("銷售定價");
		int screenWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width*2/3;
		int screenHeight = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height*2/3;	
		frame.setBounds(screenWidth/6, screenHeight/6, screenWidth, screenHeight);
		frame.getContentPane().setLayout(null);

		// 依據model創建一個Jtable
		String[] header = { "品名","總價值","庫存數量","單位","進貨單位價格","銷售單位價格" };// 設置表頭
		Object[][] item = new Object[0][6];// 設置單身
		model = new DefaultTableModel(item, header) {
			public boolean isCellEditable(int row, int column) {
				if (column == 5)
					return true;
				else
					return false;
			}
		};// 創建一個model,並設置model數據不可編輯
		table = new JTable(model);// 依據model創建一個Jtable
		table.setFocusable(false);// 關閉鼠標選中單個坐標

		JScrollPane scrollPane = new JScrollPane(table);
		scrollPane.setBounds((screenWidth-780)/2+170, (screenHeight-440)/2-20, 600, 400);
		frame.getContentPane().add(scrollPane);		

		JLabel label_4 = new JLabel("起始日期");
		label_4.setFont(new Font("仿宋", Font.BOLD, 14));
		label_4.setBounds((screenWidth-780)/2, (screenHeight-440)/2-20, 60, 20);
		frame.getContentPane().add(label_4);

		JLabel label_5 = new JLabel("結束日期");
		label_5.setFont(new Font("仿宋", Font.BOLD, 14));
		label_5.setBounds((screenWidth-780)/2, (screenHeight-440)/2-20+30, 60, 20);
		frame.getContentPane().add(label_5);

		//定義兩個spinner用於日期的調整
		GregorianCalendar gc=new GregorianCalendar(); //當前日期的前一個月
		gc.setTime(new Date());
		gc.add(2, -1);		
		SpinnerModel dateModel=null;
		dateModel = new SpinnerDateModel(gc.getTime(), null, null,Calendar.DAY_OF_MONTH);
		spinner = new JSpinner();
		spinner.setBounds((screenWidth-780)/2+65, (screenHeight-440)/2-20, 90, 20);
		frame.getContentPane().add(spinner);
		spinner.setModel(dateModel);  
		spinner.setEditor(new JSpinner.DateEditor(spinner,"yyyy-MM-dd"));

		SpinnerModel dateModel_1=null;
		dateModel_1 = new SpinnerDateModel(new Date(), null, null,Calendar.DAY_OF_MONTH);		
		spinner_1 = new JSpinner();
		spinner_1.setBounds((screenWidth-780)/2+65, (screenHeight-440)/2-20+30, 90, 20);
		frame.getContentPane().add(spinner_1);
		spinner_1.setModel(dateModel_1); 
		spinner_1.setEditor(new JSpinner.DateEditor(spinner_1,"yyyy-MM-dd"));			
		
		JButton button_1 = new JButton("查找");
		button_1.setFont(new Font("仿宋", Font.BOLD, 16));
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//點擊查找按鈕,依據起止日期,查詢庫存信息
				int r = model.getRowCount();
				while(r>0)
				{
					model.removeRow(r-1);
					r--;
				}

				Object[] obj = new Object[4];
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// 創建指定格式的當前時間
				ArrayList<Object[]> list = new OperationSqlData().getStockRecordByDate(df.format(spinner.getValue())+" "+"00:00:00", df.format(spinner_1.getValue())+" "+"23:59:59",1 , true);
				int row = list.size();
				float cost = 0;
				//顯示到table
				for(int i=0; i<row; i++)
				{
					obj = list.get(i);
					model.addRow(new Object[5]);
					int j = model.getRowCount();
					model.setValueAt(obj[0], j-1, 0);
					model.setValueAt(obj[3], j-1, 1);
					model.setValueAt(obj[1], j-1, 2);
					model.setValueAt(obj[2], j-1, 3);
					cost = Float.parseFloat(obj[3].toString())/Float.parseFloat(obj[1].toString());
					cost =  (float)(Math.round(cost*100))/100;
					model.setValueAt(cost, j-1, 4);
				}
			}
		});
		button_1.setBounds((screenWidth-780)/2+30, (screenHeight-440)/2-20+70, 90, 20);
		frame.getContentPane().add(button_1);		
	   
		//定義兩種加價方式按比例和固定值。基於日期區間庫存成本定義銷售價格
		JLabel lblNewLabel = new JLabel("統一按比例加價");
		lblNewLabel.setFont(new Font("仿宋", Font.BOLD, 14));
		lblNewLabel.setBounds((screenWidth-780)/2-20, (screenHeight-440)/2-20+190, 110, 20);
		frame.getContentPane().add(lblNewLabel);

		JLabel label_1 = new JLabel("%");
		label_1.setBounds((screenWidth-780)/2+150, (screenHeight-440)/2-20+190, 20, 20);
		frame.getContentPane().add(label_1);

		JLabel label_2 = new JLabel("統一按固定值加價");
		label_2.setFont(new Font("仿宋", Font.BOLD, 14));
		label_2.setBounds((screenWidth-780)/2-20, (screenHeight-440)/2-20+220, 120, 20);
		frame.getContentPane().add(label_2);

		JLabel label_3 = new JLabel("¥");
		label_3.setBounds((screenWidth-780)/2+150, (screenHeight-440)/2-20+220, 20, 20);
		frame.getContentPane().add(label_3);		

		textField = new JTextField();
		textField.setBounds((screenWidth-780)/2+105, (screenHeight-440)/2-20+190, 40, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);		

		textField_1 = new JTextField();
		textField_1.setBounds((screenWidth-780)/2+105, (screenHeight-440)/2-20+220, 40, 20);
		frame.getContentPane().add(textField_1);
		textField_1.setColumns(10);

		JButton btnNewButton = new JButton("確定");
		btnNewButton.setFont(new Font("仿宋", Font.BOLD, 16));
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//兩種加價方式選其一
				if (!textField.getText().isEmpty() && !textField_1.getText().isEmpty())
				{
					JOptionPane.showMessageDialog(null, "加價方式(按比例/按固定值)二選一");
				    return;
				}
				
				else if(!textField.getText().isEmpty())
				{
					int row = 0;
					row = model.getRowCount();
                    for(int i=0; i<row; i++)
                    {
                    	//計算銷售價格:成本*比例 保留兩位小數的還有一種方法
                    	float sales = Float.parseFloat(model.getValueAt(i, 4).toString())*(1+Float.parseFloat(textField.getText())/100);
                    	sales =  (float)(Math.round(sales*100))/100;
                    	model.setValueAt(sales, i, 5);
                    }
                         
				}
				
				else if(!textField_1.getText().isEmpty())
				{
                    int row;
                    row = model.getRowCount();
					for(int i=0; i<row; i++)
                    {
						//計算銷售價格:成本+定值
                    	float sales = Float.parseFloat(model.getValueAt(i, 4).toString())+Float.parseFloat(textField_1.getText());
                    	sales =  (float)(Math.round(sales*100))/100;
                    	model.setValueAt(sales, i, 5);
                    }					
				}
				      
			}
		});
		btnNewButton.setBounds((screenWidth-780)/2+30, (screenHeight-440)/2-20+260, 90, 20);
		frame.getContentPane().add(btnNewButton);	

		JButton button = new JButton("提交");
		button.setFont(new Font("仿宋", Font.BOLD, 16));
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				new OperationSqlData().CommitSalesStockPricingToSql(model, table);
			}
		});
		button.setBounds((screenWidth-780)/2+400, (screenHeight-440)/2+400, 90, 20);
		frame.getContentPane().add(button);
	}
}

銷售管理界面:

package org.screen;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import java.awt.Font;
import javax.swing.SwingConstants;
import java.awt.event.KeyEvent;

public class sales_screen {

	// 定義SWT控件
	private JFrame frame;
	private JTextField textField;
	private JTextField textField_1;
	private JTextField textField_3;
	private JComboBox<String> comboBox;
	private JTable table_1;
	private DefaultTableModel model;
	private int m = 0;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					sales_screen window = new sales_screen(); // 新建銷售窗體
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public sales_screen() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	@SuppressWarnings("serial")
	private void initialize() {
		frame = new JFrame("銷售管理"); // new一個fram容器
		// 自己主動設置銷售管理窗體大小為用戶屏幕的一半,切位於屏幕中央
		int screenWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width*2/3;
		int screenHeight = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height*2/3;
		frame.setBounds(screenWidth/6, screenHeight/6, screenWidth, screenHeight);
		frame.getContentPane().setLayout(null);

		JLabel lblNewLabel = new JLabel("品名");// 設置品名label屬性
		lblNewLabel.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel.setBounds((screenWidth - 880) / 2, (screenHeight - 400) / 2+100, 50, 20);
		frame.getContentPane().add(lblNewLabel);

		JLabel lblNewLabel_1 = new JLabel("數量");// 設置單位價格label屬性
		lblNewLabel_1.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel_1.setBounds((screenWidth - 880) / 2, (screenHeight - 400) / 2+140 , 50, 20);
		frame.getContentPane().add(lblNewLabel_1);

		JLabel lblNewLabel_2 = new JLabel("單位價格");// 設置數量label屬性
		lblNewLabel_2.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel_2.setBounds((screenWidth - 880) / 2, (screenHeight - 400) / 2+180 , 50, 20);
		frame.getContentPane().add(lblNewLabel_2);
		
		textField_3 = new JTextField();
		textField_3.setHorizontalAlignment(SwingConstants.CENTER);
		textField_3.setEditable(false);
		textField_3.setBounds((screenWidth - 880) / 2 + 170, (screenHeight - 400) / 2 + 140, 60, 20);;
		frame.getContentPane().add(textField_3);
		textField_3.setColumns(10);		

		comboBox = new JComboBox<String>();// 設置combox品名輸入屬性
		new OperationSqlData().getGoodsNameToCombox(comboBox);
		comboBox.setBounds((screenWidth - 880) / 2 + 55, (screenHeight - 400) / 2 + 100, 180, 20);
		frame.getContentPane().add(comboBox);
		comboBox.setSelectedItem(null);
		comboBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String unit = new OperationSqlData().getUnitByGoodsName(comboBox.getSelectedItem().toString());
				String sales_price = new OperationSqlData().getSalesPriceByGoodsName(comboBox.getSelectedItem().toString());	
				textField.setText(sales_price);
				textField_3.setText(unit);
				textField_1.setText(null);
			}
		});

		textField_1 = new JTextField();
		textField_1.setBounds((screenWidth - 880) / 2 + 55, (screenHeight - 400) / 2 + 140, 110, 20);
		frame.getContentPane().add(textField_1);
		textField_1.setColumns(10);

		textField = new JTextField();// 設置(數量)Field輸入屬性
		textField.setBounds((screenWidth - 880) / 2 + 55, (screenHeight - 400) / 2 + 180, 110, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);

		JButton btnNewButton_2 = new JButton(">>");// 設置>>button屬性及事件處理
		btnNewButton_2.setFont(new Font("仿宋", Font.BOLD, 16));
		btnNewButton_2.setBounds((screenWidth - 880) / 2 + 55, (screenHeight - 400) / 2 + 220, 60, 20);
		frame.getContentPane().add(btnNewButton_2);
		btnNewButton_2.addActionListener(new ActionListener() {
			// 將用戶輸入的數據。寫入Jtable中,計算總金額
			public void actionPerformed(ActionEvent arg0) {
				m = model.getRowCount();
				for(int q=0; q<m; q++)
				{
					if(model.getValueAt(q, 0).toString().equals(comboBox.getSelectedItem().toString()))
					{
						JOptionPane.showMessageDialog(null, "反復增加購物車!

"); return; } } if (comboBox.getSelectedItem().toString().isEmpty()||textField.getText().isEmpty()||textField_1.getText().isEmpty()) { JOptionPane.showMessageDialog(null, "輸入欄位不能為空!"); return; } model.addRow(new Object[4]); model.setValueAt(comboBox.getSelectedItem(), m, 0); model.setValueAt(textField_1.getText(), m, 1); model.setValueAt(textField_3.getText(), m, 2); model.setValueAt(textField.getText(), m, 3); model.setValueAt((float)(Math.round(Float.parseFloat(textField.getText()) * Float.parseFloat(textField_1.getText())*100))/100, m, 4); } }); JButton btnNewButton = new JButton("提交");// 設置提交button屬性及事件處理 btnNewButton.setFont(new Font("仿宋", Font.BOLD, 16)); btnNewButton.setMnemonic(KeyEvent.VK_ENTER); btnNewButton.setBounds((screenWidth - 880) / 2 + 450, (screenHeight - 400) / 2 + 390, 80, 20); frame.getContentPane().add(btnNewButton); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new OperationSqlData().CommitSalesToSql(model, table_1); int j = model.getRowCount(); while(j>0) { model.removeRow(j-1); j--; } } }); JButton btnNewButton_1 = new JButton("刪除");// 設置刪除button屬性及事件處理 btnNewButton_1.setFont(new Font("仿宋", Font.BOLD, 16)); btnNewButton_1.setBounds((screenWidth - 880) / 2 + 580, (screenHeight - 400) / 2 + 390, 80, 20); frame.getContentPane().add(btnNewButton_1); btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int row = table_1.getSelectedRow(); if (row >= 0) { model.removeRow(row); } } }); // 根據model創建一個Jtable String[] header = { "品名", "數量", "單位", "單位價格", "總價" };// 設置表頭 Object[][] item = new Object[0][5];// 設置單身 model = new DefaultTableModel(item, header) { public boolean isCellEditable(int row, int column) { return false; } };// 創建一個model,並設置model數據不可編輯 table_1 = new JTable(model);// 根據model創建一個Jtable table_1.setFocusable(false);// 關閉鼠標選中單個坐標 JScrollPane scrollPane = new JScrollPane(table_1);// 設置JScrollPane容器屬性,將Jtable放入JScrollPane中,實現數據超出上下左右滾動欄的功能 scrollPane.setLocation((screenWidth - 880) / 2 + 250, (screenHeight - 440) / 2); scrollPane.setSize(600, 400); frame.getContentPane().add(scrollPane); } }


報廢界面:

package org.screen;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import java.awt.Font;
import javax.swing.SwingConstants;

import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.awt.event.ActionEvent;

public class waste_screen {
	private JFrame frame;
	private JComboBox<String> comboBox;
	private JTextField textField_1;
	private JTextField textField_2;
	private JButton btnNewButton;
	private JTextField textField_3;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					waste_screen window = new waste_screen();  //創建進貨窗體界面
					window.frame.setVisible(true);  //設置窗體可見
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public waste_screen() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame("商品報廢");  //new一個Jfram容器
		int screenWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width/2;  //依據用戶屏幕,自己主動調整控件的顯示位置
		int screenHeight = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height/2;		
		frame.setBounds(screenWidth/2, screenHeight/2, screenWidth, screenHeight);
		frame.getContentPane().setLayout(null);
		
		JLabel lblNewLabel = new JLabel("品名");  //設置label控件屬性。位置
		lblNewLabel.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel.setBounds((screenWidth-180)/2, (screenHeight-140)/2, 50, 20);
		frame.getContentPane().add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("數量");  //設置label控件屬性,位置
		lblNewLabel_1.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel_1.setBounds((screenWidth-180)/2, (screenHeight-140)/2+40*1, 50, 20);
		frame.getContentPane().add(lblNewLabel_1);
		
		JLabel lblNewLabel_2 = new JLabel("成本");  //設置label控件屬性,位置
		lblNewLabel_2.setFont(new Font("仿宋", Font.BOLD, 20));
		lblNewLabel_2.setBounds((screenWidth-180)/2, (screenHeight-140)/2+40*2, 50, 20);
		frame.getContentPane().add(lblNewLabel_2);
		
		comboBox = new JComboBox<String>();  //設置comboBox控件屬性,位置
		new OperationSqlData().getGoodsNameToCombox(comboBox);
		comboBox.setSelectedItem(null);
		comboBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//每次選擇商品,先清空輸入框,再抓取商品單位
				textField_1.setText(null);
				textField_2.setText(null);;
				textField_3.setText(null);				
				String unit = new OperationSqlData().getUnitByGoodsName(comboBox.getSelectedItem().toString());
				textField_3.setText(unit);
			}
		});
		comboBox.setBounds((screenWidth-180)/2+60, (screenHeight-140)/2, 180, 20);
		frame.getContentPane().add(comboBox);
		
		textField_1 = new JTextField(); //設置輸入Field控件屬性,位置
		textField_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (comboBox.getSelectedIndex() >= 0)
				{
					//抓取報廢商品的庫存成本
					float price = new OperationSqlData().getStockCostByGoodsName(comboBox.getSelectedItem().toString());
					float t_price = Float.parseFloat(textField_1.getText())*price;
					//保留兩位小數
					BigDecimal bd = new BigDecimal(t_price);
					bd = bd.setScale(2, RoundingMode.HALF_UP);
					textField_2.setText(bd.toString());
				}
			}
		});
		textField_1.setBounds((screenWidth-180)/2+60, (screenHeight-140)/2+40*1, 120, 20);
		frame.getContentPane().add(textField_1);
		textField_1.setColumns(10);
		
		textField_2 = new JTextField();
		textField_2.setEditable(false);
		textField_2.setBounds((screenWidth-180)/2+60, (screenHeight-140)/2+40*2, 120, 20);
		frame.getContentPane().add(textField_2);

		textField_3 = new JTextField();
		textField_3.setHorizontalAlignment(SwingConstants.CENTER);
		textField_3.setEditable(false);
		textField_3.setBounds((screenWidth-180)/2+190, (screenHeight-140)/2+40*1, 50, 20);
		frame.getContentPane().add(textField_3);
		textField_3.setColumns(10);		
		
		btnNewButton = new JButton("提交");  //設置提交button屬性,位置和提交事件處理
		btnNewButton.setFont(new Font("仿宋", Font.BOLD, 16));
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (textField_1.getText().isEmpty()||comboBox.getSelectedIndex()<0) //檢查商品名字段是否為空
				{
					   JOptionPane.showMessageDialog(null, "輸入欄位不能為空!

"); return; } if (textField_2.getText().isEmpty()) //檢查商品名字段是否為空 { JOptionPane.showMessageDialog(null, "先按Enter查看報廢成本。"); return; } int ret =new OperationSqlData().StockIn(comboBox.getSelectedItem().toString(), "-"+textField_1.getText(), textField_3.getText(), "-"+textField_2.getText()); if (ret == 1) //依據SQL返回值推斷運行結果,並顯示對話框 { JOptionPane.showMessageDialog(null, "報廢成功!

"); } else { JOptionPane.showMessageDialog(null, "報廢失敗!"); } } }); btnNewButton.setBounds((screenWidth-180)/2+60, (screenHeight-140)/2+40*3, 120, 20); frame.getContentPane().add(btnNewButton); } }


報表部分:

package org.screen;

import java.awt.EventQueue;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerModel;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.tree.DefaultTreeModel;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.JTable;
import javax.swing.JSpinner;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;

public class report_screen {

	private JFrame frame;
	private JTable table;
	private JTree tree;
	private JScrollPane scrollPane;
	private JScrollPane scrollPane_1;
	private JSpinner spinner;
	private JSpinner spinner_1;	
	private JRadioButton checkBox;
	private String business;
	private DefaultTableModel model1;
	private DefaultTableModel model2;
	private DefaultTableModel model3;
	/**
	 * Launch the application.
	 */


	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					report_screen window = new report_screen();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public report_screen() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	@SuppressWarnings("serial")
	private void initialize() {
		frame = new JFrame();
		int screenWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
		int screenHeight = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;		
		frame.setBounds(0, 0, screenWidth, screenHeight);
		frame.getContentPane().setLayout(null);

		JLabel label = new JLabel("開始日期");
		label.setFont(new Font("仿宋", Font.BOLD, 16));
		label.setBounds(180, 20, 80, 20);
		frame.getContentPane().add(label);		

		JLabel label_1 = new JLabel("結束日期");
		label_1.setFont(new Font("仿宋", Font.BOLD, 16));
		label_1.setBounds(390, 20, 80, 20);
		frame.getContentPane().add(label_1);	

		checkBox = new JRadioButton("鎖定日期");
		checkBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//鎖定后日期不可編輯
				if(checkBox.isSelected() == true)
				{
					spinner.setEnabled(false);
					spinner_1.setEnabled(false);
				}
				else{
					spinner.setEnabled(true);
					spinner_1.setEnabled(true);
				}
			}
		});
		checkBox.setFont(new Font("仿宋", Font.PLAIN, 16));
		checkBox.setBounds(600, 20, 100, 20);
		frame.getContentPane().add(checkBox);
		checkBox.setSelected(false);

		GregorianCalendar gc=new GregorianCalendar(); //當前日期的前一個月
		gc.setTime(new Date());
		gc.add(2, -1);		
		SpinnerModel dateModel=null;
		dateModel = new SpinnerDateModel(gc.getTime(), null, null,Calendar.DAY_OF_MONTH);
		spinner = new JSpinner();
		spinner.setFont(new Font("仿宋", Font.BOLD, 14));
		spinner.setBounds(270, 20, 105, 20);
		frame.getContentPane().add(spinner);
		spinner.setModel(dateModel);  
		spinner.setEditor(new JSpinner.DateEditor(spinner,"yyyy-MM-dd"));		

		SpinnerModel dateModel_1=null;
		dateModel_1 = new SpinnerDateModel(new Date(), null, null,Calendar.DAY_OF_MONTH);
		spinner_1 = new JSpinner();
		spinner_1.setFont(new Font("仿宋", Font.BOLD, 14));
		spinner_1.setBounds(480, 20, 105, 20);
		frame.getContentPane().add(spinner_1);
		spinner_1.setModel(dateModel_1);  
		spinner_1.setEditor(new JSpinner.DateEditor(spinner_1,"yyyy-MM-dd"));			

		//new一個樹狀導航,選擇不同的報表種類
		tree = new JTree();
		tree.setShowsRootHandles(true);
		tree.setModel(new DefaultTreeModel(
				new DefaultMutableTreeNode("報表") {
					{
						DefaultMutableTreeNode node_1;
						node_1 = new DefaultMutableTreeNode("記錄");
						node_1.add(new DefaultMutableTreeNode("進貨記錄"));					
						node_1.add(new DefaultMutableTreeNode("銷售記錄"));
						node_1.add(new DefaultMutableTreeNode("報廢記錄"));
						add(node_1);
						node_1 = new DefaultMutableTreeNode("庫存");
						node_1.add(new DefaultMutableTreeNode("當前庫存"));
						add(node_1);
						node_1 = new DefaultMutableTreeNode("利潤");
						node_1.add(new DefaultMutableTreeNode("利潤統計"));
						add(node_1);
					}
				}
				));
		tree.addTreeSelectionListener(new TreeSelectionListener() {

			@Override
			public void valueChanged(TreeSelectionEvent e) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
				if(node == null)
					return;
				if (checkBox.isSelected()==false)  //日期鎖定后同意運行報表
				{
					JOptionPane.showMessageDialog(null, "請首先鎖定日期");
					return;	
				}

				Object select_node = node.getUserObject();
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// 創建指定格式的當前時間

				switch (select_node.toString()) {
				case "進貨記錄": //依據日期抓取進貨記錄
					String[] header1 = { "日期", "品名", "進貨數量", "單位", "進貨單位價格", "進貨總價"};// 設置表頭
					Object[][] item1 = new Object[0][6];// 設置單身
					model1 = new DefaultTableModel(item1, header1) {
						public boolean isCellEditable(int row, int column) {
							return false;
						}
					};// 創建一個model。並設置model數據不可編輯
					table = new JTable(model1);// 依據model創建一個Jtable
					table.setFocusable(false);// 關閉鼠標選中單個坐標	
					scrollPane_1.setViewportView(table);

					int r1 = model1.getRowCount();
					while(r1>0)
					{
						model1.removeRow(r1-1);
						r1--;
					}

					Object[] obj1 = new Object[6];
					ArrayList<Object[]> list1 = new OperationSqlData().getStockRecordByDate(df.format(spinner.getValue())+" "+"00:00:00", df.format(spinner_1.getValue())+" "+"23:59:59",0 , false);
					int row1 = list1.size();
					float cost = 0;
					for(int i=0; i<row1; i++)
					{
						obj1 = list1.get(i);
						model1.addRow(new Object[6]);
						int j = model1.getRowCount();
						model1.setValueAt(obj1[0], j-1, 0);
						model1.setValueAt(obj1[1], j-1, 1);
						model1.setValueAt(obj1[2], j-1, 2);
						model1.setValueAt(obj1[3], j-1, 3);
						cost = Float.parseFloat(obj1[4].toString())/Float.parseFloat(obj1[2].toString());
						cost = (float)(Math.round(cost*100))/100;
						model1.setValueAt(cost, j-1, 4);
						model1.setValueAt(obj1[4], j-1, 5);
					}	
					business = "stock";
					reportMouseClick();
					break;
				case "銷售記錄"://依據日期抓取銷售記錄			
					String[] header2 = { "日期", "品名", "銷售數量", "單位", "銷售單位價格", "銷售總價"};// 設置表頭
					Object[][] item2 = new Object[0][6];// 設置單身
					model2 = new DefaultTableModel(item2, header2) {
						public boolean isCellEditable(int row, int column) {
							return false;
						}
					};// 創建一個model,並設置model數據不可編輯
					table = new JTable(model2);// 依據model創建一個Jtable
					table.setFocusable(false);// 關閉鼠標選中單個坐標	
					scrollPane_1.setViewportView(table);

					int r2 = model2.getRowCount();
					while(r2>0)
					{
						model2.removeRow(r2-1);
						r2--;
					}

					Object[] obj2 = new Object[6];
					ArrayList<Object[]> list2 = new OperationSqlData().getSalesRecordByDate(df.format(spinner.getValue())+" "+"00:00:00", df.format(spinner_1.getValue())+" "+"23:59:59", false);
					int row2 = list2.size();
					for(int i=0; i<row2; i++)
					{
						obj2 = list2.get(i);
						model2.addRow(new Object[6]);
						int j = model2.getRowCount();
						model2.setValueAt(obj2[0], j-1, 0);
						model2.setValueAt(obj2[1], j-1, 1);
						model2.setValueAt(obj2[2], j-1, 2);
						model2.setValueAt(obj2[3], j-1, 3);
						model2.setValueAt(obj2[4], j-1, 4);
						model2.setValueAt(obj2[5], j-1, 5);
					}
					business = "sales";
					reportMouseClick();
					break;
				case "報廢記錄": //依據日期抓取報廢記錄
					String[] header3 = { "日期", "品名", "報廢數量", "單位", "成本單位價格", "報廢總成本"};// 設置表頭
					Object[][] item3 = new Object[0][6];// 設置單身
					model3 = new DefaultTableModel(item3, header3) {
						public boolean isCellEditable(int row, int column) {
							return false;
						}
					};// 創建一個model,並設置model數據不可編輯
					table = new JTable(model3);// 依據model創建一個Jtable
					table.setFocusable(false);// 關閉鼠標選中單個坐標	
					scrollPane_1.setViewportView(table);

					int r3 = model3.getRowCount();
					while(r3>0)
					{
						model3.removeRow(r3-1);
						r3--;
					}

					Object[] obj3 = new Object[6];
					ArrayList<Object[]> list3 = new OperationSqlData().getStockRecordByDate(df.format(spinner.getValue())+" "+"00:00:00", df.format(spinner_1.getValue())+" "+"23:59:59",-1 , false);
					int row3 = list3.size();
					float cost1 = 0;
					for(int i=0; i<row3; i++)
					{
						obj3 = list3.get(i);
						model3.addRow(new Object[6]);
						int j = model3.getRowCount();
						model3.setValueAt(obj3[0], j-1, 0);
						model3.setValueAt(obj3[1], j-1, 1);
						model3.setValueAt(obj3[2], j-1, 2);
						model3.setValueAt(obj3[3], j-1, 3);
						cost1 = Float.parseFloat(obj3[4].toString())/Float.parseFloat(obj3[2].toString());
						model3.setValueAt(cost1, j-1, 4);
						model3.setValueAt(obj3[4], j-1, 5);
					}
					business = "stock_waste";
					reportMouseClick();
					break;
				case "當前庫存":  //依據日期抓取進貨報廢和銷售記錄,計算當前庫存
					String[] header4 = {"品名", "庫存數量", "單位"};// 設置表頭
					Object[][] item4 = new Object[0][3];// 設置單身
					DefaultTableModel model4 = new DefaultTableModel(item4, header4) {
						public boolean isCellEditable(int row, int column) {
							return false;
						}
					};// 創建一個model,並設置model數據不可編輯
					table = new JTable(model4);// 依據model創建一個Jtable
					table.setFocusable(false);// 關閉鼠標選中單個坐標	
					scrollPane_1.setViewportView(table);

					int r4 = model4.getRowCount();
					while(r4>0)
					{
						model4.removeRow(r4-1);
						r4--;
					}

					Object[] obj4 = new Object[6];
					Object[] obj4_sales = new Object[4];
					ArrayList<Object[]> list4 = new OperationSqlData().getStockRecordByDate(df.format(spinner.getValue())+" "+"00:00:00", df.format(spinner_1.getValue())+" "+"23:59:59",0 , true);
					ArrayList<Object[]> list4_sales = new OperationSqlData().getSalesRecordByDate("0000-00-00 00:00:00", "9999-99-99 99:99:99", true);
					int row4 = list4.size();
					int row4_sales = list4_sales.size();
					float stock_last = 0;
					for(int i=0; i<row4; i++)
					{
						model4.addRow(new Object[3]);
						int j = model4.getRowCount();
						obj4 = list4.get(i);

						for (int k=0; k<row4_sales; k++)
						{
							obj4_sales = list4_sales.get(k);
							if (obj4_sales[0].toString().equals(obj4[0].toString()))
							{
								stock_last = Float.parseFloat(obj4[1].toString()) - Float.parseFloat(obj4_sales[1].toString());
								model4.setValueAt(stock_last, j-1, 1);
								break;
							}
							else 
							{
								model4.setValueAt(obj4[1], j-1, 1);
							}	
						}

						if (row4_sales == 0)
							model4.setValueAt(obj4[1], j-1, 1);
						model4.setValueAt(obj4[0], j-1, 0);
						model4.setValueAt(obj4[2], j-1, 2);
					}						

					break;
				case "利潤統計": //依據銷售利潤 報廢成本 統計終於凈利潤
					String[] header5 = { "品名", "銷售數量","報廢數量","單位", "平均銷售單位價格", "庫存成本單位價格", "銷售利潤", "報廢成本","凈利潤"};// 設置表頭
					Object[][] item5 = new Object[0][9];// 設置單身
					DefaultTableModel model5 = new DefaultTableModel(item5, header5) {
						public boolean isCellEditable(int row, int column) {
							return false;
						}
					};// 創建一個model,並設置model數據不可編輯
					table = new JTable(model5);// 依據model創建一個Jtable
					table.setFocusable(false);// 關閉鼠標選中單個坐標	
					scrollPane_1.setViewportView(table);	
					int r5 = model5.getRowCount();
					while(r5>0)
					{
						model5.removeRow(r5-1);
						r5--;
					}

					Object[] obj5_sales = new Object[4];
					Object[] obj5_waste = new Object[9];
					Object[] obj5 = new Object[9];
					ArrayList<Object[]> list5_sales = new OperationSqlData().getSalesRecordByDate(df.format(spinner.getValue())+" "+"00:00:00", df.format(spinner_1.getValue())+" "+"23:59:59", true);
					ArrayList<Object[]> list5_waste = new OperationSqlData().getStockRecordByDate(df.format(spinner.getValue())+" "+"00:00:00", df.format(spinner_1.getValue())+" "+"23:59:59", -1, true);

					int row5_sales = list5_sales.size();
					int row5_waste = list5_waste.size();

					for (int i=0; i<row5_sales; i++)
					{
						obj5_sales = list5_sales.get(i);
						float price = new OperationSqlData().getStockCostByGoodsName(obj5_sales[0].toString());
						price =  (float)(Math.round(price*100))/100;
						obj5[0] = obj5_sales[0];
						obj5[1] = obj5_sales[1];
						obj5[2] = 0.00;
						obj5[3] = obj5_sales[2];
						obj5[4] =  (float)(Math.round((Float.parseFloat(obj5_sales[3].toString())/Float.parseFloat(obj5_sales[1].toString()))*100))/100;				
						obj5[5] = price;
						obj5[6] = new BigDecimal(Float.parseFloat(obj5[1].toString())*(Float.parseFloat(obj5[4].toString())-price)).setScale(2, RoundingMode.HALF_UP);
						obj5[7] = 0.00;
						obj5[8] = obj5[6];
						for (int j=0; j<row5_waste; j++)
						{
							obj5_waste = list5_waste.get(j);
							if (obj5_waste[0].equals(obj5_sales[0]))
							{
								obj5[2] = obj5_waste[1];
								obj5[7] = obj5_waste[3];
								obj5[8] =  new BigDecimal(Float.parseFloat(obj5[6].toString()) + Float.parseFloat(obj5[7].toString())).setScale(2, RoundingMode.HALF_UP);
								list5_waste.remove(j);
								row5_waste =  row5_waste - 1;
								break;
							}
						}	

						model5.addRow(new Object[9]);
						int m = model5.getRowCount();
						model5.setValueAt(obj5[0], m-1, 0);
						model5.setValueAt(obj5[1], m-1, 1);
						model5.setValueAt(obj5[2], m-1, 2);					
						model5.setValueAt(obj5[3], m-1, 3);
						model5.setValueAt(obj5[4], m-1, 4);
						model5.setValueAt(obj5[5], m-1, 5);	
						model5.setValueAt(obj5[6], m-1, 6);					
						model5.setValueAt(obj5[7], m-1, 7);
						model5.setValueAt(obj5[8], m-1, 8);							
					}

					if (row5_waste > 0)
					{
						for(int k=0; k<row5_waste; k++)
						{
							obj5_waste = list5_waste.get(k);	
							obj5[0] = obj5_waste[0];
							obj5[1] = 0.00;
							obj5[2] = obj5_waste[1];
							obj5[3] = obj5_waste[2];
							obj5[4] = 0.00;
							float price = new OperationSqlData().getStockCostByGoodsName(obj5_waste[0].toString());
							price = (float)(Math.round(price*100))/100;
							obj5[5] = price;
							obj5[6] = 0.0;
							obj5[7] = obj5_waste[3];
							obj5[8] = Float.parseFloat(obj5_waste[3].toString());

							model5.addRow(new Object[9]);
							int m = model5.getRowCount();
							model5.setValueAt(obj5[0], m-1, 0);
							model5.setValueAt(obj5[1], m-1, 1);
							model5.setValueAt(obj5[2], m-1, 2);					
							model5.setValueAt(obj5[3], m-1, 3);
							model5.setValueAt(obj5[4], m-1, 4);
							model5.setValueAt(obj5[5], m-1, 5);	
							model5.setValueAt(obj5[6], m-1, 6);					
							model5.setValueAt(obj5[7], m-1, 7);
							model5.setValueAt(obj5[8], m-1, 8);					
						}
					}
					//最后一行插入利潤總計
					int row_last = model5.getRowCount();
					float sales_bft = 0;
					float stock_cost = 0;
					float last_bft = 0;
					for(int p=0; p<row_last; p++)
					{
						if (!(model5.getValueAt(p, 6)==null))
						{
							sales_bft =  sales_bft + Float.parseFloat(model5.getValueAt(p, 6).toString());
						}
						if (!(model5.getValueAt(p, 7)==null))
						{
							stock_cost = stock_cost + Float.parseFloat(model5.getValueAt(p, 7).toString());
						}
						if (!(model5.getValueAt(p, 8)==null))
						{
							last_bft = last_bft + Float.parseFloat(model5.getValueAt(p, 8).toString());
						}
					}
					sales_bft = (float)(Math.round(sales_bft*100))/100;
					stock_cost = (float)(Math.round(stock_cost*100))/100;
					last_bft = (float)(Math.round(last_bft*100))/100;


					model5.addRow(new Object[9]);
					model5.setValueAt("總計", row_last, 0);
					model5.setValueAt(sales_bft, row_last, 6);
					model5.setValueAt(stock_cost, row_last, 7);
					model5.setValueAt(last_bft, row_last, 8);
					break;					
				default:
					break;
				}
			}
		});

		scrollPane = new JScrollPane();
		scrollPane.setViewportView(tree);
		scrollPane.setBounds(10, 10, 160, screenHeight-10);
		frame.getContentPane().add(scrollPane);		

		scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(180, 50, screenWidth-200, screenHeight-50);
		frame.getContentPane().add(scrollPane_1);
	}

	class PopupActionListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			int answer = JOptionPane.showConfirmDialog(null,  "刪除數據不增加報表計算,確定要刪除選中記錄?", "提交信息",JOptionPane.YES_NO_OPTION);
			if (answer == 0)
			{
				int ret = 0;
				if (business.equals("stock"))
				{
					ret = new OperationSqlData().DeleteSqlDataByGoodsNameDate(model1.getValueAt(table.getSelectedRow(), 1).toString(), model1.getValueAt(table.getSelectedRow(), 0).toString(), "stock");
					model1.removeRow(table.getSelectedRow());
				}
				else if(business.equals("sales"))
				{
					ret = new OperationSqlData().DeleteSqlDataByGoodsNameDate(model2.getValueAt(table.getSelectedRow(), 1).toString(), model2.getValueAt(table.getSelectedRow(), 0).toString(), "sales");
					model2.removeRow(table.getSelectedRow());				
				}
				else if (business.equals("stock_waste"))
				{
					ret = new OperationSqlData().DeleteSqlDataByGoodsNameDate(model3.getValueAt(table.getSelectedRow(), 1).toString(), model3.getValueAt(table.getSelectedRow(), 0).toString(), "stock");	
					model3.removeRow(table.getSelectedRow());
				}

				if (ret == 1)
					JOptionPane.showMessageDialog(null, "刪除成功");
				else
					JOptionPane.showMessageDialog(null, "刪除失敗"); 
			}
		}
	}	

	ActionListener acitonListener = new PopupActionListener();   


	public void reportMouseClick()  //右鍵提供指定行區域刪除選項。處理選項事件
	{
		final JPopupMenu jp = new JPopupMenu();
		final JMenuItem item = jp.add("刪除該條記錄");
		item.addActionListener(acitonListener);

		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getButton() == MouseEvent.BUTTON3) {
					// 彈出菜單
					if(table.getSelectedRow() > -1)
					{
						int y = table.getSelectedRow() * table.getRowHeight();
						if(e.getY() > y && e.getY() <= y+16)
						{
							jp.show(table, e.getX(), e.getY());
						}
					}
				}
			}
		});  
	}
}


最后是數據庫操作部分:


package org.screen;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class OperationSqlData {
	//定義數據庫變量	
	private String  url;
	private String passname;
	private String password;
	private String driver;
	private Statement st;
	private Connection con;
	private ResultSet rst;	

	public OperationSqlData()  //構造數據庫鏈接默認值
	{
		passname = "admin";  //SQL Server登陸賬號
		password = "init1234";	//SQL Server登錄password
		driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //驅動載入
		try {
			Class.forName(driver);

		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(null, "數據庫載入失敗!");
			e.printStackTrace();
		}
		try {
			url = "jdbc:sqlserver://"+InetAddress.getLocalHost().getHostAddress()+";"+"DatabaseName=goodsData";//URL鏈接
		} catch (UnknownHostException e) {
			JOptionPane.showMessageDialog(null, "數據庫載入失敗!");
			e.printStackTrace();
		}	
	}

	public OperationSqlData(String p_name, String p_word)  //構造指定帳號密碼數據庫鏈接
	{
		passname = p_name; 
		password = p_word;
		driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
		try {
			Class.forName(driver);

		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(null, "數據庫載入失敗。");
			e.printStackTrace();
		}
		try {
			url = "jdbc:sqlserver://"+InetAddress.getLocalHost().getHostAddress()+";"+"DatabaseName=goodsData";
		} catch (UnknownHostException e) {
			JOptionPane.showMessageDialog(null, "數據庫載入失敗!");
			e.printStackTrace();
		}		
	}

	public void getGoodsNameToCombox(JComboBox<String> combox)
	{
		String sql = "SELECT distinct goods FROM stock where qty > 0";// 數據庫取品名
		// 連接數據庫,運行查詢語句
		try {
			con = DriverManager.getConnection(url, passname, password);
			con.setAutoCommit(true);
			st = con.createStatement();
			rst = st.executeQuery(sql);
			// 取出的結果增加combox的Item
			while (rst.next()) {
				combox.addItem(rst.getString("goods"));
			}

			// 關閉數據庫連接
			rst.close();
			st.close();
			con.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "商品名數據載入異常。 ");
			e.printStackTrace();
		}	   
	}

	public String getUnitByGoodsName(String goods) {
		String unit = null;
		//從庫存表抓取商品單位
		String sql = "SELECT distinct unit FROM stock WHERE qty> 0 AND goods = ?

"; try { con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(true); PreparedStatement ps = con.prepareStatement(sql); //SQL預處理 ps.setString(1, goods); //SQL參數 ResultSet rt = ps.executeQuery(); //運行SQL while(rt.next()) { unit = rt.getString("unit"); //從運行結果中得到商品單位 } // 關閉數據庫連接 ps.close(); rt.close(); con.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "商品單位數據載入異常!

"); e.printStackTrace(); } return unit; //返回單位 } public String getSalesPriceByGoodsName(String goods) { String sales_price = null; //從定價表中抓取銷售單位價格 String sql = "SELECT unitprice FROM Price WHERE goods = ?"; try { con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(true); PreparedStatement ps = con.prepareStatement(sql);// SQL預處理 ps.setString(1, goods); ResultSet rt = ps.executeQuery(); while(rt.next()) { sales_price = rt.getString("unitprice"); } // 關閉數據庫連接 ps.close(); rt.close(); con.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "銷售單位價格數據載入異常! "); e.printStackTrace(); } return sales_price; } public ArrayList<Object[]> getSalesRecordByDate(String date_begin, String date_end, Boolean sum_qty_totalprice) { ArrayList<Object[]> list = new ArrayList<Object[]>(); String sql = null; if (sum_qty_totalprice) { sql = "SELECT goods, SUM(qty) AS s_qty, unit, SUM(totalprice) AS s_totalprice FROM sales where date between ?

AND ? GROUP BY goods, unit";//抓取銷售記錄數據按商品名和單位匯總 } else{ sql = "SELECT date, goods, qty, unit, unitprice, totalprice FROM sales where date between ? AND ? ORDER BY date DESC";//抓取銷售記錄數據按時間排序 } try { con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(true); PreparedStatement ps = con.prepareStatement(sql);// SQL預處理 ps.setString(1, date_begin); //指定抓取銷售記錄起始時間 ps.setString(2, date_end); //指定抓取銷售記錄終止時間 ResultSet rt = ps.executeQuery(); Object[] obj = null; if (sum_qty_totalprice) { while(rt.next()) { obj = new Object[4];//Object數組增加arraylist obj[0] = rt.getString("goods"); obj[1] = rt.getFloat("s_qty"); obj[2] = rt.getString("unit"); obj[3] = rt.getFloat("s_totalprice"); list.add(obj); } } else{ while(rt.next()) { obj = new Object[6]; obj[0] = rt.getString("date"); obj[1] = rt.getString("goods"); obj[2] = rt.getFloat("qty"); obj[3] = rt.getString("unit"); obj[4] = rt.getFloat("unitprice"); obj[5] = rt.getFloat("totalprice"); list.add(obj); } } // 關閉數據庫連接 ps.close(); rt.close(); con.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "銷售記錄數據載入異常! "); e.printStackTrace(); } return list; } public float getStockCostByGoodsName(String goods) { float stock_cost = 0; // 這里計算的是商品進貨成本(qty>0) String sql = "SELECT goods,SUM(qty) AS s_qty,SUM(amount) AS s_amount FROM stock WHERE goods = ? AND qty>0 GROUP by goods"; try { con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(true); PreparedStatement ps = con.prepareStatement(sql);// SQL預處理 ps.setString(1, goods); ResultSet rt = ps.executeQuery(); while(rt.next()) { float s_amount = rt.getFloat("s_amount"); float s_qty = rt.getFloat("s_qty"); stock_cost = s_amount/s_qty; } // 關閉數據庫連接 ps.close(); rt.close(); con.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "成本數據載入異常! "); e.printStackTrace(); } return stock_cost; } public ArrayList<Object[]> getStockRecordByDate(String date_begin, String date_end, int status, Boolean sum_amount_qty) { ArrayList<Object[]> list = new ArrayList<Object[]>(); String sql = null; //sun_amount_qty是否根據商品名和單位加總庫存數量和成本, //status的值: -1計算報廢庫存。0計算總庫存; 1計算進貨庫存 if (sum_amount_qty) { if (status == -1) sql = "SELECT goods, SUM(qty) AS s_qty, unit, SUM(amount) AS s_amount FROM stock where qty < 0 AND date between ?

AND ? GROUP by goods,unit"; else if (status == 1) sql = "SELECT goods, SUM(qty) AS s_qty, unit, SUM(amount) AS s_amount FROM stock where qty > 0 AND date between ? AND ? GROUP by goods,unit"; else if (status == 0) sql = "SELECT goods, SUM(qty) AS s_qty, unit, SUM(amount) AS s_amount FROM stock where date between ? AND ? GROUP by goods,unit"; } else { if(status == -1) sql = "SELECT date, goods, qty, unit, amount FROM stock where qty < 0 AND date between ? AND ? ORDER BY date DESC"; else sql = "SELECT date, goods, qty, unit, amount FROM stock where qty > 0 AND date between ? AND ? ORDER BY date DESC"; } try { con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(true); PreparedStatement ps = con.prepareStatement(sql);// SQL預處理 ps.setString(1, date_begin); ps.setString(2, date_end); ResultSet rt = ps.executeQuery(); Object[] obj = null; if (sum_amount_qty) //根據是否匯總處理輸出結果 { while(rt.next()) { obj = new Object[4]; obj[0] = rt.getString("goods"); obj[1] = rt.getFloat("s_qty"); obj[2] = rt.getString("unit"); obj[3] = rt.getFloat("s_amount"); list.add(obj); } } else { while(rt.next()) { obj = new Object[5]; obj[0] = rt.getString("date"); obj[1] = rt.getString("goods"); obj[2] = rt.getFloat("qty"); obj[3] = rt.getString("unit"); obj[4] = rt.getFloat("amount"); list.add(obj); } } // 關閉數據庫連接 ps.close(); rt.close(); con.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "庫存數據載入異常! "); e.printStackTrace(); } return list; } public void CommitSalesStockPricingToSql(DefaultTableModel model, JTable table) //傳入用model定義的table { //這里先刪除原有定價記錄,再插入新紀錄 String sql1 = "DELETE FROM price WHERE goods = ? "; String sql2 = "INSERT INTO price (goods, unit, cost, unitprice) VALUES(?,?,?,?)"; try { // 設置數據庫鏈接,設置手動提交數據 con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(false); PreparedStatement ps1 = con.prepareStatement(sql1);// SQL預處理 PreparedStatement ps2 = con.prepareStatement(sql2);// SQL預處理 int line = table.getRowCount(); // 循環每一行,假設有值增加數據庫批處理 for (int i = 0; i < line; i++) { if(!(model.getValueAt(i, 5)==null)) //首先推斷是否有輸入值。再推斷是否為空值,有值則刪除 { if (!(model.getValueAt(i, 5).toString().isEmpty())) { ps1.setString(1, (String) model.getValueAt(i, 0)); ps1.addBatch(); ps2.setString(1, (String) model.getValueAt(i, 0)); ps2.setString(2, (String) model.getValueAt(i, 3)); ps2.setString(3, model.getValueAt(i, 4).toString()); ps2.setString(4, model.getValueAt(i, 5).toString()); ps2.addBatch(); } } } ps1.executeBatch();// 運行批處理。彈出對話消息。顯示成功失敗 con.commit(); //關閉數據庫相關鏈接 ps1.close(); int[] rt = ps2.executeBatch();// 運行批處理,彈出對話消息,顯示成功失敗 con.commit(); if (rt.length > 0) JOptionPane.showMessageDialog(null, "提交成功!"); ps2.close(); con.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "提交失敗! "); try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } } public Integer StockIn(String name, String qty, String unit, String amount) { int ret = 0; String sql = "INSERT INTO stock (goods, date, qty, unit, amount) VALUES (?

, ?, ?, ?

, ?

)"; // 定義SQL語句 try { con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(true); // 設置數據自己主動提交數據庫 PreparedStatement ps = con.prepareStatement(sql); // SQL預處理 ps.setString(1, name);// 動態參數運行SQL SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 創建指定格式的當前時間 ps.setString(2, df.format(new Date())); ps.setString(3, qty); ps.setString(4, unit); ps.setString(5, amount); ret = ps.executeUpdate(); // 運行SQL ps.close(); //關閉數據庫鏈接 con.close(); return ret; } catch (SQLException e) { e.printStackTrace(); return ret; } } public void CommitSalesToSql(DefaultTableModel model, JTable table) { // 插入銷售記錄到數據庫 String sql = "INSERT INTO sales (goods, date, qty, unit, unitprice, totalprice) VALUES (?, ?, ?, ?

, ?

, ?)";// 批量插入Jtable中數據 try { // 設置數據庫鏈接。設置手動提交數據 con = DriverManager.getConnection(url, passname, password); con.setAutoCommit(false); PreparedStatement ps = con.prepareStatement(sql);// SQL預處理 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 設置指定格式的當前日期時間 String date = df.format(new Date()); float f4 = 0; int line = table.getRowCount(); // 循環每一行。假設有值增加數據庫批處理 for (int i = 0; i < line; i++) { if ((String) model.getValueAt(i, 0) != null) { ps.setString(1, (String) model.getValueAt(i, 0)); ps.setString(2, date); float f1 = Float.parseFloat(model.getValueAt(i, 1).toString()); ps.setFloat(3, f1); ps.setString(4, (String)model.getValueAt(i, 2)); float f2 = Float.parseFloat(model.getValueAt(i, 3).toString()); ps.setFloat(5, f2); float f3 = Float.parseFloat(model.getValueAt(i, 4).toString()); ps.setFloat(6, f3); ps.addBatch(); f4 = f3 + f4; } } f4 = (float)(Math.round(f4*100))/100; // 彈出選擇對話框,計算總金額,提示是否提交 int answer = JOptionPane.showConfirmDialog(null, "總金額" + f4 + "元" + " " + "確認提交?", "提交信息", JOptionPane.YES_NO_OPTION); if (answer == 0) { int rst[] = ps.executeBatch();// 運行批處理,彈出對話消息。顯示成功失敗 if (rst.length > 0) { JOptionPane.showMessageDialog(null, "交易成功"); con.commit(); } else if(rst.length == 0) { JOptionPane.showMessageDialog(null, "無數據"); } } //關閉數據庫相關鏈接 ps.close(); con.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "交易失敗"); try { con.rollback(); con.close(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } } public Integer DeleteSqlDataByGoodsNameDate(String goods, String date, String business) { String sql = null; int ret = 0; if(business.equals("stock")||business.equals("stock_waste")) sql = "DELETE FROM stock where goods = ?

AND date = ?

"; else if (business.equals("sales")) sql = "DELETE FROM sales where goods = ?

AND date = ?"; // 連接數據庫。運行查詢語句 try { con = DriverManager.getConnection(url, passname,password); con.setAutoCommit(false); // 設置數據自己主動提交數據庫 PreparedStatement ps = con.prepareStatement(sql); // SQL預處理 ps.setString(1, goods); ps.setString(2, date); ret = ps.executeUpdate(); // 運行SQL con.commit(); ps.close(); //關閉數據庫鏈接 con.close(); return ret; } catch (SQLException e) { try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); return ret; } } public void DeleteSqlDataByYear(String date_last)//清理數據庫舊記錄 { String sql1 = "DELETE FROM stock where date < ?

"; String sql2 = "DELETE FROM sales where date < ?

"; int answer = JOptionPane.showConfirmDialog(null, "確認要刪除"+date_last+"之前的數據? ", "提交信息", JOptionPane.YES_NO_OPTION); if (answer != 0) { return; } // 連接數據庫。運行查詢語句 try { con = DriverManager.getConnection(url, passname,password); con.setAutoCommit(false); // 設置數據不自己主動提交數據庫 PreparedStatement ps1 = con.prepareStatement(sql1); // SQL預處理 ps1.setString(1, date_last); ps1.executeUpdate(); // 運行SQL PreparedStatement ps2 = con.prepareStatement(sql2); // SQL預處理 ps2.setString(1, date_last); ps2.executeUpdate(); // 運行SQL con.commit(); ps1.close(); //關閉數據庫鏈接 ps2.close(); con.close(); JOptionPane.showMessageDialog(null, "清除數據成功!

"); } catch (SQLException e) { try { con.rollback(); //失敗回滾 } catch (SQLException e1) { e1.printStackTrace(); } JOptionPane.showMessageDialog(null, "清除數據失敗"); e.printStackTrace(); } } }




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM