傳 票 過 帳
原始程式
原始檔-起始 /*---------( FSACP041.C )----過帳-----*/ #include "W_FSAC.H" #define SX 28 /*左內框 */ #define SY 6 /*上內框 */ #define SC 28 /*內框寬, 多少行 */ void PassWork(FSACF011_T *p); void SumAmt(); /*依Mn月份,計算該月分傳票檔中的金額,筆數*/ void SetAmt(); /*將WORK計算的金額,筆數拷貝至科目主檔中*/ void SetTx(); void ChkACF011(FSACF011_T *p); /*檢查該分錄各項是否合理*/ /*================================================================*/ struct { char KEY[8]; double AMT[2]; /*金額*/ int WNO[2]; /*筆數*/ } WORK; FSACF001_T ACF001; FSACF011_T ACF011; int A; /*ACF001.AMT 相對的陣列*/ int Mn; /*月份 */ char *Table="\ \ 傳 票 過 帳 \ ========================== \ 過帳起始月份: ----- \ 過帳結止月份: ----- \ \ F7:確定要過帳, Esc:放棄 \ "; /*===========================================================================*/ void main() { USetBXYN(Table,SX,SY,SC); UDrawBox( SX-2, SY-1, SX+SC+1, SY+SR+1, V_WBOX, V_W_IN, YES, 3); UShowTable( SX, SY, SX+SC-1, SY+SR, Table, V_W_IN); GET_NAME; do { if(Field==1){ UReadM(BXN(1),&Sday,0,V_WUSR,V_READ); ChkYM(Sday,ON); } if(Field==2){ UReadM(BXN(2),&Eday,0,V_WUSR,V_READ); ChkYM(Eday,ON); } switch(RetKey) { case LEFT : case UP : if(--Field<1) Field=4; break; case RIGHT: case DOWN: if(++Field>4) Field=1; break; case ESC : exit(0); } }while(RetKey!=F7); Sa=ChkYM(Sday,ON); Sm=Sday.Y*12+Sday.M; /*Sa=1..24, Sm=年*12+月*/ Ea=ChkYM(Eday,ON); Em=Eday.Y*12+Eday.M; if( Sa==0 || Ea==0) exit(0); /*非系統年度*/ OPEN_ACF001; OPEN_ACF011; UTime(0,OFF); SetTx(); /*設Tx,及檢查結轉是否平衡*/ UShowSL(SX-6,SY+10,40," 傳票過帳中, 請稍候:",V_W_IN); for(A=Sa,Mn=Sm; A<=Ea; A++,Mn++) { UShowM(SX+22,SY+10,5,Sday,V_ITEM_ON); if(++Sday.M>12){ Sday.Y++; Sday.M=1; } OPEN_WORK; SumAmt(); /*依Mn月份,計算該月分傳票檔中的金額,筆數*/ SetAmt(); /*將WORK計算的金額,筆數拷貝至科目主檔中*/ Ufk_NotFlush(WORKK); Ufk_Close(WORKK); } UShowSL(SX-6,SY+10,40," << 傳票過帳完畢, 請任按一鍵 >> ",V_WARNING); UTime(1,ON); } /*===========================================================================*/ void PassWork(FSACF011_T *p) /*在WORK中累加,金額,筆數*/ { memset(&WORK,NULL,sizeof(WORK)); /*先清為空白*/ strcpy(WORK.KEY,p->AC); /*依分錄科目號搜尋*/ Ufk_Read(WORKK,&WORK,NULL); /*讀取相對應科目,有則累加,無則空*/ if(p->DC=='D'){ WORK.AMT[0]+=p->AMT; WORK.WNO[0]++; } /*餘額累加,筆數累加*/ else { WORK.AMT[1]+=p->AMT; WORK.WNO[1]++; } Ufk_Write(WORKK,&WORK); Utx_Search(Tx,p->AC); if(Tx->FIND==OFF) { UWait(ON,"傳票編號:%S---- , 主檔無 %S----- 科目",p->KEY,p->AC); if(RetKey==ESC) exit(0); } } /*===========================================================================*/ void SumAmt() /*依Mn月份,計算該月分傳票檔中的金額,筆數*/ { READ1(ACF011) { if((p->YM.Y*12 + p->YM.M) != Mn) continue; /*一個月一個月處理*/ ChkACF011(p); /*檢查該分錄各項是否合理*/ PassWork(p); if(p->AC[4]<=SPACE) continue; /*若為總帳科目則continue*/ memset(&p->AC[4],SPACE,3); /*明細改為總帳,再加總一次*/ PassWork(p); } READ2 } /*===========================================================================*/ void SetAmt() /*將WORK計算的金額,筆數拷貝至科目主檔中*/ { FSACF001_T *p,*pp; long t,n,r,j,now=0L,s; s=sizeof(ACF001); /*s=資料結構size*/ t=filelength(ACF001K->ffd)/s; /*t=檔案共幾筆s*/ n=65530L/s; /*n=64k可切成幾塊s*/ if((pp=malloc(n*s))==NULL) UFatal("Memory"); /*pp=最大64k的buffer*/ lseek(ACF001K->ffd,0L,SEEK_SET); /*檔頭*/ for(; t>0; t-=r) { if(t>=n) r=n; else r=t; /*r=本次處理筆數,不會超過64k*/ read(ACF001K->ffd,pp,s*r); /*將資料讀進buffer*/ for(p=pp,j=0; j<r; j++,p++) { if(p->KEY[0]<=SPACE) continue; /*已刪除*/ if(p->KEY[0]=='Z') continue; /*虛科目*/ if(Ufk_Read(WORKK,&WORK,p->KEY)==OFF) memset(&WORK,NULL,sizeof(WORK)); /*p->KEY於該月Mn無交易*/ p->AMT[0][A]=WORK.AMT[0]; p->DC_NO[0][A]=WORK.WNO[0]; /*以WORK中的資料取代原本資料*/ p->AMT[1][A]=WORK.AMT[1]; p->DC_NO[1][A]=WORK.WNO[1]; } lseek(ACF001K->ffd,now,SEEK_SET); write(ACF001K->ffd,pp,s*r); /*整block寫入*/ now += s*r; } free(pp); } /*===========================================================================*/ void SetTx() /*設Tx,及檢查(總科目結轉)是否平衡*/ { double Dsum=0,Csum=0; Tx=Utx_Open(47,3,80,24,filelength(ACF001K->ffd)/sizeof(ACF001),8,ON); READ1(ACF001) { if(p->KEY[0]=='Z') continue; if(p->KEY[4]<=SPACE) { Dsum += p->AMT[0][0]; /*總科目'結轉'金額加總*/ Csum += p->AMT[1][0]; } Utx_Ins(Tx,"%S----- %S------------------",p->KEY,p->ACN); } READ2 if(Dsum != Csum) { UShowS(SX-2,SY+12," *** 上 期 結 轉 不 平 衡 *** ",V_WARNING); beep(); UShowS(SX-2,SY+13,"上期結轉借方金額: ",V_W_IN); UShowD(SX+16,SY+13,14,Dsum,",0",V_W_IN); UShowS(SX-2,SY+14," 貸方金額: ",V_W_IN); UShowD(SX+16,SY+14,14,Csum,",0",V_W_IN); UShowS(SX-2,SY+15,"────────────────",V_W_IN); UShowS(SX-2,SY+16," 差額: ",V_W_IN); UShowD(SX+16,SY+16,14,Dsum-Csum,",0",V_W_IN); } } /*===========================================================================*/ int Ufk_SetBuf(FKIP *Fk) /*設定大buffer*/ { long bno; if(Fk->handle != 7632) UFatal("No Open Fk (setbuf)"); if(Fk->hasbuf) return Fk->max_row; bno=65520L/Fk->frl; Fk->ptr = (void **)malloc(sizeof(void *) * bno); if(Fk->ptr==NULL) return 0; Fk->max_row=bno; Fk->mem_row=0; Fk->hasbuf=1; /*1:要flush,2:不flush*/ return Fk->max_row; } /*===========================================================================*/ void ChkACF011(FSACF011_T *p) /*檢查該分錄各項是否合理*/ { if(p->KI!='3' && p->KEY[6]!=1 && memcmp(p->AC,"1101 ",6)==0) /*非轉帳,是現金,1或2非轉帳不可有現金科目*/ { UWait(ON,"<%S----> 現金收支傳票不該有現金科目吧!,記得回去訂正",p->KEY); if(RetKey==ESC) exit(0); } } 原始檔-結束
Byron Wey Oct.21.1998