Отображать динамическое количество полей - PullRequest
0 голосов
/ 29 мая 2019

Я новичок в прогрессе и пытаюсь выучить динамические запросы.В качестве Задачи, которую я дал себе, я хочу прочитать CSV-файл и создать таблицу на основе содержимого этого файла.Пока все работает, но я не могу найти способ правильно отобразить содержимое.

У меня есть временная таблица, созданная на основе ввода csv с первой строкой, являющейся столбцами или полямитаблица и все, что осталось после записи.

Field1,Field2,Field3,Field4,Fieldn...
Value1.1,Value2.1,Value3.1,Value4.1,Valuen.1...
Value1.2,Value2.2,Value3.2,Value4.2,Valuen.1...
Value1.3,Value2.3,Value3.3,Value4.3,Valuen.1...
Value1.4,Value2.4,Value3.4,Value4.4,Valuen.1...
etc...

Как правильно отобразить динамическое количество полей и их имен?
Неизвестно следующее:

  • Числополей
  • Имя полей
  • Значения записей

Следующее работает и показывает данные в нужном формате (но жестко запрограммировано):

DO WHILE qMyTable:GET-NEXT():    
    DISPLAY 
        bMyTable:BUFFER-FIELD(1):BUFFER-VALUE LABEL 'PK'
        bMyTable:BUFFER-FIELD(2):BUFFER-VALUE LABEL 'Field1'
        bMyTable:BUFFER-FIELD(3):BUFFER-VALUE LABEL 'Field2'
        bMyTable:BUFFER-FIELD(4):BUFFER-VALUE LABEL 'Field3'
        bMyTable:BUFFER-FIELD(5):BUFFER-VALUE LABEL 'Field4'
        WITH FRAME f DOWN.
        DOWN WITH FRAME f. 
END.

Я пытаюсь перебрать поля буфера, но не могу найти способ сделать это без переопределения команды DISPLAY на каждой итерации.Также я не знаю, как отобразить метки полей в виде строки заголовка.

Я ищу что-то вроде этого:

/*
This doesn't work
*/
DO WHILE qMyTable:GET-NEXT():    
    DO i = 1 to iNumFields:
        DISPLAY bMyTable:BUFFER-FIELD(i):BUFFER-VALUE LABEL cTitlerow[i].
    END. 
END.

Это будет полный код:

/*
Variables
*/
DEF VAR i AS INTEGER INITIAL 0 NO-UNDO. //Counter
DEF VAR iEntry AS INTEGER INITIAL 0 NO-UNDO. //Counter2
DEF VAR cTitleRow AS CHARACTER NO-UNDO. //Fields csv
DEF VAR cDataRow AS CHARACTER NO-UNDO. //Entries csv
DEF VAR cFieldName AS CHARACTER NO-UNDO. //Field
DEF VAR iNumFields AS INTEGER NO-UNDO. //Amount of Fields
DEF VAR iNumLines AS INTEGER NO-UNDO. //Amount of records
DEF VAR cTitleArray AS CHARACTER EXTENT NO-UNDO. //Fields Array
/*
Handles
*/
DEF VAR ttMyTable AS HANDLE NO-UNDO. //Temp table
DEF VAR bMyTable AS HANDLE NO-UNDO. //Buffer
DEF VAR qMyTable AS HANDLE NO-UNDO. //Query


INPUT FROM 'C:\Path\To\CSV\mycsv.csv'.

/*
Get first row for fields and field names
*/
IMPORT UNFORMATTED cTitleRow.
iNumFields = NUM-ENTRIES(cTitleRow) + 1. //Additional field for PK
EXTENT(cTitleArray) = iNumFields.



/* 
Dynamic table creation
*/
CREATE TEMP-TABLE ttMyTable.
ttMyTable:ADD-NEW-FIELD('PK', 'integer').
cTitleArray[1] = 'PK'.
DO i = 2 to iNumFields:
    iEntry = i - 1.
    cFieldName = ENTRY(iEntry,cTitleRow).
    ttMyTable:ADD-NEW-FIELD(cFieldName, 'character').
    cTitleArray[i] = cFieldName.
END.

/*
Adding and defining indexes
*/
ttMyTable:ADD-NEW-INDEX('idx', TRUE, TRUE).
ttMyTable:ADD-INDEX-FIELD('idx', 'PK', 'asc').
ttMyTable:TEMP-TABLE-PREPARE('myTable').

/*
Creating buffer
*/
bMyTable = ttMyTable:DEFAULT-BUFFER-HANDLE.

/*
Populating data
*/
REPEAT:
    IMPORT UNFORMATTED cDataRow.
    bMyTable:BUFFER-CREATE.
    bMyTable::pk = iNumLines.
    DO i = 2 to iNumFields:
        iEntry = i - 1.
        bMyTable:BUFFER-FIELD(i):BUFFER-VALUE = ENTRY(iEntry,cDataRow).
        bMyTable:BUFFER-FIELD(i):COLUMN-LABEL = cTitleArray[i].
        bMyTable:BUFFER-FIELD(i):LABEL = cTitleArray[i].
    END.

    iNumLines = iNumLines + 1.
END.

/* 
Creating query
*/
CREATE QUERY qMyTable.
qMyTable:SET-BUFFERS(bMyTable).
qMyTable:QUERY-PREPARE('for each myTable').
qMyTable:QUERY-OPEN().

/*
/*
This doesn't work
*/
DO WHILE qMyTable:GET-NEXT():      
    DO i = 1 to iNumFields:
        DISPLAY bMyTable:BUFFER-FIELD(i):BUFFER-VALUE.
    END.  
END.
*/


DO WHILE qMyTable:GET-NEXT():       
    DISPLAY 
        bMyTable:BUFFER-FIELD(1):BUFFER-VALUE LABEL 'PK'
        bMyTable:BUFFER-FIELD(2):BUFFER-VALUE LABEL 'Field1'
        bMyTable:BUFFER-FIELD(3):BUFFER-VALUE LABEL 'Field2'
        bMyTable:BUFFER-FIELD(4):BUFFER-VALUE LABEL 'Field3'
        bMyTable:BUFFER-FIELD(5):BUFFER-VALUE LABEL 'Field4'
        WITH FRAME f DOWN.
        DOWN WITH FRAME f. 
END.

qMyTable:QUERY-CLOSE().

DELETE OBJECT qMyTable.

Ответы [ 3 ]

1 голос
/ 29 мая 2019

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

DO WHILE qMyTable:GET-NEXT():    
   DO i = 1 to iNumFields:
      DISPLAY bMyTable:BUFFER-FIELD(i):NAME
              bMyTable:BUFFER-FIELD(i):BUFFER-VALUE LABEL cTitlerow[i] WITH FRAME f DOWN.
      DOWN WITH FRAME f.
   END. 
   CLEAR FRAME f ALL.
END.
1 голос
/ 29 мая 2019

Это должно помочь вам динамически создавать фрейм и «текстовые» виджеты:

define variable f as handle no-undo.
define variable t as handle no-undo.

define variable r as integer no-undo initial 1.
define variable c as integer no-undo initial 1.

create frame f.
assign
  f:row           = 4
  f:column        = 1 
  f:width-chars   = 132
  f:box           = no
  f:top-only      = false
  f:overlay       = true
  f:name          = "something"
no-error.

create text t.
assign
  t:frame        = f
  t:name         = "text1"
  t:format       = substitute( "x(&1)", max( 1, 20, length( t:name )))
  t:row          = r
  t:col          = c
  t:screen-value = "value1"
  f:height-chars = max( r, f:height-chars )
.

f:visible = yes.

В вашем случае вы, вероятно, захотите создать фрейм только один раз сверху, а затем создать 2 текста.виджеты для каждого поля - один для метки и один для значений данных.

1 голос
/ 29 мая 2019

Я думаю, у вас могут быть проблемы с кадром.Ваш код в основном должен работать.

Это незначительное изменение при отображении ваших данных, но для него они будут отображаться в одном столбце.

DO WHILE qMyTable:GET-NEXT():      
    DO i = 1 to iNumFields:
        DISPLAY bMyTable:BUFFER-FIELD(i):BUFFER-VALUE WITH FRAME f2 DOWN TITLE "Dynamic" .
        DOWN  WITH FRAME f2 .
    END.  
END.

Таким образом, вывод будет в основном

row1column1
row1column2
row1column3
...
row1columnN
row2column1
row2column2
row2column3
...
row2columnN
etc

Вместо

row1column1    row1column2    row1column3    ...    row1columnN
row2column1    row2column2    row2column3    ...    row2columnN

Одной из идей получить тот же результат является динамическое создание виджета кадра ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...