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

📄 salewin4.cpp

📁 POS前台C++程序
💻 CPP
字号:
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include "salewin.h"
#include "sysinfo.h"

//写本地数据库。
int
SaleWin::WriteLDB()
{
	if(WriteSales()==L_ERROR)
	{
		return L_ERROR;
	}
	if(WriteTotal()==L_ERROR)
	{
		return L_ERROR;
	}
	return L_OK;
}

//写本地SALES.DAT数据文件.
int
SaleWin::WriteSales()
{
	//缓冲中的数据.
	struct FDATA data;
	char DBBuf[160], *buf;
	FILE *fp;//网格临时文件指针.
	FILE *fp1;//数据文件指针.
	//打开文件.
	if((fp = fopen(".\\Gridtemp.$$$","rb")) == NULL)
	{
		return L_ERROR;
	}
	for(int i=0; i < filelength(fileno(fp))/sizeof(FDATA); i++)
	{
		buf = DBBuf;
		//从文件读取数据.
		if(fread(&data, sizeof(FDATA), 1, fp) == 0)
		{
			fclose(fp);
			return L_ERROR;
		}
		//款台.
		sprintf(buf, "%03d|", atoi(data.Term));
		//收款员.
		buf += 4;
		sprintf(buf, "%05ld|", atol(data.Operator));
		//营业员.
		buf += 6;
		sprintf(buf, "%05ld|", atol(data.Saler));
		//部门.
		buf += 6;
		sprintf(buf, "%06ld|", atol(data.Group));
		//流水号.
		buf += 7;
		sprintf(buf, "%06ld|", atol(data.SeqNumber));
		//货品编码.
		buf += 7;
		sprintf(buf, "%12s |", Trim(data.Code));
		//数量.
		buf += 14;
		sprintf(buf, "%6.2f|", atof(data.Number));
		//单价.
		buf += 7;
		sprintf(buf, "%9.2f|", atof(data.Price));
		//应收.
		buf += 10;
		sprintf(buf, "%10.2f|", atof(data.Number)*atof(data.Price));
//会员卡号.
buf += 11;
sprintf(buf, "%6s|", "");
//会员折扣额.
buf += 7;
sprintf(buf, "%8.2f|", atof("0"));
//会员应收额.
buf += 9;
sprintf(buf, "%10.2f|", atof(data.Number)*atof(data.Price));
//	sprintf(buf, "%10.2f|", atof(dfsales.SVipAccount));
		//折扣额.
		buf += 11;
		sprintf(buf, "%8.2f|", atof(data.Discount));
		//实收.
		buf += 9;
		sprintf(buf, "%10.2f|", atof(data.Money));
		//日期.
		buf += 11;

		buf[0]=data.Date[5];
		buf[1]=data.Date[6];
		buf[2]='/';
		buf[3]=data.Date[8];
		buf[4]=data.Date[9];
		buf[5]='/';
		buf[6]=data.Date[0];
		buf[7]=data.Date[1];
		buf[8]=data.Date[2];
		buf[9]=data.Date[3];
		buf[10]='|';
		//时间.
		buf += 11;
		sprintf(buf, "%08s|", Trim(data.Time));
		//子流水号.
		buf += 9;
		sprintf(buf, "%03d|", atoi(data.ID));
		//单号.
		buf += 4;
		sprintf(buf, "%02d|", data.CheckNum);
		//退货标志.
		buf += 3;
		if(atof(data.Number) >= 0)
		{
			//销售.
			sprintf(buf, "%1s\r\n", "I");
		}
		else
		{
			//退货.
			sprintf(buf, "%1s\r\n", "O");
		}

//1--------------------------------------------
		//打开本地Sales数据文件.
		if((fp1=fopen(".\\data\\sales.dat", "a+b")) == NULL)
		{
			fclose(fp);
			return L_ERROR;
		}
		//写本地Sales数据文件.
		if(fwrite(DBBuf, strlen(DBBuf), 1, fp1)==0)
		{
			fclose(fp);
			fclose(fp1);
			return L_ERROR;
		}
		fclose(fp1);
//2--------------------------------------------
		//如果不要求备份网络数据则返回。
		if(sys->NetTempSW != L_YES)
		{
			return L_OK;
		}
		//打开网络Sales.dat缓冲数据文件<文件在本地>.
		if((fp1=fopen(".\\data\\sales.tmp", "a+b")) == NULL)
		{
			fclose(fp1);
			return L_ERROR;
		}
		//写网络Sales.dat数据文件.
		if(fwrite(DBBuf, strlen(DBBuf), 1, fp1)==0)
		{
			fclose(fp);
			fclose(fp1);
			return L_ERROR;
		}
		fclose(fp1);
	}
	//关闭文件.
	fclose(fp);
	return L_OK;
}

//写本地Total.DAT数据文件.
int
SaleWin::WriteTotal()
{
	char 	DBBuf[110];
	char 	*buf;
	int   ItemNum = 0;
	//汇总文件指针。
	FILE	*fp1;
	//缓冲临时文件的数据结构.
	struct TOTALDATA TotalData;
	//定义临时分组文件。
	FileIO *IOTmp = new FileIO();
	//自动分组。
	ItemNum = GroupByGroup(IOTmp);
	if(ItemNum == -1)
	{
		delete IOTmp;
		return L_ERROR;
	}
	//写汇总文件缓冲字符串。
	for(int i=0; i<ItemNum; i++)
	{
		buf = DBBuf;
		//读取内存临时文件的数据.
		if(IOTmp->Read((char *)&TotalData, i*sizeof(TOTALDATA), sizeof(TOTALDATA))==L_ERROR)
		{
			delete IOTmp;
			return L_ERROR;
		}
		//款台.
		sprintf(buf, "%03d|", 	atoi(TotalData.Term));
		//收款员.
		buf += 4;
		sprintf(buf, "%05ld|", 	atol(TotalData.Operator));
		//营业员.
		buf += 6;
		sprintf(buf, "%05ld|", 	atol(TotalData.Saler));
		//部门.
		buf += 6;
		sprintf(buf, "%06ld|", 	atol(TotalData.Group));
		//流水号.
		buf += 7;
		sprintf(buf, "%06ld|", 	atol(TotalData.SeqNumber));
		//应收金额.
		buf += 7;
		sprintf(buf, "%10.2f|", atof(TotalData.ShouldPay));
		//会员应收金额.
		buf += 11;
		sprintf(buf, "%10.2f|", atof(TotalData.VipShouldPay));
//	sprintf(buf, "%10.2f|", atof(dftotal.TVipAccount));
		//会员折扣金额.
		buf += 11;
		sprintf(buf, "%10.2f|", atof(TotalData.Discount));
		//实收金额.
		buf += 11;
		sprintf(buf, "%10.2f|", atof(TotalData.RealAccount));
		//多单号.
		buf += 11;
		sprintf(buf, "%02d|", 	TotalData.CheckNumber);
		//日期.
		buf += 3;

		buf[0]=TotalData.Date[5];
		buf[1]=TotalData.Date[6];
		buf[2]='/';
		buf[3]=TotalData.Date[8];
		buf[4]=TotalData.Date[9];
		buf[5]='/';
		buf[6]=TotalData.Date[0];
		buf[7]=TotalData.Date[1];
		buf[8]=TotalData.Date[2];
		buf[9]=TotalData.Date[3];
		buf[10]='|';
		//时间.
		buf += 11;
		sprintf(buf, "%8s|", Trim(TotalData.Time));
		buf += 9;
		sprintf(buf, "%1s\r\n", "0");
//1--------------------------------------------
		//打开本地Total.dat数据文件.
		if((fp1=fopen(".\\data\\Total.dat", "a+b")) == NULL)
		{
			delete IOTmp;
			return L_ERROR;
		}
		//写本地Total.dat数据文件.
		if(fwrite(DBBuf, strlen(DBBuf), 1, fp1)==0)
		{
			delete IOTmp;
			fclose(fp1);
			return L_ERROR;
		}
		fclose(fp1);
//2--------------------------------------------
		//如果不要求备份网络数据则返回。
		if(sys->NetTempSW != L_YES)
		{
			return L_OK;
		}
		//打开网络Total.dat缓冲数据文件<文件在本地>.
		if((fp1=fopen(".\\data\\Total.tmp", "a+b")) == NULL)
		{
			delete IOTmp;
			return L_ERROR;
		}
		//写网络Total.dat缓冲数据文件.
		if(fwrite(DBBuf, strlen(DBBuf), 1, fp1)==0)
		{
			delete IOTmp;
			fclose(fp1);
			return L_ERROR;
		}
		fclose(fp1);
	}
	//关闭文件.
	delete IOTmp;
	return L_OK;
}

//自动分组程序,返回分的组数。
int
SaleWin::GroupByGroup(FileIO *FIOTmp)
{
	//网格缓冲的数据结构.
	struct FDATA data;
	//缓冲临时文件的数据结构.
	struct TOTALDATA TotalData;
	int ItemNum = 0, i, j, GroupExistFlag = L_NO;
	//网格临时文件指针.
	FILE *fp;
	//打开文件.
	if((fp = fopen(".\\Gridtemp.$$$","rb")) == NULL)
	{
		return -1;
	}
	//从网格临时文件依次读取所有数据。
	for(i=0; i < filelength(fileno(fp))/sizeof(FDATA); i++)
	{
		//从文件读取数据.
		if(fread(&data, sizeof(FDATA), 1, fp)==0)
		{
			fclose(fp);
			return -1;
		}
		//查看分组文件中是否存在指定柜组。
		GroupExistFlag = L_NO;
		for(j=0; j<ItemNum; j++)
		{
			//读取内存临时文件的数据.
			if(FIOTmp->Read((char *)&TotalData, j*sizeof(TOTALDATA), sizeof(TOTALDATA))==L_ERROR)
			{
				fclose(fp);
				return -1;
			}
			//比较两个柜组文件是否一致。
			if(strcmp(data.Group, TotalData.Group)==0)
			{
				//累计应付。
				sprintf(TotalData.ShouldPay, "%10.2f", atof(TotalData.ShouldPay) + atof(data.Number)*atof(data.Price));
				//会员应收额。
				sprintf(TotalData.VipShouldPay, "%10.2f", atof(TotalData.VipShouldPay) + atof(data.Number)*atof(data.Price));
				//折扣额。
				sprintf(TotalData.Discount, "%10.2f", atof(TotalData.Discount) + atof(data.Number)*atof(data.Price) - atof(data.Money));
				//实收额。
				sprintf(TotalData.RealAccount, "%10.2f", atof(TotalData.RealAccount) + atof(data.Money));
				//存在数据。
				GroupExistFlag = L_YES;
				//覆盖原来的数据。
				if(FIOTmp->Write((char *)&TotalData, j*sizeof(TOTALDATA), sizeof(TOTALDATA))==L_ERROR)
				{
					fclose(fp);
					return -1;
				}
				break;
			}
		}
		//如果在分组文件中不存在指定柜组的话。
		if(GroupExistFlag == L_NO)
		{
			//将此柜组作为新项目加入分组文件。
			//收款台
			strcpy(TotalData.Term, data.Term);
			//操作员
			strcpy(TotalData.Operator, data.Operator);
			//营业员
			strcpy(TotalData.Saler, data.Saler);
			//柜组
			strcpy(TotalData.Group, data.Group);
			//流水号
			strcpy(TotalData.SeqNumber, data.SeqNumber);
			//应付金额
			sprintf(TotalData.ShouldPay, "%10.2f", atof(data.Number)*atof(data.Price));
			//会员应付金额
			sprintf(TotalData.VipShouldPay, "%10.2f", atof(data.Number)*atof(data.Price));
			//折扣额
			sprintf(TotalData.Discount, "%10.2f", atof(data.Number)*atof(data.Price) - atof(data.Money));
			//实收金额
			strcpy(TotalData.RealAccount, data.Money);
			//多单号
			TotalData.CheckNumber = data.CheckNum;
			//日期
			strcpy(TotalData.Date, data.Date);
			//时间
			strcpy(TotalData.Time, data.Time);
			//写内存临时文件
			if(FIOTmp->Write((char *)&TotalData, ItemNum*sizeof(TOTALDATA), sizeof(TOTALDATA))==L_ERROR)
			{
				fclose(fp);
				return -1;
			}
			//项目数加一
			ItemNum++;
		}
	}
	fclose(fp);
	return ItemNum;
}

//写多重付款Mulpay.dat。
//写Mulpay.dat是由结帐时单独调用的,运行时如果是多重付款将被多次调用。
//日期时间是按当时时间计算的。
int
SaleWin::WriteMulpay(char *realaccount, char *paytype, char *cardnum1, char *cardnum2)
{
	char DBBuf[110];
	char *buf;
	char nowDate[11], nowTime[9];
	//网格缓冲的数据结构.
	struct FDATA data;
	//网格临时文件指针.
	FILE *fp;
	//付款文件Mulpay.dat指针.
	FILE *fp1;
	//打开网格临时文件.
	if((fp = fopen(".\\Gridtemp.$$$","rb")) == NULL)
	{
		return L_ERROR;
	}
	//读取第一条记录.
	if(fread(&data, sizeof(FDATA), 1, fp)==0)
	{
		fclose(fp);
		return L_ERROR;
	}
	fclose(fp);

	//取得当前日期和时间.
	strcpy(nowDate, GetDate());
	strcpy(nowTime, GetTime());

	buf = DBBuf;
	//款台.
	sprintf(buf, "%03d|", 	atoi(data.Term));
	//收款员.
	buf += 4;
	sprintf(buf, "%05ld|", 	atol(data.Operator));
	//流水号.
	buf += 6;
	sprintf(buf, "%06ld|", 	atol(data.SeqNumber));
	//实收金额.
	buf += 7;
	sprintf(buf, "%10.2f|", atof(realaccount));
	//付款方式.
	buf += 11;
	sprintf(buf, "%02d|", atoi(paytype));
	//卡号1.
	buf += 3;
	sprintf(buf, "%20s|", cardnum1);
	//卡号2.
	buf += 21;
	sprintf(buf, "%20s|", cardnum2);
	//日期.
	buf += 21;
	buf[0] = nowDate[5];
	buf[1] = nowDate[6];
	buf[2] = '/';
	buf[3] = nowDate[8];
	buf[4] = nowDate[9];
	buf[5] = '/';
	buf[6] = nowDate[0];
	buf[7] = nowDate[1];
	buf[8] = nowDate[2];
	buf[9] = nowDate[3];
	buf[10] = '|';
	//时间.
	buf += 11;
	sprintf(buf, "%08s|", Trim(nowTime));
	buf += 9;
	sprintf(buf, "%1s\r\n", "0");

//1--------------------------------------------
		//打开本地Mulpay数据文件.
		if((fp1=fopen(".\\data\\Mulpay.dat", "a+b")) == NULL)
		{
			return L_ERROR;
		}
		//写本地Mulpay数据文件.
		if(fwrite(DBBuf, strlen(DBBuf), 1, fp1)==0)
		{
			fclose(fp1);
			return L_ERROR;
		}
		fclose(fp1);
//2--------------------------------------------
		//如果不要求备份网络数据则返回。
		if(sys->NetTempSW != L_YES)
		{
			return L_OK;
		}
		//打开网络Mulpay.dat缓冲数据文件<文件在本地>.
		if((fp1=fopen(".\\data\\Mulpay.tmp", "a+b")) == NULL)
		{
			return L_ERROR;
		}
		//写网络Mulpay.dat缓冲数据文件.
		if(fwrite(DBBuf, strlen(DBBuf), 1, fp1)==0)
		{
			fclose(fp1);
			return L_ERROR;
		}
		fclose(fp1);
	return L_OK;
}

⌨️ 快捷键说明

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