Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.049 c
15-1208933357
sql
2008-04-23 10:49
2008.06.08
MS SQL 2000


2-1210934464
Kolan
2008-05-16 14:41
2008.06.08
Как синхронизировать два TListView


3-1199661770
porter
2008-01-07 02:22
2008.06.08
получить несколько столбцов для одного поля


8-1181824621
Manur
2007-06-14 16:37
2008.06.08
Обои


2-1210746303
kupidon
2008-05-14 10:25
2008.06.08
Округление чисел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский