/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

[Tự Học Java] MOB1014-Java 1 - Bài 2 - Java Exceptions - Try...Catch P2/2

NỘI DUNG:
1. Try Catch là gì?
2. Từ khóa Final
3. Các kiểu exception


THỰC HIỆN:

1. Try Catch là gì?
Khi chạy chương trình, có rất nhiều loại lỗi khác nhau có thể xảy ra như: lỗi do người viết code, lỗi cú pháp, sai thông thông tin đầu vào, ... và những lỗi mà không thể lường trước được. Và khi có lỗi, Java sẽ dừng lại và hiện thị thông tin lỗi ra màn hình, chúng ta thường được gọi là 'throw an exception/error'.

Try Catch có nhiệm vụ bắt (Catch) các lỗi mà thực tế có thể xảy ra để xử lý sao cho chương trình thân thiện với người dùng hơn, và chương trình của chúng ta có thể chạy tiếp tục.

Cú pháp:
try {
            //  KHỐI LỆNH cần thực thi
     }
     catch(Exception e) { //tham số e là tên lỗi muốn xử lý
            //  KHỐI LỆNH xử lý lỗi
     }

Ví dụ 1: Viết chương trình đọc dữ liệu nhập vào từ bàn phím, nếu dữ liệu nhập vào là số thì hiển thị thông báo "Bạn đã nhập đúng" ngược lại hiển thị "Dữ liệu bạn nhập không phải là số"

Code:
public class Vidu_2_2_trycatch {
    public static void main(String[] args) {
        int a;
        Scanner duLieuNhap = new Scanner(System.in);   
        try {
            System.out.print("Nhap so: ");
            a = duLieuNhap.nextInt();
            System.out.println("Ban da nhap dung!");
        }catch(Exception ex){
            System.out.println("Du lieu ban nhap KHONG PHAI so!");

        }
    }
}

2. Từ khóa Final
Có ý nghĩa sẽ chạy những dòng code sau khi kết thúc try catch, nó không quan tâm là try ... catch có lỗi hay không.

Ví dụ 2:
public class Vidu_2_2_trycatch {
    public static void main(String[] args) {
        int a;
        Scanner duLieuNhap = new Scanner(System.in);   
        try {
            System.out.print("Nhap so: ");
            a = duLieuNhap.nextInt();
            System.out.println("Ban da nhap dung!");
        }catch(Exception ex){
            System.out.println("Du lieu ban nhap KHONG PHAI so!");

        }finally {
            System.out.println("Try catch da CHAY XONG, code nay chay SAU CUNG.");
        }
    }
}

3. Các kiểu exceptionCó 2 kiểu ngoại lệ trong Java:
  • Checked Exceptions: Các ngoại lệ này thường là bị buộc phải bắt hoặc khai báo. Nếu quy tắc này không được tuân theo thì trình biên dịch sẽ không thực thi chương trình.
  • Unchecked Exceptions và error: Ngoại lệ này thường là do viết code sai, truyền đối null hoặc tham số không chính xác...
Các ngoại lệ kiểu Checked Exceptions phổ biến:
  • IOException: Ngoại lệ liên quan đến file input / output
  • SQLException: Ngoại lệ liên quan đến cú pháp SQL
  • DataAccessException: Ngoại lệ liên quan đến việc truy cập CSDL
  • ClassNotFoundException: Bị ném khi JVM không thể tìm thấy một lớp mà nó cần, do lỗi dòng lệnh, sự cố đường dẫn hoặc tệp, class bị thiếu...
  • InstantiationException: Ngoại lệ khi cố gắng tạo đối tượng của một abstract class hoặc interface

Các ngoại lệ kiểu Unchecked Exceptions phổ biến:
  • NullPointerException: Ngoại lệ bị ném ra khi cố gắng truy cập một đối tượng có biến tham chiếu có giá trị hiện tại là null
  • ArrayIndexOutOfBound: Ngoại lệ khi cố gắng truy cập một phần tử vượt quá độ dài của mảng
  • IllegalArgumentException: Ngoại lệ bị ném ra khi một phương thức nhận được một đối số được định dạng khác với phương thức mong đợi.
  • IllegalStateException: Ngoại lệ bị ném ra khi trạng thái của môi trường không phù hợp với hoạt động cố gắng thực hiện, ví dụ: Sử dụng Scanner đã bị đóng.
  • NumberFormatException: Ngoại lệ bị ném khi một phương thức chuyển đổi một Chuỗi thành số nhưng không thể chuyển đổi.
  • ArithmeticException: Lỗi số học, chẳng hạn như chia cho 0.

P/s: Try ... catch chạy rất tốn tài nguyên, nên khi code chúng ta nên hạn chế nhất có thể việc sử dụng try catch

xong!

[Tự Học Java] MOB1014-Java 1 - Bài 2 - Toán Tử, Kiểu Dữ Liệu, Ép Kiểu, Cấu Trúc Rẽ Nhánh P1/2

NỘI DUNG:
1. Toán tử
2. Kiểu Dữ Liệu
3. Cấu trúc rẽ nhánh
4. Cách gọi hàm trong java
5. Bài tập làm thêm
  • Giải phương trình bậc nhất
  • Giải phương trình bậc hai
  • Tính tiền điện
  • Viết chương trình tổ chức menu để gọi các yêu cầu trên

THỰC HIỆN
1. Toán tử
1.1: Toán tử toán học
Toán Tử Giải Thích Ví Dụ
+ Phép cộng a + b
- Phép trừ a - b
* Phép nhân a * b
/ Phép chia lấy nguyên a / b
% Phép chia lấy dư 5 % 2 = 1; vì 5 chia 2 bằng 2 DƯ 1
++ Tăng giá trị ... lên 1 đơn vị ++a
-- Giảm giá trị ... xuống 1 đơn vị --a

Ví dụ 1.1.1
public class Vidu_1_1_toantu_sohoc {
    public static void main(String[] args) {
        int a = 20;
        int b = 3;
        System.out.println("a + b = " + (a + b));
        System.out.println(a + " - " + b + " = " + (a - b));
        System.out.printf("%d * %d = %d %n", a, b, a * b);
        System.out.printf("%d / %d = %d LAY PHAN NGUYEN%n", a, b, a / b); // 20 / 3 = 6 du 2. Lay PHAN NGUYEN
        System.out.printf("%d %% %d = %d LAY PHAN DU%n", a, b, a % b); // 20 / 3 = 6 du 2. Lay PHAN DU
    }
}

Ví dụ 1.1.2
public class Vidu_1_1_toantu_congcong_trutru {
    public static void main(String[] args) {
        int a = 1;
        System.out.println(a++); // IN ra roi moi tang
        System.out.println(++a); // TANG roi moi in
        
        System.out.println(a+++1); // CONG 1, In ra roi tang them 1
        System.out.println(++a+1); // TANG 1, CONG 1, IN ra
        System.out.println(a);
                  
    }
}

Ví dụ 1.1.3
public class Vidu_1_1_toantu_congcong_trutru {
    public static void main(String[] args) {
        int a = 1;
        System.out.println(a++); // IN ra roi moi tang
        System.out.println(++a); // TANG roi moi in
        
        System.out.println(a+++1); // CONG 1, In ra roi tang them 1
        System.out.println(++a+1); // TANG 1, CONG 1, IN ra
        System.out.println(a);
                  
    }
    public static void main_trutru_truoc(String[] args) {
        int a = 20;
        int b = 0;

        // gán b = a - 1
        b = --a;
        System.out.println("a = " + a);
        System.out.println("b = " + b);        
                
    }    
    public static void main_congcong_truoc(String[] args) {
        int a = 20;
        int b = 0;

        // gán b = a + 1
        b = ++a;
        System.out.println("a = " + a);
        System.out.println("b = " + b);        
                
    }    
    public static void main_trutru_sau(String[] args) {
        int a = 20;
        int b = 0;

        // gán b = a, sau do GIAM a xuong 1 don vi
        b = a--;
        System.out.println("a = " + a);
        System.out.println("b = " + b);        
                
    }
    public static void main_congcong_sau(String[] args) {
        int a = 20;
        int b = 0;
        
        // gán b = a, sau do TANG a len 1 don vi
        b = a++;
        System.out.println("a = " + a);
        System.out.println("b = " + b);    
                
    }
}

1.2: Toán tử gán
Toán Tử Ví Dụ Giá Trị Tương Đương
= a = 5 a = 5
+= a += 5 a = a + 5
-= a -= 5 a = a - 5
-= a -= 5 a = a - 5
*= a *= 5 a = a * 5
/= a /= 5 a = a / 5
%= a %= 5 a = a % 5

1.3 Toán tử so sánh:
Toán Tử Giải Thích Ví Dụ
== Bằng a == b
!= Không bằng hay khác a != b
> Lớn hơn a > b
< Nhở hơn a < b
>= Lớn hơn hoặc bằng a >=b
<= Nhở hơn hoặc bằng a <= b

Ví dụ:
public class Vidu_1_3_toantu_sosanh {
    public static void main(String[] args) {
        int a = 20;
        int b = 10;
        boolean ketQua = false;

        ketQua = a == b;
        System.out.println(a + " = " + b + " la: " + ketQua );

        ketQua = a != b;
        System.out.println(a + " != " + b + " la: " + ketQua );
        
        ketQua = a > b;
        System.out.println(a + " > " + b + " la: " + ketQua );

        ketQua = a < b;
        System.out.println(a + " < " + b + " la: " + ketQua );  
        
        ketQua = a <= b;
        System.out.println(a + " <= " + b + " la: " + ketQua ); 
        
        ketQua = a >= b;
        System.out.println(a + " >= " + b + " la: " + ketQua );         
        
    }
}


1.4 Toán tử logic:
Toán Tử Tên Giải Thích Ví Dụ
&& Nếu tất cả các giá trị đúng thì trả về giá trị True x < 5 && x < 10
|| Hoặc Trả về giá trị True nếu trong các giá trị là true x < 5 || x < 4
! Phủ định, đảo ngược kết quả, trả về false nếu kết quả trả về là True !(x < 5 && x < 10)

Ví dụ:
public class Vidu_1_4_toantu_logic {
    public static void main(String[] args) {
        int a = 20;
        int b = 10;
        boolean ketQua = false;
        
        ketQua = (a > b) && (a >= b);
        //ketQua = true && true => true
        System.out.println(ketQua);
        
        ketQua = (a > b) || (a >= b);
        //ketQua = true || true => true
        System.out.println(ketQua);   
        
        ketQua = !(a > b) ;
        //ketQua = true  lấy phủ định => false
        System.out.println(ketQua);
    }
}

2. Kiểu dữ liệu
  • Kiểu Nguyên Thủy
Kiểu Độ dài (bit) Phạm vi biểu diễn
byte 8 -128 đến 127
char 16 '\u0000' đến '\uFFFF'
boolean 1 'true' hoặc 'false'
short 16 -32768 đến 32767
int 32 -2,147,483,648 đến 2,147,483,647
long 64 -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807
float 32 1.2E-38 tới 3.4E+38
double 64 2.3E-308 tới 1.7E+308

  • Giá trị hằng - Literal: Các dữ liệu có giá trị cố định, được thể hiện trực tiếp trong chương trình mà không cần qua tính toán và có thể được gán cho bất kỳ kiểu dữ liệu nguyên thủy nào trong Java
Ví dụ:
public class Vidu_2_kieudulieu_literal {
    public static void main(String[] args) {
        int i = 1234;
        double d = 12.34;
        char ch = 'A';
        String str = "Literal trong Java";
        boolean b = false;
        
        System.out.println(i);
        System.out.println(d);
        System.out.println(ch);
        System.out.println(str);
        System.out.println(b);
        
    }
}

  • Hằng số: Hằng cũng tương tự như biến, nhưng đặc biệt ở chỗ nếu một biến được khai báo là hằng thì nó sẽ không được thay đổi giá trị trong suốt chương trình. Để khai báo một hằng số, bạn cũng khai báo giống như biến nhưng thêm final vào trước khai báo.
Ví dụ:
final int NAM_SINH = 2003;
final char KY_TU = 'D';

  • Chuyển đổi kiểu dữ liệu - Ép kiểu - Type Casting
- Nới rộng - Widening Casting (automatically): Chuyển đổi kiểu dữ liệu có kích thước nhỏ sang kiểu dữ liệu có kích thước lớn hơn (byte-> short-> char-> int-> long-> float->double) nhưng KHÔNG LÀM MẤT THÔNG TIN

Ví dụ:
public class Vidu_2_epkieu_tudong {
    public static void main(String[] args) {
    int soNguyen = 9;
    double soDouble = soNguyen; // tu dong chuyen int to double

    System.out.println(soNguyen);      // Outputs 9
    System.out.println(soDouble);   // Outputs 9.0
  }
}
- Thu hẹp - Narrowing Casting (manually): Chuyển đổi kiểu dữ liệu có kích thước lớn sang kiểu dữ liệu có kích thước nhỏ hơn (double -> float -> long -> int -> char -> short -> byte) sẽ LÀM MẤT THÔNG TIN

Ví dụ:
public class Vidu_2_epkieu_thucong {
    public static void main(String[] args) {
    double soDouble = 9.78d;
    int soNguyen = (int) soDouble; // tu dong chuyen double to int

    System.out.println(soDouble);   // Outputs 9.78
    System.out.println(soNguyen);      // Outputs 9
  }
}

3. Cấu trúc rẽ nhánh
3.1 Mệnh đề IF
  • Dạng thiếu:
Ví dụ 3.1.1: 
Viết chương trình nhập đọc số Interger từ bàn phím và in ra: Nếu số nhập vào > 18 thì in ra dòng chữ "Ban duoc phep uong BIA"

Code:
import java.util.Scanner; 
public class Vidu_3_1_1_dangthieu {
    public static void main(String[] args) {
        int soNguyen;
        Scanner duLieuvao = new Scanner(System.in);
        System.out.print("Nhap vao so nguyen: ");            
        soNguyen = duLieuvao.nextInt();
        
        if (soNguyen > 18){
            System.out.println("Ban duoc phep uong BIA");
        }
    }
}

  • Dạng đầy đủ:
Ví dụ 3.1.2: 
Viết chương trình nhập đọc số Interger từ bàn phím và in ra: Nếu số nhập vào > 18 thì in ra dòng chữ "Ban duoc phep uong BIA", ngược lại (< 18) thì in ra dòng chữ "Ban chi duoc uong NUOC NGOT"

Code:
import java.util.Scanner; 
public class Vidu_3_1_2_dangdu{
    public static void main(String[] args) {
        int soNguyen;
        Scanner duLieuvao = new Scanner(System.in);
        System.out.print("Nhap vao so nguyen: ");            
        soNguyen = duLieuvao.nextInt();
        
        if (soNguyen > 18){
            System.out.println("Ban duoc phep uong BIA");
        } else {
            System.out.println("Ban chi duoc uong NUOC NGOT");
        }
    }
}

  • Dạng IF ... ELSE IF ... ELSE:
Ví dụ 3.1.3:
Viết chương trình nhập đọc số Interger từ bàn phím và in ra, nếu số nhập vào:
  • < 5:  in ra màn hình "YEU"
  • < 7:  in ra màn hình "Trung Binh"
  • ngược lại: in ra màn hình "Kha Gioi"
Code:
import java.util.Scanner; 
public class Vidu_3_1_3_ifelseifelse {
    public static void main(String[] args) {
        int soNguyen;
        Scanner duLieuvao = new Scanner(System.in);
        System.out.print("Nhap vao so nguyen (DIEM): ");            
        soNguyen = duLieuvao.nextInt();
        
        if (soNguyen < 5 ){
            System.out.println("YEU");
        } else if (soNguyen < 7) {
            System.out.println("Trung Binh");
        } else {
            System.out.println("Kha Gioi");
        }
    }
}
Ví dụ 3.1.4:
Viết chương trình nhập đọc số Interger từ bàn phím và in ra, nếu số nhập vào:
  • < 5:  in ra màn hình "YEU"
  • < 7:  in ra màn hình "Trung Binh"
  • < 9:  in ra màn hình "Kha"
  • ngược lại: in ra màn hình "Gioi"
Code:
import java.util.Scanner; 
public class Vidu_3_1_4 {
public static void main(String[] args) {
        int soNguyen;
        Scanner duLieuvao = new Scanner(System.in);
        System.out.print("Nhap vao so nguyen (DIEM): ");            
        soNguyen = duLieuvao.nextInt();
        
        if (soNguyen < 5 ){
            System.out.println("YEU");
        } else if (soNguyen < 7) {
            System.out.println("Trung Binh");
        } else if (soNguyen < 9) {
            System.out.println("Kha");
        } else {
            System.out.println("Gioi");
        }
    } 
}

Tuy nhiên với code trên chúng ta thấy dòng System.out.println lặp lại nhiều lần và nếu có thay đổi nội dung thông báo cũng rất bất tiện, nên chúng ta cũng có thể viết lại như sau:

Code:
public class Vidu_3_1_4 {
    public static void main(String[] args) {
        int soNguyen;
        String xepLoai = "";
        Scanner duLieuvao = new Scanner(System.in);
        System.out.print("Nhap vao so nguyen (DIEM): ");            
        soNguyen = duLieuvao.nextInt();
        
        if (soNguyen < 5 ){
            xepLoai = "YEU";
        } else if (soNguyen < 7) {
            xepLoai = "Trung Binh";
        } else if (soNguyen < 9) {
            xepLoai = "Kha";
        } else {
            xepLoai = "Gioi";
        }
        //System.out.println("Xep loai cua ban: " + xepLoai);
        // hoac
        System.out.printf("Xep loai cua ban: %s %n", xepLoai);
    } 
}

3.2 Switch ...case
Cũng tương tự như if ... else tuy nhiên nếu số trường hợp lớn 3 chúng ta nên dùng switch ... case để code dễ nhìn hơn.

Ví dụ 3.2:
Viết chương trình nhập đọc số Interger từ bàn phím và in ra, nếu số nhập vào:
  • 2: Thứ hai
  • 3: Thứ ba
  • 4: Thứ tư
  • 5: Thứ năm
  • 6: Thứ sau
  • 7: Thứ 7
  • 8: Chủ nhật
  • 1: Chủ nhật
  • Không phải các số trên: không hợp lệ

Code:
import java.util.Scanner;
public class Vidu_3_2 {
    public static void main(String[] args) {
        int soNguyen;
        String ketQua = "";
        Scanner duLieuvao = new Scanner(System.in);
        System.out.print("Nhap vao so nguyen: ");            
        soNguyen = duLieuvao.nextInt();
        switch (soNguyen) {
            case 2:
                ketQua = "Thu hai";
                break; // dùng break để thoát khỏi switch
            case 3:
                ketQua = "Thu ba";
                break;
            case 4:
                ketQua = "Thu tu";
                break;
            case 5:
                ketQua = "Thu nam";
                break;
            case 6:
                ketQua = "Thu sau";
                break;  
            case 7:
                ketQua = "Thu bay";
                break;   
            case 1: // vì không có break nên chương trình tiếp tục chuyển sang case 8
            case 8:
                ketQua = "CHU NHAT";
                break;                
            default:
                ketQua = "KHONG HOP LE!";
        }
        System.out.println(ketQua);
    }
}

Ngoài ra chúng ta cũng còn có cách viết khác
public class Vidu_3_2 {
    public static void main(String[] args) {
        int soNguyen;
        String ketQua = "";
        Scanner duLieuvao = new Scanner(System.in);
        System.out.print("Nhap vao so nguyen: ");            
        soNguyen = duLieuvao.nextInt();
        ketQua = switch (soNguyen) {
            case 2 -> "Thu hai";
            case 3 -> "Thu ba";
            case 4 -> "Thu tu";
            case 5 -> "Thu nam";
            case 6 -> "Thu sau";
            case 7 -> "Thu bay";
            case 1, 8 -> "CHU NHAT";
            default -> "KHONG HOP LE!";
        }; 
        System.out.println(ketQua);
    }
}

4. Cách gọi hàm trong java
Viết chương trình mô phỏng máy tính điện tử với các yêu cầu:
  • Đọc số thứ nhất và số thứ hai là 2 số nguyên nhập từ bàn phím
  • Thực hiện các phép tính cộng, trừ, nhân, chia (phép toán yêu cầu người dùng nhập từ bàn phím), các phép tính viết theo dạng hàm.
Dùng switch ... case
Code :
import java.util.Scanner;

public class Vidu_4_goiham {
    public static void main(String[] args) {
        menu();
    }
    static void menu(){
        System.out.println("1. Phep cong");
        System.out.println("2. Phep tru");
        System.out.println("3. Phep nhan");
        System.out.println("4. Phep chia");        
        System.out.println("0. KET THUC CHUONG TRINH");
        
        Scanner scanner = new Scanner(System.in);
        System.out.print("Chon chuc nang?: ");
        int so = scanner.nextInt();
        switch(so){
            case 1: phepCong(); break;
            case 2: phepTru(); break;
            case 3: phepNhan(); break;
            case 4: phepChia(); break;
            case 0: // khong lam gi ca
            default: System.exit(0); // các so khong phai la cac phep tinh
        }
        //...
    }        
        static void phepCong(){
            Scanner in = new Scanner(System.in);
            System.out.print("Nhap a: ");
            int a = in.nextInt();
            System.out.print("Nhap b: ");
            int b = in.nextInt();
            System.out.println( a + " + " + b + " = " + ( a + b));        
        }
        static void phepTru(){ // xuat ra theo kieu co dinh dang
            Scanner in = new Scanner(System.in);
            System.out.print("Nhap a: ");
            int a = in.nextInt();
            System.out.print("Nhap b: ");
            int b = in.nextInt();
            int c = a - b;
            System.out.printf("%d - %d = %d %n", a, b, c); // in ket qua xong xuong hang
        } 
        static void phepNhan(){
            System.out.println ("PHEP NHAN cac ban tu lam");
        }
        
        static void phepChia(){
            System.out.println ("PHEP CHIA cac ban tu lam");
        }
}

Dùng IF ... ELSE
Các bạn tự làm!


5. Bài tập làm thêm
  • Giải phương trình bậc nhất: Viết chương trình cho phép giải phương trình bậc nhất trong đó các hệ số a và b nhập từ bàn phím

Code:
import java.util.Scanner;
public class Lab_2_1_phuongtrinh_bacnhat {
        public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a,b;
        System.out.print("Nhap he so a: ");
        a = scan.nextInt();
        System.out.print("Nhap he so b: ");
        b = scan.nextInt();
        if(a==0){
            if(b==0){
                System.out.println("PT vo so nghiem!");
            }else{
                System.out.println("PT vo nghiem");
            }
        }else{
            System.out.println("Nghiem x="+(-b/a));
        }
    }
}

  • Giải phương trình bậc hai:  Viết chương trình cho phép giải phương trình bậc hai trong đó các hệ số a, b và c nhập từ bàn phím
Code:
import java.util.Scanner;
public class Lab_2_2_phuongtrinh_bachai {
    public static void main(String[] args) {
        double a, b, c, delta, x1, x2;
        Scanner scan = new Scanner(System.in);
          
        System.out.println("Giai phuong trinh bac hai:");
        System.out.print("Nhap he so a: ");
        a = scan.nextDouble();
        System.out.print("Nhap he so b: ");
        b = scan.nextDouble();
        System.out.print("Nhap he so c: ");
        c = scan.nextDouble();

        delta = (b * b) - (4 * a * c);
           if(delta>0){
                System.out.println("Phuong trinh da cho co hai nghiem.");
                x1 = ((-b) + Math.sqrt(delta)) / (2 * a);
                x2 = ((-b) - Math.sqrt(delta)) / (2 * a);
                System.out.println("x1 = "+ x1);
                System.out.println("x2 = " + x2);
           }else if(delta==0){
                System.out.println("Phuong trinh da cho co hai nghiem kep.");
                x1 = x1 = (-b) / (2 * a);
                System.out.println("x1 = x2 = " + x1);
           }else{
               System.out.println("Phuong trinh da cho vo nghiem.");
           }          
    } 
}

  • Tính tiền điệnViết chương trình nhập vào số điện sử dụng của tháng và tính tiền điện theo phương pháp lũy tiến
Code:
import java.util.Scanner;
public class Lab_2_3_tinhtiendien {
    public static void main(String[] args) {
        int sodien;
        Scanner scan = new Scanner(System.in); 
        System.out.print("So kg dien: ");
        sodien = scan.nextInt();
        System.out.println("----------------");
        if(sodien <= 50){
            System.out.println("So kg dien: "+sodien);
            System.out.println("So tien:"+(sodien*1000));
        }else{
            System.out.println("So kg dien: "+sodien);
            System.out.println("So kg dien vuot han muc: "+(sodien-50));
            System.out.println("So tien:"+((50*1000)+(sodien - 50)*1200));
        }
    }
}

  • Menu: Viết chương trình tổ chức 1 menu gồm 3 chức năng để gọi 3 bài trên và một chức năng để thoát khỏi ứng dụng

Code:
import java.util.Scanner;
public class Lab_2_4_menu {
    public static void main(String[] args) {
        menu(args);
    }   
    static void menu(String[] args){
        System.out.println("1. Giai phuong trinh bac nhat");
        System.out.println("2. Giai phuong trinh bac 2");
        System.out.println("3. Tinh tien dien");
        System.out.println("0. Exit");
        Scanner scanner = new Scanner(System.in);
        System.out.print("Chon chuc nang?: ");
        int luaChon = scanner.nextInt();
        switch(luaChon){
            case 1 -> Lab_2_1_phuongtrinh_bacnhat.main(args);
            case 2 -> Lab_2_2_phuongtrinh_bachai.main(args);
            case 3 -> Lab_2_3_tinhtiendien.main(args);
            case 0 -> System.exit(0);
        }
    }
}

Hoặc các bạn cũng có thể viết các gọi hàm thông thường (Viết nhiều hàm trong 1 file, tham khảo mục 4)

Xong!

[Tự Học Java] MOB1014-Java 1 - Bài 1 - Java Output/Java User Input (Scanner) & Scanner và Math

NỘI DUNG:
1. System.out - Xuất kết quả ra màn hình
  • System.out.print()
  • System.out.println()
  • System.out.printf()
2. Java User Input (Scanner) - Nhận giá trị user nhập vào từ bàn phím

3. Hàm toán học: Tính chu vi, diện tích, thể tích, căn bậc 2


THỰC HIỆN:

1. System.out - Xuất kết quả ra màn hình

In ra dòng chữ/chuỗi ký tự "Xin chào.!"
System.out.println("Xin Chào!");

Chúng ta cũng có thể in ra nhiều dòng với phương thức println()
System.out.println("Xin Chào!");
System.out.println("Tôi đang tìm hiểu về java");
System.out.println("Đây là chương trình đầu tiên của tôi");

Ngoài ra chúng ta cũng có thể in ra các số hoặc các phép tính toán học
System.out.println(3 + 3); // kết quả sẽ in ra màn là 6

Noted: Nếu in ra ra chuỗi ký tự thì chúng ta phải đặt chúng vào trong cặp dấu nháy kép, nếu ra số thì không cần

