Lookup & Calculated problem

11 отговора 228 прегледа
#1

Lookup & Calculated problem

Здравейте,
Имам досаден проблем... Опитвам се да направя следното:
В Query1 имам поле което е Lookup към друго поле в Query2 по Key ID, а LookupResult ми е Calculated поле, на което съм хванал метода OnGetText...
Според логиката ми нещата би трябвало да работят, явно ми е погрешна логиката, тъй като OnGetText въобще не се извиква...
Кое точно не съм прочел от FM :-)
Благодаря

bidup.net
Отговор
в отговор на mole. #2

Re: Lookup & Calculated problem

OnGetText ще ти се извика ако четеш Text пропъртито на фийлда. Ако го четеш AsString/AsInteger/AsFloat и т.н. той не се вика.

Отговор
в отговор на andrew_nikoloff #3

Re: Lookup & Calculated problem

Благодария за бързата намеса,
Ама на мен ми се губи как се вика... Опитвам се от FastReport да го ползвам и реших (в началото) че от там е проблема, но после си сложих един DBGrid във формата, който също не го показва т.е. показва го като празно и също не извиква OnGetText...

bidup.net
Отговор
в отговор на mole. #4

Re: Lookup & Calculated problem

А гридът ти коя таблица показва - тази с данните или лукъп таблицата? В първия случай може би няма да сработи.
Защо го правиш на OnGetText? Не може ли да си е обикновено калкулируемо поле и да си го смяташ в OnCalcFields?

Отговор
в отговор на andrew_nikoloff #5

Re: Lookup & Calculated problem

Да, Grid-a показва таблицата с данните...

"Защо го правиш на OnGetText? Не може ли да си е обикновено калкулируемо поле и да си го смяташ в OnCalcFields?"

Срам не срам признавам си - Явно нещата ми куцат концептуално...
Как OnCalcFields може да ми помогне?... Може ли пример, в Help-а няма?

Може би аз не подхождам правилно към проблема...
Ето какво искам да направя:
В една таблица имам ID на фирма или Физ.Лице. В друга таблица си съхранявам фирмите и физ.лица. Ако ID-то е на фирма - трябва да покажа името и Булстат, ако е Физ.лице,
По тази причина си отварям 2 нови полета в query-то които ми връщат подходящия резултат...

Задачката е (предполагам) класическа...

bidup.net
Отговор
в отговор на mole. #6

може би ....

Без да знам замисъла на приложението и базата данни, която ползваш имам предложение.
Не можеш ли директно да обединиш извеждането на необходимата ти информация в една заявка към базата данни.
Пример:
SELECT
T1."ID",
T1."NAME",
T2."Bulstat",
T2."Adres"
FROM TABLE1 T1
LEFT JOIN TABLE2 ON (T1."ID" = T2."ID")

.... нещо такова.

Светът е малък нека си помагаме.
Отговор
в отговор на mole. #7

Calculated fields

Калкулируемите полета представляват фийлдове, чиято стойност се получава от самата ти програма, а не от базата данни. Стойността им се изчислява в събитието OnCalcFields на дейтасет-а. То се вика за всеки отделен запис, когато трябва да се изчисли стойността му.
Пример - селектираш две числа от базата данни и искаш в трето (калкулируемо) поле да показваш сумата им. Ако двете полета ти се казват F1 и F2 и си си създал калкулируаемо поле F3, то в OnCalcFields на таблицата трябва да напишеш:

procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('F3').AsFloat := DataSet.FieldByName('F1').AsFloat + DataSet.FieldByName('F2').AsFloat;
end;

Не познавам логиката на твоето приложение и не съм убеден, че използването на калкулируеми полета е най-удачният вариант, но за да го направиш така трябва да напишеш нещо такова:

procedure TForm1.Table1CalcFields(DataSet: TDataSet);
var
ID: Integer;
begin
ID := DataSet.FieldByName('ID_NA_CHOVEK_ILI_FIRMA');
if Is_ID_Na_Firma(ID) then
DataSet.FieldByName('IME_NA_CHOVEK_ILI_FIRMA').AsString := VarToStr(tbFirma.Lookup('ID', ID, 'IME'))
else
DataSet.FieldByName('IME_NA_CHOVEK_ILI_FIRMA').AsString := VarToStr(tbChovek.Lookup('ID', ID, 'IME'));
end;

Другият (по-добрият) вариант е, както ти предлага Vermax, да си вземеш нещата още в заявката.

Отговор
в отговор на andrew_nikoloff #8

Re: Calculated fields

Много благодаря!!!
С OnCalcFields работи отлично...
Ще огранича да ми се викат само 4-5 записа, доколкото разбирам има риск от забавяне ако са много записите...

Имам нужда да се реванширам

Редактирано от mole. на

Отговор
в отговор на mole. #9

Re: Calculated fields

Ако си от Пловдив може да почерпиш една бира. Ако не - ще почерпиш по email-а ;))))
А сега насериозно. Да, това е по-бавният вариант. За един запис това събитие може да (и ще) ти се викне няколко пъти. А иначе относно притеснението ти за многото записи - ако не се лъжа ще ти се викне само за тези записи, за които е необходимо. Например ако имаш грид, в който се виждат 10 реда ще ти се викне само за тях, докато не тръгнеш да скролираш. Или нещо такова... Честно казано не съм много сигурен. Но все пак по-добрият вариант остава самата база да ти върне резултата, който искаш.

Отговор
в отговор на andrew_nikoloff #10

Още мъгла за разсейване :-)

Май ще е виртуална бирата... Даже не ходя често до Пловдив... най-много до Happy-то на магистралата :-)

Блаодаря за бързите отговори...

Все пак мисля да го оставя приложението да го калкулира, иначе трябва някакъв SQL да пиша шантав...

SELECT IF(isperson=1,CONCAT(fname,' ',lname),company) AS title i t.n.

DB ще ми е на отделно PC но ще има доста клиенти,които ще я ползват и по-добре е те да се товарят (по мое мнение)...

btw Използвайки благоразположението на звездите днес - да разсея още малко концептуална мъгла...

Когато едно Query направи нещо от сорта на SELECT * FROM table - цялата информация ли полита от сървър-а към него или има нещо междинно което се грижи да поиска таблицата на парчетата които деиствително трябват на приложението?

Редактирано от mole. на

Отговор
в отговор на mole. #11

А базата все пак каква е :)

По принцип не цялата. Не си казал каква е базата ти. Понеже любимата ми база е Firebird ще се спра на нея :)
Значи имаш си някакво query, дето ни връща резултата от заявката. Отваряме го с Open. Тук вариантите са два: 1) имаш някакъв грид, който визуализира данните от кюрито и 2) нямаш никакъв грид, който да визуализира данните от кюрито :)
Каква е ролята на грида в цялата работа - ами много просто: фетшват се само записите, които са необходими и ако имаш грид това ще са първите 10-15-20 или там колкото записа се побират в грида. Ако нямаш грид - няма да се фетшнат. Това е и причината RecordCount да не ти показва броя на редовете, които ти е върнала заявката. За да се изтеглят всички данни при клиента трябва или да отидеш на последния запис на кюрито или да извикаш FetchAll.

Отговор
в отговор на andrew_nikoloff #12

Re: А базата все пак каква е :)

Мдаа мерси за бързия курс по Delphi :-) хубава работа...
Ползвам MySQL, че уж ми е най-познат а и това което правя има и Web-част, която така или иначе вече е на MySQL...
А като компоненти ползвам Zeos...

Отговор