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

Вниз

FIBDatabase.QueryValue как в нем использовать параметры?   Найти похожие ветки 

 
ixen   (2010-10-20 13:45) [0]

Здравствуйте! Необходимо записать в таблицу вещественное число. Делаю так:


 
Фокус_Ник   (2010-10-20 13:49) [1]

Ничего не делаете - ничего и не записывается. Все правильно.


 
ixen   (2010-10-20 13:50) [2]


DM.Database.QueryValue("update docs set summ="+currtostr(sum)+" where id="+inttostr(Fprodaji.tag),0);

вроде работает.. но если переменная sum будет больше 1000 то выходит ошибка... я уже понял что нужно использовать параметры SQL запроса в сиснтаксисе QueryValue есть ParamValues которая предназначена для передачи этих параметров. Но как с ним работать в мануале от FIBPlus не нашел.

function QueryValues(const aSQL: string; ParamValues:array of variant;aTransaction: TFIBTransaction=nil ): Variant; overload;

подскажите как передавать в запрос параметры... попробовал написать так:
DM.Database.QueryValue("update docs set summ=:s1 where id=:s2",[sum,Fprodaji.tag],0); не получилось.. просьба сильно не орать если что...


 
ixen   (2010-10-20 14:05) [3]

мне бы примерчик как с ним работать...


 
Sergey13 ©   (2010-10-20 14:12) [4]

Я с фибами не работал, что такое FIBDatabase.QueryValue? Это что то типа "встроенного" кверика что ли?
Если бы кверик был "обычный", то в его свойство SQL.Text я бы записал "update docs set summ=:s1 where id=:s2", а потом через ParamByName присвоил бы значения параметрам.


 
ixen   (2010-10-20 14:16) [5]

> Это что то типа "встроенного" кверика что ли?

да... упращает выполнение небольших запросов ...

> потом через ParamByName присвоил бы значения параметрам.

тут такого нету.. тут какой то свой синтаксис...


 
Sergey13 ©   (2010-10-20 14:20) [6]

Ну и нахрена такое "упращение" спрашивается? Я для этого просто кладу отдельный кверик в датамодуль и все.


 
ixen   (2010-10-20 14:55) [7]

вобщем ошибку вызывала не запрос а функция перед запросом
  sum:=strtocurr(s);

как мне корректно перевести строку в вещественное число с учетом региональных настроек

есть функция FormatCurr ... видимо через нее.. но как её применить..


 
ixen   (2010-10-20 14:59) [8]

function StrToCurr(const S: string; const FormatSettings: TFormatSettings): Currency;
в ней тоже есть настройка формата... может FormatSettings как то можно взять с системных настроек и передать ее функции StrToCur в качестве параметра?


 
Фокус_Ник   (2010-10-20 15:15) [9]

StrToCurr и без того использует текущие системные настройки (если, конечно, Вы не меняли глобальные перемнные, в которых они хранятся - DecimalSeparator и другие).

Попробуйте так:

StrToCurr(StringReplace(StringReplace(S, ".", DecimalSeparator, []), ",", DecimalSeparator, []));


 
ixen   (2010-10-21 06:51) [10]

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


 
ixen   (2010-10-21 07:49) [11]

вобщем я отказался от использования функции 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;


всем спасибо... проблема решена..


 
sniknik ©   (2010-10-21 08:14) [12]

> Ну и нахрена такое "упращение" спрашивается?
+1
все одно что мотоцикл "упростить", отключить(не убрать) двигатель, и присобачить велосипедные педали... и как велосипед не удобен, тяжел, и на двигателе не ездит... зато заправлять не нужно, проще в обслуживании. идиотизм.

> with message ""2 000.00" is not a valid floating point value"
ну так, правильно все пробел в строке числа, точка при возможно установленной в системе запятой. точно не валидное значение...

> отказался от использования функции StrToCurr
это правильно, не нужно лишних преобразований, они во первый лишние, во вторых могут привести к ошибкам (при том что не нужны - на ровном месте)

> не при помощи запроса, а при помощи датасета...
а вот это логическая ошибка, причем БОЛЬШАЯ (поймешь после, может быть), + те же лишние действия для системы. почему не отказаться от преобразований в запросе? зачем менять все, при ошибке в маленьком несвязанным с собственно записью кусочке?


 
ixen   (2010-10-21 08:32) [13]

> все одно что мотоцикл "упростить", отключить(не убрать)
> двигатель, и присобачить велосипедные педали... и как велосипед
> не удобен, тяжел, и на двигателе не ездит... зато заправлять
> не нужно, проще в обслуживании. идиотизм.

допустим вам нужно дойти до соседнего подъезда.. заводить мотоцикл? я ж объяснил что это для выполнения простых запросов..

> а вот это логическая ошибка, причем БОЛЬШАЯ (поймешь после,
> может быть), + те же лишние действия для системы. почему
> не отказаться от преобразований в запросе? зачем менять
> все, при ошибке в маленьком несвязанным с собственно записью
> кусочке?

я понимаю что этот код датасет преобразуется в sql запрос... я пытался сделать изменение записи при помощи запроса... но сдесь придется использовать query, динамиески его создавать... передавать параметры в запрос, выполнять изменение поля ,  освобождать query и все ради лишь изменения одного значения в одной строке... мне кажется проще сделать датасетом...


 
Плохиш ©   (2010-10-21 10:47) [14]


> ixen   (21.10.10 08:32) [13]
> допустим вам нужно дойти до соседнего подъезда.. заводить
> мотоцикл?

Судя по [11] вы не просто заводите, описанный в [12] дерьмоцикл, но ещё и полгорода предварительно пытаетесь на нём объехать. Хотя дело ваше кодьте кодьте для мусорки.


 
sniknik ©   (2010-10-21 11:07) [15]

> что это для выполнения простых запросов..
параметры это не сложно, уверяю...

> я понимаю что этот код датасет преобразуется в sql запрос...
и не в один, а апдейт делается одним.

> я пытался сделать изменение записи при помощи запроса... но сдесь придется использовать query, динамиески его
> создавать... передавать параметры в запрос, выполнять изменение поля ,  освобождать query и все ради лишь
> изменения одного значения в одной строке... мне кажется проще сделать датасетом...
каких только оправданий/страшилок люди себе не навыдумывают, лиш бы не учиться...


 
ixen   (2010-10-26 09:18) [16]

Кажется я разобрался, правда методом тыка.. но все же добился корректной работы.. вот мое решение данной проблемы:
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, я так понял ни на что не влияет, т.к. результат от этого не меняется. Ну и все... все заработало... спасибо всем...

З.Ы. Без использования фибов данный код был бы гораздо громоздким... так что фибы это очень удобно...


 
Anatoly Podgoretsky ©   (2010-10-26 09:47) [17]

Ну не фига себе - удобно :-)


 
sniknik ©   (2010-10-26 09:54) [18]

> Ну не фига себе - удобно :-)
к мотоциклу с педалями присобачили коляску, очень удобно, что она обтекаемой формы... :о)


 
George ©   (2010-10-26 09:59) [19]


> З.Ы. Без использования фибов данный код был бы гораздо громоздким.
> .. так что фибы это очень удобно...

Да ниразу бы он не был более громоздким. Он был бы лишь более приличным.


 
sniknik ©   (2010-10-26 10:19) [20]

наверно фибы еще и на мозги влияют своим удобством, типа радиации...
нафига тут вообще калькулируемое значение хранить в поле базы...

пишем в ADODateSet запрос, типа
SELECT *,(SELECT Sum(summ) FROM moves m WHERE  m.doc_id=d.id) AS summ FROM docs d

и весь код, при изменениях/проверке последнего сводится к
ADODateSet.Requery;
что конечно жутко неудобно, зато коротко. ;)


 
ixen   (2010-10-26 14:33) [21]

А можно поподробнее?
пытаюсь выполнить приведенный запрос...
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 14:40) [22]

> как мне сделать одним запросом?
это и есть один запрос...

> пытаюсь сделать так, ошибка..
делай не так, делай соблюдая синтаксис команды update

а вообще я это привел показать, что update не нужен... и поле в таблице с сумой значений из другой таблицы тоже не нужно...


 
Anatoly Podgoretsky ©   (2010-10-26 15:05) [23]


> так, ошибка..

Именно так и пишет?


 
ixen   (2010-10-28 08:26) [24]

извените что вновь поднимаю эту тему... вобщем я переделал поля хранящие суммы в вычисляемые поля, т.е. я создал вычесляемое поле в Dataset. а как мне в SQL запросt обращаться к вычисляемому полю... ведь его физически нет в таблице...


 
ixen   (2010-10-28 08:40) [25]

объясню структуру таблицы

связь один ко многим...в родительской таблице DOCS есть вычисляемое поле, которое считает сумму вычисляемых полей дочерней таблицы MOVES.. вычисляемое поле дочерней таблицы вычисляется как произведение полей KOLVO и PRICE ... как мне теперь в родительской таблице в вычисляемом поле посчитать сумму вычисляемых полей дочерней таблицы...


 
ixen   (2010-10-28 08:45) [26]

есть ли способ подсчитать сумму вычисляемых полей не прибегая к помощи циклов и простого перебора строк?


 
sniknik ©   (2010-10-28 09:20) [27]

> а как мне в SQL запросt обращаться к вычисляемому полю... ведь его физически нет в таблице...
в приведенном мной примере разве не видно как? или проблема поставить вместо summ
> произведение полей KOLVO и PRICE ...
???


 
ixen   (2010-10-28 09:31) [28]

кажется дошло... я делал просто не так... вы говорите что можно вычисляемые поля делать в SQL запросе... а я их определил в датасете..
щас переделываю...


 
Anatoly Podgoretsky ©   (2010-10-28 09:53) [29]

Зачем параметры к вычисляемым полям?
Кроме того изучи понятие псевдонимы и тогда будет именованый доступ.


 
ixen   (2010-10-28 10:09) [30]

> Зачем параметры к вычисляемым полям?

у меня нет никаких параметров к вычисляемым полям...

вобщем прописал я в датасете SQL запрос
SELECT ID, KOLVO, PRICE, kolvo*price as summ FROM MOVES

в гриде поле summ отображается... и как бы все нормально. но как только я хочу изменить в строке какие нибудь данные.. прога вылетает с ошибкой
---------------------------
Debugger Exception Notification
---------------------------
Project xxxx.exe raised exception class EFIBInterBaseError with message "Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
SUMM.
At line 1, column 12.
". Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------


 
Anatoly Podgoretsky ©   (2010-10-28 10:56) [31]

> ixen  (28.10.2010 10:09:30)  [30]

Неправильно меняешь.


 
sniknik ©   (2010-10-28 11:01) [32]

> Column unknown.
> SUMM.
ну так, нет же такого поля. реально нет, зачем ты его меняешь?


 
ixen   (2010-10-28 11:09) [33]

> ну так, нет же такого поля. реально нет, зачем ты его меняешь?

я его не меняю.. в этом то и дело...

мне кажется это ругается грид... я вот думаю может на момент изменения данных выключать контролы..


 
ixen   (2010-10-28 11:13) [34]

аа... все... понял... процедурка старая осталась.. которая обращалась к полю summ.. я ее убрал.. теперь ошибки нет...


 
ixen   (2010-10-28 11:17) [35]

вычисляемое поле у меня в гриде отображается как 500.0000 .... можно ли его привести к виду 500.00? и как?


 
Плохиш ©   (2010-10-28 11:25) [36]


> ixen   (28.10.10 11:17) [35]
>
> вычисляемое поле у меня в гриде отображается как 500.0000
> .... можно ли его привести к виду 500.00? и как?

Описания к используемым компонентам читать не пробовал? Там это описано.


 
Anatoly Podgoretsky ©   (2010-10-28 11:34) [37]

> Плохиш  (28.10.2010 11:25:36)  [36]

Можно, ты тип укажи в запросе, а не по умолчанию


 
ixen   (2010-10-28 11:46) [38]

у колонки грида есть свойство DisplayFormat.. но не могу подобрать нужную маску..


 
Anatoly Podgoretsky ©   (2010-10-28 11:47) [39]

> ixen  (28.10.2010 11:46:38)  [38]

DisplayFormat возможно, но идеологически неверно.


 
ixen   (2010-10-28 11:58) [40]

> Можно, ты тип укажи в запросе, а не по умолчанию

не могу найти как указать тип вычисляемого поля нужно чтобы был numeric 15,2



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

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

Наверх




Память: 0.57 MB
Время: 0.011 c
11-1218819651
KOLBOSS
2008-08-15 21:00
2011.01.23
Cookies Synapse


2-1288144567
DROWSY
2010-10-27 05:56
2011.01.23
LookUpField.....


4-1243613031
GanibalLector
2009-05-29 20:03
2011.01.23
Номер порта на модеме


2-1288684319
JohnKorsh
2010-11-02 10:51
2011.01.23
RichEdit - переместить курсор в последнюю позицию.


15-1286012047
xayam
2010-10-02 13:34
2011.01.23
Проект Россия