Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: IBX + FireBird несколько таблиц в запросе  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
antox



вызвал автогенерацию InsertSQL/UpdateSQL/RefreshSQL


Ну так покажи, что у тебя там сейчас.
12 мар 20, 09:15    [22097350]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
istrebitel
Member

Откуда:
Сообщений: 49
RefreshSQL скорее всего должен быть
select 
	t.*
	, (select sum(mycount) from tab2 where tab_id=t.id and uids=:uids) as sumt2
from 
	tab t
where
	t.id = :id
12 мар 20, 09:15    [22097351]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
ъъъъъ
antox,

давай, вываливай все запросы. И изменяющие, и обновляющий.


update TAB
set
  ID = :ID,
  NAM = :NAM,
  PRICE = :PRICE,
  COUNT = :COUNT
where
  ID = :OLD_ID


insert into TAB
  (ID, NAM, PRICE, COUNT)
values
  (:ID, :NAM, :PRICE, :COUNT)


delete from TAB
where
  ID = :OLD_ID


Refresh
Select 
  ID,
  NAM,
  PRICE,
  COUNT
from TAB 
where
  ID = :ID
12 мар 20, 09:18    [22097352]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
goldmi45
antox

Я так понял, что в RefreshSQL я просто не указываю поле sumt2 и все, а что как-то можно указать в RefreshSQL, то sumt2 необходимо перезапросить?

А не задумывались, что проблема с тем, что после Post у вас в поле с суммой становится пустым, как раз из-за того, что вы в refreshsql его не указали?


Думал, что никак низя это прописать в Refresh
12 мар 20, 09:18    [22097353]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
antox
...

Refresh
Select 
  ID,
  NAM,
  PRICE,
  COUNT
from TAB 
where
  ID = :ID

Ну, и где тут sum()?
12 мар 20, 09:19    [22097354]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
istrebitel
Member

Откуда:
Сообщений: 49
antox


Сделал запрос:

select t.*
from tab t
order by t.nam


вызвал автогенерацию InsertSQL/UpdateSQL/RefreshSQL

а потом в SelectSQL измени на

select t.*, (select sum(mycount) from tab2 where tab_id=:tid) as sumt2
from tab t
order by t.nam


соответственно InsertSQL/UpdateSQL/RefreshSQL ничего не знает о sumt2

Пиши сразу полный SQL в основное SQL Property
select 
	t.*
	, (select sum(mycount) from tab2 where tab_id=t.id and uids=:uids) as sumt2
from 
	tab t
order by
	t.nam

А поле sumt2 поставь свойство InternalCalc, оно исключится из автогенерации команд.
12 мар 20, 09:20    [22097355]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
antox,

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

Используешь модифицированный IBX, или CommitRetaining или транзакция тупо висит "до особого распоряжения"?
12 мар 20, 09:21    [22097357]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
ъъъъъ
antox,

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

Используешь модифицированный IBX, или CommitRetaining или транзакция тупо висит "до особого распоряжения"?


CommitRetaining
12 мар 20, 09:22    [22097358]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
ъъъъъ
antox
...

Refresh
Select 
  ID,
  NAM,
  PRICE,
  COUNT
from TAB 
where
  ID = :ID

Ну, и где тут sum()?


Неоткуда ему взяться )
12 мар 20, 09:23    [22097359]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
istrebitel
antox


Сделал запрос:

select t.*
from tab t
order by t.nam


вызвал автогенерацию InsertSQL/UpdateSQL/RefreshSQL

а потом в SelectSQL измени на

select t.*, (select sum(mycount) from tab2 where tab_id=:tid) as sumt2
from tab t
order by t.nam


соответственно InsertSQL/UpdateSQL/RefreshSQL ничего не знает о sumt2

Пиши сразу полный SQL в основное SQL Property
select 
	t.*
	, (select sum(mycount) from tab2 where tab_id=t.id and uids=:uids) as sumt2
from 
	tab t
order by
	t.nam

А поле sumt2 поставь свойство InternalCalc, оно исключится из автогенерации команд.


Сейчас попробую
12 мар 20, 09:24    [22097360]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
Vlad F
Member

Откуда:
Сообщений: 1183
antox
Vlad F
P.S. RefreshSQL как раз типа для подобных надобностей.


Напиши пример, please

См сюда 22097351
12 мар 20, 09:25    [22097361]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
istrebitel
RefreshSQL скорее всего должен быть
select 
	t.*
	, (select sum(mycount) from tab2 where tab_id=t.id and uids=:uids) as sumt2
from 
	tab t
where
	t.id = :id


Прописал, работает, но значение :uids не ставится в Refresh, т.е. при
where tab_id=t.id
отлично, а при
where tab_id=t.id and uids=:uids
0

Как передать параметр повторно при перед Refresh или мож его с каким префиксом надо, типа он из Select?
12 мар 20, 09:42    [22097367]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Если жестко написать

where tab_id=t.id and uids=3


работает

На BeforePefresh повторная передача параметра результата не дает
12 мар 20, 09:59    [22097380]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
Vlad F
Member

Откуда:
Сообщений: 1183
antox,

Попробуй and uids=:old_uids
12 мар 20, 09:59    [22097382]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Vlad F
antox,

Попробуй and uids=:old_uids


Попробую ( Но пишут, что параметры из селекта в рефреш не передать
12 мар 20, 12:41    [22097534]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
Vlad F
Member

Откуда:
Сообщений: 1183
antox,

Понял. Тебе надо этот параметр в качестве дополнительного искусственного поля вытащить в селективной части SelectSQL.
12 мар 20, 13:00    [22097548]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1083
antox
ъъъъъ

Зайчик, у TIBDataSet должны быть определены SelectSQL, ModifySQL, InsertSQL и RefreshSQL.
Ты, конечно же, их определил, и учел, что в RefreshSQL должна быть уточняющая where - кляуза.


Ты не из этих? :)

Я так понял, что в RefreshSQL я просто не указываю поле sumt2 и все, а что как-то можно указать в RefreshSQL, то sumt2 необходимо перезапросить?

Насколько помню, у меня в RefreshSQL обычно был тот же запрос, что в select, только еще указание на текущую запись
where ...
and t.id = :id

P.S. Глянул, ну еще без order by, потому что только одна запись возвращается.

Сообщение было отредактировано: 12 мар 20, 13:11
12 мар 20, 13:06    [22097557]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Vlad F
antox,

Понял. Тебе надо этот параметр в качестве дополнительного искусственного поля вытащить в селективной части SelectSQL.


Да, я тоже это понял почитав о невозможности использовать параметры селекта в рефреше, но что-то пока не могу реализовать

Так не работает:
select t.*, :uids


так тоже...

select t.*, (:uids) as uids


Хотя так работает

select t.*, ('value') as virtField


Как же мне вывести значение параметра в виде поля?

Сообщение было отредактировано: 13 мар 20, 04:00
13 мар 20, 03:51    [22098070]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Видимо придется передавать готовым значением на этапе SelectSQL
13 мар 20, 05:04    [22098078]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Короче, похоже, все зря

Если в Refresh даже указать

select 
	t.*
	, (5) as sumt2
from 
	tab t
where
	t.id = :id


То все равно sumt2 = null, а не 5 после post
13 мар 20, 05:07    [22098079]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Пока буду ч-з OnCalcFields на другое поле

  if DataSet.FieldByName('sumt2').Value = null
    then DataSet.FieldByName('sumt2virt').Value := [Получаю значение и подставляю]
    else DataSet.FieldByName('sumt2virt').Value := DataSet.FieldByName('sumt2').Value;
13 мар 20, 05:12    [22098080]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
:) по ходу дела возник вопрос по событиям, но это уже тема другого чата...
13 мар 20, 05:22    [22098081]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3561
antox
Ну чтоб избежать утечек
IBQ:=TIBQuery.Create
try
  // тут работаем
finally
  FreeAndNil(IBQ)
end;


ну, проверка понятно, а FreeAndNil прям на ноль чистит память?


не память, а указатель на память. чистит на ноль.
13 мар 20, 09:17    [22098132]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4115
antox
Короче, похоже, все зря

Если в Refresh даже указать

select 
	t.*
	, (5) as sumt2
from 
	tab t
where
	t.id = :id



То все равно sumt2 = null, а не 5 после post

1. Не :id, а :old_id, уже 2 раза говорили.
2. Если не поможет - значит из-за того, что у тебя "*". Напиши нормальный список полей, как положено.
3. Не верю, чоо в refreshsql нельзя подзапрос. "Ошибка"? Так ее нужно исправить.
13 мар 20, 10:12    [22098172]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4115
antox
ъъъъъ
antox,

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

Используешь модифицированный IBX, или CommitRetaining или транзакция тупо висит "до особого распоряжения"?


CommitRetaining
Лучше на этапе разработки отказаться от CommitRetaining, чем судорожно переделывать потом, когда у клиентов база станет раком.
Редактировать надо, пока открыта readonly транзакция, и только чтобы изменения в базу слить - открывать на мгновение пишущую и сразу закрывать.
Как этого добиться - путей много, гугл в помощь.
Ваш нынешний путь - обречен, это точно, 100%.
13 мар 20, 10:18    [22098180]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Delphi Ответить