Creates a record in a table, sets all the fields in the record to their default initial values, and moves a copy of the record to the record buffer.
CREATE record [ FOR TENANT tenant-expression ] [ USING { ROWID ( nrow ) | RECID ( nrec ) } ] [ NO-ERROR ] |
To create a record in a table defined for multiple databases, you might have to qualify the record's table name with the database name. See the record definition in the Record phrase reference entry for more information.
If the user has a regular-tenant connection identity, and you specify this option, tenant-expression must match the tenancy of the connection identity. Otherwise, the statement raises ERROR.
If tenant-expression evaluates to an integer, the value must be a valid tenant ID for a regular tenant or zero (0) for the default tenant. If tenant-expression evaluates to a character string, the value must be a valid tenant name for a regular or "Default" for the default tenant. Otherwise, the statement raises ERROR.
If record belongs to a table that is not multi-tenant enabled, ABL raises a compiler error.
The following example creates a record in the order file for each pass through the loop and then updates the record. It also creates an order-line record.
r-create.p
REPEAT: CREATE Order. UPDATE Order.OrderNum Order.CustNum VALIDATE(CAN-FIND(Customer OF Order), "Customer does not exist") Order.CustNum Order.OrderDate. REPEAT: CREATE OrderLine. OrderLine.OrderNum = Order.OrderNnum. UPDATE OrderLine.LineNum OrderLine.ItemNum VALIDATE(CAN-FIND(Item OF OrderLine), "Item does not exist") OrderLine.Qty OrderLine.Price. END. END. |
This procedure adds Orders and OrderLines to the database. Because the user supplies an order number when updating the order record, that order number is assigned (=) to the OrderNum field of the OrderLine record when the OrderLine record is created.
Suppose you have an Order table partitioned on OrderDate, but with a global index on OrderNum. If OrderDate has an initial value of the Unknown value (?), the following code will produce an error:
After the assignment of the OrderNum field, the AVM will try to index the new OrderNum in the OrderNum global index. To do that, it needs the partition of the new Order record. To get the partition, the AVM needs to use the partition column OrderDate, which is still the Unknown value (?). This will produce an error message stating that OrderDate is not in any defined partition. You can fix this by reversing the order of the assignments, grouping the statements into one ASSIGN statement, or setting an initial value for the OrderDate column. If you use one ASSIGN statement, the actual create of the record won't occur until after all the specified field assignments are gathered. Therefore the OrderDate column will already have the correct value by the time the partition for the new record needs to be determined.