[Visual Studio/C#]도서관리 프로그램 - 도서 대여/반납 로직

2021. 3. 4. 15:48Toy Project/도서관리 프로그램

728x90
반응형

- 이전글 -
2020/12/17 - [프로젝트/C#]도서관리 프로그램 - 초안
2020/12/18 - [프로젝트/C#]도서관리 프로그램 - 로그인, 도서검색
2020/12/19 - [프로젝트/C#]도서관리 프로그램 - 도서 삭제, 수정
2021/02/12 - [프로젝트/C#]도서관리 프로그램 - 관리자 권한 생성

1. RentBook라는 새로운 DB 테이블을 생성하였습니다.

2. [도서대여] 버튼을 선택했을 때, 이 DB에 데이터를 추가하도록 하겠습니다.

private void btnRent_Click(object sender, EventArgs e)
{
    if (selectedQuantity >0)
    {
        if (int.Parse(dbc.count("rentBook", "where bookNumber = '" + selectedBookNumber + "' and returnDate = '' and memId = '" + LoginForm.memId + "'"))==0)
        {

            sql = "insert into RentBook values (\'" + DateTime.Now.ToString("yyyyMMddHHmmss") + "\', '"
                + LoginForm.memId + "\', '" + selectedBookNumber + "\', '" + DateTime.Now.ToString("yyyy-MM-dd") + "\','"
                + DateTime.Now.AddDays(10).ToString("yyyy-MM-dd") + "\','')";
            dbc.Connection();
            dbc.Command(sql);

            MessageBox.Show(selectedBookName + " 도서를 대여합니다.");

            sql = "update BookList set quantity = " + (selectedQuantity - 1) + " from BookList " + whereStr;
            dbc.Connection();
            dbc.Command(sql);

            sql = "select * from BookList";
            dbc.Connection();
            dbc.Adaptor(sql);
        }
        else
        {
            MessageBox.Show("이미 대여한 도서입니다.");
        }
    }
    else
    {
        MessageBox.Show("대여가 불가능합니다.");
    }
}

이 때, 중복되는 대여는 대여가 불가능하도록 count() 함수를 사용하여 처리해줍니다.

만약 중복되는 데이터가 해당 회원의 대여 목록에 존재할 경우, count는 1이 될 것입니다.

이때는 else문에 MessageBox를 타게 됩니다.

그렇지 않은 경우 해당 값은 bookList에 insert 되는데 이 때 도서의 수량이 -1 됩니다.

해당 도서를 대여하고 있는 경우, 대여가 불가능하다.

 

3. [대여목록]을 선택한 경우, 해당 회원의 대여 목록이 보이게하고 [반납목록]을 선택한 경우, 그동안 회원이 빌려온 도서의 목록을 보이게 합니다.

private void dgvLoad()
{
    string sql = "";
    string where0 = "where MemId like '" + LoginForm.memId + "' and returnDate = ''";
    string where1 = "where MemId like '" + LoginForm.memId + "' and not returnDate = ''";
    //sql = "select * from RentBook";
    if (BookListForm.btnClick == 0)
    {
        sql = "SELECT RentBook.RentNumber, bookList.bookName, bookList.writeName, bookList.copyName, RentBook.RentDate, RentBook.ReturnExpectDate " +
                "FROM bookList JOIN RentBook ON rentbook.bookNumber = bookList.bookNumber " + where0;
    }
    else if (BookListForm.btnClick == 1)
    {
        sql = "SELECT RentBook.RentNumber, bookList.bookName, bookList.writeName, bookList.copyName, RentBook.RentDate, RentBook.ReturnExpectDate " +
                "FROM bookList JOIN RentBook ON rentbook.bookNumber = bookList.bookNumber " + where1;
    }
}

도서대여목록과 반납목록은 RentBook 테이블의 ReturnDate로 통제합니다.

만약 회원이 아직 도서를 반납하지 않은 경우, ReturnDate는 빈 값을 갖게 되고

반납을 한 경우 ReturnDate에는 반납한 일자가 찍힙니다.

1234 회원의 도서 대여 목록

 

4. 대여목록에서 [도서반납] 버튼 선택 시 반납이 되도록 하겠습니다.

private void btnReturn_Click(object sender, EventArgs e)
{
    string sql = "update rentbook set returndate = '" + DateTime.Now.ToString("yyyy-MM-dd") 
        + "' from rentbook where RentNumber = '" + selectedRentNumber + "'";

    dbc.Connection();
    dbc.Command(sql);

    int quantity = int.Parse(dbc.DataLoad("bookList", "where bookNumber = '" + selectedBookNumber + "'", "quantity")) +1;

    sql = "update BookList set quantity = " + quantity + " from BookList where bookNumber = '" + selectedBookNumber + "'";
    dbc.Connection();
    dbc.Command(sql);

    MessageBox.Show(selectedBookNumber + "도서를 반납합니다.");
    dgvLoad();
}

이 때, 도서의 수량은 다시 +1 됩니다.

도서반납 구현 화면

 

5. where문에 통제를 줘서 root 사용자가 로그인했을 경우, [대여목록]과 [반납목록]을 선택 시 모든 회원의 자료가 보이도록 설정합니다.

 

*** 앞으로 구현할 것들 ***
1. 회원별로 도서 반납 시 '영수증' 뿌려주기
2. 도서등록, 회원가입 시 제약사항 걸어주기
3. 회원별 패스워드 변경 기능

 

728x90
반응형