![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите? [D5, dBase, FoxPro]
bib © (2002-09-02 18:49:00)Вот код:
datamodule1.Tables.StartTransaction;
try
with datamodule1.Тable1 do
begin
if Active then
begin
if mode=1 then Append;!!!<вот тут и вылетает>
if mode=2 then Edit;
FieldValues["NUMBER"]:=MaskEdit1.Text;
FieldValues["FULL_NAME"]:=Edit1.Text;
FieldValues["SHORT_NAME"]:=Edit3.text;
for i:=0 to Memo1.Lines.Count-1 do s:=s+Memo1.Lines.Strings[i]+" ";
FieldValues["ADRES"]:=S; S:="";
if tip.Text=tip.Items.Strings[1] then Memo3.Clear;
for i:=0 to Memo3.Lines.Count-1 do s:=s+Memo3.Lines.Strings[i]+" ";
FieldValues["PASSPORT"]:=S;
FieldValues["Tip"]:=tip.Text;
end;
end;
datamodule1.Tables.Commit;
mode:=0;
except
mode:=0;
datamodule1.Tables.Rollback;
raise
end;
A при Edit-e все нормально...
А по поводу индексов может это из-за BDE? может Apollo постваить?
посоветуйте
ЮЮ (2002-09-04 01:44:00) [1]>Наверное он пытается обратится к полю, которого еще нет....?
Поле то есть, только его значение ещё не определено, т.е.
фильтр принимает значение "NUMBER=", что неправильно.
Один из вариантов исправления:
if datamodule1.Table1.fieldbyname("NUMBER").asstring="" then
datamodule1.Table2.Filter:="NUMBER=-1" else //т.е. номер, которого заведомо нет в БД
datamodule1.Table2.Filter:="NUMBER="+datamodule1.Table1.fieldbyname("NUMBER").asstring;
MsGuns (2002-09-03 19:00:00) [2]bib (03.09.02 18:38)
>скажите что не так делаю
Скажу конкретно (имхо)
1.Транзакции здесь вообще ни при чем. С "STANDARD" БД (dBase,Fox,Paradox) все эти штучки (commit, fetch, rollback,..)
просто НЕ работают. BDE просто симулирует эти методы. При работе с TTable измененная запись текущей таблицы постируется непосредственно сразу после того как курсор перемещается в другую таблицу, если не предусмотрена спец.буферизация. Почитай книжки Фаронова по работе с БД: просто, ясно, исчерпывающе.
2.Для чего для данных кадровой карточки использовать TMemo - совершенно не понятно. Что, ФИО или адрес или паспортные данные для ОДНОГО человека могут быть такими длинными, что не вместятся в простой CHARACTER ?
3.Для проверки состояния датасета ни к чему исп-ть какие-то переменные типа "mode", достаточно проверить св-во TDataSet.State
4.Использовать TDataSet.FieldValues для обмена данными с конкретным полем датасета не совсем хорошо. (Не буду подробно объяснять почему, почитай в хелпах сам) Чаще всего используется методы класса TFields (AsXX) или в крайнем случае (Value или Text)
5.Для начала достаточно
Mike Kouzmine (2002-09-03 18:46:00) [3]Я бы сделал так
1 Создал бы индекс по тем полям, по которым необходима сортировка.
Например три поля по которым идет "фильтрация" a,b,c и поля для сортировки z,x,y Итого a,b,c,z,x,y
SetRange([1,1,1],[1,1,10]) - быстрая "фильтрация"
Т.е. на мастер OnDataChenge (in DataSource master table) вешаешь этот сетрандже, ну можешь проверить State of master table.
bib (2002-09-03 18:38:00) [4]да ладно...
я же говорю я начинющий, скажите что не так делаю
bib (2002-09-03 18:26:00) [5]"Фильтр в AfterScroll? А почему все-таки там, а не в OnDataChange, например? А не проще нужный индекс создать? Или не вы базу разрабатываете?"
А как правильнее делать, посоветуйте, я начинающий
Mike Kouzmine (2002-09-03 18:26:00) [6]Недотепа-то? Не только ты, но и я :(
MsGuns (2002-09-03 18:23:00) [7]>bib (03.09.02 18:06)
работает...
Т.е. если я в начале такого алгоритма:
-Выбрать из таблицы 1 кол.А,Б,В
-Сохранить их во врем.таблице Т
-По колонке А таблицы Т изменить значения кол.Г в таблице 2
-По колонке Б таблицы Т изменить значения кол.Д в таблице 3
-По колонке А таблицы Т изменить значения кол.Е в таблице 4
.... (модифицируется штук 5 таблиц)
.... (создается штуки 3 табл.временные)
....
поставлю StartTransaction, а в конце RollBack, то вся эта лабуда типа исчезнет. В смысле восстановится физически вся БД в ее исходном (неизмененном) виде ?
И все это на таблицах dBase (Paradox, FoxPro) ?
Неужели я такой недотепа, что этим не пользовался ? Или это не я..
Mike Kouzmine (2002-09-03 18:16:00) [8]Фильтр в AfterScroll? А почему все-таки там, а не в OnDataChange, например? А не проще нужный индекс создать? Или не вы базу разрабатываете?
bib (2002-09-03 18:06:00) [9]Val:
"конечно, он так и пишет - "ожидается выражение, но ничего не найдено".
если не секрет - в чем суть вашего фильтра, почему ставите именно в AfterScroll?"
Есть две таблицы и на форме два грида, при перемещении в первой во второй фильтровалися
записи по полю Number, т.е связь "один ко многим" табл1 и табл2 по полю Number. Я пользуюсь фильтром, потому что надо будет упорядочивать по др. полям.
MsGuns:
"А что, на dbf-ках (BDE) работает все это богатство типа
StartTransaction
..
If .. then
commit
else
rollback
???"
работает...
Val (2002-09-03 17:41:00) [10]симуляция :)
MsGuns (2002-09-03 17:30:00) [11]А что, на dbf-ках (BDE) работает все это богатство типа
StartTransaction
..
If .. then
commit
else
rollback
???
Val (2002-09-03 17:17:00) [12]конечно, он так и пишет - "ожидается выражение, но ничего не найдено".
если не секрет - в чем суть вашего фильтра, почему ставите именно в AfterScroll?
bib (2002-09-03 17:07:00) [13]Здравствуйте Мастера.
Я по поводу вчерашнего вопроса...
"Вот код:
datamodule1.Tables.StartTransaction;
try
with datamodule1.Тable1 do
begin
if Active then
begin
if mode=1 then Append;!!!
if mode=2 then Edit;
FieldValues["NUMBER"]:=MaskEdit1.Text;
FieldValues["FULL_NAME"]:=Edit1.Text;
FieldValues["SHORT_NAME"]:=Edit3.text;
for i:=0 to Memo1.Lines.Count-1 do s:=s+Memo1.Lines.Strings[i]+" ";
! ; FieldValues["ADRES"]:=S; S:="";
if tip.Text=tip.Items.Strings[1] then Memo3.Clear;
for i:=0 to Memo3.Lines.Count-1 do s:=s+Memo3.Lines.Strings[i]+" ";
FieldValues["PASSPORT"]:=S;
FieldValues["Tip"]:=tip.Text;
end;
end;
datamodule1.Tables.Commit;
mode:=0;
except
mode:=0;
datamodule1.Tables.Rollback;
raise
end;
A при Edit-e все нормально...
А по поводу индексов может это из-за BDE? может Apollo постваить?
посоветуйте "
ЮЮ : "if mode=1 then Append;!!!
bib (2002-09-03 16:58:00) [14]ЮЮ : "if mode=1 then Append;!!!
ЮЮ (2002-09-03 02:03:00) [15]if mode=1 then Append;!!!<вот тут и вылетает>
Вот тут-то вылетать и не должно. С каким сообщение? Протрассируй "внутрь" с этой строчки. Ошибка возможна в Table1.onNewRecord. .BeforeInsert, AfterInsert , и т.д.