總 科 目 試 算 表

wpe24.jpg (74583 bytes)

範圍選擇
wpe25.jpg (5036 bytes)

列印明細
wpe27.jpg (9774 bytes)

左右捲動
wpe28.jpg (11607 bytes)


原始程式

原始檔-起始
/*---------( FSACR062.C )---------*/
#include    "W_FSAC.H"
#define SX  20            /*左內框                             */
#define SY  10            /*上內框                             */
#define SC  34            /*內框寬, 多少行                     */

/*-----------------------------------------------------------------*/
#define PrHEAD  UPrint("#月份: %M---                                                                              列印日期:%M------   第 %I 頁 ",Sday,Day,P0); \
                UPrint("=======================================================================================================================");             \
                UPrint("科目號     科  目  名  稱       本月借方 筆數    本月貸方 筆數    本月餘額      借方累計      貸方累計 DC        總餘額");             \
                UPrint("------- -------------------- ----------- ---- ----------- ---- ----------- ------------- ------------- -- -------------");
#define PrSTYLE        "%S----- %S------------------ %F,-------- %I-- %F,-------- %I-- %F,-------- %F,---------- %F,---------- %S %F,----------"
#define PrSPILT UPrint("=======================================================================================================================");
#define PrNULL
#define PrSUMUP
#define PrSumS         "  (合計)                     %F,-------- %I-- %F,-------- %I-- %F,-------- %F,---------- %F,---------- %S %F,----------"
#define PrSumD            Sum[0],NO0,Sum[1],NO1,amt,Sum[2],Sum[3],s[1],Sum[2]-Sum[3]
#define PrNEXT
#define PrEND   UPrint(" 總經理:                        主管:                       出納:                         會計:                        ");
#define PrSTR1  UPrint("        補去年度(銷貨成本)                                                 %F,----------               借 %F,----------",csum,csum);
#define PrDATA  ACF001.KEY,ACF001.ACN,ACF001.AMT[0][Sa],ACF001.DC_NO[0][Sa],ACF001.AMT[1][Sa],ACF001.DC_NO[1][Sa],amt,dsum,csum,s[1],dsum-csum
/*-----------------------------------------------------------------*/
#define      ANO   120  /*ARRAY  陣列筆數*/
void EndPage(int sw);
void ShowLast();
void ShowHead();
void ShowData();
char *ChainYn();
void Pass1();
int  Pass3(FSACR063_T *R);
int  SearchChar(FSACR063_T *R,char C);
void SetLoss();   /*計算本期損益值,並將值設到Rest中*/
void CalLamt();
/*================================================================*/
FSACF001_T   ACF001;
FSACR063_T   R063A[ANO];
double       Rest;     /*去年收入及費用,即跨年度(83/84,而查84),83虛科目總餘額Rest=83總虛貸-83總虛借*/
double       Lamt;     /*83/84,查84時,則掃瞄83損益表,找出"本期損益"的欄位,並將值設給Lamt中*/
double       Sum[10];
char         Yn;
int          NO0, NO1;
int          A,B;
char        *Table="\
                                  \
       總 科 目 試 算 表          \
 ================================ \
   列印月份: -----                \
   明細科目: ------               \
                                  \
 資料輸出裝置:--------           \
                                  ";
/*===========================================================================*/
void main()
{  USetBXYN(Table,SX,SY,SC);
   OPEN_ACF001;   NamS=GET_NAME;
   while(1)
   {  Yn='N';
      #include <RPT1.H>
      if(Field==1) UReadM(BXN(1),&Sday,0,V_WUSR,V_READ);
      if(Field==2){ UReadTog(BXN(2),&Yn,V_TOG,"YN","列印","不印");
                    UShowSL( BXN(2),ChainYn(),V_WUSR);
                  }
       #include <RPT2.H>  /*條件設定完畢*/
      /*------------------------------------------------------------------*/
       if(Sday.D<1) Sa=0;   /*僅列印上期結轉*/
       if(Sday.Y==SysY-1 && Sday.M==12) Sa=0;    /*特:去年12月,則僅列印上期結轉,可用來查開帳功能*/
       else if((Sa=ChkYM(Sday,ON))==0) continue; /*本年月數 or 下年月數*/
       Sp=Usp_Open();
       Rest=Lamt=0f;  NO0=NO1=0;
       if(Sa>=13) CalLamt();  /*以損益表的本期損益轉到累積盈虧,即求得Lamt*/
      /*------------------------------------------------------------------*/
       Ugd_Open("檔 案 處 理 中 請 稍 候 ....."); /* Sort  FSACF011 */
       READ1(ACF001)
       {   if(p->KEY[4]>SPACE && Yn=='N') continue;   /*總科目或要印明細科目,才會往下做*/
           if(p->KEY[0]=='Z') continue;               /*期初存貨(虛科目)*/
           Usp_InsIp(Sp,p->KEY,L);              /*科目號收集到Sp*/
           if(Sa<13) continue;                  /*83/84,查83,未跨年度,不用管Rest*/
           if(p->KEY[0]<='3') continue;         /*跨年度,累加虛科目Rest金額*/
           for(I=0; I<13; I++) Rest += p->AMT[1][I] - p->AMT[0][I];  /*83虛科目總餘額=83貸-83借*/
       }
       READ2
       Ugd_Close();
      /*------------------------------------------------------------------*/
       Ugd_Open("列印中           Ctr_F7:結束列印");
       while(RetKey!=ESC)
       {   if(Usp_GetIp(Sp,&L)==OFF) break;
           lseek(ACF001K->ffd,L*sizeof(ACF001),SEEK_SET);
           read(ACF001K->ffd,&ACF001,sizeof(ACF001));
           ShowData();
           if(Psf=='S' && K0>=20){ UWait(OFF,"Esc:重新選擇      任一鍵繼續"); UCls(); K0=0; }
           if(Psf=='P' && K0>=K1){ EndPage(ON); fprintf(Stream,"%c",12); K0=0; }
       }
       ShowLast();    EndPage(OFF);
       Usp_Close(Sp); LineReturn(ON);
   }
}
/*===========================================================================*/
void ShowHead()
{  int   y,m;

#ifdef   HP-5L          /*1998/8/27*/
   LockItemHead(2,"~I",NamS,"~Z2W1X16");
#else
   LockItemHead(2,"~IZ2L10G2X1",NamS,"~Z1");
#endif
   PrHEAD                                      /*列印標頭*/
}
/*===========================================================================*/
void ShowData()
{   int     m;
    double  amt,dsum=0f,csum=0f;      /*單列,本月餘額,借方累計,c貨方累計*/
    char    s[2][3];

    if(Sa>=13 && ACF001.KEY[0]>='4') m=13;   /*跨年度 & 虛科目*/
    else m=0;                                /*0=結轉金額*/
    for(; m<=Sa; m++){ dsum+=ACF001.AMT[0][m];  csum+=ACF001.AMT[1][m]; }
    if(ACF001.KEY[4]==SPACE)          /* 由總科目即可算出總額*/
    {   NO0  += ACF001.DC_NO[0][Sa];  /* 本月借方筆數合計 */
        NO1  += ACF001.DC_NO[1][Sa];  /* 本月貸方筆數合計 */
        Sum[0] += ACF001.AMT[0][Sa];  /* 總本月借方       */
        Sum[1] += ACF001.AMT[1][Sa];  /* 總本月貸方       */
        Sum[2] += dsum;               /* 總借方累計       */
        if(memcmp(ACF001.KEY,"3250   ",7)==0) csum+=Lamt; /*83/84,如科目為84累積盈虧(貸),則將左83Lamt"本期損益",加到貸方*/
        Sum[3] += csum;               /* 總貸方累計       */
    }
    if(dsum==0f && csum==0f) return;  /*至本月均無交易*/
    amt=ACF001.AMT[0][Sa]-ACF001.AMT[1][Sa];        /*本月餘額=借-貸*/
    if(ACF001.AMT[0][Sa]>ACF001.AMT[1][Sa]) strcpy(s[0],"借");  else strcpy(s[0],"貸");
    if(dsum > csum) strcpy(s[1],"借"); else strcpy(s[1],"貸");
    UPrint(PrSTYLE,PrDATA);
    if(memcmp(ACF001.KEY,"3250   ",7)==0 && Sa>=13)   /*累積盈虧&跨年度*/
    {   csum=Rest-Lamt;     /*83/84,查84時,則84補去年度(銷貨成本)=83(1..12月)虛科目總額-83本期損益*/
        Sum[2] -= csum;     /*總借方累計 淢掉本筆補去年度(銷貨成本),才會平*/
        PrSTR1                       /*補去年度(銷貨成本)*/
    }
}
/*===========================================================================*/
void EndPage(int sw)
{
   if(sw) PrSPILT
   PrEND
}
/*===========================================================================*/
void ShowLast()
{   char   s[2][3];
    double amt=Sum[0]-Sum[1];

    memset(s,NULL,sizeof(s));   K0=1;
    if(Sum[0] > Sum[1]) strcpy(s[0],"借");
    if(Sum[0] < Sum[1]) strcpy(s[0],"貸");
    if(Sum[2] > Sum[3]) strcpy(s[1],"借");
    if(Sum[2] < Sum[3]) strcpy(s[1],"貸");

    PrSPILT
    UPrint(PrSumS,PrSumD);                         /*合計*/
    UPrint("  ");
    memset(Sum,NULL,sizeof(Sum));
}
/*===========================================================================*/
void Pass1()       /*若主檔的科目有在損益表中,則求出該科目左1..12月的金額*/
{   int   i,j,s,e;

    for(i=0; i<ANO; i++)
    {   if(R063A[i].AC[1][0]>SPACE) Str=R063A[i].AC[1];       /*終止科目*/
        else                        Str=R063A[i].AC[0];       /*起始科目*/
        if(memcmp(ACF001.KEY,R063A[i].AC[0],7)<0) continue;   /*小於起始科目*/
        if(memcmp(Str,ACF001.KEY,7)<0) continue;              /*大於終止科目*/
        /*判斷總分類帳與總分類帳相加*/
        if(ACF001.KEY[4]> SPACE && R063A[i].AC[0][4]<=SPACE) continue;  /*明,總*/
        if(ACF001.KEY[4]<=SPACE && R063A[i].AC[0][4] >SPACE) continue;  /*總,明*/
        for(j=1; j<=12; j++)    /*左半部*/
            R063A[i].AMT[0]+=ACF001.AMT[A][j]-ACF001.AMT[B][j];   /*A,B在CalLamt()已設定*/
    }
}
/*===========================================================================*/
/*依R063A[].FMT計算公式到R063A.AMT0,R063A[].AMT1找相對的值*/
int  Pass3(FSACR063_T *R)
{  int      lp,co,Y,i,j,sw;

   for(lp=0,co=ON; lp<20 && co; lp++)
   {  co=OFF;
      for(Y=0; Y<ANO; Y++)
      {  if(R[Y].FMT[0]<=SPACE){ R[Y].SW=ON; continue; }
         R[Y].AMT[0]=R[Y].AMT[1]=0f;
         sw=ON;   /* for addtion  */
         for(j=0; j<43 && R[Y].FMT[j]; )
         {  i=SearchChar(R,R[Y].FMT[j]);
            if(i < 0){ sprintf(BufS,"[%s]無<%c>計算記號",R[Y].FMT,R[Y].FMT[j]);  UWait(ON,BufS);  return OFF; }
            if(R[i].SW==OFF){ co=ON; R[Y].SW=OFF; break; }  /*尚未計算*/
            if(sw){ R[Y].AMT[0]+=R[i].AMT[0];  R[Y].AMT[1]+=R[i].AMT[1]; }
            else  { R[Y].AMT[0]-=R[i].AMT[0];  R[Y].AMT[1]-=R[i].AMT[1]; }
            j++;
            if(R[Y].FMT[j]<=SPACE){ R[Y].SW=ON; break;}  /*空白表此此列已計算結束*/
            if(R[Y].FMT[j]=='+') sw=ON;
            else if(R[Y].FMT[j]=='-') sw=OFF;
            else { sprintf(BufS,"[%s]計算公式錯誤",R[Y].FMT); UWait(ON,BufS);  return OFF; }
            j++;
            R[Y].SW=ON; /*表式Y項完成計算*/
         }
      }
   }
   return ON;
}
/*===========================================================================*/
int SearchChar(FSACR063_T *R,char C)
{   int i;
    for(i=0; i<ANO; i++) if(C==R[i].C) return i;
    return -1;
}
/*===========================================================================*/
void SetLoss()    /*掃瞄損益表,找出"本期損益"的欄位,並將值設給Lamt中*/
{   int    i,r1;
    char  *p1;

    r1=-1;
    for(i=0; i<ANO; i++)
    {   p1=R063A[i].ACN;
        if(strstr(p1,"本") && strstr(p1,"期") && strstr(p1,"損") && strstr(p1,"益")) r1=i;
    }
    if(r1<0) UFatal("損益表中無      本期損益");
    Lamt = R063A[r1].AMT[0];
}
/*===========================================================================*/
void CalLamt()   /*83/84,查84才會執行,即Sa>=13,以損益表的本期損益轉到累積盈虧*/
{   FILE   *fp;

    Ugd_Open("本期損益計算中....");
    memset(R063A,NULL,sizeof(R063A));
    if((fp=fopen("R063","rb"))!=NULL)       /*讀入損益表各項*/
    {   for(I=0; I<ANO; I++)
            if(fread(&R063A[I],1,sizeof(FSACR063_T),fp) < 1) break;
        fclose(fp);
    }
    /*---------計算去年1-12月本期損益----------------*/
    lseek(ACF001K->ffd,0L,SEEK_SET);
    READ1(ACF001)
    {   memcpy(&ACF001,p,sizeof(ACF001));
        if(ACF001.DC=='D'){ A=0; B=1; }        /*借別,差額=借-貸*/
        else              { A=1; B=0; }        /*貸別,差額=貸-借*/
        Pass1();          /*若主檔的科目有在損益表中,則求出左1..12月的金額*/
    }
    READ2
    Pass3(R063A);  /*依R063A[].FMT計算公式到R063A.AMT0,R063A[].AMT1找相對的值*/
    SetLoss();     /*掃瞄損益表,找出"本期損益"的欄位,並將值設給Lamt中*/
    Ugd_Close();
}
/*================================================================*/
char *ChainYn()
{  switch(Yn)
   {  case 'Y': return "列印";
      case 'N': return "不印";
      default : return "    ";
   }
}
原始檔-結束

Byron Wey  Oct.21.1998


回首頁C之城