moncount.cpp

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

CPP
298
字号
#if !defined( __STRING_H )
#include <String.h>
#endif  // __STRING_H

#if !defined( __STDLIB_H )
#include <StdLib.h>
#endif  // __STDLIB_H

#if !defined( __DOS_H )
#include <Dos.h>
#endif  // __DOS_H

#define Uses_DBase
#define Uses_Window
#define Uses_Button
#define Uses_Blood
#include <ly.h>

#include "sj.h"
#include "sjdbf.h"
#include "sjcfg.h"

const
   winWidth     = 50 * 8 + 24,
   winLeft      = 320 - winWidth / 2,

   tableLeft    = winLeft + 5 + 13,

   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月(96/12/21-97/01/20)",
/*01*/"┏━━━━┯━━━━━━┯━━━━━┯━━━━━┓",
/*02*/"┃收 款 员│共收用户(个)│共收款(元)│滞纳金(元)┃",
/*03*/"┠────┼──────┼─────┼─────┨",
/*04*/"┃1234    │    9999    │1234567.12│1234567.12┃",
/*05*/"┠────┼──────┼─────┼─────┨",
/*06*/"┃总    计│            │          │          ┃",
/*07*/"┗━━━━┷━━━━━━┷━━━━━┷━━━━━┛",
/*08*/" 共有用户99999个,应收款1234567.12 + 欠费1234567.12",
/*09*/" 共收用户99999个,共收款1234567.12 + 欠费1234567.12",
/*10*/" 未收用户99999个,未收款1234567.12 + 欠费1234567.12",
};

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

void SJ::TotalCurMonth( char** szTable, int nLine )
{
   long lRec = dbfSJ->GetRecordNum();
   Blood *blood = new Blood( "正在统计当月数据", lRec );
   double dTotRChg = 0.0;
   unsigned uTotClient = 0;
   double dTotMoney = 0.0;
   for( long l = 0; l < lRec; l ++ )
   {
      blood->Increase();
      double dTmp = dbfSJ->GetDouble( l, fdRChg );
      dTotRChg += dTmp;
      if( dbfSJ->GetBool( l, fdOk ) )
      {
         uTotClient ++;
         dTotMoney += dTmp;
      }
   }
   delete blood;
   lRec = dbfQf->GetRecordNum();
   blood = new Blood( "正在统计欠费数据", lRec );
   double dTotQf = 0.0,
          dGetQf = 0.0;
   for( l = 0; l < lRec; l ++ )
   {
      blood->Increase();
      double dTmp = dbfQf->GetDouble( l, fdQfRChg );
      dTotQf += dTmp;
      if( dbfQf->Deleted( l ) ) dGetQf += dTmp;
   }
   delete blood;
   lRec = dbfSJ->GetRecordNum();
   szTable[ nLine ] = szFormat[ 8 ];
   FormatNumber( lRec, szTable[ nLine ] + 9, 5 );  // TotClient
   FormatMoney( dTotRChg, szTable[ nLine ] + 23, flTotChg );  // TotMoney
   FormatMoney( dTotQf, szTable[ nLine ] + 40, flTotChg );  // TotQf

   szTable[ nLine + 1 ] = szFormat[ 9 ];
   FormatNumber( uTotClient, szTable[ nLine + 1 ] + 9, 5 );  // TotClient
   FormatMoney( dTotMoney, szTable[ nLine + 1 ] + 23, flTotChg );  // TotMoney
   FormatMoney( dGetQf, szTable[ nLine + 1 ] + 40, flTotChg );  // GetQf

   lRec -= uTotClient;
   szTable[ nLine + 2 ] = szFormat[ 10 ];
   FormatNumber( lRec, szTable[ nLine + 2 ] + 9, 5 );  // LeftClient
   FormatMoney( dTotRChg - dTotMoney, szTable[ nLine + 2 ] + 23, flTotChg );  // LeftMoney
   FormatMoney( dTotQf - dGetQf, szTable[ nLine + 2 ] + 40, flTotChg );  // LeftQf
}

void SJ::MonthCount()
{
   char szDate[ 9 ];
   struct date d;
   if( !GetDateDlg( szDate, tpMonth, &d ) ) return;

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

   char str[ 81 ];
   if(config.nDataYear >= 2000)
     sprintf( str, "%02u/%02u", config.nDataYear - 2000, config.nDataMonth );
   else sprintf( str, "%02u/%02u", config.nDataYear - 1900, config.nDataMonth );
   BOOL bCurMonth = ( memcmp( szDate, str, 5 ) == 0 );

   int nRecNum    = dbfDuty->GetRecordNum(),
       nLineNum   = 9 + 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 );  // Month
   memcpy( szTable[ 0 ] + 15, szDate + 3, 2 );
   if( szTable[ 0 ][ 15 ] == '0' ) szTable[ 0 ][ 15 ] = ' ';
   int nYear1  = d.da_year - 1900,
       nYear2  = d.da_year - 1900,
       nMonth2 = d.da_mon + 1;
   if( nMonth2 == 13 )
   {
      nMonth2 = 1;
      nYear2 ++;
   }
   if(nYear1 >= 100) nYear1 = nYear1 - 100;
   if(nYear2 >= 100) nYear2 = nYear2 - 100;
   sprintf( szTable[ 0 ] + 19, "(%02u/%02u/%02u-%02u/%02u/%02u)",
            nYear1, d.da_mon, config.nDayStart,
            nYear2, nMonth2, config.nDayEnd );

   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;

   long lRec;
   for( i = config.nDayStart; i <= 31; i ++ )
   {
      sprintf( szDate + 6, "%02u", i );
      lRec = dbfLog->Search( szDate, fdLogDate );
      if( lRec >= 0 ) break;
   }
   sprintf( szDate, "%02u/%02u/%02u", nYear2, nMonth2, config.nDayEnd );
   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( str, szDate, 8 ) > 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 ] + 15, 5 ); // 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 ] + 15, 5 ); // Client
   FormatMoney( dTotMoney, szTable[ j ] + 26, flTotChg );  // Money
   FormatMoney( dTotAChg, szTable[ j ] + 38, flTotChg );  // AChg
   szTable[ j + 1 ] = szFormat[ 7 ];

   DeleteMsgBox();

   if( bCurMonth ) TotalCurMonth( szTable, j + 2 );

   int nLineShow  = nRecNum;
   if( bCurMonth && nLineShow > 6 ) nLineShow = 6;
   else if( nLineShow > 7 ) nLineShow = 7;
   int nOtherLine = 7;
   if( bCurMonth ) nOtherLine += 2;
   int nWinHeight = ( nOtherLine + 2 * nLineShow ) * 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();
   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 - 5 ] );
   nTableTop += 16;
   showhz( tableLeft, nTableTop, szTable[ nLineNum - 4 ] );
   if( bCurMonth )
   {
      nTableTop += 14;
      showhz( tableLeft, nTableTop, szTable[ nLineNum - 3 ] );
      nTableTop += 16;
      showhz( tableLeft, nTableTop, szTable[ nLineNum - 2 ] );
      nTableTop += 16;
      showhz( tableLeft, nTableTop, szTable[ nLineNum - 1 ] );
   }
   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", 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 + -
显示快捷键?