# 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)

## 解析
懷疑兩個情況:
* 1.使用者用不同帳號登入,一個可以印一個不行,這樣的話可以印的使用者在資料表會有資料,我去把它查出來再用該使用者登入印看看如果可以就直接回覆。
* 2.資料產生之後又被刪除了,要查哪隻程式刪除的,這個比較麻煩。
情況一:
各帳號測試:
::: spoiler
jhj00
jhj01
jhj02
jhj03
jhj04 

jhj05
jhj06
jhj07
jhj08

jhj09
jhj10
jhj11
jhj12
:::
:::warning
全部失敗!
:::


兩個情況都是使用者對流程不熟悉產生的問題,排除之後才會進一步去檢查為什麼資料憑空消失。
## 問題單內容
* 原始程式碼位置
* 目的程式碼位置
* 問題解析
* 處理方法
* 變更後測試執行結果
## 備註
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

再從 MAST_KEPST3,MAST_KEPST4,MR40106_WRK 拿資料
一行一行的資料再從 MR40406_RPT, MAST_KEPST4 拿金額資料
再產生至 MR40106_RPT2
如果沒有資料就是 P_MR40406_RPT 沒有產生可以列印的資料

根據 log 可以知道 送出之後就沒有下文了,先懷疑是資料庫程序執行錯誤。
檢查方式:打開 dbms (不會的話叫我(今天來不及了,下個駐點日))在 sql developer 執行這一段看錯誤
```sql
CALL P_MR40406_RPT('108451','0','00','0I','0','zzzzzzzzzzzzzzz','A','1110625','N')
```
執行這一段看錯誤:

dbms 是直接打開SQL developer 對嗎?
這是報表不會更動到原始資料,所以可以用 sql 測試
你要爬 java 檔,按照順序去執行 sql
最後再用 java 裡面的邏輯把資料撈出來,看哪裡出錯導致印不出來
dbms 是 程序有錯的時候在做 log 用的,
目前看起來可以執行,你如果懷疑程序有錯再查 sql developer 怎麼用 dbms
ming:
java

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'
> ```
> 看資料是不是有產生,如果沒有才去查中間的過程。
> 
>
有诶 太好ㄌ!

> 因為 INSERT 是包在 CRSR 的 LOOP 裡面,想像中會有多筆,但是實際上只有一筆,你要去查 CRSR 的 語法是不是只有一個。
> 
> ```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....蛤啊.....
是不是解不太出來...
還是我們先印給他資料就好?
好ㄟ
那 額 我先帶入資料 等等 再問怎麼列印~

結果很漂亮~

結果超漂亮,只有一筆~

> 釐清為什麼 CRSR 有很多資料,最後 INERT 只有一筆,是有條件判斷才會 INSERT ,或是出錯沒有 INSERT,推測 ln_qtyt_qty 計算出來都 0,因此只有一筆
> ```sql
> IF ln_qtyt_qty > 0 THEN
> INSERT
> INTO mr40406_rpt
> ```
> 印出來是完全沒資料,空的嗎
> ㄟ 不是,你都先用 jhj13 去做一次操作測試,然後都用 jhj13 去找才對得上,我們今天先不要管那個 108
> 操作印出來有東西嗎?(那一筆)
> 按列印沒有 excel 嗎?
對!

那因該是
jsp 出問題? 或 sel.jsp出問題?

:::spoiler
我看是沒有QAQ

~~不能列印感覺超頭大@@.....~~
4480行的java...
這是2021 06 03 修改的
備份? 在哪邊找?

找到ㄌ
好,你要哪一份檔案~~
(4/1號的不算備份ㄇ)_
:::

最後修改的好像是你 (06/30....)....
> 不能列印,跟列印出來沒東西是兩回事了
> 我覺得檔案被改過... 你確認一下上面 MR40406.class 的日期
> 完了 6.3 被改過,應該是 6.3 造成的錯誤,他上面有備份嗎? MR40406.class.20220603 之類的檔案
> 該死,他沒有備份,我拿 java 跟 github 上的比對一下
> 搞錯,你要看 MR40106.class... 再麻煩更新一下
已更新~
我在local打到 沒有push
印別的區處也都沒有東西....
都~
登陸 jhj00? 還是 jhj13(目前登錄這個)

都 沒有,之前就都登錄嘗試過了
- [X] 帳號
- [X] 資料
- [ ] 程式
> 4030 行是原本就這樣還是你打到?
> ```java
> rs.
> ```
> 我看java只有差在新增13區的程式
> 你改登陸 jhj00 分別嘗試印別的區處、屏東管理區看看,看是印屏東會有問題還是都不能印
> 如果 jhj00 可以印 13 區,你再登 jhj13 印看看
> 我們先確定是帳號、資料、程式哪邊的問題
> 其他區處也不行嗎? class 備份之後重新編譯再試看看,你要注意檔案編碼不能改到
Ming:
11:44更新
1. Mr40106 上次改是2016了....
:::spoiler

:::
> 絕對不要用,因為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

:::
3. 但單位只有 "單位名稱:全公司彙總",應該是 屏東印不出來
:::spoiler

:::
> 4頁都這樣嗎?
(對! 四頁都是空的)
詢問: 下一步查詢SQL 屏東的資料 還是 直接看java在屏東的邏輯有沒有什麼bug?
備註:jhj13是可以印的,但也只有彙總
> 沒有出錯,可以印,但是是空的這樣嗎?
對~ 如圖 全空 (jhj13全空 但 jhj00 彙總 有檔案)(可以點開詳細資料)_
:::spoiler

:::
> 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可以列印了!

感覺可以結單了!?
問題單回復:
這個問題是舊有在工程師新增13區時的更新與之前的維護出衝突,導致維護後第13區出問題,在修改了MR40106.java後,解決了問題。
然後是直接跟俊良回報嗎?
寫簡單的維護紀錄,你明後天會到廠嗎?
會~