Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: greenpc
Дата сообщения: 11.03.2010 09:08
Man Without Face

Код:
j:=Trunc(cxdedReservFrom.Date);
while j<=Trunc(cxdedReservTo.Date) do begin
...
else
j:=j-1;
...
inc(j); //или j:=j+1;
end;
Автор: Man Without Face
Дата сообщения: 11.03.2010 09:51
greenpc
Спасибо, но происходит зацикливание. Не выходит из цикла потому что при неправильном условии постоянно отнимаю единицу, j не может стать больше cxdedReservTo.Date
Автор: greenpc
Дата сообщения: 11.03.2010 09:55
Man Without Face
что Вы спросили

Цитата:
можно ли как нибудь если условие не выполняется откинуть счетчик на одну единицу назад (один день):

то я вам и ответил. Задавайте пожалуста правильно вопросы.
Автор: Man Without Face
Дата сообщения: 11.03.2010 09:55
Полный код:
[more]
dbChart1.SeriesList.Clear; //Очищаю график
begin
//Подсчитываю количество линий:
count_product:=0;
while not(qCharts.Eof) do begin
inc(count_product);
SetLength(mproduct,count_product);
mproduct[count_product-1]:=qCharts.FieldByName('rc_smenavol_volumenum').AsInteger;
qCharts.Next;
end;
//Строю график

qChart2.Open;
for i:=0 to count_product-1 do begin
SetLength(mseries,dbChart1.SeriesList.Count+1);
mseries[dbChart1.SeriesList.Count]:=TFastLineSeries.Create(dbChart1);
mseries[dbChart1.SeriesList.Count].LinePen.Width:=2;
dbChart1.AddSeries(mseries[dbChart1.SeriesList.Count]);

j:=Trunc(cxdedReservFrom.Date);
while j<=Trunc(cxdedReservTo.Date) do begin

if (qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct[i])and(trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime)=j) then begin
if cxRadioGroup1.ItemIndex = 0 then
begin //График фактического отклонения движения за смену от расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakdvforsmena').AsInteger,DateToStr(j));
end
else
begin //График фактического остатка от нарастающего расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger,DateToStr(j));
end;
mseries[dbChart1.SeriesList.Count-1].SeriesColor:=qChart2.FieldByName('producttypes_color').AsInteger;
mseries[dbChart1.SeriesList.Count-1].Title:=qChart2.FieldByName('producttypes_productname').AsString + ' ('+
qChart2.FieldByName('rc_smenavol_volumenum').AsString + ' резервуар)';
qChart2.Next;
end
else
begin
j:=j-1;
qChart2.Next;
end;
inc(j);
end;
end;
end;
[/more]
Автор: greenpc
Дата сообщения: 11.03.2010 10:06
Man Without Face

Код: ....
qChart2.FieldByName('rc_smenavol_volumenum').AsString + ' резервуар)';
inc(j);
end; // Для if
qChart2.Next;
// только еще бы добавил
if qChart2.eof then break;
end; // для while
Автор: Man Without Face
Дата сообщения: 11.03.2010 10:32
greenpc
Не совсем понял, если можно поподробнее. Но if qChart2.eof then break; это отработает только когда все линии построятся, а у меня нужно после каждой выход делать. Спасибо.
Автор: greenpc
Дата сообщения: 11.03.2010 10:54
Man Without Face

Код:
j:=Trunc(cxdedReservFrom.Date);
while j<=Trunc(cxdedReservTo.Date) do begin

if (qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct[i])and(trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime)=j) then begin
if cxRadioGroup1.ItemIndex = 0 then
begin //График фактического отклонения движения за смену от расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakdvforsmena').AsInteger,DateToStr(j));
end
else
begin //График фактического остатка от нарастающего расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger,DateToStr(j));
end;
mseries[dbChart1.SeriesList.Count-1].SeriesColor:=qChart2.FieldByName('producttypes_color').AsInteger;
mseries[dbChart1.SeriesList.Count-1].Title:=qChart2.FieldByName('producttypes_productname').AsString + ' ('+
qChart2.FieldByName('rc_smenavol_volumenum').AsString + ' резервуар)';
inc(j);
end;
qChart2.Next;
if qChart2.eof then break;
end;
Автор: delover
Дата сообщения: 11.03.2010 10:54
Man Without Face
Дочерние условия лучше (IMHO) добавлять в том порядке котором пишете на бумаге. Примерно так:

Код:
if qChart2.eof then break;
v--\
i:=1;j:=2; t:=11
if qChart2.submacro.eof or odd(j) then break;
Автор: Man Without Face
Дата сообщения: 11.03.2010 11:16
greenpc
Делается выборка из базы по двум датам. График нормально строился бы, если бы на каждую дату была бы одна запись (по определенному резервуару (кол. резервуаров = кол. линий на графике, заранее не известно)), но бывает когда в один день несколько смен. Получается на одну дату две записи. Когда строю график первая запись выводится и счетчик переходит на другую дату, вторая запись не выводится, т.к. ее дата не равняется дате счетчика. В итоге происходит смешение и все другие записи тоже не выводятся.
Автор: greenpc
Дата сообщения: 11.03.2010 11:48
Man Without Face
после
Код: for i:=0 to count_product-1 do begin
Автор: Odysseos
Дата сообщения: 11.03.2010 11:58
Man Without Face

Получается на одну дату две записи.

А как они должны отображаться на графике? Одна поверх другой? Или график для таких дней будет "шире"? Или график для любого дня должен быть одинаковой "ширины", соответствующей максимальному количеству смен?

Также - как должны отображаться дни, для которых вообще нет записей в БД?

...Иными словами - по оси X должны быть даты или смены?
Автор: Man Without Face
Дата сообщения: 11.03.2010 12:06
Odysseos
По оси Х даты. Если за одну дату две смены, тогда дата дублируется.


Добавлено:
greenpc
Итак же дата сет на первой записи стоит?

Добавлено:
И к тому же если стану после вывода первой линии на первую запись, опять отрисуется первая, а не вторая...
Автор: greenpc
Дата сообщения: 11.03.2010 12:14
Odysseos

Цитата:
Также - как должны отображаться дни, для которых вообще нет записей в БД

я бы сказал как должен отображаться график
Man Without Face

Код:
for j:=Trunc(cxdedReservFrom.Date) to
Trunc(cxdedReservTo.Date) do begin
if qChart2.locate('rc_smenavol_volumenum; rc_sd_begindate', VarArrayOf([mproduct[i], j]),[]) then begin
if cxRadioGroup1.ItemIndex = 0 then
begin //График фактического отклонения движения за смену от расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakdvforsmena').AsInteger,DateToStr(j));
end
else
begin //График фактического остатка от нарастающего расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger,DateToStr(j));
end;
mseries[dbChart1.SeriesList.Count-1].SeriesColor:=qChart2.FieldByName('producttypes_color').AsInteger;
mseries[dbChart1.SeriesList.Count-1].Title:=qChart2.FieldByName('producttypes_productname').AsString + ' ('+
qChart2.FieldByName('rc_smenavol_volumenum').AsString + ' резервуар)';
end;
end;
Автор: Man Without Face
Дата сообщения: 11.03.2010 12:35
greenpc Не совсем я может вопрос понял. Данные сравниваю по дате и резервуару.

//Подсчитываю количество линий:
count_product:=0;
while not(qCharts.Eof) do begin
inc(count_product);
SetLength(mproduct,count_product);
mproduct[count_product-1]:=qCharts.FieldByName('rc_smenavol_volumenum').AsInteger;
qCharts.Next;
end;


Добавлено:
rc_smenavol_volumenum - резервуары
Автор: greenpc
Дата сообщения: 11.03.2010 12:59
Man Without Face

Цитата:
Не совсем я может вопрос понял

где должен находиться график, если нет записи для данного резервуара на дату
в нуле или иметь прошлое значение.
PS: результат предыдущего решения?
Автор: Man Without Face
Дата сообщения: 11.03.2010 13:02
greenpc
В нуле
Автор: greenpc
Дата сообщения: 11.03.2010 13:20
Man Without Face
проверь чему равно count_product
код виден при редактировании сообщения #
Автор: Man Without Face
Дата сообщения: 11.03.2010 14:09
greenpc Какого именно сообщения?


Добавлено:
greenpc

for j:=Trunc(cxdedReservFrom.Date) to
Trunc(cxdedReservTo.Date) do begin
if qChart2.locate('rc_smenavol_volumenum; rc_sd_begindate', VarArrayOf([mproduct[i], j]),[]) then begin
if cxRadioGroup1.ItemIndex = 0 then
begin //График фактического отклонения движения за смену от расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakdvforsmena').AsInteger,DateToStr(j));
end
else
begin //График фактического остатка от нарастающего расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger,DateToStr(j));
end;
mseries[dbChart1.SeriesList.Count-1].SeriesColor:=qChart2.FieldByName('producttypes_color').AsInteger;
mseries[dbChart1.SeriesList.Count-1].Title:=qChart2.FieldByName('producttypes_productname').AsString + ' ('+
qChart2.FieldByName('rc_smenavol_volumenum').AsString + ' резервуар)';
end;
end;

Так строится но не за все даты
Автор: greenpc
Дата сообщения: 11.03.2010 14:13
Man Without Face
в моем сообщении Отправлено: 14:20 11-03-2010 | Исправлено: greenpc, 14:33 11-03-2010
нажми кнопку "Редактировать"
Автор: Man Without Face
Дата сообщения: 11.03.2010 14:46
greenpc
Я передаю в датасет id заправки, так вот по одним заправкам вообще не строится, а по другим за определенные даты строится, а за другие нет (значение 0)
Автор: greenpc
Дата сообщения: 11.03.2010 15:36
Man Without Face
понимаете телепатов нет.
что за датасет?
какое отношение он имеет к предыдущему вопросу?
поле даты содержит время?
какая структура датасета?
ну и кусок тестовых данных в студию.
Автор: Odysseos
Дата сообщения: 11.03.2010 16:35
Man Without Face

Я предложил три варианта на выбор:

1. Для разных смен график будет один поверх другого;
2. График для дней с несколькими сменами будет "шире";
3. График для любого дня должен быть одинаковой "ширины", соответствующей максимальному количеству смен.

Кроме того, я попросил уточнить - как должны отображаться дни, для которых вообще нет записей в БД.

И я не понимаю, к которому же из вариантов, предложенных мной, относится ответ "По оси Х даты. Если за одну дату две смены, тогда дата дублируется.".

Выберите, plz, один вариант из трех, и не забудьте ответить на уточняющий вопрос.
Автор: greenpc
Дата сообщения: 12.03.2010 06:50
Odysseos
я думаю должно получиться типа такого
Автор: Man Without Face
Дата сообщения: 12.03.2010 08:12
greenpc
Да, по x дата (rc_sd_begindate), без времени, по y количество литров (otklon_fakdvforsmena или otklon_fakrestfromincrease, в зависимости от графика). Каждая линия это резервуар с топливом (заранее не известно сколько резервуаров). Проблема в том что график нормально строится если каждой дате соответствует одна запись (if (qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct[i]) and(trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime)=j)). Но бывает когда за один день было 2 смены (выборку делаю по сменам из базы, Sql [more]
SELECT DISTINCT "PT"."producttypes_productname",
"PT"."producttypes_color",
"V"."RC_SMENAVOL",
"V"."rc_smenavol_volumenum",
"V"."rc_smenavol_header",
"V"."rc_smenavol_bookbegsmena",
"V"."rc_smenavol_bookendsmena",
"V"."rc_smenavol_litrtrkofvolume",
"V"."rc_smenavol_begsmena",
"V"."rc_smenavol_endsmena",
"V"."rc_smenavol_deltavolume",
"V"."rc_smenavol_litrinput",
"V"."rc_smenavol_product",
"V"."rc_smenavol_bookendsmena" as "rc_smenavol_bookendsmena_increasing",
s.rc_smenadates,
s.rc_sd_iterator,
s.rc_sd_begindate,
s.rc_sd_enddate,
s.rc_sd_name,
(rc_smenavol_bookbegsmena - rc_smenavol_bookendsmena) AS "bookrealisation",
(rc_smenavol_endsmena - rc_smenavol_begsmena - (rc_smenavol_litrinput - bookrealisation)) as otklon_fakdvforsmena, (rc_smenavol_endsmena - rc_smenavol_bookendsmena) as otklon_fakrestfromincrease
FROM ( "Berlio"."RC_SMENAVOL" AS V JOIN "Berlio"."RC_SMENADATES" AS S ON ("V"."rc_smenavol_header" = "S"."RC_SMENADATES") ) JOIN "Roman"."PRODUCTTYPES" AS PT ON ("V"."rc_smenavol_product" = "PT"."PRODUCTTYPES")
WHERE rc_sd_object = bj AND s.rc_sd_begindate >= ate_from AND s.rc_sd_enddate <= ate_to
ORDER BY V."rc_smenavol_volumenum", s."rc_sd_begindate"
[/more] ), тогда каждой дате соответствует две или более записей. Первую запись выводит, а на второй дата по счетчику уже не равняется дате по записи, и все на этом останавливается. Sql для подсчета кол. резервуаров [more] select distinct t.rc_smenavol_product, t.rc_smenavol_volumenum from berlio.RC_SMENAVOL t, berlio.rc_smenadates m, roman.Producttypes n
where rc_smenavol_header = rc_smenadates
         and m.rc_sd_begindate >= ate_from and m.rc_sd_enddate <= ate_to
and m.rc_sd_object = bj
and t.rc_smenavol_product = n.producttypes
and producttypes_productgroup in (1,2)
order by t.rc_smenavol_volumenum
[/more]
Помогите пожалуйста, третий день уже мучаюсь.
P.S. как вставить картинку в пост?


Добавлено:
Картинку нашел как вставить

Добавлено:

Цитата:
по y количество литров
- опечатался, по y количество отклонений (но это неважно)


Добавлено:
Если за одну дату две смены то будет по Х: 12 мар, 13 мар, 13 мар, 14 мар.
Автор: greenpc
Дата сообщения: 12.03.2010 08:51
Man Without Face
уже легче
давайте отделим мухи налево-котлеты направо.
график (х-дата; у-кол-во литров; линии - резервуары). Так?
если да, то мой график - это то что примерно должно получиться.
тогда в датасет который выводит график содержит поля
(дата. литры. резервуар) и все это только для ОДНОЙ смены!
соотвественно выбор смены это уже другой запрос.
итог: получается классический мастер-детайл
где мастер выбор смены, а детайл по которому стоится график
(дата. литры. резервуар)
ЗЫ: ваши sql запросы мне ни о чем не говорят. т.к. нет хотябы стуктуры таблиц (ну и желательно данных) поэтому првильность sql - это на вашей совести

Добавлено:

Цитата:
12 мар, 13 мар, 13 мар, 14 мар.

интересно! пример графика в студию
Автор: Man Without Face
Дата сообщения: 12.03.2010 09:16

Цитата:
(дата. литры. резервуар) и все это только для ОДНОЙ смены!

Все в одном датасете, в другом выбираю количество резевруаров, т.е. линий сколько будет на графике.
К примеру я сделал запрос с 1 марта по 13 марта, вывело 72 записи. 9 записей по 31 резервуару, 9 по 32, 9 по 33.....9 по 38 (получается 8 резервуаров, т.е. 8 линий на графике). Т.к. у каждого резервуара 9 записей, каждой записи соответствует дата: 1мар, 2мар, 3 мар, 3 мар, 4мар.....8мар. Т.к. 3 марта было 2 смены за день (т.е. две записи), 3 мар на графике нужно вывести два раза (значения по У будут разные). Вот из за этого график не строится когда сравниваю даты. В принципе можно просто все данные вывести из запроса, без сравнения дат. Как это сделать я просто не знаю.

Цитата:
интересно! пример графика в студию

В том то и дело что такого графика нет.



Автор: Odysseos
Дата сообщения: 12.03.2010 10:28
Man Without Face

Мужик!.. Ты на мой вопрос так и не ответил, блин! Это разве так сложно - ответить на уточняющий вопрос, предельно ясно сформированный???

Еще раз его повторю:

Как должен отображаться график, если смен больше одной:

1. Для разных смен график будет один поверх другого;
2. График для дней с несколькими сменами будет "шире";
3. График для любого дня должен быть одинаковой "ширины", соответствующей максимальному количеству смен.

А также - должны ли с нулевым значением отображаться дни, для которых вообще нет записей в БД (или их просто пропускать, и точки на графике будут идти, к примеру, так - 4.03 5.03 5.03 6.03 9.03)?

Ответь, plz, просто номером, а на уточненение просто - да/нет.

...Я тебе твой цикл правильно напишу за пять минут, ты только ответь.


Добавлено:
greenpc

Я думаю, что ни фига не так - я уже понял, в общем, что ему нужен вариант 2, но так и не увидел ответ про даты с отсутствием смен.
Автор: greenpc
Дата сообщения: 12.03.2010 10:42
Odysseos
тогда думаю так

Добавлено:
Ромашка однако так/не так
Автор: Odysseos
Дата сообщения: 12.03.2010 10:52
greenpc

Опять же, кажется, нет. Они ему, похоже, в одном графике нужны, просто как последовательные значения. То есть - по оси X все-таки смены.
Автор: Man Without Face
Дата сообщения: 12.03.2010 10:54
Odysseos 2, да
greenpc так



Добавлено:
Odysseos
Да, по Х смены, у каждой смены дата и разделение на резервуары (кол линий на графике), по У кол отклонений за смену за определенный резервуар.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.