⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 salegrid.bak

📁 C++写的POS前台程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include "sysinfo.h"
#include "box.h"
#include "salegrid.h"
#include "find.h"
/******************************************************************************
			销售网格的常量.
******************************************************************************/
char CodeData[14];

//网格标题.
char 		*salegridtitle[8] = {	"ID",
								"   编  码",
								"    商  品  名  称",
								"  单 价",
								" 数量",
								"%",
								" 优  惠",
								"  小  计"};

//网格列宽度.
int 		salegridwidth[8] = {3,14,22,9,6,4,9,11};

//网格列数.
int 		salegridcols = 8;

//网格外边框.
struct	RECT salegridrect = {0,106,639,241};

//产生查找CodeNew数据文件的数据对象.
Find		Code(".\\data\\code.dat",".\\data\\code.dax");
Find		CodeNew(".\\data\\codenew.dat",".\\data\\codenew.dax");

//由于条码电子秤的条码包含价格,因此需要保留原来的条码.
char tempdata1[33];

//打印缓冲。
char prtmp[80];//打印缓冲。
/******************************************************************************/

//构造函数.
SaleGrid::SaleGrid()
			: Grid(salegridrect, salegridcols, salegridwidth, salegridtitle)
{
	//将当前列设置在编码列上.
	Col = 1;
	//增加一个空行.
	AddNew();
	//修改行号.
	sprintf(Data[0], "%3d", Row+1);
	//写入数据库.
	Update();
	//重画.
	ItemDraw(Row);
	//确定为累加模式.
	SumMode = L_NO;
	//退货标志.
	ReturnFlag = L_NO;
	//小计.
	TNumber = new Edit(CreateRect(Rect.Left + 388, Rect.Top + Rect.Height - 20, 49, 20));
	TNumber->SetFrameColor(15);
	TNumber->SetBkColor(8);
	TNumber->SetColor(15);

	TPref = new Edit(CreateRect(Rect.Left + 437, Rect.Top + Rect.Height - 20, 106, 20));
	TPref->SetFrameColor(15);
	TPref->SetBkColor(8);
	TPref->SetColor(15);

	TSum = new Edit(CreateRect(Rect.Left + 543, Rect.Top + Rect.Height - 20, 89, 20));
	TSum->SetFrameColor(15);
	TSum->SetBkColor(8);
	TSum->SetColor(15);
	Show();
}

//析构函数.
SaleGrid::~SaleGrid()
{
	delete TNumber;
	delete TPref;
	delete TSum;
}

//运行网格。
void
SaleGrid::Run()
{
	//定义事件变量.
	unsigned int Event;
	int lastrow = 0;
	for(;;)
	{
		//记住上一行的位置.
		lastrow = Row;
		//运行基础网格.
		Grid::Run();
		//取得返回事件.
		GetEvent(Event);
		//判断事件.
		switch(Event)
		{
			case EV_QUIT:
				//为了避免混乱,当前列如果不是第一列,不允许进行操作.
				if(Col != 1)
				{
					break;
				}
				PutEvent(Event);

				return;
			case EV_NEXT:
			case EV_PREV:
				break;
			case KEY_PGUP:
				//为了避免混乱,当前列如果不是第一列,不允许进行操作.
				if(Col != 1)
				{
					break;
				}
				//如果向上翻页无效则产生上一单的事件.
				if(lastrow != Row)
				{
					break;
				}
				else
				{
					PutEvent(EV_PREVCHECK);
					return;
				}
			case KEY_PGDWN:
				//为了避免混乱,当前列如果不是第一列,不允许进行操作.
				if(Col != 1)
				{
					break;
				}
				//如果向下翻页无效则产生下一单的事件.
				if(lastrow != Row)
				{
					break;
				}
				else
				{
					PutEvent(EV_NEXTCHECK);
					return;
				}
			case KEY_RETURN:
				//回车事件.
				switch(Col)
				{
					case 1:
						if(ReadOnlyFlag == L_YES) break;
						if(Line->ChangeFlag != L_YES && Row < Rows-1)
						{
							if(AdjPool()==L_YES)
							{
								DoPool();
							}
							MoveNext();
						}
						else
						{
							DoSearch();//执行查找.
						}
						ReturnFlag = L_NO;//修改退货标志为销售状态.
						break;
					case 4:
						if(ReadOnlyFlag == L_YES) break;
						//修改数量.
						ChangeNumber();
						//修改当前列.
						Col = 1;
						break;
					case 5:
						if(ReadOnlyFlag == L_YES) break;
						//修改单笔折扣率.
						ChangeDiscount();
						Col = 1;
						break;
					case 6:
						if(ReadOnlyFlag == L_YES) break;
						ChangePref();//修改单笔优惠.
						Col = 1;
						break;
				}
				PutEvent(Event);
				//累计金额。
				GridSum();
				return;
			case KEY_F1:
				//修改数量键.
				if(ReadOnlyFlag == L_YES) break;
				//为了避免打印混乱,当前列如果不是第一列,不允许进行修改操作.
				if(Col != 1)
				{
					break;
				}
				//先打印退货.
				PrintEject(prtmp);
				PrOut(prtmp);
				//修改数量键.
				Col = 4;
				break;
			case KEY_F2:
				//修改折扣率.
				if(ReadOnlyFlag == L_YES) break;
				//为了避免打印混乱,当前列如果不是第一列,不允许进行修改操作.
				if(Col != 1)
				{
					break;
				}
				//先打印退货.
				PrintEject(prtmp);
				PrOut(prtmp);
				//修改折扣率.
				Col = 5;
				break;
			case KEY_F3:
				//修改优惠额.
				if(ReadOnlyFlag == L_YES) break;
				//为了避免打印混乱,当前列如果不是第一列,不允许进行修改操作.
				if(Col != 1)
				{
					break;
				}
				//先打印退货.
				PrintEject(prtmp);
				PrOut(prtmp);
				//修改优惠额.
				Col = 6;
				break;
			case KEY_F4:
				//退货.
				if(ReadOnlyFlag == L_YES) break;
				//为了避免打印混乱,当前列如果不是第一列,不允许进行退货操作.
				if(Col != 1)
				{
					break;
				}
				if(ReturnFlag==L_NO)
				{
					ReturnFlag = L_YES;
				}
				else
				{
					ReturnFlag = L_NO;
				}
				PutEvent(Event);
				return;
			case KEY_F9:
				if(ReadOnlyFlag == L_YES) break;
				//为了避免混乱,当前列如果不是第一列,不允许进行操作.
				if(Col != 1)
				{
					break;
				}
				//打印退货.
				PrintEject(prtmp);
				PrOut(prtmp);
				//删除当前行.
				Delete(Row);
				PutEvent(Event);
				//累计金额。
				GridSum();
				return;
			case KEY_F10:
				if(ReadOnlyFlag == L_YES) break;
				//为了避免混乱,当前列如果不是第一列,不允许进行操作.
				if(Col != 1)
				{
					break;
				}
				//切换累加和不累加模式.
				ChangeSumMode();
				PutEvent(Event);
				//累计金额。
				GridSum();
				return;
			default:
				//为了避免混乱,当前列如果不是第一列,不允许进行操作.
				if(Col != 1)
				{
					break;
				}
				PutEvent(Event);
				return;
		}
	}
}

