Вложенная петля в отчете о рождении

Я использую Eclipse Birt для создания отчета из файла JSON.

Мой файл JSON выглядит так:

{  
"cells":[  
  {  
     "type":"basic.Sensor",
     "custom":{  
     "identifier":[  
           {  
              "name":"Name1",
              "URI":"Value1"

           },
           {  
              "name":"Name4",
              "URI":"Value4"
           }
        ],
        "classifier":[  
           {  
              "name":"Name2",
              "URI":"Value2"
           }
        ],
        "output":[  
           {  
              "name":"Name3",
              "URI":"Value3"
           }
        ],

     },
           "image":{  
           "width":50,
           "height":50,
           "xlink:href":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAABEJAAARCQBQGfEVAAAABl0RVh0U29mdHdhcmUAd3Vi8f+k/EREURQtsda2Or/+nFLqP6T5Ecdi0aJFL85msz2Qxyf4JIumMAx/ClmWt23GmL1kO54CXANAVH+WiN4Sx7EoNVkU3Z41BDHMeXAxjvOxNr7RJjzHX7S/jAflwBxkJr/RwiOpWZ883Nzd+Wpld7tkBr/SJr7ZHZbHZeuVweSnPfniocMAWYwcGBafH0OoPamFGAaY4ZBZjmmFGAaY4ZBZjmmFGAaY4ZBZjmmFGAaY7/B94QnX08zxKLAAAAAElFTkSuQmCC"
        }
     }
  },
  {  
     "type":"basic.Sensor",

     "custom":{  
        "identifier":[  
           {  
              "name":"Name1",
              "URI":"Value1"

           },
           {  
              "name":"Name4",
              "URI":"Value4"
           }
        ],
        "classifier":[  
           {  
              "name":"Name2",
              "URI":"Value2"
           }
        ],
        "output":[  
           {  
              "name":"Name3",
              "URI":"Value3"
           }
        ],

     },

        "image":{  
           "width":50,
           "height":50,
           "xlink:href":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9igAQAAAgAIoAEAAAIACKABAAACAAigAQAAAgAIoAEAAAIACKABAAACAAigAQAAAgAIoAEAAAIADqhvprADeSsau00l5NAAAAAElFTkSuQmCC"
        }
     }
  },
  {  
     "type":"basic.Platform",

     "custom":{  
        "identifier":[  
           {  
              "name":"Name1",
              "URI":"Value1"

           }
        ],
        "classifier":[  
           {  
              "name":"Name2",
              "URI":"Value2"
           }
        ],
        "output":[  
           {  
              "name":"Name3",
              "URI":"Value3"
           }
        ],

        "image":{  
           "width":50,
           "height":50,
           "xlink:href":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAA6TH0jqtg6U8EsCdnm3SpevSK7Pb85xABEMBuLAn2hxjRve7SFzYEaB/HhytLQ4ABRwCWBPvBKnRk6U8EkBeOD9f7iwAGHAGEYEmwDxLvzNKfCCDP8NGLQd3lY7D0JwI4kmlwfHhX6dTSXxsRAAHsWR7aUjc7uM5Wg=="
        }
     }
  }
]
 }

у меня есть 3 ячейки, и каждая из них содержит 1 изображение 1 имя 1 тип и 3 таблицы, это то, что я сделал до сих пор:введите описание изображения здесь

то, что я пытаюсь сделать, это вложенный цикл, я хочу иметь для каждого объекта (ячейки) в моем JSON абзац, который нумеруется следующим образом:

  • 2.x Имя ячейки компонента:
    • Образ
    • Таблица вывода
    • Таблица идентификаторов
    • Таблица классификаторов

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

** Изменить: ** это открытый метод для набора данных

// Grab the JSON file and place it in a string
fisTargetFile = new FileInputStream(new File("C:/Users/Sample Reports/moe.json"));
input = IOUtils.toString(fisTargetFile, "UTF-8");

// Store the contents in a variable
jsonData = input;

// Convert the String to a JSON object
myJSONObject = eval( '(' + jsonData + ' )' );

// Get the length of the object
len = myJSONObject.cells.length;

// Counter
count = 0;

Метод выборки:

if(count < len) {
var name     = myJSONObject.cells[count].attrs.text["text"];
var type    = myJSONObject.cells[count].type;
var icon =myJSONObject.cells[count].attrs.image["xlink:href"];



icon = icon.split(",");

icon= icon[1];
imageDataBytes = icon;

row["name"]     = name;
row["type"]    = type;
row["icon"]    = Base64ToBlob.toBytes(icon);



Logger.getAnonymousLogger().info( row["icon"]);
count++;
return true;
}

return false;

1 ответ

Решение

Если вы хотите использовать вложенные таблицы, есть хороший учебник, показывающий, как связать вложенные таблицы с внешней таблицей: пожалуйста, сначала внимательно посмотрите эту демонстрацию, в частности, посмотрите, как вложенная таблица связана с внешней таблицей через параметр набора данных.

Конечно, ваш случай более сложный, потому что вам нужно сделать это с помощью наборов данных со сценариями и нескольких вложенных таблиц. Я уже сделал что-то подобное, вы должны создать один набор сценариев для каждой вложенной таблицы. Ключевые моменты:

  • В разделе "параметры" каждого поднабора данных создайте один входной параметр и назовите его, например, "systemID"
  • Создайте свои вложенные таблицы, перетаскивая каждый набор данных во внешней таблице
  • В разделе "Привязки" каждой вложенной таблицы свяжите параметр "systemID" с полем идентификатора внешней таблицы.
  • В событии "open" поднаборов данных получите доступ к значению параметра с помощью этого выражения: inputParams ["systemID"] Таким образом, вы можете фильтровать связанные строки в " myJSONObject ".
  • Важно убедиться, что myJSONObject инициализируется один раз для всех, иначе производительность может резко снизиться, если его оценивать на каждой итерации. Например, оцените это в событии "инициализировать" отчета.

Вот и все, это будет непросто, но эти элементы должны помочь в достижении этого отчета.

Другие вопросы по тегам