您現在的位置是:首頁 > 單機遊戲首頁單機遊戲

ESAP高階教程|動態換算的奧義

簡介createfunction fGetAuxQty(@qty decimal(34,3)=0——數量,@kz decimal(34,1)=0——克重,@gg varchar(128)=‘’——規格,例如1000*500或800—

鋼板如何換算噸

課題引出

在生產系統中,常常會碰到單位換算問題,例如:

購入一批鋁型材,倉庫論米,生產切割成不同的長度論根,供應商結算論噸。

購入一批鋼板,倉庫論平方,生產切割論塊,供應商結算論噸。

購入一批塑膠膜,倉庫論片,供應商結算論kg,並且四捨五入保留1位小數……

課題升級

村長最近在做採購訂單時就遇到了換算問題,需要把庫存單位轉換成結算單位再下采購訂單給供應商。

這個動態換算透過一個提數完成(NX/ES均可),部分換算歸納如下表:

ESAP高階教程|動態換算的奧義

提數公式本身運作良好,但僅僅在採購訂單中使用還不夠,還要在採購入庫,採購發票,採購對賬,採購臺賬等等功能中都要有所體現。

這就涉及到一個更新維護問題,如果哪天有新的換算方式,那不僅要改採購訂單的提數,還要改入庫,發票,對賬等等環節的提數。

如何一勞永逸的解決換算問題?!

方案評比

通常,動態公式換算問題,除了提數寫死,有這幾類方案:

檢視換算,這種換算實際就是:數量*常量,其中常量部分透過檢視算出,然後匹配本表料號進行計算。

ESAP高階教程|動態換算的奧義

缺點:僅適合不需要考慮本表臨時變數(例如長寬高等)的簡單換算。

使用EXCEL公式,這個是ES唯一原生支援的方案,從公式表提數填充到本表,類似:=_克重*_數量*_長*_寬/1000000,其中_克重,_數量,_長,_寬是定義的名稱,代表某個欄位區域。

ESAP高階教程|動態換算的奧義

缺點:本質是客戶端計算,需要構建大量輔助欄位,將所有需要的變數都提數體現。

使用sql函式,這個是NX原生支援的方案,將換算邏輯封裝成一個sql函式,提數時無腦代入變數。

createfunction fGetAuxQty( @qty decimal(34,3)=0——數量 ,@kz decimal(34,1)=0——克重 ,@gg varchar(128)=‘’——規格,例如1000*500或800——長=left(@gg,charindex(‘*’,@gg+‘*’)-1),寬=right(@gg,len(@gg)-charindex(‘*’,@gg+‘*’)) ,@dw varchar(128)=‘’——庫存單位 ,@hs varchar(128)=‘’——換算單位 ,@hsxs varchar(128)=0——換算係數)returnsdecimal(36,6)asbeginreturncasewhen @dw=‘片’and @hs=‘kg’thenround(@kz*@qty*cast(left(@gg,charindex(‘*’,@gg+‘*’)-1)asint)*cast(right(@gg,len(@gg)-charindex(‘*’,@gg+‘*’))asint)*(casewhen @kz<20then1。4else1。36end)/100000000。0000,1)when @dw=‘m’and @hs=‘噸’then @kz*@qty*cast(left(@gg,charindex(‘*’,@gg+‘*’)-1)asint)/1000000000。000000when @hs=‘噸’and @kz>0then @kz*@qty*cast(left(@gg,charindex(‘*’,@gg+‘*’)-1)asint)*cast(right(@gg,len(@gg)-charindex(‘*’,@gg+‘*’))asint)/1000000000000。000000when @dw=‘m’and @hs=‘m2’then @qty*cast(left(@gg,charindex(‘*’,@gg+‘*’)-1)asint)/1000000。000000when @hs=‘m2’then @qty*cast(left(@gg,charindex(‘*’,@gg+‘*’)-1)asint)*cast(right(@gg,len(@gg)-charindex(‘*’,@gg+‘*’))asint)/1000000。000000else @qty*(casewhenisnull(@hsxs,1)=0then1elseisnull(@hsxs,1) end)endend

缺點:不知道要會點sql算不算缺點?方案落地

開啟SSMS,將換算函式sql構建程式碼填入,F5執行。

ESAP高階教程|動態換算的奧義

接下來,在提數中使用。

ESAP高階教程|動態換算的奧義

對比一下老的提數公式,是不是頓時覺得整個世界都清淨了^_^

ESAP高階教程|動態換算的奧義

其他模板也是直接提數呼叫dbo。fGetAuxQty(),無輔助欄位,支援本表和其它表字段代入

最重要的是:

如有變更,只需要更新fGetAuxQty()即可全域性生效,一勞永逸!

最終效果示意

在採購訂單中進行換算:

ESAP高階教程|動態換算的奧義

手改規格後(特別提示,是文字型哦!!!),自動重算,爽歪歪:

ESAP高階教程|動態換算的奧義

小結

封裝sql自定義函式一勞永逸;

萬能提數中直接呼叫sql函式,無輔助欄位,隨叫隨到。

感謝NX楊工提供的技術支援和的如此靈活的快開平臺,並預祝筒子們元旦快樂~!

2019-12-31

Top