總 科 目 試 算 表

範圍選擇 |
列印明細 |
左右捲動 |
原始程式
原始檔-起始
/*---------( 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