維護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


回首頁C之城