年 度 結 轉

wpe4F.jpg (37810 bytes)


原始程式

原始檔-起始
/*---------( FSACPYYY.C )-----年度結帳-----*/
#include    "W_FSAC.H"

#define      ANO   120  /*ARRAY  陣列筆數*/
void CalLamt();   /*將損益表的"本期損益"轉到Lamt*/
/*===========================================================================*/
FSACF001_T   ACF001,F001;
FSACR063_T   R063A[ANO];
double       Lamt;     /*83/84,查84時,則掃瞄83損益表,找出"本期損益"的欄位,並將值設給Lamt中*/
int          A,B;
char   Yn;
/*===========================================================================*/
void main()
{
   UCls();   GET_NAME;
   Ugd_Open("Esc:放棄        F7:執行");   gotoxy(1,6);
   printf("  1: 目前會計年度為 %d 及 %d  \n\n",SysY,SysY+1);
   printf("  2: 執行 <年度結帳> 後會計年度將會調整為 %d 及 %d \n\n",SysY+1,SysY+2);
   printf("  3: 建議你在執行前先做好資料備份工作.並在磁片上註明 (%d) 年度\n\n",SysY);
   printf("  4: 年度結帳後.將會把各虛科目[4字頭以上(含)]的餘額歸0,\n");
   printf("                         ^^^^^^                     \n");
   printf("                 且會將 本期損益 累計到 累積盈虧    \n");
   printf("                        ^^^^^^^^        ^^^^^^^^  \n\n");
   printf("  5: 若確定要執行 .請按 F7 %c%c",7,7);
   do
   {  UReadC(27,17,1,&Yn,"",V_SHOW,V_READ);
      if(RetKey==ESC) exit(0);
   }while(RetKey!=F7);
   gotoxy(1,19);
   printf(" *: 你是否確定要執行(Y/N): N");
   UReadC(29,19,1,&Yn,"YN",V_SHOW,V_WARNING);
   if(Yn=='N') exit(0);
   Ugd_Open("<年度結帳> 處理中.請稍後....");
   OPEN_ACF001;
   CalLamt();     /*要先算出,避免迴圈中錯誤,求出左半部年度的"本期損益",存在Lamt中*/
   for(L=0L; ; L++)
   {  lseek(ACF001K->ffd,L*sizeof(F001),SEEK_SET);
      if(read(ACF001K->ffd,&F001,sizeof(F001)) < 1) break;
      if(memcmp(F001.KEY,"3250   ",7)==0)          /*累積盈虧(貸)*/
         { F001.AMT[1][0] += Lamt; }               /*累加到"累積盈虧"(貸)*/
      else                                         /*一般科目*/
      {  for(I=1; I<=12; I++)                      /*移轉十二個月*/
         {  if(F001.KEY[0] <= '3')                 /*實科目*/
            {  F001.AMT[0][0] += F001.AMT[0][I];   /*0=借方,0=上期結轉*/
               F001.AMT[1][0] += F001.AMT[1][I];   /*1=貸方,0=上期結轉*/
            }
            else                                   /*虛科目*/
            {  F001.AMT[0][0]=F001.AMT[1][0]=0;       /*虛科目,借,貸均歸0*/
            }

            F001.AMT[0][I] = F001.AMT[0][I+12];    /*移往前一年*/
            F001.AMT[1][I] = F001.AMT[1][I+12];

            F001.AMT[0][I+12]=F001.AMT[1][I+12]=0; /*歸0*/
         }
      }
      if(F001.AMT[0][0] > F001.AMT[1][0])       /*借方上期結轉 > 貸方上期結轉*/
      {  F001.AMT[0][0] -= F001.AMT[1][0];      /*借方留下差額*/
         F001.AMT[1][0]=0;                      /*貸方歸0*/
      }
      else
      {  F001.AMT[1][0] -= F001.AMT[0][0];      /*貸方留下差額*/
         F001.AMT[0][0]=0;                      /*借方歸0*/
      }
      lseek(ACF001K->ffd,L*sizeof(F001),SEEK_SET);
      write(ACF001K->ffd,&F001,sizeof(F001));
   }
   Stream=fopen("FSACYY","w+");
   fprintf(Stream,"%d",SysY+1);
   fclose(Stream);
}
/*===========================================================================*/
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;
    long   L;     /*READ1用,避免與外面衝突*/

    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();
}
原始檔-結束

Byron Wey  Oct.21.1998


回首頁C之城