年 度 結 轉
原始程式
原始檔-起始 /*---------( 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