powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBX + FireBird несколько таблиц в запросе
56 сообщений из 56, показаны все 3 страниц
IBX + FireBird несколько таблиц в запросе
    #39936486
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ibDataSet с SQL

Код: sql
1.
2.
3.
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 со всеми записями
Код: sql
1.
2.
3.
select sum(mycount) 
from tab2 
order by tid



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

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

Написать другой запрос?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936488
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю как в вашем датасете, но обычно полю sumt2 назначают своиства
AutoGenerateValue = arDefault
FieldKind = fkInternalCalc
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936490
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel
Не знаю как в вашем датасете, но обычно полю sumt2 назначают своиства
AutoGenerateValue = arDefault
FieldKind = fkInternalCalc


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

Если указано fkInternalCalc, тогда что-то надо указывать DefaulExpression ?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936494
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkInternalCalc просто указывает на то, что поле расчётное и не имеет отображения на реальное поле в таблице, в бд и соответственно не должно участвовать при построении INSERT'ов и UPDATE'ов. А arDefault обычно приводит к вычитке значения после INSERT. А где нибудь нет свойства RefreshAfterUpdate?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936496
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,

Свойство что-то типа RefreshSQL надо правильно заполнить. Для обновления значений одной, текущей записи набора по соответствующему ключу.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936497
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, это поле нельзя включать в RefreshSQL, иначе ошибка )
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936501
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel
fkInternalCalc просто указывает на то, что поле расчётное и не имеет отображения на реальное поле в таблице, в бд и соответственно не должно участвовать при построении INSERT'ов и UPDATE'ов. А arDefault обычно приводит к вычитке значения после INSERT. А где нибудь нет свойства RefreshAfterUpdate?


Не, такого свойства нет (
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936503
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно как-то перезапросить это поле с сервера и вставить, попробую вставить вручную
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936505
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только сейчас обратил внимание у вас подзапрос не завязан на данные таблицы 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 заполняете это поле ранее вычисленным значением.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936507
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я ошибся

Код: sql
1.
2.
3.
select t.*, (select sum(mycount) from tab2 where tab_id=t.id and uids=:uids) as sumt2
from tab t
order by t.nam



Завязано, конечно.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936508
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал такое извращение (повесил обработчик на GetText поля), но не нравится мне такое:

Код: pascal
1.
2.
3.
4.
5.
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 без
Код: pascal
1.
IBDataSet.Close + IBDataSet.Open



Будем надеяться, что утечек памяти при выполнении getSumt2 с
Код: sql
1.
IBQ:=TIBQuery.Create

и последующем
Код: pascal
1.
FreeAndNil(IBQ)

не возникнет
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936511
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не поле делаешь InternalCalc а в OnCalculateFields проверяешь его на Null и если пустое то только тогда запрашиваешь из БД значение и присваиваешь этому полю.
По идее должно отрабатывать один раз, но правда если
Код: sql
1.
select sum(mycount) from tab2 where tab_id=t.id and uids=:uids


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

Ну чтоб избежать утечек
Код: pascal
1.
2.
3.
4.
5.
6.
IBQ:=TIBQuery.Create
try
  // тут работаем
finally
  FreeAndNil(IBQ)
end;
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936514
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel,

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

Я так понимаю, что GetText (если в одном поле) срабатывает один раз на строку и OnCalculateFields тоже?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936516
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну чтоб избежать утечек
Код: pascal
1.
2.
3.
4.
5.
6.
IBQ:=TIBQuery.Create
try
  // тут работаем
finally
  FreeAndNil(IBQ)
end;



ну, проверка понятно, а FreeAndNil прям на ноль чистит память?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936519
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox
Есть ibDataSet с SQL

Код: sql
1.
2.
3.
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 со всеми записями
Код: sql
1.
2.
3.
select sum(mycount) 
from tab2 
order by tid




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

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

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

Зайчик, у TIBDataSet должны быть определены SelectSQL, ModifySQL, InsertSQL и RefreshSQL.
Ты, конечно же, их определил, и учел, что в RefreshSQL должна быть уточняющая where - кляуза.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936522
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GetText вызывается при каждом чтении поля, строка при скроллинге скрылась из Grid'а, скролим в обратном направлении, при появлении строки в гриде будет повторный вызов. OnCalcFields один вызов на строку, в момент фетчинга из базы.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936523
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Ну, это поле нельзя включать в RefreshSQL, иначе ошибка )

Чего-чего??
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936526
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. RefreshSQL как раз типа для подобных надобностей.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936530
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ

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


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

Я так понял, что в RefreshSQL я просто не указываю поле sumt2 и все, а что как-то можно указать в RefreshSQL, то sumt2 необходимо перезапросить?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936532
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox
Проблема в том, что после ibDataSet.Post

Все же интересно, что в InsertSQL/UpdateSQL.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936533
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
P.S. RefreshSQL как раз типа для подобных надобностей.


Напиши пример, please
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936534
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox
ъъъъъ

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


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

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

Может, ты просто покажешь, что у тебя в RefreshSQL?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936535
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox,

давай, вываливай все запросы. И изменяющие, и обновляющий.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936536
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
antox
Проблема в том, что после ibDataSet.Post

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


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

Код: sql
1.
2.
3.
select t.*
from tab t
order by t.nam



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

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

Код: sql
1.
2.
3.
select t.*, (select sum(mycount) from tab2 where tab_id=:tid) as sumt2
from tab t
order by t.nam



соответственно InsertSQL/UpdateSQL/RefreshSQL ничего не знает о sumt2
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936537
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox

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

А не задумывались, что проблема с тем, что после Post у вас в поле с суммой становится пустым, как раз из-за того, что вы в refreshsql его не указали?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936539
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox



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


Ну так покажи, что у тебя там сейчас.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936540
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RefreshSQL скорее всего должен быть
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	t.*
	, (select sum(mycount) from tab2 where tab_id=t.id and uids=:uids) as sumt2
from 
	tab t
where
	t.id = :id
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936541
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
antox,

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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
update TAB
set
  ID = :ID,
  NAM = :NAM,
  PRICE = :PRICE,
  COUNT = :COUNT
where
  ID = :OLD_ID



Код: sql
1.
2.
3.
4.
insert into TAB
  (ID, NAM, PRICE, COUNT)
values
  (:ID, :NAM, :PRICE, :COUNT)



Код: sql
1.
2.
3.
delete from TAB
where
  ID = :OLD_ID



Refresh
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Select 
  ID,
  NAM,
  PRICE,
  COUNT
from TAB 
where
  ID = :ID
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936542
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
antox

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

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


Думал, что никак низя это прописать в Refresh
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936543
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox
...

Refresh
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Select 
  ID,
  NAM,
  PRICE,
  COUNT
from TAB 
where
  ID = :ID


Ну, и где тут sum()?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936544
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox


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

Код: sql
1.
2.
3.
select t.*
from tab t
order by t.nam



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

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

Код: sql
1.
2.
3.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
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, оно исключится из автогенерации команд.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936546
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox,

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

Используешь модифицированный IBX, или CommitRetaining или транзакция тупо висит "до особого распоряжения"?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936547
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
antox,

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

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


CommitRetaining
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936548
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
antox
...

Refresh
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Select 
  ID,
  NAM,
  PRICE,
  COUNT
from TAB 
where
  ID = :ID


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


Неоткуда ему взяться )
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936549
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel
antox


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

Код: sql
1.
2.
3.
select t.*
from tab t
order by t.nam



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

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

Код: sql
1.
2.
3.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
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, оно исключится из автогенерации команд.


Сейчас попробую
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936550
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Vlad F
P.S. RefreshSQL как раз типа для подобных надобностей.


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

См сюда 22097351
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936554
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel
RefreshSQL скорее всего должен быть
Код: sql
1.
2.
3.
4.
5.
6.
7.
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, т.е. при
Код: pascal
1.
where tab_id=t.id

отлично, а при
Код: sql
1.
where tab_id=t.id and uids=:uids

0

Как передать параметр повторно при перед Refresh или мож его с каким префиксом надо, типа он из Select?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936562
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если жестко написать

Код: sql
1.
where tab_id=t.id and uids=3



работает

На BeforePefresh повторная передача параметра результата не дает
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936564
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,

Попробуй and uids=:old_uids
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936624
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
antox,

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


Попробую ( Но пишут, что параметры из селекта в рефреш не передать
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936634
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,

Понял. Тебе надо этот параметр в качестве дополнительного искусственного поля вытащить в селективной части SelectSQL.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936638
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
ъъъъъ

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


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

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

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


P.S. Глянул, ну еще без order by, потому что только одна запись возвращается.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936873
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
antox,

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


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

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



так тоже...

Код: sql
1.
select t.*, (:uids) as uids



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

Код: sql
1.
select t.*, ('value') as virtField



Как же мне вывести значение параметра в виде поля?
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936879
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо придется передавать готовым значением на этапе SelectSQL
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936880
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, похоже, все зря

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	t.*
	, (5) as sumt2
from 
	tab t
where
	t.id = :id



То все равно sumt2 = null, а не 5 после post
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936881
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока буду ч-з OnCalcFields на другое поле

Код: pascal
1.
2.
3.
  if DataSet.FieldByName('sumt2').Value = null
    then DataSet.FieldByName('sumt2virt').Value := [Получаю значение и подставляю]
    else DataSet.FieldByName('sumt2virt').Value := DataSet.FieldByName('sumt2').Value;
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936882
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) по ходу дела возник вопрос по событиям, но это уже тема другого чата...
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936915
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Ну чтоб избежать утечек
Код: pascal
1.
2.
3.
4.
5.
6.
IBQ:=TIBQuery.Create
try
  // тут работаем
finally
  FreeAndNil(IBQ)
end;



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


не память, а указатель на память. чистит на ноль.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936934
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Короче, похоже, все зря

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	t.*
	, (5) as sumt2
from 
	tab t
where
	t.id = :id




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

1. Не :id, а :old_id, уже 2 раза говорили.
2. Если не поможет - значит из-за того, что у тебя "*". Напиши нормальный список полей, как положено.
3. Не верю, чоо в refreshsql нельзя подзапрос. "Ошибка"? Так ее нужно исправить.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936938
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
ъъъъъ
antox,

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

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


CommitRetaining
Лучше на этапе разработки отказаться от CommitRetaining, чем судорожно переделывать потом, когда у клиентов база станет раком.
Редактировать надо, пока открыта readonly транзакция, и только чтобы изменения в базу слить - открывать на мгновение пишущую и сразу закрывать.
Как этого добиться - путей много, гугл в помощь.
Ваш нынешний путь - обречен, это точно, 100%.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936941
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock
Лучше на этапе разработки отказаться от CommitRetaining, чем судорожно

Тогда уж от IBX сразу отказаться.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39936976
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Vlad F
antox,

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


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

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



так тоже...

Код: sql
1.
select t.*, (:uids) as uids



"Не работает", хм. Ты бы хоть ошибку написал, с какой не работает.

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

Код: sql
1.
select t.*, ('value') as virtField



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

select
t.*,
(select sum(mycount) from tab2 where tab_id=t.id and uids=:uids) as sumt2,
cast(:uids as type of column tab2.uids) as uids
from
tab t

Плюс к этому надо будет добавить это новое фиктивное поля в коллекцию полей твоего IBDataSet, если они там у тебя статические.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39937268
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
antox
пропущено...


CommitRetaining
Лучше на этапе разработки отказаться от CommitRetaining, чем судорожно переделывать потом, когда у клиентов база станет раком.
Редактировать надо, пока открыта readonly транзакция, и только чтобы изменения в базу слить - открывать на мгновение пишущую и сразу закрывать.
Как этого добиться - путей много, гугл в помощь.
Ваш нынешний путь - обречен, это точно, 100%.


Как отказаться, если мне надо править данные прямо в сетке? Не везде, но где-то надо. Где не надо, там отдельным запросом меняю данные по commit
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39937269
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
antox
Короче, похоже, все зря

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
	t.*
	, (5) as sumt2
from 
	tab t
where
	t.id = :id




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

1. Не :id, а :old_id, уже 2 раза говорили.
2. Если не поможет - значит из-за того, что у тебя "*". Напиши нормальный список полей, как положено.
3. Не верю, чоо в refreshsql нельзя подзапрос. "Ошибка"? Так ее нужно исправить.


Сам не верю, мож запутался. На выходных сделаю все заново и проверю
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39937302
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
YuRock
Лучше на этапе разработки отказаться от CommitRetaining, чем судорожно

Тогда уж от IBX сразу отказаться.
IBX к Retain никаким боком.
Другое дело, и я не спорю, что другие библиотеки позволяют меньшей кровью решить проблему "редактирования гридов" без долгой пишущей транзакции.
Но лично я считаю, что само по себе "редактирование грида" - это ужасно. Хотя и это решается средствами стандартного IBX без использования Retain, но это просто не нужно изначально.
...
Рейтинг: 0 / 0
IBX + FireBird несколько таблиц в запросе
    #39937335
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox
если мне надо править данные прямо в сетке

Fib+ с гитхаба скачай и используй, вместо. Там искаропки модифицирующие запросы датасета в отдельной транзакции.
...
Рейтинг: 0 / 0
56 сообщений из 56, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBX + FireBird несколько таблиц в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]