📄 card_secsell.~pas
字号:
ResultString := ResultString + '卡号: ' + IcKh + #13 + #10;
ResultString := ResultString + '卡片面值: ' + CardValue + #13 + #10;
ResultString := ResultString + '押金: ' + FloatToStr(Yj) + #13 + #10;
ResultString := ResultString + '存款金额: ' + FloatToStr(CkJe) + #13 + #10;
ResultString := ResultString + '卡片状态: ' + CardStatus + #13 + #10;
ResultString := ResultString + '卡片类型: ' + CardLx + #13 + #10;
ResultString := ResultString + '有效天数: ' + IntToStr(ValDay) + #13 + #10;
ResultString := ResultString + '客户姓名: ' + KhName + #13 + #10;
ResultString := ResultString + '操作员姓名: ' + CzyName + #13 + #10;
ResultString := ResultString + '售卡机编码: ' + MachineNo + #13 + #10;
Xj := StrToFloat(CardValue) - PublicUnit.YsJe;
if PublicUnit.IsPassValDay then
begin
HintXx:='超期退卡!应该退还餐券' + FloatToStr(PublicUnit.YsCqJe) + '元!'+#13+#10;
HintXx:=HintXx+'应收现金' + FloatToStr(Xj) + '元';
end
else
HintXx:='应收现金' + FloatToStr(Xj) + '元';
ResultString:=ResultString+HintXx;
Card_Result.SetWork(ResultString, '售卡结果');
Result := True;
end;
//向卡中写入数据
function TFrmCard_SecSell.WriteToCard(PassWord: Pchar; Comh: smallint; Cardh:
PChar; ValDay: PChar; CardType: string; UserPass1: string; Discount: string;
Ye:
string): smallint;
type
TDllFunc = function(pass: Pchar; comh: smallint; cardno: PChar; valdate:
PChar; dyte: string; userpass: string; disc: string; blance: string):
smallint; stdcall;
var
alib: THandle;
proc: TDllFunc;
FileName: string;
begin
FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
try
alib := LoadLibrary(PChar(FileName));
if alib = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机的函数iccardp.dll!');
Exit;
end;
Proc := TDllFunc(GetProcAddress(alib, PChar('writeCard')));
if @Proc = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机写卡函数!');
Exit;
end;
Result := Proc(PassWord, Comh, Cardh, ValDay, CardType, UserPass1, Discount,
Ye);
finally
begin
proc := nil;
FreeLibrary(alib);
end;
end;
end;
{删除售卡信息SCSJ_TSKXX表中相同的记录}
function TFrmCard_SecSell.DeleteFromDB(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_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_SecSell.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_SecSell.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_SecSell.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_SecSell.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('函数运行失败!');
proc := nil;
FreeLibrary(alib);
Exit;
end;
proc := nil;
if not FreeLibrary(alib) then
ShowMessage('释放文件不成功!');
//else ShowMessage('释放文件成功!');
Screen.Cursor := crDefault;
end;
{判断Edit是否有为空的字段}
function TFrmCard_SecSell.IfEditNull: Boolean;
var
i: integer;
Temp: TComponent;
begin
Result := True;
for i := 0 to ComponentCount - 1 do
begin
Temp := Components[i];
if (Temp is TDBEdit) then
if TDBEdit(Temp).Text = '' then
begin
ShowMessage(TDBEdit(Temp).Hint + '不能为空');
TDBEdit(Temp).SetFocus;
Exit;
end;
end;
Result := False;
end;
{获得数据库中与读写器中卡片卡号相同,状态为使用的最近的一条记录的序号}
function TFrmCard_SecSell.FindNeareastRecord(CardNo:String;var MaxXh:integer):Boolean;
begin
Result:=False;
MaxXh:=-100;
with CardSell_DataModule.ADOQuery3 do
begin
Close;
Sql.Clear;
Sql.Add('Select top 1 序号');
Sql.Add('From SCSJ_TSKXX Where');
//Sql.Add('Convert(char(10),日期,20)<=''' + DateToStr(Rq) + '''');
Sql.Add('IC卡号=''' + Trim(CardNo) + '''');
Sql.Add('And 卡片状态=''' +'使用'+ '''');
Sql.Add('Order by 序号 DESC');
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('无法浏览卡片销售信息!');
Exit;
end;
if RecordCount = 0 then
begin
ShowMessage('卡片信息表中没有此卡号的销售信息!');
Exit;
end;
MaxXh:=FieldByName('序号').AsInteger;
end;
Result:=True;
end;
procedure TFrmCard_SecSell.BitBtn1Click(Sender: TObject);
var
Rq: TDate;
Kh,HintXx,ResultString: string;
begin
WriteToHistroy('前台退卡', Now, Time, '用户《' + FrmMain.UserName +
'进行了退卡操作', FrmMain.UserName);
//if IfEditNull then
// Exit;
with CardSell_DataModule.ADOQuery2 do
begin
Kh := Trim(FieldByName('IC卡号').AsString);
Rq := StrToDate(DateTimeToStr(FieldByName('日期').AsDateTime));
end;
if not ReadXx(Kh, Rq) then
begin
DBNavigator1.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbEdit, nbCancel];
PublicUnit.IsErrorFlag := True;
ToolButton1.Enabled := False;
DBNavigator1.DataSource.DataSet.Cancel;
Exit;
end;
//是新卡
if not OldCardFlag then
begin
ShowMessage('此卡片是一张新卡,还未初始化!');
DBNavigator1.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbEdit, nbCancel];
DBNavigator1.DataSource.DataSet.Cancel;
PublicUnit.IsErrorFlag := True;
ToolButton1.Enabled := False;
Exit;
end
else {//老卡,判断是否已经初始化} if not GetCardStatus(Rq, Kh) then
begin
DBNavigator1.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast,
nbInsert, nbEdit, nbCancel];
DBNavigator1.DataSource.DataSet.Cancel;
PublicUnit.IsErrorFlag := True;
ToolButton1.Enabled := False;
Exit;
end;
if SaveToDb then
//ShowMessage('卡片销售成功!')
else
begin
PublicUnit.IsErrorFlag := True;
DBNavigator1.DataSource.DataSet.Cancel;
//ShowMessage('卡片销售失败!');
ResultString:='';
ResultString:=ResultString+'卡片销售失败!'+#13+#10;
if PublicUnit.IsPassValDay then
HintXx:='超期退卡!应该退还现金' + FloatToStr(PublicUnit.YsJe) +
'元,退还餐券' + FloatToStr(PublicUnit.YsCqJe) + '元!'
else
HintXx:='有效期内退卡!应该退还现金' + FloatToStr(PublicUnit.YsJe) + '元!';
ResultString:=ResultString+HintXx+#13+#10;
Card_Result.SetWork(ResultString, '退卡结果');
end;
DBNavigator1.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbCancel];
ToolButton1.Enabled := False;
ToolButton2.Enabled := True;
ScanData;
//Close;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -