總 科 目 試 算 表
範圍選擇 |
列印明細 |
左右捲動 |
原始程式
原始檔-起始 /*---------( FSACR062.C )---------*/ #include "W_FSAC.H" #define SX 20 /*左內框 */ #define SY 10 /*上內框 */ #define SC 34 /*內框寬, 多少行 */ /*-----------------------------------------------------------------*/ #define PrHEAD UPrint("#月份: %M--- 列印日期:%M------ 第 %I 頁 ",Sday,Day,P0); \ UPrint("======================================================================================================================="); \ UPrint("科目號 科 目 名 稱 本月借方 筆數 本月貸方 筆數 本月餘額 借方累計 貸方累計 DC 總餘額"); \ UPrint("------- -------------------- ----------- ---- ----------- ---- ----------- ------------- ------------- -- -------------"); #define PrSTYLE "%S----- %S------------------ %F,-------- %I-- %F,-------- %I-- %F,-------- %F,---------- %F,---------- %S %F,----------" #define PrSPILT UPrint("======================================================================================================================="); #define PrNULL #define PrSUMUP #define PrSumS " (合計) %F,-------- %I-- %F,-------- %I-- %F,-------- %F,---------- %F,---------- %S %F,----------" #define PrSumD Sum[0],NO0,Sum[1],NO1,amt,Sum[2],Sum[3],s[1],Sum[2]-Sum[3] #define PrNEXT #define PrEND UPrint(" 總經理: 主管: 出納: 會計: "); #define PrSTR1 UPrint(" 補去年度(銷貨成本) %F,---------- 借 %F,----------",csum,csum); #define PrDATA ACF001.KEY,ACF001.ACN,ACF001.AMT[0][Sa],ACF001.DC_NO[0][Sa],ACF001.AMT[1][Sa],ACF001.DC_NO[1][Sa],amt,dsum,csum,s[1],dsum-csum /*-----------------------------------------------------------------*/ #define ANO 120 /*ARRAY 陣列筆數*/ void EndPage(int sw); void ShowLast(); void ShowHead(); void ShowData(); char *ChainYn(); void Pass1(); int Pass3(FSACR063_T *R); int SearchChar(FSACR063_T *R,char C); void SetLoss(); /*計算本期損益值,並將值設到Rest中*/ void CalLamt(); /*================================================================*/ FSACF001_T ACF001; FSACR063_T R063A[ANO]; double Rest; /*去年收入及費用,即跨年度(83/84,而查84),83虛科目總餘額Rest=83總虛貸-83總虛借*/ double Lamt; /*83/84,查84時,則掃瞄83損益表,找出"本期損益"的欄位,並將值設給Lamt中*/ double Sum[10]; char Yn; int NO0, NO1; int A,B; char *Table="\ \ 總 科 目 試 算 表 \ ================================ \ 列印月份: ----- \ 明細科目: ------ \ \ 資料輸出裝置:-------- \ "; /*===========================================================================*/ void main() { USetBXYN(Table,SX,SY,SC); OPEN_ACF001; NamS=GET_NAME; while(1) { Yn='N'; #include <RPT1.H> if(Field==1) UReadM(BXN(1),&Sday,0,V_WUSR,V_READ); if(Field==2){ UReadTog(BXN(2),&Yn,V_TOG,"YN","列印","不印"); UShowSL( BXN(2),ChainYn(),V_WUSR); } #include <RPT2.H> /*條件設定完畢*/ /*------------------------------------------------------------------*/ if(Sday.D<1) Sa=0; /*僅列印上期結轉*/ if(Sday.Y==SysY-1 && Sday.M==12) Sa=0; /*特:去年12月,則僅列印上期結轉,可用來查開帳功能*/ else if((Sa=ChkYM(Sday,ON))==0) continue; /*本年月數 or 下年月數*/ Sp=Usp_Open(); Rest=Lamt=0f; NO0=NO1=0; if(Sa>=13) CalLamt(); /*以損益表的本期損益轉到累積盈虧,即求得Lamt*/ /*------------------------------------------------------------------*/ Ugd_Open("檔 案 處 理 中 請 稍 候 ....."); /* Sort FSACF011 */ READ1(ACF001) { if(p->KEY[4]>SPACE && Yn=='N') continue; /*總科目或要印明細科目,才會往下做*/ if(p->KEY[0]=='Z') continue; /*期初存貨(虛科目)*/ Usp_InsIp(Sp,p->KEY,L); /*科目號收集到Sp*/ if(Sa<13) continue; /*83/84,查83,未跨年度,不用管Rest*/ if(p->KEY[0]<='3') continue; /*跨年度,累加虛科目Rest金額*/ for(I=0; I<13; I++) Rest += p->AMT[1][I] - p->AMT[0][I]; /*83虛科目總餘額=83貸-83借*/ } READ2 Ugd_Close(); /*------------------------------------------------------------------*/ Ugd_Open("列印中 Ctr_F7:結束列印"); while(RetKey!=ESC) { if(Usp_GetIp(Sp,&L)==OFF) break; lseek(ACF001K->ffd,L*sizeof(ACF001),SEEK_SET); read(ACF001K->ffd,&ACF001,sizeof(ACF001)); ShowData(); if(Psf=='S' && K0>=20){ UWait(OFF,"Esc:重新選擇 任一鍵繼續"); UCls(); K0=0; } if(Psf=='P' && K0>=K1){ EndPage(ON); fprintf(Stream,"%c",12); K0=0; } } ShowLast(); EndPage(OFF); Usp_Close(Sp); LineReturn(ON); } } /*===========================================================================*/ void ShowHead() { int y,m; #ifdef HP-5L /*1998/8/27*/ LockItemHead(2,"~I",NamS,"~Z2W1X16"); #else LockItemHead(2,"~IZ2L10G2X1",NamS,"~Z1"); #endif PrHEAD /*列印標頭*/ } /*===========================================================================*/ void ShowData() { int m; double amt,dsum=0f,csum=0f; /*單列,本月餘額,借方累計,c貨方累計*/ char s[2][3]; if(Sa>=13 && ACF001.KEY[0]>='4') m=13; /*跨年度 & 虛科目*/ else m=0; /*0=結轉金額*/ for(; m<=Sa; m++){ dsum+=ACF001.AMT[0][m]; csum+=ACF001.AMT[1][m]; } if(ACF001.KEY[4]==SPACE) /* 由總科目即可算出總額*/ { NO0 += ACF001.DC_NO[0][Sa]; /* 本月借方筆數合計 */ NO1 += ACF001.DC_NO[1][Sa]; /* 本月貸方筆數合計 */ Sum[0] += ACF001.AMT[0][Sa]; /* 總本月借方 */ Sum[1] += ACF001.AMT[1][Sa]; /* 總本月貸方 */ Sum[2] += dsum; /* 總借方累計 */ if(memcmp(ACF001.KEY,"3250 ",7)==0) csum+=Lamt; /*83/84,如科目為84累積盈虧(貸),則將左83Lamt"本期損益",加到貸方*/ Sum[3] += csum; /* 總貸方累計 */ } if(dsum==0f && csum==0f) return; /*至本月均無交易*/ amt=ACF001.AMT[0][Sa]-ACF001.AMT[1][Sa]; /*本月餘額=借-貸*/ if(ACF001.AMT[0][Sa]>ACF001.AMT[1][Sa]) strcpy(s[0],"借"); else strcpy(s[0],"貸"); if(dsum > csum) strcpy(s[1],"借"); else strcpy(s[1],"貸"); UPrint(PrSTYLE,PrDATA); if(memcmp(ACF001.KEY,"3250 ",7)==0 && Sa>=13) /*累積盈虧&跨年度*/ { csum=Rest-Lamt; /*83/84,查84時,則84補去年度(銷貨成本)=83(1..12月)虛科目總額-83本期損益*/ Sum[2] -= csum; /*總借方累計 淢掉本筆補去年度(銷貨成本),才會平*/ PrSTR1 /*補去年度(銷貨成本)*/ } } /*===========================================================================*/ void EndPage(int sw) { if(sw) PrSPILT PrEND } /*===========================================================================*/ void ShowLast() { char s[2][3]; double amt=Sum[0]-Sum[1]; memset(s,NULL,sizeof(s)); K0=1; if(Sum[0] > Sum[1]) strcpy(s[0],"借"); if(Sum[0] < Sum[1]) strcpy(s[0],"貸"); if(Sum[2] > Sum[3]) strcpy(s[1],"借"); if(Sum[2] < Sum[3]) strcpy(s[1],"貸"); PrSPILT UPrint(PrSumS,PrSumD); /*合計*/ UPrint(" "); memset(Sum,NULL,sizeof(Sum)); } /*===========================================================================*/ 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; 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(); } /*================================================================*/ char *ChainYn() { switch(Yn) { case 'Y': return "列印"; case 'N': return "不印"; default : return " "; } } 原始檔-結束
Byron Wey Oct.21.1998