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

Вниз

Ввод данных в две таблицы из одной формы   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2008-04-18 16:41) [40]

> Dennis I. Komarov  (18.04.2008 16:05:39)  [39]

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


 
grav   (2008-04-21 14:31) [41]


> Anatoly Podgoretsky ©   (18.04.08 16:02) [38]


> Закрытие формы в любом месте, по клавише Enter

С помощью энтер они хотят переходить из поля в поле. Это и понятно, 99% вводимой информации цифры, поэтому будет использоваться цифровая клавиатура (калькулятор). Да и все поля обязательны для ввода.


 
Anatoly Podgoretsky ©   (2008-04-21 15:59) [42]

> grav  (21.04.2008 14:31:41)  [41]

У меня не хотят, но такое возможно для определенных интерфейсов. При вводе основной массы данных с цифровой клавиатуры использование клавиши Enter имеет оправдание.


 
grav   (2008-04-23 11:01) [43]

Объясните пожалуйста по транзакциям.
Для ввода данных в таблицы использую IBQuery.
Перед первой вставкой в таблицу ставлю
MainForm.WriteTr.StartTransaction;
В разные таблицы вставляю данные одним IBQuery. Т.е. перед очередной вставкой делаю IBQuery.SQL.Clear; Добавляю новый запрос. И так для каждой таблицы в которую нужно занести запись.
Прерываю выполнение программы (не делаю коммит). В итоге во всех таблицах, кроме той в которую вставка проводилась последней находятся записи. Почему не сработал роллбэк, если по умолчанию в транзикции стоит TARollback?


 
Sergey13 ©   (2008-04-23 11:35) [44]

> [43] grav   (23.04.08 11:01)

Может проще код запостить?

> В разные таблицы вставляю данные одним IBQuery

Экономишь?


 
Anatoly Podgoretsky ©   (2008-04-23 11:46) [45]

> Sergey13  (23.04.2008 11:35:44)  [44]

Может и экономит, но поплатится в рамках транзакции.


 
grav   (2008-04-23 11:47) [46]


> Sergey13 ©   (23.04.08 11:35) [44]
>
> Может проще код запостить?

> Экономишь?

Так чего их (IBQuery) плодить то?
Делаю так:

MainForm.WriteTr.StartTransaction;
IBQuery.SQL.Clear;
IBQuery.SQL.Add("insert into table1");
IBQuery.ExexSQL;

IBQuery.SQL.Clear;
IBQuery.SQL.Add("insert into table2");
IBQuery.ExexSQL;
....
IBQuery.SQL.Clear;
IBQuery.SQL.Add("insert into table6");
IBQuery.ExexSQL;
MainForm.WriteTr.Commit;

Хотелось бы, чтобы эта последовательная вставка была одной транзакцией.


 
grav   (2008-04-23 11:49) [47]


> Anatoly Podgoretsky ©   (23.04.08 11:46) [45]

Нельзя так, да? Надо в каждую таблицу своим IBQuery вставлять?
IBQuery.SQL.Clear автоматически commit делает?


 
ASoft   (2008-04-23 11:53) [48]


> Anatoly Podgoretsky ©   (18.04.08 16:02) [38]

ага, еще в ДОС программах, как правило, требовался переход между полями на форме Enter"ом, в фоксе досовском, по крайней мере, так было...


> grav   (21.04.08 14:31) [41]

А еще, если операторы будут действительно опытные, то они будут редко использовать мышь. Но, на своем опыте, сколько раз я не объяснял (показывал) пользователям преимущества юзания клавы, все равно, тянутся за мышью, а потом ищут ей кнопку Ок, которая и так по дефолту "Enter" :)


 
Sergey13 ©   (2008-04-23 12:01) [49]

> [46] grav   (23.04.08 11:47)

А этот твой IBQuery с этой транзакцией работает?


 
Anatoly Podgoretsky ©   (2008-04-23 12:07) [50]

> Нельзя так, да? Надо в каждую таблицу своим IBQuery вставлять?

Нельзя, не экономь, сделай три компонента. У тебя при первом же Clear происходит разрушение транзакции, а результаты зависят от многих факторов. К тому же это может зависеть и от сервера.
Работать надо чисто, не давать никакого шанса для ошибки.
И чего ты съъкономил? 8 байт.


 
Anatoly Podgoretsky ©   (2008-04-23 12:08) [51]

Про commit забыл, видимо у тебя автоматический commit


 
grav   (2008-04-23 12:09) [52]


> Sergey13 ©   (23.04.08 12:01) [49]
>
> А этот твой IBQuery с этой транзакцией работает?

Да с этой. У нее два Peoperties есть: AutoStopActions и DefaultActions
Второе я поставил в TARollBack, полагая, что действие по умолчанию будет роллбэк. Не получилось. Тогда я и первое поставил в saRollback. Вроде бы данные сохраняться перестали. Но перестали и селекты работать в пределах этой транзакции :(
PS
Справка по IBX почему то не работает


 
Anatoly Podgoretsky ©   (2008-04-23 12:11) [53]

> ASoft  (23.04.2008 11:53:48)  [48]

Я добивался от пользовательши полностью работы на клавиатуре, но через некоторое время вот к этому и приходило, даже Enter не нажимают.
Только надо учесть один факт - это методика оплаты, когда она в символах или в событиях, то и учить не надо, или без денег или сами понимают и осваивают.
Немного тяжелее с 10 пальцевым методом, но есть такие рабочии места, где без владения этим методом больше недели не проработать. Ведь убытки несут обе стороны и оператор и работодатель.


 
grav   (2008-04-23 12:32) [54]


> Anatoly Podgoretsky ©   (23.04.08 12:07) [50]

Ну а несколько записей в одну таблицу вставлять все равно одним IBQuery придется, опять надо IBQuery.SQL.Clear;


 
Anatoly Podgoretsky ©   (2008-04-23 13:19) [55]

Неверный подход, используй параметры.


 
grav   (2008-04-23 14:49) [56]


> Anatoly Podgoretsky ©   (23.04.08 13:19) [55]
> Неверный подход, используй параметры.

Эх. А про параметры я совсем и забыл. Мучаюсь с вставкой занчений из пустых эдитов. Спасибо!


 
grav   (2008-04-25 11:11) [57]

Подскажите пожалуйста, как очистить все TEdit в пределах одного TGroupBox перед вводом новой записи?


 
Сергей М. ©   (2008-04-25 11:16) [58]

with GroupBox do
 for i := 0 to ControlCount - 1 do
   if Controls[i] is TEdit then
     TEdit(Controls[i]).Text := "";


 
Плохиш ©   (2008-04-25 11:33) [59]


> опять надо IBQuery.SQL.Clear;

Совершенно не надо и даже вредно. Стоит посмотреть какие ещё свойства есть у TStrings.


 
grav   (2008-05-13 11:56) [60]

Сорри, за то что пишу в старой теме.
Как в программе определить был Commit или нет?
Хотел так: if not MainForm.WriteTr.Active then ....
Не срабатывает после коммита.
Я думал, если коммит прошел, то транзакция становится не активной.
PS
Нужно для очитски полей ввода. Т.е. если коммит прошел, можно очищать поля на форме.


 
Сергей М. ©   (2008-05-13 12:01) [61]


> если коммит прошел, можно очищать поля на форме


Если коммит прошел, то он прошел.
Иначе бы возникло исключение.
Отсутствие исключения и есть факт успешного выполнения коммита.


 
grav   (2008-05-13 12:03) [62]


> Сергей М. ©   (13.05.08 12:01) [61]

Т.е. поставить глобальную переменную и отслеживать ее. У самой транзакции нет свойства, которое отслеживает рпошел коомит или нет?


 
Сергей М. ©   (2008-05-13 12:06) [63]


> поставить глобальную переменную и отслеживать ее


Это уж как угодно - хоть глобальную хоть не глобальную.


> самой транзакции нет свойства, которое отслеживает рпошел
> коомит или нет?


Ты о каком компоненте речь ведешь ?


 
grav   (2008-05-13 12:21) [64]


> Ты о каком компоненте речь ведешь ?

TIBTransaction

А как узнать менялись ли данные в DBGrid и надо ли делать коммит?


 
Sergey13 ©   (2008-05-13 12:24) [65]

> [64] grav   (13.05.08 12:21)
> менялись ли данные в DBGrid

Нет конечно. Их, данных, там просто нет.


 
grav   (2008-05-13 12:28) [66]


> Sergey13 ©   (13.05.08 12:24) [65]

Криво вопрос сформулировал я. Вот есть форма с гридами. Пользователь чего то поменял, автоматически запустилась транзакция. Пользователь форму закрывает, измененные данные теряются.
Можно поставить на автоматическое подтверждение транзакции, а хочется чтобы выводилось сообщение "Данные изменены. Сохранить?"
Как отследить, что они менялись?


 
Сергей М. ©   (2008-05-13 12:29) [67]


> TIBTransaction


Нет там подобных свойств.


> как узнать менялись ли данные в DBGrid


В DBGrid нет никаких данных, данные имеются в DataSet, к которому через DataSource подключен DBGrid. А уж у DataSet на этот счет есть события AfterPost, AfterDelete


 
Anatoly Podgoretsky ©   (2008-05-13 12:29) [68]

> grav  (13.05.2008 12:21:04)  [64]

Зачем знать, просто делай Commit


 
grav   (2008-05-13 12:32) [69]


> Anatoly Podgoretsky ©   (13.05.08 12:29) [68]

А если случайно нажал пользователь что то? Или не хочет сохранять изменения, передумал?


 
Сергей М. ©   (2008-05-13 12:36) [70]


> Как отследить, что они менялись?


Простейший способ - анализировать св-во TIBDataSet.UpdatesPending, если, конечно же, этот  компонент используется и работает в режиме кэширования изменений.


 
grav   (2008-05-13 12:48) [71]


> Сергей М. ©   (13.05.08 12:36) [70]

Использую IBTable. Поставил CachedUpdates:=True; Действительно, меняю что нибудь в гриде, отлавливает, что произошли изменения.
Делаю коммит. Но данные почему то не сохраняются. Что не так?


 
Сергей М. ©   (2008-05-13 12:56) [72]


> Что не так?


см. ApplyUpdates


 
grav   (2008-05-13 13:07) [73]


> Сергей М. ©   (13.05.08 12:56) [72]

Спасибо, работает.
Но еще вопрос появился :) У меня три дбгрида и пять IBTable. Три из них связаны мастер-детайл. Еще два для LookUp полей.
Последовательно проверять UpdatesPending для каждой таблицы или есть более красивый метод?


 
Сергей М. ©   (2008-05-13 13:11) [74]


> есть более красивый метод?
>


Есть - пройтись в цикле по всем компонентам-наследникам класса TIBCustomDataSet


 
Anatoly Podgoretsky ©   (2008-05-13 13:21) [75]

> grav  (13.05.2008 12:32:09)  [69]

Если не хочет сохранять, то Rollback
Всего то две операции Да и Нет


 
grav   (2008-05-13 14:21) [76]

Блин. А LookUp поля редактировать нельяз что ли?


 
Sergey13 ©   (2008-05-13 14:36) [77]

Ветка потихоньку превращается в блог. 8-)


 
grav   (2008-05-13 14:49) [78]


> Sergey13 ©   (13.05.08 14:36) [77]

Ну у мну своего нет блога, пусть будет :)
Там можно или нельзщя редактировать LookUp поля?


 
Sergey13 ©   (2008-05-13 15:03) [79]

> [78] grav   (13.05.08 14:49)
> пусть будет

Я не хочу быть святее Папы Римского (модератора), но вообще-то это запрещено правилами форума: одна ветка - один вопрос.

А что значит "LookUp поля редактировать нельяз"? В справочнике, на который ссылается поле, можно что угодно редактировать. В самой таблице (в которой это поле) можно менять ссылку на справочник и/или удалять ее. Что хочется то?


 
grav   (2008-05-13 15:16) [80]


> Я не хочу быть святее Папы Римского (модератора), но вообще-
> то это запрещено правилами форума: одна ветка - один вопрос.
>

Плодить много мелких веток тоже не есть хорошо.
Хочется менять значение этого поля, т.е. значение в другой таблице. Но если нельзя (а у меня не получилось), то нельзя. Добавлю еще один грид.



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

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

Наверх




Память: 0.63 MB
Время: 0.026 c
2-1210840588
Эд
2008-05-15 12:36
2008.06.08
Посадить данные в TDBCombobox из таблицы


2-1210977985
Tomn
2008-05-17 02:46
2008.06.08
ImageList & StringGrid


2-1211121472
navigator
2008-05-18 18:37
2008.06.08
липучка для формы


15-1208948348
Maks0
2008-04-23 14:59
2008.06.08
Стойкость пароля в битах


2-1211043834
snake-as
2008-05-17 21:03
2008.06.08
Создать строку в таблице