วันอาทิตย์ที่ 17 กรกฎาคม พ.ศ. 2554

บันทึกคุณแม่ 13/12/2510

13/12/2010

ประมาณตีห้าพยาบาลก็มาปลุก ให้เปลี่ยนเสื้อผ้า แล้วก็อะไรอีกจำไม่ได้ละ แต่จำได้ว่าไปนอนรออยู่หน้าห้องผ่า ประมาณ 10 นาที แล้วก็เกิดนึกขึ้นมาว่า เอ... นี่เราจะผ่าท้องคลอดแล้ว จะกลัวดี หรือไม่กลัวดีหว่า ^^ เนื่องมาจาก แม่เราเล่าไว้ว่าตอนแม่จะคลอดกลัวจนช๊อก

พยาบาลเข็นเข้าห้องผ่าตัดตอน 7 โมงเช้า พอเข้าไปในห้อง ก็จะมีผู้ช่วยพยาบาลเค้ามาย้ายเราไปนอนที่เตียงผ่า แล้วก็จะมีคนมาวัดความดัน ได้ 170 คุณหมอที่เค้าจะบล๊อกหลังเราก็ชวนเราคุย ว่าตื่นเต้นเหรอ เราก็ว่าค่ะ (แหม! คนไม่เคยผ่าตัดนี่นา อีกอย่างกลัวฉีดยาด้วย) ว่าแล้วหมอเค้าก็ให้เรานอนงอตัวให้มากๆ เพราะจะบล๊อกหลัง ต้องฉีดยา

Happy Birth Day ลูกรัก หนูเกิดเวลา 7.15 น.


แม่เห็นหนูครั้งแรกจ้า



บันทึกคุณแม่ 12/12/2510

จะว่าไปมันก็เป็นเรื่องที่ผ่านมาประมาณ 7 เดือนกว่าๆ ได้แล้ว แต่ขอรำลึกความหลังหน่อย เดี๋ยวแก่ไปจะจำไม่ได้ เรื่องที่จะเล่ามันก็เป็นประสบการณ์ของการเป็นแม่นั่นเอง

หลังจากที่อุ้มท้องมา 35 สัปดาห์ ทางคุณหมอก็เห็นว่าเรานี่ความดันสูงขึ้นทุกทีๆ มันอันตรายนะ หมอบอกว่าให้พักผ่อนมากๆ ไม่งั้นจะเป็นอันตรายทั้งแม่ทั้งลูก ไอ้เราก็รู้สึกปกติดี แต่ทำไมหมอว่างั้นหว่า?

แต่ก็ช่างเถอะ เชื่อหมอ อุตส่าห์ถ่อไปฝากท้องถึง 'นวบุตร' ได้ฝากท้องกับคุณหมอคนดังอย่างคุณหมอบุญชัย เอื้อไพโรจน์กิจ ก็ต้องเชื่อหมอ คุณหมอเค้าว่าให้พักผ่อนก็พัก งานการไม่ต้องทำกัน เราก็พักไปเลย 1 อาทิตย์ แต่ก็ทำงานอยู่ที่บ้าน ไม่ลงจากชั้น 3 เนื่องจากกลัวความดันขึ้น คุณสามีก็เป็นห่วงไปซื้อที่วัดความดันมาวัด ตื่นเช้าก็วัด สายๆ หน่อยก็วัด เที่ยงก็วัด เพื่อจะลองดูว่าความดันมันสวิงมั๊ย ก็ได้ประมาณ 135-140

