Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.12.2013, 11:34
denISRU denISRU вне форума
Прохожий
 
Регистрация: 24.03.2009
Сообщения: 25
Репутация: 10
Печаль Простой цикл для отчета

Уважаемые, программка формирует отчет, для выбора из таблицы данных я сделал такую "подставку". Проблема в том что программа вылетает если значения в базе пустые.. - как мне это допилить, чтобы при пустом значении вставляло Form4.qrLabel441.Caption:=' ' к примеру?
Код:
DataModule2.AdoQ28.First;
for I := 0 to DataModule2.ADOQ28.RecordCount do
begin

  if DataModule2.ADOQ28.FieldByName('xxxx').Value<>0 then
  begin
  Form4.qrLabel441.Caption:=DataModule2.ADOQ28.FieldByName('xxxx').AsString;
  end;
  DataModule2.AdoQ28.Next;
end;
Ответить с цитированием
  #2  
Старый 24.12.2013, 12:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от denISRU
Уважаемые, программка формирует отчет, для выбора из таблицы данных я сделал такую "подставку". Проблема в том что программа вылетает если значения в базе пустые.. - как мне это допилить, чтобы при пустом значении вставляло Form4.qrLabel441.Caption:=' ' к примеру?
Код:
DataModule2.AdoQ28.First;
for I := 0 to DataModule2.ADOQ28.RecordCount do
begin

  if DataModule2.ADOQ28.FieldByName('xxxx').Value<>0 then
  begin
  Form4.qrLabel441.Caption:=DataModule2.ADOQ28.FieldByName('xxxx').AsString;
  end;
  DataModule2.AdoQ28.Next;
end;
Если убрать проверку "if ...Value<>0 then" он вроде и так будет без ошибок пустую строку присваивать. Разве нет?

С проверкой делается так:
Код:
  if DataModule2.ADOQ28.FieldByName('xxxx').IsNull
    then Form4.qrLabel441.Caption := ' '
    else Form4.qrLabel441.Caption := DataModule2.ADOQ28.FieldByName('xxxx').AsString;

p.s. Не всегда заранее известно количество записей в выборке, поэтому цикл:
Код:
for I := 0 to DataModule2.ADOQ28.RecordCount do
лучше заменить на:
Код:
while not DataModule2.ADOQ28.Eof do
Ответить с цитированием
  #3  
Старый 24.12.2013, 12:59
denISRU denISRU вне форума
Прохожий
 
Регистрация: 24.03.2009
Сообщения: 25
Репутация: 10
По умолчанию

Блин, мне структура понравилась, спасибо за совет, буду стараться прикручивать его - но пока, вставив - программа не выводит значения.. там может быть косяк в базе самой, я особо не знаю там что, может ничего нет в строке, может пробелы - поэтому вот так на наличие проверял - значение больше либо меньше..
Ответить с цитированием
  #4  
Старый 24.12.2013, 13:21
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от denISRU
Блин, мне структура понравилась, спасибо за совет, буду стараться прикручивать его - но пока, вставив - программа не выводит значения.. там может быть косяк в базе самой, я особо не знаю там что, может ничего нет в строке, может пробелы - поэтому вот так на наличие проверял - значение больше либо меньше..
В выборке может быть много записей. У тебя в цикле идёт проход по всем записям и из поля 'xxxx' каждой записи выполняется присвоение значения в qrLabel441.Caption, затирая при этом естественно предыдущее значение (прочитанное из предыдущей записи). Очевидно что после полного выполнения такого цикла в конце в qrLabel441.Caption останется записанным значение поля 'xxxx' из последней записи.
Ответить с цитированием
  #5  
Старый 24.12.2013, 13:29
denISRU denISRU вне форума
Прохожий
 
Регистрация: 24.03.2009
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
В выборке может быть много записей. У тебя в цикле идёт проход по всем записям и из поля 'xxxx' каждой записи выполняется присвоение значения в qrLabel441.Caption, затирая при этом естественно предыдущее значение (прочитанное из предыдущей записи). Очевидно что после полного выполнения такого цикла в конце в qrLabel441.Caption останется записанным значение поля 'xxxx' из последней записи.
Э...и? - то есть мне просто везет что оно не пустое?, смысл в чем, есть большая ДБФка в которой к каждому лицу привязано несколько значений, одно из которых месяц, и в этот конкретный месяц висит цифра, сумма - НО, в ДБФ месяцев много, на каждую морду.. - то-есть да, январей много, февралей много и т.д. а в каком то из февралей записана сумму - которую я вот той подставкой нахожу, и втыкаю в отчет, программа ругается если значение пустое.. а в подсказанном Вами методе, она не ругается - она не выводит эти значения.. - ну может выводит первое.. или еще как то..
Ответить с цитированием
  #6  
Старый 24.12.2013, 13:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Минутку. qrLabel441 - это из Quick Report что-ли? Если так, то там не нужно делать вручную циклов, просто указываешь нужный DataSet и имя поля (DataField) и Quick Report сам выведет все записи из него (после QuickRep1.Preview). Только нужно использовать не TQRLabel, а TQRDBText, так как TQRLabel предназначен для статического текста и поэтому в нём нет свойств DataSet и DataField.
Ответить с цитированием
  #7  
Старый 24.12.2013, 13:56
denISRU denISRU вне форума
Прохожий
 
Регистрация: 24.03.2009
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Минутку. qrLabel441 - это из Quick Report что-ли? Если так, то там не нужно делать вручную циклов, просто указываешь нужный DataSet и имя поля (DataField) и Quick Report сам выведет все записи из него (после QuickRep1.Preview). Только нужно использовать не TQRLabel, а TQRDBText, так как TQRLabel предназначен для статического текста и поэтому в нём нет свойств DataSet и DataField.
Неа.. как раз так и было, но проблема в том что этих...э...занюханных январей и т.п. много, и DBtext из квик репорта так же берет первое значение, а оно в основном пустое.., то есть как бы я проблему то решил вот этим циклом, он перебирает значения, находит положительное или отрицательное (не нулевое) и впихивает в лейбл, а надо бы к нему еще сделать так, чтобы он еще и когда цикл не находит значений не скандалил.. - тоесть ну..вот как бы еще иф вписать, я вообще хотел что то вроде
Код:
если - значение в базе не ноль то присваиваем лейблу значение из базы, иначе присваиваем лейблу значение  - "пробел"
только вот при оформлении этого у меня почему то хрень какая то выползает, ну так же - значения не отбираются.. или все равно стакается программа на пустых полях..
Ответить с цитированием
  #8  
Старый 24.12.2013, 14:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от denISRU
Неа.. как раз так и было, но проблема в том что этих...э...занюханных январей и т.п. много, и DBtext из квик репорта так же берет первое значение, а оно в основном пустое.., то есть как бы я проблему то решил вот этим циклом, он перебирает значения, находит положительное или отрицательное (не нулевое) и впихивает в лейбл, а надо бы к нему еще сделать так, чтобы он еще и когда цикл не находит значений не скандалил.. - тоесть ну..вот как бы еще иф вписать, я вообще хотел что то вроде
Код:
если - значение в базе не ноль то присваиваем лейблу значение из базы, иначе присваиваем лейблу значение  - "пробел"
только вот при оформлении этого у меня почему то хрень какая то выползает, ну так же - значения не отбираются.. или все равно стакается программа на пустых полях..
Всё равно цикл делать не нужно - Quick Report сам делает цикл по всем записям. Если нужна специфическая обработка отдельных записей, то у каждого элемента есть обработчик события OnPrint - вот в этом событии и пиши своё условие:
Код:
procedure TReportForm.qrLabel441Print(sender: TObject; var Value: String);
begin
  if DataModule2.ADOQ28.FieldByName('xxxx').IsNull
    then Value := ' '
    else Value := DataModule2.ADOQ28.FieldByName('xxxx').AsString;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter