Posted on Sunday, January 23, 2011 Adding help text to column headings in a tabular form Category APEX Tips and Tricks There is no out of the box solution for adding help text to column headings in a tabular form. One way is create custom table where you store your help text. Then modify/copy report template and add JavaScript that fetch using Ajax call help text for your column. In report template I did change Column Heading Template to be: <th id="#COLUMN_HEADER_NAME#" onmouseover="getColumnHelp(event,this,'#COLUMN_HEADER_NAME#')">#COLUMN_HEADER#</th> Then I did add to After Rows: <script type="text/javascript"> function getColumnHelp(pEvent,pThis,pColumn){ var ajaxRequest = new htmldb_Get(null, $v('pFlowId'), 'APPLICATION_PROCESS=GET_REPORT_HELP', 0); ajaxRequest.addParam('x01', pColumn); ajaxRequest.addParam('x02', '#REGION_ID#'); var ajaxResponse = ajaxRequest.get(); ajaxRequest = null; toolTip_enable(pEvent,pThis,ajaxResponse); } </script> And then on demand process GET_REPORT_HELP DECLARE l_help_text VARCHAR2(255); BEGIN SELECT help_text INTO l_help_text FROM DEMO_REPORT_COL_HELP WHERE COLUMN_HEADER_NAME = APEX_APPLICATION.G_x01 AND REGION_ID = APEX_APPLICATION.G_x02 ; htp.prn( REPLACE(REPLACE(l_help_text, chr(10), '\f'), chr(13)) ); EXCEPTION WHEN NO_DATA_FOUND THEN htp.prn('No help available for this item'); END; This is my custom help text table DLL: CREATE TABLE "DEMO_REPORT_COL_HELP" ( "ID" NUMBER NOT NULL ENABLE, "COLUMN_HEADER_NAME" VARCHAR2(30 BYTE) NOT NULL ENABLE, "REGION_ID" VARCHAR2(20 BYTE) NOT NULL ENABLE, "HELP_TEXT" VARCHAR2(255 BYTE), "RESERVED2" VARCHAR2(20 BYTE), "RESERVED3" VARCHAR2(20 BYTE), "RESERVED4" VARCHAR2(20 BYTE), "RESERVED5" VARCHAR2(20 BYTE), "CREATED_ON" DATE NOT NULL ENABLE, "CREATED_BY" VARCHAR2(255 BYTE) NOT NULL ENABLE, "CHANGED_ON" DATE, "CHANGED_BY" VARCHAR2(20 BYTE), CONSTRAINT "DEMO_REPORT_COL_HELP_PK" PRIMARY KEY ("ID")); And trigger for it: create or replace TRIGGER "BIU_DEMO_REPORT_COL_HELP" before INSERT OR UPDATE ON "DEMO_REPORT_COL_HELP" FOR EACH row BEGIN IF inserting THEN IF :NEW.ID IS NULL THEN SELECT TO_NUMBER(SYS_GUID(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') INTO :NEW.ID FROM DUAL; END IF; :NEW.CREATED_ON := sysdate; :NEW.CREATED_BY := NVL(v('APP_USER'),user); :NEW.CHANGED_ON := null; :NEW.CHANGED_BY := null; END IF; IF updating THEN :NEW.CHANGED_ON := sysdate; :NEW.CHANGED_BY := NVL(v('APP_USER'),user); END IF; END;