DBGrid - lookup column
4 отговора
0 прегледа
DBGrid - lookup column
Работя с Delphi 5, Firebird и IBX. Показвам данни от една таблица с IBTable и DBGrid. Всички свойства са установени в design time. В таблицата има външен ключ, който се показва в грида с числовата си стойност. Искам да направя lookup към втора таблица, така, че в грида да се показват и избират стойностите на определено текстово поле от втората таблица, а не стойностите на външния ключ. Обаче не сработва. Не можах да открия пример, който да описва как се прави процедурата стъпка по стъпка за lookup чрез DBGrid. Някой сблъсквал ли се е с този проблем?
P.S. С DBLookupComboBox всичко си работи нормално.
P.S. С DBLookupComboBox всичко си работи нормално.
Re: DBGrid - lookup column
Ами трябва да си направиш lookup в query- то, а не в грида.
Re: DBGrid - lookup column
В какъв смисъл "lookup в query- то"?
Аз си имам втора таблица, която съдържа lookup данните и към която са насочени параметрите на TField полето от първата таблица, която се показва в грида.
Аз си имам втора таблица, която съдържа lookup данните и към която са насочени параметрите на TField полето от първата таблица, която се показва в грида.
Re: DBGrid - lookup column
Това можеш да го направиш по два начина - с lookup field и със заявка към базата (във втория случай вместо IBTable ще трябва да позлваш IBQuery или IBDataSet).
Не ти знам структурата на базата, затова за примерите ще използвам две таблици - клиенти (CUSTOMERS - ID, Name) и плащания (PAYMENTS - ID, CUSTOMER_ID, AMOUNT), като ти всъщност селектираш плащанията и вместо CUSTOMER_ID искаш да виждаш NAME.
За да си направиш lookup field в IBTable-а си добави още една таблица за клиентите (tbCustomers), отвори fields editor на таблицата с плащанията (дабъл клик върху компонента). Ако не си си добавил филдовете - добави ги (десен клик - Add all fields). Добави си и филдовете на таблицата с клиентите. Скрий CUSTOMER_ID (Visible := False). Оправи си Display Label-ите на видимите полета. Пак десен клик и New Field. Избираш lookup field, като му даваш Key field да е CUSTOMER_ID, Dataset - tbCustomers, Lookup keys - ID и Result Field - NAME. Даваш си име на полето например CUSTOMER_NAME, тип String и размер колкото ти е CUSTOMERS.NAME.
По принцип не се препоръчва ползването на IBTable, защото като цяло този компонент е предвиден за локални бази данни (като dBase например), а не за клиент/сървър като Firebird/InterBase и е оставен само за съвместимост. Затова е и по-добре да използваш втория подход с IBQuery/IBDataSet. При него направо си пишеш заявка за данните, които са ти необходими, вместо да се преточва съдържанието на цялата таблица. В твоя случай трябва да напишеш нещо от сорта на:
select p.id, p.customer_id, c.name, p.amount from payments p inner join customers c on c.id = p.customer_id order by p.id desc
Това го слагаш в SelectSQL на един IBDataSet. В RefreshSQL пишеш същото, само че с where клауза where p.id = :id. Попълни си и InsertSQL, ModifySQL и DeleteSQL пропъртитата, добави си полетата във fields editor-а, оправи им пропъртитата (видимост, етикети, ширини и т.н.) и си готов.
Linux isn't free,it's worthless.
Не ти знам структурата на базата, затова за примерите ще използвам две таблици - клиенти (CUSTOMERS - ID, Name) и плащания (PAYMENTS - ID, CUSTOMER_ID, AMOUNT), като ти всъщност селектираш плащанията и вместо CUSTOMER_ID искаш да виждаш NAME.
За да си направиш lookup field в IBTable-а си добави още една таблица за клиентите (tbCustomers), отвори fields editor на таблицата с плащанията (дабъл клик върху компонента). Ако не си си добавил филдовете - добави ги (десен клик - Add all fields). Добави си и филдовете на таблицата с клиентите. Скрий CUSTOMER_ID (Visible := False). Оправи си Display Label-ите на видимите полета. Пак десен клик и New Field. Избираш lookup field, като му даваш Key field да е CUSTOMER_ID, Dataset - tbCustomers, Lookup keys - ID и Result Field - NAME. Даваш си име на полето например CUSTOMER_NAME, тип String и размер колкото ти е CUSTOMERS.NAME.
По принцип не се препоръчва ползването на IBTable, защото като цяло този компонент е предвиден за локални бази данни (като dBase например), а не за клиент/сървър като Firebird/InterBase и е оставен само за съвместимост. Затова е и по-добре да използваш втория подход с IBQuery/IBDataSet. При него направо си пишеш заявка за данните, които са ти необходими, вместо да се преточва съдържанието на цялата таблица. В твоя случай трябва да напишеш нещо от сорта на:
select p.id, p.customer_id, c.name, p.amount from payments p inner join customers c on c.id = p.customer_id order by p.id desc
Това го слагаш в SelectSQL на един IBDataSet. В RefreshSQL пишеш същото, само че с where клауза where p.id = :id. Попълни си и InsertSQL, ModifySQL и DeleteSQL пропъртитата, добави си полетата във fields editor-а, оправи им пропъртитата (видимост, етикети, ширини и т.н.) и си готов.
Linux isn't free,it's worthless.
Re: DBGrid - lookup column
Благодаря за напътствията. Получи се точно това, което исках, направено в design time.
Сега се опитвам да направя нещата програмно. Да си добавя lookup тип поле към съществуваща таблица или заявка от тип 'select * from PAYMENTS'. Но това е по-трудно и засега не мога да уцеля правилната последователност...
Сега се опитвам да направя нещата програмно. Да си добавя lookup тип поле към съществуваща таблица или заявка от тип 'select * from PAYMENTS'. Но това е по-трудно и засега не мога да уцеля правилната последователност...