Настройка TDbGrid

Я делаю свои первые спотыкающиеся шаги в элементах управления БД (есть хорошие учебники?).

У меня есть таблица MySql с 6 столбцами, и мне удалось загрузить ее в TDbGrid.

Однако один из столбцов является индексом другой таблицы. Это штрих-код, и вместо того, чтобы отображать его, я хотел бы отобразить связанное с ним название продукта.

Как мне это сделать?

(и могу ли я скрыть «желоб» (?) слева, который показывает текущую строку?)

Спасибо


person Mawg says reinstate Monica    schedule 12.10.2012    source источник
comment
вы можете избавить себя от всей боли и хлопот и инвестировать в профессиональный компонент сетки, такой как devexpress, tms, ...   -  person whosrdaddy    schedule 12.10.2012
comment
@whosrdaddy Использование «профессиональной» сетки может быть удобно, если вы разрабатываете профессиональные приложения, но мы не знаем, так ли это здесь, и, кроме того, ни одна из этих сеток не решает эту проблему, поскольку ей все еще нужно извлекать данные из другой стол.   -  person GolezTrol    schedule 12.10.2012
comment
@GolezTrol, я не говорил о получении данных. Стандартные элементы управления БД могут быстро стать громоздкими для работы ....   -  person whosrdaddy    schedule 12.10.2012
comment
@GolezTrol: Сетки Devexpress решают эту проблему, потому что у вас есть столбцы поиска, вам просто нужно назначить таблицу поиска.   -  person Andreas    schedule 12.10.2012
comment
Красиво, я этого не знал. :-) Что является частью проблемы с сетками DevExpress. Я использовал их в течение многих лет (cxGrid и dxGrid до этого), и я никогда не чувствовал, что могу понять весь потенциал компонентов. Они представляют собой полное приложение в сетке, но с очень крутой кривой обучения. И они добавляют большой вес вашему приложению. Хотя я искренне согласен с тем, что TDBGrid слишком примитивен, я также считаю, что многие сторонние сетки «лучше», чем DevExpress, только потому, что DX слишком сложен. (Не из-за этих столбцов поиска, которые на самом деле имеют смысл.)   -  person GolezTrol    schedule 12.10.2012


Ответы (4)


Вы всегда должны выполнять соединение со стороны SQL, это намного проще, чем делать это программно.

Такие как:

SELECT mytable.id, mytable.column1, another_table.barcode
FROM mytable
JOIN another_table ON another_table.id = mytable.barcode_id

Чтобы удалить желоб, вам нужно снять флажок со свойства DBGrid dgIndicator в параметрах.

Что касается «элементов управления DB-Aware», вам следует попробовать помощь Delphi.

person ertx    schedule 12.10.2012
comment
+1 большое спасибо. Я, вероятно, могу использовать это как есть, но только чтобы помочь мне учиться. 1) есть ли все, кроме, или я бы явно перечислил все столбцы mytable, кроме того, к которому я хочу присоединиться? 2) Могу ли я поместить объединенный столбец в середину (т.е. выбрать... присоединиться... выбрать?) - person Mawg says reinstate Monica; 12.10.2012

Вместо таблицы используйте запрос. Затем используйте объединение, чтобы выбрать с ним название продукта, например:

SELECT
  t.*,
  p.name
FROM
  YourTable t
  INNER JOIN Product p on p.barcode = t.barcode

Я использую t.*, потому что не знаю точных столбцов. На практике я бы не использовал select *, а вместо этого указывал определенные столбцы. Если вы все равно собираетесь использовать *, вы можете скрыть определенные столбцы, установив для свойства Visible объекта TField в наборе данных/запросе значение False.

Я не знаю, какие компоненты вы используете для подключения к таблице, но у большинства из них есть аналог запроса, который позволяет вам вставлять SQL вместо имени таблицы.

Желоб можно скрыть, перейдя к свойству Options в инспекторе объектов, разверните его и установите для dgIndicator значение False.

person GolezTrol    schedule 12.10.2012
comment
Добавил фразу про Select *. - person GolezTrol; 12.10.2012

Просто для протокола: с базами данных ISAM, такими как Paradox и DBF, типичным решением будет так называемый master-detail tables relations, и он все еще может работать для SQL. Хотя это было бы очень неэффективно и медленно. Вы определенно читали несколько книг по SQL.

person Arioch 'The    schedule 12.10.2012

Используйте компонент TQuery вместо TTable и задайте свойство SQL, используя предложенные выше операторы выбора. Если вы просто добавите столбцы, которые хотите отобразить в своем операторе sql, вы получите ожидаемый результат. Что касается «желоба», вам придется каким-то образом взломать сетку во время выполнения.

person Ertunç    schedule 12.10.2012
comment
Ссылка на ответы выше в более общих терминах на самом деле не поможет. - person GolezTrol; 12.10.2012
comment
@GolezTrol Я просто имел в виду операторы соединения sql. Думал, что нет необходимости снова копировать/вставлять один и тот же код, поскольку в исходном вопросе все равно не было подробностей кода. - person Ertunç; 12.10.2012
comment
Этот ответ является повторением части информации из других ответов выше и неправильным ответом об удалении желоба (который контролируется значением DBGrid.Options dgIndicator - установка его на false удаляет желоб). IOW, ваш ответ либо неверен, либо повторяет частичное содержание ответов, сделанных за час до того, как вы опубликовали свой. Извините - -1. - person Ken White; 12.10.2012