3D charts. Chart Generator tool II
One of the new features in NAV 2009 is the new chart (KPI) object, described in more details here:
NAV 2009 - How to generate charts / KPIs
This post describes how to make 3D rotatable charts, and includes an update to the Chart Generator Tool which makes is simple to make your own 3D charts.
For basics about how to make charts, please refer to the post linked above. To add the 3rd dimension to your charts, all you need to do is to add a Z-axis. This gives you charts that can look like this:
Item stacks by location:
Customer balance by discount group:
A chart automatically becomes a 3D chart by adding a Z-axis to the chart definition, for example like this:
- <ZAxis ShowTitle="false">
<Field Name="Customer Disc. Group" />
</ZAxis>
And the presence of a Z-axis will automatically make the user able to rotate the chart.
Below, you can find the following:
- Chart definition for the two charts pictured above, so you can import them into your own CROUS database
- Chart Generator Tool, updated so that it can handle Z-axis, so you can create your own charts.
Lars Lohndorf-Larsen
Microsoft Dynamics UK
Microsoft Customer Service and Support (CSS) EMEA
Chart definitions
Item stacks by location:
- <ChartDefinition xmlns="urn:schemas-microsoft-com:dynamics:NAV:MetaObjects" xmlns:xsd="**https://www.w3.org/2001/XMLSchema**" xmlns:xsi="**https://www.w3.org/2001/XMLSchema-instance**" Type="Column">
- <Title>
<Text ID="ENU">Items by location</Text>
</Title>
- <Table ID="32">
- <Filters>
- <Filter>
<Field Name="Item No. " />
<Value>70000|70001|70002|70003</Value>
</Filter>
</Filters>
</Table>
- <XAxis ShowTitle="true">
- <Title>
<Text ID="ENU">Location Code</Text>
</Title>
<Field Name="Location Code" />
</XAxis>
- <ZAxis ShowTitle="false">
<Field Name="Item No. " />
</ZAxis>
- <YAxis ShowTitle="false">
- <Measures>
- <Measure Operator="Sum">
<Field Name="Quantity" />
</Measure>
</Measures>
</YAxis>
</ChartDefinition>
Customer balance by discount group:
- <ChartDefinition xmlns="urn:schemas-microsoft-com:dynamics:NAV:MetaObjects" xmlns:xsd="**https://www.w3.org/2001/XMLSchema**" xmlns:xsi="**https://www.w3.org/2001/XMLSchema-instance**" Type="Column">
- <Title>
<Text ID="ENU">Customer Balance</Text>
</Title>
- <Table ID="18">
<Filters />
</Table>
- <XAxis ShowTitle="true">
- <Title>
<Text ID="ENU">No.</Text>
</Title>
<Field Name="No. " />
</XAxis>
- <ZAxis ShowTitle="false">
<Field Name="Customer Disc. Group" />
</ZAxis>
- <YAxis ShowTitle="false">
- <Measures>
- <Measure Operator="Sum">
<Field Name="Balance (LCY) " />
</Measure>
</Measures>
</YAxis>
</ChartDefinition>
Chart Generator Tool II
This is an improvement to the Chart Generator tool from this post. This version adds the possibility to set a Z-axis, and in this way make 3D charts.
To use it, save the code below to a text file. Then remove all [RemoveMe] from the text after checking that the object types and IDs won't replace existing objects that you want to keep. Then import it into NAV from Object Designer, and compile.
for instructions of how to use the tool, follow the link above to the original post.
OBJECT Table [RemoveMe]72000 Chart Generator
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
OnInsert=BEGIN
IF Chart.GET(Company,ID) THEN
ERROR('Chart already exists in table 2000000078. Run form 9182 and delete it, or use a different ID.');
END;
LookupFormID=Form72000;
}
FIELDS
{
{ 1 ; ;Company ;Text30 }
{ 2 ; ;ID ;Code20 ;NotBlank=Yes }
{ 10 ; ;Name ;Text50 ;OnValidate=BEGIN
Title := Name;
END;
}
{ 11 ; ;Title ;Text50 }
{ 15 ; ;Type ;Option ;OptionString=Column,Point }
{ 16 ; ;Table ID ;Integer ;OnValidate=BEGIN
MODIFY;
END;
}
{ 17 ; ;Table Name ;Text30 ;FieldClass=FlowField;
CalcFormula=Lookup(Object.Name WHERE (Type=CONST(Table),
ID=FIELD(Table ID)));
Editable=No }
{ 20 ; ;XAxis Field ID ;Integer }
{ 21 ; ;XAxis Field Name ;Text80 ;OnValidate=BEGIN
IF "XAxis Field Name" <> '' THEN BEGIN
FieldRec.SETRANGE(TableNo,"Table ID");
FieldRec.SETRANGE(FieldName,"XAxis Field Name");
FieldRec.FINDFIRST;
"XAxis Field ID" := FieldRec."No.";
"XAxis Field Name" := FieldRec.FieldName;
"XAxis Field Caption" := FieldRec."Field Caption";
"XAxis title" := FieldRec."Field Caption";
END ELSE BEGIN
"XAxis Field ID" := 0;
"XAxis Field Name" := '';
"XAxis Field Caption" := '';
"XAxis title" := '';
END;
END;
}
{ 22 ; ;XAxis Field Caption ;Text80 }
{ 23 ; ;XAxis title ;Text80 }
{ 24 ; ;XAxis Show Title ;Boolean ;InitValue=Yes }
{ 30 ; ;YAxis fields ;Integer ;FieldClass=FlowField;
CalcFormula=Count("Chart Generator YAxis" WHERE (Company=FIELD(Company),
ID=FIELD(ID)));
Editable=No }
{ 35 ; ;ZAxis Field Name ;Text80 ;OnValidate=BEGIN
IF "ZAxis Field Name" <> '' THEN BEGIN
FieldRec.SETRANGE(TableNo,"Table ID");
FieldRec.SETRANGE(FieldName,"ZAxis Field Name");
FieldRec.FINDFIRST;
END;
END;
}
{ 38 ; ;ZAxis Show Title ;Boolean }
}
KEYS
{
{ ;Company,ID ;Clustered=Yes }
}
FIELDGROUPS
{
}
CODE
{
VAR
Chart@1000 : Record 2000000078;
FieldRec@1102601000 : Record 2000000041;
BEGIN
END.
}
}
OBJECT Table [RemoveMe]72001 Chart Generator Filter
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
OnInsert=BEGIN
TESTFIELD("Filter Field ID");
END;
}
FIELDS
{
{ 1 ; ;Company ;Text30 }
{ 2 ; ;ID ;Code20 }
{ 3 ; ;Line No. ;Integer }
{ 10 ; ;Filter Field ID ;Integer ;OnValidate=BEGIN
IF "Filter Field ID" <> 0 THEN BEGIN
ChartGen.GET(Company,ID);
ChartGen.TESTFIELD("Table ID");
FieldRec.GET(ChartGen."Table ID","Filter Field ID");
"Filter Field Name" := FieldRec.FieldName;
END ELSE
"Filter Field Name" := '';
END;
}
{ 11 ; ;Filter Field Name ;Text30 }
{ 15 ; ;Filter Value ;Text30 }
}
KEYS
{
{ ;Company,ID,Line No. ;Clustered=Yes }
}
FIELDGROUPS
{
}
CODE
{
VAR
ChartGen@1102601001 : Record 72000;
FieldRec@1102601000 : Record 2000000041;
BEGIN
END.
}
}
OBJECT Table [RemoveMe]72003 Chart Generator YAxis
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
OnInsert=BEGIN
TESTFIELD("YAxis Measure Field ID");
END;
LookupFormID=Form72003;
DrillDownFormID=Form72003;
}
FIELDS
{
{ 1 ; ;Company ;Text30 }
{ 2 ; ;ID ;Code20 }
{ 3 ; ;Line No. ;Integer }
{ 10 ; ;YAxis Measure Field ID;Integer }
{ 11 ; ;YAxis Measure Field Caption;Text30 }
{ 12 ; ;Mearure Operator ;Option ;OptionString=Sum,Count }
{ 20 ; ;Show Title ;Boolean }
}
KEYS
{
{ ;Company,ID,Line No. ;Clustered=Yes }
}
FIELDGROUPS
{
}
CODE
{
BEGIN
END.
}
}
OBJECT Form [RemoveMe]72000 Chart Generator List
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
Width=16500;
Height=6710;
TableBoxID=1;
SourceTable=Table72000;
}
CONTROLS
{
{ 1 ;TableBox ;220 ;220 ;16060;5500 ;HorzGlue=Both;
VertGlue=Both }
{ 2 ;TextBox ;0 ;0 ;4400 ;0 ;HorzGlue=Both;
Visible=No;
ParentControl=1;
InColumn=Yes;
SourceExpr=Company }
{ 3 ;Label ;0 ;0 ;0 ;0 ;ParentControl=2;
InColumnHeading=Yes }
{ 4 ;TextBox ;0 ;0 ;1700 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr=ID }
{ 5 ;Label ;0 ;0 ;0 ;0 ;ParentControl=4;
InColumnHeading=Yes }
{ 6 ;TextBox ;0 ;0 ;4400 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr=Name }
{ 7 ;Label ;0 ;0 ;0 ;0 ;ParentControl=6;
InColumnHeading=Yes }
{ 8 ;TextBox ;0 ;0 ;4400 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr=Title }
{ 9 ;Label ;0 ;0 ;0 ;0 ;ParentControl=8;
InColumnHeading=Yes }
{ 10 ;TextBox ;0 ;0 ;550 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr=Type }
{ 11 ;Label ;0 ;0 ;0 ;0 ;ParentControl=10;
InColumnHeading=Yes }
{ 12 ;TextBox ;0 ;0 ;1700 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr="Table ID" }
{ 13 ;Label ;0 ;0 ;0 ;0 ;ParentControl=12;
InColumnHeading=Yes }
{ 14 ;CommandButton;4400 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
Default=Yes;
PushAction=LookupOK;
InvalidActionAppearance=Hide }
{ 15 ;CommandButton;6820 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
Cancel=Yes;
PushAction=LookupCancel;
InvalidActionAppearance=Hide }
{ 16 ;CommandButton;14080;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
PushAction=FormHelp }
{ 17 ;MenuButton ;9240 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
CaptionML=ENU=Chart;
Menu=MENUITEMS
{
{ ID=18;
PushAction=RunObject;
CaptionML=ENU=Filters;
RunObject=Form 72001;
RunFormLink=Company=FIELD(Company),
ID=FIELD(ID) }
{ ID=20;
PushAction=RunObject;
CaptionML=ENU=XAxis;
RunObject=Form 72002;
RunFormLink=Field1=FIELD(Company),
Field2=FIELD(ID) }
{ ID=21;
PushAction=RunObject;
CaptionML=ENU=YAxis;
RunObject=Form 72003;
RunFormLink=Company=FIELD(Company),
ID=FIELD(ID) }
}
}
{ 19 ;MenuButton ;11660;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
CaptionML=ENU=F&unctions;
Menu=MENUITEMS
{
{ ID=22;
PushAction=RunObject;
ShortCutKey=F11;
CaptionML=ENU=Generate Chart;
RunObject=Codeunit 72000 }
}
}
}
CODE
{
VAR
Chart@1000 : Record 2000000078;
BEGIN
END.
}
}
OBJECT Form [RemoveMe]72001 Chart Filters
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
Width=12150;
Height=6710;
TableBoxID=1;
SourceTable=Table72001;
AutoSplitKey=Yes;
DelayedInsert=Yes;
}
CONTROLS
{
{ 1 ;TableBox ;220 ;220 ;11710;5500 ;HorzGlue=Both;
VertGlue=Both }
{ 2 ;TextBox ;0 ;0 ;1700 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr="Filter Field ID";
OnLookup=BEGIN
ChartGen.GET(Company,ID);
ChartGen.TESTFIELD("Table ID");
FieldRec.SETRANGE(TableNo,ChartGen."Table ID");
IF FORM.RUNMODAL(FORM::"Field List",FieldRec) = ACTION::LookupOK
THEN
VALIDATE("Filter Field ID",FieldRec."No.");
END;
}
{ 3 ;Label ;0 ;0 ;0 ;0 ;ParentControl=2;
InColumnHeading=Yes }
{ 4 ;TextBox ;0 ;0 ;4400 ;0 ;HorzGlue=Both;
ParentControl=1;
InColumn=Yes;
SourceExpr="Filter Field Name" }
{ 5 ;Label ;0 ;0 ;0 ;0 ;ParentControl=4;
InColumnHeading=Yes }
{ 6 ;TextBox ;0 ;0 ;4400 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr="Filter Value" }
{ 7 ;Label ;0 ;0 ;0 ;0 ;ParentControl=6;
InColumnHeading=Yes }
{ 8 ;CommandButton;4890 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
Default=Yes;
PushAction=LookupOK;
InvalidActionAppearance=Hide }
{ 9 ;CommandButton;7310 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
Cancel=Yes;
PushAction=LookupCancel;
InvalidActionAppearance=Hide }
{ 10 ;CommandButton;9730 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
PushAction=FormHelp }
}
CODE
{
VAR
ChartGen@1000 : Record 72000;
FieldRec@1001 : Record 2000000041;
BEGIN
END.
}
}
OBJECT Form [RemoveMe]72003 YAxis List
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
Width=10000;
Height=6710;
TableBoxID=1;
SourceTable=Table72003;
AutoSplitKey=Yes;
DelayedInsert=Yes;
}
CONTROLS
{
{ 1 ;TableBox ;220 ;220 ;9560 ;5500 ;HorzGlue=Both;
VertGlue=Both }
{ 2 ;TextBox ;0 ;0 ;1700 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr="YAxis Measure Field ID";
OnLookup=BEGIN
ChartGen.GET(Company,ID);
ChartGen.TESTFIELD("Table ID");
FieldRec.SETRANGE(TableNo,ChartGen."Table ID");
IF FORM.RUNMODAL(FORM::"Field List",FieldRec) = ACTION::LookupOK
THEN BEGIN
"YAxis Measure Field ID" := FieldRec."No.";
"YAxis Measure Field Caption" := FieldRec."Field Caption";
END;
END;
}
{ 3 ;Label ;0 ;0 ;0 ;0 ;ParentControl=2;
InColumnHeading=Yes }
{ 4 ;TextBox ;0 ;0 ;4400 ;0 ;HorzGlue=Both;
ParentControl=1;
InColumn=Yes;
SourceExpr="YAxis Measure Field Caption" }
{ 5 ;Label ;0 ;0 ;0 ;0 ;ParentControl=4;
InColumnHeading=Yes }
{ 6 ;TextBox ;0 ;0 ;550 ;0 ;ParentControl=1;
InColumn=Yes;
SourceExpr="Mearure Operator" }
{ 7 ;Label ;0 ;0 ;0 ;0 ;ParentControl=6;
InColumnHeading=Yes }
{ 8 ;CheckBox ;0 ;0 ;1700 ;0 ;ParentControl=1;
InColumn=Yes;
ShowCaption=No;
SourceExpr="Show Title" }
{ 9 ;Label ;0 ;0 ;0 ;0 ;ParentControl=8;
InColumnHeading=Yes }
{ 10 ;CommandButton;2740 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
Default=Yes;
PushAction=LookupOK;
InvalidActionAppearance=Hide }
{ 11 ;CommandButton;5160 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
Cancel=Yes;
PushAction=LookupCancel;
InvalidActionAppearance=Hide }
{ 12 ;CommandButton;7580 ;5940 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
PushAction=FormHelp }
}
CODE
{
VAR
ChartGen@1000 : Record 72000;
FieldRec@1001 : Record 2000000041;
BEGIN
END.
}
}
OBJECT Form [RemoveMe]72004 Chart Generator Card
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
Width=16170;
Height=6490;
SourceTable=Table72000;
}
CONTROLS
{
{ 1 ;TabControl ;220 ;220 ;15730;5280 ;HorzGlue=Both;
VertGlue=Both;
PageNamesML=ENU=General }
{ 4 ;TextBox ;3850 ;990 ;2750 ;440 ;ParentControl=1;
InPage=0;
SourceExpr=ID }
{ 5 ;Label ;440 ;990 ;3300 ;440 ;ParentControl=4 }
{ 6 ;TextBox ;3850 ;1650 ;5500 ;440 ;ParentControl=1;
InPage=0;
NextControl=12;
SourceExpr=Name }
{ 7 ;Label ;440 ;1650 ;3300 ;440 ;ParentControl=6 }
{ 8 ;TextBox ;3850 ;2200 ;5500 ;440 ;ParentControl=1;
InPage=0;
SourceExpr=Title }
{ 9 ;Label ;440 ;2200 ;3300 ;440 ;ParentControl=8 }
{ 10 ;TextBox ;3850 ;3520 ;2750 ;440 ;ParentControl=1;
InPage=0;
SourceExpr=Type }
{ 11 ;Label ;440 ;3520 ;3300 ;440 ;ParentControl=10 }
{ 12 ;TextBox ;3850 ;2860 ;1700 ;440 ;ParentControl=1;
InPage=0;
SourceExpr="Table ID";
OnLookup=BEGIN
Object.SETRANGE(Type,Object.Type::Table);
IF FORM.RUNMODAL(FORM::Objects,Object) = ACTION::LookupOK THEN
"Table ID" := Object.ID;
END;
OnAfterValidate=BEGIN
CALCFIELDS("Table Name");
END;
}
{ 13 ;Label ;440 ;2860 ;3300 ;440 ;ParentControl=12 }
{ 21 ;TextBox ;12980;990 ;2750 ;440 ;ParentControl=1;
InPage=0;
NextControl=1102601000;
SourceExpr="XAxis Field Name";
OnLookup=BEGIN
TESTFIELD("Table ID");
FieldRec.SETRANGE(TableNo,"Table ID");
IF FORM.RUNMODAL(FORM::"Field List",FieldRec) = ACTION::LookupOK
THEN
VALIDATE("XAxis Field Name",FieldRec.FieldName);
END;
}
{ 22 ;Label ;9570 ;990 ;3300 ;440 ;ParentControl=21 }
{ 20 ;TextBox ;12980;1650 ;2750 ;440 ;ParentControl=1;
InPage=0;
SourceExpr="XAxis Field Caption" }
{ 23 ;Label ;9570 ;1650 ;3300 ;440 ;ParentControl=20 }
{ 24 ;CheckBox ;12980;2750 ;440 ;440 ;ParentControl=1;
InPage=0;
ShowCaption=No;
SourceExpr="XAxis Show Title" }
{ 25 ;Label ;9570 ;2750 ;3300 ;440 ;ParentControl=24 }
{ 27 ;TextBox ;12980;2200 ;2750 ;440 ;ParentControl=1;
InPage=0;
SourceExpr="XAxis title" }
{ 28 ;Label ;9570 ;2200 ;3300 ;440 ;ParentControl=27 }
{ 1102601000;TextBox;12980;3410 ;1700 ;440 ;ParentControl=1;
InPage=0;
SourceExpr="YAxis fields" }
{ 1102601001;Label ;9570 ;3410 ;3300 ;440 ;ParentControl=1102601000 }
{ 1102601002;TextBox;5720 ;2860 ;3630 ;440 ;ParentControl=1;
InPage=0;
SourceExpr="Table Name" }
{ 1102601003;TextBox;12980;4070 ;2750 ;440 ;ParentControl=1;
InPage=0;
SourceExpr="ZAxis Field Name";
OnLookup=BEGIN
TESTFIELD("Table ID");
FieldRec.SETRANGE(TableNo,"Table ID");
IF FORM.RUNMODAL(FORM::"Field List",FieldRec) = ACTION::LookupOK
THEN
VALIDATE("ZAxis Field Name",FieldRec.FieldName);
END;
}
{ 1102601004;Label ;9570 ;4070 ;3300 ;440 ;ParentControl=1102601003 }
{ 14 ;CommandButton;13750;5720 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
PushAction=FormHelp }
{ 15 ;MenuButton ;11330;5720 ;2200 ;550 ;HorzGlue=Right;
VertGlue=Bottom;
CaptionML=ENU=&Chart;
Menu=MENUITEMS
{
{ ID=16;
PushAction=LookupTable;
ShortCutKey=F5;
CaptionML=ENU=L&ist }
{ ID=26;
PushAction=RunObject;
CaptionML=ENU=Filters;
RunObject=Form 72001;
RunFormLink=Company=FIELD(Company),
ID=FIELD(ID) }
{ ID=17;
PushAction=RunObject;
CaptionML=ENU=YAxis;
RunObject=Form 72003;
RunFormLink=Company=FIELD(Company),
ID=FIELD(ID) }
{ ID=18;
MenuItemType=Separator }
{ ID=19;
PushAction=RunObject;
ShortCutKey=F11;
CaptionML=ENU=Generate Chart;
RunObject=Codeunit 72000 }
}
}
}
CODE
{
VAR
FieldRec@1001 : Record 2000000041;
Object@1002 : Record 2000000001;
XAxisField@1000 : Text[30];
BEGIN
END.
}
}
OBJECT Codeunit [RemoveMe]72000 Chart Generator Mgt
{
OBJECT-PROPERTIES
{
Date=17/10/08;
Time=12:00:00;
Version List=CGT;
}
PROPERTIES
{
TableNo=72000;
OnRun=BEGIN
CreateXML(Rec);
MESSAGE('Chart %1 was created / updated.',Chart.ID);
END;
}
CODE
{
VAR
Chart@1015 : Record 2000000078;
ChartGen@1003 : Record 72000;
ChartFilters@1008 : Record 72001;
ChartYAxis@1012 : Record 72003;
"3TierMgt"@1013 : Codeunit 419;
XMLDoc@1000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 4.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft
XML, v4.0'.DOMDocument";
DomNode@1001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 4.0:{2933BF80-7B36-11D2-B20E-
00C04F983E60}:'Microsoft XML, v4.0'.IXMLDOMNode";
DomNode2@1006 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 4.0:{2933BF80-7B36-11D2-B20E-
00C04F983E60}:'Microsoft XML, v4.0'.IXMLDOMNode";
DomTextNode@1002 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 4.0:{2933BF87-7B36-11D2-B20E-
00C04F983E60}:'Microsoft XML, v4.0'.IXMLDOMText";
DomAttribute@1004 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 4.0:{2933BF85-7B36-11D2-B20E-
00C04F983E60}:'Microsoft XML, v4.0'.IXMLDOMAttribute";
DomNodeList@1009 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 4.0:{2933BF82-7B36-11D2-B20E-
00C04F983E60}:'Microsoft XML, v4.0'.IXMLDOMNodeList";
DomProcessInstruction@1005 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 4.0:{2933BF89-7B36-11D2-B20E-
00C04F983E60}:'Microsoft XML, v4.0'.IXMLDOMProcessingInstruction";
NameSpace@1007 : Text[80];
i@1010 : Integer;
TempFileName@1014 : Text[250];
Debug@1016 : Boolean;
DebugFileName@1102601000 : Text[250];
IStream@1102601001 : InStream;
PROCEDURE CreateXML@1(ChartGenerator@1000 : Record 72000);
BEGIN
//=== Enable debug and filename to save the xml document to disk
Debug := FALSE;
DebugFileName := '';
//===
CREATE(XMLDoc);
XMLDoc.async(FALSE);
// Initialize document and set namespaces
NameSpace := 'urn:schemas-microsoft-com:dynamics:NAV:MetaObjects';
DomNode := XMLDoc.createNode(1,'ChartDefinition',NameSpace);
DomAttribute := XMLDoc.createAttribute('xmlns:xsd');
DomAttribute.value := 'https://www.w3.org/2001/XMLSchema';
DomNode.attributes.setNamedItem(DomAttribute);
DomAttribute := XMLDoc.createAttribute('xmlns:xsi');
DomAttribute.value := 'https://www.w3.org/2001/XMLSchema-instance';
DomNode.attributes.setNamedItem(DomAttribute);
// add chart type
DomAttribute := XMLDoc.createAttribute('Type');
CASE ChartGenerator.Type OF
ChartGenerator.Type::Column:
DomAttribute.value := 'Column';
ChartGenerator.Type::Point:
DomAttribute.value := 'Point';
END;
DomNode.attributes.setNamedItem(DomAttribute);
XMLDoc.appendChild(DomNode);
AddNode('ChartDefinition','Title','');
AddNode('ChartDefinition/Title','Text',ChartGenerator.Title);
AddAttribute('ChartDefinition/Title/Text','ID','ENU');
AddNode('ChartDefinition','Table','');
AddAttribute('ChartDefinition/Table','ID',FORMAT(ChartGenerator."Table ID"));
AddNode('ChartDefinition/Table','Filters','');
// Filters
ChartFilters.SETRANGE(Company,ChartGenerator.Company);
ChartFilters.SETRANGE(ID,ChartGenerator.ID);
IF ChartFilters.FINDSET THEN
REPEAT
AddNode('ChartDefinition/Table/Filters','Filter','');
AddNode('ChartDefinition/Table/Filters/Filter','Field','');
AddAttribute('ChartDefinition/Table/Filters/Filter/Field','Name',ChartFilters."Filter Field Name");
AddNode('ChartDefinition/Table/Filters/Filter','Value',ChartFilters."Filter Value");
UNTIL ChartFilters.NEXT = 0;
// XAxis
ChartGenerator.TESTFIELD("XAxis Field Name");
AddNode('ChartDefinition','XAxis','');
AddAttribute('ChartDefinition/XAxis','ShowTitle',BooleanFormat(ChartGenerator."XAxis Show Title")); ///
AddNode('ChartDefinition/XAxis','Title','');
AddNode('ChartDefinition/XAxis/Title','Text',ChartGenerator."XAxis title");
AddAttribute('ChartDefinition/XAxis/Title/Text','ID','ENU');
AddNode('ChartDefinition/XAxis','Field','');
AddAttribute('ChartDefinition/XAxis/Field','Name',ChartGenerator."XAxis Field Name");
// ZAxis///
IF ChartGenerator."ZAxis Field Name" <> '' THEN BEGIN
AddNode('ChartDefinition','ZAxis','');
AddAttribute('ChartDefinition/ZAxis','ShowTitle',BooleanFormat(ChartGenerator."ZAxis Show Title"));
AddNode('ChartDefinition/ZAxis','Field','');
AddAttribute('ChartDefinition/ZAxis/Field','Name',ChartGenerator."ZAxis Field Name");
END;
// YAxis
ChartYAxis.SETRANGE(Company,ChartGenerator.Company);
ChartYAxis.SETRANGE(ID,ChartGenerator.ID);
IF ChartYAxis.FINDSET THEN BEGIN
AddNode('ChartDefinition','YAxis','');
AddAttribute('ChartDefinition/YAxis','ShowTitle',BooleanFormat(ChartYAxis."Show Title"));
AddNode('ChartDefinition/YAxis','Measures','');
REPEAT
AddNode('ChartDefinition/YAxis/Measures','Measure','');
AddAttribute('ChartDefinition/YAxis/Measures/Measure','Operator',FORMAT(ChartYAxis."Mearure Operator"));
AddNode('ChartDefinition/YAxis/Measures/Measure','Field','');
AddAttribute('ChartDefinition/YAxis/Measures/Measure/Field','Name',FORMAT(ChartYAxis."YAxis Measure Field
Caption"));
UNTIL ChartYAxis.NEXT = 0;
END;
TempFileName := TEMPORARYPATH + '\' + FORMAT(CREATEGUID) + '.xml';
XMLDoc.save(TempFileName);
IF NOT Chart.GET(ChartGenerator.Company,ChartGenerator.ID) THEN BEGIN
Chart.Company := ChartGenerator.Company;
Chart.ID := ChartGenerator.ID;
Chart.Name := ChartGenerator.Name;
Chart.INSERT;
END;
Chart.BLOB.IMPORT(TempFileName);
Chart.MODIFY;
IF Debug THEN
XMLDoc.save(DebugFileName);
// Clean up
IF EXISTS(TempFileName) THEN
ERASE(TempFileName);
CLEAR(DomNode);
CLEAR(XMLDoc);
END;
PROCEDURE AddNode@2(AddToNode@1000 : Text[120];NodeName@1001 : Text[120];NodeValue@1002 : Text[120]);
BEGIN
DomNodeList := XMLDoc.selectNodes(AddToNode);
DomNode := DomNodeList.item(DomNodeList.length - 1);
DomNode2 := XMLDoc.createNode(1,NodeName,NameSpace);
DomTextNode := XMLDoc.createTextNode(NodeValue);
DomNode2.appendChild(DomTextNode);
DomNode.appendChild(DomNode2);
END;
PROCEDURE AddAttribute@3(AddToNode@1000 : Text[120];AttributeName@1001 : Text[120];AttributeValue@1002 : Text[120]);
BEGIN
DomNodeList := XMLDoc.selectNodes(AddToNode);
DomNode := DomNodeList.item(DomNodeList.length - 1);
DomAttribute := XMLDoc.createAttribute(AttributeName);
DomAttribute.value := AttributeValue;
DomNode.attributes.setNamedItem(DomAttribute);
END;
PROCEDURE BooleanFormat@4(Boo@1000 : Boolean) : Text[30];
BEGIN
IF Boo THEN
EXIT('true');
EXIT('false');
END;
EVENT XMLDoc@1000::ondataavailable@198();
BEGIN
END;
EVENT XMLDoc@1000::onreadystatechange@-609();
BEGIN
END;
BEGIN
END.
}
}
Comments
Anonymous
October 19, 2008
PingBack from http://blogs.msdn.com/nav_developer/archive/2008/08/20/nav-2009-how-to-generate-charts-kpis.aspxAnonymous
March 18, 2011
When I attempt to make a 3D Chart, I get an error that Form 72002 does not exist. I will have a programmer look at it. Thanks for the great Chart Creation Tool. The native Dynamics NAV Chart Export/Import functionality is very weak. Have you considered transforming to pages and using in RTC? Your solutions are appreciated.