Возникла проблема необходимо в DBGrid добавить новое поле(5) (даже три) при условии что совпадает дата одной строки с датой другой строки в существующем поле(4), при этом соответствующее значение поля(3) совпадающей дате поля(4) необходимо поместиь в туже строку созданного поля(5).
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
08-10-2009 01:50 | Сообщение от автора вопроса
Задача такая: имеется набор данных из 6 полей. Поля с 1 по 3 совпадают. Четвертое поле "дата". Пятое "дата возм. поступ. товара" 6 поле "количество". Необходимо чтобы в DBGrid выводить в одну строку записи где "даты" совпадают, " дата возм. поступ." не выводим, а значения "количества" каждой совпадающей по дате записи выводить в отдельном поле , но в эту же строку. Понимаю, что все же лучше привести набор данных к такому виду, но запросом нереально это сделать, а вот хран. процедурой можно, но она повиснет в базе -не хотелось бы "засорять", так как процедура простенькая. Может есть возможность создать временную процедуру, чтоб после выполнения она удалялась. Как это сделать я не знаю ни разу не делал. Работаю с базами данных Firebird 2.0
07-10-2009 15:43 | Вопрос к автору: запрос дополнительной информации
А теперь после Вашего поста от 07-10-2009 09:32 отставим в сторону заданный Вами вопрос. Начните "от Адама", то бишь изложите доходчиво суть разрабатываемой программы, а не то, каким путем пытались решить задачу.
Да это то понятно я так и делаю. Но в том то и дело что каждое вычисляемое поле соответствует определенной записи в запросе. Как же я смогу присвоить сразу трем выч. полям значения если я шагаю по записям и в каждой оно только одно. Мне необходимо проверять что в строке2 поле "ДАТА" совпадает с полем "ДАТА" строки1 кроме значения поля "ДАТА ПОСТУПЛЕНИЯ" (visible:=false)и естественно необходимое мне 260 ,если ДА то в выч. поле2 заносим значение 260, но в строку1, а не в строку2, а строку2 вообще не выводим. И так след. запись пока "ДАТА" перестанет совпадать.
У меня сейчас
1строка поле1/поле2/поле3/дата/выч.поле1(250)
2строка поле1/поле2/поле3/дата/ /выч.поле2(260)
3строка поле1/поле2/поле3/дата/ / /выч.поле3(270)
Мне необходимо так:если дата совпадает
поля1,2,3 совпадают
то:
1строка поле1/поле2/поле3/дата/выч.поле1/выч.поле2/выч.поле3
Все проще пареной репы.
1. В редакторе полей заранее должно быть создано необходимое количество вычисляемых полей.
2. В коде события OnCalcFields просто проверяете значения реальных полей (поля 1, 2 и 3) из запроса согласно условию/условиям и или присваиваите значение такого поля нужному вычисляемому полю - или выч.поле1 или выч.поле2 или выч.поле3 или сразу нескольким (оно тогда отобразится в нужной ячейке Grid'е), если же ни одно условие не выполняется, то просто ничего не делайте, и ничего отображаться не будет. Надеюсь, что написать такой несложный код проблемы не составит даже начинающему. Справка по OnCalcFields в помощь.
Спасибо за ответ. Правильно значения вычисляемых полей создаются для каждой записи. Пример
На самом деле запрос выводит такую таблицу
1строка поле1/поле2/поле3/дата/250
2строка поле1/поле2/поле3/дата/260
3строка поле1/поле2/поле3/дата/270
Если дата совпадает то необходимо создавать новое поле и записывать так:
1строка поле1/поле2/поле3/дата/250/260/270
У меня сейчас
1строка поле1/поле2/поле3/дата/выч.поле1(250)
2строка поле1/поле2/поле3/дата/ /выч.поле2(260)
3строка поле1/поле2/поле3/дата/ / /выч.поле3(270)
Мне необходимо так:если дата совпадает
поля1,2,3 совпадают
то:
1строка поле1/поле2/поле3/дата/выч.поле1/выч.поле2/выч.поле3
>>>Необходимо значения вычисляемых полей(их 4)в DBGridе заносить в одну строку как это сделать, по другим полям данная запись совпадает(условие совпадения и является созданием вычисляемого поля).
Походу Вы ошиблись.
не
>>>заносить в одну строку
а в одну ячейку
Давайте наведем порядок.
1. Вычисляемые поля создаются для все записей (строк). А вот значение вычисляемого поля "может быть", а "может и не быть". Количество полей для ВСЕХ записей (строк) одинаковое. А значения - разные.
2. Если Вы начинающий, то лучше сразу воспользоваться схемой:
- состав полей таблиц должен отображать Вашу модель данных, желательно не нарушая 1,2 и 3 нормальные формы
- все, что можно для подготовки набора данных, реализовывать на SQL
- все, что не получилось SQL, делать вычисляемыми полями
- все, что не получилось SQL и вычисляемыми полями, делать событием OnGetText
- на крайний случай делать уже в DBGrid событием OnDrawDataCell
3. Желательно останавливаться на SQL, тогда у Вас результирующие наборы данных будут максимально независимы от конкретного "интерфейсного" приложения (технологии), компонентного решения (TQuery и т.д.), элементов управления (DBGrid, DBEdit и т.д.).
4. Понижая зависимость от специфики реализации Вы даете "долгую жизнь" и универсальность Вашему приложению.
Подскажите еще один момент. Необходимо значения вычисляемых полей(их 4)в DBGridе заносить в одну строку как это сделать, по другим полям данная запись совпадает(условие совпадения и является созданием вычисляемого поля).
Более подробно если записи по полю "Даты" совпадают, то записи "уровней" приходящихся на эти даты необходимо записать в новых колонках и отобразить эту информацию в DBGrid мне это лучше сделать в DBGrid или необходимо перестроить DataSet(формируется SQL запросом).
Опять двадцать пять. Как вижу, Вы так ничего не вынесли из уже данных Вам ответов.
Растолковываю. Во-первых, наконец оставьте в покое DBGrid. Все делается на уровне DataSet'а (TQuery), и только его, выполняющего запрос. И ничего ни в какие колонки записывать не надо. Создайте в редакторе полей необходимое количество вычисляемых полей (о чем писал Всеволод), и в событии OnCalcFields по соответствующему алгоритму присваивайте (или не присваивайте, если оно не должно им присваиваться) им значения в зависимости от того, что находится в полях выбираемых SQL-запросом. Если колонки в DBGrid созданы в редакторе, то создайте их и для этих вычисляемых полей.
Разъяснение:
если записи по полю "Даты" совпадают, то записи "уровней" приходящихся на эти даты
Вот и присваивайте нужное значение соответствующему вычисляемому полю, если даты не совпадают - то нет.
Более подробно если записи по полю "Даты" совпадают, то записи "уровней" приходящихся на эти даты необходимо записать в новых колонках и отобразить эту информацию в DBGrid мне это лучше сделать в DBGrid или необходимо перестроить DataSet(формируется SQL запросом).
добавить поле для отдельно взятой записи нельзя. а добавить "колонку" в принципе - можно.
можно в Вашем DataSet-е добавить вычисляемое поле (Calculated Field), значение которого Вы можете задавать как хотите. Для этого надо описать событие OnCalcFields.
зачитайте раздел "вычисляемые поля" в любом доступном для Вас учебнике.
Хорошо если я свяжу DBGrid с набором данных у меня сформируется таблица смогу я программно( не через Colummns editor) добавить новую колонку и затем данные из существующей колонки по определенному условию перенести в новую чтобы получить необходимую мне таблицу в DBGrid. Заранее спасибо за ответы.
В DBGrid нет полей, в нем вообще ничего нет. Данные, которые он всего лишь отображает, находятся в DataSet, к которому он подключен через DataSource. В DbGrid есть колонки, связанные с полями DataSet'а. Поля можно добавлять в DataSet (а также управлять их видимостью), но никак не в DBGrid. В DBGrid можно только добавлять колонки (и связывать их с полями набора данных) или управлять их видимостью.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.