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

📄 sum.cpp

📁 金融pos机前台源码
💻 CPP
字号:
/*******************************************************************************
	模  块:	数据汇总模块
	功  能:	将数据汇总排序.
	程序员:	韩冰
	版  本:	v1.1
	时  间:	1999-05-18
*******************************************************************************/
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <alloc.h>
#include "sum.h"

//构造函数.
Sum::Sum(char *filename , int linelong) : DBFile(filename,linelong) , FileIO()
{
	//新临时文件记录长度.
	OrderLong = 61;
	//给保存名细的临时文件分配内存.
	tempsales = new FileIO;
	//给保存汇总的临时文件分配内存.
	temptotal = new FileIO;
	//将汇总数据变量置空.
	SumNum=0;
	//将日期时间变量置空.
	memset(DateTime,0,20);
	//取得要处理的文件名和该文件中每行的长度.
	strcpy(FileName,filename);
	LineLong = linelong;
}

//析构函数.
Sum::~Sum()
{
	delete tempsales;
	delete temptotal;
}

//以时间日期将数据取出,放入临时文件.
void
Sum::GetTemp(char *DateF , char *TimeF , char *DateT , char *TimeT ,int Position)
{
	//保存要处理文件一行.
	char *tempBuff;
	//中间变量.
	char *temp;
	//日期时间.
	char date[11],time[9];
	//起始日期时间.
	char DateTimeF[20];
	//结束日期时间.
	char DateTimeT[20];
	//分配内存.
	tempBuff = new char[LineLong];

	//保存临时文件行数.
	LineNum=0L;
	//将起始日期时间和结束日期时间合并为一个变量.
	sprintf(DateTimeF,"%10s%8s",DateF,TimeF);
	sprintf(DateTimeT,"%10s%8s",DateT,TimeT);

	//循环读写文件.
	for(long i=0; i<DBFile::GetFileLen(); i+=LineLong)
	{
		//读文件一行.
		DBFile::Read(tempBuff , i);
		temp = tempBuff+Position-1;
		//取出此一行中的日期时间.
		strncpy(date,temp,10);
		date[10]=NULL;
		temp+=11;
		strncpy(time,temp,8);
		time[8]=NULL;
		//调用函数将日期时间按标准合并为一个变量.
		Transfer(date,time);
		//将要此一行中的日期时间与起始结束日期时间比较.
		if(Cmp(DateTime,DateTimeF)>0&&Cmp(DateTime,DateTimeT)<0)
		{
			//如在该范围内则写临时文件.
			FileIO::Write(tempBuff,((long)LineNum)*LineLong,LineLong);
			//临时文件行数加一.
			LineNum++;
		}
	}
	delete []tempBuff;

}


//按指定字段取得名细.
void
Sum::GetItem(char *Item,int position , int size)
{
	char *temp;
	//名细关键字
	char item[30];
	//保存要处理文件一行.
	char *tempBuff;
	//分配内存.
	tempBuff = new char[LineLong];

	NewLineNum=0;
	for(int i=0;i<LineNum;i++)
	{
		FileIO::Read(tempBuff,((long)i)*LineLong,LineLong);
		temp = tempBuff+position-1;
		strncpy(item,temp,size);
		item[size]=NULL;
		if(!strcmp(Item,item))
		{
			//写成新临时文件.
			tempsales->Write(tempBuff,((long)NewLineNum)*LineLong,LineLong);
			NewLineNum++;
		}
	}
	delete []tempBuff;
}

//按指定字段汇总.
//position为字段位置,size为字段长度.
//k表示汇总关键字,
//q表示数量(对sales中是数量,对total和mulpay可以是其他变量),
//m表示金额.
void
Sum::GroupBy(int kposition , int ksize , int vposition ,
					int vsize ,int dposition , int dsize ,
					int mposition , int msize , int stat)
{
	unsigned int i;

	//汇总变量,key:汇总关键字,qty:数量,
	//         real_total:汇总销售金额,
	//         retn_total:汇总退货金额.
	struct SS *LineSum[300];
	//分派内存.
	for(i=0;i<300;i++)
	{
		LineSum[i] = new SS;
	}
	//初始化结构数组.
	for(i=0;i<300;i++)
	{
		memset(LineSum[i]->key,0,30);
		LineSum[i]->vip_total=0.00;
		LineSum[i]->dis_total=0.00;
		LineSum[i]->real_total=0.00;
		LineSum[i]->retn_total=0.00;
	}

	//关键字,数量和金额临时变量.
	char tempKey[15];
	char tempVip[11];
	char tempDis[11];
	char tempTotal[11];
	//临时缓冲变量.
	char *temp;
	//保存要处理文件一行.
	char *tempBuff;
	//分配内存.
	tempBuff = new char[LineLong];

	//由第一行循环到临时文件最后一行.
	for(i=0;i<LineNum;i++)
	{
		//如果此关键字已经累加,为1,否则为0.
		int find=0;
		if(stat==1)
			//stat==1表示此函数用于货品汇总,由柜组名细临时文件文件中读一行.
			tempsales->Read(tempBuff,((long)i)*LineLong,LineLong);
		else
			//由临时文件中读一行.
			FileIO::Read(tempBuff,((long)i)*LineLong,LineLong);
		//取得关键字.
		temp = tempBuff+kposition-1;
		strncpy(tempKey,temp,ksize);
		tempKey[ksize]=NULL;
		//取得会员优惠.
		temp = tempBuff+vposition-1;
		strncpy(tempVip,temp,vsize);
		tempVip[vsize]=NULL;
		//取得折扣优惠.
		temp = tempBuff+dposition-1;
		strncpy(tempDis,temp,dsize);
		tempDis[dsize]=NULL;
		//取得实际金额.
		temp = tempBuff+mposition-1;
		strncpy(tempTotal,temp,msize);
		tempTotal[msize]=NULL;

		//已经累加的关键字循环.
		for(int k=0;k<SumNum;k++)
		{
			//比较刚取出的关键字与每一个已累加的关键字.
			if(!strcmp(LineSum[k]->key,tempKey))
			{
				//相同则继续累加
				LineSum[k]->vip_total+=atof(tempVip);
				LineSum[k]->dis_total+=atof(tempDis);
				//判断正负,分别累加.
				if(atof(tempTotal)>=0)
					LineSum[k]->real_total+=atof(tempTotal);
				else
					LineSum[k]->retn_total+=atof(tempTotal);
				//置find状态为1,说明此记录已累加.
				find = 1;
			}
		}
		//判断是否已累加.
		if(find == 0)
		{
		//若无累加则新开辟一个结构数组变量并付值.
		strcpy(LineSum[SumNum]->key,tempKey);
		LineSum[SumNum]->vip_total+=atof(tempVip);
		LineSum[SumNum]->dis_total+=atof(tempDis);
		if(atof(tempTotal)>=0)
			LineSum[SumNum]->real_total+=atof(tempTotal);
		else
			LineSum[SumNum]->retn_total+=atof(tempTotal);
		SumNum++;
		}

	}

	//定义变量保存每一行在数组中的顺序.
	unsigned int  *Order;
	//分配内存.
	Order=new unsigned int[SumNum];


	//将数组中所有变量置0.
	for(unsigned int m=0;m<SumNum;m++) Order[m]=0;

	//外部循环由数组中第一个变量到最后一最后一个变量.
	for(i=0;i<SumNum;i++)
	{
		//内部循环.
		for(unsigned int j=i+1;j<SumNum;j++)
		{
			//比较关键字.
			if(strcmp(LineSum[i]->key,LineSum[j]->key)>=0)
				Order[i]++;
			else
				Order[j]++;
		}
	}

	for(i=0;i<SumNum;i++)
	{
		//由结构数组中读.
		sprintf(tempBuff,"%15s|%10.2f|%10.2f|%10.2f|%10.2f\r\n" , LineSum[i]->key,
				  LineSum[i]->vip_total,LineSum[i]->dis_total,LineSum[i]->real_total,
				  LineSum[i]->retn_total);
		tempBuff[61]=NULL;
		//按Order数组的顺序写成新临时文件.
		temptotal->Write(tempBuff,((long)Order[i])*OrderLong,OrderLong);
	}

	//释放内存.
	for(i=0;i<300;i++)
	{
		delete LineSum[i];
	}
	delete []tempBuff;
	delete []Order;
}

//日期时间转换函数.
void
Sum::Transfer(char *Date , char *Time)
{
	//日期变量.
	struct DATE
	{
		char year[5];
		char month[3];
		char day[3];
	} date;
	//获得月份.
	strncpy(date.month,Date,2);
	date.month[2]=NULL;
	Date+=3;
	//获得日期.
	strncpy(date.day,Date,2);
	date.day[2]=NULL;
	Date+=3;
	//获得年份.
	strncpy(date.year,Date,4);
	date.year[4]=NULL;
	//将日期时间标准化.
	sprintf(DateTime,"%4s-%2s-%2s",date.year,date.month,date.day);
	strcat(DateTime,Time);
}

//比较函数
//ob1>ob2 返回>0
//ob1=ob2 返回0
//ob1<ob2 返回>0
int
Sum::Cmp(char *ob1,char *ob2)
{
	return strcmp(ob1,ob2);
}

⌨️ 快捷键说明

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