⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ubooklend.pas

📁 图书馆管理系统代码deiphi
💻 PAS
字号:
unit uBookLend;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, Buttons;
type
  TOwnBook = record
    Code : string;
    Name : string;
    Price : string;
    OwnDays : integer;
  end;

  TfrmBookLend = class(TForm)
    Label1: TLabel;
    Panel4: TPanel;
    edtBookCode: TEdit;
    StaticText1: TStaticText;
    Panel1: TPanel;
    Bevel2: TBevel;
    StaticText2: TStaticText;
    edtName: TEdit;
    StaticText3: TStaticText;
    edtAuthor: TEdit;
    edtPublisher: TEdit;
    StaticText4: TStaticText;
    StaticText5: TStaticText;
    edtDate: TEdit;
    StaticText7: TStaticText;
    edtPrice: TEdit;
    StaticText8: TStaticText;
    Memo: TMemo;
    StaticText9: TStaticText;
    edtUser: TEdit;
    StaticText10: TStaticText;
    edtOwnTime: TEdit;
    StaticText11: TStaticText;
    edtFine: TEdit;
    StaticText6: TStaticText;
    edtTotal: TEdit;
    Panel3: TPanel;
    btnBookCode: TButton;
    Bevel1: TBevel;
    btnCancel: TSpeedButton;
    btnLend: TSpeedButton;
    btnReturn: TSpeedButton;
    procedure Button2Click(Sender: TObject);
    procedure edtBookCodeChange(Sender: TObject);
    procedure edtUserChange(Sender: TObject);
    procedure btnBookCodeClick(Sender: TObject);
    procedure edtBookCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure btnCancelClick(Sender: TObject);
    procedure btnLendClick(Sender: TObject);
    procedure btnReturnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    CanLand : boolean;
    function ViewBook(Code : string):boolean;
    function ViewUser(Code : string):boolean;
    function GetOwnCount(UserID : string):integer;
    function GetMaxOwnCount(UserID : string):integer;
    function GetOwnDay(Code , UserID : string): integer;
    function UpDateNum(Code : string;
                       UserID:string;ADate:TDate;Style:integer):boolean;
    procedure Init;
    function GetOwnBook(Code , UserID : string):TOwnBook;
    procedure CheckCanLend(UserID:string);
    function CheckExistUser(UserID : string):boolean;
  end;

var
  frmBookLend: TfrmBookLend;

implementation

uses
  uPublic,dbtables, uOwnMsgF, main, uShowBookF;
{$R *.DFM}

procedure TfrmBookLend.Button2Click(Sender: TObject);
begin
    close;
end;

//书号编辑框内容输入到最大书号长度时,自动检查改输入书号相关信息
procedure TfrmBookLend.edtBookCodeChange(Sender: TObject);
begin
  if Length(edtBookCode.Text) = CodeLength then
  begin
    Init;
    //根据相应的书号查找相关书籍
    if ViewBook(edtBookCode.Text) =False then
    begin
      MessageDlg('没有数据或数据库操作失败',mtError,[mbok],0);
      Panel1.Visible := False;
      Exit;
    end;

    //检查该书的借阅情况,设定借或还的状态
    if ViewUser(edtBookCode.Text)=False then
    begin
      edtUser.ReadOnly := False;;
      edtUser.TabStop := True;
      edtUser.Color := clWindow;
      edtUser.SetFocus;
    end
    else begin
      StaticText10.Visible := True;
      edtOwnTime.Visible := True;

      //根据具体的情况,可以对借阅天数和罚金设定进行进一步编程
      if StrToInt(edtOwnTime.Text)>60 then
      begin
        edtFine.Visible := True;
        StaticText11.Visible := True;
        edtFine.Text := FloatToStr((StrToInt(edtOwnTime.Text)-OutDay)*FineDay);
      end;
      btnReturn.Enabled := True;
    end;
  end;
end;

//根据相应的书号查找相关书籍
function TfrmBookLend.ViewBook(Code: string): boolean;
var
  Query : TQuery;
begin
  try
    Query := TQuery.Create(nil);
    Query.DatabaseName := DBName;
    Query.SQL.Add('select * from book where Code = :Code');
    Query.ParamByName('Code').AsString := Code;
    Query.Open;
    if Query.RecordCount = 0 then
    begin
      Result := False;
      Exit;
    end;
    edtName.Text := Query.FieldByName('Name').AsString;
    edtAuthor.Text := Query.FieldByName('Author').AsString;
    edtPublisher.Text := Query.FieldByName('Concern').AsString;
    edtDate.Text := Query.FieldByName('OutDate').AsString;
    edtPrice.Text := Query.FieldByName('Cost').AsString;
    Memo.Lines.Add(Query.FieldByName('Memo').AsString);
    Query.Close;
    Query.Free;
    Panel1.Visible := True;
  except
    Result := False;
    Exit;
  end;
  Result := True;
end;

//根据借书人号编辑框的改变情况,确定该借书人是否可以借书
procedure TfrmBookLend.edtUserChange(Sender: TObject);
var
  MaxNum : integer;
begin
  if Length(edtUser.Text) = UserIDLength then
  begin
    edtTotal.Text :=IntToStr(GetOwnCount(edtUser.Text));
    //还书的情况
    if edtUser.ReadOnly then
    begin
      btnReturn.Enabled := True;
    end
    else begin
      //借书人号不存在或超过最大借书数目
      if not CheckExistUser(edtUser.Text) then
      begin
        btnLend.Enabled := False;
        MessageDlg('借书号<'+edtUser.Text+'>不存在',mtError,[mbok],0);
        Exit;
      end;
      MaxNum :=GetMaxOwnCount(edtUser.Text);
      if StrToInt(edtTotal.Text)>= MaxNum then
      begin
        MessageDlg('借书号<'+edtUser.Text+'>最多只能借阅'+IntToStr(MaxNum)+'本图书。'+#13+
                   '此号已经借阅了'+edtTotal.Text+'本图书,不能继续借阅。',
                     mtError,[mbok],0);
        Exit;
      end;
      //允许借书
      btnLend.Enabled := True;
    end;
  end;
end;

//根据指定借书人号来查找相关借书信息
function TfrmBookLend.ViewUser(Code: string): boolean;
var
  Query : TQuery;
  FDate : TDate;
  OwnTime : TDate;
begin
  try
    Query := TQuery.Create(nil);
    Query.DatabaseName := DBName;
    Query.SQL.Add('select * from Owner where Code = :Code');
    Query.ParamByName('Code').AsString := Code;
    Query.Open;
    if Query.RecordCount = 0 then
    begin
      Result := False;
      Exit;
    end;
    edtUser.Text := Query.FieldByName('UserID').AsString;
    FDate := Query.FieldByName('LandDate').AsDateTime;
    OwnTime := Date - FDate;
    edtOwnTime.Text := FloatToStr(OwnTime);
    Query.Close;
    Query.Free;
  except
    Result := False;
    Exit;
  end;
  Result := True;
end;

//初始化借还书籍模块的相关控件
procedure TfrmBookLend.Init;
begin
  edtBookCode.SetFocus;
  edtName.Text := '';
  edtAuthor.Text :='';
  edtPublisher.Text :='';
  edtDate.Text := '';
  edtPrice.Text := '';
  Memo.Lines.Clear;
  edtUser.Text := '';
  edtOwnTime.Text := '';
  edtFine.Text := '';
  edtTotal.Text := '';
  btnLend.Enabled := False;
  btnReturn.Enabled := False;
  edtUser.ReadOnly := True;
  edtUser.TabStop := False;
  edtUser.Color := clBtnFace;
  StaticText10.Visible := False;
  StaticText11.Visible := False;
  edtOwnTime.Visible := False;
  edtFine.Visible := False;
  //Pnel1.Visible := False;
  CanLand := True;
end;

//在借书表中更新借书的记录
function TfrmBookLend.UpDateNum(Code: string;
             UserID:string;ADate:TDate;Style:integer): boolean;
var
  Query : TQuery;
begin
  try
    Query := TQuery.Create(nil);
    Query.DatabaseName := DBName;

    if Style = 0 then
    begin
      Query.SQL.Add('insert into Owner'
                    +'  values(:Code,:UserID,:Date)');
      Query.ParamByName('Code').AsString := Code;
      Query.ParamByName('UserID').AsString:=UserID;
      Query.ParamByName('Date').AsDateTime := Date;
      Query.ExecSQL;
    end else begin
          Query.SQL.Add('delete from Owner where Code =:Code');
          Query.ParamByName('Code').AsString := Code;
          Query.ExecSQL;
        end;
    Query.Close;
    Query.Free;
    Result := True;
  except
    Result := False;
  end;
end;

//查找借书记录中某用户的借书数目
function TfrmBookLend.GetOwnCount(UserID: string): integer;
var
  Query : TQuery;
begin
  try
    Query := TQuery.Create(nil);
    Query.DataBaseName := DBName;
    Query.SQL.Add('select Count(UserID) from Owner where UserID =:UserID');
    Query.ParamByName('UserID').AsString := UserID;
    Query.Open;
    Result := Query.Fields[0].Value;
    Query.Close;
    Query.Free;
  except
    Result := 0;
  end;
end;

//查看借书人借书的时间
function TfrmBookLend.GetOwnDay(Code, UserID: string): integer;
var
  Query : TQuery;
begin
  try
    Query := TQuery.Create(nil);
    Query.DatabaseName := DBName;
    Query.SQL.Add('select * from Owner where Code = :Code and UserID =:UserID');
    Query.ParamByName('Code').AsString := Code;
    Query.ParamByName('UserID').AsString := UserID;
    Query.Open;
    Result:= Round(Date-Query.FieldByName('LandDate').AsDateTime);
    Query.Close;
    Query.Free;
  except
    Result := 0;
  end;
