📄 读写dbf文件.cpp
字号:
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 + -