Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c