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

📄 loaddbf.cpp

📁 DOS下一个完整的大型程序源代码
💻 CPP
字号:
#if !defined( __STRING_H )
#include <String.h>
#endif  // __STRING_H

#if !defined( __STDIO_H )
#include <StdIO.h>
#endif  // __STDIO_H

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

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

#if !defined( __IO_H )
#include <IO.h>
#endif  // __IO_H

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

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

char fnTelIdx[] = "TEL.IDX";

int LCmp( const void *p1, const void *p2 )
{
   long l1 = 0, l2 = 0;
   memcpy( &l1, p1, 3 );
   memcpy( &l2, p2, 3 );

   long l = l1 - l2;
   if( l < 0 ) return -1;
   else if( l > 0 ) return 1;
   else return 0;
}

void SJ::MakeIndex()
{
   unsigned uRecNum = dbfSJ->GetRecordNum(),
            uIdxLen = uRecNum * 5;
   szTelIdx = new char[ uIdxLen ];
   char *pTel = szTelIdx;
   Blood *blood = new Blood( "正在生成索引", uRecNum );
   for( unsigned i = 0; i < uRecNum; i ++ )
   {
      blood->Increase();

      char szTel[ flTel + 1 ];
      dbfSJ->GetField( i, fdTel, szTel );
      szTel[ flTel ] = 0;
      long lTel = atol( szTel );
      memcpy( pTel, &lTel, 3 );
      pTel += 3;
      *( ( unsigned * )pTel ) = i;
      pTel += 2;
   }
   qsort( szTelIdx, uRecNum, 5, LCmp );

   FILE *fp = fopen( fnTelIdx, "wb" );
   fwrite( szTelIdx, uIdxLen, 1, fp );
   fclose( fp );
   delete szTelIdx;

   delete blood;
}

static BOOL IsFree( long lNo )
{
   for( int j = 0; j < 5; j ++ )
     if( lNo >= config.lFree[ j ][ 0 ] &&
         lNo <= config.lFree[ j ][ 1 ] ) return TRUE;
   return FALSE;
}

static char szDbfName[ 13 ];

#if defined( ShiZhu )
static void SetDbfName()
{
   strcpy( szDbfName, "MONBU.DBF" );
}
#elif defined( XiTuo )
static void SetDbfName()
{
   strcpy( szDbfName, "MONBU.DBF" );
}
#elif defined( YouYang ) || defined( PengShui )
static void SetDbfName()
{
   strcpy( szDbfName, "MONBU.DBF" );
}
#else
static void SetDbfName()
{
   struct date d;
   getdate( &d );
   sprintf( szDbfName, "YHF%02u%02u.DBF", d.da_year - 1900, d.da_mon );
}
#endif

//#if !defined( XiTuo )
void SJ::TransferData()
{
   DBase *dbfYHF = new DBase( szDbfName, tpNoLoad );
   dbfSJ->DeleteAll();

   unsigned uCount = dbfYHF->GetRecordNum(),
            uIdxLen = uCount * 5;
   char *szCNoIdx = new char[ uIdxLen ];
   char *pIdx = szCNoIdx;
   Blood *blood = new Blood( "正在生成临时索引", uCount );
   for( unsigned i = 0; i < uCount; i ++ )
   {
      blood->Increase();

      long lCNo = dbfYHF->GetLong( i, fdCNo );
      memcpy( pIdx, &lCNo, 3 );
      pIdx += 3;
      *( ( unsigned * )pIdx ) = i;
      pIdx += 2;
   }
   qsort( szCNoIdx, uCount, 5, LCmp );
   delete blood;

   blood = new Blood( "正在建立系统数据库", uCount );
   pIdx = szCNoIdx;
   for( i = 0; i < uCount; i ++, pIdx += 2 )
   {
      blood->Increase();

      char szRecord[ rlSJ ];
      long lCNo = 0;
      memcpy( &lCNo, pIdx, 3 );
      pIdx += 3;

      memset( szRecord, ' ', rlSJ );
      unsigned uRec = *( unsigned * )pIdx;
#if defined( PengShui )
      /*char szLB[ 1 ];
      dbfYHF->GetField( uRec, fdLB, szLB );
      if( *szLB != 'A' && *szLB != 'B' &&
          *szLB != 'C' && *szLB != 'D' ) continue;*/
#elif defined( ShiZhu )
      /*char szCNo[ 8 ];
      dbfYHF->GetField( uRec, fdCNo, szCNo );
      char ch = szCNo[ 1 ];
      if( ch == '0' || ch == '1' || ch == '2' ||
          ch == '3' || ch == '9' ) continue;*/
#else
      if( lCNo == 0 || IsFree( lCNo ) ) continue;
#endif
      dbfYHF->GetRecord( uRec, szRecord );
      szRecord[ rlSJ - 1 ] = 'F';

      dbfSJ->AppendRecord( szRecord );
/*#if defined( PengShui )
      long lRec = dbfSJ->GetRecordNum() - 1;
      double dTmp = dbfSJ->GetDouble( lRec, fdSHJC ) +
                    dbfSJ->GetDouble( lRec, fdXXFY );
      dbfSJ->Replace( lRec, fdSHJC, dTmp );
      dbfSJ->Replace( lRec, fdXXFY, 0.0 );
#endif*/
   }
   delete szCNoIdx;
   delete dbfYHF;
   dbfSJ->SaveData();
   delete blood;
}
//#else
//#if defined( XiTuo )
//  #define lOTChg  lChg[ 0 ]
//  #define lBNChg  lChg[ 1 ]
//  #define lMLTChg lChg[ 2 ]
//  #define lTGTChg lChg[ 3 ]
//#elif defined( YouYang )
//  #define lOTChg  lChg[ 0 ]
//  #define lBNChg  lChg[ 3 ]
//  #define lMLTChg lChg[ 2 ]
//  #define lTGTChg lChg[ 1 ]
//#endif
/*const nameLen = 30;
struct HJD04
{
   long lTel;
   char szUserName[ nameLen ];
   char szAdd[ 30 ];

   int  nType;
   int  nMask1;
   int  nMask2;
   long lZero[ 4 ];

   long lChg[ 4 ];

   long lLCTChg;
   long lLCTAdd;
   long lLCTTimes1;
   long lLCTTimes2;

   long lSBTChg;
   long lSBTAdd;
   long lSBTSc;
   long lSBTTimes;

   long lLDTChg;
   long lLDTAdd;
   long lLDTSc;
   long lLDTTimes;

   long lNewChg;
   long lRChg;
};
static void GetName( char *pDst, char *pSrc )
{
   for( int i = 0; i < nameLen; i ++ )
     if( pSrc[ i ] == 0 ) pSrc[ i ] = ' ';
   memcpy( pDst, pSrc, nameLen );
   for( i = 0; i < nameLen; i ++ ) //Cut the Tel. at end of name
     if( pSrc[ i ] == ' ' ) break;
   char ch = pDst[ i + 1 ];
   if( ch >= '0' && ch <= '9' ) pDst[ i ] = 0;
}
void SJ::TransferData()
{
   const hjd04Size = sizeof( HJD04 );
   FILE *fp = fopen( szDbfName, "rb" );
   long lCount = filelength( fileno ( fp ) ) / hjd04Size;
   Blood *blood = new Blood( "正在建立系统数据库", lCount );

   dbfSJ->DeleteAll();
   HJD04 hjd04;
   long lNo = 0;
   for( long i = 0; i < lCount; i ++ )
   {
      blood->Increase();

      fread( &hjd04, hjd04Size, 1, fp );
      if( hjd04.lTel == 0 ) continue;
      long lCNo = atof(hjd04.szAdd);
      if( lCNo == 0 || IsFree( lCNo ) ) continue;

      //if( hjd04.szAdd[0] != '0' || hjd04.szAdd[1] == '0' ||
      //   hjd04.szAdd[1] == '1' || hjd04.szAdd[1] == '9' ) continue;

      dbfSJ->AppendRecord();
      char str[nameLen + 1];
      sprintf( str, "%lx", hjd04.lTel );       // Tel.
      dbfSJ->Replace(lNo, fdTel, str);
      dbfSJ->Replace(lNo, fdCNo, hjd04.szAdd); // ADD or CountNo
      GetName( str, hjd04.szUserName );        // NAME
      dbfSJ->Replace(lNo, fdName, str);        // ADD or CountNo

      double dLCTChg = ( double )( hjd04.lLCTChg + hjd04.lLCTAdd ) / 100.0, // SHF
             dSBTChg = ( double )( hjd04.lSBTChg + hjd04.lSBTAdd ) / 100.0, // SBT
             dLDTChg = ( double )( hjd04.lLDTChg + hjd04.lLDTAdd ) / 100.0, // CKCH
             dTGTChg = ( double )hjd04.lTGTChg / 100.0, // DBF
             dNewChg = ( double )hjd04.lNewChg / 100.0, // XywF
             dMLTChg = ( double )hjd04.lMLTChg / 100.0, // RGCH
             dOTChg  = ( double )hjd04.lOTChg / 100.0,  // QTF
             dBNChg  = ( double )hjd04.lBNChg / 100.0,  // BNF
             dRChg   = ( double )hjd04.lRChg / 100.0,   // ZFY
             dYZChg  = dRChg - dLCTChg - dSBTChg - dLDTChg - dTGTChg
                             - dNewChg - dMLTChg - dOTChg - dBNChg;
      dbfSJ->Replace(lNo, fdChg11, dYZChg);
      dbfSJ->Replace(lNo, fdChg05, dLCTChg);
      dbfSJ->Replace(lNo, fdChg06, dSBTChg);
      dbfSJ->Replace(lNo, fdChg03, dLDTChg);
      dbfSJ->Replace(lNo, fdChg12, dTGTChg);
      dbfSJ->Replace(lNo, fdChg13, dNewChg);
      dbfSJ->Replace(lNo, fdChg14, dMLTChg);
      dbfSJ->Replace(lNo, fdChg15, dOTChg);
      dbfSJ->Replace(lNo, fdChg16, dBNChg);
      dbfSJ->Replace(lNo, fdRChg, dRChg);
      dbfSJ->Replace(lNo, fdOk, "F");
      lNo ++;
   }
   fclose( fp );
   dbfSJ->SaveData();
   delete blood;
}
#endif*/

static char *szHelp[] =
{  //⑼
   "下面将要自动完成所有的数据维护工作,",
   "            这包括:                ",
   " ⑴从软盘装入下个月的交费数据       ",
   " ⑵汇总这个月的交费数据库           ",
   " ⑶汇总欠费数据                     ",
   " ⑷生成催缴电话薄(供催缴系统使用) ",
   " ⑸生成本系统下个月的交费数据       ",
   " ⑹建立交费数据索引表               ",
   " ⑺生成查询电话薄(供查询系统使用) ",
   " ⑻发送催缴和查询电话薄给语音系统   ",
   "    整个过程无需人工干预,花费时间不",
   "到10分钟而且不是太枯燥。          ",
   "    按Esc或选择〔错〕放弃……    ",
   NULL
};

static BOOL IsRightDate()
{
   struct date d;
   getdate( &d );
   if( d.da_day < config.nDayEnd )
   {
      char str[ 44 - 22 - 2 + 2 + 1 ];
      sprintf( str, "请在每月%u日后装入数据", config.nDayEnd );
      ShowError( str );
      return FALSE;
   }
   return TRUE;
}

static BOOL CopyFile()
{
   SetDbfName();
   char szSrc[ 16 ], szDst[ 19 ];
   sprintf( szSrc, "A:\\%s", szDbfName );
   //sprintf( szDst, "\\SJ\\%s", szDbfName );
   strcpy( szDst, szDbfName );
   if( !FileCopy( szSrc, szDst ) )
   {
      ShowError( "文件拷贝失败,请重试" );
      return FALSE;
   }
/*#if defined( ShiZhu )
   MessageBox( "正在进行解压缩... " );
   system( "PKUNZIP -o MONBU.ZIP >NUL" );
   system( "arj e -y monbu.arj >nul" );
   DeleteMsgBox();
#endif*/
   return TRUE;
}

void SJ::LoadDbf()
{
   if( !IsRightDate() ) return;
   struct date d;
   getdate( &d );
   if( d.da_mon == config.nDataMonth )
   {
      ShowError( "本月数据已装入,您可以选择[重装当月数据]" );
      return;
   }

   static char szTytle[] = "装入数据";
   if( !Query( szTytle, szHelp ) ) return;

   SetFree();

   if( !CopyFile() ) return;

   config.nDataMonth = d.da_mon;
   config.nDataYear = d.da_year;
   SaveConfig();
   if( dbfSJ->GetRecordNum() != 0 ) TotalDbf();

   TransferData();
   MakeIndex();
   MakeCxDbf();
   SendYyDbf();
   if( Query( "打印", "打印停机号码吗?" ) ) PrintStop();
}

void SJ::ReloadDbf()
{
   if( !IsRightDate() ) return;
   struct date d;
   getdate( &d );
   if( d.da_mon != config.nDataMonth )
   {
      ShowError( "本月数据未装入,不能重装" );
      return;
   }

   SetFree();
   if( !CopyFile() ) return;
   TransferData();
   MakeIndex();
   MakeCxDbf();
   SendYyDbf();
}

⌨️ 快捷键说明

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