iT邦幫忙

0

TIPTOP EXCEL匯入

請問一下大家是否知道於TIPTOP內如何寫EXCEL匯入

匯入方式又分為兩種
(1)完全沒有資料的新增
(2)已存在資料的修改

這應該直接問鼎新比較妥當吧?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
by2048
iT邦高手 1 級 ‧ 2020-08-31 09:33:37
最佳解答

請問一下大家是否知道於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

1
jack555265
iT邦新手 2 級 ‧ 2020-08-28 11:38:30

關鍵字:ui.interface.frontcall()
丟到google上應該有你要的資料
至於INSERT或UPDATE就是4gl內看你要怎麼寫

通常都會先建一個temp_table,存入excel的資料,再跟目前系統中資料做比對
最後資料處理完記得DROP掉

0
evio0502
iT邦新手 2 級 ‧ 2020-08-28 11:38:32

参考apyt120就有類似範例了

0
做工仔人!
iT邦大師 1 級 ‧ 2020-08-28 15:10:29

1.TIPTOP 不吃 .XLS 或 .XLSX 的檔案. 請先轉成CSV
2.CSV 中不可以中文字.(有中文字的CSV 我沒有匯成功過)
3.參存APYT120的寫法.(GP5.1 以後的版本沒有這支程式,有合約找鼎新要要看)
4.只建議單身無資料時才可以匯.(在有資料時讓USER匯入容易造成USER搞不清楚的狀況)-會需要用匯入程式,一定的單身資料量多,USER不方便KEY .若有資料時匯入USER會搞混.

看更多先前的回應...收起先前的回應...
ckp6250 iT邦好手 1 級 ‧ 2020-08-28 15:20:42 檢舉

CSV 中不可以中文字.(有中文字的CSV 我沒有匯成功過)

假如有中文字就不能匯,那麼這種匯入功能有何用處?比如若要匯入客戶或廠商名單,一定會有中文字啊。

前輩您好,使用ui.interface.frontcall()相關函式匯入excel檔,將不會受這些限制

jack555265: ui.interface.frontcall()這個FUNCTION 在TIPTOP GP 5.0 版中沒有出現過. 所以我沒用迥. 如果可以用. 也要注意 GDC 的版本.

ckp6250: 會寫匯入程式,是給一般USER 用的, 他們大都用在訂單/請購單/領料單之類的異動單據的單身匯入.(會要用到匯入一般都會是 USER 一次可能要輸入50筆以上的單身資料,而且是經常性的輸入(一個月可能會2~3次以上) , 這些的匯入資料應該可以只匯英數部份就好, 如料號/數量/單位/單價/金額等資料, 在匯入過程中再透過程式SELECT 來處理品名等有中文的部份.
至於客戶.廠商/料號等會發生一次大量匯入,應該只會發生在導入開帳作業.這些資料應該是交給MIS,透過工具方式匯入,就不會有中文的問題.

ckp6250 iT邦好手 1 級 ‧ 2020-08-29 10:23:09 檢舉

做工仔人!

  【訂單/請購單/領料單】之單身,也會有【摘要】或【備註】吧,中文字是無法避免的,假如是我寫的程式,我沒辦法向客戶說不能匯入中文,講不出口啦,客戶也聽不進去啊,早被打死了。

 鼎新那麼大,不管那個版本,若不能匯中文,我是覺得不可思議啦。

我要發表回答

立即登入回答