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

📄 unitrecord.cpp

📁 基于MD110程控交换机的计费程序,使用C++Builder开发
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "UnitRecord.h"
#include "UnitMain.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define LENGTHOFLINE 108     //正常通话记录长度
TModuleRecord *ModuleRecord;
//---------------------------------------------------------------------------
__fastcall TModuleRecord::TModuleRecord(TComponent* Owner)
    : TDataModule(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TModuleRecord::FileRecord(AnsiString CallTicket)
{

//是否为通话记录?因可能为联络信号
    TDateTime DT;
    if(CallTicket.Length()!=LENGTHOFLINE)
    {
        ErrorRecord("通话记录长度不符",CallTicket);
        return;
    }
    if(!StringToDateTime(CallTicket.SubString(4,8),&DT))
    {
        ErrorRecord("日期时间格式不符",CallTicket);
        return;
    }
//找到匹配的计费种类,路由、被叫号码字冠匹配
    AnsiString Route1,Route2,No2p,status;
    Route1=CallTicket.SubString(26,7).Trim();
    Route2=CallTicket.SubString(33,7).Trim();
    No2p=CallTicket.SubString(41,18).Trim();
    status=CallTicket.SubString(24,1);

    //--此法要求“城区市话”必须排为Query4的最后一项,优先级最低可保证此点
    Query4->First();
    for(int i=0;i<Query4->RecordCount-1;i++)
    {
        if((Query4->FieldByName("ztxx")->AsString.IsEmpty()
        ||Query4->FieldByName("xtxx")->AsString==status)&&
        (Query4->FieldByName("ly1")->AsString.IsEmpty()
        ||Query4->FieldByName("ly1")->AsString==Route1)&&
        (Query4->FieldByName("ly2")->AsString.IsEmpty()
        ||Query4->FieldByName("ly2")->AsString==Route2)&&
        (No2p.AnsiPos(Query4->FieldByName("Article")->AsString)==1))
        {
            goto ExLoop;//定位到匹配项,否则定位到最后一项即“城区市话”
        }
        Query4->Next();
    }
    if(!((Query4->FieldByName("ztxx")->AsString.IsEmpty()
        ||Query4->FieldByName("xtxx")->AsString==status)&&
        (Query4->FieldByName("ly1")->AsString.IsEmpty()
        ||Query4->FieldByName("ly1")->AsString==Route1)&&
        (Query4->FieldByName("ly2")->AsString.IsEmpty()
        ||Query4->FieldByName("ly2")->AsString==Route2)))
            return;
//计算话费
    //0.1分即6秒为基本单位的通话时长
ExLoop:
    float fee=0;
    int interval=CallTicket.SubString(13,4).ToInt();
    //"城区市话"外基本话费
    if(Query4->FieldByName("Variety")->AsString!="城区市话")
    {
        int i=Query4->FieldByName("Unit")->AsInteger;
        if(i==0)i=1;
        fee=((int)(interval+1-1)/i)*Query4->FieldByName("Price")->AsFloat;
    }
    //"城区市话"或“信息”基本话费
    if(Query4->FieldByName("Variety")->AsString=="城区市话"||
        Query4->FieldByName("Variety")->AsString=="信息")
    {
        //前3分钟
        fee+=Query4->FieldByName("Price")->AsFloat;
        //3分钟后
        if(interval>30)
        {
            interval-=30;
            int i=10;
            fee+=((int)(interval+1-1)/i)*Query4->FieldByName("SecPrc")->AsFloat;
        }
    }
    //一次性附加费(非比例部分)
    fee+=Query4->FieldByName("Addi")->AsFloat;
    //一次性附加费(比例部分)
    fee+=fee*Query4->FieldByName("AddiPerc")->AsFloat;
//填充累计表
    AnsiString CallNo=CallTicket.SubString(59,6).Trim();
    FillUserTab(CallNo,Query4->FieldByName("Variety")->AsString,fee);
//填充详细话单
    Table1->Append();
    Table1->FieldByName("variety")->AsString=Query4->FieldByName("Kind")->AsString;
    Table1->FieldByName("fee")->AsFloat=fee;
    Table1->FieldByName("Dt")->AsDateTime=DT;
    Table1->FieldByName("Tm")->AsDateTime=DT;
    Table1->FieldByName("thsc")->AsString=CallTicket.SubString(13,4);
    Table1->FieldByName("bjhm")->AsString=No2p;
    Table1->FieldByName("zjhm")->AsString=CallNo;
    Table1->Post();
}

bool __fastcall TModuleRecord::StringToDateTime(AnsiString DataTimeP, TDateTime * DateTime)
{
    unsigned short year,month;
    Now().DecodeDate(&year,&month,&month);
    AnsiString str=IntToStr(year).SubString(3,2)+"-"+
        DataTimeP.SubString(1,2)+"-"+
        DataTimeP.SubString(3,2)+" "+
        DataTimeP.SubString(5,2)+":"+
        DataTimeP.SubString(7,2)+":00";
    try
    {
        *DateTime=StrToDateTime(str);
    }
    catch(Exception &ce)
    {
        return false;
    }
    return true;
}


void __fastcall TModuleRecord::ErrorRecord(AnsiString ErrorKind, AnsiString CallTicket)
{
    AnsiString FileName=GetCurrentDir()+AnsiString("\\Data\\JFError.log");
    TFileStream * FileStream=new TFileStream(FileName,fmOpenWrite);
    AnsiString s=Now();
    s+=" 错误类型:"+ErrorKind;
    s+="\r\n";
    CallTicket+="\r\n";
    FileStream->Seek(0,soFromEnd);
    FileStream->Write(s.c_str(),s.Length());
    FileStream->Write(CallTicket.c_str(),CallTicket.Length());
    delete FileStream;
}

//填充用户累计表
bool __fastcall TModuleRecord::FillUserTab(AnsiString CallNo,AnsiString kind, float fee)
{
    int i=Table3->RecNo;
    AnsiString haoma=Table3->FieldByName("Num")->AsString;

    DataSource3->Enabled=false;

//该表以电话号码升序排序,首项为总计,Num字段设置保证为首项
    Table3->First();
    //查用户是否存在
    while (!Table3->Eof)
    {
        if(Table3->FieldByName("Num")->AsString==CallNo)
        {
            Table3->Edit();
            break;
        }
        Table3->Next();
    }
    if(Table3->Eof)//未找到,追加新记录
    {
        Table3->Append();
        Table3->FieldByName("Num")->AsString=CallNo;
    }
    if(kind=="国际长途")
    {
        //用户记录修改
        Table3->FieldByName("Gjc")->AsInteger++;
        Table3->FieldByName("Gjf")->AsFloat+=fee;
        Table3->FieldByName("Zj")->AsFloat+=fee;
        Table3->FieldByName("Jy")->AsFloat-=fee;
        Table3->Post();
        //总计项修改
        Table3->First();
        Table3->Edit();
        Table3->FieldByName("Gjc")->AsInteger++;
        Table3->FieldByName("Gjf")->AsFloat+=fee;
        Table3->FieldByName("Zj")->AsFloat+=fee;
        Table3->FieldByName("Jy")->AsFloat-=fee;
        Table3->Post();
    }
    else if(kind=="国内长途")
    {
        //用户记录修改
        Table3->FieldByName("Gnc")->AsInteger++;
        Table3->FieldByName("Gnf")->AsFloat+=fee;
        Table3->FieldByName("Zj")->AsFloat+=fee;
        Table3->FieldByName("Jy")->AsFloat-=fee;
        Table3->Post();
        //总计项修改
        Table3->First();
        Table3->Edit();
        Table3->FieldByName("Gnc")->AsInteger++;
        Table3->FieldByName("Gnf")->AsFloat+=fee;
        Table3->FieldByName("Zj")->AsFloat+=fee;
        Table3->FieldByName("Jy")->AsFloat-=fee;
        Table3->Post();

    }
    else
    {
        //用户记录修改,市话、信息情况
        Table3->FieldByName("Shc")->AsInteger++;
        Table3->FieldByName("Shf")->AsFloat+=fee;
        Table3->FieldByName("Zj")->AsFloat+=fee;
        Table3->FieldByName("Jy")->AsFloat-=fee;
        Table3->Post();
        //总计项修改
        Table3->First();
        Table3->Edit();
        Table3->FieldByName("Shc")->AsInteger++;
        Table3->FieldByName("Shf")->AsFloat+=fee;
        Table3->FieldByName("Zj")->AsFloat+=fee;
        Table3->FieldByName("Jy")->AsFloat-=fee;
        Table3->Post();
    }
    DataSource3->Enabled=true;

    Table3->First();
    Table3->MoveBy(i-1);

    if(Table3->FieldByName("Num")->AsString!=haoma)
        Table3->Next();
    return true;
}


void __fastcall TModuleRecord::LocateUser(AnsiString nmornm)
{
    int i=0;
    DataSource3->Enabled=false;

    Table3->First();
    //查用户是否存在
    while (!Table3->Eof)
    {
        if(Table3->FieldByName("Num")->AsString.AnsiPos(nmornm)==1||
            Table3->FieldByName("Name")->AsString.AnsiPos(nmornm)!=0)
        {
            i=Table3->RecNo;
            break;
        }
        Table3->Next();
    }
    DataSource3->Enabled=true;

    Table3->First();
    if (i!=0)
        Table3->MoveBy(i-1);
}
void __fastcall TModuleRecord::DataSource2StateChange(TObject *Sender)
{
    FormMain->Button13->Enabled = (DataSource2->State == dsEdit || DataSource2->State == dsInsert);
    FormMain->Button14->Enabled = FormMain->Button13->Enabled;
}
//---------------------------------------------------------------------------

void __fastcall TModuleRecord::DataSource2DataChange(TObject *Sender,
      TField *Field)
{
    FormMain->Button11->Enabled=Table2->RecordCount;
}
//---------------------------------------------------------------------------

void __fastcall TModuleRecord::DataSource3DataChange(TObject *Sender,
      TField *Field)
{
    FormMain->Button16->Enabled=Table3->RecordCount;

}
//---------------------------------------------------------------------------

void __fastcall TModuleRecord::DataSource3StateChange(TObject *Sender)
{
    FormMain->Button7->Enabled = (DataSource3->State == dsEdit || DataSource3->State == dsInsert);
    FormMain->Button17->Enabled = FormMain->Button7->Enabled;
}
//---------------------------------------------------------------------------

void __fastcall TModuleRecord::Table3AfterScroll(TDataSet *DataSet)
{
     FormMain->GetClass(ModuleRecord->Table3->FieldByName("ClsA")->AsInteger);
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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