Passing of BOOLEAN parameters to PL/SQL stored procedures

ปัญหาเกิดจาก function ใน oracle ที่เขียนขึ้นมานั้น มี parameter type เป็น boolean แต่ JDBC ไม่ support การส่งค่าแบบ boolean ไปใน function ถ้าทดลองส่งไปจะเกิด exception ประมาณนี้

java.sql.SQLException: ORA-06550: line 1, column 13:
PLS-00306: wrong number or types of arguments in call to 'FN_TEST'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
	at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:218)

วิธีการแก้ปัญหาก็บ้านๆ มากครับ สร้าง function ที่รับ parameter ที่ไม่ใช่ boolean มาแล้ว ไปเรียก function ที่ต้องส่ง boolean เข้าไปอีกที่ ประมาณนี้

CREATE OR REPLACE FUNCTION boolFunc(x boolean)
RETURN VARCHAR2 AS
BEGIN
	//code 
	return "OK";
END;

CREATE OR REPLACE FUNCTION boolwrap(x int)
RETURN VARCHAR2 AS
BEGIN
	IF (x=1) THEN
	  return boolFunc(TRUE);
	ELSE
	  return boolFunc(FALSE);
	END IF;
END;

เวลาเรียกใช้งานก็ เรียก function boolwrap แทนที่ boolFunc

แหล้งข้อมูล
http://docs.oracle.com/cd/B19306_01/java.102/b14355/apxtblsh.htm#i1005380

JSF : java.lang.IllegalStateException: Cannot create a session after the response has been committed

เจอปัญหาในการใช้งาน JSF 2.1 และ RichFace 4.2 แล้วเกิดข้อผิดพลาดดังนี้

Jun 26, 2012 5:25:56 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/index.xhtml]
java.lang.IllegalStateException: Cannot create a session after the response has been committed
	at org.apache.catalina.connector.Request.doGetSession(Request.java:2754)
	at org.apache.catalina.connector.Request.getSession(Request.java:2264)
	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:899)
	at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155)
	at javax.faces.context.ExternalContextWrapper.getSession(ExternalContextWrapper.java:396)
	at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175)
	at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122)
	at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166)

ซึ่งในหน้า index.xhtml มี code ประมาณนี้

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets" 
                xmlns:rich="http://richfaces.org/rich" 
                template="/templates/index.xhtml">
    
    <ui:define name="title">RichFaces Sample</ui:define>
    <ui:define name="body">
        <h:panelGrid columns="1" columnClasses="cols" width="300">
            <h:form>
                <rich:panelMenu style="width:300px;" 
                                groupMode="client"
                                groupExpandedLeftIcon="triangleUp"
                                groupCollapsedLeftIcon="triangleDown" 
                                topGroupExpandedRightIcon="chevronUp"
                                topGroupCollapsedRightIcon="chevronDown" 
                                itemLeftIcon="grid">                    

                    <rich:panelMenuGroup label="Rich In Action">
                        <rich:panelMenuItem label="rich:popupPanel" action="rich/popup"/>
                        <rich:panelMenuItem label="rich:popupPanel [action]" action="rich/popup_action"/>
                        <rich:panelMenuItem label="rich:fileUpload" action="rich/upload"/>                        
                    </rich:panelMenuGroup>
                    <rich:panelMenuGroup label="Full Example">
                        <rich:panelMenuItem label="Full Example" action="rich/full-example"/>
                        <rich:panelMenuItem label="Converter" action="jsf/converter"/>
                        <rich:panelMenuItem label="Order Car" action="jsf/order-car"/>
                    </rich:panelMenuGroup>                      
                </rich:panelMenu>
            </h:form>
        </h:panelGrid>       
    </ui:define>    
</ui:composition>

ตอนแรกสงสัยว่าเกิดจาก ManageBean ไม่ได้ implement Serializable หรือเปล่าลองแก้แล้วก็ไม่หาย ลองลบ ออกแล้วรันใหม่ไม่เกิดข้อผิดพลาด สรุปว่่าปัญหาเกิดจาก จากการสอบถามข้อมูลจาก google ได้ความว่า ถ้ามีการใช้งาน PhaseListener จะเกิดข้อผิดพลาดแบบนี้ตอนเปิดใช้งานครั้งแรก หลังจาก start web server แล้ว วิธีแก้ไขคือ ให้ใส่

FacesContext.getCurrentInstance().getExternalContext().getSession(true);

ใน method public void beforePhase(PhaseEvent event) {} ดังนี้

public class SessionPhaseListener implements PhaseListener {
	public PhaseId getPhaseId() { 
		return PhaseId.RENDER_RESPONSE; 
	}
	public void afterPhase(PhaseEvent event) {
		//Implement
	}
 
	public void beforePhase(PhaseEvent event) {
		// we need to ask for the session early
		FacesContext.getCurrentInstance().getExternalContext().getSession(true);
	}
}

ลอง start server ใหม่อีกครั้งหายเป็นปลิดทิ้งๆๆๆๆๆๆ

แหล่งข้อมูล
[Richfaces 4] rich:panelMenu triggers IllegalStateException: Cannot create a session after the response has been committed

CSS page break

กำลังหา code css มาจัดการการขึ้นหน้าใหม่เวลาที่ต้องการโดยข้อมูลไม่จำเป็นต้องเต็มหน้าก่อน ค้นไปเจอบทความของคุณ Rux’s ดังโค๊ดข้างล่างนี้

<html>
<head>
<title>Print with page break</title>
<style type="text/css">
@media all{
  .page-break  { display:none; }
}
 
@media print{
  .page-break  { display:block; page-break-before:always; }
}
</style>
</head>
<body>
    <h1>Page1</h1>
    <div class="page-break" ></div>
    <h1>Page2</h1>
    <div class="page-break" ></div>
    <h1>Page3</h1>
</body>
</html>

แหล่งข้อมูล
http://www.ruxcom.com/css-page-break

RichFaces : Component ID _viewRoot:status has already been found in the view.

ทดลองใช้ RichFaces แล้วต้องการให้แสดงสถานะแจ้งว่ากำลังทำงานอยู่ (Process Dialog) ซึ่งใน RichFaces นั้นมี Tag

<a4j:status />

ให้ใช้งานอยู่แล้ว เลยทดลองดังนี้

<a4j:status onstart="{Richfaces.showModalPanel('process-wait')};"
    onstop="{Richfaces.hideModalPanel('process-wait')};" />
<rich:modalPanel id="process-wait" width="250" height="100">
	<f:facet name="header">
		<h:outputText value="Processing" />
	</f:facet>
	<div align="center">
		<h:outputText value="Processing please wait..." /> <br>
	</div>
</rich:modalPanel>

พอทดลองรันแล้วเกิด Error ดังนี้

java.lang.IllegalStateException: Component ID _viewRoot:status has already been found in the view.  
	at com.sun.faces.util.Util.checkIdUniqueness(Util.java:724)
	at com.sun.faces.util.Util.checkIdUniqueness(Util.java:708)
	at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:129)
	at javax.faces.application.StateManager.saveSerializedView(StateManager.java:183)
	-
	-

Error ที่เกิดขึ้นเนื่องจากในหน้าจอ หรือ page นี้มีการใช้ tag จะไม่สามารถใช้ได้อีก วิธีการแก้ไข
1. ลบ Tag ที่ซ้ำออกแล้วสามารถใช้งานได้เลย
2. manual เปิด dialog เองในปุ่มที่ต้องการให้แสดง เช่น

<a4j:commandButton id="bt-action"
	value="Save" action="#{example.save}"
	onclick="{Richfaces.showModalPanel('process-wait')};"
	oncomplete="{Richfaces.hideModalPanel('process-wait')};" />

Update : 08/05/2012 สามารถใช้ tag หลายๆตัวในหน้าเดียวกันอ้างอิงจาก RichFaces Status โดยระบุ attribute “for” และกำหนด tag ครอบส่วนที่ต้องการให้เรียกใช้ เช่น

<a4j:region id="xx-yy">
     <a4j:commandButton id="bt-action"
	 value="Save" action="#{example.save}" />
</a4j:region>

<a4j:status for="xx-yy" onstart="{Richfaces.showModalPanel('id-here')};"
	onstop="{Richfaces.hideModalPanel('id-here')};" />

ประสบการณ์ : ThinkPad Onsite service

เนื่องจากพัดลมระบายความร้อนโน๊ตบุ๊ค เสียเลยได้โอกาสทดสอบเสียงเล่าเสียงลือการใช้บริการ onsite service ของ ThinkPad ว่าจะสมคำล่ำลือหรือไม่ ลำดับเหตุการณ์ดังนี้
0. วันที่ 16/01/2012 กลับห้องเปิดเครื่องยังไม่ตอนบูตเข้า Windows ก็เจอข้อความ “Fan Error” พร้อมเสียงปี๊บๆ แล้วเครื่องก็ปิดตัวเองไปเลย
1. วันที่ 17/01/2012 ช่วงเช้าโทรไปยัง ศูนย์ให้บริการหลังการขาย 022734088 เสียงน่ารักของ พนักงานก็ให้แจ้ง Model/Serial เล่าอาการ จากนั้นได้หมายเลข Service Code มา ใช้เวลาไปประมาณ 3 นาที
2. วันที่ 18/01/2012 ได้รับโทรศัพท์จากพนักงานซ่อมว่าจะเข้ามาซ่อมเครื่องให้ สะดวกให้ไปซ่อมที่ไหน เลยบอกช่างไปว่าเมื่อวานไม่โทรมาแจ้งก่อนเลยไม่ได้เอาเครื่องมาด้วย เลยขอเลื่อนไปวันที่ 19/01/2012
3. วันที่ 19/01/2012 เวลาประมาณ 10:30 พนักซ่อมโทรมาอีกครั้ง (แต่ไม่ใช่คนเมื่อวาน) ต้องอธิบายสถานที่นัดเจอกันใหม่อีกรอบ จากนั้นอีกประมาณ 20 นาทีพนักงานซ่อมก็มาถึง จัดการถอดชิ้นส่วนต่างๆ และทำการเปลี่ยนพัมลมระบายความร้อน ซึ่งทั้งหมดใช้เวลาไปประมาณ 20 นาที เป็นอันเสร็จงาน

ช่างกำลังจัดการถอดชิ้นส่วนน้องดำ


ชิ้นส่วนที่ต้องเปลี่ยน


เป็นการจบงานได้ในระยะเวลาประมาณ 3 วัน ถ้าส่งซ่อมศูนย์เองอาจใช้เวลาแค่ 1-2 วันแต่สำหรับมนุษย์เงินเดือนผู้ไม่ว่างงานแบบผม ถือว่าประทับใจบริการ onsite service ในระดับดี ระบบการตรวจสอบประกันของ Lenovo Thinkpad เองก็ดีไม่ต้องใช้เอกสารอะไรเลยสามารถตรวจสอบได้จากเว็บโดยตรง พนักงานไม่ถามหาใบเสร็จ

ป.ล ถ้าท่านซื้อเครื่องมาจากต่างประเทศ หรือ เครื่องหิ้ว เวลารับบริการจะต้องใช้ใบเสร็จแสดงที่มาของสิ้นค้า และไม่มีบริการ onsite สำหรับเครื่องนอก ต้องส่งศูนย์อย่างเดียว ศึกษาข้อมูลเพิ่มเติมได้จาก www.thaithinkpad.com