志翔科技有限公司後勤網

後勤等待處理訊息站,請各位成員努力消除待工區
 
首頁首頁  會員註冊會員註冊  登入登入  

分享 | 
 

 覺得資料太多想要分割

向下 
發表人內容
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 覺得資料太多想要分割   周三 11月 26, 2008 9:40 am

客戶說單據已放超過5年的資料,影響速度,且也不想放5年資料在查,想要只留一年資料. 如何處理 ?
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 回復: 覺得資料太多想要分割   周三 12月 03, 2008 5:46 pm

以出貨單為例,刪單是鎖定出貨單主檔drvpap,刪除drvpap會觸發Trigger去連刪出貨單明細paper,但需要注意刪除前需考慮到的一些限制與程序.

1.只有 [訂單已結] 的出貨單可刪?
2.只有 [已切傳票] [已開發票] 的才刪?
3.刪單前先將資料轉到歷史檔存放?
4.一般出貨單刪除會觸發產品庫存回算,回推訂單未處理數等,並且與傳票,發票,收款單等都有相關連,因此需識別是 [分割過期檔案] 或 [一般刪單],避免動作混淆.

依此個案來探討分割條件的必要性
1.訂單已結案是有必要的.
2.因為有些出貨單不一定會開立發票,所以發票非必要性.
3.傳票是必要性的,因與應收帳款相關.即使該出貨單可能收不到錢,也應轉應收帳款,再由會計角度去處理.
4.收款單也是必要的,尚未收款的出貨單不應被送到歷史檔.

先建立分割SQL的架構,刪除的參數為日數,訂為 (距離今天的日數)
delete 出貨單主檔 where 出貨單的日期<指定(距離今天的日數)的日期 且 原屬訂單已結案 且 該單已有轉開傳票 且 該單已登錄收款單號.

但是分割指令之前,需先對符合條件的出貨單表頭檔的可分割識別碼填上"1",表示該批資料可分割.

針對符合分割條件的出貨單表頭資料撰寫delete before Trigger,當刪除表頭資料前,執行以下分割的程序
1.將可分割資料複製一份給歷史檔,包含表頭檔與明細檔.
2.刪除附屬出貨單明細資料.

出貨單明細檔也會因表頭執行分割刪除前,被通知先行刪除,所以必須修改刪除出貨單明細的Trigger,加判斷原屬出貨單表頭檔是否其 [可分割識別碼] ="1",如是則要避開回算訂單出貨量與庫存檔計算的程式區段.避免與一般作廢出貨單的程序混淆.

另如如果針對出貨單歷史檔刪除,則不必考慮上數條件,而直接將表頭與明細刪除之.


以下為刪除出貨單表頭檔的delete before Trigger
ALTER trigger delete_drvpap before delete order 1 on
DBA.drvpap
referencing old as old_name
for each row
begin
 //將出貨單資料先抄錄一份到歷史檔
 if old_name.passold='1' then
  insert into olddrvpap select* from drvpap where pap_code = old_name.pap_code;
  insert into oldpaper select* from paper where pap_code = old_name.pap_code;
  insert into oldpaper_out select* from paper_out where pap_code = old_name.pap_code;
 end if;
 //刪除出貨單明細
 delete from paper_out where pap_code = old_name.pap_code; //出貨代出檔
 delete from paper where pap_code = old_name.pap_code //出貨單明細
end


flying 在 周日 12月 14, 2008 3:47 pm 作了第 3 次修改
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 回復: 覺得資料太多想要分割   周日 12月 14, 2008 3:14 pm

1.增加Table execsql,用以存放分割據本

create table execsql (execno numeric(5) primary key,execsql char(200) not null,notestr char(100) not null,isgo char(1),sure char(1));

2.編排分割版面

d_execsql_detail

3.註冊一個工作視窗,給MIS分割資料用窗





4.分割function,填在d_execsql_detail MIS設定窗的異動命令

execsql(execsql,sure)




執行視窗如下
1.先將過期可分割資料註記起來



2.準備將分割資料刪除,因為歷史檔尚未建立,所以出錯



flying 在 周日 12月 14, 2008 3:53 pm 作了第 1 次修改
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 回復: 覺得資料太多想要分割   周日 12月 14, 2008 3:45 pm

[database]
inifile=c:\id21\steelpipe.ini

[workdb]
inifile=c:\id21\steelpipework.ini


[work]
sql1=create table olddrvpap (pap_code char(8 ) ,orderno char(10) ,cust_no char(6) NOT NULL,out_date date NOT NULL,taxpapno char(10) ,opman char(8 ) ,moddate date ,delicost numeric(5) ,acccode char(8 ) ,printnum numeric(3) ,taxmon numeric(8 ) NOT NULL,situation char(1) ,caldelivery char(1) ,recmon numeric(8 ) ,passold char(1) ,printprice char(1) ,faxnoothers char(40) ,recpap char(8 ) ,isback char(1) ,monthno char(4) ,PRIMARY KEY (pap_code));

sql2=create table oldpaper (pap_code char(8 ) ,seq char(3) ,gd_no char(16) NOT NULL,num numeric(9,2) NOT NULL,price numeric(9,2) NOT NULL,style char(26) ,heat char(12) ,length numeric(9,2) NOT NULL,summary char(20) ,cost numeric(9,2) NOT NULL,width numeric(5) NOT NULL,opman char(8 ) ,moddate date ,sortuse numeric(3) ,dealprice numeric(9,2) ,order_seq char(3) ,reser char(10) ,buyin char(1) ,replacegd char(1) ,certout char(1) ,manuno char(9) ,disc numeric(5,1) ,monthno char(5) ,gd_left numeric(10,3) ,out_time char(4) ,PRIMARY KEY (pap_code,seq));

sql3=create table oldpaper_out (pap_code char(8 ) ,paper_seq char(3) ,gd_no char(16) NOT NULL,num numeric(9,2) NOT NULL,heat char(12) ,length numeric(9,2) NOT NULL,summary char(20) ,cost numeric(9,2) NOT NULL,width numeric(5) NOT NULL,opman char(8 ) ,moddate date ,sortuse numeric(3) ,seq char(3) ,buyin char(1) ,reser char(10) NOT NULL,manuno char(9) ,gd_left numeric(10,3) ,out_time char(4) ,PRIMARY KEY (pap_code,paper_seq,seq));

[msg]
msg1=新增table olddrvpap
msg2=新增oldpaper
msg3=新增oldpaper_out


[workfile]
file1=delete_drvpap.sql

[filemsg]
msg1=修改出貨單表頭檔的刪除Trigger




上面為傳給客戶的database_correct.ini檔內容,透過此檔修改其資料庫.
http://idon.666forum.net/forum-f3/topic-t58.htm

歷史檔必須與出貨單檔架構一模一樣.否則會出錯,建立檔案的SQL是用系統工具tools.exe-->w_tabletree->產生檔案結構SQL去改的,這些產生歷史檔Table的指令與修改後的Trigger內容一起傳給客戶,由其MIS執行之.


flying 在 周日 12月 14, 2008 5:55 pm 作了第 3 次修改
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 回復: 覺得資料太多想要分割   周日 12月 14, 2008 4:03 pm

分割成功,但為了確認庫存與訂單數不被異動回寫,分割前應先記錄某測試出貨單的產品其目前庫存數與原屬訂單已出貨數,這些數字不能因分割動作而變動到.

回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 回復: 覺得資料太多想要分割   周日 12月 14, 2008 4:14 pm

出貨單資料跑到歷史檔去了,事情不會如此就罷了的,因為客戶哪天心血來潮,一樣要查要統計,而且常不分是否已切割歷史檔.

檔案分割後可規劃
1.歷史出貨單主檔查詢.當然也隨掛該單出貨單明細
2.歷史出貨單明細查詢.

因為歷史檔結構與原出貨單一致,所以可以用版面複製的方式製作歷史出貨單查詢版面.利用版面可以Edit source的能力,成批置換Table名稱即可.版面有了再向系統註冊工作視窗即可操作.歷史檔版面由於與原來的版面很像,所以為了避免操作者混淆,有必要針對Header抬頭區變換成不同顏色,一般是用灰底.
可參考製作說明.
http://idon.666forum.net/forum-f12/topic-t122.htm

其它原本訂單作業下或其它視窗如客戶窗等,需要看到此客銷貨,此品銷貨就不管歷史檔了.

但有關年度銷貨統計查詢與報表,可能仍需匯入歷史檔,做法是以function去匯入歷史檔資料到原本版面.需另開文說明.
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
 
覺得資料太多想要分割
回頂端 
1頁(共1頁)

這個論壇的權限:無法 在這個版面回復文章
志翔科技有限公司後勤網 :: 後勤主題與待工區 :: steelpipe待工區-
前往: