Example 3: DISPLAY ARRAY using modification triggers
Database table definition:
CREATE TABLE customer
(
id INTEGER NOT NULL PRIMARY KEY,
fname VARCHAR(50),
lname VARCHAR(50) NOT NULL
);
INSERT INTO customer VALUES ( 101, "John", "Calagan" );
INSERT INTO customer VALUES ( 102, "Mike", "Torn" );
INSERT INTO customer VALUES ( 103, "Omer", "Winston" );
The "shop.sch" schema file:
customer^id^258^4^1^
customer^fname^13^50^2^
customer^lname^269^50^3^
Form definition file
"custlist.per":
SCHEMA shop
LAYOUT
TABLE
{
Id Name LastName
[f001 |f002 |f003 ]
[f001 |f002 |f003 ]
[f001 |f002 |f003 ]
[f001 |f002 |f003 ]
[f001 |f002 |f003 ]
[f001 |f002 |f003 ]
}
END
END
TABLES
customer
END
ATTRIBUTES
f001 = customer.id;
f002 = customer.fname;
f003 = customer.lname;
END
INSTRUCTIONS
SCREEN RECORD srec(customer.*);
END
Program source code:
SCHEMA shop
TYPE t_cust RECORD LIKE customer.*
MAIN
DEFINE arr DYNAMIC ARRAY OF t_cust
DEFINE rec t_cust
DEFINE x INTEGER
DATABASE test1 --shop
OPEN FORM f1 FROM "custlist"
DISPLAY FORM f1
DECLARE c1 CURSOR FOR SELECT id, fname, lname FROM customer
LET x = 0
FOREACH c1 INTO rec.*
LET arr[x:=x+1] = rec
END FOREACH
DISPLAY ARRAY arr TO srec.* ATTRIBUTES(UNBUFFERED,DOUBLECLICK=update)
ON UPDATE
LET rec = arr[arr_curr()]
IF input_cust(FALSE, scr_line(), rec) THEN
LET arr[arr_curr()] = rec
END IF
ON INSERT
LET rec = arr[arr_curr()]
IF input_cust(TRUE, scr_line(), rec) THEN
LET arr[arr_curr()] = rec
END IF
ON APPEND
LET rec = arr[arr_curr()]
IF input_cust(TRUE, scr_line(), rec) THEN
LET arr[arr_curr()] = rec
END IF
ON DELETE
MENU "Delete" ATTRIBUTES(STYLE="dialog",
COMMENT="Do you want to delete the current row?")
COMMAND "Yes" LET int_flag = FALSE
COMMAND "No" LET int_flag = TRUE
END MENU
END DISPLAY
END MAIN
PRIVATE FUNCTION input_cust(
new_row BOOLEAN,
scr_line INTEGER,
rec t_cust INOUT
) RETURNS BOOLEAN
LET int_flag = FALSE
INPUT rec.* FROM srec[scr_line].* ATTRIBUTES(WITHOUT DEFAULTS)
BEFORE INPUT
CALL DIALOG.setFieldActive("srec.id",new_row)
END INPUT
RETURN (NOT int_flag)
END FUNCTION