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

📄 salewin2.cpp

📁 金融pos机前台源码
💻 CPP
字号:
/*
	模块:多单模块。
*/

#include <string.h>
#include <io.h>
#include <stdlib.h>
#include "sysinfo.h"
#include "def.h"
#include "salewin.h"
void
SaleWin::ClearGrid()
{
	if(sys->SalSW == L_YES)
	{
		//营业员代码.
		SaleCode->SetText("");
		//营业员姓名.
		SaleName->SetText("");
		//营业员台号.
		SaleGroup->SetText("");
	}
	//整体折扣率.
	TotalDisRate->SetText("");
	//删除当前单。
	DeleteAll();
	//给0行增加行号并保存。
	sprintf(Data[0], "%3d", 1);
	Write(Row);
	ItemDraw(Row);
	GridSum();
}

//将当前网格中的数据存入文件。
int
SaleWin::SaveToFile()
{
	//缓冲中的数据.
	struct FDATA data;
	//记录保存的时间和日期.
	char nowTime[9],nowDate[11];
	char salegrouptemp[14];
	FILE *fp;
	long Size;

	//获取日期.
	strcpy(nowTime, GetTime());
	strcpy(nowDate, GetDate());

	//判断尺寸.
	if((fp = fopen(".\\Gridtemp.$$$","r+b"))!=NULL)
	{
		//定位文件指针到最开始.
		fseek(fp, 0, 0);
		for(;;)
		{
			//从文件读取数据.
			if(fread(&data, sizeof(FDATA), 1, fp) == 0)
			{
				break;
			}
			//判断是否是要求的单.
			if(data.CheckNum == CheckNumber)
			{
				chsize(fileno(fp), data.PrevSize);
				break;
			}
		}
		fclose(fp);
	}
	//为了写数据打开文件.
	if((fp = fopen(".\\Gridtemp.$$$","a+b"))==NULL)
	{
		return L_ERROR;
	}
	Size = filelength(fileno(fp));
	for(int i=0; i<Rows - 1; i++)//之所以减一是为了去掉最后一个空行.
	{
		//读取网格中的数据.
		Read(i);
		//将网格数据保存到字段中.
		sprintf(data.Term,		"%03d",	atoi(OpTerm->Text()));
		sprintf(data.Operator,	"%05ld",	atol(OpCode->Text()));
		//如果是有营业员方式。
		if(sys->SalSW == L_YES)
		{
			sprintf(data.Group,	"%06ld",	atol(SaleGroup->Text()));
			strcpy(data.Saler, 				SaleCode->Text());
		}
		else
		{
			strcpy(salegrouptemp, Data[1]);
			Trim(salegrouptemp);
			salegrouptemp[3] = NULL;
			//从对应数据库中查找柜组。
			if(FGroup.SearchCode(salegrouptemp)==L_OK)
			{
				sprintf(data.Group,	"%06ld",	atol(FGroup.Group));
			}
			else
			{
				sprintf(data.Group,	"%06ld",	0L);
			}
			sprintf(data.Saler,	"%05ld",	0L);
		}
		sprintf(data.SeqNumber,	"%06ld",	atol(SeqNumber->Text()));
		data.CheckNum = CheckNumber;
		strcpy(data.ID,					Data[0]);
		strcpy(data.Time,					nowTime);
		strcpy(data.Date,					nowDate);

		strcpy(data.TotalDiscount, 	TotalDisRate->Text());
		strcpy(data.Discount, 			Data[5]);
		strcpy(data.Pref, 				Data[6]);

		strcpy(data.Code, 				Data[1]);
		strcpy(data.Name, 				Data[2]);
		strcpy(data.Price, 				Data[3]);
		strcpy(data.Number, 				Data[4]);
		strcpy(data.Money, 				Data[7]);
		data.PrevSize = Size;
		//将data中的数据追加到文件的尾部.
		fwrite(&data, sizeof(FDATA), 1, fp);
	}
	fclose(fp);
	system(".\\smartdrv /c");
	return L_OK;
}

//从文件中获取指定单号的数据。
int
SaleWin::GetFromFile(int checknum)
{
	//缓冲中的数据.
	struct FDATA data;
	char td[6], sa[6];
	FILE *fp;
	//打开文件.
	if((fp = fopen(".\\Gridtemp.$$$","rb")) == NULL)
	{
		return L_ERROR;
	}
	//冻结网格.
	IsFreeze();
	//到最后一行.
	Row = Rows - 1;
	//定位文件指针到最开始.
	fseek(fp, 0, 0);
	for(;;)
	{
		//从文件读取数据.
		if(fread(&data, sizeof(FDATA), 1, fp) == 0)
		{
			break;
		}
		//判断是否是要求的单.
		if(data.CheckNum == checknum)
		{
			//将网格数据保存到字段中.
			CheckNumber = data.CheckNum;
			strcpy(td, 		 	data.TotalDiscount);
			strcpy(sa, 		 	data.Saler);
			strcpy(Data[0], 	data.ID);
			strcpy(Data[1], 	data.Code);
			strcpy(Data[2], 	data.Name);
			strcpy(Data[3], 	data.Price);
			strcpy(Data[4], 	data.Number);
			strcpy(Data[5], 	data.Discount);
			strcpy(Data[6], 	data.Pref);
			strcpy(Data[7], 	data.Money);
			//保存数据.
			Write(Row);
			//增加空行.
			AddNew();
		}
	}
	//关闭文件.
	fclose(fp);
	//改写总体折扣率.
	TotalDisRate->SetText(td);
	//如果是有营业员方式。
	if(sys->SalSW == L_YES)
	{
		//改写营业员编码.
		SaleCode->SetText(sa);
		FindSaler();
	}
	//网格解冻并刷新.
	IsRefresh();
	//重新统计.
	GridSum();
	return L_OK;
}