Java Output: Ngoài phương thức println() chúng ta còn có phương thức print(). 
Sự khác nhau giữa 2 phương thức này là:
  • println(): Chèn thêm dòng mới/hay xuống hàng sau mỗi kết quả in ra.
  • print(): KHÔNG XUỐNG HÀNG sau mỗi kết quả in ra.
Others:
printf(): Xuất kết quả có định dạng. 
  • %s: chuỗi
  • %f: số thực
  • %d: số nguyên
  • %n: xuống hàng
  • ...

Ví dụ:
System.out.printf("Tôi năm nay %d tuổi", 18);

2. Java User Input (Scanner) - Nhận giá trị user nhập vào từ bàn phím

Ví dụ 2.1: 
Nhập chuỗi(họ và tên) xuất chuỗi vừa nhập ra màn hình

Code:
import java.util.Scanner;  // Import thư viện Scanner (class)

public class UserInput { 
    public static void main(String[] args) {
        Scanner duLieuvao = new Scanner(System.in);  // khởi tạo đối tượng
        System.out.print("Ho va Ten: ");
        String hoTen = duLieuvao.nextLine();  // Đọc dữ liệu nhập vào
        
        System.out.println("Xin Chao : " + hoTen);  // Xuất kết quả ra màn hình
        
  }
 }

  • duLieuvao.nextLine(): đọc dữ liệu nhập vào là kiểu chuỗi
  • duLieuvao.nextInt(): đọc dữ liệu nhập vào là kiểu số nguyên
  • duLieuvao.nextDouble(): đọc dữ liệu nhập vào là kiểu số thực
  • ngoài ra còn có các kiểu nextBoolean(), nextFloat(), nextByte(), ...
  • ...
Ví dụ 2.2:
Nhập vào họ tên, năm sinh, mức lương. Xuất các giá trị vừa nhập ra màn hình

Code:
import java.util.Scanner; 
public class UserInput_Vidu2 {
    public static void main(String[] args) {
        Scanner duLieuvao = new Scanner(System.in);
        String hoTen;
        int namSinh;
        double mucLuong;
        
        System.out.print("Nhap vao ten: ");            
        hoTen = duLieuvao.nextLine(); // string

        System.out.print("Nam sinh cua ban: ");            
        namSinh = duLieuvao.nextInt(); // doc du lieu nhap vao so nguyen interger
        
        System.out.print("Muc luong: ");            
        mucLuong = duLieuvao.nextDouble(); // doc du lieu nhap vao kieu so thuc
        
        // Xuat ket qua
        System.out.println("--------------------");
        System.out.println("Ten cua ban la: " + hoTen);
        System.out.println("Sinh nam: " + namSinh);
        System.out.println("Muc luong: " + mucLuong);
    }
}


Hoặc các bạn có thể viết:
Ví dụ 2.1

Code:
import java.util.Scanner; 
public class UserInput_Vidu2_1 {
    public static void main(String[] args) {
        Scanner duLieuvao = new Scanner(System.in);
        String hoTen;
        int namSinh;
        double mucLuong;
        
        System.out.print("Nhap vao TEN, NAM SINH, MUC LUONG: ");            
        hoTen = duLieuvao.nextLine(); // string
            
        namSinh = duLieuvao.nextInt(); // doc du lieu nhap vao so nguyen interger
       
        mucLuong = duLieuvao.nextDouble(); // doc du lieu nhap vao kieu so thuc
        
        // Xuat ket qua
        System.out.println("--------------------");
        System.out.println("Ten cua ban la: " + hoTen);
        System.out.println("Sinh nam: " + namSinh);
        System.out.println("Muc luong: " + mucLuong);
    }
}


Ví dụ 3:
Nhập vào họ tên, năm sinh, mức lương. Xuất các giá trị vừa nhập ra màn hình theo kiểu format (gợi ý dùng phương thức printf)

Code:
import java.util.Scanner; 
public class UserInput_Vidu3 {
    public static void main(String[] args) {
        Scanner duLieuvao = new Scanner(System.in);
        String hoTen;
        int namSinh;
        double mucLuong;
        
        System.out.print("Nhap vao ten: ");            
        hoTen = duLieuvao.nextLine(); // string

        System.out.print("Nam sinh cua ban: ");            
        namSinh = duLieuvao.nextInt(); // doc du lieu nhap vao so nguyen interger
        
        System.out.print("Muc luong: ");            
        mucLuong = duLieuvao.nextDouble(); // doc du lieu nhap vao kieu so thuc
        
        // Xuat ket qua
        System.out.println("--------------------");
        // Xuat ket qua dang format
        System.out.printf("Ten cua ban la: %s, Sinh nam: %d, Muc luong: %f", hoTen, namSinh, mucLuong);
        
        // Hoac xuong hang
        //System.out.printf("Ten cua ban la: %s, %nSinh nam: %d, %nMuc luong: %f", hoTen, namSinh, mucLuong);
        
    }
}


3. Hàm toán học

Ví dụ 3.1:
Viết chương trình nhập từ bàn phím 2 cạnh của hình chữ nhật. Tính và xuất chu vi, diện tích và cạnh nhỏ của hình chữ nhật.

Code:
import java.util.Scanner;
public class chuvi_dientich_min {
    public static void main(String[] args) {
        int dai, rong;
        float chuVi, dienTich, canhMin;
        Scanner in = new Scanner(System.in);
        System.out.print("Chieu dai: ");
        dai = in.nextInt();
        
        System.out.print("Chieu rong: ");
        rong = in.nextInt();
        
        chuVi = (dai + rong)*2;
        dienTich = dai * rong;
        canhMin = Math.min(dai, rong);
        System.out.println("Chu vi: " + chuVi);
        System.out.println("Dien tich: " + dienTich);
        System.out.println("Canh nho nhat: " + canhMin);
    }
}

Ví dụ 3.2
Viết chương trình nhập từ bàn phím cạnh của một khối lập phương. Tính và xuất thể tích của khối chữ nhật

Code:
import java.util.Scanner;
public class vidu3_2_thetich {
    public static void main(String[] args) {
        double canh, theTichlapphuong;
        Scanner sc = new Scanner(System.in);
        System.out.print("Nhap canh: ");
        canh = sc.nextDouble();
        theTichlapphuong = canh * canh * canh;
        //theTichlapphuong = Math.pow(canh, 3);
        System.out.println("The tich = " + theTichlapphuong);
    }
}


Ví dụ 3.3
Viết chương trình nhập các hệ số của phương trình bậc 2. Tính delta và xuất căn bậc 2 của delta ra màn hình.

Code:
import java.util.Scanner;
public class vidu3_3_phuongtrinh_bac2 {
    public static void main(String[] args) {
        double a, b, c, delTa;
        Scanner scan = new Scanner(System.in);     
        System.out.print("Nhap he so a: "); // vi du: 2
        a = scan.nextDouble();
        System.out.print("Nhap he so b: "); // vi du: 5
        b = scan.nextDouble();
        System.out.print("Nhap he so c: "); // vi du: 2
        c = scan.nextDouble();
        delTa = (b * b) - (4 * a * c);
        //delTa = Math.pow(b, 2) - (4 * a * c);
        System.out.println("Can delTa = " + Math.sqrt(delTa));  
        
    }
}


Xong!

[Tự Học Java] MOB1014-Java 1 - Bài Đầu Tiên

NỘI DUNG:
1. Phần mềm cài đặt
2. Ghi chú - Comments
3. Qui tắc đặt tên
4. Chương trình đầu tiên
5. Cách sử dụng phím tắt và các phím tắt gõ lệnh hay dùng

THỰC HIỆN:

1. Phần mềm cài đặt

2. Ghi chú - Comments: 
Ghi chú dùng để chú thích nhằm giúp bạn lưu lại các thông tin khi viết chương trình như: biến số này dùng làm gì, ai là người tạo ra code này và tạo ra lúc nào. Việc ghi chú là rất cần thiết ví dụ chúng ta làm việc theo nhóm muốn chia sẽ code cho nhau, người được sẽ dễ hiểu hơn thông qua các chú thích,...tại sao code dùng dòng đó,..

Vị trí comments: Đầu mỗi class, method, function,... hoặc trong nội dung code

Ghi chú một dòng: bắt đầu bằng hai dấu gạch chéo ( //). Có nghĩa là những gì từ vị trí // cho đến cuối dòng đều bị Java bỏ qua (sẽ không được thực thi).

Ví dụ:
// đây là dòng chú thích máy sẽ bỏ qua dòng này
System.out.println("Hello World");

Hoặc
System.out.println("Hello World");// từ đây đến cuối dòng code Java sẽ bỏ qua không thực thi

Ghi chú nhiều dòng: bắt đầu bằng /* và kết thúc bằng */, có nghĩa bất kỳ văn bản/code nào giữa /* và */sẽ bị Java bỏ qua không thực thi

Ví dụ:
/* đây là chú thích nhiều dòng
dòng 1
dòng 2
...
*/
System.out.println("Hello World");

Javadoc Comment: Cú pháp cơ bản giống như đối với comment trên nhiều dòng trong java, nhưng chúng ta sẽ sử dụng cặp dấu / ***/ thay cho /* và */.

3. Qui tắc đặt tên

Quy tắc chung:
  • KHÔNG được dùng những từ khóa trong java như: data, const, enum, final, …
  • KHÔNG được có khoảng trắng
  • KHÔNG có ký tự thực hiện tính toán toán học như: cộng trừ nhân chia ...(+, -, *, / , %..)
  • KHÔNG được bắt đầu bằng số
  • Tên phải bắt đầu bằng chữ cái (a đến z hoặc A đến Z), kí tự $ hoặc dấu gạch dưới _. Ví dụ: Code, _code, &code.
  • Java CÓ PHÂN BIỆT chữ HOA chữ thường

Quy tắc viết hoa, viết thường:
  • lowercase: tất cả các chữ cái trong tên đều viết thường (Ví dụ: hocjava)
  • UPPERCASE: tất cả các chữ cái trong tên đều viết hoa (Ví dụ: HOCJAVA). 
  • CamelCase: Camel nghĩa là con lạc đà, chữ cái đầu tiên của mỗi từ sẽ được viết hoa (ví dụ: HocJava)
  • Mixed Case: Kết hợp lowercase (dùng cho từ/chữ đầu tiên) và CamelCase (ví dụ: datTenBienTrongJava)

Quy tắc đặt tên tiêu chuẩn:
Phải theo quy tắc chung
  • Đặt tên Package: Viết thường (lowercase).
  • Đặt tên Project, Class và Interface: Chữ cái đầu tiên của mỗi từ phải được viết hoa (CamelCase).
  • Đặt tên biến, phương thức (Method)/Hàm (Function): Theo quy tắc lowercase và CamelCase: đó là chữ cái đầu tiên của từ đầu tiên phải viết thường (lowercase) và chữ cái đầu tiên của các từ tiếp theo phải viết hoa (camelCase), ví dụ: sinhVienDaiHoc, maSoSinhVien,..., setHoTen, getHoTen,...
  • Đặt tên hằng số (Constant): Theo quy tắc UPPERCASE viết hoa (Ví dụ: PI). Nếu tên hằng số có từ hai từ trở lên thì phải có dấu _ ngăn cách giữa các từ, ví dụ: HANG_SO_PI

4. Chương trình đầu tiên

  • Tạo mới project
File -> New Project... -> Java with Ant -> Java Application -> Next -> (5) đặt tên cho project và nơi lưu trữ (đường dẫn nên đặt tiếng anh hoăc tiếng việt không dấu và không chứa khoảng trắng)  ->  (6) bỏ chọn Create Main Class  -> Finish



  • Tạo Package
Chọn project vừa tạo Source Package -> New -> Java Package -> (3) đặt tên cho package -> Finish


  • Tạo Class
Chọn package vừa tạo  -> New  -> Java Class -> (3) đặt tên cho classs -> Finish

  • Soạn thảo mã nguồn và chạy chương trình
(1) Soạn nội dung như hình -> (2) Run File -> (3) Kết quả của đoạn code

Code:
package baidautien;
/**
 *
 * @author khanhvc
 * Chú thích nhiều dòng
 */
public class XinChao {
    public static void main(String[] args) {
    	// đây là dòng chú thích máy sẽ bỏ qua dòng này
    	// chương trình chạy sẽ in ra câu "Xin Chao!"
        System.out.println("Xin Chao!");
    }
}


5. Cách sử dụng phím tắt và các phím tắt gõ lệnh hay dùng:
- Gõ phím tắt cần gõ > nhấn phím Ctrl + Space + Enter

Ví dụ: phím tắt của hàm main. Tại màn hình soạn thảo gõ ps + Space + Enter

ps: hàm main
sout: System.out.println (“|”);

Xong!

Automation - Convert .xls To .XLSX / Chuyển Đổi Excel 97-2003 (.xls) Sang Excel 2010-2013-2016... (.xlsx)

Hiện tại có một số loại virus núp bóng marco trên excel để thực hiện các hành động phá hoại dữ liệu trên máy tính. Với Excel 79-2003 (.xls) macro có thể chạy trên định dạng này. Để giảm thiểu các macro có hại hoạt động và phá hủy dữ liệu, các bạn có thể save sang định dạng Excel 2010-2013-2016...(.xlsX), tuy nhiên với số lượng lớn file thì việc làm rất mất thời gian. Nên chúng tôi đã viết script để chuyển đổi hàng loạt các file với dạng .xls sang dạng .xlsX chia sẽ các bạn tham khảo.


Ý TƯỞNG THỰC HIỆN

Kiểm tra các file tại đường dẫn đưa vào nếu là excel 97-2003 (.xls) thì:

  • Thực hiện chuyển các file này vào file nén .ZIP nhằm mục đích đề phòng trong quá trình chuyển đổi nội bị lỗi nội dung...
  • Thực hiện chuyển đổi .xls sang .xlsx
  • Ghi lại nhật ký (ghi log) các file đã chuyển thành công
  • Thực hiện xóa file .xls


CODE:

import xlwings as xw
import os
from fnmatch import fnmatch
# https://stackoverflow.com/questions/2909975/python-list-directory-subdirectory-and-files
from datetime import datetime
# datetime object containing current date and time

import zipfile

now = datetime.now()
dt_str3 = now.strftime("%Y-%b-%d_%H-%M-%S")

'''
nén file
'''
def add_tozip (path,file_name):
	with zipfile.ZipFile(rf"{path}\{dt_str3}_XLS_KHONG_DUNG.zip", "a") as zipf:
	    source_path = rf"{path}\{file_name}" 
	    destination = rf"{file_name}"
	    zipf.write(source_path, destination)	

# xóa file
def del_file(path,file_name): 
	os.remove(rf"{path}\{file_name}")

# ghi log
def write_log(path,file_name):
	f = open(rf"{path}\{dt_str3}.txt","a") 
	f.write(rf"{path}\\")
	f.write(rf"{file_name}")
	f.write("\n")
	f.flush() # thực hiện ghi nội dung vào file
	f.close()
	print (f'File"{path}\{file_name}" DA DUOC chuyen sang dinh dang moi .XLSX')

# thực hiện save sang dạng mới
def save_as(path,file_name):
	add_tozip (path,file_name) # nen file
	wb1 = xw.Book(rf"{path}\{file_name}")
	file_name = file_name.replace(".xls","_FIXED.xlsx")	    # XÓA .XLS
	wb1.save(rf"{path}\{file_name}")	
	wb1.close()

	file_name = file_name.replace("_FIXED.xlsx",".xls") # đổi lại thành .xls nhằm mục đích ghi log và xóa file .xls
	
	write_log(path,rf"{file_name}")
	del_file(path,file_name)
	

# nếu lấy danh sách file trong folder thì dùng hàm này (không lấy trong sub được)
def getfiles(path_dir): 
	dir_list = os.listdir(path_dir)
	return dir_list


xw.App(add_book=False)
xw.App(visible=False)
path = input('Dan duong dan vao: ')
#path = r'C:\Users\khanhvc\Downloads\Da'
'''
lst_files = getfiles(path)
# không lấy file trong subfolder
for file_name in lst_files:
	# print (x)
	if file_name.endswith('.xls'):
		save_as(path,rf"{file_name}")
'''
for path, subdirs, files in os.walk(path):
    for file_name in files:
        if fnmatch(file_name, "*.xls"):
        	save_as(path,rf"{file_name}")
            # print(os.path.join(path, name))


Hướng dẫn cho các bạn chưa biết python: 

  • Tải python về cài đặt
  • Vào run -> cmd -> enter gõ  pip install xlwings -> enter (cài đặt thư viện)
  • Copy toàn bộ nội dung code dán vào notepad lưu thành file .py. Ví dụ: c:\python\vidu.py
  • Vào run -> cmd -> enter gõ cd  c:\python -> enter -> python  vidu.py -> enter  (thực thi file .py)
  • Dán/nhập vào đường dẫn chứa các file .xls (chỉ cần folder cha, chương trình sẽ tự động tìm tìm trong subfolder)  Ví dụ: D:\khanh\congviec


Xong!

[Database-Tự Học SQL] COM2034_SQL Server - Lab 4: Điều Kiện & Vòng Lặp - P3 TRANSACTION (Transact-SQL)

LÝ THUYẾT:

TRANSACTION: là việc thực hiện một nhóm các câu lệnh, các câu lệnh này được thực thi một cách tuần tự và độc lập nhau. Nếu tất cả câc lệnh trong nhóm thực hiện thành công khi đó tất cả các sự thay đổi dữ liệu được thực hiện trong Transaction được lưu vào cơ sở dữ liệu (COMMIT). Tuy nhiên, nếu có một trong các lệnh của nhóm lệnh thực thi thất bại thì toàn bộ tiến trình sẽ thất bại, đồng nghĩa với việc dữ liệu phải ROLLBACK về trạng thái ban đầu.

Các tiêu chuẩn Transaction:

  • Bảo toàn (Atomicity) - đảm bảo rằng tất cả các câu lệnh trong nhóm lệnh được thực thi thành công. Nếu không, transaction bị hủy bỏ tại thời điểm thất bại và tất cả các thao tác trước đó được khôi phục về trạng thái cũ.
  • Nhất quán (Consistency) - đảm bảo rằng cơ sở dữ liệu thay đổi chính xác các trạng thái khi một transaction được thực thi thành công.
  • Độc lập (Isolation) - cho phép các transaction hoạt động độc lập và minh bạch với nhau.
  • Bền bỉ (Durability) - đảm bảo rằng kết quả của một transaction được commit vẫn tồn tại trong trường hợp lỗi hệ thống.


Transaction T-SQL tường minh có dạng (code mẫu đơn giản)

SET XACT_ABORT ON

BEGIN TRAN

BEGIN TRY
	--  Lệnh 1
	--  Lệnh 2
	--  Lệnh ...
 
COMMIT
END TRY
 
BEGIN CATCH
 
  ROLLBACK
 
END CATCH


Ý nghĩa các lệnh dùng để xử lý transaction.

  • COMMIT - để lưu các thay đổi.
  • ROLLBACK - để khôi phục lại các thay đổi.
  • SAVEPOINT - tạo ra các điểm trong transaction để ROLLBACK.
  • SET TRANSACTION - thiết lập các thuộc tính cho transaction.

Các lệnh điều khiển transaction chỉ được sử dụng với các lệnh thao tác dữ liệu DML như - INSERT, UPDATE và DELETE.

Noted: Chúng không thể được sử dụng trong lệnh CREATE TABLE hoặc DROP TABLE vì các hoạt động này được tự động được commit trong cơ sở dữ liệu.

Giao dịch lồng (nested transaction) là giao dịch được viết bên trong một giao dịch khác.

  • Mỗi khi câu lệnh BEGIN TRAN được thực thi, hàm hệ thống @@TRANCOUNT được tăng thêm 1. 
  • Khi thực thi câu lệnh COMMIT TRAN.
  • Nếu @@TRANCOUNT > 1, các thay đổi sẽ không được commit. Thay vào đó @@TRANCOUNT giảm đi 1.
  • Nếu @@TRANCOUNT = 1, mọi thay đổi đã được thực hiện trên CSDL trong suốt giao dịch sẽ được commit và @@TRANCOUNT được gán bằng 0. 
  • Câu lệnh ROLLBACK TRAN roll-back toàn bộ các giao dịch đang hoạt động và thiết lập giá trị cho @@TRANCOUNT về 0


YÊU CẦU:

Bài 1: (Mục đích là làm quen với Transaction)

  • Hiển thị mã phòng ban bằng 2, hiển thị Transaction count
  • Thực hiện đổi tên (TENPHG) thành 'Phong KT 004'
  • Thực hiện Rollback lại tên ban đầu (lúc chưa update ...set....)

Bài 2:

Yêu cầu sử dụng giao dịch kết hợp với try catch để chặn lỗi thực hiện 2 yêu cầu sau:

  • Viết chương trình thêm một nhân viên mới. Nếu thêm nhân viên thành công thì thêm 1 thân nhân cho nhân viên vừa tạo.
  • Viết chương trình thêm một công việc mới cho đề án số 1, đồng thời phân công nhân viên mói thêm ở câu trên đảm nhận công việc mới tạo.



THỰC HIỆN:

Bài 1:

  • Hiển thị mã phòng ban bằng 2, hiển thị Transaction count
  • Thực hiện đổi tên (TENPHG) thành 'Phong KT 004'
  • Thực hiện Rollback lại tên ban đầu (lúc chưa update ...set....)

Code:

-- ban đầu chưa thay đổi (1)
SELECT * FROM PHONGBAN WHERE PHONGBAN.MAPHG = 2
SELECT @@TRANCOUNT AS dem_Tran

-- thực hiện sửa TENPHG thành 'Phong KT 004' (2)
BEGIN TRAN
	  UPDATE PHONGBAN
	  SET TENPHG = 'Phong KT 004'
	  WHERE MAPHG = 2

--COMMIT TRAN -- Sau khi commit, TRANCOUNT sẽ  = 0
SELECT * FROM PHONGBAN WHERE PHONGBAN.MAPHG = 2 -- kiểm sau khi thực hiện lệnh update... set..
SELECT @@TRANCOUNT AS dem_Tran -- kiểm tra biến đếm 

-- thực hiện Rollback và kiểm tra kết quả (3)
ROLLBACK TRAN -- RollBack thành không khi TRANCOUNT > 0 
SELECT * FROM PHONGBAN WHERE PHONGBAN.MAPHG = 2
SELECT @@TRANCOUNT AS dem_Tran


Kết quả:

  • (1) Ban đầu TRANCOUNT = 0
  • (2) Khi thực hiện thay đổi tên TRANCOUNT tăng lên 1 đơn vị
  • (3) Thực hiện Rollback thì TRANCOUNT sẽ thiết lập giá trị là 0

Bài 2:

Yêu cầu sử dụng giao dịch kết hợp với try catch để chặn lỗi thực hiện 2 yêu cầu sau:

  • Viết chương trình thêm một nhân viên mới. Nếu thêm nhân viên thành công thì thêm 1 thân nhân cho nhân viên vừa tạo.
Code mẫu đơn giản:
DECLARE @ma_nv NVARCHAR(9) = '2222'
SET XACT_ABORT ON

BEGIN TRAN

BEGIN TRY
	INSERT INTO NHANVIEN ( [HONV] ,[TENLOT] ,[TENNV] ,[MANV] ,[NGSINH] ,[DCHI] ,[PHAI] ,[LUONG] ,[MA_NQL] ,[PHG] )
					VALUES ('Van', 'Cong',  'Khanh',  @ma_nv, '2000/10/10','Binh Duong','Nam',30000,'005', 5)
	INSERT INTO THANNHAN ([MA_NVIEN] ,[TENTN],[PHAI],[NGSINH] ,[QUANHE]	)
					VALUES (@ma_nv, 'Nhan Nhan', 'Nam','2000/10/10','ban be') -- sửa @ma_nv thành 99999
	PRINT 'Them THANH CONG'

COMMIT -- thực hiện lưu nếu cả 2 dòng lệnh thêm thành công

END TRY
 
BEGIN CATCH
 
  ROLLBACK -- Nếu 1 trong 2 lệnh INSERT không thành công sẽ thông báo lỗi
  PRINT 'Them THAT BAI'
 
END CATCH

Noted: Với code trên khi thêm nhân viên mới chúng ta cần thay dòng thứ 1 là được, tuy nhiên để kiểm tra ROLLBACK thi chúng ta cố tình sửa dòng INTSERT trong bảng thân sai đi để kiểm tra. Ví dụ: thay đổi @ma_nv thành '99999' (dòng số 10)

Với cách trên nếu xảy lỗi chúng ta sẽ khó biết được lỗi xảy ra ở câu lệnh nào, nên chúng ta có thể thiết lập 1 cờ để kết hợp với IF... ESLE/CASE để việc xử lý được tường minh hơn.

Code tham khảo
DECLARE @is_error BIT = 0;
DECLARE @ma_nv NVARCHAR(9) = '77777';
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
	INSERT INTO NHANVIEN ( [HONV] ,[TENLOT] ,[TENNV] ,[MANV] ,[NGSINH] ,[DCHI] ,[PHAI] ,[LUONG] ,[MA_NQL] ,[PHG] )
					VALUES ('Van', 'Cong',  'Khanh',  @ma_nv, '2000/10/10','Binh Duong','Nam',30000,'005', 5)
	-- SELECT * FROM NHANVIEN WHERE MANV = @ma_nv
END TRY

BEGIN CATCH
	SET @is_error = 1;
END CATCH

IF @is_error = 0
	BEGIN
		BEGIN TRY
			INSERT INTO THANNHAN ([MA_NVIEN] ,[TENTN],[PHAI],[NGSINH] ,[QUANHE]	)
					VALUES (@ma_nv, 'Nhan Nhan', 'Nam','2000/10/10','ban be')
			PRINT 'Them THANH CONG'
		END TRY
		BEGIN CATCH
			ROLLBACK TRAN
			PRINT 'Them vao bang (THANNHAN) THAT BAI'
		END CATCH
	END
ELSE
BEGIN
	PRINT 'Them vao bang (NHANVIEN) THAT BAI'
END;

  • Viết chương trình thêm một công việc mới cho đề án số 1, đồng thời phân công nhân viên mới thêm ở câu trên đảm nhận công việc mới tạo.

Chúng tôi thực với cú pháp đơn để các bạn dễ hiểu, các bạn có thể kết với RAISEERROR kết hợp với các mã lỗi (tham khảo ở phần 2 )
DECLARE 
	@ma_dean INT = 1
	,@so_tt INT = 12,
	@ma_nv NVARCHAR(9) = '111';
SET XACT_ABORT ON
BEGIN TRAN
BEGIN TRY
	
	INSERT INTO CONGVIEC (MADA, STT, TEN_CONG_VIEC) VALUES (@ma_dean, @so_tt, 'Tin Hoc Van Phong')
	INSERT INTO PHANCONG (MA_NVIEN, MADA, STT, THOIGIAN) VALUES (@ma_nv, @ma_dean, @so_tt,20)

	COMMIT TRAN
	PRINT 'Them THANH CONG'
END TRY
BEGIN CATCH
	ROLLBACK TRAN
	PRINT 'Them THAT BAI'
END CATCH


Tham khảo thêm tại đây

Xong!
/*header slide*/