Dbgrid как в 1с
Здравствуйте уважаемы форумчане и знатоки БД, и выходам из разных ситуаций!
Задача реализована в принципе, но не устраивает быстродействие ее работы!
В общем задача была такая - есть много xls-файлов, в них есть данные(файлов 50 штук), необходимо выгрузить эти данные из 50 файлов в один(назвать его Итоговый), файл Итоговый содержит поля
p1 - номер плательщика
p2 - наименование
p3 - сумма оплаты произведенная плательщиком
. еще несколько незначительных полей
Следующее условие привязать к этим данным значения с другой базы, ключевым идентификатором сделать Номер плательщика! В общем как сделал,
1) создал mdb-таблицу(с столбцами p1,p2,p3 и.т.д.), туда выгрузил необходимы данные со всех 50 файлов(выгрузилось относительно быстро, 60 000 строк, за 8 минут)
2) далее подключил 2 базу и связал по идентификатору номер плательщика, данные отображаются в DBGrid
3) выгружаю данные из DBGrid файл xlsx
Загвоздка заключается в том, что выгрузка 60 000 записей в Excel из DBGrid занимает больше 3-х часов
Прилагаю код выгрузки из DBGrid в Excel
Как реализовать автозаполнение поля в DbGrid в зависимости от значения другого поля
Добрый день. Не могу разобраться в автозаполнением поля в gdgride. Суть проблемы, имеется у меня.
Реализовать выбор данных из DBGrid
Как реализовать чтоб при нажатии на кнопку (рис.1) Открывалась форма чтоб выбрать запись (Рис.2).
Как вывести в DBGrid информацию только по выбранной строке в другой таблице DBGrid?
У меня есть 3 таблицы - Компании, Адреса и Квартиры. Компании содержит поля - Код компании и.
Как можно посчитать разницу столбцов DBGrid и вывести в другой столбец другого DBGrid?
Я знаю как посчитать разницу в одном и том же DBGrid. Но, дело в том, что мне нужно вывести это в.
Подключай файл Excel как БД через ADO и добавляй данные через SQL-запросы.
60К записей будут добавляться примерно за 30 сек.
и у меня вопрос - почему все, кто на ADO что-то пишет, используют Dataset.RecordCount?
RecordCount - это количество отфетченных записей на клиента. На сервере может еще оставаться хренова туча строк.
правильный режим работы с датасетом:
Kolan © ( 2006-11-22 17:22 ) [0]
В DBGrid"е выделена яцейка, как получить номер строки в которой выделена ячейка?
И как потом добраться до данных из этой строки?
Те если грид такой:
№ Значение
1 45
>2 55
3 70
И выделена строка 2 как добратся до "2" и "55"?
clickmaker © ( 2006-11-22 17:27 ) [1]
Grid.DataSource.DataSet.FieldByname(Grid.SelectedField.FieldName)
← →Kolan © ( 2006-11-22 17:44 ) [2]
Сработало.
Но я не понял как :(
Grid.SelectedField.FieldName
Выбранное поле(я так понял что оно будет состоять из одной ячейки) так? Так это что будет? Что значит имя ячейки?(Имя колонки вроде понятно - то что в загаловке а с ячейкой неясно)?
FieldByName тогда что делает?
ЗЫ
Что они понимают под полем? Колонка?
Kolan © ( 2006-11-22 17:46 ) [3]
Да и кроме того,
DBGrid1.DataSource.DataSet.FieldByname(
DBGrid1.SelectedField.FieldName).Value
показывает содержание ячейки, а мне надо получить все ячейки из строки и выбрать нужную..
Те если выбрана(из пимера) ячейка 55 мне надо получить (2, 55) чтобы добраться до 2
← →clickmaker © ( 2006-11-22 17:53 ) [4]
> [3] Kolan © (22.11.06 17:46)
запомни раз и навсегда, что в ДБгриде нет понятия "ячейка" и "колонка". Есть источник данных - DataSet, а у него есть записи и поля. А грид - это только визуальное его отображение, не более. Он сам ничего не хранит
Kolan © ( 2006-11-22 17:57 ) [5]
Да. запомнил.
Grid.SelectedField.FieldName тогда это что значит?
Справку я читал.
Можно расшифровать? Типо так:
DBGrid1.SelectedField.FieldName - выбираем то-то.
clickmaker © ( 2006-11-22 18:02 ) [6]
> DBGrid1.SelectedField.FieldName
первожу с паскаля на русский: имя выбранного (текущего, если угодно) поля в текущей записи, в источнике данных, прицепленном к гриду
Kolan © ( 2006-11-22 18:06 ) [7]
Так а поле - это что? Колонка в которой находится ячейка ассоциированная с выделенной ячейкой в Гриде?
Так а как тогда FieldByname:
DBGrid1.DataSource.DataSet.FieldByname
Возвращает именно то, что выделенно?
clickmaker © ( 2006-11-22 18:14 ) [8]
> [7] Kolan © (22.11.06 18:06)
> Так а поле - это что?
поле - это поле. Это атрибут в таблице. Запись - это набор значений полей. На пересечении поля с текущей записью DBGrid1.DataSource.DataSet.FieldByname("Field")
живет конкретное значение атрибута.
Kolan © ( 2006-11-22 18:19 ) [9]
Ааа, блин, все зависит от того где стоит курсор? (Я имею ввиду >) так?
И все что я делаю с DataSet я делаю со строкой на которой курсор?
> Про изучение основ даже напоминать банально.
Да напомни, только с книгой. Может Пачеко почитать?
MsGuns © ( 2006-11-22 20:18 ) [12]
>Kolan © (22.11.06 18:30) [11]
>Да напомни, только с книгой. Может Пачеко почитать?
Думаю, рановато. Для начало проштудируй классы TDataSource и (особенно) TDataSet.
Без понимания их сущности невозможно уяснить принцип работы с базами данных в Делфи.
Kolan © ( 2006-11-22 20:30 ) [13]
> Думаю, рановато.
Ладно. Только я уже. :)
Desdechado © ( 2006-11-22 20:32 ) [14]
и немного реляционной алгебры не помешает, чтоб не лепетать, что такое поле
← →Kolan © ( 2006-11-22 21:05 ) [15]
> [14] Desdechado © (22.11.06 20:32)
> и немного реляционной алгебры не помешает, чтоб не лепетать,
> что такое поле
Лана :) Я ведь только учус (с)
DBGrid,пожалуй, один из самых часто используемых компонентов на формах приложений разработанных в Delphi.
Стандарный, встроенный в палетту дельфы грид вполне самодостаточен для небольших, довольно примитивных проектов, цель которых — простое отображение в стиле минимализма.
Но ведь мы с вами понимаем, что информативной табличной реализации важно, скажем так, логически оптимизированное представление.
Это — многострочные ячейки, многострочные заголовки таблиц, объединение столбцов таблицы под общую шапку, нестандартные хинты, контекстные меню, вложенные объекты ячеек и другие элементы. Да, большая часть этих хотелок доступна и в примитивном, стандартном компоненте — но не все.
Почему DBGridEh?
Да просто от того что мне нравится им пользоваться и в этой записи поделюсь некоторыми его возможностями.
Не все сразу конечно, — статья будет пополняться и моими реализоваными примерами и заметками на основе Ваших комментариев.. Начнем..
DBGridEh — как вытекает из его названия, — призван отображать информацию из базы данных (одной или нескольких), на основе результатов выдаваемых запросом к таблице в БД или к представлению (вьюхе). Считаю неправильным обращаться к таблицам БД напрямую, поэтому в своих проектах использую результаты возвращаеые вьюхами или процедурами.
Про создание представлений (View) и процедур напишу отдельную заметку, но чуть позже…
Как видно на представленном скрине, DBGridEh позволяет делать много строчные заголовки таблиц. Делается это достаточно просто:
Допустим у вас есть в таблице два столбца («Дата выявления» и «Описание»), которые нужно объеденить по смыслу (здесь «Действующие замечания»). Как видно из скрина, — заголовок 1-го стобца представлен следующим образом:
«Текст объединяющий два столбца под одну шапку»|«Заголовок столбца 1» , и Caption соседнего столбца
«Текст объединяющий два столбца под одну шапку»|«Заголовок столбца 2».
Обратите внимание па вертикальную черту — она явлется признаком ввода общей шапки для стобцов грида.
Для объединения их под одну шапку необходимо для начала создать в гриде сами столбцы и настроить их отображение (Caption) . Дополнительно в опциях DBGridEh необходимо параметру UseMultiTitle необходимо присвоить значение true и назначить необходиму вам высоту заголовка (TitleHeight). Вот собственно и все основные операции, — дополнительные опции выставляете по своему желанию.
Ну и на закуску — видите столбец, текст в шапке которого, размещен вертикально? Это достигается установкой параметра Orientation:=tohVertical в ветке Title свойств поля (столбца).
Все, с оформлением закончили.
(рис 2 ) Приступаем к связке грида с данными извлекаемыми из таблицы или вьюхи.
Для начала бросим на форму компонент TQuery и в его параметре Connection выберем ранее брошенный в проект копмонент типа TConnection, естественно с заранее настроенным соединением.
Здесь следует сделать небольшое отступление: поскольку мы работаем с базой MySQL, то могут возникнуть два неприятных момента.
Во-первых, если в поле базы содержится русский текст, то он может не отобразиться, а во-вторых, если отображаемое поле имеет формат TEXT (то есть это поля позволяющее сохранять много строчные записи, своего рода аналог дельфового TMemo) — в строке грида вместо значения поля отобразится текст . Дабы устранить такую проблему, если она конесно есть, необходимо выполнить следующее:
Для отображения много строчных записей в свойствах грида необходимо параметру DrawMemoText присвоить значение true. Для отображения русского текста, — выставить, программно или вручную ,следующие параметры в своиствах (Propeties) соединения
Продолжим.. Размещаем на форме компонент типа TDataSource в качестве связки между DBGridEh и TQuery. Теперь необходимо программно обработать всю эту связку и вернуть результат в грид. Пока не будем говорить об изменении информации в отображаемой таблице — об этом напищу если будут вопросы…
Поскольку связка между компонентами уже выстроена и отображаться будут данные из датасета которым у нас является запрос, — просто вешаем событие на кнопку или еще куда-нибудь (на ваше усмотрение) и выполняем наполнение датасета:
InfoQuery — здесь имя, которое мы присвоили компоненту TQuery.
Код выполнился, — грид наполнился данными. На этом заканчиваю с описанием вывода данных из БД на форму.
Экспериментируя с DBGridEh нашел на просторах инета пример небольшого дополнения к нему, которое позволит отображать хинт для выделенной строки с удобным для вас форматированием, как например показано ниже. Можно менять размер и тип шрифта, а так же время показа hint-а (по умолчанию оно не более 5 секунд, согласитесь — не удобно).
Для реализации такой возможности потребуется внедрить в код программы дополнительную процедуру слудующим образом. В коде программы, в секции PUBLIC пишем
И в разделе implementation записываем:
Процедура выполняющая отображение подсказки описана, осталось ее скормить проекту, для этого в событии создания формы декларируем:
На сегодня все!
В благодарность сделайте лайк с помощью пиктограммы соц.сети справа от записи. Спасибо и вам 🙂
Программированию нельзя научить, можно только научится
Главная » Уроки по ООП » Урок 42. Компоненты TDBGrid, TDBCtrlGrid
Компонент TDBGrid
TDBGrid - таблица, в которой строки представляют собой записи, а столбцы — поля набора данных. Свойство DataSource содержит ссылку на выбранный набор данных.
Столбцы DBGrid
Столбцы – поля подключенного набора данных. Этими значениями можно манипулировать, показывая или скрывая поля НД, меняя их местами или добавляя новые столбцы. Требуемый набор полей можно составить при помощи специального Редактора столбцов (рис. 1), который открывается при двойном щелчке на компоненте, перенесенном на форму.
В верхней части окна вы видите четыре кнопки, слева - направо:
- Add New (Добавить новый столбец).
- Delete Selected (Удалить выделенный столбец).
- Add All Fields (Добавить все столбцы из набора данных).
- Restore Defaults (Восстановить значения по умолчанию для выделенного столбца).
Рис. 1. Редактор колонок компонента TDBGrid
Для выбранного в списке столбца доступные для редактирования свойства появляются в Инспекторе объектов. Столбцы в списке можно редактировать, удалять, менять местами.
Изменить параметры заголовка столбца можно в раскрывающемся свойстве Title, которое имеет ряд собственных свойств:
Alignment - свойство устанавливает выравнивание заголовка и может быть taCenter (по центру), taLeftJustify (по левому краю) и taRightJustify (по правому краю).
Caption - свойство содержит текст, который отображается в заголовке столбца.
Color - цвет заголовка.
Font - шрифт заголовка.
Свойства Font, Alignment и Color внутри свойства Title меняют шрифт, выравнивание и цвет фона только заголовка столбца, а не его содержимого. Но у столбца имеются эти же свойства, они меняют шрифт, выравнивание и цвет фона выводимых в столбце данных.
Свойство Visible разрешает или запрещает отображение столбца, а свойство Width позволяет изменить его ширину.
Задание 1. Работа с редактором полей компонента DBGrid
1. Установите на форму компонент ADOTable, свяжите его с таблицей Pers базы Сотрудники (свойства ConnectionString – связать с базой Сотрудники, TableName=Pers, Active=True).
2. Установите DataSource, свяжите его с ADOTable1. .
3. На форму добавьте и компонент DBGrid, который свяжите с DataSource1..
4. Нам нужны не все поля таблицы, а только некоторые из них. Дважды щелкните по компоненту DBGrid1 и в открывшемся редакторе столбцов нажмите кнопку Add New. Появится один пустой столбец. Для того, чтобы он показал данные нужного поля, выделите его и в инспекторе объектов в свойстве FieldName выберите поле Fam. .
5. Найдите свойство Title, раскройте его нажатием на кнопку «+». Настройте подсвойство Alignment=taCenter, Caption=”Фамилия”, Font установите полужирным. Найдите свойство Width, установите его равным 150. .
6.Аналогично добавьте и настройте свойства полей Nam, Par, Sex, Dep.
.
Рисунок 2. Форма к заданию 1.
Пустые столбцы
Если добавить в редактор столбцов сетки DBGrid новый столбец, но в свойстве FieldName не выбирать поле БД, а оставить его пустым, мы получим пустой столбец. Для чего нужны пустые столбцы в сетке? В них можно выводить обработанные данные из других столбцов.
Задание 2. К примеру, пользователю неудобно просматривать три столбца "Фамилия", "Имя" и "Отчество" из таблицы Pers базы данных Сотрудники. Ему было бы удобней просмотреть один сборный столбец в формате "Фамилия И.О.". .
1. Это и все последующие задания выполнять в программе из задания 1..
2. Создайте новый столбец, но не назначайте ему поле из НД. Выделите этот столбец, и в его свойстве Title.Caption впишите "Фамилия И.О.", а в свойстве Width укажите ширину в 200 пикселей. .
3. Столбцы "Фамилия", "Имя" и "Отчество" нам уже не нужны, скройте их, установив их свойство Visible в False. А новый столбец перетащите мышью наверх, его индекс будет равен 0..
4. Для компонента DBGrid1 создайте обработчик события OnDrawColumnCell. Это событие наступает при прорисовке каждой ячейки столбца. В него внесите код:.
var s: String;
begin
if Column.Index = 0 then //если это пустой столбец
begin
if ADOTable1['Fam']<>Null then s:=ADOTable1['Fam'] + ' ';
if ADOTable1['Nam']<>Null then s:=s + Copy(ADOTable1['Nam'], 1, 1)+ '.';
if ADOTable1['Par'] <>Null then s:=s + Copy(ADOTable1['Par'], 1, 1) + '.';
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
end;
end;
Здесь мы вначале проверяем - наш ли это столбец (равен ли индекс нулю)? Если наш, то в переменную s начинаем собирать нужный текст. При этом имеем в виду, что пользователь мог и не заполнить некоторые поля. Чтобы у нас не произошло ошибки, вначале убеждаемся, что поле не равно Null (то есть, текст есть). Если текст есть, добавляем его в переменную s. Причем если это имя или отчество, с помощью функции Copy() получаем только первую букву и добавляем к ней точку. Когда s сформирована, добавляем этот текст в наш столбец с помощью метода TextOut() свойства Canvas сетки. В метод передаются три параметра: координаты левой позиции, верхней позиции и сам текст. Эти координаты мы берем из параметра события OnDrawColumnCell - Rect, который имеет такие свойства, как Left и Top, показывающие, соответственно, левую и верхнюю позиции текущей ячейки.
В результате программа будет иметь вид:
Рисунок 3. Заполнение пустого столбца
Список выбора в столбце - PickList
DBGrid позволяет устроить список, аналогичный ComboBox в одном из своих столбцов без использования каких-либо других компонентов.
Задание 4. Создать для поля «Sex» список выбора значений (муж, жен).
1. Откройте редактор столбцов сетки и выделите столбец "Sex". Обратите внимание на свойство PickList в Инспекторе объектов. Это свойство имеет тип TStrings, то есть представляет собой набор строк. Щелкните дважды по PickList, чтобы открыть редактор, и впишите туда
муж
жен
именно так, каждое значение на своей строке.
2. Запустите программу и попробуйте редактировать этот столбец. При попытке редактирования в ячейке покажется похожий на ComboBox список, в котором можно будет выбрать одно из указанных значений:
Рисунок 5. Список выбора в сетке
Наличие такого списка не препятствует пользователю ввести какое-то иное значение. Этот список нужен не для контроля, а только для облегчения пользователю ввода данных. Если же вы не желаете, чтобы пользователь имел возможность вводить другие данные, контроль следует организовать иным способом.
В практике программирования список чаще формируется во время работы программы, а строки списка берутся, как правило, из другой связанной таблицы. Добавить в список новую строку очень просто: DBGrid1.Columns.Items[4].PickList.Add('абв');
Список свойства PickList автоматически заполняется для поля синхронного просмотра (lookup-поле).
Выделение отдельных строк
Очень часто в практике приходится выделять какие-то строки, изменяя их фон или цвет шрифта. Например, в бухгалтерии обычно выделяют строки, в которых значение меньше нуля. Допустим, ваша программа показывает клиентов, а какой-то столбец содержит их баланс на счету вашей компании. Если этот баланс меньше 0, значит, клиент имеет задолженность перед вашей фирмой. Бухгалтеру будет очень удобно, если дебиторы (должники) будут выделяться в общем списке красным цветом.
Способ прорисовки данных в DBGrid зависит от значения его свойства DefaultDrawing. По умолчанию свойство равно True, то есть данные прорисовываются автоматически. Если свойство содержит False, то прорисовку придется кодировать самостоятельно в свойстве OnDrawColumnCell.
Если мы написали алгоритм прорисовки, но свойство DefaultDrawing содержит True, то вначале сетка заполнится данными автоматически, а затем будет выполнен наш алгоритм. Другими словами, прорисовка некоторых частей сетки будет выполнена дважды. Это не очень хорошо для быстродействия программы, однако нам придется поступать именно так: ведь мы не все строки и столбцы собираемся выводить другим способом, а только некоторые. Остальные будут заполнены данными по умолчанию.
Разберем этот метод подробней. Если найти его в справке Delphi, то увидим:
property OnDrawColumnCell: TDrawColumnCellEvent;
То есть, этот метод имеет тип TDrawColumnCellEvent. Описание типа такое:
type TDrawColumnCellEvent = procedure (Sender:TObject; const Rect:TRect;
DataCol:Integer; Column:TColumn; State:TGridDrawState) of object;
Разберемся с параметрами.
Rect - координаты прорисовки.
DataCol - порядковый номер текущего столбца (начиная с 0).
Column - данные текущего столбца.
State - состояние ячейки. Может быть:
- gdSelected - ячейка выделена
- gdFocused - фокус ввода в ячейке
- gdFixed - ячейка - заголовок столбца.
Задание 5. Изменение цвета шрифта записей сотрудников, относящихся к отделу Бухгалтерия, на красный.
Рисунок 6. Выделение строк
Заметим сразу, что наличие пустых столбцов создает дополнительные, но решаемые проблемы. Код события OnDrawColumnCell придется переделать, он будет таким:
Компонент Delphi DBGrid – это визуальный компонент среды Delphi, предназначен для визуализации наборов данных. Этот компонент находиться на странице компонентов DataControls палитры компонентов. Класс TDBCustomGrid и класс TCustomGrid – это родительские классы компонента DBGrid. Компонент делиться на столбцы (поля ввода данных) и строки (записи).
Свойства DBGrid
Свойства | Описание |
DataSource | В этом свойстве указывают имя компонента DataSource для связи БД с компонентом DBGrid |
Columns | Хранит в себе коллекцию состоящих из столбцов таблицы. Позволяет для каждого столбца применить индивидуальные свойства, например цвет. |
Options | Определяет параметры отображения таблицы: |
Работа со столбцами
Над значениями столбцов можно проводить различные операции: скрывать или показывать поля, менять положение, добавлять новые столбцы. Редактор столбцов предназначен для изменения набора полей. Вызывается редактор двойным щелчком мыши(рис 1). Он имеет четыре свойства (Add New, Delete Selected, Add All Fields, Restore Defaults). Соответственно: добавить новый столбец, удалить выделенный, добавить все столбцы из полей ввода данных, восстановление значения для выделенного столбца (по умолчанию). Свойства для каждого из выбранных столбцов появляются в Object Inspector. Со столбцами можно проводить такие операции:
- редактирование;
- удаление;
- смена местами двух столбцов;
- изменять заголовок столбцов (свойство Title).
Свойства Colums
- cbsAuto — кнопка появляется, если связанное с ним поле является полем синхронного просмотра;
- cbsEllipsis —кнопка редактирования ячейки появляется всегда;
- cbsNone — Кнопа при редактировании ячеек не появляется
При необходимости создания дополнительного пустого столбца в редакторе столбцов таблицы DBGrid необходимо воспользоваться свойством FieldName (поле базы данных оставить пустым). В пустые столбцы можно перемещать уже обработанные данные из других столбцов.
Работа со строками
Как при работе со столбцами, так и при работе со строками можно изменять цвет ячеек – это очень удобно при работе с большим количеством данных, ведь всегда можно выделить отдельные столбцы или строки различными цветами для обозначения той или иной категории. Свойство DefaultDrawing – значение, которое влияет на способ прорисовки данных в компоненте DBGrid (по умолчанию свойство равно True, в этом случае данные прорисовываются автоматически). Если значение DefaultDrawing равно False, прорисовку нужно делать самостоятельно при помощи OnDrawColumnCell. Другой вариант, пользователь прописал алгоритм прорисовки, но значение свойства остается равно True, тогда DBGrid заполнится сначала автоматически, а лишь потом будет выполнен алгоритм пользователя (то есть прорисовка выполняется дважды, это сказывается на быстродействии программы, но теперь пользователю не придется заполнять все пустые ячейки вручную).
Если до компонента DBGrid вам приходилось работать с компонентом Delphi StringGrid, то вам уже будет намного легче, ведь принцип работы этих двух компонент очень похож, только к дополнению свойств StringGrid, DBGrid имеет свои собственные свойства. Ячейки – это основные структурные единицы таблицы. Свойство State – состояние таблицы (gdSelected – выделена, gdSelected – имеет фокус ввода, gdFixed – ячейка-заглавие столбца).
Читайте также: