Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расчеты из полей с датой, Как произвести расчеты из двух дат.. 
V
    Опции темы
crem78
Дата 4.8.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.8.2008

Репутация: нет
Всего: нет



Доброго время суток, господа эксперты. Есть две задачи, вроде решаются просто, но с чего подойти, толком не знаю. Итак, первое: - Есть компонент Table, DBGrid, поле с датой из базы, назовем ее Data1. При нажатии кнопки должна происходить процедура. Берется текущая дата на сегодня, к ней прибавляется неделя или 7 дней, получается результат расчета (число месяц год). Если результат совпадает со строчкой в поле Data1, то строка закрашивается красным цветом. smile 

Вторая задача, такого же типа  только наоборот. Из текущей даты вычитаем 3 месяца (90 дней), полученный результат сверяется с полем Data 2, если совпадает, строка закрашивается зеленым цветом.
 smile 
PM MAIL   Вверх
Savek
Дата 4.8.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin

if Column.FieldName='Data1' then
  if Column.Field.AsDateTime=Date+7 then
      DBGrid1.Canvas.Brush.Color:=clRed;

if Column.FieldName='Data2' then
  if Column.Field.AsDateTime=Date-90 then
      DBGrid1.Canvas.Brush.Color:=clGreen;

DBGrid1.DefaultDrawColumnCell(rect,DataCol,column,state);

end;


Это сообщение отредактировал(а) Savek - 4.8.2008, 14:26
PM MAIL   Вверх
pseud
Дата 4.8.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



crem78Savek
3 месяца - все-таки никогда не равны 90 (кроме январь_фераль_март);

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  d: TDate;
begin
  if Column.FieldName = 'Data1' then
  begin
    d := Integer(Column.Field.AsDateTime); // чтобы не мешала временная составляющая
    d := d - 7;
    if d = Date then
      DBGrid1.Canvas.Brush.Color := clRed;
  end else
  if Column.FieldName = 'Data2' then
  begin
    d := Integer(Column.Field.AsDateTime);
    IncMonth(d, 3); // именно 3 месяца, а не 90 дней
    if d = Date then
      DBGrid1.Canvas.Brush.Color:=clGreen;
  end;

  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
crem78
Дата 4.8.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.8.2008

Репутация: нет
Всего: нет



Хорошо, а если использовать SQL запросы, какой результат. Думаю, что только он имеет такие широкие возможности. В SQL запросах не селен, помогите решить задачи. smile 
PM MAIL   Вверх
Poseidon
Дата 4.8.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 3
Всего: 133



Используя SQL-запрос ты не закрасишь строку в DBGrid. И вообще, ты не правильно понимаешь суть задачи. Ты получаешь данные в DBGrid и исходя из этих данных должен закрасить одну из строк DBGrid. Получается, что от БД тебе нужно только получить данные. Закрашивание уже происходит на уровне компонента DBGrid, а не на уровне базы. SQL-запросы работают на уровне базы. Вот если тебе надо получить из БД только данные, удовлетворяющие условию "Если результат совпадает...", то тогда можно. Но, как я понимаю, тебе нужно видеть все данные, и только нужные выделять закрашиванием. Тогда через DrawColumnCell, как тебе и подсказали.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
crem78
Дата 5.8.2008, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.8.2008

Репутация: нет
Всего: нет



Цитата(pseud @ 4.8.2008,  15:42)
crem78Savek
3 месяца - все-таки никогда не равны 90 (кроме январь_фераль_март);

Код

   d := Integer(Column.Field.AsDateTime); // чтобы не мешала временная составляющая

Пишет ошибку: Invalid typecast smile 

А по поводу 90 дней или 3 месяцев, так ты прав необходимо 3 месяца. smile

Добавлено @ 07:30
Что про SQL запросы, так понимаю, что он работает на уровне запросов. Если попробовать выдернуть данные из базы, как код запроса будет выглядеть? В последующем передать их допустим в QReport  smile 

Это сообщение отредактировал(а) crem78 - 5.8.2008, 07:35
PM MAIL   Вверх
pseud
Дата 5.8.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(crem78 @  5.8.2008,  07:30 Найти цитируемый пост)
Пишет ошибку: Invalid typecast


Код

d := Int(Column.Field.AsDateTime);


Добавлено через 2 минуты и 15 секунд
Цитата(crem78 @  5.8.2008,  07:30 Найти цитируемый пост)
 Если попробовать выдернуть данные из базы, как код запроса будет выглядеть?

ответ на твой вопрос прост:
Код

select
  *
from 
  dual
 
как говорится "какой вопрос"

ты конкретизируй что тебе надо. 
я, честно говря, из первого поста не понял, что тебе надо выдернуть.

Добавлено через 3 минуты и 47 секунд
да и что за БД не забудь указать.
а то, если надо выдернуть нечто специфическое, то у каждой БД свои особенности языка SQL.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
crem78
Дата 5.8.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.8.2008

Репутация: нет
Всего: нет



 smile Спасибо за помощь, воспользовался следующим кодом:

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  d: TDate;
begin
  if Column.FieldName = 'Data1' then
  begin
    d := Integer(Column.Field.AsDateTime); // чтобы не мешала временная составляющая
    d := d - 7;
    if d = Date then
      DBGrid1.Canvas.Brush.Color := clRed;
  end else
  if Column.FieldName = 'Data2' then
  begin
    d := Integer(Column.Field.AsDateTime);
    IncMonth(d, 3); // именно 3 месяца, а не 90 дней
    if d = Date then
      DBGrid1.Canvas.Brush.Color:=clGreen;
  end;

  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


Теперь вопрос на засыпку, если за место строки в коде:

Код

DBGrid1.Canvas.Brush.Color := clRed;


Прописать отправку найденных строк в Qreport, возможно ли это организовать, если да то как? smile 

PM MAIL   Вверх
pseud
Дата 5.8.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(crem78 @  5.8.2008,  11:59 Найти цитируемый пост)
Прописать отправку найденных строк в Qreport


1. точно не в этом методе.
2. лучше сформировать отдельную выборку SQL. метод формирования выборки зависит от используемой СУБД.

Добавлено через 13 минут и 16 секунд
предположим у тебя база Paradox
тогда можешь подключить к отчету приблизительно такой DataSet
Код

  with Query1 do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT          ');
    SQL.Add('  *             ');
    SQL.Add('FROM            ');
    SQL.Add('  таблица t     ');
    SQL.Add('WHERE           ');
    SQL.Add('  t.Data1 + 7 < ' + QuotedStr(DateToStr(Date)));
    Active := True;
  end;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
crem78
Дата 6.8.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.8.2008

Репутация: нет
Всего: нет



Цитата(pseud @ 5.8.2008,  13:48)
Цитата(crem78 @  5.8.2008,  11:59 Найти цитируемый пост)
Прописать отправку найденных строк в Qreport


1. точно не в этом методе.
2. лучше сформировать отдельную выборку SQL. метод формирования выборки зависит от используемой СУБД.

Добавлено @ 14:01
предположим у тебя база Paradox
тогда можешь подключить к отчету приблизительно такой DataSet
Код

  with Query1 do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT          ');
    SQL.Add('  *             ');
    SQL.Add('FROM            ');
    SQL.Add('  таблица t     ');
    SQL.Add('WHERE           ');
    SQL.Add('  t.Data1 + 7 < ' + QuotedStr(DateToStr(Date)));
    Active := True;
  end;

Пробовал использовать твой код:

Код

with Query1 do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT          ');
    SQL.Add('  *             ');
    SQL.Add('FROM            ');
    SQL.Add('"base.DB" Base');
    SQL.Add('WHERE           ');
    SQL.Add('Base.Otsldata + 7 < ' + QuotedStr(DateToStr(Date)));
    Active := True;
  end;


В итоге DBGide не остается не одной строчки.  smile  smile 
Недавно начал использовать  FastReport 4.0, все нравиться. Вопрос до сих пор остается открытый, как организовать задачи для передачи результатов в рапорт, а именно FastReport 4.0?   smile 


Это сообщение отредактировал(а) Rodman - 7.8.2008, 21:48
PM MAIL   Вверх
Poseidon
Дата 6.8.2008, 23:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 3
Всего: 133



Цитата(crem78 @  6.8.2008,  16:16 Найти цитируемый пост)
В итоге DBGide не остается не одной строчки. 
DBGide - это что? И у тебя в проекте только приведенный код? Query1 у тебя вообще связана с БД? С Query1 что-нибудь связано?

Цитата(crem78 @  6.8.2008,  16:16 Найти цитируемый пост)
как организовать задачи для передачи результатов в рапорт, а именно FastReport 4.0
Ты мне вот раскажи, как ты вообще передаешь данные в отчет? Все-равно какие данные. Как ты это делаешь? Что-то мне подсказывает, что тут вопрос более глобальный, чам просто "подскажите как сделать конкретно вот это". Вообще понимаешь весь смысл создания отчета? Что, откуда и как берется? Покажи хоть как сам пробовал создать отчет.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
crem78
  Дата 7.8.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.8.2008

Репутация: нет
Всего: нет



Сначала была задача просто сделать раскраску для строк при определенных условия (кто не помнит, смотри выше). Теперь задача несколько поменялась. Необходимо вывести отбор записей по условиям и передать их в отчет. Прочитав множество материалов про FastReport, узнал множество интересного, а именно про то, что внутри программы имеется скриптовый язык (PascalScript, C++Script, Jscript, BasicScript). Т.е. перед тем, как отчет будет создан, можно задать условия, по которым отчет должен формироваться. В моем случае задача простая, но большими знаниями в разработке программ просто не имею, поэтому прошу помочь мне в моей задаче. Если спросите, что есть же PascalScript он простой, написан 100% на PascalObject, скажу, просто не помню. Использую базу base.DB, компоненты Table, DBGrid. Вроде бы все, что нужно было, создал, но остался последний рывок, это формирование отчетов. Посоветуйте как решить задачу. smile  smile 
PM MAIL   Вверх
Kbl4AH
Дата 7.8.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



2crem78, а зачем тебе вообще DBGrid, если результат запроса нужно вернуть только в отчет? Делай нужную выборку данных при помощи DataSet и сразу в отчет вставляй.

Это сообщение отредактировал(а) Kbl4AH - 7.8.2008, 15:36
PM MAIL ICQ   Вверх
crem78
Дата 7.8.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.8.2008

Репутация: нет
Всего: нет



Дык, DBGrid мне и не нужен, мне и нужно сразу ставить в отчет выборку. Т.е. в отчете должны быть только отфильтрованные строки, строки по условию. Меня интересует конкретный пример как это реализовать. Спасибо.  smile 
PM MAIL   Вверх
Akella
Дата 7.8.2008, 21:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(crem78 @  4.8.2008,  14:13 Найти цитируемый пост)
3 месяца (90 дней)

учти, что 3 месяца <> 90 дней!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1272 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.