| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Отображение БД |
| Автор: lotos 4.5.2004, 09:30 |
| Подскажите пож-ста....!!! Как вывести в DBGrid данные из БД вида: Поля || X1 |X2 |X3 |X4 | ---------------------------- Данные Y1 |Y2 |Y3 |Y4 | ....................... и т.п. и показать их в следующем виде: X1 |Y1 |Y1 | ..... X2 |Y2 |Y2 | ....... то есть перевернуть данные ... Бьюсь, бьюсь и ни чего не приходит в голову .... Помогите !!!!! |
| Автор: x77 4.5.2004, 10:54 |
| lotos, стандартно - никак. можно подробнее о задаче, зачем это надо (может, есть другой путь решения?) и какая субд. |
| Автор: lotos 4.5.2004, 11:11 |
| М-да ....!!! Может я и не прав!!!!! но вот задача ..... Требуется по различным объектам каждый день заносить показания . Количество объектов фиксировано .... Вот я и соорудил (вернее пытаюсь соорудить) структуру тыблицы .. Описание : Х1 - это дата ввода ... , а от Х2 до Хн - это и есть объекты Так вот а внешне желательно просмотреть так: ---------- дата | | |----------------------- -------------------------------------------------------------------------- объект1 | ------------- | данные по датам (т.е. Y) объект2 | Вот такие вот дела ... что делать? База используется Paradox!!!! |
| Автор: x77 4.5.2004, 11:24 |
| lotos, стандартными средствами это не сделаешь. можно попробовать через DecisionCube, там есть возможность группировать данные по любым измерениям, но он жрёт много памяти и криво работает. проще всего, имхо, написать процедуру, которая будут обновлять данные в стандартном гриде |
| Автор: lotos 4.5.2004, 11:27 |
| А может подскажите в плане нормализации структуры таблицы ... Может она у меня совсем неверная? |
| Автор: x77 4.5.2004, 11:33 |
| если кол-во объектов действительно фиксировано - то всё верно. можно, конечно, нормализовать: выделить таблицу объектов, линковочную таблицу данных, но кроме тормозов это ничего не даст, и при отображении не поможет. да и вообще нормализация хороша только на страницах учебников, реально я нигде не видел ни одной рабочей базы, нормализованной до 5 формы. Добавлено @ 11:34 lotos, единстенный момент: данные на объекты приходят одновременно на все? если нет, то нормализовать всё-таки стоит. |
| Автор: Maverick 4.5.2004, 12:19 |
| Вот я сделал в свое время этот ужас для подобной задачи... Сделано наспех, но работает... Выбрасывал в Excel.... В начале переводил все названия объектов в массив string-овый.... BeginStolb := 1; //столбцы i BeginStrok := 1; //строки j StolbCount := DaysBetween(dtpBeg.Date, dtpEnd.Date)+1 +1; {начало и конец наблюдений, запрашиваем у пользователя} StrokCount := n+1; {n - кол-во объектов} ExcelApp := CreateOleObject('Excel.Application'); ExcelApp.Application.EnableEvents := false; Workbook := ExcelApp.WorkBooks.Add; WorkBook.WorkSheets[1].Columns.ColumnWidth := 40; WorkBook.WorkSheets[1].Columns.RowHeight := 14; WorkBook.WorkSheets[1].Columns.Autofit; ArrayData := VarArrayCreate([1, StrokCount, 1, StolbCount], varVariant); ====================================================== ОСНОВНОЕ РЕШЕНИЕ ДЛЯ СОСТАВЛЕНИЯ ИСКОМОГО ОТЧЕТА (выше и ниже форматизация для Excel) // Заполняем массив for i := 1 to StrokCount do for j := 1 to StolbCount do begin if (i = 1) and (j=1) then ArrayData[i,j] := 'ОБЪЕКТЫ/ДАТЫ' //левый верхний угол - комментарий else if (j = 1) and (i>1)then ArrayData[i,j] := ИМЯ ОБЪЕКТА[i-1 -1] //слева колонка объектов, нумерация странная из-за того что массив динамический с 0 и еще учитываем названия объектов в первой колонке.... else if (i = 1) and (j>1) then ArrayData[i,j] := DateToStr(dtpBeg.Date + j-1 -1) //сверху строка дат else //проверка выполняемости заказа на конкретную дату... if объект j работал в дату i (несложный SQL запрос) then ArrayData[i, j] := результат запроса; //иначе ячейка остается пустой ====================================================== Cell1 := WorkBook.WorkSheets[1].Cells[BeginStrok, BeginStolb]; Cell2 := WorkBook.WorkSheets[1].Cells[BeginStrok + StrokCount-1, BeginStolb + StolbCount - 1]; fontsect := WorkBook.WorkSheets[1].Cells[BeginStrok+1, BeginStolb+1]; // Область, в которую будем выводить данные Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2]; ranfont :=WorkBook.WorkSheets[1].Range[fontsect, Cell2]; Range.Value := ArrayData; WorkBook.WorkSheets[1].Cells.Font.Bold := True; ranfont.Font.Color := clGreen; ExcelApp.Visible := true; Decision Cube очень неповоротлив и глюкав.... |
| Автор: Она 4.5.2004, 15:06 |
| Самый простой способ- представить эти данные не в DBGrid a StringGrid... Понятно, что на больших выборках лучше так не развлекаться, но с другой стороны вряд ли юзер оценит такое представление данных при больших объемах информации (более 100 таких столбцов). Как писать в SringGrid, надеюсь, понятно? ( для особо понятливых - ключевые слова: Cells, RowCount, ColCount) |
| Автор: x77 4.5.2004, 15:38 |
| Она, ты себя чтением предыдущих постингов не утруждаешь? |
| Автор: lotos 4.5.2004, 17:48 |
| Maverick Я так понял, что для заполнения БД не имеет смысла как она выглядит ..... А вот для выдачи отчетных данных ты предлагаешь формировать их в Exel ... Я правильно тебя понял? |
| Автор: Она 4.5.2004, 21:03 |
| Для "заполнения" базы ВАЖНО как она нормализована и как построены индексы. Особенно если речь о реал-тайм системе. Здесь это не так? Вот как представить данные - вопрос удобства пользователя и скорости/надежности реализации необходимых для этого алгоритмов. Как я видела, в этих постингах о StringGrid ничего не было, а это, пожалуй самый простой способ представления/редактирования данных в твоем случае (да и во многих других). А твои "Объекты" видимо числа, строки? Или речь идет действительно о сериализации? Если имеет место быть сохранение состояния объектов на уровне свойств, естественно лучше продумать структуру базы, а возможно, отказаться от Paradox (если это реально) И потом ексель -дорога в один конец - только вывод.... Ввод/редактирование делать - зачем тогда Делфа? Да и запаришься... |
| Автор: Medved 4.5.2004, 22:23 |
| Рекомендую использовать временную таблицу. По крайней мере я так решал этот вопрос. |
| Автор: Maverick 5.5.2004, 08:48 |
| lotos Верно... Если пользователь такой чудак, что хочет видеть данные за 200 дней пусть видит - нечего делать скидки, пусть скрывает, если много.... Но я запрашивал у пользователя искомые начало и конец наблюдений... По опыту больше 10 дней редко, кто заказывает.... Создавать отчет динамически сложно, а Excel у пользователя всегда под рукой... Слева распологаешь все объекты, сверху весь запрошенные период.... и начинаешь заполнять ячейки на пересечении через запросы... А структура - это личное дело каждого... Но если изначально - где-то ненормализовано, через год, но всплывет... и нормализовать придеться, большей кровью.... |
| Автор: x77 5.5.2004, 10:58 |
| lotos, для заполнения бд как раз имеет смысл её структура. при твоей всё будет относительно нормально, если записи ложаться по всем объектам одновременно. если же по каким-то запись проходит, а по каким-то - может и н епроходить, а пройти позже, то надо создавать отдельную таблицу объектов и линковочную таблицу с данными. |