年 度 結 轉

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