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

📄 card_firini.pas

📁 亚惠快餐管理信息系统 包括亚惠快餐管理的各项功能
💻 PAS
📖 第 1 页 / 共 3 页
字号:
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Delete');
    Sql.Add('From SCSJ_TSKXX');
    Sql.Add('Where Convert(char(10),日期,20)=''' + Trim(DateToStr(rq)) + '''');
    Sql.Add('And IC卡号=''' + Trim(cardno) + '''');
    Sql.Add('And 售卡机编码=''' + Trim(machineno) + '''');
    Sql.Add('And 卡片状态=''' + Trim(cardstatus) + '''');
    Sql.Add('And 操作员姓名=''' + Trim(czyname) + '''');
    try
      ExecSql;
    except
      ShowMessage('无法清空' + machineno + '号售卡机' + DateToStr(rq) + '日' +
        cardno + '号卡' + '的数据,系统无法继续工作!');
      Exit;
    end;
  end;
  Result := True;
end;

{删除与售卡信息表相关的SCSJ_TKPXX表中相同的记录}

function TFrmCard_FirIni.DeleteFromSubDB(rq: TDate; cardno, machineno,
  cardstatus, czyname: string): Boolean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Delete');
    Sql.Add('From SCSJ_TKPXX');
    Sql.Add('Where Convert(char(10),创建日期,20)=''' + Trim(DateToStr(rq)) +
      '''');
    Sql.Add('And IC卡号=''' + Trim(cardno) + '''');
    Sql.Add('And 售卡机编码=''' + Trim(machineno) + '''');
    Sql.Add('And 卡片状态=''' + Trim(cardstatus) + '''');
    Sql.Add('And 操作员姓名=''' + Trim(czyname) + '''');
    try
      ExecSql;
    except
      ShowMessage('无法清空' + machineno + '号售卡机' + DateToStr(rq) + '日' +
        cardno + '号卡' + '的数据,系统无法继续工作!');
      Exit;
    end;
  end;
  Result := True;
end;
{向售卡信息表中插入记录}

function TFrmCard_FirIni.InsertToDb(rq: TDate; IcKh: string; CkJe, TkJe, Yj:
  Double; KhName: string; ValDaynum: integer; CardStatus, CardLx, CzyName,
  MachineNo, CardValue: string; Ye: Double): BooLean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Insert Into SCSJ_TSKXX');
    Sql.Add('(IC卡号,日期,存款金额,退款金额,押金,客户姓名,有效天数,卡片状态,卡片类型,操作员姓名,售卡机编码,卡片面值,卡内余额)');
    Sql.Add('values(');
    Sql.Add('''' + IcKh + ''',''' + Trim(DateToStr(rq)) + ''',' +
      floattostr(CkJe) + ',' + floattostr(TkJe) + ',' + floattostr(Yj));
    Sql.Add(',''' + KhName + ''',' + IntToStr(ValDaynum) + ',''' +
      Trim(CardStatus) + '''');
    Sql.Add(',''' + CardLx + ''',''' + CzyName + ''',''' + MachineNo + ''',''' +
      CardValue + ''',' + floatToStr(Ye) + ')');
    try
      ExecSql;
    except
      ShowMessage('向数据库中插入' + DateToStr(rq) + '日' + IcKh +
        '号卡数据失败');
      Exit;
    end;
  end;
  Result := True;
end;
{向与售卡信息表相关的表中插入记录}

function TFrmCard_FirIni.InsertToSubDb(rq: TDate; IcKh: string; Yj: Double;
  ValDaynum: integer; CardStatus, CardLx, CzyName, MachineNo, CardValue:
  string):
  BooLean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Insert Into SCSJ_TKPXX');
    Sql.Add('(IC卡号,创建日期,押金,有效天数,卡片状态,卡片类型,操作员姓名,售卡机编码,卡片面值)');
    Sql.Add('values(');
    Sql.Add('''' + IcKh + ''',''' + Trim(DateToStr(rq)) + ''',' +
      floattostr(Yj));
    Sql.Add(',' + IntToStr(ValDaynum) + ',''' + Trim(CardStatus) + '''');
    Sql.Add(',''' + CardLx + ''',''' + CzyName + ''',''' + MachineNo + ''',''' +
      CardValue + ''')');
    try
      ExecSql;
    except
      ShowMessage('向数据库中插入' + DateToStr(rq) + '日' + IcKh +
        '号卡数据失败');
      Exit;
    end;
  end;
  Result := True;
end;

// 读取卡的各类信息

function TFrmCard_FirIni.ReadFromDll(filelx: string; comh: smallint; passwordz:
  PChar): smallint;
type
  TDllFunc = function(com: integer; password: pchar): smallint; stdcall;
var
  alib: THandle;
  proc: TDllFunc;
  FileName: string;
  x: FARPROC;
begin
  Screen.Cursor := crHourGlass;
  FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
  //ShowMessage('开始调用文件iccardp.dll');
  alib := LoadLibrary(PChar(FileName)); //调用dll文件
  if alib = 0 then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('无法访问ic卡机的函数iccardp.dll!');
    FreeLibrary(alib);
    Exit;
  end;
  //ShowMessage('调用文件iccardp.dll成功!');
  //ShowMessage('开始调用函数'+filelx);
  x := GetProcAddress(alib, PChar(filelx)); //获取指定函数指针
  if x = nil then
  begin
    Screen.Cursor := crDefault;
    ShowMessage(' 函数' + filelx + '调用失败!');
    FreeLibrary(alib);
    Exit;
  end;
  // else ShowMessage('函数调用成功!');
  Proc := TDllFunc(x); //转换函数类型
  if @Proc = nil then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('无法访问ic卡机读取数据函数!');
    x := nil;
    FreeLibrary(alib);
    Exit;
  end;
  //else ShowMessage('函数转换成功!');
  try
    Result := Proc(comh, passwordz);
    //ShowMessage('函数运行成功!');
  except
    ShowMessage('函数运行失败!');
  end;
  proc := nil;
  if not FreeLibrary(alib) then
    ShowMessage('释放文件不成功!');
  // else ShowMessage('释放文件成功!');
  Screen.Cursor := crDefault;
end;

//从文件中读取卡号信息

function TFrmCard_FirIni.ReadKh(var CardNo: string; comh: smallint; pass:
  Pchar): Boolean;
var
  i: integer;
  returnvalue: smallint;
  AFileName, LeftStr, s: string;
  ATextFile: Textfile;
begin
  Result := False;
  returnvalue := ReadFromDll('readcardno', comh, pass);
  if returnvalue <> 0 then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('读取卡号错误!');
    Exit;
  end;
  AFileName := Trim('c:\windows\cardno.txt');
  if not FileExists(AFileName) then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('卡号信息文件' + AFileName + '不存在,系统无法继续工作!');
    Exit;
  end;
  AssignFile(ATextFile, AFileName);
  try
    ReSet(ATextFile);
  except
    Screen.Cursor := crDefault;
    ShowMessage('卡号信息文件' + AFileName + '受到破坏,系统无法继续工作!');
    CloseFile(ATextFile);
    Exit;
  end;
  while not Eof(ATextFile) do
    Readln(ATextFile, s);
  CloseFile(ATextFile);
  s := Trim(s);
  while Copy(s, 1, 1) = '0' do
    s := Trim(Copy(s, 2, 10000000));
  CardNo := Trim(s);
  Result := True;
end;

{从系统文件中获得初始值}

procedure TFrmCard_FirIni.GetIniValue;
var
  ti: TInifile;
  MachineNo, CardType, CardValue, CardNo: string;
  Yj: Double;
begin
  PublicUnit.IsErrorFlag := False;
  OldCardFlag := False;
  CardSell_DataModule.ADOQuery2.FieldByName('日期').AsDateTime := Date;
  CardSell_DataModule.ADOQuery2.FieldByName('操作员姓名').AsString :=
    Trim(FrmMain.UserName);
  CardSell_DataModule.ADOQuery2.FieldByName('卡片状态').AsString := '未使用';
  ti := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'System.ini');
  MachineNo := ti.ReadString('默认选项', 'MachineNo', '2');
  CardType := ti.ReadString('默认选项', 'CardType', 'A');
  CardValue := ti.ReadString('默认选项', 'CardValue', '10');
  Yj := ti.ReadFloat('默认选项', 'CardYj', 5);
  IniComboBox;
  PassWord1 := ti.ReadString('默认选项', 'Mima', '55555');
  PassWord1 := UnEncryFunc(Trim(PassWord1));
  Comhm := ti.ReadInteger('默认选项', 'Port', 0);
  CardSell_DataModule.ADOQuery2.FieldByName('售卡机编码').AsString :=
    Trim(MachineNo);
  CardSell_DataModule.ADOQuery2.FieldByName('押金').AsFloat := Yj;
  CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString :=
    Trim(CardType);
  CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString :=
    Trim(CardValue);
  CardSell_DataModule.ADOQuery2.FieldByName('存款金额').AsFloat :=
    StrToFloat(CardValue) - Yj;
  if not ReadKh(CardNo, Comhm, Pchar(PassWord1)) then
  begin
    PublicUnit.IsErrorFlag := True;
    DBNavigator1.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert,
      nbEdit, nbCancel];
    DBNavigator1.DataSource.DataSet.Cancel;
    Exit;
  end;
  if CardNo <> '' then {老卡}
  begin
    //GetPreCardXx(CardNo);
    CardSell_DataModule.ADOQuery2.FieldByName('IC卡号').AsString :=
      Trim(CardNo);
    DBEdit3.ReadOnly := True;
    OldCardFlag := True;
  end
  else
    //ChangeKh(CardType,CardValue);{新卡}
  begin
    ShowMessage('这是一张新卡,请输入卡号!');
    DBEdit3.ReadOnly := False;
    DBEdit3.DataSource.DataSet.FieldByName('IC卡号').EditMask := '00000000';
    DBEdit3.SetFocus;
  end;
  //DBEdit1.SetFocus;
  ToolButton4.Enabled := True;
  ti.Free;
end;

{通过卡号获得卡片类型和卡片面值的相关信息}

procedure TFrmCard_FirIni.GetPreCardXx(CardNo: string);
var
  Fir, Sec, CardLx, CardValue: string;
  ti: TInifile;
begin
  CardSell_DataModule.ADOQuery2.FieldByName('IC卡号').AsString := Trim(CardNo);
  ti := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'System.ini');
  Fir := Copy(Trim(CardNo), 1, 1);
  Sec := Copy(Trim(CardNo), 2, 1);
  CardLx := ti.ReadString('卡类型对照表', Fir, '');
  CardValue := ti.ReadString('卡面值对照表', Sec, '');
  if CardLx <> '' then
    CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString :=
      Trim(CardLx);
  if CardValue <> '' then
    CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString :=
      Trim(CardValue);
  CardSell_DataModule.ADOQuery2.FieldByName('存款金额').AsFloat :=
    StrToFloat(CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString) -
    CardSell_DataModule.ADOQuery2.FieldByName('押金').AsFloat;
  DBComboBox1.ReadOnly := True;
  DBComboBox2.ReadOnly := True;
end;
{设置默认值}

procedure TFrmCard_FirIni.SetValue;
var
  ti: TInifile;
  MachineNo, CardType, CardValue: string;
  Yj: Double;
begin
  ti := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'System.ini');
  MachineNo :=
    Trim(CardSell_DataModule.ADOQuery2.FieldByName('售卡机编码').AsString);
  Yj := CardSell_DataModule.ADOQuery2.FieldByName('押金').AsFloat;
  CardType := CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString;
  CardValue := CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString;
  ti.WriteString('默认选项', 'MachineNo', MachineNo);
  ti.WriteString('默认选项', 'CardType', CardType);
  ti.WriteString('默认选项', 'CardValue', CardValue);
  ti.WriteFloat('默认选项', 'CardYj', Yj);
  ti.Free;
end;

procedure TFrmCard_FirIni.GetCardNo;
var
  First, Second: integer;
  CardType, CardValue, Kh: string;
begin
  CardType :=
    Trim(CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString);
  CardValue :=
    Trim(CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString);
  if (CardType = '') or (CardValue = '') then
  begin
    ShowMessage('请输入卡号和卡片类型!');
    Exit;
  end;
  PZ_DmDic.SetWork('IC卡号', Kh, 10, CardType, CardValue);
  CardSell_DataModule.ADOQuery2.FieldByName('IC卡号').AsString := Trim(Kh);
end;

//初始化多张卡片(所有卡片的卡片类型,面值,押金,存款金额,日期等信息默认为与第一张卡片完全一样)

procedure TFrmCard_FirIni.IniMulCard;
var
  CardLx, CardValue, QsCardh, IcKh, KhName, CardStatus, CzyName, MachineNo,
    ValDate, Ss, First, Second, MaxKh, CardNo: string;
  i, FirCardh, Sl, NextKh, ValDayNum: integer;
  CkJe, TkJe, Yj, Ye: Double;
  Rq: TDate;
  KpList: TStrings;
begin
  if not OldCardFlag then
  begin
    ShowMessage('新卡无法批量初始化!');
    PublicUnit.IsErrorFlag := True;
    Exit;
  end;
  Sl := StrToInt(Trim(SpinEdit1.Text));
  KpList := TStringList.Create;
  KpList.Clear;
  with CardSell_DataModule.ADOQuery2 do
  begin
    FieldByName('有效天数').AsInteger := 0;
    Rq := StrToDate(DateTimeToStr(Fields[0].AsDateTime));
    //CardNo:=Trim(FieldByName('IC卡号').AsString);
    CkJe := Fields[2].AsFloat;
    TkJe := 0;
    Yj := Fields[4].AsFloat;
    KhName := '';
    ValDayNum := FieldByName('有效天数').AsInteger;
    CardStatus := '未使用';
    CardLx := Trim(Fields[8].AsString);
    CzyName := Trim(Fields[9].AsString);
    MachineNo := Trim(Fields[10].AsString);
    CardValue := Trim(Fields[11].AsString);
    Ye := CKJe;
    ValDate := '0';
  end;
  //FirCardh:=StrToInt(CardNo);
  for i := 1 to Sl do
  begin
    if i = 1 then
      ShowMessage('请插入IC卡!')
    else
    begin
      ShowMessage('请取出上一张IC卡!');
      ShowMessage('请插入下一张IC卡!');
    end;
    if MessageBox(handle, '想继续此张卡片吗?', '提示', MB_YesNo) = ID_No then
      Continue;
    //FirCardh := FirCardh + 1;
    //IcKh := IntToStr(FirCardh);
    if not ReadKh(CardNo, Comhm, Pchar(PassWord1)) then
      Continue;
    if CardNo = '' then
      Continue;
    IcKh := Trim(CardNo);
    if not GetCardStatus(Rq, IcKh) then
      Continue;
    CardStatus := '未使用';
    if not SaveToDb1(Rq, IcKh, KhName, CardStatus,
      CardLx, CzyName, MachineNo, CardValue, ValDate,
      CkJe, TkJe, Yj, Ye, ValDayNum) then
    begin
      PublicUnit.IsErrorFlag := True;
      Continue;
    end;
    KpList.Add(IntToStr(i));
  end;
  for i := 0 to KpList.Count - 1 do
  begin
    if KpList[i] = '' then
      Continue;
    if i <> KpList.Count - 1 then
      Ss := Ss + KpList[i] + ','
    else
      Ss := Ss + KpList[i] + '张';
  end;
  ShowMessage('第' + Ss + '卡片初始化成功!');
  ScanData;
  KpList.Free;
end;
{在数据库中寻找指定类型和面值的最大卡号}

function TFrmCard_FirIni.GetMaxKh(CardLx, CardValue: string; var MaxKh:
  string): Boolean;
var
  IntMaxKh, IntMaxKh1: integer;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Select Distinct IC卡号 From  SCSJ_TKPXX');
    Sql.Add('Where 卡片类型=''' + Trim(CardLx) + '''' + 'And 卡片面值=''' +
      Trim(CardValue) + '''');
    try
      Open;
    except
      ShowMessage('无法打开卡号信息表!');
      Exit;
    end;
    if RecordCount = 0 then
    begin
      Result := True;
      MaxKh := '';
      Exit;
    end;
    First;
    IntMaxKh := StrToInt(Fields[0].AsString);
    while not eof do
    begin
      IntMaxKh1 := StrToInt(Fields[0].AsString);
      if IntMaxKh1 > IntMaxKh then
        IntMaxKh := IntMaxKh1;
      Next;
    end;
    MaxKh := IntToStr(IntMaxKh);
  end;
  Result := True;
end;

{初始化卡片类型和卡片面值列表}

procedure TFrmCard_FirIni.IniComboBox;
var
  ti: TInifile;
  TypeCount, ValueCount, i: integer;
  CardType: string;
begin

⌨️ 快捷键说明

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