yeacount.cpp

来自「DOS下一个完整的大型程序源代码」· C++ 代码 · 共 266 行

CPP
266
字号
#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"
#include "sjcfg.h"

const
   winWidth     = 640 - 8,
   winLeft      = 320 - winWidth / 2,

   tableLeft1   = winLeft + 5,
   tableLeft2   = tableLeft1 + 40 * 8,

   blockLeft    = tableLeft2 + 26 * 8,
   blockWidth   = winLeft + winWidth - blockLeft - 12,

   btnWidth     = 70,
   btnHeight    = 36,

   btnOkLeft    = winLeft + 12,
   btnPrintLeft = 320 - btnWidth / 2,
   btnHelpLeft  = winLeft + winWidth - 13 - 70;

static char *szFormat1[] =
{
     //0         1         2         3
     //0123456789012345678901234567890123456789
/*00*/" 统计年份: 96年",
/*01*/"┏━━━━┯━━━━━━┯━━━━━━┓",
/*02*/"┃收 款 员│共收用户(个)│ 共收款(元) ┃",
/*03*/"┠────┼──────┼──────┨",
/*04*/"┃1234    │  999999    │ 1234567.12 ┃",
/*05*/"┠────┼──────┼──────┨",
/*06*/"┃总    计│  999999    │ 1234567.12 ┃",
/*07*/"┗━━━━┷━━━━━━┷━━━━━━┛",
};

static char *szFormat2[] =
{
     //0         1         2
     //01234567890123456789012345
/*00*/" 按月统计:",
/*01*/"┏━━━━┯━━━━━━┓",
/*02*/"┃月    份│ 共收款(元) ┃",
/*03*/"┠────┼──────┨",
/*04*/"┃96年12月│ 1234567.12 ┃",
/*05*/"┠────┼──────┨",
/*06*/"┃总    计│ 1234567.12 ┃",
/*07*/"┗━━━━┷━━━━━━┛",
};

static char *szHelp[] =
{
   "■按Enter或Esc或选择〔对〕退出      ",
   "■按<F2>或选择〔打印〕打印年统计    ",
   "  (包括按收款员以及按月份的统计)  ",
   "■如果收款员多于7个,屏幕上只显示前",
   "  7个的统计情况,但可以全部打印出来",
   NULL
};

void SJ::YearCount()
{
   char szDate[ 9 ];
   if( !GetDateDlg( szDate, tpYear ) ) return;

   MessageBox( "正在统计..." );

   int nRecNum    = dbfDuty->GetRecordNum(),
       nLineNum   = 6 + 2 * nRecNum;

   char **szTable1 = new char *[ nLineNum ];
   szTable1[ 0 ] = szFormat1[ 0 ];
   szTable1[ 1 ] = szFormat1[ 1 ];
   szTable1[ 2 ] = szFormat1[ 2 ];
   szTable1[ 3 ] = szFormat1[ 3 ];

   memcpy( szTable1[ 0 ] + 11, szDate, 2 );  // Month

   long *lClient = new long[ nRecNum ];
   for( int i = 0; i < nRecNum; i ++ ) lClient[ i ] = 0;
   double *dMoney = new double[ nRecNum ];
   for( i = 0; i < nRecNum; i ++ ) dMoney[ i ] = 0.0;
   double dMonth[ 12 ];
   for( i = 0; i < 12; i ++ ) dMonth[ i ] = 0.0;

   long lTotClient = 0l;
   double dTotMoney = 0.0;

   char str[ 81 ];
   long lRecNum = dbfLog->GetRecordNum();
   for( long lRec = 0; lRec < lRecNum; lRec ++ )
   {
      dbfLog->GetField( lRec, fdLogDate, str );
      if( memcmp( szDate, str, 2 ) == 0 ) break;
   }
   if( lRec != lRecNum )
   {
      while( lRec < lRecNum )
      {
         dbfLog->GetField( lRec, fdLogDate, str );
         if( memcmp( szDate, str, 2 ) != 0 ) break;

         str[ 5 ] = 0;
         int nMonth = atoi( str + 3 );

         dbfLog->GetField( lRec, fdLogDuty, str );
         int nRec = dbfDuty->Seek( str );
         if( nRec >= 0 ) lClient[ nRec ] ++;
         lTotClient ++;

         double dTmp = dbfLog->GetDouble( lRec, fdLogRChg );

         if( nRec >= 0 ) dMoney[ nRec ] += dTmp;
         dTotMoney += dTmp;

         dMonth[ nMonth - 1 ] += dTmp;

         lRec ++;
      }
   }

   int j = 4;
   for( i = 0; i < nRecNum; i ++, j += 2 )
   {
      const cnSize = 38;
      szTable1[ j ] = new char[ cnSize + 1 ];
      strcpy( szTable1[ j ], szFormat1[ 4 ] );
      dbfDuty->GetField( i, fdDuty, szTable1[ j ] + 2 );  // DutyNum
      FormatNumber( lClient[ i ], szTable1[ j ] + 14, 6 );  // Client
      FormatMoney( dMoney[ i ], szTable1[ j ] + 27, flTotChg );  // Money

      szTable1[ j + 1 ] = new char[ cnSize + 1 ];
      strcpy( szTable1[ j + 1 ], szFormat1[ 5 ] );
   }

   szTable1[ j ] = szFormat1[ 6 ];
   FormatNumber( lTotClient, szTable1[ j ] + 14, 6 );  // Client
   FormatMoney( dTotMoney, szTable1[ j ] + 27, flTotChg );  // Money
   szTable1[ j + 1 ] = szFormat1[ 7 ];

   char *szTable2[ 19 ];
   szTable2[ 0 ] = szFormat2[ 0 ];
   szTable2[ 1 ] = szFormat2[ 1 ];
   szTable2[ 2 ] = szFormat2[ 2 ];
   szTable2[ 3 ] = szFormat2[ 3 ];
   double fMaxMoney = 0.01;
   for( i = 0, j = 4; i < 12; i ++, j ++ )
   {
      const cnSize = 38;
      szTable2[ j ] = new char[ cnSize + 1 ];
      strcpy( szTable2[ j ], szFormat2[ 4 ] );

      memcpy( szTable2[ j ] + 2, szDate, 2 );

      FormatNumber( i + 1, szTable2[ j ] + 6, 2 );  // Month
      FormatMoney( dMonth[ i ], szTable2[ j ] + 13, flTotChg );

      if( dMonth[ i ] > fMaxMoney ) fMaxMoney = dMonth[ i ];
   }
   szTable2[ j ] = szFormat2[ 5 ];
   szTable2[ j + 1 ] = szFormat2[ 6 ];
   FormatMoney( dTotMoney, szTable2[ j + 1 ] + 13, flTotChg );
   szTable2[ j + 2 ] = szFormat2[ 7 ];

   DeleteMsgBox();

   int nLineShow  = nRecNum;
   if( nLineShow > 7 ) nLineShow = 7;
   int nTotLine = 6 + 2 * nLineShow;
   if( nTotLine < 19 ) nTotLine = 19;
   int nWinHeight = nTotLine * 16 + 82,
       nWinTop    = 240 - nWinHeight / 2 + 7,
       nTableTop  = nWinTop + 20 + 9,
       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();
   int nTop = nTableTop;
   for( i = 0; i < 4 ; i ++, nTop += 16 )
     showhz( tableLeft1, nTop, szTable1[ i ] );
   for( i = 0, j = 4; i < nLineShow * 2; i ++, j ++, nTop += 16  )
     showhz( tableLeft1, nTop, szTable1[ j ] );
   showhz( tableLeft1, nTop, szTable1[ nLineNum - 2 ] );
   showhz( tableLeft1, nTop + 16, szTable1[ nLineNum - 1 ] );

   nTop = nTableTop;
   for( i = 0; i < 19 ; i ++, nTop += 16 )
     showhz( tableLeft2, nTop, szTable2[ i ] );

   nTop = nTableTop;
   showhz( blockLeft, nTop, "方块图:" );
   nTop += 16;
   line( blockLeft, nTop + 7, blockLeft, nTop + 18 * 16 - 8, 2 );
   nTop += 48;
   for( i = 0; i < 12; i ++, nTop += 16 )
   {
      int nWidth = dMonth[ i ] / fMaxMoney * blockWidth;
      if( nWidth == 0 ) nWidth = 1;
      bar( blockLeft + 1, nTop + 1, blockLeft + nWidth, nTop + 10, 12 );
   }
   ShowCursor();

   extern void ShowCountStatus();
   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", szTable1[ i ] );
               for( i = 0; i < 19 ; i ++ )
                 fprintf( stdprn, "%s\n", szTable2[ 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 lClient;
   delete dMoney;
   for( i = 0, j = 4; i < nRecNum * 2; i ++, j ++ ) delete szTable1[ j ];
   for( i = 0, j = 4; i < 12; i ++, j ++ ) delete szTable2[ j ];
   delete szTable1;
   delete win;
}

⌨️ 快捷键说明

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