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

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

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


В DBGrid все выглядит хорошо, поначалу...

Проблема в том, что после ibDataSet.Post поле sumt2 в DBGrid становится пустым. Как мне этого избежать?

Никак? :)

Только использовать Lookup поле? (но для этого необходимо держать рядом открытый query со всеми записями
select sum(mycount) 
from tab2 
order by tid


Писать значение прямо в поле DBGrid из, например, TDictionary, который заранее сформировать?

Не делать Post у ibDataSet а менять данные ч-з ibSQL, но тогда как рефрешить эту одну запись в ibDataSet, не переоткрывать же весь запрос каждый раз при изменении одной строки?

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

Откуда:
Сообщений: 49
Не знаю как в вашем датасете, но обычно полю sumt2 назначают своиства
AutoGenerateValue = arDefault
FieldKind = fkInternalCalc
12 мар 20, 07:03    [22097292]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
istrebitel
Не знаю как в вашем датасете, но обычно полю sumt2 назначают своиства
AutoGenerateValue = arDefault
FieldKind = fkInternalCalc


Попробовал, ничего не изменилось... Или надо еще что-то сделать?

Если указано fkInternalCalc, тогда что-то надо указывать DefaulExpression ?
12 мар 20, 07:12    [22097294]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
istrebitel
Member

Откуда:
Сообщений: 49
fkInternalCalc просто указывает на то, что поле расчётное и не имеет отображения на реальное поле в таблице, в бд и соответственно не должно участвовать при построении INSERT'ов и UPDATE'ов. А arDefault обычно приводит к вычитке значения после INSERT. А где нибудь нет свойства RefreshAfterUpdate?
12 мар 20, 07:26    [22097299]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
Vlad F
Member

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

Свойство что-то типа RefreshSQL надо правильно заполнить. Для обновления значений одной, текущей записи набора по соответствующему ключу.
12 мар 20, 07:31    [22097301]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Ну, это поле нельзя включать в RefreshSQL, иначе ошибка )
12 мар 20, 07:36    [22097302]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
istrebitel
fkInternalCalc просто указывает на то, что поле расчётное и не имеет отображения на реальное поле в таблице, в бд и соответственно не должно участвовать при построении INSERT'ов и UPDATE'ов. А arDefault обычно приводит к вычитке значения после INSERT. А где нибудь нет свойства RefreshAfterUpdate?


Не, такого свойства нет (
12 мар 20, 07:49    [22097307]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Нужно как-то перезапросить это поле с сервера и вставить, попробую вставить вручную
12 мар 20, 07:53    [22097309]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
istrebitel
Member

Откуда:
Сообщений: 49
Только сейчас обратил внимание у вас подзапрос не завязан на данные таблицы tab соответственно в колонке будет одно значение на весь столбец, вам такое поведение необходимо? Тогда можно выполнить (select sum(mycount) from tab2 where tab_id=:tid) до открытия датасета и передать значение параметром
select t.*, :sumt as sumt2
from tab t
order by t.nam
Если и так будет глючить, то у поля sumt2 ставите тип fkCalculated и в обработчике датасета OnCalcFields заполняете это поле ранее вычисленным значением.
12 мар 20, 08:14    [22097312]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Это я ошибся

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


Завязано, конечно.
12 мар 20, 08:27    [22097314]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Сделал такое извращение (повесил обработчик на GetText поля), но не нравится мне такое:

procedure TForm1.IBDataSetsumt2GetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  if TField(Sender).Value = null then Text := CurrToStr(getSumt2(IBDataSet.FieldByName('id').AsInteger))
                                  else Text := TField(Sender).Value;
end


getSumt2 создает TIBQuery, лезет в базу дергает данные, возвращает значение и уничтожает TIBQuery, не знаю насколько это замедлит работу.

Может вообще поставить getSumt2 на кальк поле? Но тогда функция будет выполняться на все записи IBDataSet, а при GetText, только на те, по которым был Post без
IBDataSet.Close + IBDataSet.Open


Будем надеяться, что утечек памяти при выполнении getSumt2 с
IBQ:=TIBQuery.Create
и последующем
FreeAndNil(IBQ)
не возникнет

Сообщение было отредактировано: 12 мар 20, 08:38
12 мар 20, 08:31    [22097315]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
istrebitel
Member

Откуда:
Сообщений: 49
Не поле делаешь InternalCalc а в OnCalculateFields проверяешь его на Null и если пустое то только тогда запрашиваешь из БД значение и присваиваешь этому полю.
По идее должно отрабатывать один раз, но правда если
select sum(mycount) from tab2 where tab_id=t.id and uids=:uids

вернёт NULL то, будет лишний повторный запрос.

Ну чтоб избежать утечек
IBQ:=TIBQuery.Create
try
  // тут работаем
finally
  FreeAndNil(IBQ)
end;


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

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

Получается, что тоже самое, что у меня на GetText , только на OnCalculateFields. Чем это лучше? Или аналогично?

Я так понимаю, что GetText (если в одном поле) срабатывает один раз на строку и OnCalculateFields тоже?
12 мар 20, 08:47    [22097321]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Ну чтоб избежать утечек
IBQ:=TIBQuery.Create
try
  // тут работаем
finally
  FreeAndNil(IBQ)
end;


ну, проверка понятно, а FreeAndNil прям на ноль чистит память?
12 мар 20, 08:48    [22097323]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
antox
Есть ibDataSet с SQL

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



В DBGrid все выглядит хорошо, поначалу...

Проблема в том, что после ibDataSet.Post поле sumt2 в DBGrid становится пустым. Как мне этого избежать?

Никак? :)

Только использовать Lookup поле? (но для этого необходимо держать рядом открытый query со всеми записями
select sum(mycount) 
from tab2 
order by tid



Писать значение прямо в поле DBGrid из, например, TDictionary, который заранее сформировать?

Не делать Post у ibDataSet а менять данные ч-з ibSQL, но тогда как рефрешить эту одну запись в ibDataSet, не переоткрывать же весь запрос каждый раз при изменении одной строки?

Написать другой запрос?

Зайчик, у TIBDataSet должны быть определены SelectSQL, ModifySQL, InsertSQL и RefreshSQL.
Ты, конечно же, их определил, и учел, что в RefreshSQL должна быть уточняющая where - кляуза.
12 мар 20, 09:00    [22097327]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
istrebitel
Member

Откуда:
Сообщений: 49
GetText вызывается при каждом чтении поля, строка при скроллинге скрылась из Grid'а, скролим в обратном направлении, при появлении строки в гриде будет повторный вызов. OnCalcFields один вызов на строку, в момент фетчинга из базы.
12 мар 20, 09:02    [22097330]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
Vlad F
Member

Откуда:
Сообщений: 1183
antox
Ну, это поле нельзя включать в RefreshSQL, иначе ошибка )

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

Откуда:
Сообщений: 1183
P.S. RefreshSQL как раз типа для подобных надобностей.
12 мар 20, 09:07    [22097334]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

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

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


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

Я так понял, что в RefreshSQL я просто не указываю поле sumt2 и все, а что как-то можно указать в RefreshSQL, то sumt2 необходимо перезапросить?
12 мар 20, 09:09    [22097338]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
antox
Проблема в том, что после ibDataSet.Post

Все же интересно, что в InsertSQL/UpdateSQL.
12 мар 20, 09:10    [22097340]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
antox
Member

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


Напиши пример, please
12 мар 20, 09:10    [22097341]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
ъъъъъ
Member

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

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


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

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

Может, ты просто покажешь, что у тебя в RefreshSQL?
12 мар 20, 09:10    [22097342]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
ъъъъъ
Member

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

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

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

Откуда: РФ
Сообщений: 1097
ъъъъъ
antox
Проблема в том, что после ibDataSet.Post

Все же интересно, что в InsertSQL/UpdateSQL.


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

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
12 мар 20, 09:13    [22097345]     Ответить | Цитировать Сообщить модератору
 Re: IBX + FireBird несколько таблиц в запросе  [new]
goldmi45
Member

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

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

А не задумывались, что проблема с тем, что после Post у вас в поле с суммой становится пустым, как раз из-за того, что вы в refreshsql его не указали?
12 мар 20, 09:14    [22097347]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить