📄 sum.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 + -