Gợi ý code, giải thuật đọc, ghi file excel từ trang ĐKHP regis.agu.edu.vn (ĐH AN GIANG) hoặc những trang regis tương tự

1. Hướng dẫn đọc file excel regis.agu.edu.vn ==> import sqllite (Đăng kí học phần trực tuyến)

- Ý tưởng: đọc từng dòng, từng cột dựa vào thư viện poi3.jar

HSSFWorkbook myWorkBook = new HSSFWorkbook(myFileSystem);
HSSFSheet mySheet = myWorkBook.getSheetAt(0);
Iterator rowIter = mySheet.rowIterator();
while (rowIter.hasNext()) {
 HSSFRow myRow = (HSSFRow) rowIter.next();
 if(myRow.getRowNum()>=13) {
 Iterator cellIter = myRow.cellIterator();
 while (cellIter.hasNext()) {
 HSSFCell myCell = (HSSFCell) cellIter.next();
 Log.d("NguyenNgocTan", "" + myCell.getStringCellValue().toString()+" socot:"+myCell.getColumnIndex());
 int SOCOT=myCell.getColumnIndex();
 if(SOCOT==1)
 MMH=myCell.getStringCellValue().toString();
 else if(SOCOT==6)
 TENMH=myCell.getStringCellValue();
 else if(SOCOT==34)
 PHONGHOC=myCell.getStringCellValue();
 else if(SOCOT==26)
 THU=myCell.getStringCellValue();
 else if(SOCOT==28)
 TIETBATDAU=myCell.getStringCellValue();
 else if(SOCOT==29)
 SOTIET=myCell.getStringCellValue();
 else if(SOCOT==36)
 TGHOC=myCell.getStringCellValue();
 }
}

- Giải thích:
+ myRow.getRowNum()>=13: Đọc dòng chứa nội dung mã môn học đầu tiên
+ SOCOT=GIÁ TRỊ: Do số cột trên file excel của regis quá nhiều. Có những cột null giá trị do trộn ô (merge cell). Để biết số cột và giá trị như thế nào. Chúng ta dựa vào dòng

Log.d("NguyenNgocTan", "" + myCell.getStringCellValue().toString()+" socot:"+myCell.getColumnIndex());

==> Ý nghĩa là để Log ra nội dung cột và thứ tự cột

2. Xem TKB theo tuần. 

- Hình ảnh Cột tuần trong TKB của regis.agu.edu.vn (ĐH AN GIANG)

- Ý tưởng:

B1: Đọc từng ký tự trong cột thời gian học

B2: Kiểm tra xem số tuần học

     + Nếu số tuần học >=10. Thì gán số tuần học =số tuần học % 10 (VD: 11%10=1 -> tuần thứ 11)

     + Nếu số tuần học <=10. Thì giữ nguyên số tuần được chọn.

- Code tham khảo: (Cột thời gian học) ThoiGianHoc.Substring((SoTuanHoc-1),SoTuanHoc).equals(SoTuanHoc)

3. Tính số tuần, thứ trong tuần tuần dựa vào thời gian bắt đầu nhập học và thời gian đang chọn

- Ý tưởng:

     + B1: Lấy thời gian đang chọn - thời gian bắt đầu =A thời gian

     + B2: Tính số tuần =(A thời gian / 1000*60*60*24)/7

     + B3: Tính thứ trong tuần (Lưu ý: Thứ =1 là chủ nhật):

Calendar c = Calendar.getInstance();
c.setTime(Common.Static_NGAY_THANG_NAM_SELECT);
int Thu_TrongTuan = c.get(Calendar.DAY_OF_WEEK);

 - Code tham khảo

Long TRU_THOIGIAN= (Common.Static_NGAY_THANG_NAM_SELECT.getTime()-Common.Static_NGAY_THANG_NAM_CSDL.getTime());
  int SoTuan=Integer.valueOf(String.valueOf((TRU_THOIGIAN/(1000*60*60*24))/7));
  Calendar c = Calendar.getInstance();
  c.setTime(Common.Static_NGAY_THANG_NAM_SELECT); // yourdate is a object of type Date
  int Thu_TrongTuan = c.get(Calendar.DAY_OF_WEEK);
  if(Thu_TrongTuan==1)
     txt_thu.setText("CHỦ NHẬT");
  else
     txt_thu.setText("THỨ "+(Thu_TrongTuan));

4. Tải Ứng Dụng Xem Thời Khóa Biểu ĐHAG (Regis.agu.edu.vn): Đang Cập Nhật Ứng Dụng Trong TG Sớm Nhất

Kiểm tra kết nối đến MSSQL SERVER không cần cài đặt bất cứ công cụ nào

- Vấn đề đặt ra: Như chúng ta đã biết để kiểm tra xem user, password có kết nối được đến với SQL SERVER không. Thì các bạn thường mở công cụ SQL để test hoặc viết chương trình C# để kết nối đến SQL (Giả sử máy chúng ta không còn đủ dung lượng bộ nhớ để cài sql thì sao)

- Hướng giải quyết: Tạo Universal Data Link files (*.UDL)

+ B1: Tạo file

+B2: Sau đó đổi tên file là: TestDatabase.udl

- Chọn Yes để chấp nhận thay đổi phần mở rộng. Chạy file vừa tạo. 

- bây giờ có thể kết nối đến bất kỳ CSDL trên host online hoặc local.

 

 

 

 

Không gõ được dấu tiếng việt trên phần mềm C#,JAVA, WEB,MISA

Biểu hiện: Chúng ta gõ dấu tiếng việt được trên  Word, Excel, powerpoint … bình thường, nhưng gõ ở phần mềm C#, JAVA, MISA... không được. (Thông thường sẽ rơi vào hệ HĐH >=WIN8)
  • Nguyên nhân 1: Do chưa tắt UAC (Change User Account Control Settings)
  • Hướng giải quyết : Vào Start/ Control Panel/ UserAccount/ Change User Account Control Settings. Tiếp đó, trên thanh trượt, các bạn di chuột về Never notify, sau đó nhấn OK, chương trình hiển thị cảnh báo, tiếp tục nhấn OK sau đó thực hiện khởi động lại máy. 
  • Nguyên nhân 2: Do chưa run administrator Unikey, phần mềm
  • Hướng giải quyết : Đặt chuột phải vào biểu tượng chạy Unikey --> chọn Properties --> chọn Tab Compatibility , tích vào ô Run this program as an administrator/ nhấn Apply/ Ok. Sau đó kết thúc Unikey và mở lại. (làm tương tự đối với biểu tượng chạy phần mềm MISA ngoài màn hình)
Ngoài 2 nguyên nhân trên: Do Unikey bị thiếu quyền, hoặc bạn đang mở quá nhiều bộ gõ cùng lúc, hoặc bộ cài Unikey bạn đang sử dụng chưa phù hợp với win của bạn đang dùng.
 

Truy vấn CSDL với SQL mẫu tin > 10^10000(giả sử) và commandtimeout

- Bài toán đặt ra: Chúng ta đang sử dụng ngôn ngữ C#(Visual studio). Kết nối đến DATABSE SQL. Trên giao diện sẽ C# sẽ hiển thị DS khách hàng trong SQL( chú ý: table khách hàng có số dòng > 10^10000)
- Vấn đề xảy ra trong bài toán này.
+ Sẽ không load được dữ liệu vào form.
- Nguyên nhân:
+ Trên C#. Đối tượng lệnh sqlcommand sẽ có thời gian commandtimeout mặc định =30s.(.commandtimeout hiểu cơ bản có nghĩa là thời gian để thực thi kết quả trả về từ CSDL thông qua đối tượng lệnh sqlcommand)
+ Do CSDL với số dòng tương đối nhiều > 10^10000 ( thời gian để select câu này trong sql là > 30s)
==>Thời gian để thực hiện câu select từ sql trả về là > 30s. Nhưng thời gian đợi kết quả trả về là =30s. nên không load được dữ liệu
- Khắc phục: Thêm vào sqlcommand..commandtimeout =thời gian
 
 

Sao Chép Database (SQL Lite) Đến SDCARD Khi Cài Đặt .*apk

Yêu cầu bài toán: Xây dựng chương trình câu hỏi trắc nghiệm. Với số câu hỏi và đáp án sẽ được người lập trình lưu trữ trước trong sqllite. Khi cài đặt ứng dụng lần đầu tiên và khởi động ứng dụng. Chương trình sẽ sao chép database, tệp tin liên quan sang sdcard.
Xây dựng ứng dụng.
B1:Tạo CSDL SQL Lite. Sau Đó Copy Database vào đường /assets/sqlite/TAN.s3db
B2: Sử dụng class mainativity.java
public class QuanLyHeThong extends ActionBarActivity {
// Tên database
public static String DB_Name="TAN.s3db";
// Lấy đường dẫn sdcard

public static String path=Environment.getExternalStorageDirectory()+"/"+DB_Name
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.quanlyhethong);
	// lấy đường dẫn đầy đủ của tệp tin database
	File file=getApplicationContext().getDatabasePath(DUONGDAN_FULL)
	// Kiểm tra database trong sdcard có tồn tại không?
	if(Copy_Database(this)) Toast.makeText(getApplicationContext(),"Đãchép",Toast.LENGTH_SHORT).show();
	else
		Toast.makeText(getApplicationContext(),"Tồn tại",Toast.LENGTH_SHORT).show();
}
	// Hàm sao chép database từ thư mục assest sang sdcard
public Boolean Copy_Database(Context context) {
	try {
		InputStream inputStream = context.getAssets().open(DB_Name);
		OutputStream outputStream = new FileOutputStream(DB_Name);
		byte[] buff = new byte[1024];
		int length = 0;
		while ((length = inputStream.read(buff)) > 0) {
			outputStream.write(buff, 0, length);
		}
		outputStream.flush();
		outputStream.close();
		return true;
	} catch (IOException e)
	{e.printStackTrace();
		return false;
	}
}

Phần Giải Thích Thêm
1. Sử dụng luồng byte của lớp cha OutputStream,InputStream. Và sau đó đọc từng byte từ luồng nhập ở thư mục asset chép vào sdcard.
2. Tham khảo phương thức và định nghĩa từ luồng nhập bên dưới
Android