請問一下大家是否知道於TIPTOP內如何寫EXCEL匯入
匯入方式又分為兩種
(1)完全沒有資料的新增,SELECT COUNT() FROM DB WHERE KEY COUNT()=0
(2)已存在資料的修改,SELECT COUNT() FROM DB WHERE KEY COUNT()=1
我的做法匯入前將前值先刪掉以匯入的為主,不然就要先檢查
匯入時文字不用檢查,數字需轉換參考一下程式碼
axct200_excel.per 窗選csv檔
SCHEMA ds
LAYOUT
GRID
{
FILE PLACE [fname ]
}
END --GRID
END --LAYOUT
ATTRIBUTES
BUTTONEDIT fname = FORMONLY.fname,NOT NULL,REQUIRED, ACTION=CONTROLP, IMAGE="zoom" ,COMMENTS='<^P>UPLOAD FILE';
END
.4gl 加入按鍵,選擇csv檔,先把檔案傳去/u1/out內才能處理內容,如遇big5 utf8需轉檔
#由excel匯入
WHEN "importexcel"
IF cl_chk_act_auth() THEN
CALL t200_excel()
IF g_success = 'Y' THEN
END IF
END IF
FUNCTION t200_excel()
DEFINE l_fname VARCHAR(1000),
l_fpath VARCHAR(1000),
l_i,l_j SMALLINT
IF cl_null(g_cci.cci01) THEN
CALL cl_err('',-400,1)
RETURN
END IF
CASE
WHEN g_cci.ccifirm = 'Y'
CALL cl_err('','9023',1)
RETURN
END CASE
OPEN WINDOW t200_excel AT p_row,p_col #顯示畫面
WITH FORM "cxc/42f/axct200_excel"
ATTRIBUTE (STYLE = g_win_style CLIPPED)
CALL cl_ui_locale("axct200_excel")
LET g_success = 'Y'
#客戶端檔案
WHILE TRUE
INPUT l_fname WITHOUT DEFAULTS
FROM FORMONLY.fname
ON ACTION controlp
CASE
WHEN INFIELD(fname)
LET l_fname = ''
CALL cl_browse_file() RETURNING l_fname
DISPLAY l_fname TO FORMONLY.fname
END CASE
ON ACTION exit
LET INT_FLAG = 1
EXIT INPUT
END INPUT
IF INT_FLAG THEN
LET INT_FLAG = 0
LET g_success = 'N'
CALL cl_err('','9001',1)
CLOSE WINDOW t200_excel
RETURN
END IF
IF NOT cl_null(l_fname) THEN
EXIT WHILE
END IF
END WHILE
LET l_fpath = FGL_GETENV("TEMPDIR")
LET l_i = LENGTH(l_fpath)
IF l_i > 0 THEN
IF l_fpath[l_i,l_i] = '/' THEN
LET l_fpath[l_i,l_i] = ' '
END IF
END IF
BEGIN WORK
CALL t200_excel_import(l_fname,l_fpath)
IF g_success = 'Y' THEN
COMMIT WORK
ELSE
ROLLBACK WORK
END IF
CLOSE WINDOW t200_excel
END FUNCTION
FUNCTION t200_excel_import(p_fname,p_fpath)
DEFINE p_fname VARCHAR(1000),
p_fpath VARCHAR(1000),
l_fname VARCHAR(1000),
l_i,l_j,l_row SMALLINT,
l_str VARCHAR(1000),
l_date DATE,
g_cmd VARCHAR(1000)
DEFINE ch base.Channel,
l_strtmp RECORD
str1 VARCHAR(20),
str2 VARCHAR(20),
str3 VARCHAR(20),
str4 VARCHAR(20)
END RECORD,
l_ccj RECORD
ccj01 LIKE ccj_file.ccj01,
ccj02 LIKE ccj_file.ccj02,
ccj03 LIKE ccj_file.ccj03,
ccj04 LIKE ccj_file.ccj04,
ccj05 LIKE ccj_file.ccj05,
ccj06 LIKE ccj_file.ccj06,
ccj07 LIKE ccj_file.ccj07,
ccj08 LIKE ccj_file.ccj08
END RECORD
LET l_i = LENGTH(p_fname)
LET l_j = l_i
WHILE p_fname[l_j,l_j] != '/' AND l_j >= 1 #取出檔案名稱位置
LET l_j = l_j - 1
END WHILE
LET p_fpath = p_fpath CLIPPED,'/',p_fname[l_j+1,l_i] #上傳位置及檔名
IF NOT cl_upload_file(p_fname,p_fpath) THEN #檔案上傳
CALL cl_err('UPLOAD FILE','lib-212',1)
LET g_success = 'N'
RETURN
END IF
LET l_fname = p_fpath,'.TXT'
#轉檔
LET g_cmd = "iconv -f big5 -t UTF-8 ",p_fpath CLIPPED, " > ", l_fname
RUN g_cmd
#回寫轉檔後的檔案至原檔名
LET g_cmd = "mv ",l_fname CLIPPED,' ',p_fpath
RUN g_cmd
#去掉非LINUX系統使用之斷行碼
LET g_cmd = "killcr ",p_fpath
RUN g_cmd
#讀檔
LET ch = base.Channel.create()
CALL ch.setDelimiter(",")
CALL ch.openFile(p_fpath,"r")#開啟檔案路徑
IF STATUS THEN
CALL cl_err(p_fpath,'-808',1)
LET g_success='N'
CALL ch.close()
RETURN
END IF
#讀取資料,前1筆資料無效,不需判斷
LET l_row = 0
WHILE ch.read([l_str])
LET l_row = l_row + 1
IF l_row >= 1 THEN
EXIT WHILE
END IF
END WHILE
IF l_row < 1 THEN #若資料跳離時l_row小於1,則表示檔案未滿1行,無可用資料
LET l_str = "No Date Before EOF"
CALL cl_err(l_str,'mfg3382',1)
LET g_success = 'N'
CALL ch.close()
RETURN
END IF
DELETE FROM ccj_file WHERE ccj01=g_cci.cci01 AND ccj02=g_cci.cci02
WHILE ch.read([l_strtmp.*])
LET l_row = l_row + 1
IF cl_null(l_strtmp.str1) THEN
EXIT WHILE
END IF
LET l_ccj.ccj01=g_cci.cci01
LET l_ccj.ccj02=g_cci.cci02
LET l_ccj.ccj03=l_row - 1
LET l_ccj.ccj04=l_strtmp.str3 CLIPPED
IF NOT cl_null(l_strtmp.str4) THEN
#文字轉換數量
CALL t200_value_filter(l_strtmp.str4)
RETURNING l_ccj.ccj05
ELSE
LET g_success = 'N'
END IF
LET l_ccj.ccj06=0
LET l_ccj.ccj07=0
LET l_ccj.ccj08=''
#有錯誤則不進行更新動作
IF g_success = 'N' THEN
EXIT WHILE
ELSE
INSERT INTO ccj_file VALUES (l_ccj.*)
IF SQLCA.sqlcode THEN #置入資料庫不成功
CALL cl_err3("ins","ccj_file",l_ccj.ccj01,l_ccj.ccj02,SQLCA.sqlcode,"","",1) CONTINUE WHILE
END IF
END IF
END WHILE
CALL ch.close()
MESSAGE 'INSERT O.K'
#CALL t200_b_tot()
END FUNCTION
FUNCTION t200_value_filter(p_str)
DEFINE p_str VARCHAR(1000),
l_cnt,l_i,l_j,l_k SMALLINT,
l_str STRING,
l_value DEC(15,4),
l_value1 DEC(15,0)
LET l_str = p_str
LET l_cnt = l_str.getLength()
LET l_j = 0 LET l_k=0 LET l_value = 0
#紀錄文字中數字第一次出現的位置,及此連續數字中斷前的最後位置
#作為回傳數值
FOR l_i = 1 TO l_cnt
#數值中可存在數字及小數點
IF p_str[l_i,l_i] MATCHES '[0123456789.]' THEN
IF l_j = 0 THEN
#若為第一次找出數字或小數點,紀錄目前位置為起始位置
LET l_j = l_i
ELSE
#若非第一次找出數字或小數點,紀錄目前位置為尾端位置
LET l_k = l_i
END IF
ELSE
#找到不為數字及小數點的字元且已找出過數字或小數點的話
#跳出迴圈
IF l_j > 0 THEN
EXIT FOR
END IF
END IF
END FOR
#判斷擷取出來的數字是否可用(l_j > 0 表示有擷取)
IF l_j > 0 THEN
IF l_k = 0 THEN #若l_j有值,l_k無值則表示擷取出之長度為1
LET l_k = l_j
END IF
IF p_str[l_k,l_k] = '.' THEN
IF l_j != l_k THEN #若字串僅有字元'.',表示錯誤的數值
LET l_j = 0
LET l_k = 0
ELSE #字串的最後一位為.則最後字元往前一位
LET l_k = l_k - 1
END IF
END IF
END IF
IF l_j > 0 AND l_k > 0 THEN
LET l_value = p_str[l_j,l_k]
LET l_value1 = (l_value-0.0005) * 1000
LET l_value = l_value1 / 1000
END IF
RETURN l_value
END FUNCTION
關鍵字:ui.interface.frontcall()
丟到google上應該有你要的資料
至於INSERT或UPDATE就是4gl內看你要怎麼寫
通常都會先建一個temp_table,存入excel的資料,再跟目前系統中資料做比對
最後資料處理完記得DROP掉
1.TIPTOP 不吃 .XLS 或 .XLSX 的檔案. 請先轉成CSV
2.CSV 中不可以中文字.(有中文字的CSV 我沒有匯成功過)
3.參存APYT120的寫法.(GP5.1 以後的版本沒有這支程式,有合約找鼎新要要看)
4.只建議單身無資料時才可以匯.(在有資料時讓USER匯入容易造成USER搞不清楚的狀況)-會需要用匯入程式,一定的單身資料量多,USER不方便KEY .若有資料時匯入USER會搞混.
前輩您好,使用ui.interface.frontcall()相關函式匯入excel檔,將不會受這些限制
jack555265: ui.interface.frontcall()這個FUNCTION 在TIPTOP GP 5.0 版中沒有出現過. 所以我沒用迥. 如果可以用. 也要注意 GDC 的版本.
ckp6250: 會寫匯入程式,是給一般USER 用的, 他們大都用在訂單/請購單/領料單之類的異動單據的單身匯入.(會要用到匯入一般都會是 USER 一次可能要輸入50筆以上的單身資料,而且是經常性的輸入(一個月可能會2~3次以上) , 這些的匯入資料應該可以只匯英數部份就好, 如料號/數量/單位/單價/金額等資料, 在匯入過程中再透過程式SELECT 來處理品名等有中文的部份.
至於客戶.廠商/料號等會發生一次大量匯入,應該只會發生在導入開帳作業.這些資料應該是交給MIS,透過工具方式匯入,就不會有中文的問題.
【訂單/請購單/領料單】之單身,也會有【摘要】或【備註】吧,中文字是無法避免的,假如是我寫的程式,我沒辦法向客戶說不能匯入中文,講不出口啦,客戶也聽不進去啊,早被打死了。
鼎新那麼大,不管那個版本,若不能匯中文,我是覺得不可思議啦。