印 損益─資產負債表

wpe14.jpg (60824 bytes)

資產負債表
wpe15.jpg (13260 bytes)

損益表範圍
wpe16.jpg (5480 bytes)

資產負債表範圍
wpe17.jpg (5529 bytes)


原始程式

原始檔-起始
/*---------( FSACR068.C )----------*/
#include    "W_FSAC.H"
#define SX  20            /*左內框                             */
#define SY  10            /*上內框                             */
#define SC  34            /*內框寬, 多少行                     */
#define      ANO   160  /*ARRAY  陣列筆數*/

void SetRat(FSACR063_T *R,int i,char *s1,char *s2);
void ShowLast();
void ReadR0638();
void AddR063A(int i);   /*年結制,計算本期損益,供資產負債表用*/
void AddR063B(int i);   /*月結制,計算本期損益,供資產負債表用*/
void Pass1();
void Pass2();
int  Pass3(FSACR063_T *R);
int  SearchChar(FSACR063_T *R,char C);
int  SetLoss();     /*計算本期損益值,並將值設到R068A中*/
void ShowHead();
void ShowData();
char *ChainKi(char ki);
char *ChainKs(char ks);
/*================================================================*/
FSACF001_T   ACF001;
FSACR063_T   R063A[ANO],R063B[ANO]; /* 損益表,B專責算上年度損益,要轉入累積盈虧*/
FSACR063_T   R068A[ANO];            /* 資產負債表 */
FSACR063_T  *Pr;
DATE         St,Et,Sd,Ed;
double       Sum[2];
int          Lin,A,B;
char         Ki,Ks;
char        *Table="\
                                  \
         損益─資產負債表         \
 ================================ \
 列印表別: ------------           \
 ----------------------------     \
 ----------------------------     \
                                  \
 資料輸出裝置:--------           \
                                  ";
/*===========================================================================*/
void main()
{  USetBXYN(Table,SX,SY,SC);
   OPEN_ACF001;  NamS=GET_NAME;
   ReadR0638();
   while(1)
   {  Ki='1'; Ks='A';
      memset(&Sd,NULL,sizeof(Sd));  memset(&Ed,NULL,sizeof(Ed));
      memset(&St,NULL,sizeof(St));  memset(&Et,NULL,sizeof(Et));
      #include <RPT1.H>
      if(Field==1)
      {  UReadTog(BXN(1),&Ki,V_TOG,"12",ChainKi('1'),ChainKi('2'));
         UShowSL(BXN(1),ChainKi(Ki),V_WUSR);
         switch(Ki)
         {  case '1':UShowSL(BXN(2),"起始:         起始:",V_W_IN);
                     UShowSL(BXN(3),"截止:         截止:",V_W_IN);
                     UShowM(BX[2]+6 ,BY[2],5, St,V_WUSR);
                     UShowM(BX[3]+6 ,BY[3],5, Et,V_WUSR);
                     UShowM(BX[2]+21,BY[2],5, Sd,V_WUSR);
                     UShowM(BX[3]+21,BY[3],5, Ed,V_WUSR);
                     break;
            case '2':UShowSL(BXN(2),"月份:",V_W_IN);
                     UShowSL(BXN(3),"累積盈虧採用方式:",V_W_IN);
                     UShowM( BX[2]+6 ,BY[2],5, Sday,V_WUSR);
                     UShowSL(BX[3]+18,BY[3],8,ChainKs(Ks),V_WUSR);
                     break;
         }
      }
      switch(Ki)
      {  case '1':switch(Field)
                  {  case 2: UReadM(BX[2]+6,BY[2],5,&St,0,V_WUSR,V_READ);  break;
                     case 3: UReadM(BX[3]+6,BY[3],5,&Et,0,V_WUSR,V_READ);  break;
                     case 4: UReadM(BX[2]+21,BY[2],5,&Sd,0,V_WUSR,V_READ); break;
                     case 5: UReadM(BX[3]+21,BY[3],5,&Ed,0,V_WUSR,V_READ); break;
                  }
                  break;
         case '2':switch(Field)
                  {  case 2: UReadM(BX[2]+6,BY[2],5,&Sday,0,V_WUSR,V_READ); break;
                     case 3: UReadTog(BX[3]+18,BY[3],8,&Ks,V_TOG,"AB",ChainKs('A'),ChainKs('B'));
                             UShowSL(BX[3]+18,BY[3],8,ChainKs(Ks),V_WUSR);  break;
                  }
                  break;
      }
      #include <RPT2.H>  /*條件設定完畢*/
     /*------------------------------------------------------------------*/
      if(Ki=='2')                    /*2資產負債表*/
      {   Sa=ChkYM(Sday,ON);   Sm=Sday.Y*12+Sday.M;   /*Sa對應的陣列月份(1..24),Sm年轉總月數(85*12+(1..12))*/
          if(Sa==0) continue;
      }
      else
      {   if(ChkYM(St,ON)==0) continue;
          if(ChkYM(Et,ON)==0) continue;
          if(ChkYM(Sd,ON)==0) continue;
          if(ChkYM(Ed,ON)==0) continue;
      }
      Ugd_Open("檔 案 處 理 中 請 稍 候 ....."); /* Sort  FSACF011 */
      for(I=0; I<ANO; I++)  /*陣列歸0*/
      {   R063A[I].AMT[0]=R063A[I].AMT[1]=0 ;    R063A[I].SW=OFF;
          R063B[I].AMT[0]=R063B[I].AMT[1]=0 ;    R063B[I].SW=OFF;
          R068A[I].AMT[0]=R068A[I].AMT[1]=0 ;    R068A[I].SW=OFF;
      }
     /*------------------------------------------------------------------*/
      READ1(ACF001)                     /*遂筆讀入會計科目,計算金額*/
      {   memcpy(&ACF001,p,sizeof(ACF001));
          if(ACF001.DC=='D'){ A=0; B=1; }     /*D=0借 - 1貸*/
          else              { A=1; B=0; }     /*C=1貸 - 0借*/
          Pass1();                    /*公式中科目加總,損益表,資產負債表均用*/
          if(Ki!='1') Pass2();        /*2資產負債表用*/
      }
      READ2
      Pass3(R063A);
      Pass3(R063B);
      if(Ki!='1')                     /*2資產負債表用*/
      {   if(SetLoss()==OFF) continue;
          Pass3(R068A);
      }
      Ugd_Close();
     /*------------------------------------------------------------------*/
      Ugd_Open("列印中           Ctr_F7:結束列印");
      if(Ki=='1') Pr=R063A;  else Pr=R068A;
      for(Lin=ANO-1; Lin>=0; Lin--)
          if(strlen((Pr+Lin)->ACN)>0) break;      /*找最後一列*/
      for(I=0; I<=Lin; I++)
      {   ShowData();
          if(Psf=='S' && K0>=20){ ShowLast(); UWait(OFF,"Esc:重新選擇      任一鍵繼續"); UCls(); K0=0; }
          if(Psf=='P' && K0>=K1-2){ ShowLast(); fprintf(Stream,"%c",12); K0=0; }
      }
      ShowLast(); LineReturn(ON);
   }
}
/*===========================================================================*/
void ShowHead()
{   char  s[2][24];

    if(Ki!='1') goto KI2;
#ifdef   HP-5L          /*1998/8/27*/
   LockItemHead(1,"~I",NamS,"~Z2W1L0G2X16");
#else
   LockItemHead(1,"~IZ2L0G2",NamS,"~Z1");
#endif
   if(St.M!=Et.M) sprintf(s[0],"%02d.%02d─%02d",St.Y,St.M,Et.M);
   else           sprintf(s[0],"    %02d.%02d",St.Y,St.M);
   if(Sd.M!=Ed.M) sprintf(s[1],"%02d.%02d─%02d",Sd.Y,Sd.M,Ed.M);
   else           sprintf(s[1],"    %02d.%02d",Sd.Y,Sd.M);
   UPrint("                                 ★☆★☆★    損  益  表    ★☆★☆★                   (%I) 列印:%M------  ",P0,Day);
   UPrint("┌───────────┬───────┬───────┬───┬─┬───────┬───────┬───┐");
   UPrint("│     會 計 科 目      │%S------- 小計│%S------- 合計│百分比│  │%S------- 小計│%S------- 合計│百分比│",s[0],s[0],s[1],s[1]);  if(Psf=='V')
   UPrint("│----------------------│--------------│--------------│------│  │--------------│--------------│------│");
   return;
  KI2:
#ifdef   HP-5L          /*1998/8/27*/
   LockItemHead(1,"~I",NamS,"~Z2W1L0G2X16");
#else
   LockItemHead(1,"~IZ2L0G2",NamS,"~Z1");
#endif
   Eday=Sday;  Eday.M--;
   if(Eday.M==0){ Eday.Y--; Eday.M=12; }
   UPrint("                                 ★☆★☆★    資  產  負  債  表    ★☆★☆★                  (%I) 列印:%M------ ",P0,Day);
   UPrint("┌───────────┬──────┬──────┬───┬─┬──────┬──────┬───┬──────┐");
   UPrint("│     會 計 科 目      │  %M--- 小計│  %M--- 合計│百分比│  │  %M--- 小計│  %M--- 合計│百分比│      月變動│",Sday,Sday,Eday,Eday);   if(Psf=='V')
   UPrint("│----------------------│------------│------------│------│  │------------│------------│------│------------│");
}
/*===========================================================================*/
void SetRat(FSACR063_T *R,int i,char *s1,char *s2)
{   int   j;

    *s1 = *s2 = NULL;
    if(R[i].M<=SPACE) return;
    if((j=SearchChar(R,R[i].M)) <0) return;
    if(R[j].AMT[0]!=0) sprintf(s1,"%6.2f,",R[i].AMT[0]/R[j].AMT[0]*100);
    if(R[j].AMT[1]!=0) sprintf(s2,"%6.2f,",R[i].AMT[1]/R[j].AMT[1]*100);
}
/*===========================================================================*/
void ShowData()
{   float   rat[2];
    char    s[2][16];
    int     sw=OFF,j;

    if(R063A[I].AC[0][0]<=SPACE && R063A[I].AC[1][0]<=SPACE) sw=ON;
    if(R063A[I].AC[0][0]>SPACE  && R063A[I].AC[1][0]>SPACE) sw=ON;
    if(Ki!='1') goto KI2;
                UPrint("├───────────┼───────┼───────┼───┤  ├───────┼───────┼───┤");
    if(sw) strcpy(BufS,"│%S--------------------│              │%f,-----------│%S----│  │              │%f,-----------│%S----│");
    else   strcpy(BufS,"│%S--------------------│%f,-----------│              │%S----│  │%f,-----------│              │%S----│");
    SetRat(R063A,I,s[0],s[1]);
    UPrint(BufS,R063A[I].ACN,R063A[I].AMT[0],s[0],R063A[I].AMT[1],s[1]);
    return;
  KI2: /*-------------資產負債表--------------------------------------------*/
    sw=OFF;
    if(R068A[I].AC[0][0]<=SPACE && R068A[I].AC[1][0]<=SPACE) sw=ON;
    if(R068A[I].AC[0][0]>SPACE  && R068A[I].AC[1][0]>SPACE) sw=ON;

    if(strstr(R068A[I].ACN,"備抵折舊")==NULL && strstr(R068A[I].ACN,"累計折舊")==NULL)
    {   Sum[0]=Sum[1]=0f;
        SetRat(R068A,I,s[0],s[1]);
    }
    else
    {   Sum[0]=R068A[I].AMT[0]+R068A[I-1].AMT[0];
        Sum[1]=R068A[I].AMT[1]+R068A[I-1].AMT[1];
        s[0][0]=s[1][0]=NULL;
        j=SearchChar(R068A,R068A[I].M);
        if(j>=0)        /*算固定資產比率*/
        {   if(R068A[j].AMT[0]!=0f) sprintf(s[0],"%6.2f,",Sum[0]/R068A[j].AMT[0]*100);
            if(R068A[j].AMT[1]!=0f) sprintf(s[1],"%6.2f,",Sum[1]/R068A[j].AMT[1]*100);
        }
    }
/*  if(Psf=='P' && strstr(R068A[I].ACN,"流動負債")){ ShowLast(); fprintf(Stream,"%c",12); K0=0; }      帳戶式*/
           UPrint("├───────────┼──────┼──────┼───┤  ├──────┼──────┼───┼──────┤");
    if(sw) UPrint("│%S--------------------│            │%f,---------│%S----│  │            │%f,---------│%S----│%f,---------│",R068A[I].ACN,R068A[I].AMT[0],s[0],R068A[I].AMT[1],s[1],R068A[I].AMT[0]-R068A[I].AMT[1]);
    else   UPrint("│%S--------------------│%f,---------│%f,---------│%S----│  │%f,---------│%f,---------│%S----│%f,---------│",R068A[I].ACN,R068A[I].AMT[0],Sum[0],s[0],R068A[I].AMT[1],Sum[1],s[1],R068A[I].AMT[0]-R068A[I].AMT[1]);
}
/*===========================================================================*/
void ShowLast()
{
    if(Ki=='1')
    {   UPrint("└───────────┴───────┴───────┴───┴─┴───────┴───────┴───┘");
        UPrint(" 總經理:                     主管:                      出納:                     會計:                       ");
    }
    else
    {   UPrint("└───────────┴──────┴──────┴───┴─┴──────┴──────┴───┴──────┘");
        UPrint(" 總經理:                        主管:                          出納:                     會計:                      ");
    }
}
/*===========================================================================*/
void ReadR0638()
{
    if((Stream=fopen("R063","rb"))!=NULL)
    {   for(I=0; I<ANO; I++)
        {   if(fread(&R063A[I],1,sizeof(FSACR063_T),Stream) < 1) break;
            memcpy(&R063B[I],&R063A[I],sizeof(FSACR063_T));
        }
        fclose(Stream);
    }
    if((Stream=fopen("R068","rb"))!=NULL)
    {   for(I=0; I<ANO; I++)
            if(fread(&R068A[I],1,sizeof(FSACR063_T),Stream) < 1) break;
        fclose(Stream);
    }
}
/*===========================================================================*/
void AddR063A(int i)   /*年結制,計算本期損益,供資產負債表用*/
{   int   j;

    for(j=1; j<Sa; j++)        /*累計到上個月*/
    {   if(j<=12 && Sa>12)     /*累計上年度*/
        {   R063B[i].AMT[0]+=ACF001.AMT[A][j]-ACF001.AMT[B][j]; /*本月合計*/
            R063B[i].AMT[1]+=ACF001.AMT[A][j]-ACF001.AMT[B][j]; /*上月合計*/
        }
        else                   /*累計本年度*/
        {   R063A[i].AMT[0]+=ACF001.AMT[A][j]-ACF001.AMT[B][j]; /*本月合計*/
            R063A[i].AMT[1]+=ACF001.AMT[A][j]-ACF001.AMT[B][j]; /*上月合計*/
        }
    }
    R063A[i].AMT[0] += ACF001.AMT[A][Sa]-ACF001.AMT[B][Sa]; /*再加上本月*/
}
/*===========================================================================*/
void AddR063B(int i)   /*月結制,計算本期損益,供資產負債表用*/
{   int   j;

    for(j=1; j<Sa; j++)
    {   R063B[i].AMT[0]+=ACF001.AMT[A][j]-ACF001.AMT[B][j]; /*本月合計*/
        R063B[i].AMT[1]+=ACF001.AMT[A][j]-ACF001.AMT[B][j]; /*上月合計*/
    }
    R063A[i].AMT[0] += ACF001.AMT[A][Sa]-ACF001.AMT[B][Sa]; /*再加上本月*/
}
/*===========================================================================*/
void Pass1()          /*公式中科目加總,損益表,資產負債表均用*/
{   int   i,j,s,e;

    for(i=0; i<ANO; i++)
    {   if(R063A[i].AC[1][0]>SPACE) Str=R063A[i].AC[1];   /*有終止科目號,則使用1結止科目編號*/
        else                        Str=R063A[i].AC[0];   /*否則使用 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;  /*總,明*/
        if(Ki=='1')  /*損益表*/
        {   s=ChkYM(St,OFF);   e=ChkYM(Et,OFF);     /*前半部  D=借-貸, C=貸-借*/
            for(j=s; j<=e; j++) R063A[i].AMT[0]+=ACF001.AMT[A][j]-ACF001.AMT[B][j];
                                          /* 0本月,1(資)上月.(損)累計*/
            s=ChkYM(Sd,OFF);   e=ChkYM(Ed,OFF);     /*後半部  D=借-貸, C=貸-借*/
            for(j=s; j<=e; j++) R063A[i].AMT[1]+=ACF001.AMT[A][j]-ACF001.AMT[B][j];
        }  /*資產負債表*/
        else if(Ks=='A') AddR063A(i); /*年結制,計算本期損益,供資產負債表用*/
        else if(Ks=='B') AddR063B(i); /*月結制                            */
    }
}
/*===========================================================================*/
void Pass2()
{   int   i,j,m;

    for(i=0; i<ANO; i++)
    {   if(R068A[i].AC[1][0]>SPACE) Str=R068A[i].AC[1];   /*有終止科目號,則使用1結止科目編號*/
        else                        Str=R068A[i].AC[0];   /*否則使用 0起始科目編號*/
        if(memcmp(ACF001.KEY,R068A[i].AC[0],7)<0) continue;    /*小於起始科號*/
        if(memcmp(Str,ACF001.KEY,7)<0) continue;               /*大於終止科號*/
        /*判斷總分類帳與總分類帳相加*/
        if(ACF001.KEY[4]> SPACE && R068A[i].AC[0][4]<=SPACE) continue;
        if(ACF001.KEY[4]<=SPACE && R068A[i].AC[0][4] >SPACE) continue;
        /*合計資產負債底稿本月,及上月金額*/
        if(ACF001.KEY[0]=='Z')      /*若為Z則不抓累計餘額,僅使用當月餘額*/
        {   R068A[i].AMT[1]+=ACF001.AMT[A][Sa-1]-ACF001.AMT[B][Sa-1];
            R068A[i].AMT[0]+=ACF001.AMT[A][Sa]-ACF001.AMT[B][Sa];
        }
        else
        {   for(j=0; j<Sa; j++)     /*累計至上月*/
            {   R068A[i].AMT[0]+=ACF001.AMT[A][j]-ACF001.AMT[B][j];
                R068A[i].AMT[1]+=ACF001.AMT[A][j]-ACF001.AMT[B][j];
            }
            R068A[i].AMT[0]+=ACF001.AMT[A][Sa]-ACF001.AMT[B][Sa];
        }
    }
}
/*===========================================================================*/
/*依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=ON表必需再重頭計算*/
   {  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;                       /*有公式,先歸0*/
         sw=ON;   /* for addtion  */
         for(j=0; j<FMT_L && R[Y].FMT[j]; )       /*j=公式中的遂字符號*/
         {  i=SearchChar(R,R[Y].FMT[j]);         /*i=符號表中符號位置*/
            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; }  /*尚有未計算者,co=ON必需再重頭計算*/
            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;
}
/*===========================================================================*/
int SetLoss()    /*計算本期損益值,並將值設到R068A中*/
{   int    i,r1,r2,r3;
    char  *p1,*p2,*p3;

    r1=r2=r3=-1;
    for(i=0; i<ANO; i++)
    {   p1=R063A[i].ACN;
        p2=R068A[i].ACN;
        p3=R068A[i].ACN;
        if(strstr(p1,"本") && strstr(p1,"期") && strstr(p1,"損") && strstr(p1,"益")) r1=i;
        if(strstr(p2,"本") && strstr(p2,"期") && strstr(p2,"損") && strstr(p2,"益")) r2=i;
        if(strstr(p3,"累") && strstr(p3,"積") && strstr(p3,"盈") && strstr(p3,"虧")) r3=i;
    }
    if(r1<0){ UWait(ON,"損益表中無      本期損益");  return OFF; }
    if(r2<0){ UWait(ON,"資產負債表中無  本期損益");  return OFF; }
    if(r3<0){ UWait(ON,"資產負債表中無  累積盈虧");  return OFF; }
    R068A[r2].AMT[0]=R063A[r1].AMT[0];
    R068A[r2].AMT[1]=R063A[r1].AMT[1];

    R068A[r3].AMT[0]+=R063B[r1].AMT[0];   /*加上年度本期損益到累積盈虧*/
    R068A[r3].AMT[1]+=R063B[r1].AMT[1];

    R068A[r2].SW=ON;
    return ON;
}
/*================================================================*/
char *ChainKi(char ki)
{  switch(ki)
   {  case '1': return "損益表";
      case '2': return "資產負債表";
      default : return " ";
   }
}
/*================================================================*/
char *ChainKs(char ks)
{  switch(ks)
   {  case 'A': return "年結制";
      case 'B': return "月結制";
      default : return " ";
   }
}
原始檔-結束

Byron Wey  Oct.21.1998


回首頁C之城