# E23 ###### tags: `已處理` [toc] ## 問題敘述 有關材料系統中存量管制-基準存量設定作業-5.管線搶修器材數量明細表,想要印111年6月,屏東區管理處的管線搶修器材數量明細表, 但是不知何原因,印不出來,按完列印後,出現"搜尋無資料,請重新輸入條件!!"的文字(如附圖)這隻程式,之前在4/13印111年3月屏東區管理處的資料時是可以印出來的,請協助排除問題,讓使用者可列印出屏東區管理處的管線搶修器材數量明細表,並請盡量於111年7月15日前排除問題完成, [E23](https://docs.google.com/document/d/1WpEbS4Cv9u3O9a80_s5Li_y9Ojdi7PAJ/edit?usp=sharing&ouid=107825791787894292764&rtpof=true&sd=true) ![](https://i.imgur.com/6Gm7ydL.png) ## 解析 懷疑兩個情況: * 1.使用者用不同帳號登入,一個可以印一個不行,這樣的話可以印的使用者在資料表會有資料,我去把它查出來再用該使用者登入印看看如果可以就直接回覆。 * 2.資料產生之後又被刪除了,要查哪隻程式刪除的,這個比較麻煩。 情況一: 各帳號測試: ::: spoiler jhj00![](https://i.imgur.com/asxy85b.png) jhj01![](https://i.imgur.com/esvgB08.png) jhj02![](https://i.imgur.com/HbcATy7.png) jhj03![](https://i.imgur.com/w1h7mM8.png) jhj04 ![](https://i.imgur.com/Tg2QoKS.png) ![](https://i.imgur.com/cmpMbcH.png) jhj05![](https://i.imgur.com/mzmmvBf.png) jhj06![](https://i.imgur.com/5hYRpKz.png) jhj07![](https://i.imgur.com/jFIiSP9.png) jhj08![](https://i.imgur.com/TKATEjV.png) ![](https://i.imgur.com/4yM6jxt.png) jhj09![](https://i.imgur.com/cpg5IhO.png) jhj10![](https://i.imgur.com/SGbysTa.png) jhj11![](https://i.imgur.com/cLAE2Q9.png) jhj12![](https://i.imgur.com/atG1GqA.png) ::: :::warning 全部失敗! ::: ![](https://i.imgur.com/qn3bGGR.png) ![](https://i.imgur.com/tN7nkAu.png) 兩個情況都是使用者對流程不熟悉產生的問題,排除之後才會進一步去檢查為什麼資料憑空消失。 ## 問題單內容 * 原始程式碼位置 * 目的程式碼位置 * 問題解析 * 處理方法 * 變更後測試執行結果 ## 備註 ming: E023 較為緊急 要再 7月15日前排除問題完成, 想詢問,一樣是先看 Xml 跟jsp 然後再檢查PRT的問題嗎~ E023 MR40106全備份代碼 https://github.com/weacloud/QA Yu: 程式呼叫順序: - mr40106_sel.xml 呼叫 mr40106_prt - mr40106_prt 呼叫 mr40106 class - mr40106 outXLS-> execOut, execOut1, execOut2, execOut3 - exeOut -> getDataValueByExecOut(line 3816) 呼叫了 P_MR40406_RPT ![](https://i.imgur.com/OcAbQv7.png) 再從 MAST_KEPST3,MAST_KEPST4,MR40106_WRK 拿資料 一行一行的資料再從 MR40406_RPT, MAST_KEPST4 拿金額資料 再產生至 MR40106_RPT2 如果沒有資料就是 P_MR40406_RPT 沒有產生可以列印的資料 ![](https://i.imgur.com/QMxe0Ip.png) 根據 log 可以知道 送出之後就沒有下文了,先懷疑是資料庫程序執行錯誤。 檢查方式:打開 dbms (不會的話叫我(今天來不及了,下個駐點日))在 sql developer 執行這一段看錯誤 ```sql CALL P_MR40406_RPT('108451','0','00','0I','0','zzzzzzzzzzzzzzz','A','1110625','N') ``` 執行這一段看錯誤: ![](https://i.imgur.com/RJyXOEJ.png) dbms 是直接打開SQL developer 對嗎? 這是報表不會更動到原始資料,所以可以用 sql 測試 你要爬 java 檔,按照順序去執行 sql 最後再用 java 裡面的邏輯把資料撈出來,看哪裡出錯導致印不出來 dbms 是 程序有錯的時候在做 log 用的, 目前看起來可以執行,你如果懷疑程序有錯再查 sql developer 怎麼用 dbms ming: java ![](https://i.imgur.com/JCEGgmR.png) 4480行 我要查找每一個JAVA sqlstr or sqlselect 嗎~ 然後斷點 放入正式機 或 在 oracle 執行嗎~ > 他的問題是列印都沒有,但是正常要每個 sheet 都有 > 因此你不需要查找每一段 sql,你找某個 sheet 對應的程式邏輯為什麼不會產生報表資料即可 > 例如說 mr40106 outXLS-> execOut -> getDataValueByExecOut() > 照理說 getDataValueByExecOut 有東西就會印出來,所以你可以檢查: > 1. getDataValueByExecOut 裡面的邏輯是否正常執行,是不是有東西出來 > 2. 是不是 getDataValueByExecOut 有東西,卻印不出來。 > getDataValueByExecOut 位於 3816-4422 行,你不需要每一行都仔細看,嘗試了解他要做什麼。 (不之為何 我這邊是從3803開始的) > 那無所謂,邏輯應該沒有動很多,你先寄線上的 java 給我比較能討論,`tigernaxo@gmail.com` 有辦法看System.err.println嗎~ > 可以,但很多,你可以從 websphere 找下面的 log 資料夾 > 除了 java 檔之外,你要去看 P_MR40406_RPT 產生什麼,檢查一下是不是有正常產生。 P_MR40406_RPT怎麼看~(直接抓檔案~?) 還是可以在 oracle 上ctrl enter > 你 oracle 打開左邊清單的觸發程式?(trigger),找 P_MR40406,複製到 你的 IDE 檔案裡面查看,你不要看完全部的 sql,嘗試了解他的行為意圖,他應該是新增資料到 mr40406_rpt,所以你可以下 > ``` sql > select * from mr40406_rpt where userid='jhj13' > ``` > 看資料是不是有產生,如果沒有才去查中間的過程。 > ![](https://i.imgur.com/JbzEl2h.png) > 有诶 太好ㄌ! ![](https://i.imgur.com/eKwM6d9.png) > 因為 INSERT 是包在 CRSR 的 LOOP 裡面,想像中會有多筆,但是實際上只有一筆,你要去查 CRSR 的 語法是不是只有一個。 > ![](https://i.imgur.com/sjAp0oc.png) > ```sql > -- 把參數替換成你的條件 > SELECT > /*+RULE*/ > QYMT_ANO, > QYMT_MNO, > NVL(QYMT_LMQTY,0) QYMT_LMQTY, > ROUND( > CASE > WHEN NVL(QYTMT_LMQTY,0) = 0 > THEN 0 > ELSE NVL(QYTMT_LMAMT,0)/NVL(QYTMT_LMQTY,1) > END,3) AVG_P, > ROUND(NVL(QYMT_LMQTY,0) * ROUND( > CASE > WHEN NVL(QYTMT_LMQTY,0) = 0 > THEN 0 > ELSE NVL(QYTMT_LMAMT,0)/NVL(QYTMT_LMQTY,1) > END,3),0) > --QYMT_LMAMT > S_PRICE, > QYMT_SDATE, > SUBSTR(QYMT_ANO,1,2)ANO2, > SUBSTR(QYMT_MNO,1,5)mno5 > FROM MAST_QTYMTH, > MAST_QTYTMTH > WHERE ( SUBSTR(MAST_QTYMTH.QYMT_ANO,1,2) = SUBSTR(MAST_QTYTMTH.QYTMT_ANO,1,2) > AND MAST_QTYMTH.QYMT_MNO = MAST_QTYTMTH.QYTMT_MNO > AND MAST_QTYMTH.QYMT_YM = MAST_QTYTMTH.QYTMT_YM > AND MAST_QTYMTH.QYMT_SEQ = MAST_QTYTMTH.QYTMT_SEQ) > AND (QYMT_ANO,QYMT_MNO,QYMT_SDATE) IN > ( SELECT ANO,MNO,SDATE FROM MR40406_DATA WHERE USERID=A_USERID > ) > UNION > SELECT ANO AS QYMT_ANO, > MNO AS QYMT_MNO, > 0 AS QYMT_LMQTY, > 0 AS AVG_P, > 0 AS S_PRICE, > 0 AS QYMT_SDATE, > SUBSTR(ANO,1,2)ANO2, > SUBSTR(MNO,1,5)mno5 > FROM MR40406_DATA2 > WHERE USERID=A_USERID > UNION > SELECT ANO AS QYMT_ANO, > MNO AS QYMT_MNO, > 0 AS QYMT_LMQTY, > 0 AS AVG_P, > 0 AS S_PRICE, > 0 AS QYMT_SDATE, > SUBSTR(ANO,1,2)ANO2, > SUBSTR(MNO,1,5)mno5 > FROM MR40406_DATA3 > WHERE USERID=A_USERID > ORDER BY QYMT_ANO, > QYMT_MNO; > ``` > 歐 我搞錯 CRSR 了,這樣才對,我整理一下 CRSR? ~~你也看太快了.....~~ QQ....蛤啊..... 是不是解不太出來... 還是我們先印給他資料就好? 好ㄟ 那 額 我先帶入資料 等等 再問怎麼列印~ ![](https://i.imgur.com/OjvQnl1.png) 結果很漂亮~ ![](https://i.imgur.com/u6R3z9n.png) 結果超漂亮,只有一筆~ ![](https://i.imgur.com/AT2q8Gv.png) > 釐清為什麼 CRSR 有很多資料,最後 INERT 只有一筆,是有條件判斷才會 INSERT ,或是出錯沒有 INSERT,推測 ln_qtyt_qty 計算出來都 0,因此只有一筆 > ```sql > IF ln_qtyt_qty > 0 THEN > INSERT > INTO mr40406_rpt > ``` > 印出來是完全沒資料,空的嗎 > ㄟ 不是,你都先用 jhj13 去做一次操作測試,然後都用 jhj13 去找才對得上,我們今天先不要管那個 108 > 操作印出來有東西嗎?(那一筆) > 按列印沒有 excel 嗎? 對! ![](https://i.imgur.com/kx4eap0.png) 那因該是 jsp 出問題? 或 sel.jsp出問題? ![](https://i.imgur.com/jIXwshg.png) :::spoiler 我看是沒有QAQ ![](https://i.imgur.com/UqNuzuM.png) ~~不能列印感覺超頭大@@.....~~ 4480行的java... 這是2021 06 03 修改的 備份? 在哪邊找? ![](https://i.imgur.com/nuEsFW3.png) 找到ㄌ 好,你要哪一份檔案~~ (4/1號的不算備份ㄇ)_ ::: ![](https://i.imgur.com/Ved2mni.png) 最後修改的好像是你 (06/30....).... > 不能列印,跟列印出來沒東西是兩回事了 > 我覺得檔案被改過... 你確認一下上面 MR40406.class 的日期 > 完了 6.3 被改過,應該是 6.3 造成的錯誤,他上面有備份嗎? MR40406.class.20220603 之類的檔案 > 該死,他沒有備份,我拿 java 跟 github 上的比對一下 > 搞錯,你要看 MR40106.class... 再麻煩更新一下 已更新~ 我在local打到 沒有push 印別的區處也都沒有東西.... 都~ 登陸 jhj00? 還是 jhj13(目前登錄這個) ![](https://i.imgur.com/ctMIJAv.png) 都 沒有,之前就都登錄嘗試過了 - [X] 帳號 - [X] 資料 - [ ] 程式 > 4030 行是原本就這樣還是你打到? > ```java > rs. > ``` > 我看java只有差在新增13區的程式 > 你改登陸 jhj00 分別嘗試印別的區處、屏東管理區看看,看是印屏東會有問題還是都不能印 > 如果 jhj00 可以印 13 區,你再登 jhj13 印看看 > 我們先確定是帳號、資料、程式哪邊的問題 > 其他區處也不行嗎? class 備份之後重新編譯再試看看,你要注意檔案編碼不能改到 Ming: 11:44更新 1. Mr40106 上次改是2016了.... :::spoiler ![](https://i.imgur.com/n33QfOo.png) ::: > 絕對不要用,因為2016年還沒有屏東管理處,檔案一定是錯的,但你傳給我的 java 有屏東的 code,4030行的程式碼不完全,你有動到嗎?。 (對) 那是我後來打的 沒放上去~ :::danger 我傳給你的 是2016的java.... 但正式機的class 是 2022... ::: > https://github.com/weacloud/fp00-water/blob/main/WEB-INF/javas/MR40106.java > 這個比較接近,你測試區翻看看有沒有 MR40106.java 然後檢查一下日期。 我在測試區有找到6/30號的檔案 以郵寄給你~ 2. 總區處有產生檔案 :::spoiler ![](https://i.imgur.com/VyUigOY.png) ::: 3. 但單位只有 "單位名稱:全公司彙總",應該是 屏東印不出來 :::spoiler ![](https://i.imgur.com/E3K4thq.png) ::: > 4頁都這樣嗎? (對! 四頁都是空的) 詢問: 下一步查詢SQL 屏東的資料 還是 直接看java在屏東的邏輯有沒有什麼bug? 備註:jhj13是可以印的,但也只有彙總 > 沒有出錯,可以印,但是是空的這樣嗎? 對~ 如圖 全空 (jhj13全空 但 jhj00 彙總 有檔案)(可以點開詳細資料)_ :::spoiler ![](https://i.imgur.com/McPCV8V.png) ::: > jhj13 印出來的問題是單位名稱只有匯總,還是連資料都也沒有,還是只有彙總的資料但沒有13區的,你操作的畫面有沒有勾選匯總,有勾選的話是只會有彙總。 **那我知道為什麼了,我6.30用到舊的檔案,舊的檔案沒有屏東區所以出錯,你把這個編譯 java跟 class 都上傳更新到正式/測試機** https://github.com/weacloud/fp00-water/blob/main/WEB-INF/javas/MR40106.java **應該是前一個人沒有更新到正式機,我也是受害者 qq** 等等...所以.....我還要管測試機的java & class嗎? > 避免下一個人發生類似的事,最好都更新,之前也有發生有些java 只有在測試機有的情況(二代工程介接程式)。 好 那我先把gihub的檔案放過去試試 操作完 有問題再回報 ~~話說測試機要備份嗎~~ > 測試機不備分,只把 java 檔更新上去 > 我之前本來想請你把正式機的檔案再備分到 github,如果上次做這件事那 MR40106.java 就會變成舊版的,現在看起來之前有些工程師沒有更新到正式機上,還好沒時間做這件事不然就完ㄌ... > 是說也沒差,再找之前 commit 的版本就好... # 重要 因為這個問題是工程師新增13區的時候沒有把 java 更新上去,導致後來維護使用到舊的 java 檔案。 寫問題單的時候隨便寫說我們改了哪個 code 修正這個問題就好。 ~~好瞎......屏東之前到底都怎麼過的...~~ > 他可能有寫好,class 有對,但是 java 沒有更新,所以後來接著用就錯了 > 問題單滿足形式主義為主,不用太詳細,要趕下一單.. 放上去了,用jhj00登入操作屏東區試試看嗎? (但列印後不是不能再列印? 0323 jhj16可以列印了! ![](https://i.imgur.com/35GRcLq.png) 感覺可以結單了!? 問題單回復: 這個問題是舊有在工程師新增13區時的更新與之前的維護出衝突,導致維護後第13區出問題,在修改了MR40106.java後,解決了問題。 然後是直接跟俊良回報嗎? 寫簡單的維護紀錄,你明後天會到廠嗎? 會~