Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Встать на нужную запись / 21 сообщений из 21, страница 1 из 1
13.02.2008, 15:46
    #35130458
Foxii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Добрый день!
Работаю с Remote View. Необходимо при добалении, редактировании данных (из другой формы) становиться в гриде на текущую запись ( добавленную, редактируемую). При удалении на предыдущую. Для редактирования и добавления после TABLEUPDATE я запоминаю номер записи, потом после REQUERY опять перехожу на нее. Как быть в случае удаления ? Если удалаю последнюю запись, то система выдает ошибку, что я переше за границы диапазона допустимых номеров записей.
...
Рейтинг: 0 / 0
13.02.2008, 16:02
    #35130528
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Как переходишь? По номеру записи?
RECCOUNT() - кол-во записей.
Код: plaintext
1.
2.
3.
4.
5.
lnNeedNom = RECNO()
REQUERY('MyView')
lnNeedNom = min(lnNeedNom, reccount('MyView'))
if lnNeedNom >  0 
go (lnNeedNom) in MyView
endif

Только если кто-то другой добавит запись в середину - то у тебя все съедет. Поэтому лучше это делать по ключу с indexseek(), правда индекс создать прийдется.
...
Рейтинг: 0 / 0
13.02.2008, 16:35
    #35130632
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
>Как быть в случае удаления ? Если удалаю последнюю запись, то система
>выдает ошибку, что я переше за границы диапазона допустимых номеров
>записей.

Переходишь как goto recno NNN ?
Тогда проверять максимально допустимый номер (reccount() )


Ну судя по тому, что проблема возникает при удалении (опять таки последнюю в
плане с бОльшим номером записи или после удаления в таблице не остается
записей?) последней (в смысле больше нет записей), то ты переходишь по
skip`у.
Тогда вопрос: а на кой тебе, спрашивается, дали функции BOF(), EOF() и иже с
ними?


А если я не угадал, то еще один вопрос: Где маленький примерчик кода, на
котором вылетает ошибка?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.02.2008, 20:24
    #35131180
Foxii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Ну вот, было

Код: plaintext
1.
2.
3.
4.
5.
6.
local lnrec
    lnRec = RECNO()
	= REQUERY(this.alias)
    IF 	!eof(this.alias ) AND !bof(this.alias)
	     GOTO lnRec
    endif
	

Специально для удаления сделал так :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL lnRec
IF MESSAGEBOX("Вы действительно хотите удалить строку ?", 4 + 32 ,"Внимание") = 7 
	RETURN 
ENDIF

lnRec = RECNO()- 1 
DELETE IN (this.alias)
this.update() 
= REQUERY(this.alias)
IF !EOF(this.alias) AND !BOF(this.alias) AND lnRec > 0 
GO lnRec 
ENDIF
Вроде бы все работает, но хотелось бы, не разносить в разные методы. сделать одним.

Galyamov Rinat, все конечно правильно про BOF и EOF, казалось бы ) Только поле REQUERY указатель становиться на 1-ю запись, если она есть, и ему насрать на то что в буфере ты стер последнюю )
...
Рейтинг: 0 / 0
13.02.2008, 20:46
    #35131214
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
"Foxii" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:5286698@sql.ru...
> Автор: Foxii
> Ну вот, было
>
>
> local lnrec
> lnRec = RECNO()
> = REQUERY(this.alias)
> IF !eof(this.alias ) AND !bof(this.alias)
> GOTO lnRec
> endif
>
> Специально для удаления сделал так :
>
>
> LOCAL lnRec
> IF MESSAGEBOX("Вы действительно хотите удалить строку ?",4+32,"Внимание")
> =7
> RETURN
> ENDIF
>
> lnRec = RECNO()-1
> DELETE IN (this.alias)
> this.update()
> = REQUERY(this.alias)
> IF !EOF(this.alias) AND !BOF(this.alias) AND lnRec >0
> GO lnRec
> ENDIFВроде бы все работает, но хотелось бы, не разносить в разные методы.
> сделать одним.
>
> Galyamov Rinat, все конечно правильно про BOF и EOF, казалось бы )
> Только поле REQUERY указатель становиться на 1-ю запись, если она есть, и
> ему насрать на то что в буфере ты стер последнюю )


Ну я говорил : Судя по ... ты переходишь по skip`у.
Тогда вопрос: а на кой тебе, спрашивается, дали функции BOF(), EOF() и иже с
ними?


А в твоем варианте надо проверять:
do case
case lnRec <=0
go top in (this.alias)

case lnRec >=Reccount(this.alias)
go top in (this.alias)

otherwise
GO lnRec in (this.alias)
endcase





Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.02.2008, 20:49
    #35131216
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Сорри, поправочка.

do case
case lnRec <=0
go top in (this.alias)

case lnRec >=Reccount(this.alias)
go BOTTOM in (this.alias) && Здесь поправил - так логичнее

otherwise
GO lnRec in (this.alias)
endcase


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.02.2008, 23:24
    #35131387
Foxii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Galyamov Rinat, ну блин, как ты не поймешь, что то, что было до сброса буфера это совсем не то, что стало после. И текущая запись , та которая после обновления вьюхи, это никакого отношения к тому состояния таблицы в котором она находилась до сброса и обновления вьюхи не имеет и наоборот. И ктати, вьюха может быть упорядочена допустим по иникальному значению первичного ключа или еще как-нибудь, так что тут не угадаешь, кто тут первый и был.
...
Рейтинг: 0 / 0
14.02.2008, 05:16
    #35131538
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
> Galyamov Rinat, ну блин, как ты не поймешь, что то, что было до
> сброса буфера это совсем не то, что стало после.
Про то что это не одно и то же, тебе уже говорили. Лишний раз повторять
тебе одно и то же смысла не вижу.

> И текущая запись , та которая после обновления вьюхи, это никакого
> отношения к тому состояния таблицы в котором она находилась >до сброса и
> обновления вьюхи не имеет и наоборот.
Полностью согласен.

Но ты упорно твердишь
>go to lnRec
и
>Если удалаю последнюю запись, то система выдает ошибку, что я переше за
>ГРАНИЦЫ диапазона допустимых номеров записей.


> И ктати, вьюха может быть упорядочена допустим по иникальному значению
> первичного ключа или еще как-нибудь, так что тут не >угадаешь, кто тут
> первый и был.

no comments


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.02.2008, 08:46
    #35131645
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Foxii
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL lnRec
IF MESSAGEBOX("Вы действительно хотите удалить строку ?", 4 + 32 ,"Внимание") = 7 
	RETURN 
ENDIF

lnRec = RECNO()- 1 
DELETE IN (this.alias)
this.update() 
= REQUERY(this.alias)
IF !EOF(this.alias) AND !BOF(this.alias) AND lnRec > 0 
GO lnRec 
ENDIF

Надо проверять RECCOUNT() после REQUERY()
проверка !EOF(this.alias) AND !BOF(this.alias) в твоем коде равнозначна RECCOUNT(this.alias) = 0, т.к. если есть записи, то после REQUERY() встанешь на первую и EOF() и BOF() будут .F.

Cмоделируем ситуацию работы двух пользователей. В хронологической последовательности:
1-й открыл VIEW (например 48 записей)
2-й открыл VIEW (48 записей)
1-й удалил любую кроме последней (осталось 47)
2-й удалил последнюю (для него 48-ю), пытается перейти на 47-ю а их 46 уже :)

FoxiiВроде бы все работает, но хотелось бы, не разносить в разные методы. сделать одним.
А под этой фразой что подразумевалось? То что при добавлении, удалении и изменении этот код повторить пришлось?

PS Опираться номер записи во VIEW далеко не самое лучшее решение. При интенсивной многопользовательской работе указатель будет ездить совсем не так как ты задумывал. Подумай об использовании Id записи и создания индекса по Id для VIEW (после REQUERY() индекс перестраивается)
...
Рейтинг: 0 / 0
14.02.2008, 09:23
    #35131707
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Если система многопользовательская, то после REQUERY может оказаться, что другой пользователь тоже удалил некоторые записи, которые попадали в выборку. В этом случае RECNO() - 1 может стать больше RECCOUNT().
Если система однопользовательская, то может оказаться, что изменилось условие where для выборки. В этом случае RECNO() - 1 тоже может стать больше RECCOUNT().
Если мы во View удалили запись, которую сами ранее добавляли, но еще не сохранили, ее RECNO() была отрицательной, а RECNO() - 1 будет "еще более отрицательной".
Если мы удалили первую запись, то RECNO() - 1 будет 0.
Я бы, может быть, попробовал вместо RECNO() использовать поиск по выражению сортировки при SET NEAR ON, например, если ничего более подходящего для конкретной ситуации нет.
________
Не дадим распространиться заразе политкорректности!
...
Рейтинг: 0 / 0
15.02.2008, 23:25
    #35136578
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
FoxiiДобрый день!
Работаю с Remote View. Необходимо при добалении, редактировании данных (из другой формы) становиться в гриде на текущую запись ( добавленную, редактируемую). При удалении на предыдущую. Для редактирования и добавления после TABLEUPDATE я запоминаю номер записи, потом после REQUERY опять перехожу на нее. Как быть в случае удаления ? Если удалаю последнюю запись, то система выдает ошибку, что я переше за границы диапазона допустимых номеров записей.
Можно уточнить, а зачем вообще давать команду Requery()?

При добавлении или изменении записи данные и так уже у клиента. А вот при удалении достаточно сделать настройку

Код: plaintext
SET DELETED ON

И код удаления будет выглядеть примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IF MESSAGEBOX("Вы действительно хотите удалить строку ?", 4 + 32 ,"Внимание") = 7 
	RETURN 
ENDIF

select (this.alias)
DELETE
this.update() 

SKIP
IF EOF()
	SKIP - 1 
ENDIF

Если же Requery() необходима, то Вы и сами понимаете, что пытаться как-то позиционироваться по физическому номеру записи просто бессмысленно. Затея, заранее обреченная на провал. После Requery() все номера записей "поплывут".
...
Рейтинг: 0 / 0
16.02.2008, 23:45
    #35137249
Foxii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
В ту же тему. Для создания параметров отбора я делал параметризованную вьюху, но не как обычно, а через макроподстановку в условие, допустим так :

Код: plaintext
1.
Create Sql View VDSPOSZAK As Select DSPOSZAK.*;
			From DSPOSZAK  Where &w_VDSPOSZAK
Очено удобно. Сами понимаете что можно напихать в условие отбора и как
Но! что-то с удаленным представлением так не получается. Что делать ? Варианты есть ?
...
Рейтинг: 0 / 0
17.02.2008, 01:23
    #35137281
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Вам очень скоро ответся, что вместо макроподставновки лучше использовать ? .
Но у меня давно возникал вопрос с remote view и я решил задать его в этой теме.
При работе с DBF очень хорошо, что Фокс перезапрашивает данные
через определенный промежуток времени и сечет обновления (хотя экран при этом чуть передергивет увы).

Но что делать с remote view? Я так понимаю, что resfresh() может лучше, чем requery() обновить
данные. Но при refresh() будут перезапрашиваться только даттые включенные в первоначальный запрос и не включатся добавленные другими пользователями стороки?

Кто-нибудь нашел хорошее решение? Кстати 1С 7.7 и в DBF и в SQL - версиях хорошо
разруливает эту проблему. И экран не мигает, и курсор не скачет и все сечется.
...
Рейтинг: 0 / 0
17.02.2008, 15:37
    #35137576
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
FoxiiВ ту же тему. Для создания параметров отбора я делал параметризованную вьюху, но не как обычно, а через макроподстановку в условие, допустим так :

Код: plaintext
1.
Create Sql View VDSPOSZAK As Select DSPOSZAK.*;
			From DSPOSZAK  Where &w_VDSPOSZAK
Очено удобно. Сами понимаете что можно напихать в условие отбора и как
Но! что-то с удаленным представлением так не получается. Что делать ? Варианты есть ?
1. Папаметризованная вьюха т.е. переменные с "?"
2. SQLEXEC() - генери запрос как угодно.

apapacy... Кто-нибудь нашел хорошее решение? Кстати 1С 7.7 и в DBF и в SQL - версиях хорошо
разруливает эту проблему. И экран не мигает, и курсор не скачет и все сечется.
Свойство формы LockScreen должно помочь
...
Рейтинг: 0 / 0
17.02.2008, 16:56
    #35137655
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Dima T
Свойство формы LockScreen должно помочь

Вопрос мой скорее относился к способу обновить данные в remote view,
чем к миганию экрана.
...
Рейтинг: 0 / 0
17.02.2008, 17:01
    #35137660
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
apapacy Dima T
Свойство формы LockScreen должно помочь

Вопрос мой скорее относился к способу обновить данные в remote view,
чем к миганию экрана.
Тогда вопрос не совсем понятен.
Requery() - обновление данных в представлении с SQL-сервера
Refresh() - обновление содержимого контролов отображающих данные.

Что именно не устраивает?
...
Рейтинг: 0 / 0
17.02.2008, 17:31
    #35137674
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Dima T
Тогда вопрос не совсем понятен.
Requery() - обновление данных в представлении с SQL-сервера
Refresh() - обновление содержимого контролов отображающих данные.

Что именно не устраивает?

Это не совсем так. Refresh-метод контролов обновляет контролы.
Но есть и Refresh-функция.

Refreshes data in an updatable SQL view.

REFRESH([nRecords [, nRecordOffset]] [, cTableAlias | nWorkArea])
Return Values
Numeric

Parameters
nRecords
Specifies the number of records to refresh. If nRecords is 1 or you omit nRecords, only the current record is refreshed. If nRecords is 0, no records are refreshed.


Не устраивает то, что requery() перезапрашивает курсор и становится на 1+ю запись
- что и составляет суть вопроса автора топика.

Requery - действует более мягко, но перезапрашивает только строки,
которые попали в самый первоначальный запрос (без учета строк добавленных другими юзерами)
...
Рейтинг: 0 / 0
17.02.2008, 20:08
    #35137813
Foxii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Dima T, на сколько я понял Вы программили под парус. Вот у них сделано так, чтобы динамически формировать параметры отбора. Маятся с ? когда в форме отбора 20-30 значений, будет гораздо проблематичнее. Я стремлюсь к тому, чтобы сделать локальное представление на уделаенное, с обновлением данных проблем нет, но! при создании вьюхи так как я описал представление работает только если

w_VDSPOSZAK = ".T." или w_VDSPOSZAK = ".F, а допустим при w_VDSPOSZAK =[PARENT_RN ='0001']
не работает. А казалось бы должно.
...
Рейтинг: 0 / 0
17.02.2008, 20:18
    #35137818
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
apapacyНо есть и Refresh-функция.
Если честно - не знал, но думаю не много потерял. Очень специфичная функция.

apapacyНе устраивает то, что requery() перезапрашивает курсор и становится на 1+ю запись
- что и составляет суть вопроса автора топика.

Для себя раз решил проблему оберткой над requery() с позиционированием по Id
Form.RequeryRV()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
lpara tnId
local llLock
llLock=thisform.LockScreen
thisform.LockScreen=.t.
if empty(tnId)
	tnId=eval(thisform.cMainTable+'.'+thisform.cIdField)
endif
requery(thisform.cMainTable)
if empty(tnId) or !thisform.SetPosToId(tnId)
	go top in (thisform.cMainTable)
endif
thisform.LockScreen=llLock
Form.SetPosToId()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
para tnId
local llRet,i,lcIdField, llLock
llLock=thisform.LockScreen
thisform.LockScreen=.t.
i= 1 
sele (this.cMainTable)
do while !empty(tag(i)) and tag(i)!=upper(thisform.cIdField)
	i=i+ 1 
enddo
if tag(i)==upper(thisform.cIdField)
	llRet=seek(tnId,this.cMainTable,i)
else
	locate for eval(thisform.cIdField)=tnId
	llRet=found()
endif
if !llRet
	this.GoTop()
endif
thisform.LockScreen=llLock
return llRet
...
Рейтинг: 0 / 0
13.03.2008, 10:02
    #35187020
Foxii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
Dima T, а можно подробнее об этом

авторТолько если кто-то другой добавит запись в середину - то у тебя все съедет. Поэтому лучше это делать по ключу с indexseek(), правда индекс создать прийдется.
...
Рейтинг: 0 / 0
13.03.2008, 12:01
    #35187478
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встать на нужную запись
FoxiiDima T, на сколько я понял Вы программили под парус. ...
Никогда с парусом не работал (только сейчас заметил этот пост)

FoxiiDima T, а можно подробнее об этом

авторТолько если кто-то другой добавит запись в середину - то у тебя все съедет.
Проблема из той же серии что и эта:
Dima T
Cмоделируем ситуацию работы двух пользователей. В хронологической последовательности:
1-й открыл VIEW (например 48 записей)
2-й открыл VIEW (48 записей)
1-й удалил любую кроме последней (осталось 47)
2-й удалил последнюю (для него 48-ю), пытается перейти на 47-ю а их 46 уже :)
немножко переиначим на добавление и получится:
1-й открыл VIEW (например 48 записей)
2-й открыл VIEW (48 записей)
1-й добавил любую кроме последней (стало 49)
2-й обновил стоя на последней (для него 48-й), а запись на которой он стоял оказалась 49-й

Или про это поподробней?:
авторПоэтому лучше это делать по ключу с indexseek(), правда индекс создать прийдется.
так тут после открытия VIEW делаешь индекс по Id INDEX ON ... и дальше им пользуешься, при REQUERY() индекс тоже обновится.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Встать на нужную запись / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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