| @@ -283,7 +283,8 @@ SELECT | |||
| CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalOpeningBalance, | |||
| CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockIn, | |||
| CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockOut, | |||
| CASE WHEN SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCurrentBalance | |||
| CASE WHEN SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCurrentBalance, | |||
| CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalStockTakeQty | |||
| FROM data | |||
| ORDER BY | |||
| @@ -515,7 +516,8 @@ SELECT | |||
| CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalOpeningBalance, | |||
| CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockIn, | |||
| CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockOut, | |||
| CASE WHEN SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCurrentBalance | |||
| CASE WHEN SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCurrentBalance, | |||
| CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalStockTakeQty | |||
| FROM data | |||
| ORDER BY | |||
| @@ -413,7 +413,7 @@ class StockTakeVarianceReportController( | |||
| } | |||
| } | |||
| fun addItemSummaryRow(totalQty: Double, _itemNo: String, _itemName: String) { | |||
| fun addItemSummaryRow(totalQty: Double, totalStockTakeQty: Double, _itemNo: String, _itemName: String) { | |||
| val r = sheet.createRow(rowIndex++) | |||
| // keep keys for filtering/grouping, visually hidden | |||
| r.createCell(0).apply { | |||
| @@ -448,6 +448,12 @@ class StockTakeVarianceReportController( | |||
| setCellValue(totalQty) | |||
| cellStyle = summaryQtyThickBottomStyle | |||
| } | |||
| // also set "盤點總數" at the "盤點數"欄(col 7) | |||
| r.getCell(7).apply { | |||
| setCellValue(totalStockTakeQty) | |||
| cellStyle = summaryQtyThickBottomStyle | |||
| } | |||
| } | |||
| fun addBlankSeparatorRow() { | |||
| @@ -462,12 +468,13 @@ class StockTakeVarianceReportController( | |||
| cellStyle = textStyle | |||
| } | |||
| } | |||
| addItemSummaryRow(0.0, "", "") | |||
| addItemSummaryRow(0.0, 0.0, "", "") | |||
| } else { | |||
| var currentItemNo: String? = null | |||
| var currentItemName = "" | |||
| var currentUom = "" | |||
| var currentItemTotalQty = 0.0 | |||
| var currentItemTotalStockTakeQty = 0.0 | |||
| dbData.forEach { rowMap -> | |||
| val itemNo = rowMap["itemNo"]?.toString().orEmpty() | |||
| @@ -475,9 +482,10 @@ class StockTakeVarianceReportController( | |||
| val uom = rowMap["unitOfMeasure"]?.toString().orEmpty() | |||
| if (currentItemNo != null && itemNo != currentItemNo) { | |||
| addItemSummaryRow(currentItemTotalQty, currentItemNo!!, currentItemName) | |||
| addItemSummaryRow(currentItemTotalQty, currentItemTotalStockTakeQty, currentItemNo!!, currentItemName) | |||
| addBlankSeparatorRow() | |||
| currentItemTotalQty = 0.0 | |||
| currentItemTotalStockTakeQty = 0.0 | |||
| } | |||
| val r = sheet.createRow(rowIndex++) | |||
| @@ -497,9 +505,10 @@ class StockTakeVarianceReportController( | |||
| currentItemName = itemName | |||
| currentUom = uom | |||
| currentItemTotalQty += parseSignedNumber(rowMap["currentBookBalance"]) ?: 0.0 | |||
| currentItemTotalStockTakeQty += parseSignedNumber(rowMap["stockTakeQty"]) ?: 0.0 | |||
| } | |||
| addItemSummaryRow(currentItemTotalQty, currentItemNo ?: "", currentItemName) | |||
| addItemSummaryRow(currentItemTotalQty, currentItemTotalStockTakeQty, currentItemNo ?: "", currentItemName) | |||
| } | |||
| val lastRowIndex = rowIndex - 1 | |||
| @@ -64,6 +64,7 @@ | |||
| <field name="stockTakeQty" class="java.lang.String"/> | |||
| <field name="variance" class="java.lang.String"/> | |||
| <field name="variancePercentage" class="java.lang.String"/> | |||
| <field name="totalStockTakeQty" class="java.lang.String"/> | |||
| <group name="Group1" keepTogether="true" preventOrphanFooter="true"> | |||
| <groupExpression><![CDATA[$F{itemNo}]]></groupExpression> | |||
| <groupHeader> | |||
| @@ -109,11 +110,20 @@ | |||
| </reportElement> | |||
| </line> | |||
| <line> | |||
| <reportElement x="273" y="0" width="135" height="1" uuid="57591898-c7d7-43ef-a078-9ca155d03a8c"> | |||
| <reportElement x="273" y="0" width="207" height="1" uuid="57591898-c7d7-43ef-a078-9ca155d03a8c"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||
| </reportElement> | |||
| </line> | |||
| <textField textAdjust="StretchHeight"> | |||
| <reportElement x="408" y="0" width="72" height="18" uuid="0c547695-30bb-491c-aaa3-26f6d2a577a3"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement textAlignment="Right" verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$F{totalStockTakeQty}]]></textFieldExpression> | |||
| </textField> | |||
| </band> | |||
| <band height="1"> | |||
| <printWhenExpression><![CDATA[$V{Group1_COUNT} == 1]]></printWhenExpression> | |||