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

📄 读写dbf文件.cpp

📁 在linux 下
💻 CPP
📖 第 1 页 / 共 2 页
字号:


typedef struct{	
	double       dwCashValue;                     //现金收入
	unsigned int    wInvoiceNo;                   // 流水号
	unsigned char	psIssueDate[INV_DATE_LEN+1];  // 开票日期    7字节 BCD 年月日时分秒
	char  		psClerkID[TELLER_ID_LEN+1];       //收款员编号 
	char           	cType;                        // 开票类型 0 发票,1退票,2现金输入 3现金输出
	int   		  	wItemStartPos;                //本发票第一个销售单项的存储位置
	unsigned int    wItemNum;                     //本发票明细条数
}BUSINESS_TOTAL;


//收款员报表结构
typedef struct {
	char psClerkID[TELLER_ID_LEN+1];       //收款员编号
	int  nSaleCnt;					// 销售笔数
	double  dwSaleNum;				// 销售数量
    double  dwSaleSum;				// 销售金额  
}CshSum;

//单品报表结构
typedef struct {
	char PluCode[PLU_CODE_LEN+1];		//商品编码
	double  dwSaleNum;				// 销售数量
    double  dwSaleSum;				// 销售金额  
}GoodsSale;

/*
void DT_CshSum(DBF_CSHSUM* pstDbfCshSum, CshSum *pstCshSum, 
	char *PosNo, char* ShopCode, char *AccDate)
{
	unsigned char TempData[64];
	char psData[64];
	memset((char *)pstDbfCshSum, 0x20, sizeof(DBF_CSHSUM));
	pstDbfCshSum->DelFlag = 0x20;
	
	BCDToChar((unsigned char *)AccDate, 4, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7]);
	memcpy(pstDbfCshSum->AccDate, psData, ACCDATE_LEN);
	
	memcpy(pstDbfCshSum->ShopCode, ShopCode, strlen(ShopCode));
	
	memcpy(pstDbfCshSum->PosNo, PosNo, strlen(PosNo));
	
	sprintf(psData, "%s", pstCshSum->psClerkID);
	memcpy(pstDbfCshSum->CashierCode, psData, strlen(psData));
	
	sprintf(psData, "%10d", pstCshSum->nSaleCnt);
	memcpy(pstDbfCshSum->SaleCnt, psData, strlen(psData));
	
	//sprintf(psData, "%19.4f", pstCshSum->dwSaleSum);
	//memcpy(pstDbfCshSum->TotalDsc, psData, strlen(psData));

	sprintf(psData, "%10d", 0);
	memcpy(pstDbfCshSum->ReturnCnt, psData, strlen(psData));

	sprintf(psData, "%19.4f", 0);
	memcpy(pstDbfCshSum->ReturnAmt, psData, strlen(psData));

	sprintf(psData, "%10d", 0);
	memcpy(pstDbfCshSum->VoidCnt, psData, strlen(psData));

	sprintf(psData, "%19.4f", 0);
	memcpy(pstDbfCshSum->VoidAmt, psData, strlen(psData));

	pstDbfTotal->CustFlag = '0';

	BCDToChar((unsigned char *)AccDate, 4, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7]);
	memcpy(pstDbfTotal->AccDate, psData, ACCDATE_LEN);

	pstDbfTotal->Tag = '0';	
}
*/	
void DT_Total(DBF_TOTAL * pstDbfTotal, BUSINESS_TOTAL *psBusinessTotal, char *PosNo, char *AccDate)
{
	unsigned char TempData[64];
	char psData[64];
	memset((char *)pstDbfTotal, 0x20, sizeof(DBF_TOTAL));
	pstDbfTotal->DelFlag = 0x20;
	
	memcpy(pstDbfTotal->PosNo, PosNo, strlen(PosNo));
	
	BCDToChar(psBusinessTotal->psIssueDate, INV_DATE_LEN, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c%c%c:%c%c:%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7],TempData[8],TempData[9],TempData[10],TempData[11],
		TempData[12],TempData[13]);
	memcpy(pstDbfTotal->Sdate, psData, DATE_LEN+TIME_LEN);
	
	sprintf(psData, "%08u" , psBusinessTotal->wInvoiceNo);
	memcpy(pstDbfTotal->SerialNo, psData, strlen(psData));

	pstDbfTotal->TranType = 'B';

	sprintf(psData, "%s", psBusinessTotal->psClerkID);
	memcpy(pstDbfTotal->CshCode, psData, strlen(psData));

	sprintf(psData, "%19.4f", 0);
	memcpy(pstDbfTotal->TotalDsc, psData, strlen(psData));

	sprintf(psData, "%19.4f", psBusinessTotal->dwCashValue);
	memcpy(pstDbfTotal->Total, psData, strlen(psData));
	memcpy(pstDbfTotal->TotalPay, psData, strlen(psData));

	sprintf(psData, "%19.4f", 0);
	memcpy(pstDbfTotal->Change, psData, strlen(psData));

	pstDbfTotal->CustFlag = '0';

	BCDToChar((unsigned char *)AccDate, 4, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7]);
	memcpy(pstDbfTotal->AccDate, psData, ACCDATE_LEN);

	pstDbfTotal->Tag = '0';	
	
}

void DT_Pay(DBF_PAY * pstDbfPay, BUSINESS_TOTAL *psBusinessTotal, char *PosNo, char *AccDate)
{
	unsigned char TempData[64];
	char psData[64];
	memset((char *)pstDbfPay, 0x20, sizeof(DBF_TOTAL));
	pstDbfPay->DelFlag = 0x20;

	memcpy(pstDbfPay->PosNo, PosNo, strlen(PosNo));
	
	BCDToChar(psBusinessTotal->psIssueDate, INV_DATE_LEN, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c%c%c:%c%c:%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7],TempData[8],TempData[9],TempData[10],TempData[11],
		TempData[12],TempData[13]);
	memcpy(pstDbfPay->Sdate, psData, DATE_LEN+TIME_LEN);
	
	sprintf(psData, "%08u" , psBusinessTotal->wInvoiceNo);
	memcpy(pstDbfPay->SerialNo, psData, strlen(psData));

	sprintf(psData, "%s", "1");
	memcpy(pstDbfPay->ItemNo, psData, strlen(psData));

	pstDbfPay->PayFlag = '0';

	pstDbfPay->TranType = 'B';

	sprintf(psData, "%s", psBusinessTotal->psClerkID);
	memcpy(pstDbfPay->CshCode, psData, strlen(psData));

	sprintf(psData, "%19.4f", psBusinessTotal->dwCashValue);
	memcpy(pstDbfPay->Amount, psData, strlen(psData));
	memcpy(pstDbfPay->PayAmount, psData, strlen(psData));

	sprintf(psData, "%s", "(无)");
	memcpy(pstDbfPay->PayID, psData, strlen(psData));
	
	BCDToChar((unsigned char *)AccDate, 4, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7]);
	memcpy(pstDbfPay->AccDate, psData, ACCDATE_LEN);

	pstDbfPay->Tag = '0';
}

void DT_Item (DBF_ITEM * pstDbfItem,   BUSINESS_TOTAL *psBusinessTotal,  
           BUSINESS_ITEM *psBusinessItem ,   char *PosNo,    char *AccDate, char ItemNo)
{
	unsigned char TempData[64];
	char psData[64];
	memset((char *)pstDbfItem, 0x20, sizeof(DBF_TOTAL));
	pstDbfItem->DelFlag = 0x20;

	memcpy(pstDbfItem->PosNo, PosNo, strlen(PosNo));
	
	BCDToChar(psBusinessTotal->psIssueDate, INV_DATE_LEN, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c%c%c:%c%c:%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7],TempData[8],TempData[9],TempData[10],TempData[11],
		TempData[12],TempData[13]);
	memcpy(pstDbfItem->Sdate, psData, DATE_LEN+TIME_LEN);
	
	sprintf(psData, "%08u" , psBusinessTotal->wInvoiceNo);
	memcpy(pstDbfItem->SerialNo, psData, strlen(psData));

	sprintf(psData, "%s", "1");
	memcpy(pstDbfItem->PageNo, psData, strlen(psData));

	sprintf(psData, "%u", ItemNo);
	memcpy(pstDbfItem->ItemNo, psData, strlen(psData));

	pstDbfItem->TranType = 'B';

	sprintf(psData, "%s", psBusinessTotal->psClerkID);
	memcpy(pstDbfItem->CshCode, psData, strlen(psData));

	pstDbfItem->ItemType = 'P';

	sprintf(psData, "%s", psBusinessItem->psCode);
	memcpy(pstDbfItem->PluCode, psData, strlen(psData));

	sprintf(psData, "%s", psBusinessItem->psName);
	memcpy(pstDbfItem->PluName, psData, strlen(psData));

	sprintf(psData, "%s", psBusinessItem->psDepCode);
	memcpy(pstDbfItem->DepCode, psData, strlen(psData));

	sprintf(psData, "%s", psBusinessItem->psDepCode);
	memcpy(pstDbfItem->ClsCode, psData, strlen(psData));

	sprintf(psData, "%19.4f", psBusinessItem->dwPrice);
	memcpy(pstDbfItem->PluPrice, psData, strlen(psData));

	sprintf(psData, "%9.4f", psBusinessItem->fSaleNum);
	memcpy(pstDbfItem->PluQty, psData, strlen(psData));

	sprintf(psData, "%19.4f", 0);
	memcpy(pstDbfItem->PluDsc, psData, strlen(psData));

   	sprintf(psData, "%19.4f", psBusinessItem->dwSaleSum);
	memcpy(pstDbfItem->PluTotal, psData, strlen(psData));

	BCDToChar((unsigned char *)AccDate, 4, TempData);
	sprintf(psData, "%c%c%c%c-%c%c-%c%c", 
		TempData[0],TempData[1],TempData[2],TempData[3],TempData[4],TempData[5],
		TempData[6],TempData[7]);
	memcpy(pstDbfItem->AccDate, psData, ACCDATE_LEN);

	pstDbfItem->Tag = '0';
	
}

/****************************************************************************
 函数名称: DbfStruCopy
 说明:  复制一个空的DBF文件
 参数:      dest - 目标文件名 sour - DBF文件名
 返回值: 1 - 成功  0 - 失败
****************************************************************************/
int DbfStruCopy(char* dest,char* sour)
{
 DBF_HEAD head;
 int shandle,dhandle;
 char * buff;
 
 if((shandle=open(sour,O_RDONLY|O_BINARY))==-1)
  return FALSE;
 if((dhandle=open(dest,O_WRONLY|O_BINARY|O_TRUNC|O_CREAT,S_IREAD|S_IWRITE))==-1)
 {
  close(shandle);
  return FALSE;
 }
 read(shandle,&head,sizeof(DBF_HEAD));
 buff=(char *)malloc(head.HeaderLen);
 if(buff==NULL)
  return FALSE;
 lseek(shandle,0L,SEEK_SET);
 read(shandle,buff,head.HeaderLen);
 ((DBF_HEAD *)buff)->Records=0L;
 if((unsigned int)write(dhandle,buff,head.HeaderLen)!=head.HeaderLen)
 {
  free(buff);
  close(shandle);
  close(dhandle);
  return FALSE;
 }
 free(buff);
 close(shandle);
 close(dhandle);
 return TRUE;
}
/****************************************************************************
 函数名称: SaveToDbf
 说明:  保存iNum条数据到指定BDF文件
 参数:     Filename - DBF文件名 pdata - 保存数据指针 iNum-保存记录条数
 返回值: 1 - 成功  0 - 失败
****************************************************************************/
int SaveToDbf(char *Filename, char *pdata,  int iNum)
{
	int ehandle=-1;
	DBF_HEAD head;
	if((ehandle=open(Filename,O_RDWR|O_BINARY))==-1)
	 {
	  close(ehandle);
	  return FALSE;
	 }
	
	lseek(ehandle,0L,SEEK_SET);
 	read(ehandle,&head,sizeof(DBF_HEAD));

 	if(lseek(ehandle,head.HeaderLen+(long)head.Records*head.RecordLen,SEEK_SET) < 0)
		return FALSE;
	//lseek(ehandle,0L,SEEK_END);
	for(int i=0; i<iNum; i++)
		{
	 	if(write(ehandle,pdata,head.RecordLen) != head.RecordLen)
	 		{
	 		close(ehandle);
	 		return FALSE;
	 		}
	 	pdata += head.RecordLen;
		head.Records++;
		}
	lseek(ehandle,0L,SEEK_SET);
	write(ehandle,&head,sizeof(DBF_HEAD));
 	close(ehandle);
	return TRUE;
}

