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]