ผ่านไป 1 อาทิตย์ (36 สัปดาห์) หมอก็นัดติดตามอาการ พอไปวันที่คลีนิก หมอก็ว่าเราความดันสูงอยากให้รีบผ่าเลย ไม่อยากให้ไว้นาน เนื่องจากความดันสูง เดี๋ยวครรภ์เป็นพิษจะเป็นอันตรายทั้งแม่ทั้งลูก เราก็กลัวว่าลูกจะยังไม่แข็งแรง ก็อยากจะยื้อ ต่อ ก็ถามหมอว่า แล้วลูกสมบูรณ์ดี แข็งแรงพอแล้วเหรอคะ เราบอกหมอว่าเป็นห่วงลูก หมอก็บอกว่า 'ผมน่ะ เป็นห่วงทั้งแม่ทั้งลูก เมื่อวานผมเจอเคส แบบนี้แหละ แม่เข้า ICU นะรู้มั๊ย มันไม่คุ้มกันหรอก คุณไม่รู้ว่ามันอันตรายขนาดไหน' (เออ! ค่ะ หมอ เรามันก็ไม่รู้จริงๆ เพราะเราก็รู้สึกปกติสุดๆ อยากรอให้ถึงกำหนดคลอดด้วยซ้ำ กำหนดคลอด 1/1/2011) แล้วหมอก็บอกว่า เมียผมน่ะ คลอดลูกออกมาหนักแค่ 2.6 KG (ประมาณนี้แหละมั๊ง เราก็จำไม่ถนัด แต่ไม่ถึง 3 KG) นี่ลูกคุณหนักตั้ง 3 KG ตั้งแต่ 35 สัปดาห์ นัดผ่าได้แล้ว

เอาวะ ผ่าก็ผ่า เราก็ชวนสามีไปดูฤกษ์ ที่น่ำเอี๊ยง ซินแส ก็ให้ฤกษ์ มา 4 วัน เราก็เลือกเอาวันจันทร์ที่ 13 ธันวาคม 2510 ฤกษ์ตั้งแต่ 6.59 - 9.59 ก็บอกหมอไป เราก็เลือกคลอดที่ BNH เพราะเพื่อนคลอดที่นี่แล้วว่าดี และสนันสนุนให้เลี้ยงลูกด้วยนมแม่ด้วย

ก่อนไปโรงพยาบาล สังเกต ท้องใหญ่มาก

ถึงโรงพยาบาลแล้วก่อนนอน ต้องเก็บปัสสาวะไปตรวจ นัดผ่าพรุ่งนี้ 7 โมงเช้า

บรรยากาศในห้องพัก

โต๊ะทานข้าว

ซิงค์ล้างจาน ตู้เย็น ตู้เสื้อผ้า ฝั่งตรงข้ามเป็นห้องน้ำ

นี่เป็นห้องในแพ็คเก็จเลย เราเลือกแพ็คเก็จผ่าคลอดก็ 55,000.- นอน 3 คืน 4 วัน ไม่นับวันที่รอผ่าอีก 1 คืนก็คือคืนนี้ เพราะเราผ่าเช้า ก็ได้นอนฟรี 1 คืน เช้าก็เข้าห้องผ่าเลย








วันศุกร์ที่ 28 สิงหาคม พ.ศ. 2552

เพิ่ม Void กับ Reverse ให้กับ Invoice Batch ของ BAN-PAN ERP

แก้ไขที่ไฟล์ DocumentEngine.java ที่ base\src\org\compiere\process\
บรรทัดที่ 963

/******************** * Invoice */
else if (AD_Table_ID == MInvoice.Table_ID AD_Table_ID == MInvBatch.Table_ID) {
if (docStatus.equals(DocumentEngine.STATUS_Completed)) {
options[index++] = DocumentEngine.ACTION_Void;
options[index++] = DocumentEngine.ACTION_Reverse_Correct;
}
}


ทำให้ข้อความที่แสดงข้างล่างของหน้า Order และ Invoice มีการแสดงค่าภาษี

To คุณเหมย เรื่อง : แก้ไข Source Code วันที่ 26/8/52
ปัญหาที่แก้ไข : ทำให้ข้อความที่แสดงข้างล่างของหน้า Order และ Invoice มีการแสดงค่าภาษี

วิธีการแก้:

1. แก้ไขไฟล์ Gridtab.java ใน org.compiere.model