//执行查找.
void
SaleGrid::DoSearch()
{
	//数据不够13位用'*'补齐13位.
	Trim(Data[1]);
	strcpy(CodeData, Data[1]);
	Data[1][9]=0;
	//如果是空行.
	if(strlen(Data[1])==0)
	{
		return;
	}
	while(strlen(Data[1]) < 13)
	{
		strcat(Data[1],"*");
	}
	//处理条码秤.
	if(AdjBal(Data[1])==L_YES)
	{
		strcpy(tempdata1, Data[1]);
		*(Data[1] + 9) = NULL;
		while(strlen(Data[1]) < 13)
		{
			strcat(Data[1],"*");
		}
	}
	//按Grid数据缓冲中的数据Data[1](编码或条码)在CODENEW中查找.
	if(CodeNew.Search(Data[1])==L_OK)//如果查询到匹配项.
	{
		//将查询结果写到网格字段中.
		WriteToGrid(&CodeNew);
		return;
	}
	else
	{
		//按Grid数据缓冲中的数据Data[1](编码或条码)在CODE中查找.
		if(Code.Search(Data[1])==L_OK)//如果查询到匹配项.
		{
			//将查询结果写到网格字段中.
			WriteToGrid(&Code);
			return;
		}
		unsigned int Ev;
		char temp[100];
		strcpy(temp, "数据库中未发现:");
		strcat(temp, Trim(Data[1]));
		strcat(temp, " 所对应的商品.");
		//产生消息框.
		QuestionBox *Msg =new QuestionBox(temp, "等待", "继续");
r:
		Msg->Run();//运行消息框.
		GetEvent(Ev);//获取返回的事件代码.
		switch(Ev)
		{
			case CMD_YES://如果选择缺省的等待.
				goto r;
			case CMD_NO://如果选择继续.
				break;
			case EV_QUIT://如果按ESC选择继续.
				break;
		}
		delete Msg;
	}
}

//将查询结果写到网格字段中.
void
SaleGrid::WriteToGrid(Find *DB)
{
	//如果不是最后一行.
	if(Row < Rows-1)
	{
		PrintEject(prtmp);
		PrOut(prtmp);
	}
	//行号.
	sprintf(Data[0], "%3d", Row+1);
	//编码.
	char *CodeTemp;
	CodeTemp = CodeData + 9;
	strcat(DB->Code, CodeTemp);
	sprintf(Data[1], "%13s", Trim(DB->Code));
	//名称.
	sprintf(Data[2], "%22s", DB->Name);
	//单价.
	strcpy(Data[3], DB->Price);
	//数量.
	if(ReturnFlag == L_NO)
	{
		//如果原来数量为0.
		if(atof(Data[4]) == 0)
		{
			sprintf(Data[4], "%6.2f", 1.00);
		}
		//否则不管.
	}
	else
	{
		//如果原来数量为0.
		if(atof(Data[4]) == 0)
		{
			sprintf(Data[4], "%6.2f", -1.00);
		}
		else//否则.
		{
			sprintf(Data[4], "%6.2f", -fabs(atof(Data[4])));
		}
	}
	//计算单价.
	CalPrice();
	//将数据保存到文件.
	Write(Row);
	//判断柜组信息.
//	AdjGroup();    韩冰6月16日封.
	//如果是条码秤则不累加。
	if(AdjBal(Data[1])==L_YES)
	{
		goto jmp;
	}
	//判断联营方式并处理并且不累加.
	if(AdjPool()==L_YES)
	{
		//刷新重画当前行.
		ItemDraw(Row);
		//运行联营代码。
		DoPool();
		goto jmp;
	}
//-------------------------------------------------//
	//如果允许累加判断数据是否重复,重复则累加。
	//条码秤和联营编码将被跳过。
//-------------------------------------------------//
	if(SumMode == L_YES)
	{
		//打印销售数据。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -