📄 salewin1.cpp
字号:
#include <stdlib.h>
#include <string.h>
#include "box.h"
#include "salewin.h"
#include "findsale.h"
#include "sysinfo.h"
#include "alloc.h"
//产生查找营业员的对象。
FindSaler Saler(".\\data\\Salers.dat");
//产生查找柜组对应的数据对象。
FindGroup FGroup(".\\data\\grcode.dat");
//运行主界面。
void
SaleWin::RunSale()
{
unsigned int Event, Ev;
//显示操作员信息。
OpCode->SetText(OperatorCode);
OpName->SetText(OperatorName);
OpTerm->SetText(sys->TermID);
//取得当前交易临时文件中最大单号.
MaxCheck = GetMaxCheck();
if(MaxCheck >= 1)
{
//更新流水号。
char temp[7];
sprintf(temp, "%06ld", GetSeqNum());
SeqNumber->SetText(temp);
//取得当前交易临时文件中最大单号.
CheckNumber = MaxCheck;
GetFromFile(CheckNumber);
Row = Rows - 1;
Read(Row);
goto run;
}
for(;;)
{
//更新流水号。
char temp[7];
sprintf(temp, "%06ld", GetSeqNum());
SeqNumber->SetText(temp);
if(sys->SalSW == L_YES)
{
//运行营业员输入框。
SaleCode->Run();
}
else
{
//外部产生事件。这个事件将导致运行网格。
PutEvent(KEY_RETURN);
}
//取得返回事件。
GetEvent(Event);
switch(Event)
{
case EV_QUIT:
return;
case KEY_F7:
//结帐。
if(CheckOut()==L_OK)
{
TestNetwork();
//打印小票标题。
PrintTitle();
}
break;
case KEY_F6:
//产生新单。
NewCheck();
break;
case KEY_F8:
//测试网络并传送数据.
TestNetwork();
break;
case KEY_ALT_P:
//不打印数据.
if(sys->PrnType != 0)
{
sys->PrnType = 0;
}
else
{
sys->PrnType = 1;
}
GetFlag();
break;
case EV_NEXT:
case EV_PREV:
case KEY_RETURN:
//如果是有营业员方式。
if(sys->SalSW == L_YES)
{
//查找营业员。
if(FindSaler() == L_ERROR )
{
break;
}
}
//打印小票头部信息。
PrintHeadInfo();
run:
RunGrid();
GetEvent(Ev);
//如果是无营业员方式。
if(sys->SalSW != L_YES)
{
if(Ev == EV_QUIT)
{
return;
}
break;
}
else
{
break;
}
case KEY_PGDWN:
//下一单。
NextCheck();
break;
case KEY_PGUP:
//上一单。
PrevCheck();
break;
default:
break;
}
}
}
//运行网格。
void
SaleWin::RunGrid()
{
unsigned int Event, Ev;
QuestionBox *QBox;
//根据变量刷新状态位。
GetFlag();
for(;;)
{
SaleGrid::Run();
GetEvent(Event);
switch(Event)
{
case EV_QUIT:
//退出。
//如果是无营业员方式。
if(sys->SalSW != L_YES)
{
if(Rows > 1 || CheckNumber > 1)
{
QBox = new QuestionBox("交易未结帐,您一定要退出吗?", "不是", "是的");
QBox->Run();
GetEvent(Ev);
switch(Ev)
{
case CMD_NO:
PutEvent(EV_QUIT);
if(CheckNumber>=GetMaxCheck())
{
SaveToFile();
}
delete QBox;
return;
case CMD_YES:
delete QBox;
break;
case EV_QUIT:
delete QBox;
break;
};
break;
}
else
{
PutEvent(EV_QUIT);
return;
}
}
else
{
if(Rows > 1 || CheckNumber > 1)
{
QBox = new QuestionBox("交易未结帐,您一定要退出吗?", "不是", "是的");
QBox->Run();
GetEvent(Ev);
switch(Ev)
{
case CMD_NO:
PutEvent(EV_QUIT);
if(CheckNumber>=GetMaxCheck())
{
SaveToFile();
}
delete QBox;
return;
case CMD_YES:
delete QBox;
break;
case EV_QUIT:
delete QBox;
break;
};
break;
}
else
{
PutEvent(EV_QUIT);
return;
}
// 韩冰6.17. break;
}
case KEY_F7:
//结帐。
if(CheckOut()==L_OK)
{
TestNetwork();
//打印小票标题。
PrintTitle();
PutEvent(EV_NOTHING);
return;
}
else
{
break;
}
case KEY_F6:
if(sys->SalSW == L_YES)
{
//产生新单。
NewCheck();
PutEvent(EV_NOTHING);
return;
}
else
{
//产生新单。
if(NewCheck()==L_OK)
{
//打印小票头部信息。
PrintHeadInfo();
}
break;
}
case KEY_F8:
//测试网络并传送数据.
TestNetwork();
break;
case EV_NEXTCHECK:
//下一单。
NextCheck();
break;
case EV_PREVCHECK:
//上一单。
PrevCheck();
break;
case KEY_F5:
if(ReadOnlyFlag == L_YES) break;
//改变整体折扣率。
ChangeTotalDiscount();
break;
case KEY_ALT_P:
//不打印数据.
if(sys->PrnType != 0)
{
sys->PrnType = 0;
}
else
{
sys->PrnType = 1;
}
GetFlag();
break;
default:
break;
}
//刷新状态栏标志。
GetFlag();
}
}
//改变整体折扣率。
void
SaleWin::ChangeTotalDiscount()
{
unsigned int Ev;
int i, row;
char temp[10];
//循环运行。
for(;;)
{
//运行整体折扣框。
TotalDisRate->Run();
//获取返回的事件。
GetEvent(Ev);
switch(Ev)
{
case EV_QUIT:
//按ESC返回。
return;
case KEY_RETURN:
case EV_NEXT:
//按回车。
//如果输入数据大于100。
if(atoi(TotalDisRate->Text()) >= 100)
{
sprintf(temp, "%5d", 99);
}
//如果小于0。
else if(atoi(TotalDisRate->Text()) <= 0)
{
strcpy(temp, "");
}
//在0~100之间。
else
{
sprintf(temp, "%5d", atoi(TotalDisRate->Text()));
}
//回写文本。
TotalDisRate->SetText(temp);
//重新计算小计。
row = Row;//记住当前行。
for(i=0; i<Rows; i++)
{
Read(i);
if(strlen(Data[1]) > 0)
{
//更新小计
CalPrice();
//写入网格.
Write(i);
}
}
Row = row;//回到原来当前行。
Read(Row);
//重画。
Draw();
//重新进行单累计.
GridSum();
return;
default:
//如果是其他事件,不响应,继续运行。
break;
}
}
}
//刷新状态标志。
void
SaleWin::GetFlag()
{
//刷新累加标志。
if(SumMode == L_NO)
{
//如果显示的不是要求值则修改。
if(strcmp(IsGroupBy->Text(),"不累加")!=0)
{
IsGroupBy->SetText("不累加");
}
}
else
{
//如果显示的不是要求值则修改。
if(strcmp(IsGroupBy->Text(),"累 加")!=0)
{
IsGroupBy->SetText("累 加");
}
}
//刷新退货/销售标志。
if(ReturnFlag == L_NO)
{
//如果显示的不是要求值则修改。
if(strcmp(IsSale->Text(),"销 售")!=0)
{
IsSale->SetText("销 售");
}
}
else
{
//如果显示的不是要求值则修改。
if(strcmp(IsSale->Text(),"退 货")!=0)
{
IsSale->SetText("退 货");
}
}
//刷新打印标志。
if(sys->PrnType == 0)
{
if(strcmp(IsPrint->Text(),"不打印")!=0)
{
IsPrint->SetText("不打印");
}
}
else
{
if(strcmp(IsPrint->Text(),"打 印")!=0)
{
IsPrint->SetText("打 印");
}
}
}
//计算单价。
void
SaleWin::CalPrice()
{
//更新计算小计。
//计算单笔折扣。
double pr = atof(Data[3]) - atof(Data[5])/ 100.0 * atof(Data[3]);
//计算整体折扣。
pr = pr - atof(TotalDisRate->Text())/100.0 * pr;
//四舍五入。
pr = (long)(pr * 100.0 + 0.5) / 100.0;
//计算小计。
sprintf(Data[7], "%11.2lf" , pr * atof(Data[4]) - atof(Data[6]));
//判断数据的合法性,如果在非退货情况下金额小于0给出提示。
if(atof(Data[7]) < 0.0 && atof(Data[4]) > 0)
{
char temp[100];
//产生消息字符串。
sprintf(temp, "第:%4d", atoi(Data[0]));
strcat(temp, " 行金额小于 0.00, 不合法, 请改正.");
//产生消息对话框。参见Box.cpp.
MsgBox *Msg = new MsgBox(temp);
//运行消息框。
Msg->Run();
//删除消息框。
delete Msg;
}
}
int
SaleWin::FindSaler()
{
//给营业员编号加上前导0。
char temp[10];
strncpy(temp, SaleCode->Text(),6);
temp[5] = NULL;
sprintf(temp, "%05ld", atol(temp));
SaleCode->SetText(temp);
if(Saler.SearchCode(SaleCode->Text()) == L_ERROR)
{
return L_ERROR;
}
else
{
//营业员代码.
SaleCode->SetText(Trim(Saler.SaCode));
//营业员姓名.
SaleName->SetText(Trim(Saler.SaName));
//营业员台号.
SaleGroup->SetText(Trim(Saler.SaGroup));
}
return L_OK;
}
//验证商品对应营业员柜组是否正确。
void
SaleWin::AdjGroup()
{
char temp[14];
MsgBox *Msg;
strcpy(temp, Data[1]);
Trim(temp);
temp[3] = NULL;
if(FGroup.SearchCode(temp)==L_ERROR)
{
//发现未知柜组编码.
printf("\007\007\007");
Msg = new MsgBox("发现未知柜组的商品编码,请立即与管理员联系.");
Msg->Run();
delete Msg;
}
else
{
//如果是营业员方式。
if(sys->SalSW == L_YES)
{
//将查询的柜组编码与营业员编码比较.
if(strcmp(FGroup.Group, SaleGroup->Text())!=0)
{
//提示不允许卖非此营业员管理的柜组的商品.
printf("\007\007");
Msg = new MsgBox("营业员或者商品柜组不对,请与营业员核对");
Msg->Run();
delete Msg;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -