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

📄 totaldbf.cpp

📁 DOS下一个完整的大型程序源代码
💻 CPP
字号:
#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_Blood
#include <ly.h>

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

static char fnTmpDbf[] = "TMP.DBF";

static int HzCmp( const void *p1, const void *p2 )
{
   return memcmp( p1, p2, 2 );
}

static int UserType( char *szName )
{
   static char szFirstNameTable[] =
     "安白包毕博卜财菜蔡残曹常长陈程储从崔戴代淡邓丁董杜段范方冯扶"
     "付甘高龚公苟辜古谷官郭桂国韩郝何贺侯胡黄吉简姜江蒋焦金晋康考柯赖"
     "兰雷冷黎李梁粱寥廖林凌刘柳龙隆卢鲁路陆吕罗马毛倪聂宁欧潘彭蒲"
     "普齐秦卿邱冉饶任邵申沈施石史舒宋苏孙谭汤唐陶田童涂万汪王韦未"
     "魏温文翁巫吴伍夏乡项向肖谢幸熊徐许薛严颜杨阳姚药叶易殷阴尹应"
     "尤游于虞余俞喻袁岳云曾詹章张赵郑钟周朱祝卓邹左佘胥嬴濮缪晏滕";

   char *p = szName + flName - 1;
   while( *p == ' ' ) p --;
   if( p - szName > 5 ) return '1';
   else
   {
      if( bsearch( szName, szFirstNameTable, 182, 2, HzCmp ) ) return '0';
      else return '1';
   }
}

void SJ::TotalDbf()
{
   dbfQf->Pack();

   LoadIndex();
   unsigned uRecCount = dbfSJ->GetRecordNum();
   Blood *blood = new Blood( "正在汇总欠费数据", uRecCount );

   dbfQf->BackupHeader( fnTmpDbf );
   long lCount = dbfQf->GetRecordNum(),
        lRec    = 0;
   char *p = szTelIdx + 3;

   struct date d;
   getdate( &d );
   d.da_year -= 1900;
   d.da_mon --;
   if( d.da_mon == 0 )
   {
      d.da_mon = 12;
      d.da_year --;
   }
   if(d.da_year >= 100) d.da_year -= 100;
   char szMonth[ 6 ];
   //extern void GetPrevMonth( char * );
   sprintf( szMonth, "%02u/%02u", d.da_year, d.da_mon );
   for( unsigned i = 0; i < uRecCount; i ++, p += 5 )
   {
      blood->Increase();

      unsigned uRec = *( unsigned * )p;
      char str[ flRChg + 1 ];
      dbfSJ->GetField( uRec, fdTel, str ); // Tel
      while( lRec < lCount )
      {
         char szTel[ flQfTel ];
         dbfQf->GetField( lRec, fdQfTel, szTel );
         if( memcmp( szTel, str, flQfTel ) > 0 ) break;
         dbfQf->BackupRecord( lRec );
         lRec ++;
      }

      dbfSJ->GetField( uRec, fdOk, str ); // bOK
      if( *str == 'T' ) continue;

      double dTmp = dbfSJ->GetDouble( uRec, fdRChg ); // RChg
      if( dTmp == 0 ) continue;

      char szRecord[ rlQf ],
           *p = szRecord;
      *p ++ = ' ';

      dbfSJ->GetField( uRec, fdTel, p ); // Tel
      p += flQfTel;

      memcpy( p, szMonth, flQfDate ); // Date
      p += flQfDate;

#if defined( BIN )
      dbfSJ->GetField( uRec, fdLCTChg, p ); // LCTChg
      p += flChg;
      dbfSJ->GetField( uRec, fdLDTChg, p ); // LDTChg
      p += flChg;
      dbfSJ->GetField( uRec, fdMLTChg, p ); // MLTChg
      p += flChg;
      dbfSJ->GetField( uRec, fdTGTChg, p ); // TGTChg
      p += flChg;
      dbfSJ->GetField( uRec, fdSBTChg, p ); // SBTChg
      p += flChg;
      dbfSJ->GetField( uRec, fdTOMChg, p ); // TOMChg
      p += flChg;
      dbfSJ->GetField( uRec, fdOTChg, p ); // OTChg
      p += flChg;
#endif
      dbfSJ->GetField( uRec, fdRChg, p ); // RChg

      dbfQf->WriteRecord( szRecord );
   }
   dbfQf->EndBackup();
   delete dbfQf;
   remove( szQfDbf );
   rename( fnTmpDbf, szQfDbf );

   dbfQf = new DBase( szQfDbf );
   dbfQf->SortData();
   delete dbfQf;
   dbfQf = new DBase( szQfDbf, tpNoLoad );
   delete blood;
   CloseIndex();

   MakeCjDbf();
}

void SJ::MakeCjDbf()
{
   LoadIndex();
   long lCount = dbfQf->GetRecordNum();
   Blood *blood = new Blood( "正在生成催缴电话薄", lCount );

   DBase *dbfCj = new DBase( "CJ.DBF", tpNoLoad );
   dbfCj->DeleteAll();

   int nRecNum = 1;
   char szTel[ flQfTel + 1 ];
   dbfQf->GetField( 0, fdQfTel, szTel );
   szTel[ flQfTel ] = 0;
   double dTotQf = dbfQf->GetDouble( 0, fdQfRChg );
   for( long j = 1; j <= lCount; j ++ )
   {
      blood->Increase();

      char str[ 81 ];
      dbfQf->GetField( j, fdQfTel, str );
      if( memcmp( szTel, str, flQfTel ) != 0 || j == lCount )
      {
         unsigned uRec = SearchTel( szTel );
         if( uRec != 0xffff )
         {
            char szRecord[ rlCj ],
                 *p = szRecord;
            *p ++ = ' ';

            dbfSJ->GetField( uRec, fdTel, p ); // Tel
            p += flCjTel;

            dbfSJ->GetField( uRec, fdCNo, p ); // CNo
            p += flCjCNo;

            char szName[ flName ];
            dbfSJ->GetField( uRec, fdName, szName ); // Name
            *p ++ = UserType( szName ); // Type

            *p ++ = nRecNum + '0';  // Month

            FormatMoney( dTotQf, p, flMoney );
            p += flMoney; // TotQf

            memcpy( p, "00", 2 );
            if( !dbfQf->Deleted( j - 1 ) ) dbfCj->AppendRecord( szRecord );
         }
         nRecNum = 1;
         memcpy( szTel, str, flQfTel );
         dTotQf = dbfQf->GetDouble( j, fdQfRChg );
      }
      else
      {
         nRecNum ++;
         dTotQf += dbfQf->GetDouble( j, fdQfRChg );
      }
   }
   delete dbfCj;
   delete blood;
   CloseIndex();
}

// SJ.DBF
enum
{
   fdCxTel = 0,      // fd: field
   fdCxCNo,
   fdCxLCTChg,
   fdCxLDTChg,
   fdCxOTChg,
   fdCxRChg,
};

const rlCx = 51;

void SJ::MakeCxDbf()
{
   long lCount = dbfSJ->GetRecordNum();
   Blood *blood = new Blood( "正在生成查询电话薄", lCount );

   DBase *dbfCx = new DBase( "CX.DBF", tpNoLoad );
   dbfCx->DeleteAll();

   for( long i = 0; i < lCount; i ++ )
   {
      blood->Increase();

      char szRecord[ rlCx ],
           *p = szRecord;
      *p++ = ' ';

      dbfSJ->GetField( i, fdTel, p );
      p += flTel;
      dbfSJ->GetField( i, fdCNo, p );
      p += 6;
      double dLCTChg = dbfSJ->GetDouble( i, fdLCTChg ); // fdChg05
#if defined( ShiZhu )
      dLCTChg += dbfSJ->GetDouble( i, fdChg06 );
#endif
      FormatMoney( dLCTChg, p, flMoney );
      p += flMoney;
      double dLDTChg = dbfSJ->GetDouble( i, fdLDTChg ); // fdChg03
#if defined( ShiZhu )
      dLDTChg += dbfSJ->GetDouble( i, fdChg01 );
      dLDTChg += dbfSJ->GetDouble( i, fdChg02 );
      dLDTChg += dbfSJ->GetDouble( i, fdChg04 );
#endif
      FormatMoney( dLDTChg, p, flMoney );
      p += flMoney;
      double dRChg  = dbfSJ->GetDouble( i, fdRChg ),
             dOTChg = dRChg - dLCTChg - dLDTChg;
      FormatMoney( dOTChg, p, flMoney );
      p += flMoney;
      FormatMoney( dRChg, p, flMoney );

      dbfCx->AppendRecord( szRecord );
   }

   delete dbfCx;
   delete blood;
}

#define YYDISK "Y:"
#define NET YYDISK"\\YY.EXE"
#define NTFILE YYDISK"\\NOTICE.DAT"
#define RPFILE YYDISK"\\RESPONSE"

const WORD
   ntSendYyDbf = 0x1111,
   ntSendCjDbf = 0x2222,
   ntEndSend   = 0x3333,
   ntChgCjDbf  = 0x4444;

static void SendNotice( WORD wNotice )
{
   if( !FileExist( NET, FALSE ) ) return;
   FILE *fp = fopen( NTFILE, "wb" );
   fwrite( &wNotice, 2, 1, fp );
   fclose( fp );
}

void SJ::InitNet()
{
   bRequireSend = FALSE;
   if( !FileExist( NET, FALSE ) )
     ShowError( "网络故障,请检查后重新启动或忽略" );
}

void SJ::ChangeYyCjDbf( long *lCjRec, unsigned uTotCjRec )
{
   if( uTotCjRec == 0 ) return;
   if( !FileExist( NET, FALSE ) )
   {
      bRequireSend = TRUE;
      return;
   }

   FILE *fp = fopen( YYDISK"\\CNO.DAT", "wb" );
   fwrite( lCjRec, 4, uTotCjRec, fp );
   fclose( fp );

   SendNotice( ntChgCjDbf );
}

static BOOL WaitResponse()
{
   if( !FileExist( NET, FALSE ) ) return FALSE;

   MessageBox( "正在等待语音系统响应..." );
   MsTimer mtWait;
   mtWait.Start();
   BOOL bResult = TRUE;
   while( !FileExist( RPFILE, FALSE ) )
   {
      if( mtWait.GetTime() > 1000 )
      {
         bResult = FALSE;
         break;
      }
   }

   if( bResult )
     remove( RPFILE );
   else
     SendNotice( ntEndSend );

   DeleteMsgBox();
   return bResult;
}

void SJ::PrintStop()
{
   MessageBox( "请输入欠费月数(1-9), 按Esc放弃:" );
   int nMonth = 0;
   for( ;; )
   {
      int ch = getch();
      if( ch >= '1' && ch <= '9' )
      {
         nMonth = ch - '0';
         break;
      }
      else if( ch == 27 ) break;
   }
   DeleteMsgBox();
   if( nMonth == 0 ) return;

   DBase *dbfCj = new DBase( fnCjDbf, tpNoLoad );
   long lCount = dbfCj->GetRecordNum();
   Blood *blood = new Blood( "打印停机号码", lCount );
   int nFields[] = { fdCjTel, fdCjCNo, fdCjMon, fdCjTotQf, -1 };
   if( PrnReady() && dbfCj->PrintTytle( nFields ) )
   {
      for( int i = 0; i < lCount; i ++ )
      {
         blood->Increase();
         if( !dbfCj->Deleted( i ) &&
             dbfCj->GetInt( i, fdCjMon ) >= nMonth )
           if( !dbfCj->PrintRecord( i, nFields ) ) break;
      }
   }
   NewPage();
   delete blood;
   delete dbfCj;
}

void SJ::SendYyDbf()
{
   SendNotice( ntSendYyDbf );

   if( WaitResponse() &&
       FileCopy( fnCjDbf,  YYDISK"\\CJ.DBF" ) &&
       FileCopy( "CX.DBF", YYDISK"\\CX.DBF" ) &&
       FileCopy( fnTelIdx, YYDISK"\\TEL.IDX" ) )
   {
      SendNotice( ntEndSend );
      ShowMessage( "催缴和查询电话薄发送成功" );
      bRequireSend = FALSE;
      return;
   }

   SendNotice( ntEndSend );
   ShowMessage( "催缴和查询电话薄发送失败,请检查后重发" );
   /*
   if( !Query( "催缴和查询电话薄发送失败",
               "拷贝催缴和查询电话薄给语音系统?" ) ) return;

   if( FileCopy( fnCjDbf, "A:\\CJ.DBF" ) &&
       FileCopy( "CX.DBF", "A:\\CX.DBF" ) &&
       FileCopy( fnTelIdx, "A:\\TEL.IDX" ) &&
       FileCopy( fnCNoIdx, "A:\\CNO.IDX" ) )
     ShowMessage( "催缴和查询电话薄拷贝成功" );
   else
     ShowError( "拷贝失败,请在DOS下运行CA.BAT重新拷贝" );
   */
}

⌨️ 快捷键说明

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