📄 card_firini.pas
字号:
unit Card_FirIni;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ToolWin, ComCtrls, ExtCtrls, DBCtrls, StdCtrls, Buttons, Mask,
Grids, DBGrids, DB, IniFiles, Spin, ImgList;
type
TFrmCard_FirIni = class(TForm)
Bevel1: TBevel;
DataSource1: TDataSource;
Panel1: TPanel;
CoolBar1: TCoolBar;
ToolBar1: TToolBar;
DBNavigator1: TDBNavigator;
Button1: TButton;
BitBtn4: TBitBtn;
ToolBar3: TToolBar;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
Panel2: TPanel;
DBGrid1: TDBGrid;
Panel3: TPanel;
Panel4: TPanel;
ToolButton1: TToolButton;
ImageList1: TImageList;
Panel5: TPanel;
Label1: TLabel;
DBEdit1: TDBEdit;
Label2: TLabel;
DBText1: TDBText;
Label3: TLabel;
DBEdit2: TDBEdit;
Panel6: TPanel;
Label6: TLabel;
Label4: TLabel;
Label12: TLabel;
DBText3: TDBText;
Panel7: TPanel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Panel8: TPanel;
Label5: TLabel;
SpinEdit1: TSpinEdit;
Memo1: TMemo;
Panel9: TPanel;
DBComboBox2: TDBComboBox;
DBComboBox1: TDBComboBox;
Button2: TButton;
DBText4: TDBText;
DBText5: TDBText;
DBEdit3: TDBEdit;
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure DBEdit1DblClick(Sender: TObject);
procedure DBEdit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBEdit1Exit(Sender: TObject);
procedure DBEdit2Exit(Sender: TObject);
procedure DBEdit7Enter(Sender: TObject);
procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
procedure BitBtn4Click(Sender: TObject);
procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBEdit3DblClick(Sender: TObject);
procedure DBEdit3Change(Sender: TObject);
procedure DBEdit5DblClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure DBComboBox2Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure GetIniValue;
procedure SetValue;
public
{ Public declarations }
PassWord1: string;
Comhm: integer;
OldCardFlag: Boolean;
IsNewMul: Boolean;
procedure ScanData;
function IfEditNull: Boolean;
function SaveToDb: Boolean;
//function IfAlreadyIni(Rq: TDate; Kh, CardStatus: string): Boolean;
//function IfAlreadySold(Rq: TDate; CardStatus, Kh: string): Boolean;
function DeleteFromDB(rq: TDate; cardno, machineno, cardstatus, czyname:
string): Boolean;
function DeleteFromSubDB(rq: TDate; cardno, machineno, cardstatus, czyname:
string): Boolean;
function InsertToDb(rq: TDate; IcKh: string; CkJe, TkJe, Yj: Double; KhName:
string; ValDaynum: integer; CardStatus, CardLx, CzyName, MachineNo,
CardValue: string; Ye: Double): BooLean;
function InsertToSubDb(rq: TDate; IcKh: string; Yj: Double; ValDaynum:
integer; CardStatus, CardLx, CzyName, MachineNo, CardValue: string):
BooLean;
function WriteToCard(PassWord: Pchar; Comh: smallint; Cardh: PChar; ValDay:
PChar; CardType: string; UserPass1: string; Discount: string; Ye: string):
smallint;
function ReadFromDll(filelx: string; comh: smallint; passwordz: PChar):
smallint;
procedure GetCardNo;
procedure IniMulCard;
function GetIcKh(CardLx, CardValue: string; var First:
string; var Second: string): Boolean;
function SaveToDb1(rq: TDate; IcKh, KhName, CardStatus, CardLx, CzyName,
MachineNo, CardValue, ValDate: string;
CkJe, TkJe, Yj, Ye: Double; ValDayNum: integer): Boolean;
function GetMaxKh(CardLx, CardValue: string; var MaxKh: string): Boolean;
procedure IniComboBox;
function ChangeKh(CardLx, CardValue: string): Boolean;
procedure GetPreCardXx(CardNo: string);
function ReadKh(var CardNo: string; comh: smallint; pass:
Pchar): Boolean;
function GetCardStatus(Rq: TDate; Kh: string): Boolean;
function GetNewCardStatus(Rq: TDate; Kh: string): Boolean;
end;
procedure SetWork;
implementation
uses Card_DataModule, DI_DataModul1, PublicUnit, DI_DBCalendar, main,
DI_DBDictionery, PZ_DmDic, Card_ChangePsw, ADODB, Card_ScanXx,
Card_BackBadCard, Card_Result, PZ_RqXz;
{$R *.dfm}
procedure SetWork;
var
FrmCard_FirIni: TFrmCard_FirIni;
begin
Screen.Cursor := crHourGlass;
Application.CreateForm(TFrmCard_FirIni,FrmCard_FirIni);
FrmCard_FirIni.Show;
Screen.Cursor := CrDefault;
end;
{与窗体有关}
procedure TFrmCard_FirIni.FormShow(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
with CardSell_DataModule.ADOConnection1 do
begin
Close;
ConnectionString := 'Provider=SqlOLEDB.1;Persist Security Info=True;User ID='
+ PublicUnit.DBUser + ';Password=' + PublicUnit.DBPass +
';Initial Catalog='
+ PublicUnit.DbName + ';Data Source=' + PublicUnit.ServerName;
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('连接业务数据库失败,该系统无法正常工作!');
Exit;
end;
end;
IniComboBox;
ScanData;
PublicUnit.IfSaveClick := False;
PublicUnit.IfSaveClick := False;
Screen.Cursor := crDefault;
//InitialEdit;
end;
procedure TFrmCard_FirIni.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
{-------------------------------------------------------------------------------}
procedure TFrmCard_FirIni.ScanData;
var
CardStatus: string;
k, wid: integer;
begin
Screen.Cursor := crHourGlass;
DataSource1.DataSet := CardSell_DataModule.ADOQuery2;
CardStatus := '未使用';
with CardSell_DataModule.ADOQuery2 do
begin
Close;
Sql.Clear;
Sql.Add('Select * ');
Sql.Add('From SCSJ_TSKXX Where 卡片状态=''' + Trim(CardStatus) +
''' Order By 日期');
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('无法浏览售卡信息!');
Exit;
end;
for k := 0 to FieldCount - 1 do
begin
if k = 1 then
wid := 40
else
wid := 50;
DBGrid1.Columns[k].Title.Alignment := taCenter;
DBGrid1.Columns[k].Width := DBGrid1.Columns[k].Field.DisplayWidth + wid;
end;
Screen.Cursor := crDefault;
if PublicUnit.IfSaveClick then
PublicUnit.IfSaveClick := False;
if PublicUnit.IfDeleteClick then
PublicUnit.IfDeleteClick := False;
end;
SetDBGridFieldsDisplay(DbGrid1);
end;
//判断是否有退卡记录
function TFrmCard_FirIni.GetCardStatus(Rq: TDate; Kh: string): Boolean;
var
Status1: string;
begin
Result := False;
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('And IC卡号=''' + Trim(Kh) + '''');
Sql.Add('Order by 序号 DESC');
//Sql.SaveToFile('c:\dd.sql');
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('无法浏览卡片状态信息!');
Exit;
end;
if RecordCount = 0 then
begin
ShowMessage('此卡片还未退还,不能初始化!');
Exit;
end;
if FieldByName('卡片状态').AsString <> '退卡' then
begin
ShowMessage('此卡片还未退还,不能初始化!');
Exit;
end;
end;
Result := True;
end;
//判断新卡的卡号是否在数据库中已经存在,如果存在,说明卡号不合法
function TFrmCard_FirIni.GetNewCardStatus(Rq: TDate; Kh: string): Boolean;
begin
Result := False;
with CardSell_DataModule.ADOQuery3 do
begin
Close;
Sql.Clear;
Sql.Add('Select *');
Sql.Add('From SCSJ_TSKXX Where');
Sql.Add('Convert(char(10),日期,20)<=''' + DateToStr(Rq) + '''');
Sql.Add('And IC卡号=''' + Trim(Kh) + '''');
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('无法浏览卡片状态信息!');
Exit;
end;
if RecordCount <> 0 then
begin
ShowMessage('此卡片不是新卡!');
Exit;
end;
end;
Result := True;
end;
function TFrmCard_FirIni.SaveToDb: Boolean;
var
rq: TDate;
ValDayNum: integer;
IcKh, KhName, CardStatus, CardLx, CzyName, MachineNo, CardValue, ValDate,
Ckje1, ResultString: string;
CkJe, TkJe, Yj, Ye: Double;
returnvalue: smallint;
pass: PChar;
begin
Result := False;
ResultString := '';
pass := Pchar(Trim(PassWord1));
//校验密码
returnvalue := ReadFromDll('checkpass', Comhm, pass);
if returnvalue <> 1 then
Exit;
with CardSell_DataModule.ADOQuery2 do
begin
FieldByName('有效天数').AsInteger := 0;
rq := StrToDate(DateTimeToStr(Fields[0].AsDateTime));
IcKh := Trim(Fields[1].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;
CkJe1 := FloatToStr(CkJe * 100);
//写卡(密码,端口号,卡号,有效期,卡片类型,用户密码,折扣率,卡内余额)
returnvalue := WriteToCard(Pchar(pass), Comhm, Pchar(IcKh), '00000000', '04',
'0000', '15', Trim(CkJe1));
if returnvalue = 0 then
begin
ShowMessage('写卡错误!');
Exit;
end;
{if not DeleteFromDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
Exit;
if not DeleteFromSubDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
Exit;}
if not InsertToDb(rq, IcKh, CkJe, TkJe, Yj, KhName, ValDayNum, CardStatus,
CardLx, CzyName, MachineNo, CardValue, Ye) then
Exit;
if not InsertToSubDb(rq, IcKh, Yj, ValDayNum, CardStatus, CardLx, CzyName,
MachineNo, CardValue) then
Exit;
Result := True;
ResultString := '初始化日期: ' + DateToStr(rq) + #13 + #10;
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 + '操作员姓名: ' + CzyName + #13 + #10;
ResultString := ResultString + '售卡机编码: ' + MachineNo + #13 + #10;
ShowMessage('卡片初始化成功!');
Card_Result.SetWork(ResultString, '卡片初始化结果');
end;
//同时初始化多张卡片
function TFrmCard_FirIni.SaveToDb1(rq: TDate; IcKh, KhName, CardStatus, CardLx,
CzyName, MachineNo, CardValue, ValDate: string;
CkJe, TkJe, Yj, Ye: Double; ValDayNum: integer): Boolean;
var
CkJe1: string;
returnvalue: smallint;
pass: PChar;
begin
Result := False;
pass := Pchar(Trim(PassWord1));
//校验密码
returnvalue := ReadFromDll('checkpass', Comhm, pass);
if returnvalue <> 1 then
Exit;
CkJe1 := FloatToStr(CkJe * 100);
//写卡(密码,端口号,卡号,有效期,卡片类型,用户密码,折扣率,卡内余额)
returnvalue := WriteToCard(Pchar(pass), Comhm, Pchar(IcKh), '00000000', '04',
'0000', '15', Trim(CkJe1));
if returnvalue = 0 then
begin
ShowMessage('写卡错误!');
Exit;
end;
if not DeleteFromDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
Exit;
if not DeleteFromSubDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
Exit;
if not InsertToDb(rq, IcKh, CkJe, TkJe, Yj, KhName, ValDayNum, CardStatus,
CardLx, CzyName, MachineNo, CardValue, Ye) then
Exit;
if not InsertToSubDb(rq, IcKh, Yj, ValDayNum, CardStatus, CardLx, CzyName,
MachineNo, CardValue) then
Exit;
Result := True;
end;
{判断Edit是否有为空的字段}
function TFrmCard_FirIni.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_FirIni.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;
x: FARPROC;
begin
FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
alib := LoadLibrary(PChar(FileName));
if alib = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机的函数iccardp.dll!');
Exit;
end;
x := GetProcAddress(alib, PChar('writeCard'));
if x = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('写卡函数writeCard调用失败!');
FreeLibrary(alib);
Exit;
end;
Proc := TDllFunc(x);
if @Proc = nil then
begin
Screen.Cursor := crDefault;
x := nil;
FreeLibrary(alib);
ShowMessage('无法访问ic卡机写卡函数!');
Exit;
end;
try
Result := Proc(PassWord, Comh, Cardh, ValDay, CardType, UserPass1, Discount,
Ye);
except
ShowMessage('写卡函数运行失败!');
proc := nil;
FreeLibrary(alib);
end;
proc := nil;
FreeLibrary(alib);
end;
{删除售卡信息SCSJ_TSKXX表中相同的记录}
function TFrmCard_FirIni.DeleteFromDB(rq: TDate; cardno, machineno, cardstatus,
czyname: string): Boolean;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -