Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.10;
Скачать: CL | DM;

Вниз

Calculated field - не удается правильно вычислить   Найти похожие ветки 

 
GEM   (2006-08-15 12:32) [0]

Доброго времени суток!
Есть 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? Спасибо.


 
clickmaker ©   (2006-08-15 12:42) [1]


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

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


 
Sergey13 ©   (2006-08-15 13:47) [2]

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

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

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

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


 
GEM   (2006-08-15 15:52) [3]


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

Связи никакой - это делалось только для проверки, так как было непонятно как работает условие 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 16:00) [4]

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

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

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

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


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

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


 
Sergey13 ©   (2006-08-16 14:26) [6]

> [5] GEM   (16.08.06 14:22)

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


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


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

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


 
Sergey13 ©   (2006-08-17 08:27) [8]

> [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;


 
evvcom ©   (2006-08-17 08:28) [9]

> [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;


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


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


или

> if priceNumber.IsNull then Number := 1


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



Страницы: 1 вся ветка

Текущий архив: 2006.09.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
1-1154103712
OlDirtyBastard
2006-07-28 20:21
2006.09.10
Убрать курсор


3-1152098680
antoxa2005
2006-07-05 15:24
2006.09.10
Подскажите, а как организовать блокировку записи MS SQL Server


1-1154126106
Цукор5
2006-07-29 02:35
2006.09.10
Ссылка на кокласс внутри другого кокласса


2-1155884743
her
2006-08-18 11:05
2006.09.10
TBytes и TIdSocketHandle


2-1155916392
kami
2006-08-18 19:53
2006.09.10
Коннект 2-х TServerSocket