Marks and Crosstab

TeeChart VCL for Borland/CodeGear/Embarcadero RAD Studio, Delphi and C++ Builder.
Post Reply
WarmBooter
Newbie
Newbie
Posts: 33
Joined: Thu Mar 18, 2004 5:00 am
Location: Brasil
Contact:

Marks and Crosstab

Post by WarmBooter » Mon May 25, 2015 1:10 pm

I'm using a TDBChart with Crosstab datasource and Bar series. In the chart editor, I can set the marks as not visible and the chart is previewed correctly (without the marks). But in runtime, when the chart is draw, only the marks of the first series are hidden... all the marks of the other series are visible.

I tried to do this, but it didnt help:

Code: Select all

      myDataset.Open;
      myCrossTab.Refresh;
      with DBChart11 do
      begin
        for I := 0 to SeriesCount -1 do
          Series[i].Marks.Visible:=false;
      end;
Also, the horizontal (bottom) axis is set to DateTime and format MM/yyyy, but it is draw as a full date, without respecting the format.

Any help?

Carlos

WarmBooter
Newbie
Newbie
Posts: 33
Joined: Thu Mar 18, 2004 5:00 am
Location: Brasil
Contact:

Re: Marks and Crosstab

Post by WarmBooter » Mon May 25, 2015 7:37 pm

Well, I could solve the problem with the Marks... the problem is that that piece of code was inside a DisableControls/EnableControls session, and when EnableControls is called, for some reason, the chart make the series marks visible again.

Still could not solve the Axis format problem.

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Marks and Crosstab

Post by Yeray » Tue May 26, 2015 2:05 pm

Hello,
WarmBooter wrote:Also, the horizontal (bottom) axis is set to DateTime and format MM/yyyy, but it is draw as a full date, without respecting the format.
WarmBooter wrote:Still could not solve the Axis format problem.
Maybe you've set labels on the series. Note that by default the bottom axis labels style is set to "Auto" and this show the series labels if they are populated.
If that's not the case we'll need to see how are you setting your chart, so I'd ask for a simple example project we can run as-is to reproduce the problem here.
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

WarmBooter
Newbie
Newbie
Posts: 33
Joined: Thu Mar 18, 2004 5:00 am
Location: Brasil
Contact:

Re: Marks and Crosstab

Post by WarmBooter » Tue May 26, 2015 4:19 pm

The Axis labels are set as Marks, since this was the only way I found to have the desired value printed. The problem is that it doesn't respect the datetime format mask that I had defined.

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Marks and Crosstab

Post by Yeray » Wed May 27, 2015 8:25 am

Hello,

Then the problem will probably be in the formatting of the datetime when you are adding it to the values.
If you are using Add(value, label, color) to add your points to the series, check that "label" string you are entering has the correct string.

The Axis DateTimeFormat is only used when LabelStyle is set to talValue, talPointValue or talAuto (talAuto - without labels on the series).
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

WarmBooter
Newbie
Newbie
Posts: 33
Joined: Thu Mar 18, 2004 5:00 am
Location: Brasil
Contact:

Re: Marks and Crosstab

Post by WarmBooter » Wed May 27, 2015 11:43 am

Yeray wrote:Hello,
Then the problem will probably be in the formatting of the datetime when you are adding it to the values.
If you are using Add(value, label, color) to add your points to the series, check that "label" string you are entering has the correct string.
The source of the data is a query and the chart is configured as crosstab, so all points, etc. are being added automatically.
Yeray wrote: The Axis DateTimeFormat is only used when LabelStyle is set to talValue, talPointValue or talAuto (talAuto - without labels on the series).
Problem is that using Value, PointValue or Auto doesnt display the desired value... only setting as Marks did it (almost).

Image

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Marks and Crosstab

Post by Yeray » Wed May 27, 2015 1:18 pm

Hello,

Check the values of the "REFERENTE" field at the "tqCancelamentos" dataset. This field probably contains strings formatted from a date as "dd/mm/yyyy".
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

WarmBooter
Newbie
Newbie
Posts: 33
Joined: Thu Mar 18, 2004 5:00 am
Location: Brasil
Contact:

Re: Marks and Crosstab

Post by WarmBooter » Wed May 27, 2015 1:36 pm

Yeray wrote:Hello,
Check the values of the "REFERENTE" field at the "tqCancelamentos" dataset. This field probably contains strings formatted from a date as "dd/mm/yyyy".
In the dataset, REFERENTE is a TDateField, so, not a string. Also, no displayformat assigned to it.

Carlos

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Marks and Crosstab

Post by Yeray » Wed May 27, 2015 4:14 pm

Hi Carlos,

I see TDBCrossTabSource takes the label field set and formats it without considering the Axis DateTimeFormat:

Code: Select all

tmpLabel:=tmpLabelField.AsString;
I'm not sure if modifying this would be a good idea. Ie note that having "MM/yyyy" as DateTimeFormat you'd loose the day information and then you wouldn't be able to show the day in the marks or anywhere else.

At this moment, the best workaround I can think on would be using the Chart OnGetAxisLabel to convert the label to DateTime and then back to string using your axis DateTimeFormat. Ie:

Code: Select all

uses DateUtils;

procedure TForm1.DBChart1GetAxisLabel(Sender: TChartAxis; Series: TChartSeries;
  ValueIndex: Integer; var LabelText: string);
var tmpDate: TDateTime;
begin
  if (Sender = DBChart1.Axes.Bottom) then
  begin
    tmpDate:=StrToDateTimeDef(LabelText, Today);
    LabelText:=FormatDateTime(DBChart1.Axes.Bottom.DateTimeFormat, tmpDate);
  end;
end;
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

WarmBooter
Newbie
Newbie
Posts: 33
Joined: Thu Mar 18, 2004 5:00 am
Location: Brasil
Contact:

Re: Marks and Crosstab

Post by WarmBooter » Wed May 27, 2015 5:42 pm

Yeray wrote: I'm not sure if modifying this would be a good idea. Ie note that having "MM/yyyy" as DateTimeFormat you'd loose the day information and then you wouldn't be able to show the day in the marks or anywhere else.
In my case, this would not be a problem, since the day is always 01. I use that field to represent the month+year that something refers to (day doesn't matter, so it is stored always as day 1).

Carlos

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Marks and Crosstab

Post by Yeray » Thu May 28, 2015 11:04 am

Hi Carlos,

Another alternative would be triggering the series' OnAfterAdd event to modify the label of point that has been added. Ie using the "orders" table in the "TeeChart Pro Database" shipped with the installation:

Code: Select all

uses Series, DBTables, TeeDBCrossTab, TeeDBCrossTabEditor, DateUtils;

procedure TForm1.FormCreate(Sender: TObject);
var Series1: TBarSeries;
    Table1: TTable;
    DBCrossTabSource1: TDBCrossTabSource;
begin
  DBChart1.View3D:=false;
  DBChart1.Axes.Bottom.DateTimeFormat:='MM/yyyy';

  Table1:=TTable.Create(Self);
  with Table1 do
  begin
    DatabaseName:='TeeChart Pro Database';
    TableName:='orders';
    Filter:='EMPNO=4';
    Filtered:=True;
  end;

  DBCrossTabSource1:=TDBCrossTabSource.Create(Self);
  with DBCrossTabSource1 do
  begin
    DataSet:=Table1;
    GroupField:='EMPNO';
    LabelField:='SALEDATE';
    ValueField:='ITEMTOTAL';
  end;

  Series1:=DBChart1.AddSeries(TBarSeries) as TBarSeries;
  with Series1 do
  begin
    //OnAfterAdd:=SeriesAfterAdd;  // uncomment this to activate the workaround
    DataSource:=DBCrossTabSource1;
    XValues.DateTime:=True;
  end;

  DBCrossTabSource1.Series:=Series1;
  DBCrossTabSource1.Active:=true;
  Table1.Active:=true;
end;

procedure TForm1.SeriesAfterAdd(Sender:TChartSeries; ValueIndex:Integer);
var tmpDate: TDateTime;
begin
  tmpDate:=StrToDateTimeDef(Sender.Labels[ValueIndex], Today);
  Sender.Labels[ValueIndex]:=FormatDateTime(DBChart1.Axes.Bottom.DateTimeFormat, tmpDate);
end;
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Post Reply