📄 salewin3.cpp
字号:
#include <string.h>
#include <math.h>
#include <io.h>
#include <conio.h>
#include <dos.h>
#include "sysinfo.h"
#include "salewin.h"
//结帐.
int
SaleWin::CheckOut()
{
unsigned int Ev;
//先保存最后一个交易单.
if(CheckNumber >= GetMaxCheck())
{
SaveToFile();
}
//计算总计值.
if(Summary()==L_ERROR)
{
//如果不存在数据则返回.
PutEvent(EV_QUIT);
goto over;
}
//打印结帐内容。
PrintCheckOut();
//进行付款操作.
RunPay();
//--------------------------------------------
over:
GetEvent(Ev);
switch(Ev)
{
case EV_QUIT:
return L_ERROR;
case EV_EXCHANGE_OVER:
//结帐结束操作.
remove(".\\gridtemp.$$$");
//如果是有营业员方式。
if(sys->SalSW == L_YES)
{
SaleCode->SetText("");
SaleName->SetText("");
SaleGroup->SetText("");
}
AllSum->SetText("");
AllDiscount->SetText("");
ShouldPay->SetText("");
Get->SetText("");
Change->SetText("");
ClearGrid();
CheckNumber = 1;
ReadOnlyFlag = L_NO;
MaxCheck = GetMaxCheck();
return L_OK;
}
return L_ERROR;
}
//总计.统计多单总金额.
int
SaleWin::Summary()
{
//所有数据以临时文件为基础.
struct FDATA data;
char temp[32];
double TotalMoney = 0;//应付总金额.
double TotalDisMoney = 0;//总折扣金额.
FILE *fp;
//打开文件.
if((fp = fopen(".\\Gridtemp.$$$","rb"))==NULL)
{
fclose(fp);
return L_ERROR;
}
if(filelength(fileno(fp))==0)
{
fclose(fp);
return L_ERROR;
}
//定位文件指针到最开始.
fseek(fp, 0, 0);
for(;;)
{
//从文件读取数据.
if(fread(&data, sizeof(FDATA), 1, fp) == 0)
{
break;
}
//累计金额.
TotalMoney = TotalMoney + atof(data.Money);
//累计总折扣额.
TotalDisMoney = TotalDisMoney + atof(data.Price)*atof(data.Number) - atof(data.Money);
}
//关闭文件.
fclose(fp);
//将计算结果保存到文本框.
sprintf(temp, "%13.2f", TotalDisMoney);
AllDiscount->SetText(temp);
sprintf(temp, "%13.2f", TotalMoney);
AllSum->SetText(temp);
ShouldPay->SetText(temp);
Get->SetText(Trim(temp));
//向顾客显示屏幕输出.
char cttemp[25];
Ct_Clear();
Ct_Out("Sum:");
sprintf(cttemp, "%12.2f\r\n", TotalMoney);
Ct_Out(cttemp);
return L_OK;
}
//运行
void
SaleWin::RunPay()
{
unsigned int Event;
int stat;
//开始事务.
BeginTran();
Get->ReturnFlag = L_YES;
for(;;)
{
Get->Run();
GetEvent(Event);
switch(Event)
{
case EV_QUIT:
PutEvent(EV_QUIT);
//回滚事务.
RollBackTran();
return;
case KEY_RETURN:
//输入了金额以后进行第一次确认(按回车)
stat = Pay();
if(stat == L_NO)//是否要进行多重付款.
{
PutEvent(EV_EXCHANGE_OVER);
WriteLDB();//写本地数据库.
//提交事务.
CommitTran();
getch();
return;
}
else if(stat == -2)//写多重付款库错误.
{
}
else
{
break;
}
}
}
}
//在输入框中操作员已经填写了金额,以下程序判断金额的正确性,并记录数据
int
SaleWin::Pay()
{
char temp[20];
char prtemp[30], prtemp1[80];
//如果金额长度大于11位则截断它。
if(strlen(Get->Text()) > 11)
{
strncpy(temp, Get->Text(), 11);
temp[11] = NULL;
}
else
{
strcpy(temp, Get->Text());
}
sprintf(temp, "%0.2f", atof(temp));
Get->SetText(temp);
//数据判断:
//将字符转换成数字进行判断.
double shouldpay = atof(ShouldPay->Text());
double pay = atof(Get->Text());
//向顾客显示屏幕输出.
char cttemp[25];
Ct_Clear();
Ct_Out("Pay:");
sprintf(cttemp, "%12.2f\r\n", pay);
Ct_Out(cttemp);
//1、如果顾客付的金额负数,认为不合法,返回重来。
if(pay < 0)
{
sprintf(temp, "%0.2f", 0.0);
Change->SetText(temp);
return L_YES;
}
//2、如果金额在零到应付额之间,
// 进行部分付帐(多重付款)。
if(pay - shouldpay < 0)
{
//写付款数据文件.
if(WriteMulpay(Get->Text(), "0", "", "")==L_ERROR)
{
return -2;
}
//打印付款数据.
sprintf(prtemp, " 付现金:%12.2f\n", pay);
PrOut(prtemp);
sprintf(temp, "%13.2f", shouldpay - pay);
ShouldPay->SetText(temp);
sprintf(temp, "%0.2f", 0.0);
Get->SetText(temp);
sprintf(temp, "%0.2f", 0.0);
Change->SetText(temp);
//开钱箱。
outportb(0x220,1);
delay(200);
outportb(0x220,0);
//多重付款打印在此.
return L_YES;
}
//3、如果金额大于应付,则进行找零。
if(pay - shouldpay >= 0)
{
//写付款数据文件.
if(WriteMulpay(ShouldPay->Text(), "0", "", "")==L_ERROR)
{
return -2;
}
//向顾客显示屏幕输出.
char cttemp[25];
Ct_Out("Change:");
sprintf(cttemp, "%6.2f\r\n", pay - shouldpay);
Ct_Out(cttemp);
//打印付款数据.
sprintf(prtemp, " 付现金:%12.2f\n", pay);
strcpy(prtemp1, prtemp);
strcat(prtemp1, "------------------------\n");
sprintf(prtemp, " 找 零:%12.2f\n", pay - shouldpay);
strcat(prtemp1, prtemp);
PrOut(prtemp1);
//打印尾标题。
PrintTail();
ShouldPay->SetText("<已付清>");
// Get->SetText("<已付清>");
sprintf(temp, "%13.2f", pay - shouldpay);
Change->SetText(temp);
//开钱箱。
outportb(0x220,1);
delay(200);
outportb(0x220,0);
return L_NO;
}
return L_YES;
}
int
SaleWin::BeginTran()
{
FILE *fp;
long s1,s2,t1,t2,m1,m2;
//记录sales.dat的文件长度.
if((fp = fopen(".\\data\\sales.dat", "rb"))==NULL)
{
s1 = 0L;
}
s1 = filelength(fileno(fp));
fclose(fp);
//记录sales.tmp的文件长度.
if((fp = fopen(".\\data\\sales.tmp", "rb"))==NULL)
{
s2 = 0L;
}
else
{
s2 = filelength(fileno(fp));
fclose(fp);
}
//记录total.dat的文件长度.
if((fp = fopen(".\\data\\total.dat", "rb"))==NULL)
{
t1 = 0L;
}
t1 = filelength(fileno(fp));
fclose(fp);
//记录total.tmp的文件长度.
if((fp = fopen(".\\data\\total.tmp", "rb"))==NULL)
{
t2 = 0L;
}
else
{
t2 = filelength(fileno(fp));
fclose(fp);
}
//记录Mulpay.dat的文件长度.
if((fp = fopen(".\\data\\mulpay.dat", "rb"))==NULL)
{
m1 = 0L;
}
m1 = filelength(fileno(fp));
fclose(fp);
//记录mulpay.dat的文件长度.
if((fp = fopen(".\\data\\mulpay.tmp", "rb"))==NULL)
{
m2 = 0L;
}
else
{
m2 = filelength(fileno(fp));
fclose(fp);
}
//------------------------------------------------------------
if((fp = fopen(".\\data\\tran.dat", "w+b")) == NULL)
{
return L_ERROR;
}
if(fwrite(&s1, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fwrite(&s2, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fwrite(&t1, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fwrite(&t2, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fwrite(&m1, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fwrite(&m2, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
fclose(fp);
return L_OK;
}
int
SaleWin::RollBackTran()
{
FILE *fp;
long s1,s2,t1,t2,m1,m2;
if((fp = fopen(".\\data\\tran.dat", "rb")) == NULL)
{
return L_ERROR;
}
if(fread(&s1, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fread(&s2, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fread(&t1, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fread(&t2, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fread(&m1, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
if(fread(&m2, sizeof(long), 1, fp)==0)
{
return L_ERROR;
}
fclose(fp);
//------------------------------------------------------------
//记录sales.dat的文件长度.
if((fp = fopen(".\\data\\sales.dat", "r+b"))==NULL)
{
return L_ERROR;
}
chsize(fileno(fp), s1);
fclose(fp);
//记录sales.tmp的文件长度.
if((fp = fopen(".\\data\\sales.tmp", "r+b"))==NULL)
{
return L_ERROR;
}
chsize(fileno(fp), s2);
fclose(fp);
//记录total.dat的文件长度.
if((fp = fopen(".\\data\\total.dat", "r+b"))==NULL)
{
return L_ERROR;
}
chsize(fileno(fp), t1);
fclose(fp);
//记录total.tmp的文件长度.
if((fp = fopen(".\\data\\total.tmp", "r+b"))==NULL)
{
return L_ERROR;
}
chsize(fileno(fp), t2);
fclose(fp);
//记录Mulpay.dat的文件长度.
if((fp = fopen(".\\data\\mulpay.dat", "r+b"))==NULL)
{
return L_ERROR;
}
chsize(fileno(fp), m1);
fclose(fp);
//记录mulpay.dat的文件长度.
if((fp = fopen(".\\data\\mulpay.tmp", "r+b"))==NULL)
{
return L_ERROR;
}
chsize(fileno(fp), m2);
fclose(fp);
remove(".\\data\\tran.dat");
return L_OK;
}
int
SaleWin::CommitTran()
{
remove(".\\data\\tran.dat");
return L_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -