Фрейм, отображающий только последнюю запись в таблице

Надеюсь, это будет мой последний вопрос на некоторое время. Я знаю, что особо нечего сказать о возможностях пользовательского интерфейса Progress, но у меня возникла очень странная проблема с отображением во фрейме.

Вот некоторый псевдокод, который поможет вам понять проблему:

DEF TEMP-TABLE tMainTable.
DEF TEMP-TABLE tPage LIKE tMainTable.
DEF VAR iCursor AS INT.

/* SOME INPUT DETECTION */
/*  Moving the cursor   */

FIND FIRST tMainTable WHERE tMainTable.UniqueId EQ iCursor.
DO i = 1 TO iMaxPageSize:
    CREATE tPage.
    BUFFER-COPY tMainTable TO tPage.
END.

/* DISPLAY */
FOR EACH tPage:
    DISPLAY tPage.iNumber tPage.Name.
END.

Это основы программы. Теперь желаемый вывод будет иметь FRAME, отображающий их, заканчивающийся прямо под последней записью. В настоящее время, используя FRAME по умолчанию, он масштабируется до нижней части экрана терминала.

Тем не менее, когда я создаю экземпляр FRAME и меняю местами все логические доступные параметры, я могу привести его к нужному размеру, но не могу заставить его отображать записи в отдельных строках. Вместо этого он выглядит так: отображает каждую запись в одной строке, перезаписывая последнюю, поскольку всегда показывает последнюю запись в TEMP-TABLE.

Я попытался создать экземпляр FRAME «WITH iMaxPageSize DOWN», но безрезультатно. После более подробного изучения этой конкретной опции, похоже, что она доступна только для отображения нескольких полей в таблице, а не определенных полей нескольких таблиц.

Надеюсь, это имело смысл, мне действительно нужна помощь с этим.


person Tanner Sorensen    schedule 10.10.2012    source источник


Ответы (2)


Разобрался, в общей сложности у меня ушло 8 часов чтения и кодирования методом проб и ошибок.

FOR EACH tPage WITH 6 DOWN:

Было все, что мне было нужно.

Меня все еще беспокоит, что когда я создавал экземпляр FRAME, я мог заставить его отображать только одну запись, несмотря на то, что использовал его в FOR EACH.

person Tanner Sorensen    schedule 11.10.2012

вам нужно сделать что-то вроде этого - комбинация НАЙТИ / ДЕЛАТЬ не делает то, что вы думаете.

DEF TEMP-TABLE tMainTable.
DEF TEMP-TABLE tPage LIKE tMainTable.
DEF VAR iCursor AS INT.
DEF VAR i AS INT.      
i = 0.

FOR EACH tMainTable
   WHERE tMainTable.UniqueId EQ iCursor
   NO-LOCK:

   i = i + 1.
   IF i > maxpagesize THEN
      LEAVE.

   CREATE tPage.
   BUFFER-COPY tMainTable TO tPage.

END.

  /* DISPLAY */

FOR EACH tPage:
   DISPLAY tPage.iNumber tPage.Name 
      WITH DOWN.
END.
person Tim Kuehn    schedule 11.10.2012
comment
Да, я знаю, это было очень грубое обобщение моей программы на 1500 строк. Мой код итерации и построения страниц идеален, мне просто нужна помощь с отображением фрейма. Спасибо. - person Tanner Sorensen; 11.10.2012
comment
Добавляем код фрейма, используя: DEFINE FRAME f WITH DOWN 6. /* tPage имеет максимум 6 / ДЛЯ КАЖДОЙ tPage WITH FRAME f: DISPLAY / 2 поля */. КОНЕЦ. И на выходе всегда последняя запись в temp-таблице, в первой строке, и никак иначе. - person Tanner Sorensen; 11.10.2012
comment
По сути, я задаю один из двух вопросов: 1. Есть ли способ контролировать размер кадра без явного создания его экземпляра. ИЛИ 2. Почему мой явно созданный кадр отображает только одну запись (последнюю в таблице). - person Tanner Sorensen; 11.10.2012
comment
Ваш опубликованный код будет отображать только одну запись независимо от определения фрейма. Фраза «6 вниз» не работает, правильная фраза — «6 вниз». - person Tim Kuehn; 12.10.2012