2. ต้องแก้ Message ในระบบ Adempiere ด้วย เพื่อให้รับค่าไปแสดงได้ถูกต้อง โดยค้นหา Key ชื่อ "OrderSummary" แล้วแก้ MessageText เป็น{0} Line(s) - {1,number,#,##0.00} - Tax: {5,number,#,##0.00} - Total: {2,number,#,##0.00} {3} = {4,number,#,##0.00}

3. แก้ส่วนของ Tab "Translation" ภาษาไทยให้เหมือนกันด้วย{0} รายการ - {1,number,#,##0.00} - ภาษี: {5,number,#,##0.00} - ทั้งหมด: {2,number,#,##0.00} {3} = {4,number,#,##0.00}

เวท

ผู้ Contribute คือ คุณเวทค่ะ ขอขอบคุณค่ะ

วันอาทิตย์ที่ 9 สิงหาคม พ.ศ. 2552

Update isDelivered in C_Oder

ขณะนี้ Adempiere 3.5.3a ไม่สนับสนุนเรื่อง isDelivered เนื่องจาก เมื่อมีการนำสินค้ามาส่งแล้ว ยังไม่มีการมาอัพเดทสถานะของ isDelivered ใน C_Order เลย เราจึงทำการแก้ไขดังนี้ โดยเพิ่มฟังกซ์ ชั่นเข้าไปเช็คค่าใน C_OrderLine ว่าถ้า QtyDelivered == QtyOdered แล้ว ให้อัพเดทสถานะ isDelivered เป็น Y

/** * Update isDelivered
* @return true if header updated
*/
private boolean updateIsDelivered() {

String sql = "SELECT COALESCE(SUM(QtyDelivered),0) as QtyDelivered, COALESCE(SUM(QtyOrdered),0) as QtyOrdered " +
" FROM C_OrderLine il WHERE i.C_Order_ID=" + getC_Order_ID();

Boolean isDelivered = false;

try {
PreparedStatement pstmt = DB.prepareStatement(sql, null);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) { //
BigDecimal QtyDelivered = rs.getBigDecimal("QtyDelivered");
BigDecimal QtyOrdered = rs.getBigDecimal("QtyOrdered");
if (QtyDelivered.subtract(QtyOrdered) == Env.ZERO) {
isDelivered = true;
}
}
rs.close();
pstmt.close();
}
catch (SQLException e) {
log.log(Level.SEVERE, sql, e);
return false;
}

if (isDelivered) {
sql = "UPDATE C_Order SET isDelivered = 'Y' WHERE C_Order_ID = " +
getC_Order_ID();
int no = DB.executeUpdate(sql, get_TrxName());
}
return true;


}

วันอังคารที่ 7 กรกฎาคม พ.ศ. 2552

java.lang.NullPointerException at org.compiere.model.MOrderLine.(MOrderLine.java:134)

===========> MTable.getPO: (id) - Table=C_OrderLine,Class=class org.compiere.model.MOrderLine [11]java.lang.NullPointerException at org.compiere.model.MOrderLine.(MOrderLine.java:134) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:494) at org.compiere.model.MTable.getPO(MTable.java:517) at org.compiere.model.GridTable.dataSavePO(GridTable.java:1735) at org.compiere.model.GridTable.dataSave(GridTable.java:1166) at org.compiere.model.GridTab.dataSave(GridTab.java:864) at org.compiere.apps.APanel.cmd_save(APanel.java:1927) at org.compiere.apps.APanel.actionPerformed(APanel.java:1583) at org.compiere.apps.AppsAction.actionPerformed(AppsAction.java:281) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:231) at java.awt.Component.processMouseEvent(Component.java:5517) at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)


แก้ไข: ที่ source code ไปดูที่ MOrderLine.java บรรทัดที่ 134 ว่า NullPointerException เพราะเหตุใด
เมื่อไปดูจะพบ
setDateOrdered (m_parent.getDateOrdered());

สาเหตุน่าจะมาจาก m_parent มีค่าเป็น null ณ ขณะที่ถูกเรียกใช้

ให้ทำการแก้ไข code โดย comment code เดิมไว้ และแก้ไขเป็นดังนี้
// Fixed: NullPointerException 090702 Sureeraya.
// setDateOrdered (m_parent.getDateOrdered());
setDateOrdered (getParent().getDateOrdered());

หน้าจอ [MK-SO-02] รายการราคาไม่แสดง เลือกไม่ได้ ทั้งๆ ที่กำหนดรายการราคาไว้มากมาย

Window [MK-SO-02] , Tab Sale Order, Field M_PriceList_ID can not select any PriceList

Fixed: In Table C_Order, Column M_PriceList_ID. It has reference to M_PriceList and dynamic reference is 'M_PriceList is SO/PO'

M_PriceList is SO/PO
From:
M_PriceList.IsSOPriceList = '@IsSOTrx@' and M_PriceList.AD_Org_ID=@AD_Org_ID@

To:
M_PriceList.IsSOPriceList = '@IsSOTrx@' and (M_PriceList.AD_Org_ID=@AD_Org_ID@ or M_PriceList.AD_Org_ID=0)

สาเหตุที่หน้าจอ Sale Order [MK-SO-02] นี้ไม่เป็นรายการราคา สำหรับบาง Organization นั่นก็เนื่องมาจาก เดิม M_PriceList is SO/PO นั้นได้มีการสร้างเงื่อนไขไว้ว่า PriceList ที่จะแสดงได้ต้องมีค่า IsSOTrx ตามหน้าจอ เช่นที่หน้าจอ ซื้อ ก็จะแสดงแต่ PriceList ที่เป็น 'ซื้อ' หรือ ที่หน้าจอขาย ก็จะแสดงเฉพาะที่ PriceList ขาย นั่นเอง ต่อมาก็จะไปเจอเงื่อนไขว่าและต้องเป็น PriceList ของ Organization นั้นๆ ด้วย จึงจะแสดง สำหรับเงื่อนไขนี้ถามว่ากำหนดค่าไว้ในตอนแรกผิดมั๊ย คำตอบคือ ไม่ผิดค่ะ
แล้วทำอย่างไรให้รายการราคาที่กำหนดไว้มาแสดง สามารถทำได้ง่ายๆ ก็คือ ที่หน้าจอ PriceList ที่ฟิลด์หน่วยงาน แทนที่จะกำหนดเป็น * ให้กำหนดเป็น ค่าของหน่วงงานแต่ละหน่วยงานไป ผลก็คือ หน่วยงานหนึ่งๆ จะต้องมีอย่างน้อย 1 PriceList

ส่วนที่แก้ไปสามารถอธิบายได้ง่ายๆ คือ ให้เช็คเพิ่มด้วยว่า ถ้าเป็น PriceList ทีกำหนดให้เป็นของ * ให้แสดงด้วย เนื่องจากการกำหนดค่าใดๆ ในระบบหากกำหนดที่หน่วยงานให้เป็นระดับ * แสดงว่าเราต้องการแชร์ข้อมูล คือให้ข้อมูลเป็นข้อมูลระดับ Client ไม่ได้เป็นของหน่วยงานใดหน่วยงานหนึ่ง และต้องการให้ทุกหน่วยงานเห็นข้อมูลนี้

คำถามถัดมา อาจมีคนสงสัยต่ออีกว่าแล้วระบบรู้ได้ไง ว่าหน้าจอนี้เป็นหน้าจอซื้อ หรือหน้าจอขาย มีตรงไหนระบุไว้หรือ
คำตอบก็คือ มีค่ะ ถ้าคนที่ศึกษา Adempiere หรือ Compiere มาระดับหนึ่ง จะต้องรู้จัก Application Dictionary อย่างแน่นอน
ที่นี่เป็นที่รวบรวมการกำหนดค่าต่างๆ ของระบบไว้ทั้งหมด ทั้งที่เกี่ยวข้องกับฐานข้อมูล และหน้าจอ รายงาน .... (เริ่มนอกเรื่อง) ในส่วนของ Window, Tab and Field จะมีให้กำหนดว่า หน้าจอที่เราสร้างขึ้นนี้เป็นหน้าจอ แบบไหน เป็นหน้าจอเกี่ยวกับการขายหรือไม่ คือว่าง่ายๆ ที่นี่จะมีการกำหนดค่าให้กับตัวแปร IsSOTrx ถ้าเป็น 'Y' ก็แสดงว่าหน้าจอนี้ฉันจะให้เป็นหน้าจอที่ทำรายการเกี่ยวกับการขายนะจ๊ะ แค่นี้ค่ะ