2009-11-20 11 views
10

Tworzę prosty program do raportowania za pomocą java i iReport (od Jaspera), który ma stworzyć raport w formacie PDF pokazujący komputery z ich adresem IP, ich lokalizacją, bezczynności lub nieobecności (obsługiwane przez inny system) oraz listę projektów, do których jest obecnie przyłączona (zarządzana również w innym miejscu).Jak wydrukować listę ciągów zawartych w innej liście w iReporcie?

Używam iReport dla tej sprawy, i stworzył atrapę zbiórki klasę generowania następująco:

public class PCReports { 

    public static java.util.Collection PC_collection; 
    public static java.util.Collection generateCollection() { 

     PC_collection = new ArrayList<PCLineDTO>(); 
     PCLineDTO line = new PCLineDTO(); 
     line.setIP("192.168.1.1"); 
     line.setLab("location"); 
     line.setActive(true); 
     line.addProjectName("project1"); 
     line.addProjectName("project2"); 
     line.addProjectName("project3"); 
     PC_collection.add(line); 

     line = new PCLineDTO(); 
     line.setIp("192.168.1.2"); 
     line.setLab("location2"); 
     line.setActive(false); 
     line.addProjectName("project1"); 
     line.addProjectName("project2"); 
     PC_collection.add(line); 

     return PC_collection; 
    } 
} 

Klasa podmiot w tym przypadku są:

public class PCLineDTO { 
    private String ip; 
    private String lab; 
    private Boolean active; 
    private ArrayList<String> projects; 
} 

Po niektóre wyszukiwanie wokół Internet, znalazłem a way to do something similar, używając podraportów.

Chodzi o to, że nie wiem, jak wydrukować kolekcję ciągów przekazanych jako źródło danych do tego podraportu.

W przykładach znalazłem w Internecie, dla każdego elementu w kolekcji kapitana, podraportów przeszły kolekcję obiektów -z własnych getter dla każdego attribute- zamiast kolekcji ciągów jako jest tutaj. W tych przypadkach są one dostępne wartości są niezbędne do korzystania przez składni iReport, który nie był w stanie wykorzystać, na przykład:

$F{project} 

Od iReport szuka sposobu getProject zawartego wewnątrz obiektów, które otrzymuje, ale w tym przypadku jest to prosty obiekt String (bez metody getProject).

+0

Jakiej wersji JasperReport/iReport używasz? – medopal

+0

@medopal: Na szczęście najnowsze (w czasie tego postu: 3.6.1). –

Odpowiedz

17

Użyj podraportu lub subdanych.

zdać Podraport do źródła danych zbiórki

JRBeanCollectionDataSource($F{Projects}) 

Następnie w nowym podraport utworzyć nowe pole o nazwie „_THIS” dokładnie, oznacza to, że fasola w kolekcji przekazywane jest taka sama jak wartość chcę

Aby uzyskać więcej informacji, sprawdź kod źródłowy klasy tutaj: JRAbstractBeanDataSource

Uwaga: jest dostępny w JasperReport 3.0.0 nie jestem pewien, czy istnieje w poprzedniej kompilacji s. Nadzieja to pomaga

Aktualizacja: tylko sprawdzone SVN, wydaje się, że ta funkcja jest realizowana w JasperReports 2.0.0

+1

Dziękuję, cieszę się, że pomogło. Nawiasem mówiąc, kiedy mam do czynienia z Jasperem lub jakimkolwiek innym projektem open source, staram się pobrać kod źródłowy i dołączyć go do biblioteki w Eclipse. W ten sposób łatwiej jest kopać w środku. Powodzenia – medopal

+0

Znalazłem dodatkowe informacje tutaj: http://community.jaspersoft.com/questions/533552/solved-problem-passing-datasource-subreport –

3

Interesujące. Myślę, że lepiej użyć listy, a następnie zdefiniuj funkcję getName() na klasie projektu. Następnie w podraportu zdefiniuj zmienną "nazwa". Będzie działał w ten sposób i pozwoli na łatwe dodawanie dodatkowych informacji, takich jak czas trwania projektu, kierowanie zespołem itp.

+0

Dziękuję za odpowiedź. Zastanawiałem się nad tym i mogłem faktycznie to zaimplementować w ten sposób, jeśli coś do tego dojdzie. Jednak, z przykrością (i oczywiście z mojej winy), inne części programu używają tej listy Struny i zastanawiałem się, czy istnieje sposób na obejście kłopotliwego i podatnego na błędy zadania wyszukiwania i zastępowania tego, gdzie został użyty. –

0

Jak mówi Bozho, w przypadku proyects był tablicą złożonego obiektu należy odwołać go jako pole typu java.util.Collection, a następnie przekazuje je do wewnętrznego podraportu w ten sam sposób, co wskazuje medopal. I nie umieszczaj pola _THIS.

0

Aby rozwinąć ten temat bez użycia _THIS: załóżmy, że komponent bean Java ma listę subBeans, a ten subBean ma złożony format i chcemy wydrukować każdy subpean w niestandardowy sposób. Przytoczę przykład, w którym element subDataset jest na poziomie sprawozdania i componentElement jest w szczegółach:

<subDataset name="ListOfSubBeans" uuid="66c86e41-c565-4f18-bccf-1a1b2a567585"> 
    <field name="subBeanField_1" class="java.lang.String"> 
     <fieldDescription><![CDATA[subBeanField_1]]></fieldDescription> 
    </field> 
</subDataset> 

... 

     <componentElement> 
      <reportElement x="780" y="0" width="100" height="30" uuid="f73864b9-46dd-4adb-8dad-a6bd8dfae64e"> 
       <property name="net.sf.jasperreports.export.headertoolbar.table.name" value=""/> 
      </reportElement> 
      <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical"> 
       <datasetRun subDataset="ListOfSubBeans" uuid="a8dd1c2b-3ac0-4ffa-b9d0-08e4890e199a"> 
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfSubBeans})]]></dataSourceExpression> 
       </datasetRun> 
       <jr:listContents height="30" width="100"> 
        <textField> 
         <reportElement x="0" y="0" width="100" height="30" uuid="61700c18-6bb9-45da-a235-b76b9f76a2ea"/> 
         <textFieldExpression><![CDATA[$F{subBeanField_1}]]></textFieldExpression> 
        </textField> 
       </jr:listContents> 
      </jr:list> 
     </componentElement> 

... 

więc zbiór danych mistrz stwierdził, że fasola mistrz ma zmienną składową, która jest lista: listOfSubBeans . Ta właściwość java.util.List jest używana do podawania źródła danych urządzenia jr:list, a pola jr:list są deklarowane przy użyciu subDatazy o nazwie ListOfSubBeans (należy zwrócić uwagę na wielkość liter).