SCHEMA smarmotech DEFINE id int DEFINE datos DYNAMIC ARRAY OF RECORD ano SMALLINT, nombre_Vend CHAR (10), parentId STRING, id STRING, hasChildren BOOLEAN END RECORD MAIN OPEN FORM f FROM "test" DISPLAY form f CALL nodo1(id) DISPLAY ARRAY datos TO sdatos.* ATTRIBUTE(UNBUFFERED) ON EXPAND(ID) CALL nodo1(id) END DISPLAY END MAIN FUNCTION nodo1(p) DEFINE p INT DEFINE NAME, parentId STRING DEFINE i INT CONNECT TO "smarmotech" USER "jsoto" USING "12345" IF p == 0 THEN LET parentId = 0 DECLARE busca1 CURSOR FOR SELECT UNIQUE a.ano FROM prdtable a WHERE a.ano in (2008,2009) LET p = 1 FOREACH busca1 INTO datos[p].ano LET p = p + 1 CALL datos.insertElement(p) LET id = parentId || "." || i LET datos[p].id = id LET datos[p].parentId = parentId LET i = 2 DECLARE busca_m CURSOR FOR SELECT UNIQUE a.mes FROM prdtable a WHERE a.ano = datos[p].ano FOREACH busca_m INTO datos[i].nombre_vend IF i MOD 2 THEN LET datos[p].hasChildren = TRUE ELSE LET datos[p].hasChildren = FALSE END IF LET i = i + 1 END FOREACH END FOREACH ELSE LET parentId = datos[p].id LET NAME = "mESES" END IF END FUNCTION FUNCTION contraer() DEFINE p INT LET p = 1 WHILE p < datos.getLength() CALL collapse(p) LET p = p + 1 END WHILE END FUNCTION FUNCTION collapse(p) DEFINE p INT DEFINE id STRING LET id = datos[p].id WHILE p < datos.getLength() IF datos[p + 1].parentId <> id THEN EXIT WHILE END IF CALL collapse(p + 1) CALL datos.deleteElement(p + 1) END WHILE END FUNCTION