A pesar de que FastReport.Net nos facilite el complemento para el deseñador de informes para utilizarlo como fuente de datos para el archivo JSON , no es siempre conviniente. Este complemento funciona bien con datos de nivel único que representan una tabla separada. Si los datos tienen múltiples niveles de anidamiento , es mejor probar otra solución.
Por ejemplo, utilizando la biblioteca Newtonsoft.Json. Gracias a esta puede obtener datos desde JSON, crear una lista de datos y registrarla en el informe desde el código.
Vamos a echar un vistazo a todo dando ejemplos. Cree una aplicación WinForms. Utilizando el administrador NuGet, instale el paquete Newtonsoft.Json. En Reference añada un hipervínculo a la biblioteca FastReport.dll.
Supongamos que tenemos unos datos de venta de administradores en tiendas. Todos los datos están en un solo archivo pero en realidad son tres esencias diferentes: tienda, administrador, venta. Este será nuestro archivo json para este ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
{ "Shops": [{ "Name": "First shop", "Managers": [{ "Name": "John", "Phone": "45443446343", "Sales": [{ "GoodId": "1", "Amount": "3" }, { "GoodId": "2", "Amount": "5" }, { "GoodId": "3", "Amount": "2" } ] }, { "Name": "Boris", "Phone": "8787964387", "Sales": [{ "GoodId": "15", "Amount": "8" }, { "GoodId": "12", "Amount": "2" }, { "GoodId": "13", "Amount": "2" } ] } ] }, { "Name": "Second shop", "Managers": [{ "Name": "Julia", "Phone": "5555555555", "Sales": [{ "GoodId": "1", "Amount": "30" }] }, { "Name": "Helen", "Phone": "8787964387", "Sales": [{ "GoodId": "2", "Amount": "8" }, { "GoodId": "3", "Amount": "26" }, { "GoodId": "1", "Amount": "2" } ] } ] } ] } |
Para deserializar estos datos necesitamos objetos con propiedades correspondientes a los campos en JSON.
Claro, si el documento JSON tiene un anidamiento muy profundo, puede ser bastante agotador. Por lo tanto, hay un servicio web excelente: http://json2csharp.com/. Simplemente pone su json válido en el campo de entrada, haga clic en el botón Generate y recibe las clases C # hechas. Para nuestro documento json se generará el siguiente conjunto de clases:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class Sale { public string GoodId { get; set; } public string Amount { get; set; } } public class Manager { public string Name { get; set; } public string Phone { get; set; } public List<Sale> Sales { get; set; } } public class Shop { public string Name { get; set; } public List<Manager> Managers { get; set; } } public class RootObject { public List<Shop> Shops { get; set; } } |
Vamos a crear un archivo Sales.cs separado para estas.
Añada un botón a la forma. Cree un manipulador para el evento click:
1 2 3 4 5 6 7 |
private void RunBtn_Click(object sender, EventArgs e) { var json = JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(@"Sales.json")); Report report = new Report(); report.RegisterData(json.Shops,"Shops"); report.Design(); } |
Como puede ver, aquí utilizamos la biblioteca Newtonsoft.json para deserializar json en un RootObject que tiene la propiedad Shops, que es una lista de tiendas. Registramos esta lista en el informe como una fuente de datos. Y llamamos el diseñador de informes. Arranque la aplicación con el único botón que tenemos y haga clic en este. Aparece el diseñador de informes con un informe vacío. Seleccione la fuente de datos:
A base de estos datos, cree un modelo de informe:
Como puede ver, la banda Data tieneuna banda filiar y esta también.
Los datos en estas bandas están arreglados de acuerdo con la jerarquía´de la fuente de datos. Arranque el informe:
Así pues, tenemos relacionados los datos en un informe Master-Detail. Y no tenemos que crear una relación especial entre tablas para obtener dependencias. En este caso, cuando tenemos un gran anidamiento de datos en JSON, es mejor utilizar este método.