daycount.cpp
来自「DOS下一个完整的大型程序源代码」· C++ 代码 · 共 206 行
CPP
206 行
#if !defined( __STRING_H )
#include <String.h>
#endif // __STRING_H
#if !defined( __STDLIB_H )
#include <StdLib.h>
#endif // __STDLIB_H
#define Uses_DBase
#define Uses_Window
#define Uses_Button
#include <ly.h>
#include "sj.h"
#include "sjdbf.h"
const
winWidth = 50 * 8 + 24,
winLeft = 320 - winWidth / 2,
tableLeft = winLeft + 5 + 8,
btnWidth = 70,
btnHeight = 36,
btnOkLeft = winLeft + 12,
btnPrintLeft = 320 - btnWidth / 2,
btnHelpLeft = winLeft + winWidth - 13 - 70;
static char *szFormat[] =
{
//0 1 2 3 4 5
//012345678901234567890123456789012345678901234567890
/*00*/" 统计日期: 96年12月30日",
/*01*/"┏━━━━┯━━━━━━┯━━━━━┯━━━━━┓",
/*02*/"┃收 款 员│共收用户(个)│共收款(元)│滞纳金(元)┃",
/*03*/"┠────┼──────┼─────┼─────┨",
/*04*/"┃1234 │ 9999 │1234567.12│1234567.12┃",
/*05*/"┠────┼──────┼─────┼─────┨",
/*06*/"┃总 计│ │ │ ┃",
/*07*/"┗━━━━┷━━━━━━┷━━━━━┷━━━━━┛",
};
static char *szHelp[] =
{
"■按Enter或Esc或选择〔对〕退出 ",
"■按<F2>或选择〔打印〕打印日统计",
"■如果收款员多于7个,屏幕上只显",
" 示前7个的统计情况,但可以全部",
" 打印出来 ",
NULL
};
void ShowCountStatus()
{
ShowStatus( "~CF1~0帮助 ~CF2~0打印 ~CESC~0退出" );
}
void SJ::DayCount()
{
char szDate[ 9 ];
if( !GetDateDlg( szDate ) ) return;
MessageBox( "正在统计..." );
int nRecNum = dbfDuty->GetRecordNum(),
nLineNum = 6 + 2 * nRecNum;
char **szTable = new char *[ nLineNum ];
szTable[ 0 ] = szFormat[ 0 ];
szTable[ 1 ] = szFormat[ 1 ];
szTable[ 2 ] = szFormat[ 2 ];
szTable[ 3 ] = szFormat[ 3 ];
memcpy( szTable[ 0 ] + 11, szDate, 2 ); // Date
memcpy( szTable[ 0 ] + 15, szDate + 3, 2 );
if( szTable[ 0 ][ 15 ] == '0' ) szTable[ 0 ][ 15 ] = ' ';
memcpy( szTable[ 0 ] + 19, szDate + 6, 2 );
if( szTable[ 0 ][ 19 ] == '0' ) szTable[ 0 ][ 19 ] = ' ';
unsigned *uClient = new unsigned[ nRecNum ];
for( int i = 0; i < nRecNum; i ++ ) uClient[ i ] = 0;
double *dMoney = new double[ nRecNum ];
for( i = 0; i < nRecNum; i ++ ) dMoney[ i ] = 0.0;
double *dAChg = new double[ nRecNum ];
for( i = 0; i < nRecNum; i ++ ) dAChg[ i ] = 0.0;
unsigned uTotClient = 0;
double dTotMoney = 0.0;
double dTotAChg = 0.0;
char str[ 81 ];
long lRec = dbfLog->Search( szDate, fdLogDate );
if( lRec >= 0 )
{
while( lRec < dbfLog->GetRecordNum() )
{
dbfLog->GetField( lRec, fdLogDuty, str );
int nRec = dbfDuty->Seek( str );
if( nRec >= 0 ) uClient[ nRec ] ++;
uTotClient ++;
double dTmp1 = dbfLog->GetDouble( lRec, fdLogRChg ),
dTmp2 = dbfLog->GetDouble( lRec, fdLogAChg );
if( nRec >= 0 )
{
dMoney[ nRec ] += dTmp1;
dAChg[ nRec ] += dTmp2;
}
dTotMoney += dTmp1;
dTotAChg += dTmp2;
lRec ++;
dbfLog->GetField( lRec, fdLogDate, str );
if( memcmp( szDate, str, flLogDate ) != 0 ) break;
}
}
int j = 4;
for( i = 0; i < nRecNum; i ++, j += 2 )
{
const cnSize = 50;
szTable[ j ] = new char[ cnSize + 1 ];
strcpy( szTable[ j ], szFormat[ 4 ] );
dbfDuty->GetField( i, fdDuty, szTable[ j ] + 2 ); // DutyNum
FormatNumber( uClient[ i ], szTable[ j ] + 16, 4 ); // Client
FormatMoney( dMoney[ i ], szTable[ j ] + 26, flTotChg ); // Money
FormatMoney( dAChg[ i ], szTable[ j ] + 38, flTotChg ); // AChg
szTable[ j + 1 ] = new char[ cnSize + 1 ];
strcpy( szTable[ j + 1 ], szFormat[ 5 ] );
}
szTable[ j ] = szFormat[ 6 ];
FormatNumber( uTotClient, szTable[ j ] + 16, 4 ); // Client
FormatMoney( dTotMoney, szTable[ j ] + 26, flTotChg ); // Money
FormatMoney( dTotAChg, szTable[ j ] + 38, flTotChg ); // AChg
szTable[ j + 1 ] = szFormat[ 7 ];
DeleteMsgBox();
int nLineShow = nRecNum;
if( nLineShow > 7 ) nLineShow = 7;
int nWinHeight = ( 6 + 2 * nLineShow ) * 16 + 82,
nWinTop = 240 - nWinHeight / 2 + 7,
nTableTop = nWinTop + 20 + 11,
nBtnTop = nWinTop + nWinHeight - 48;
Window *win = new Window( nWinTop, winWidth, nWinHeight, "日统计", tpNoSave );
Button *btnOk = new Button( btnOkLeft, nBtnTop, tpOkButton );
Button *btnPrint = new Button( btnPrintLeft, nBtnTop, szBtnPrint, cmPrint, btnWidth, btnHeight );
Button *btnHelp = new Button( btnHelpLeft, nBtnTop, tpHelpButton );
win->Insert( btnOk, btnPrint, btnHelp, NULL );
HideCursor();
for( i = 0; i < 4 ; i ++, nTableTop += 16 )
showhz( tableLeft, nTableTop, szTable[ i ] );
for( i = 0, j = 4; i < nLineShow * 2; i ++, j ++, nTableTop += 16 )
showhz( tableLeft, nTableTop, szTable[ j ] );
showhz( tableLeft, nTableTop, szTable[ nLineNum - 2 ] );
showhz( tableLeft, nTableTop + 16, szTable[ nLineNum - 1 ] );
ShowCursor();
ShowCountStatus();
Event event;
for(;;)
{
while( !GetEvent( event ) );
win->HandleEvent( event );
if( event.what == evKeyboard && event.key == kbF2 )
{
event.what = evCommand;
event.command = cmPrint;
}
if( event.what == evCommand )
{
if( event.command == cmPrint )
{
if( PrnReady() )
{
for( i = 0; i < nLineNum ; i ++ )
fprintf( stdprn, "%s\n", szTable[ i ] );
NewPage();
}
win->Reselect( btnOk );
}
else if( event.command == cmOk ||
event.command == cmCancel ||
event.command == cmClose ) break;
else if( event.command == cmHelp )
{
ShowHelp( szHelp );
win->Reselect( btnOk );
}
}
}
delete uClient;
delete dMoney;
delete dAChg;
for( i = 0, j = 4; i < nRecNum * 2; i ++, j ++ ) delete szTable[ j ];
delete szTable;
delete win;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?