Lookup & Calculated problem
11 отговора
228 прегледа
Lookup & Calculated problem
Здравейте,
Имам досаден проблем... Опитвам се да направя следното:
В Query1 имам поле което е Lookup към друго поле в Query2 по Key ID, а LookupResult ми е Calculated поле, на което съм хванал метода OnGetText...
Според логиката ми нещата би трябвало да работят, явно ми е погрешна логиката, тъй като OnGetText въобще не се извиква...
Кое точно не съм прочел от FM :-)
Благодаря
bidup.net
Имам досаден проблем... Опитвам се да направя следното:
В Query1 имам поле което е Lookup към друго поле в Query2 по Key ID, а LookupResult ми е Calculated поле, на което съм хванал метода OnGetText...
Според логиката ми нещата би трябвало да работят, явно ми е погрешна логиката, тъй като OnGetText въобще не се извиква...
Кое точно не съм прочел от FM :-)
Благодаря
bidup.net
Re: Lookup & Calculated problem
OnGetText ще ти се извика ако четеш Text пропъртито на фийлда. Ако го четеш AsString/AsInteger/AsFloat и т.н. той не се вика.
Re: Lookup & Calculated problem
Благодария за бързата намеса,
Ама на мен ми се губи как се вика... Опитвам се от FastReport да го ползвам и реших (в началото) че от там е проблема, но после си сложих един DBGrid във формата, който също не го показва т.е. показва го като празно и също не извиква OnGetText...
bidup.net
Ама на мен ми се губи как се вика... Опитвам се от FastReport да го ползвам и реших (в началото) че от там е проблема, но после си сложих един DBGrid във формата, който също не го показва т.е. показва го като празно и също не извиква OnGetText...
bidup.net
Re: Lookup & Calculated problem
А гридът ти коя таблица показва - тази с данните или лукъп таблицата? В първия случай може би няма да сработи.
Защо го правиш на OnGetText? Не може ли да си е обикновено калкулируемо поле и да си го смяташ в OnCalcFields?
Защо го правиш на OnGetText? Не може ли да си е обикновено калкулируемо поле и да си го смяташ в OnCalcFields?
Re: Lookup & Calculated problem
Да, Grid-a показва таблицата с данните...
"Защо го правиш на OnGetText? Не може ли да си е обикновено калкулируемо поле и да си го смяташ в OnCalcFields?"
Срам не срам признавам си - Явно нещата ми куцат концептуално...
Как OnCalcFields може да ми помогне?... Може ли пример, в Help-а няма?
Може би аз не подхождам правилно към проблема...
Ето какво искам да направя:
В една таблица имам ID на фирма или Физ.Лице. В друга таблица си съхранявам фирмите и физ.лица. Ако ID-то е на фирма - трябва да покажа името и Булстат, ако е Физ.лице,
По тази причина си отварям 2 нови полета в query-то които ми връщат подходящия резултат...
Задачката е (предполагам) класическа...
bidup.net
"Защо го правиш на OnGetText? Не може ли да си е обикновено калкулируемо поле и да си го смяташ в OnCalcFields?"
Срам не срам признавам си - Явно нещата ми куцат концептуално...
Как OnCalcFields може да ми помогне?... Може ли пример, в Help-а няма?
Може би аз не подхождам правилно към проблема...
Ето какво искам да направя:
В една таблица имам ID на фирма или Физ.Лице. В друга таблица си съхранявам фирмите и физ.лица. Ако ID-то е на фирма - трябва да покажа името и Булстат, ако е Физ.лице,
По тази причина си отварям 2 нови полета в query-то които ми връщат подходящия резултат...
Задачката е (предполагам) класическа...
bidup.net
може би ....
Без да знам замисъла на приложението и базата данни, която ползваш имам предложение.
Не можеш ли директно да обединиш извеждането на необходимата ти информация в една заявка към базата данни.
Пример:
SELECT
T1."ID",
T1."NAME",
T2."Bulstat",
T2."Adres"
FROM TABLE1 T1
LEFT JOIN TABLE2 ON (T1."ID" = T2."ID")
.... нещо такова.
Светът е малък нека си помагаме.
Не можеш ли директно да обединиш извеждането на необходимата ти информация в една заявка към базата данни.
Пример:
SELECT
T1."ID",
T1."NAME",
T2."Bulstat",
T2."Adres"
FROM TABLE1 T1
LEFT JOIN TABLE2 ON (T1."ID" = T2."ID")
.... нещо такова.
Светът е малък нека си помагаме.
Calculated fields
Калкулируемите полета представляват фийлдове, чиято стойност се получава от самата ти програма, а не от базата данни. Стойността им се изчислява в събитието OnCalcFields на дейтасет-а. То се вика за всеки отделен запис, когато трябва да се изчисли стойността му.
Пример - селектираш две числа от базата данни и искаш в трето (калкулируемо) поле да показваш сумата им. Ако двете полета ти се казват F1 и F2 и си си създал калкулируаемо поле F3, то в OnCalcFields на таблицата трябва да напишеш:
Не познавам логиката на твоето приложение и не съм убеден, че използването на калкулируеми полета е най-удачният вариант, но за да го направиш така трябва да напишеш нещо такова:
Другият (по-добрият) вариант е, както ти предлага Vermax, да си вземеш нещата още в заявката.
Пример - селектираш две числа от базата данни и искаш в трето (калкулируемо) поле да показваш сумата им. Ако двете полета ти се казват 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, да си вземеш нещата още в заявката.
Re: Calculated fields
Много благодаря!!!
С OnCalcFields работи отлично...
Ще огранича да ми се викат само 4-5 записа, доколкото разбирам има риск от забавяне ако са много записите...
Имам нужда да се реванширам
С OnCalcFields работи отлично...
Ще огранича да ми се викат само 4-5 записа, доколкото разбирам има риск от забавяне ако са много записите...
Имам нужда да се реванширам
Редактирано от mole. на
Re: Calculated fields
Ако си от Пловдив може да почерпиш една бира. Ако не - ще почерпиш по email-а ;))))
А сега насериозно. Да, това е по-бавният вариант. За един запис това събитие може да (и ще) ти се викне няколко пъти. А иначе относно притеснението ти за многото записи - ако не се лъжа ще ти се викне само за тези записи, за които е необходимо. Например ако имаш грид, в който се виждат 10 реда ще ти се викне само за тях, докато не тръгнеш да скролираш. Или нещо такова... Честно казано не съм много сигурен. Но все пак по-добрият вариант остава самата база да ти върне резултата, който искаш.
А сега насериозно. Да, това е по-бавният вариант. За един запис това събитие може да (и ще) ти се викне няколко пъти. А иначе относно притеснението ти за многото записи - ако не се лъжа ще ти се викне само за тези записи, за които е необходимо. Например ако имаш грид, в който се виждат 10 реда ще ти се викне само за тях, докато не тръгнеш да скролираш. Или нещо такова... Честно казано не съм много сигурен. Но все пак по-добрият вариант остава самата база да ти върне резултата, който искаш.
Още мъгла за разсейване :-)
Май ще е виртуална бирата... Даже не ходя често до Пловдив... най-много до Happy-то на магистралата :-)
Блаодаря за бързите отговори...
Все пак мисля да го оставя приложението да го калкулира, иначе трябва някакъв SQL да пиша шантав...
SELECT IF(isperson=1,CONCAT(fname,' ',lname),company) AS title i t.n.
DB ще ми е на отделно PC но ще има доста клиенти,които ще я ползват и по-добре е те да се товарят (по мое мнение)...
btw Използвайки благоразположението на звездите днес - да разсея още малко концептуална мъгла...
Когато едно Query направи нещо от сорта на SELECT * FROM table - цялата информация ли полита от сървър-а към него или има нещо междинно което се грижи да поиска таблицата на парчетата които деиствително трябват на приложението?
Блаодаря за бързите отговори...
Все пак мисля да го оставя приложението да го калкулира, иначе трябва някакъв SQL да пиша шантав...
SELECT IF(isperson=1,CONCAT(fname,' ',lname),company) AS title i t.n.
DB ще ми е на отделно PC но ще има доста клиенти,които ще я ползват и по-добре е те да се товарят (по мое мнение)...
btw Използвайки благоразположението на звездите днес - да разсея още малко концептуална мъгла...
Когато едно Query направи нещо от сорта на SELECT * FROM table - цялата информация ли полита от сървър-а към него или има нещо междинно което се грижи да поиска таблицата на парчетата които деиствително трябват на приложението?
Редактирано от mole. на
А базата все пак каква е :)
По принцип не цялата. Не си казал каква е базата ти. Понеже любимата ми база е Firebird ще се спра на нея :)
Значи имаш си някакво query, дето ни връща резултата от заявката. Отваряме го с Open. Тук вариантите са два: 1) имаш някакъв грид, който визуализира данните от кюрито и 2) нямаш никакъв грид, който да визуализира данните от кюрито :)
Каква е ролята на грида в цялата работа - ами много просто: фетшват се само записите, които са необходими и ако имаш грид това ще са първите 10-15-20 или там колкото записа се побират в грида. Ако нямаш грид - няма да се фетшнат. Това е и причината RecordCount да не ти показва броя на редовете, които ти е върнала заявката. За да се изтеглят всички данни при клиента трябва или да отидеш на последния запис на кюрито или да извикаш FetchAll.
Значи имаш си някакво query, дето ни връща резултата от заявката. Отваряме го с Open. Тук вариантите са два: 1) имаш някакъв грид, който визуализира данните от кюрито и 2) нямаш никакъв грид, който да визуализира данните от кюрито :)
Каква е ролята на грида в цялата работа - ами много просто: фетшват се само записите, които са необходими и ако имаш грид това ще са първите 10-15-20 или там колкото записа се побират в грида. Ако нямаш грид - няма да се фетшнат. Това е и причината RecordCount да не ти показва броя на редовете, които ти е върнала заявката. За да се изтеглят всички данни при клиента трябва или да отидеш на последния запис на кюрито или да извикаш FetchAll.
Re: А базата все пак каква е :)
Мдаа мерси за бързия курс по Delphi :-) хубава работа...
Ползвам MySQL, че уж ми е най-познат а и това което правя има и Web-част, която така или иначе вече е на MySQL...
А като компоненти ползвам Zeos...
Ползвам MySQL, че уж ми е най-познат а и това което правя има и Web-част, която така или иначе вече е на MySQL...
А като компоненти ползвам Zeos...