end;

function TfrmBookLend.GetOwnBook(Code, UserID: string): TOwnBook;
var
  Query : TQuery;
  FOwnBook : TOwnBook;
begin
  try
    Query := TQuery.Create(nil);
    Query.DatabaseName := DBName;
    Query.SQL.Add('select * from Book where Code =:Code');
    Query.ParamByName('Code').AsString := Code;
    Query.Open;
    FOwnBook.Code := Code;
    FOwnBook.Name := Query.FieldByName('Name').AsString;
    FOwnBook.Price := Query.FieldByName('Cost').AsString;
    FOwnBook.OwnDays := GetOwnDay(Code,UserID);
    Result := FOwnBook;
    Query.Close;
    Query.Free;
  except
    Result := FOwnBook;
  end;
end;

//检查某借书人号是否可以借书
procedure TfrmBookLend.CheckCanLend(UserID: string);
var
  Query : TQuery;
  FOwnBook : TOwnBook;
begin
  try
    Query := TQuery.Create(nil);
    Query.DatabaseName := DBName;
    Query.SQL.Add('select Code from Owner where UserID =:UserID');
    Query.ParamByName('UserID').AsString := UserID;
    Query.Open;
    CanLand := True;
    OwnMsgF.ListView1.Items.Clear;
    while not Query.Eof do
    begin
      FOwnBook := GetOwnBook(Query.FieldByName('Code').AsString,UserID);
      if FOwnBook.OwnDays > OutDay then
      begin
        with OwnMsgF.ListView1.Items.Add do
        begin
          Caption := FOwnBook.Code;
          SubItems.Add(FOwnBook.Name);
          SubItems.Add(FOwnBook.Price);
          SubItems.Add(IntToStr(FOwnBook.OwnDays));
          SubItems.Add(FloatToStr((FOwnBook.OwnDays-OutDay)*FineDay));
        end;
        CanLand := False;
      end;
      Query.Next;
    end;
    Query.Close;
    Query.Free;
  except
    CanLand := False;
  end;
end;

//检查是否有某借书人号
function TfrmBookLend.CheckExistUser(UserID: string): boolean;
var
  Query : TQuery;
begin
  try
    Query := TQuery.Create(nil);
    Query.DatabaseName := DBName;
    Query.SQL.Add('select UserID from Userb where UserID =:UserID');
    Query.ParamByName('UserID').AsString := UserID;
    Query.Open;
    if Query.RecordCount =0 then
      Result := False
    else Result := True;
    Query.Close;
    Query.Free;
  except
    Result := False;
  end;
end;

//调用ShowBookF窗体,显示更多的书号及相关信息
procedure  TfrmBookLend.btnBookCodeClick(Sender: TObject);
var
  P : TPoint;
begin
  P.x := Panel3.Left;
  P.y := Panel3.Top +Panel3.Height;
  ShowBookF.Top :=panel4.ClientToScreen(P).y;
  ShowBookF.Left := panel4.ClientToScreen(P).x;
  ShowBookF.Show(edtBookCode);
end;

//查阅借书人号可以借阅的书籍数目
function TfrmBookLend.GetMaxOwnCount(UserID: string): integer;
var
  Query : TQuery;
begin
  try
    Query := TQuery.Create(nil);
    Query.DataBaseName := DBName;
    Query.SQL.Add('select MaxNum from userb, Groupb '+
                  ' where UserID =:UserID and Userb.GroupID = Groupb.GroupID');
    Query.ParamByName('UserID').AsString := UserID;
    Query.Open;
    if Query.RecordCount <> 0 then
      Result := Query.Fields[0].Value
    else Result := 0;
    Query.Close;
    Query.Free;
  except
    Result := 0;
  end;
end;

procedure TfrmBookLend.edtBookCodeKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 13 then
    edtBookCodeChange(Sender);
end;

procedure TfrmBookLend.btnCancelClick(Sender: TObject);
begin
    close;
end;

//借书处理
procedure TfrmBookLend.btnLendClick(Sender: TObject);
begin
  //检查某借书人号是否可以借书
  CheckCanLend(edtUser.Text);
  if CanLand = False then
  begin
    OwnMsgF.Caption := edtUser.Text+'有以下书籍没按时归还';
    OwnMsgF.ShowModal;
    Exit;
  end;
  if UpDateNum(edtBookCode.Text,edtUser.Text,Date,0) = False then
  Begin
    MessageDlg('借书不成功',mtError,[mbok],0);
  end;
  Init;
  Panel1.Visible := False;
end;

//还书处理
procedure TfrmBookLend.btnReturnClick(Sender: TObject);
begin
  if UpDateNum(edtBookCode.Text,edtUser.Text,Date,1) = False then
  Begin
    MessageDlg('还书不成功',mtError,[mbok],0);
  end;
  Init;
  Panel1.Visible := False;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -