Страница 1 из 1

INSERT в BROWSE

Добавлено: 02 апр 2004, 14:51
shuma
Извините, если повторяюсь, но ничего похожего на форуме я не нахожу... Как правильно организовать INSERT в BROWSE?

Вот текст:
.......
browse brwTUNES 'Настройки' (,,sci13478Esc)
table sdtunes;
fields
sdtunes.tunename 'Наим. настройки '('Наименование настройки ',hcAllVSomeGroup,sci13478Esc):[50],noprotect;
sdtunes.tuneval 'Знач. настройки '('Значение настройки ',hcAllVSomeGroup,sci13478Esc):[100],noprotect;
end;

handleevent

cmDeleteRecord:{
if(message(''#3'Действительно удалить настройку "'+sdtunes.tunename+'"?',yesno+mfSwapButtons)=yes) delete current sdtunes;
ReReadRecord;}

cmCheckField:{
Case CurField of
#sdtunes.tunename,#sdtunes.tuneval:
{
Update Current sdtunes;
RereadRecord;
}
end;}

cmInsert:
{
Insert sdtunes;
RescanPanel(#sdtunes);//бесполезно
ReReadRecord;//тоже не помогает
}

При срабатывании cmInsert, запись в таблицу добавляется, но BROWSE тоже добавляет запись и ставит на неё курсор. При попытке дальнейшего редактирования этой записи, вылетае ошибка 310 (правильно, ведь в таблице этой записи нет...). Проблема заключается в том, чтобы заставить BROWSE после INSERT ставить курсор на добавленную запись...

Re: INSERT в BROWSE

Добавлено: 02 апр 2004, 16:30
shuma
Оперативно сам себе отвечаю 8): ничего другого придумать не могу, как вообще забросить события cmInsert и cmInsertRecord и чуть-чуть расширить обработчик cmCheckField. Вот чего получилось:

...
cmCheckField:
{
Case CurField of
#sdtunes.tunename,#sdtunes.tuneval:
{
If sdtunes.nrec>0
{
Update Current sdtunes;
RereadRecord;
}
else{
Insert current sdtunes;
ReReadRecord;}}
end;
}

cmInsert:
{
//А здесь ничего нету....
}

...

Всё заработало... Извините за проявленное ламерство ;D

Re: INSERT в BROWSE

Добавлено: 02 апр 2004, 16:54
edward_K
cmSetDefault : {

insert current ... ;
}
или же в
cmInsertRecord : {
insert current ...
}
в cmCheckRecord можно добавить например так
MakeValid(#RepMain);
if isvalid(#Repmain) then
update current
или же
if isnew(#repmain) then
PutcommandcmInsertRecord)
но это только если будут какие то троблы. :)

Re: INSERT в BROWSE

Добавлено: 02 апр 2004, 20:59
ecasoft
НАдо убрать все rereadrecord из всех операторов. Они мешают только и ничего не делают.

Вставить обработку события update аналогично событию
unsert.

В событии CheckField ставят проверку значений полей..к примеру для того, если Вы перемещаетесь на другое поле и чтобы не осталось недопустимое значение запрещают двигаться на другое поле, пока не поставишь нужное. Никакие там действия с базой типа update не делают!


Еще есть событие CheckRecord - это событие срабатывает когда Вы пытаетесь сойти с записи. Можно запретить сходить с записи, пока не будут заполнены поля.

------- О СОБЫТИЯХ В ПАНЕЛИ -----------

Последовательность событий такова:

Когда нажимают F7, то проходит событие cmInsert...если его не перехватывать и не делать abort, то чистится буфер, подцепленные поля заполняются значениями подцепки и вызывается событие cmSetDefault.
В обработчике события пользователь устанавливает значения полей по-умолчанию.
Далее Вы когда смещаетесь по полям в браузаре то при каждом смещении, если Вы правили значение поля, вырабатывается событие cmCheckField для того, чтобы Вы проверили значение модифицированного поля.
Когда Вы пытаетесь сойти с записи (переходите в другую понель или на другую запись, создаете новую), то если в записи были модифицированны Вами поля, то Вырабатывается событие cmCheckREcord, при обработке которого Вы проверяете корректность записи. Если Вы не делаете abort этого события, то считается, что Вы согласились ее вставить. Когда вырабатывается событие cmInsertRecord, если запись была новой...или событие cmUpdateRecord, где Вы пишите insert current и update ... соответственно. Решает какое нужно вырабатывать событие сам интерпретатор.
Если нажали F8, то вырабатывается собитие cmDelete..а на него, если Вы его пропустили - cmDeleteREcord, где пишите удаление записи в учетом каскадов связок таблиц.

Если Вы в браузоре хотите по какой-то кнопке вызрать интерфейс, то рекомендуется перез вызовом его поставить updatetable. Такая функция вызовит посылку событий cmCheckREcord и всех следующих за этим событий, которые вставят или модифицируют запись.

Все описанные события являются панельными, т.е. обработчики их записаны между panel aaaa и end; Все события работаю на изменения на таблицу описанную в опции table <таблица>.

Надеюсь помог. Хотя это описано в документации все. Удачи. С уважением, Игорь

Re: INSERT в BROWSE

Добавлено: 05 апр 2004, 10:43
shuma
Всё переделал. После переделки тож всё заработало, но по-правильному. ;D Спасибо всем принявшим участие!