Aufgabe
Der Baum eine mx:AdvancedDataGrid mit mx:SummaryRows soll in die Zwischenablage kopiert werden.
Problem
Der DataProvider des mx:AdvancedDataGrid ist eigentlich flach. Der erzeugte Baum/die Hierarchie soll in die Zwischenablage kopiert werden, so dass er in Excel per Copy&Paste mit Einrückungen und Summen eingefügt werden kann.
Lösung
Eine rekursive Funktion wird erstellt, die über den erzeugten Baum iteriert:
// Für das Einrücken in die Zwischenablage
public var anzahlGroupingFelder:Number=0; // Gesamttiefe der Felder
public var aktuelleTiefe:Number=0; // Tiefe der aktuellen Rekursion
public var rekursionsString:String='';
public var farbenFuerLevel:Object = new Object();
private function getCompleteADGRekursion(treeData:ArrayCollection):void
{
var aktuelleGruppeFelder:String='';
for (var i:Number=0; i<treeData.length; i++)
{
if(i==0) aktuelleTiefe++;
var tabs:String='';
var behindtabs:String='';
for (var l:Number=0; l<=anzahlGroupingFelder-aktuelleTiefe+3; l++)
{
behindtabs+='<td></td>';
}
var item:Object=treeData[i];
if(item.children)
{
for (var j:Number=1; j<aktuelleTiefe; j++)
{
tabs+='<td></td>';
}
var properties:String='<td><i><b>'+item.actuallastyear+
'</b></i></td><td><i><b>'+item.actualyeartillaugust+
'</b></i></td><td><i><b>'+item.actualyearlinearprojection+
'</b></i></td><td><i><b>'+item.nextyear+
'</b></i></td><td><i><b>'+item.nnextyear+
'</i></td><td><i><b>'+item.nnnextyear+
'</b></i></td><td><i><b>'+item.nnnnextyear+
'</b></i></td>';
rekursionsString+='<tr style="background-color:'+
farbenFuerLevel[aktuelleTiefe]+';">'+tabs+
'<td>'+item.GroupLabel+behindtabs+'</td>'+
properties+'</tr>';
getCompleteADGRekursion(item.children);
}
else
{
for (var k:Number=0; k<anzahlGroupingFelder; k++)
{
tabs+='<td style="background-color:#EFEFEF"></td>';
}
var properties2:String='<td>'+item.productcharacteristic+
'</td><td>'+item.productcharacteristic2+
'</td><td>'+item.productcharacteristic3+
'</td><td>'+item.material+
'</td><td>'+item.actuallastyear+
'</td><td>'+item.actualyeartillaugust+
'</td><td>'+item.actualyearlinearprojection+
'</td><td>'+item.nextyear+
'</td><td>'+item.nnextyear+
'</td><td>'+item.nnnextyear+
'</td><td>'+item.nnnnextyear+'</td>';
rekursionsString+='<tr>'+tabs+properties2+'</tr>';
}
// Beim ersten gehts eins tiefer
// Beim letzten eins zurück
if(i==treeData.length-1) aktuelleTiefe--;
}
}
Aufruf der rekursiven Funktion:
private function copyToClipboard(dg:AdvancedDataGrid):void
{
// Farben je Interationstiefe;
farbenFuerLevel[1]=’#00B684′;
farbenFuerLevel[2]=’#31C39C‘;
farbenFuerLevel[3]=’#63D3B5′;
farbenFuerLevel[4]=’#CEF3E7′;
farbenFuerLevel[5]=’#BBBBBB‘;
farbenFuerLevel[6]=’#AAAAAA‘;
farbenFuerLevel[7]=’#999999′;
farbenFuerLevel[8]=’#888888′;
var wasIstImDataProviderDebug:Object=dg.dataProvider;
try
{
anzahlGroupingFelder=Number(wasIstImDataProviderDebug.source.
grouping.fields.length);
}
catch(e:Error)
{
anzahlGroupingFelder=0;
}
if(anzahlGroupingFelder>0)
{
rekursionsString=‘
rekursionsString=‘
| ‚+order.description+ ‚ |
Detail 1 | Detail 2 | Detail 3 | Detail 4 | Actual last year‚; rekursionsString+=‘ |
Actual year‘; rekursionsString+=‘ till august |
Actual year linear projection | Next year | NNext year | NNNext year | NNNNext year |
‚;
System.setClipboard(rekursionsString);
}
else
{
var totalExport:String = new String();
var colList:Array = new Array();
for(var i:int = 0; i < dg.columnCount; i++)
{
colList.push(dg.columns[i].dataField);
totalExport += String(dg.columns[i].headerText)
.replace('\r',' ') + "\t";
}
totalExport += "\r";
for(var yp:int = 0; yp < reporting.length; yp++)
{
for(var xp:int = 0; xp < colList.length; xp++)
{
var insertString:String=reporting
.getItemAt(yp)[colList[xp]];
if(!insertString) insertString='';
totalExport += insertString
.replace("\t","") + "\t";
}
totalExport += "\r";
}
System.setClipboard(totalExport);
}
Alert.show('Data has been copied to clipboard. Now you can paste it to '+
'Microsoft Excel or another application of your choice.');
}
[/actionscript3]