Текущий архив: 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