Try OpenEdge Now
skip to main content
ABL Reference
ABL Syntax Reference : CREATE TEMP-TABLE statement
 

CREATE TEMP-TABLE statement

Creates a TEMP-TABLE dynamically at run time. The TEMP-TABLE that is created is empty and must be defined using ADD/CREATE methods.

Syntax

CREATE TEMP-TABLE handle
[ IN WIDGET-POOL widget-pool-name ]
handle
A variable of type HANDLE that represents the handle of the TEMP-TABLE object.
IN WIDGET-POOL widget-pool-name
An expression of type CHARACTER that evaluates, at run time, to the name of the widget pool that contains the dynamic TEMP-TABLE.
Note: Widget pool names are not case-sensitive.

Note

You can collect run-time statistics about usage of temp-tables in an ABL session. For more information on collecting statistics for temp-table usage, see OpenEdge Development: Debugging and Troubleshooting.

Example

The following example creates a TEMP-TABLE like the Order table and populates it from the Order table. In addition, the corresponding SalesRep name is added from the SalesRep table, as shown:
r-cretmpt.p
DEFINE VARIABLE tth          AS HANDLE NO-UNDO.
DEFINE VARIABLE bh           AS HANDLE NO-UNDO.
DEFINE VARIABLE qh           AS HANDLE NO-UNDO.
DEFINE VARIABLE buf-ord-hndl AS HANDLE NO-UNDO.
DEFINE VARIABLE buf-rep-hndl AS HANDLE NO-UNDO.
DEFINE VARIABLE fld1         AS HANDLE NO-UNDO.
DEFINE VARIABLE fld2         AS HANDLE NO-UNDO.

/* Get database table handles */
buf-ord-hndl = BUFFER Order:HANDLE.
buf-rep-hndl = BUFFER SalesRep:HANDLE.

/* Create an empty, undefined TEMP-TABLE */
CREATE TEMP-TABLE tth.
/* Give it Order table's fields & indexes */
tth:CREATE-LIKE(buf-ord-hndl).
/* Add field like SalesRep.RepName */
tth:ADD-LIKE-FIELD("RepName","SalesRep.RepName").
/* No more fields will be added */
tth:TEMP-TABLE-PREPARE("ordx").

/* Get the buffer handle for the temp-table */
bh = tth:DEFAULT-BUFFER-HANDLE.

/* Populate the temp-table from order */
FOR EACH Order NO-LOCK:
  bh:BUFFER-CREATE.
  bh:BUFFER-COPY(buf-ord-hndl).
  /* Add the corresponding salesrep name */
  FIND SalesRep NO-LOCK WHERE SalesRep.SalesRep = Order.SalesRep NO-ERROR.
  IF AVAILABLE SalesRep THEN
    bh:BUFFER-COPY(buf-rep-hndl,?,"RepName,repname").
END.

/* Run a query to access the TEMP-TABLE */
CREATE QUERY qh.
qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("FOR EACH ordx WHERE ordx.OrderNum < 50 BY ordx.RepName").
qh:QUERY-OPEN().

fld1 = bh:BUFFER-FIELD("OrderNum").
fld2 = bh:BUFFER-FIELD("RepName").

/* Display the order number and the salesrep name */
REPEAT:
  qh:GET-NEXT().
  IF qh:QUERY-OFF-END THEN LEAVE.
  DISPLAY fld1:BUFFER-VALUE() FORMAT "X(10)".
  DISPLAY fld2:BUFFER-VALUE() FORMAT "X(20)".
END.

qh:QUERY-CLOSE().
bh:BUFFER-RELEASE().
DELETE OBJECT tth.
DELETE OBJECT qh.

Notes

*Once the TEMP-TABLE fields and indexes are defined using the ADD/CREATE methods, the definition must be terminated by using the TEMP-TABLE-PREPARE method before the TEMP-TABLE can be used.
*You can set the before-table-exp parameter to TRUE in the TEMP-TABLE-PREPARE method to explicitly create a before-table for a dynamic temp-table. See the TEMP-TABLE-PREPARE method entry for more information.
*Once the TEMP-TABLE is prepared, it can be manipulated by using its buffer object handle which is retrieved using the DEFAULT-BUFFER-HANDLE attribute. All the BUFFER methods are available to the dynamic TEMP-TABLE.
*The dynamic temp-table object is scoped like the buffer object. It is created in a widget pool and ends when the widget pool ends or when it is deleted with the DELETE OBJECT statement. You may not delete the default buffer object belonging to a dynamic temp-table.
*Errors for dynamic temp-tables do not automatically raise the ERROR condition since they occur inside a widget expression. All the methods that can have errors return FALSE if an error occurs, so they must be tested. If NO-ERROR is in effect in the statement containing the widget reference, no messages display, but they can be retrieved from the ERROR-STATUS system handle.

See also

DEFINE TEMP-TABLE statement, TEMP-TABLE-PREPARE( ) method