Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

tdbchart and the label for maximum values

Posted on 2008-10-08
Medium Priority
467 Views
Hello Guys,
I have a database with data from scale. I make a chart which shows the production from one week and I would like to show the labels for maximum values of weight. Is it possible?
I mean the label on the top of every peak. By every peak I mean the max value of weight.
The x axis is weight and Y is date&time.
Now if i have 1000 records with weight i see every label on the diagram, or I can turn off all labels. You can imagine the mess on the diagram.
Best Regards
Vaalar
0
Question by:Vaalar
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 3
• 2

LVL 14

Expert Comment

ID: 22681778
If I understand your question correctly, I think you can accompilsh this by using the OnGetNextAxisLabel Event:
First you would have to find your highest value, This is a simple example:

procedure TForm1.DBChart1BeforeDrawAxes(Sender: TObject);
begin
Table1.First;
HighestValue := 0; // declared in the private section of the Form
while not Table1.Eof do
begin
if HighestValue < Table1.FieldByName('Amount').AsInteger then
HighestValue := Table1.FieldByName('Amount').AsInteger;
Table1.Next;
end;
end;

Then in the OnGetNextAxisLabel:

procedure TForm1.DBChart1GetNextAxisLabel(Sender: TChartAxis;  LabelIndex: Integer; var LabelValue: Double; var Stop: Boolean);
begin
if Sender=DBChart1.LeftAxis then
Begin
// This will draw Labels at 200s and the Highest value
if (LabelIndex mod 200 = 0) or (LabelIndex = HighestValue) then
LabelValue := LabelIndex;
End;
Stop:=False;
end;
0

Author Comment

ID: 22685112
Hello Steve,
Thx for your help. I`m wondering is it possible to use ADOQuery1 for this issue. I will explain why:
As I said the data comes from scale, so if I choose the period of week I should receive 7 highest values on my chart. For example I`m choosing the range from 2008-10-06 to 2008-10-10 from 06:00:00 to 14:00:00, now I receive the chart of production.
I`m realizing this by this query:
'SELECT SUM(MASY_DZIEN.MASA_MAX)FROM (SELECT MAX(MASA) AS MASA_MAX FROM PRODUKCJA WHERE WAGA = :waga AND MASA BETWEEN :masa_od AND :masa_do AND DATA BETWEEN Convert(DateTime, :data_od) AND Convert(DateTime, :data_do)'+
'AND CZAS >= Convert(DateTime, :czas_od) AND CZAS <= Convert(DateTime, :czas_do) GROUP BY convert(varchar(10), DATA, 105 )) masy_dzien'
Maybe there is a way to use my query and receive the max values in some kind of array.
I`m not sure becouse I`m newbe in Delphi and sql.
Best Regards
Vaalra
0

LVL 14

Expert Comment

ID: 22686883
Are you saying that you will have 1000 records in your chart and you wish to only show a label for the highest value in each week?
0

Author Comment

ID: 22687109
no the highest value for every day in a week between 06:00:00 and 14:00:00
0

LVL 14

Accepted Solution

SteveBay earned 2000 total points
ID: 22687408
Ok. I think you are right that you could do it with a Query. I am not as good at SQL as I am with Delphi :).
Perhaps some thing like this:
``````//....
private
{ Private declarations }
HighValues : TList;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{\$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
HighValues := TList.Create;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
HighValues.Free;
end;

procedure TForm1.DBChart1GetNextAxisLabel(Sender: TChartAxis;
LabelIndex: Integer; var LabelValue: Double; var Stop: Boolean);
begin
if Sender=DBChart1.LeftAxis then
Begin
if ( HighValues.IndexOf(Pointer(LabelIndex)) > -1 ) then
LabelValue := LabelIndex;
End;
Stop:=False;
end;

procedure TForm1.DBChart1BeforeDrawAxes(Sender: TObject);
var Weight, DOW : Integer;

begin
HighValues.Clear;
for DOW := 0 to 6 do

Table1.First;
while not Table1.Eof do
begin
DOW := DayOfWeek(Table1.FieldByName('Date').AsDateTime) - 1;
Weight := Table1.FieldByName('Weight').AsInteger;
if Integer(HighValues[DOW]) <  Weight then
HighValues[DOW] := Pointer(Weight);
Table1.Next;
end;
end;
``````
0

LVL 38

Expert Comment

ID: 22687425
I dunno what database you are using but with oracle
you would LAG or LEAD in combination with MAX
LAG is analytic function and with it you could compare the current record to the previous one
detecting if you have an up slope or down slope
on the up slope you would then use the max function
this would then result in a field which is only filled in on the peak values
0

Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
This is my first video review of Microsoft Bookings, I will be doing a part two with a bit more information, but wanted to get this out to you folks.
In this video, Percona Director of Solution Engineering Jon Tobin discusses the function and features of Percona Server for MongoDB. How Percona can help Percona can help you determine if Percona Server for MongoDB is the right solution for …
Suggested Courses
Course of the Month11 days, 2 hours left to enroll