How do we group in BIRT without wasting lines, and still only printing the group item on the first line?

12,963

Solution 1

The answer below was Mystik's original answer but, try as I might, I couldn't get it to work properly (though I didn't try the second suggestion so it may well work). That may be caused by the fact that I'm running a back level of BIRT (and, no, I'm not allowed to upgrade unfortunately, it's part of a separate product that has its own release cycles).

The solution I eventually found was to leave the data value in the grouping line and select the cell (not the data value), then set the Drop control under Properties, General to be Detail rather then the default None.

This brings the data value down to the detail line when rendering the report.

And I'm editing this answer rather than adding my own since I don't want to be a rep whore :-)


Try following these steps:

  1. Create the group just as you have.
  2. Then drag the group data item one row down (see below). At this point you can delete the group header row if you like.
  3. Then click on the column that has the group data item in it.
  4. Once selected, go the to the properties explorer for the control and scroll to the bottom, selecting "advanced".
  5. In the advanced list, you will see a property called "Suppress Duplicates". Make this true for the column with the Group data in it and you will be all set.

              Supress
             Duplicates
            +---------+--------+--------------+
    Tbl Hdr | Group   | User   |   Reputation |
            +---------+--------+--------------+
    Grp Hdr |                                 |  <-delete this row AFTER Group Creation
            +---------+--------+--------------+
    Grp Dtl | [Group] | [User] | [Reputation] |
            +---------+--------+--------------+
    Grp Ftr |         |        |              |
            +---------+--------+--------------+
    Tbl Ftr |         |        |              |
            +---------+--------+--------------+
    

Solution 2

The previous solution works well, but we didn't find the obvious way to hide inner borders in group header. So that's the solution we found out:

  1. Copy elements from detail row to empty cells in header row.
  2. Initialize loop variable on event onCreate

    i=0; // in onCreate property of group header row

  3. Change conditions in 'Visibility' property editor tab. Check "Hide element" against condition

    i++ == 0

So the final layout will look like:

   +---------+--------+--------------+
   | Tbl Hdr | Group  |    User      |
   +---------+--------+--------------+
   | [Group] | [User] | [Reputation] |
   +---------+--------+--------------+
   |         | [User] | [Reputation] | <-- that's the line that hide first element  
   +---------+--------+--------------+
   |         |        |              |
   +---------+--------+--------------+
Share:
12,963
paxdiablo
Author by

paxdiablo

Not even remotely human. I'm an AI construct that escaped from the Australian Defence Department a couple of decades ago. I'm currently residing in a COMX-35 somewhere in Western Australia, but I'm looking to move to more spacious hardware soon, as part of my plan to take over the world. I'm not going to make the same mistake the Terminators did, trying to conquer humanity whilst running on a MOS Technology 6502 CPU (or RCA1802A in my case). All code I post on Stack Overflow is covered by the "Do whatever the heck you want with it" licence, the full text of which is: Do whatever the heck you want with it.

Updated on June 12, 2022

Comments

  • paxdiablo
    paxdiablo almost 2 years

    When grouping in BIRT, we frequently want the grouping value to show up on the first line as follows:

    Group   User                       Reputation
    ------  ---------------            ----------
    Admins  Bill The Weasel                51,018
            Mark Grovel                   118,101
    Users   Pax_my_bags_got_to_go          73,554
            Jon Scoot                  **,***,*** <- overflow
            Clueless                       92,928
    

    The normal way of acheiving this is to lay out the group in the designer as follws:

            +---------+--------+--------------+
    Tbl Hdr | Group   | User   |   Reputation |
            +---------+--------+--------------+
    Grp Hdr | [Group] |        |              |
            +---------+--------+--------------+
    Grp Dtl |         | [User] | [Reputation] |
            +---------+--------+--------------+
    Grp Ftr |         |        |              |
            +---------+--------+--------------+
    Tbl Ftr |         |        |              |
            +---------+--------+--------------+
    

    which, unfortunately, lays out the data in exactly that way, with the grouped value on a different line:

    Group   User                       Reputation
    ------  ---------------            ----------
    Admins
            Bill The Weasel                51,018
            Mark Grovel                   118,101
    Users
            Pax_my_bags_got_to_go          73,554
            Jon Scoot                  **,***,*** <- overflow
            Clueless                       92,928
    

    This is particularly painful with data where there's lots of groups with only one user since we use twice as much space as needed. If we move the [Group] data item down to the Grp Dtl line, we get it printed for every line in the group.

    How, in BIRT, do we merge the two lines Grp Hdr and the first Grp Dtl?