📄 card_firini.pas
字号:
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 + -