維護1
原始程式
原始檔-起始 /*---------( FSACM001.C )--------------*/ #include "W_FSAC.H" FSACF001_T ACF001 ; /*===========================================================================*/ int Condition() { sprintf(BufS,"%-7s %-s",ACF001.KEY,ACF001.ACN); fwrite(BufS,NDXL,1,fpNDX); /* 以下用來清除會計主檔的 借貸筆數 與 金額,但保留科目名(良偉) memset(&ACF001.DC_NO,NULL,sizeof(ACF001.DC_NO)); memset(&ACF001.AMT ,NULL,sizeof(ACF001.AMT)); */ return ON; } /*===========================================================================*/ void main() { OPEN_ACF001; fpNDX=fopen(NDXDISK,"w+b"); Ufk_Pack(ACF001K,&ACF001,Condition); } 原始檔-結束
原始程式
原始檔-起始 /*---------( FSACM011.C )--------------*/ #include "W_FSAC.H" FSACF011_T ACF011; /*===========================================================================*/ int Condition() { return ON; } /*===========================================================================*/ main() { UCls(); OPEN_ACF011; Ufk_Pack(ACF011K,&ACF011,Condition); } 原始檔-結束
原始程式
原始檔-起始 /*---------( FSACMX11.C )----不存相同key者-----*/ #include "W_FSAC.H" FKIP *ACFX11K; /* 傳 票 主 檔 8=KEY 8 bytes, 1=分錄可指到 256 筆, 2=index 可指到 65536 筆 */ #define OPEN_ACFX11 ACFX11K=Ufk_Open("FSACFX11",sizeof(FSACF011_T),8,1,2) #define ANO 120 /*ARRAY 陣列筆數*/ FSACF011_T ACF011,ACF011A[ANO],ACF011B[ANO]; long rec=0,LLL,TTT; char recS[64]; /*===========================================================================*/ main() { UCls(); NamS=GET_NAME; OPEN_ACF011; OPEN_ACFX11; TTT = filelength(ACF011K->ffd)/ACF011K->frl; /*檔案總筆數*/ Ugd_Open("檔案重整中.... 共<%ld>筆 ",TTT); LLL=0; /*累計張數*/ RetKey=C_PGUP; /*第一筆*/ while(1) { if(Ufk_PgUD(ACF011K,ACF011.KEY)==OFF) break; Read1Page(); Write1Page(); RetKey=PGDN; /*下一筆*/ LLL++; } if(LLL<1) UFatal("第一筆錯誤"); UWait(ON,"***重整完畢*** 原<%ld>筆 共處理<%ld>筆 <%ld>張 ",TTT,rec,LLL); Ufk_Close(ACF011K); Ufk_Close(ACFX11K); system("COPY FSAC?X11 FSAC?011"); system("DEL FSAC?X11"); } /*===========================================================================*/ void Read1Page() { ACF011.KEY[6]=NULL; /*從每張的頭開始,故將分錄號碼清為NULL*/ memset(&ACF011A,NULL,sizeof(ACF011A)); /*讀資料時要先將Buffer清掉*/ for(DiskRec=0; DiskRec<ANO; DiskRec++) { sprintf(BufS,"%s%c",ACF011.KEY,DiskRec+2); /*從 2 開始讀*/ if(Ufk_Read(ACF011K,&ACF011A[DiskRec],BufS)==OFF) break; rec++; /*累計筆數*/ if(rec%60==0) { sprintf(recS,"第<%ld>筆 第<%ld>張",rec,LLL); UShowS(49,STATUS_ROW,recS,V_STATUS); } } memcpy(ACF011B,ACF011A,sizeof(ACF011B)); /*以供存入,刪除時修改用*/ if(DiskRec==0) /*保留傳票號碼,其他資料全部清除*/ { memset(&ACF011.KEY[0]+sizeof(ACF011.KEY),NULL,sizeof(ACF011)-sizeof(ACF011.KEY)); ACF011.KI='2'; /*內定為轉帳傳票*/ } else { ACF011=ACF011A[0]; ACF011.KEY[6]=NULL; /*設給ACF011以便操作*/ } Modify=OFF; OffSet=0; /*讀入時一定要Modify=OFF*/ } /*===========================================================================*/ void Write1Page() { int i,rec; if(ACF011.KEY[0]<=SPACE) { UWait(ON,".. 請 先 輸 入 傳 票 編 號 ! .."); RetKey=ENTER; return;} if(AddCash()==OFF){ RetKey=ENTER; return; } /*補現金傳票*/ for(rec=i=0; i<ANO; i++) { if(ACF011A[i].AC[0]==NULL) continue; /* 1'st byte=NULL*/ sprintf(ACF011A[i].KEY,"%s%c",ACF011.KEY,rec+2); /*重新從 2 開始編*/ ACF011A[i].KI=ACF011.KI; ACF011A[i].YM=ACF011.YM; Ufk_Write(ACFX11K,&ACF011A[i]); rec++; } } /*===========================================================================*/ int AddCash() /*補現金傳票,以ACF011.KEY為KEY*/ { FSACF011_T F011; memset(&F011,NULL,sizeof(F011)); /* 清為 null */ ACF011.KEY[6]=NULL; sprintf(F011.KEY,"%s%c",ACF011.KEY,1); /*分錄 1 為補現金項*/ strcpy(F011.AC,"1101 "); F011.KI=ACF011.KI; F011.YM=ACF011.YM; for(F011.AMT=0f, I=0; I<ANO; I++) { if(ACF011A[I].AC[0]==NULL) continue; /* 1'st byte=NULL*/ F011.AMT+=ACF011A[I].AMT; /*累加整張補現金用*/ if(ACF011.KI=='1' && ACF011A[I].DC=='D'){ UWait(ON,"第 %d 分錄不該為 (借) 吧 !!! , 請確認傳票別",I+1); return OFF;} if(ACF011.KI=='2' && ACF011A[I].DC=='C'){ UWait(ON,"第 %d 分錄不該為 (貸) 吧 !!! , 請確認傳票別",I+1); return OFF;} } if(ACF011.KI=='1'){ strcpy(F011.RM,"補現金收入傳票"); F011.DC='D'; } if(ACF011.KI=='2'){ strcpy(F011.RM,"補現金支出傳票"); F011.DC='C'; } if(ACF011.KI=='3' || F011.AMT==0f) Ufk_Del(ACFX11K,F011.KEY); /*或許被修改才變成 3,或分錄加總為0,表無分錄,刪掉補現金分錄*/ else Ufk_Write(ACFX11K,&F011); return ON; } 原始檔-結束
原始程式
原始檔-起始 /*---------( FSACM071.C )--------------*/ /*功能: */ /*有些公司沒用F5對沖票據,造成手誤, */ /*借貸兌現日期不匹配,或金額不匹配 */ /*不處理者: */ /*1.借或貸尚缺者,表示只一方 */ /*2.日期匹配,表可對沖 */ /*處理者: */ /*1.己填借和貸,但日期卻不匹配者,會改成相同*/ /*2.會找出並警告支票號碼重覆者 */ /*使用者應記錄錯誤傳票號,然後回去修改 */ /*然後反覆利用此程式偵測,直到無錯誤為止*/ #include "W_FSAC.H" #define SX 28 /*左內框 */ #define SY 10 /*上內框 */ #define SC 28 /*內框寬, 多少行 */ /*-----------------------------------------------------------------*/ struct { char KEY[7+1]; /*票據+兌現日*/ long IP[2]; /*0借方第幾筆,1貸方第幾筆(從第1算起,0表示無)*/ DATE YM[2]; /*兌現日*/ double AMT[2]; /*金額*/ char REC[2][8]; /*傳票號*/ } WORK; void RmError(int i); char *ChainKI(char KI); /*-----------------------------------------------------------------*/ FSACF011_T ACF011,*ptr; int Ar,Bw; char KI,Yn; long LL; char *Table="\ \ 票據<兌現日>修正處理 \ ========================== \ 票據種類: ---------- \ \ 執行(YN): - \ \ Esc:放棄 \ "; /*===========================================================================*/ main() { NamS=GET_NAME; OPEN_ACF011; UCls(); 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); while(1) { Field=1; KI='1'; Yn='N'; UShowC(BXN(2),Yn,V_WUSR); do { if(Field==1){ UReadTog(BXN(1),&KI,V_TOG,"12",ChainKI('1'),ChainKI('2')); UShowSL(BXN(1),ChainKI(KI),V_BLUE); } if(Field==2){ UReadC(BXN(2),&Yn,"YN",V_WUSR,V_READ); } 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(Yn!='Y' && RetKey!=ESC); LL=0; Ugd_Open("找到了< >張票據 , 修改兌現日期共< >張 "); OPEN_WORK; READ1(ACF011) { if(KI=='1'){ strcpy(SelKey,"1141"); Ar=1; Bw=0; } /*應收票據,屬借,讀1貨記錄,再寫入0借日期*/ else { strcpy(SelKey,"2141"); Ar=0; Bw=1; } /*應付票據,屬貸,讀0借記錄,再寫入1貸日期*/ if(memcmp(p->AC,SelKey,4)!=0) continue; /*應收科目*/ memset(&WORK,NULL,sizeof(WORK)); USprint(WORK.KEY,"%S-----",p->RM); /*要比對 票據*/ Ufk_Read(WORKK,&WORK,NULL); if(p->DC=='D') I=0; else I=1; /*0=借方,1=貸方*/ if(WORK.IP[I]>0){ ptr=p; RmError(I); } /*應空白,否則重複,錯*/ WORK.IP[I] = L+1; /*記錄第幾筆,L由READ1()遞增*/ WORK.YM[I] = p->CYM; /*記錄兌現日*/ WORK.AMT[I] = p->AMT; /*記錄金額*/ memcpy(&WORK.REC[I],p->KEY,sizeof(p->KEY)); /*記錄傳票號,金額錯時可顯示*/ Ufk_Write(WORKK,&WORK); UShowL(21,STATUS_ROW,5,++LL,"",V_STATUS); } READ2 Ufk_Flush(WORKK); /*------------------------------------------------------------------*/ lseek(WORKK->ffd,0L,SEEK_SET); for(LL=0; ;) { if(read(WORKK->ffd,&WORK,sizeof(WORK)) < 1) break; if(WORK.KEY[0]<=SPACE) continue; if(WORK.IP[0]==0L || WORK.IP[1]==0L) continue; /*未對沖掉,不處理*/ if(memcmp(&WORK.YM[0],&WORK.YM[1],sizeof(WORK.YM[0]))==0) continue; /*兌現日同,可對沖,不處理*/ if(WORK.AMT[0]!=WORK.AMT[1]) /*金額不同,嚴重錯誤*/ UWait(ON,"支票號碼 %S----- ,借傳票<%S---->,貸傳票<%S---->,兌現日期不同,金額不相同",WORK.KEY,WORK.REC[0],WORK.REC[1]); L = WORK.IP[Ar]-1; /*應收用0(借)來蓋1(貸),故讀1(貸),準備修改*/ lseek(ACF011K->ffd,L*sizeof(ACF011),SEEK_SET); read(ACF011K->ffd,&ACF011,sizeof(ACF011)); ACF011.CYM = WORK.YM[Bw]; /*改日期,不改摘要*/ lseek(ACF011K->ffd,L*sizeof(ACF011),SEEK_SET); write(ACF011K->ffd,&ACF011,sizeof(ACF011)); UShowL(51,STATUS_ROW,5,++LL,"",V_STATUS); } UShowS(66,STATUS_ROW,"任按一鍵繼續",V_RED_F); UGetKb(); Ugd_Close(); Ufk_Close(WORKK); } } /*===========================================================================*/ void RmError(int i) { FSACF011_T F011; long ip; ip=tell(ACF011K->ffd); lseek(ACF011K->ffd,(WORK.IP[i]-1)*sizeof(F011),SEEK_SET); read(ACF011K->ffd,&F011,sizeof(F011)); UWait(ON,"傳票: %S---- 與 %S---- 的支票號碼 %S----- 重復",F011.KEY,ptr->KEY,ptr->RM); lseek(ACF011K->ffd,ip,SEEK_SET); } /*===========================================================================*/ char *ChainKI(char KI) { switch(KI) { case '1': return "應收票據"; case '2': return "應付票據"; default : return " "; } } 原始檔-結束
Byron Wey Oct.21.1998