Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Calculated field - не удается правильно вычислить [D7, XP]


GEM ©   (2006-08-15 12:32:00) 

Доброго времени суток!
Есть 2 таблицы FoxPro главная и подчиненная. В главной таблице ( Price) есть поля: код лекарства (kod_lek), цена за упаковку (price). В детальной ( Lekar): код лекарства (kod), количество таблеток в упаковке(tabletki). Таблицы связаны по полю кода. В главной таблице создано Lookup-поле (number), отображающее поле количество таблеток в упаковке из подч.таблицы. Также в главной таблице создано поле Calculated для расчета стоимости одной таблетки (price_tab). НД выводится в DBGrid. В поле tabletki детальн.таблицы часть записей не имеет значения, часть равны '10', '20' и др., а часть представлена видом '10*10'.  В OnCalcFields пишу:
if priceNumber.AsString='' then priceNumber.Value:='1';
pricePrice_tab.AsFloat:=pricePrice.AsFloat/priceNumber.AsFloat;

При этом в гриде в поле Price_tab выводится значение поля Price. Для проверки priceNumber.Value:='2', цена за таблетку становилась равной половине цены за упаковку. Через  FoxPro открываю таблицу лекарств пишу SELECT * FROM Lekar WHERE tabletki='', результат запроса все записи. Если пишу tabletki is NULL, не выводит ничего.

Подскажите, плз, как мне правильно рассчитать цену на таблетку в событии OnCalcFields? Спасибо.


GEM   (2006-08-21 10:53:00) [1]


> if priceNumber.AsString='' then n:=1


или

> if priceNumber.IsNull then Number := 1


Вся проблема в том, что если так писать, то условию почему-то отвечают все записи, хотя примерно в половине из записей содержится некое значение. Может ли это быть от того, что событие onCalcFields происходит ранее чем lookup-поле (number) получает значения? И что с этим делать?


evvcom   (2006-08-17 08:28:00) [2]

> [7] GEM   (17.08.06 07:06)

См.
> [4] Sergey13 ©   (15.08.06 16:00)
> Для этого есть переменные.

var Number: Integer;
begin
 if priceNumber.IsNull then Number := 1
 else Number := priceNumber.AsInteger
 pricePrice_tab.AsFloat:=pricePrice.AsFloat/Number;
end;


Sergey13   (2006-08-17 08:27:00) [3]

> [7] GEM   (17.08.06 07:06)
> хорошо, допустим 10*10 таких записей нет, как тогда обрабатывать
> пустые значения в OnCalcFields?

var n:integer;

if priceNumber.AsString='' then n:=1 else n:=priceNumber.AsFloat;
pricePrice_tab.AsFloat:=pricePrice.AsFloat/n;


GEM   (2006-08-17 07:06:00) [4]


> Тогда тебе придется сначала парсить и вычислять твое супер
> поле tabletki, а уж потом вычислять то, что тебе надо.

хорошо, допустим 10*10 таких записей нет, как тогда обрабатывать пустые значения в OnCalcFields?


Sergey13   (2006-08-16 14:26:00) [5]

> [5] GEM   (16.08.06 14:22)

Тогда тебе придется сначала парсить и вычислять твое супер поле tabletki, а уж потом вычислять то, что тебе надо.


GEM   (2006-08-16 14:22:00) [6]

структуру таблиц выбирать мне не приходится - они созданы другим приложением (не моим)


Sergey13   (2006-08-15 16:00:00) [7]

> А как тогда оперировать пустыми значениями?

А зачем присваивать какое-то значение полю? Для этого есть переменные.

> Наверняка я делаю что-то не так (на то и новичок) - помогите,
> как будет правильней.

Правильнее хранить данные в полях правильного типа. С правильной структурой таблиц.
Вот когда у тебя перестанут возникать подобные вопросы - значит структура становится более-менее правильная. Т.е. структура должна позволять оперировать данными без подобных извращений.
8-)


GEM   (2006-08-15 15:52:00) [8]


> не понял, какая связь здесь?

Связи никакой - это делалось только для проверки, так как было непонятно как работает условие if priceNumber.AsString=''  в Delphi, а именно почему выбирались все записи, а проверка делалась непосредственно в VFP . Если вас это смущает или не очень понятно, то часть "Через  FoxPro открываю таблицу лекарств пишу SELECT * FROM Lekar WHERE tabletki='', результат запроса все записи. Если пишу tabletki is NULL, не выводит ничего."можете пропустить. Мне казалось это внесет больше ясности.


> Это ты так лукап полю "правильное" значение присваиваешь?
>  Оригинально.

А как тогда оперировать пустымизначениями? Тогда при делении ругается на значение ''. Если я пишу
if priceNumber.AsString<>'' then pricePrice_tab.AsFloat:=pricePrice.AsFloat/priceNumber.AsFloat;
тогда вообще поле Price_tab пустое

> И что по твоему будет давать priceNumber.AsFloat? 100? Сомневаюсь.

Хотелось бы верить...Есть предложения?

Наверняка я делаю что-то не так (на то и новичок) - помогите, как будет правильней.


Sergey13   (2006-08-15 13:47:00) [9]

> if priceNumber.AsString='' then priceNumber.Value:='1';

Это ты так лукап полю "правильное" значение присваиваешь? Оригинально.

> а часть представлена видом '10*10'

И что по твоему будет давать priceNumber.AsFloat? 100? Сомневаюсь.


clickmaker   (2006-08-15 12:42:00) [10]


> Через  FoxPro открываю таблицу лекарств пишу SELECT * FROM
> Lekar WHERE tabletki='', результат запроса все записи. Если
> пишу tabletki is NULL, не выводит ничего.
>
> Подскажите, плз, как мне правильно рассчитать цену на таблетку
> в событии OnCalcFields?

не понял, какая связь здесь?


Наверх

Титульная страница Поиск, карта сайта Написать письмо