印 損益─資產負債表

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