![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FIBDatabase.QueryValue как в нем использовать параметры?
ixen © (2010-10-20 13:45:00)Здравствуйте! Необходимо записать в таблицу вещественное число. Делаю так:
Anatoly Podgoretsky (2010-10-28 09:53:00) [21]Зачем параметры к вычисляемым полям?
Кроме того изучи понятие псевдонимы и тогда будет именованый доступ.
ixen (2010-10-28 09:31:00) [22]кажется дошло... я делал просто не так... вы говорите что можно вычисляемые поля делать в SQL запросе... а я их определил в датасете..
щас переделываю...
sniknik (2010-10-28 09:20:00) [23]> а как мне в SQL запросt обращаться к вычисляемому полю... ведь его физически нет в таблице...
в приведенном мной примере разве не видно как? или проблема поставить вместо summ
> произведение полей KOLVO и PRICE ...
???
ixen (2010-10-28 08:45:00) [24]есть ли способ подсчитать сумму вычисляемых полей не прибегая к помощи циклов и простого перебора строк?
ixen (2010-10-28 08:40:00) [25]объясню структуру таблицы
связь один ко многим...в родительской таблице DOCS есть вычисляемое поле, которое считает сумму вычисляемых полей дочерней таблицы MOVES.. вычисляемое поле дочерней таблицы вычисляется как произведение полей KOLVO и PRICE ... как мне теперь в родительской таблице в вычисляемом поле посчитать сумму вычисляемых полей дочерней таблицы...
ixen (2010-10-28 08:26:00) [26]извените что вновь поднимаю эту тему... вобщем я переделал поля хранящие суммы в вычисляемые поля, т.е. я создал вычесляемое поле в Dataset. а как мне в SQL запросt обращаться к вычисляемому полю... ведь его физически нет в таблице...
Anatoly Podgoretsky (2010-10-26 15:05:00) [27]
> так, ошибка..
Именно так и пишет?
sniknik (2010-10-26 14:40:00) [28]> как мне сделать одним запросом?
это и есть один запрос...
> пытаюсь сделать так, ошибка..
делай не так, делай соблюдая синтаксис команды update
а вообще я это привел показать, что update не нужен... и поле в таблице с сумой значений из другой таблицы тоже не нужно...
ixen (2010-10-26 14:33:00) [29]А можно поподробнее?
пытаюсь выполнить приведенный запрос...
SELECT *,(SELECT Sum(summ) FROM moves m WHERE m.doc_id=d.id) AS summ FROM docs d
как мне сделать одним запросом?
пытаюсь сделать так, ошибка..
update docs d set (SELECT Sum(summ) FROM moves m WHERE m.doc_id=24) as d.summ FROM d
sniknik (2010-10-26 10:19:00) [30]наверно фибы еще и на мозги влияют своим удобством, типа радиации...
нафига тут вообще калькулируемое значение хранить в поле базы...
пишем в ADODateSet запрос, типа
SELECT *,(SELECT Sum(summ) FROM moves m WHERE m.doc_id=d.id) AS summ FROM docs d
и весь код, при изменениях/проверке последнего сводится к
ADODateSet.Requery;
что конечно жутко неудобно, зато коротко. ;)
George (2010-10-26 09:59:00) [31]
> З.Ы. Без использования фибов данный код был бы гораздо громоздким.
> .. так что фибы это очень удобно...
Да ниразу бы он не был более громоздким. Он был бы лишь более приличным.
sniknik (2010-10-26 09:54:00) [32]> Ну не фига себе - удобно :-)
к мотоциклу с педалями присобачили коляску, очень удобно, что она обтекаемой формы... :о)
Anatoly Podgoretsky (2010-10-26 09:47:00) [33]Ну не фига себе - удобно :-)
ixen (2010-10-26 09:18:00) [34]Кажется я разобрался, правда методом тыка.. но все же добился корректной работы.. вот мое решение данной проблемы:
procedure TFprodaji.setsumm;
var sum:array of variant;
s:string;
begin
sum:=DM.Database.QueryValues('select sum(summ) from moves where doc_id='+inttostr(tag));
s:='update docs d set d.summ=:s where d.id='+inttostr(tag);
DM.Database.QueryValue(s,0,sum);
DM.docs_dset.FullRefresh;
end;
т.е. я определил переменную sum как вариантный массив.
присвоил ей значение выдаваемое функцией QueryValues ... тут нужно использовать именно ее а не просто QueryValue, т.к. QueryValues выдает именно вариантный массив, а не одно значение.
затем я в SQL скрипте обозначил переменную как :s вместо которой необходимо вставить данные из вариантного массива. Ноль, обозначающий номер поля, в QueryValue, я так понял ни на что не влияет, т.к. результат от этого не меняется. Ну и все... все заработало... спасибо всем...
З.Ы. Без использования фибов данный код был бы гораздо громоздким... так что фибы это очень удобно...
sniknik (2010-10-21 11:07:00) [35]> что это для выполнения простых запросов..
параметры это не сложно, уверяю...
> я понимаю что этот код датасет преобразуется в sql запрос...
и не в один, а апдейт делается одним.
> я пытался сделать изменение записи при помощи запроса... но сдесь придется использовать query, динамиески его
> создавать... передавать параметры в запрос, выполнять изменение поля , освобождать query и все ради лишь
> изменения одного значения в одной строке... мне кажется проще сделать датасетом...
каких только оправданий/страшилок люди себе не навыдумывают, лиш бы не учиться...
Плохиш (2010-10-21 10:47:00) [36]
> ixen (21.10.10 08:32) [13]
> допустим вам нужно дойти до соседнего подъезда.. заводить
> мотоцикл?
Судя по [11] вы не просто заводите, описанный в [12] дерьмоцикл, но ещё и полгорода предварительно пытаетесь на нём объехать. Хотя дело ваше кодьте кодьте для мусорки.
ixen (2010-10-21 08:32:00) [37]> все одно что мотоцикл "упростить", отключить(не убрать)
> двигатель, и присобачить велосипедные педали... и как велосипед
> не удобен, тяжел, и на двигателе не ездит... зато заправлять
> не нужно, проще в обслуживании. идиотизм.
допустим вам нужно дойти до соседнего подъезда.. заводить мотоцикл? я ж объяснил что это для выполнения простыхзапросов..
> а вот это логическая ошибка, причем БОЛЬШАЯ (поймешь после,
> может быть), + те же лишние действия для системы. почему
> не отказаться от преобразований в запросе? зачем менять
> все, при ошибке в маленьком несвязанным с собственно записью
> кусочке?
я понимаю что этот код датасет преобразуется в sql запрос... я пытался сделать изменение записи при помощи запроса... но сдесь придется использовать query, динамиески его создавать... передавать параметры в запрос, выполнять изменение поля , освобождать query и все ради лишь изменения одного значения в одной строке... мне кажется проще сделать датасетом...
sniknik (2010-10-21 08:14:00) [38]> Ну и нахрена такое "упращение" спрашивается?
+1
все одно что мотоцикл "упростить", отключить(не убрать) двигатель, и присобачить велосипедные педали... и как велосипед не удобен, тяжел, и на двигателе не ездит... зато заправлять не нужно, проще в обслуживании. идиотизм.
> with message ''2 000.00' is not a valid floating point value'
ну так, правильно все пробел в строке числа, точка при возможно установленной в системе запятой. точно не валидное значение...
> отказался от использования функции StrToCurr
это правильно, не нужно лишних преобразований, они во первый лишние, во вторых могут привести к ошибкам (при том что не нужны - на ровном месте)
> не при помощи запроса, а при помощи датасета...
а вот это логическая ошибка, причем БОЛЬШАЯ (поймешь после, может быть), + те же лишние действия для системы. почему не отказаться от преобразований в запросе? зачем менять все, при ошибке в маленьком несвязанным с собственно записью кусочке?
ixen (2010-10-21 07:49:00) [39]вобщем я отказался от использования функции StrToCurr ... а сделал по другому... при помощи запроса получаю вещественное число и затем присваиваю его не при помощи запроса, а при помощи датасета...
procedure TFusluga_card.getsumm;
var sum:Currency;
begin
sum:=Currency(DM.Database.QueryValue('select sum(summ) from moves where doc_id='+inttostr(tag),0));
FSales.docs_s_dset.Edit;
FSales.docs_s_dset.fieldbyname('summ').AsFloat:=sum;
FSales.docs_s_dset.ApplyUpdates;
FSales.docs_s_dset.FullRefresh;
dm.docs_dset.fullrefresh;
end;
всем спасибо... проблема решена..
ixen (2010-10-21 06:51:00) [40]> StrToCurr(StringReplace(StringReplace(S, '.', DecimalSeparator,
> []), ',', DecimalSeparator, []));
все равно ошибка... .. пишет ошибку:
---------------------------
Debugger Exception Notification
---------------------------
Project xxx.exe raised exception class EConvertError with message ''2 000.00' is not a valid floating point value'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------