/****************************************************************************
 函数名称: ReadFromDbf
 说明:  读BDF文件第iNO条记录
 参数:     Filename - DBF文件名 pdata - 读出数据指针 iNo-指定记录条数
 返回值: 1 - 成功  0 - 失败
****************************************************************************/
int ReadFromDbf(char *Filename, char *pdata, int iNo)
{
	DBF_HEAD head;
	int shandle;
 
	if((shandle=open(Filename,O_RDONLY|O_BINARY))==-1)
		return FALSE;

	lseek(shandle,0L,SEEK_SET);

	read(shandle,&head,sizeof(DBF_HEAD));

	if((int)head.Records < iNo)
		return FALSE;
	
	if(lseek(shandle,head.HeaderLen+(long)(iNo-1)*head.RecordLen,SEEK_SET) < 0)
		return FALSE;

	if(read(shandle,pdata,head.RecordLen) !=  head.RecordLen)
		return FALSE;
	
 	close(shandle);
	return TRUE;
}

int main(void)
{
	//DBF_ITEM stItem[100];
	DBF_TOTAL stTotal[100];

	BUSINESS_TOTAL stBusTotal;
	stBusTotal.cType=0;
	stBusTotal.dwCashValue=2110.01;
	strcpy(stBusTotal.psClerkID,"xtt");
	strcpy((char *)stBusTotal.psIssueDate,"\x20\x05\x06\x30\x15\x30\x33");
	stBusTotal.wInvoiceNo = 123;
	
	//sprintf(psData, "%19.4f", 0);
	char psBuf[10];
	double dd = 100;
	memcpy(psBuf, (char *)&dd, sizeof(double));

	int len = sizeof(DBF_TOTAL);
	if(DbfStruCopy("Totalback.dbf","Total.dbf") != TRUE)
		printf("Failed\n");

	//if(ReadFromDbf("Total.dbf", (char *)&stPay, 1) != TRUE)
	//	printf("read Failed\n");

	//if(ReadFromDbf("Total.dbf", (char *)&stPay+sizeof(DBF_PAY), 2) != TRUE)
	//	printf("read Failed\n");

	DT_Total(stTotal, &stBusTotal, "003", "\x20\x05\x07\x01\x15\x30\x33");
	DT_Total(stTotal+1, &stBusTotal, "004", "\x20\x06\x08\x01\x15\x30\x33");
	if(SaveToDbf("Totalback.dbf", (char *)stTotal, 1) != TRUE)
		printf("save Failed\n");
	if(SaveToDbf("Totalback.dbf", (char *)stTotal+sizeof(DBF_TOTAL), 1) != TRUE)
		printf("save Failed\n");

	//if(SaveToDbf("Payback.dbf", (char *)&stTotal+sizeof(DBF_TOTAL), 1) != TRUE)
	//	printf("save Failed\n");
	return 0;
}


⌨️ 快捷键说明

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