//从文件中获取存在数据的最大单号。
int
SaleWin::GetMaxCheck()
{
	//建立缓冲的数据结构.
	struct FDATA data;
	FILE 	*fp;
	int 	checknum;
	//打开文件.
	if((fp = fopen(".\\Gridtemp.$$$","rb")) == NULL)
	{
		//修改多单标志,因为没有临时文件,所以肯定是单笔交易。
		if(strcmp(IsSingle->Text(),"单  笔")!=0)
		{
			IsSingle->SetText("单  笔");
		}
		//返回0表示没有单据.
		return 0;
	}
	//定位文件指针到最开始.
	fseek(fp, 0, 0);
	//最大单号设置为0.
	checknum = 0;
	for(;;)
	{
		//从文件读取数据.
		if(fread(&data, sizeof(FDATA), 1, fp) == 0)
		{
			break;
		}
		//判断是否是要求的单.
		if(data.CheckNum > checknum)
		{
			checknum = data.CheckNum;
		}
	}
	//关闭文件.
	fclose(fp);
	//如果文件存在并且包含数据,那么肯定是多单交易了.
	if(checknum > 1)
	{
		//刷新多单标志。
		if(strcmp(IsSingle->Text(),"多  单")!=0)
		{
			IsSingle->SetText("多  单");
		}
	}
	return checknum;
}

//上一单。
void
SaleWin::PrevCheck()
{
	//获取文件中最大单号。
	MaxCheck = GetMaxCheck();
	//如果当前单未保存。
	if(CheckNumber >= MaxCheck)
	{
		if(Rows > 1)//如果包含数据。
		{
			//保存单.
			SaveToFile();
			MaxCheck = GetMaxCheck();
		}
		else//如果不包含数据。
		{
			//撤消单.
			CheckNumber--;
			//从文件读取指定单号数据。
			GetFromFile(CheckNumber);
		}
	}
	if(CheckNumber > 1)
	{
		//单号减一.
		CheckNumber--;
		//清除网格.
		ClearGrid();
		//从文件读取指定单号数据。
		GetFromFile(CheckNumber);
	}
	//如果不是最后一单就应为只读模式。
	if(CheckNumber >= MaxCheck)
	{
		ReadOnlyFlag = L_NO;
	}
	else
	{
		ReadOnlyFlag = L_YES;
	}
	//如果不存在文件.
	if(MaxCheck == 0)
	{
		ReadOnlyFlag = L_NO;
	}
}

//下一单。
void
SaleWin::NextCheck()
{
	//获取文件中最大单号。
	MaxCheck = GetMaxCheck();
	//如果当前单不是文件中最后一单的话。
	if(CheckNumber < MaxCheck)
	{
		//单号加一。
		CheckNumber++;
		//清除网格。
		ClearGrid();
		//从文件读取指定单号数据。
		GetFromFile(CheckNumber);
		//设置当前行为第一行。主要是为了翻页时感觉连贯。
		Row = 0;
		Read(Row);
	}
	//如果不是最后一单就应为只读模式。
	if(CheckNumber < MaxCheck)
	{
		ReadOnlyFlag = L_YES;
	}
	else
	{
		ReadOnlyFlag = L_NO;
	}
	//如果不存在文件.
	if(MaxCheck == 0)
	{
		ReadOnlyFlag = L_NO;
	}
}

//开一个新单。
int
SaleWin::NewCheck()
{
	//多单.
	//获取文件中最大单号。
	MaxCheck = GetMaxCheck();
	if(CheckNumber < MaxCheck)
	{
		CheckNumber = MaxCheck;
		ClearGrid();//清除网格.
		GetFromFile(CheckNumber);
	}
	//如果当前单没有保存在文件中。
	if(CheckNumber >= MaxCheck)
	{
		SaveToFile();//保存单据.
	}
	//如果不包含数据则返回。
	if(Rows < 2)
	{
		return L_ERROR;
	}
	PrintMulCheck();//打印多单小结.
	ClearGrid();//清除网格.
	CheckNumber++;//单号加一.
	//如果不是最后一单就应为只读模式。
	if(CheckNumber <= MaxCheck)
	{
		ReadOnlyFlag = L_YES;
	}
	else
	{
		ReadOnlyFlag = L_NO;
	}
	//如果不存在文件.
	if(MaxCheck <= 0)
	{
		ReadOnlyFlag = L_NO;
	}
	//程序运行到这肯定是多单交易了,刷新多单标志。
	if(strcmp(IsSingle->Text(),"多  单")!=0)
	{
		IsSingle->SetText("多  单");
	}
	return L_OK;
}

⌨️ 快捷键说明

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