印 損益─資產負債表
資產負債表 |
損益表範圍 |
資產負債表範圍 |
原始程式
原始檔-起始 /*---------( 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