Ok...so your recordlooks something like this
{shipmentNo}{DateField}{DateType}
Ok...you can show all the dates this way....in the Shipment footer. In the details section you will trap each date if it exists.
You need the Left outter join in case there are NO DATES entered at all.
You start Grouping your report by
Group 1 header - customer
Group 2 header - Shipment No (place an initialization formula...suppressed)
Group 3 header - Datefield
Details - (Suppressed) (place data accumulation formula)
Group 3 footer - (Suppressed)
Group 2 footer - (Place the display formula)
Group 1 footer -
In Group 2 header You place the following formula that is suppressed
@initialization
WhilePrintingRecords;
if not inRepeatedGroupHeader then
(
StringVar EstimateLoadDate1 := "";
StringVar EstimateLoadDate2 := "";
StringVar EstimateDelivery1 := "";
StringVar EstimateDelivery2 := "";
StringVar ActualDeliveryDate := "";
)
These are made strings since they are easier to work with later.
Now in your Details section (suppressed) you put your accumulation formula
@AccumulateDates
WhilePrintingRecords;
StringVar EstimateLoadDate1 ;
StringVar EstimateLoadDate2 ;
StringVar EstimateDelivery1 ;
StringVar EstimateDelivery2 ;
StringVar ActualDeliveryDate ;
If {table.DateType} = "EstimateLoadDate1" then
//whatever the code is
EstimateLoadDate1 := totext({table.date},"dd/MM/yyyy""

else If {table.DateType} = "EstimateLoadDate2" then
EstimateLoadDate2 := totext({table.date},"dd/MM/yyyy""

else If {table.DateType} = "EstimateDelivery1" then
EstimateDelivery1 := totext({table.date},"dd/MM/yyyy""

else If {table.DateType} = "EstimateDelivery2" then
EstimateDelivery2 := totext({table.date},"dd/MM/yyyy""

else If {table.DateType} = "ActualDeliveryDate " then
ActualDeliveryDate := totext({table.date},"dd/MM/yyyy""

;
This traps and puts the date in whatever format you like
Then you just create display formulas for each date to be placed in The Shipment No. footer
@Display EstimateLoadDate1
WhilePrintingRecords;
StringVar EstimateLoadDate1 ;
EstimateLoadDate1 ;
Do one like this for each variable.
This should work fine.
Jim Broadbent