Вложенный цикл в отчете о рождении

Я использую 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 Component cell's Name :
    • Image
    • Таблица выходных данных
    • Таблица идентификаторов
    • Таблица классификатора

Итак, чтобы сделать это, мне нужно выполнить итерацию для каждой ячейки, а затем итерацию для каждой таблицы Output, идентификатора и классификатора, и я понятия не имею, как я могу это сделать, вложенный цикл. как список, который представляет количество ячеек, содержащий 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;

person azelix    schedule 25.05.2015    source источник
comment
Почему мгновенное голосование против? в чем дело? Если вы просто снизите оценку моего сообщения, я не могу понять, что я сделал не так.   -  person azelix    schedule 25.05.2015
comment
Вам следует добавить свой код, показывающий, что вы сейчас кодировали, или, возможно, код BIRT, который вы используете для создания отчета. Таким образом, мы должны закодировать все мысли или подготовить все ответы как есть. Во всяком случае, в документации eclipse.org birt говорится о таблицах. eclipse.org/birt/documentation/tutorial/tutorial-6.php   -  person Alejandro Teixeira Muñoz    schedule 25.05.2015
comment
Хорошо, я добавил свой код, методы open и fetch набора данных.   -  person azelix    schedule 25.05.2015
comment
Голос против был не моим, но теперь у вас есть мой +1. хорошее редактирование. Я проверю еще раз, чтобы найти решение   -  person Alejandro Teixeira Muñoz    schedule 25.05.2015


Ответы (1)


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

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

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

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

person Dominique    schedule 26.05.2015
comment
Да, это именно то, что я сделал по одному набору данных для каждой подтаблицы, привязав данные из моего внешнего набора данных к моему внутреннему набору данных, и он отлично работает, здесь есть руководство robertmarkbramprogrammer.blogspot.fr/2013/03/. Спасибо. - person azelix; 26.05.2015