powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Replace, Delete in Transaction
32 сообщений из 32, показаны все 2 страниц
Replace, Delete in Transaction
    #33816331
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi alles
Значит хочу записать мусор в одно из полей перед удалением
Появилась проблема если я делаю Replace потом Delete и затем TableUpdate в transaction то replace не updat'ится только удаляется запись тогда я сделал 2 транзакции. Вопрос можно так делать или как заставить до первого tableupdate сделать и Replace и Delete. Спасибо!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
      ……..
      REPLACE &lcAlias .&tcField1 WITH “TT”
      BEGIN TRANSACTION       
      IF TABLEUPDATE(.F., .T., lcAlias) = .T.
        BEGIN TRANSACTION
        DELETE IN &lcAlias
        IF TABLEUPDATE(.F., .T., lcAlias) = .T.
          END TRANSACTION
          END TRANSACTION
         ………
        ELSE
          RollBack
          RollBack
          TABLEREVERT(.T.)
          ………..
        ENDIF
      ELSE
        ThisForm.RollBack()
        ……..
      ENDIF
        ……..

...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33816452
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то ты не договариваешь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create cursor test (id i)

INSERT INTO test (id) VALUES ( 1 )

SET DELETED  OFF 
SET MULTILOCKS ON 

CURSORSETPROP("Buffering" , 5 )

BEGIN TRANSACTION 

replace id WITH  2 

IF TABLEUPDATE(.f.,.t.)
	BEGIN TRANSACTION 
	DELETE 
	IF TABLEUPDATE(.f.,.t.)
		ROLLBACK 
		ROLLBACK  
	ELSE
		END TRANSACTION 
		END TRANSACTION 
	ENDIF 
ELSE
	ROLLBACK tran 
ENDIF 

BROWSE 
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33816584
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi PaulWist ты повторил мой первый вариант :) но он мне не нравится мне и мой последний вариант не нравится так как при падении delete внутри транзакции иногда вылетает ошибка "нельзя делать внутри транзакции..."

Я бы хотел replace и delete сделать и выполнить всего один TableUpdate

Что никак?
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33816596
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SET DELETED ON
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33816645
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда напиши внятно, что хочешь получить, если вложенные транзакции не нравятся.

Если просто записать мусор и удалить, то

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
begin tran
replace ....
delete ....

if tableupdate()
end ...
else
rollback 
end
А то, что у тебя ругается - это скорее на tablerevert, что действительно нельзя делать внутри транзакции.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33816984
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело вовсе на в трпнзакциях у меня какой-то косяк во View

пишу в command

replace num1 with "TT"
Delete

все нормально

TAbleupdate(.T.)

REQUERY()

и у меня поле num1 возвращает значение до replace в чем дело?
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33817016
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает только в случае как я и говорил сначала

REplace

TAbleupdate(.T.)

delete

TAbleupdate(.T.)

REquery()

тогда все нормально
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33817110
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sea.s2Дело вовсе на в трпнзакциях у меня какой-то косяк во View

пишу в command

replace num1 with "TT"
Delete

все нормально

TAbleupdate(.T.)

REQUERY()

и у меня поле num1 возвращает значение до replace в чем дело?

Посмотреть, что возвращает Tableupdate() и если .F., то вызвать ф-ию AERROR() и посмотреть на расшифровку ошибки, что-то типа

Код: plaintext
1.
2.
3.
4.
5.
if not tableupdate()
aerror(arr)
for i =  1  to alen(arr)
?arr(i)
endfor
endif 
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33817122
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TAbleUpdate везде возвращает .T.

Просто заменяет replace на oldval


replace
delete
tableupdate(.T.)
BROWSE
показывает все нормально

REQUERY()

Замещает на старое
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33817125
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати вот этот lcAlias - это алиас чего, таблицы или view, и какая буферизация стоит на таблице?

Если схема такая, то надо

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
cursorsetprop('buffering', 5 ,'MyTable')
cursorsetprop('buffering', 5 ,'MyView)

replace..
delete...

tableupdate('MyView')
tableupdate('MyTable')
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33817159
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходная таблица buffering 1
Разве надо буфферизовать исходные таблицы?, никогда итого неделаю

НА View 5
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33817165
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тем более TableUpdate(.T.)
я делал два раза на View исходной вообще не трогал
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33817253
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, смотри-ка, какая особенность обновления view, действительно новое значение игнорируется, а выставляется только пометка на удаление. Даже затрудняюсь сказать глюк это или так и должно быть, совершенно разное поведение для таблицы и view.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33819005
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и не смог ито побороть одним TableUpdatom
+ еще одна странность:
Имеется 2 формы с Private DataSession в первой создал структурный индекс
INDEX on expr TAG TT

Захожу в другую где делаю USE того же view in 0

Создаю другой структурный индекс INDEX on expr TAG TT1
выхожу из нее делаю USE in ..

Опять в первой форме создаю индекс INDEX on expr TAG TT
Но теперь создается неструктурный индекс хотя таже DS
и теперь при удалении возникает ошибка закройте неструктурный индекс
Хотя нигде TAG OF не использовал в чем дело?
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33819093
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже вот так
До REQUERY()
можно насоздавать хоть сколько структурных индексов после пойдут неструктурные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CURSORSETPROP("Buffering", 3 )
INDEX ON num1 TAG num1
CURSORSETPROP("Buffering", 5 )
REQUERY()
CURSORSETPROP("Buffering", 3 )
INDEX ON num1 TAG num2
CURSORSETPROP("Buffering", 5 )
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33820576
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Sea!

Поищи тут объяснения способов работы обновляемых представлений - тогда тебе
станет понятно, почему не происходит никакой "замены" при удалении записей.
Попросту нет такой SQL команды "заменить и удалить" - а из двух этих
альтернатив фокс при сбросе буфера представления естественно выбирает более
правильную - удаление.
Также поищи обсуждение индексов по представлениям - это тоже было - да,
после REQUERY() изменяется имя "подлежащего" dbf-а (точнее tmp) - и все
вновь создаваемые индексы идут в "новый" cdx (одноименный новому tmp) - тем
не менее "старый" cdx всё ещё существует и именно он остаётся структурным
cdx-ом.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33820720
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov

Igor KorolyovПопросту нет такой SQL команды "заменить и удалить" - а из двух этих
альтернатив фокс при сбросе буфера представления естественно выбирает более
правильную - удаление.

Игорь, ты не прав, если бы такое поведение было как для буфф. таблицы так и для View, то такое предположение можно было бы принять, НО поведение для таблицы отличается от View.

Для буфф. таблицы сбрасываются как изменения поля, так и пометка на удаление, а для View сбрасывается только пометка на удаление.

Налицо, либо баг, либо недокументированная фича.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33821250
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Это не глюк. Все как положено.

View - это НЕ исходная таблица. Это еще одна ДРУГАЯ таблица.

Чтобы изменения, сделанные во View попали в исходную таблицу, необходимо сделать ЗАПИСЬ в исходной таблице. По косвенным признакам, это делается через команды INSERT-SQL, UPDATE-SQL и DELETE-SQL.

Т.е. по команде TableUpdate() выполняется одна из этих 3 команд применительно к текущей записи View.

Но именно, что "одна из", а не несколько. А по постановке задачи Sea.s2 хочет, чтобы было дано несколько команд. Local View на это не рассчитан. В данном случае, придется делать 2 сброса буфера:

Код: plaintext
1.
2.
3.
REPLACE ...
TableUpdate()
DELETE
TableUpdate()

На первый TableUpdate() пройдет обновление по команде UPDATE-SQL, а на второй TableUpdate() пройдет удаление записи по команде DELETE-SQL. Что, собственно, он и сделал.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33821486
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

ВладимирМView - это НЕ исходная таблица. Это еще одна ДРУГАЯ таблица.

Ну дык.

ВладимирМЧтобы изменения, сделанные во View попали в исходную таблицу, необходимо сделать ЗАПИСЬ в исходной таблице. По косвенным признакам, это делается через команды INSERT-SQL, UPDATE-SQL и DELETE-SQL.

Владимир, это всё правильно, только при сбросе буфера таблицы почему-то выполняются (по твоей классификации) ДВЕ команды (UPDATE and DELETE), а при сбросе из VIEW только ОДНА (DELETE), те явное нарушение описанной логики.

ВладимирМТ.е. по команде TableUpdate() выполняется одна из этих 3 команд применительно к текущей записи View.

Ткни носом в хелп где об этом написано. Пока вижу

авторCommits changes made to a buffered row, a buffered table, cursor, or cursor adapter.

ВладимирМНо именно, что "одна из", а не несколько.

Здесь можно только строить предположения о приоритетах, какая команда выполняется сначала, ведь сброс буфера скорее всего основан на GETFLDSTATE()
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33821541
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist ВладимирМЧтобы изменения, сделанные во View попали в исходную таблицу, необходимо сделать ЗАПИСЬ в исходной таблице. По косвенным признакам, это делается через команды INSERT-SQL, UPDATE-SQL и DELETE-SQL.

Владимир, это всё правильно, только при сбросе буфера таблицы почему-то выполняются (по твоей классификации) ДВЕ команды (UPDATE and DELETE), а при сбросе из VIEW только ОДНА (DELETE), те явное нарушение описанной логики.
Почему ты решил, что буфер - это тоже таблица? Или о каком буфере идет речь?

Чтение данных идет по цепочке

Исходная таблица - Local View

Запись данных идет по цепочке

Буфер Local View - Local View - буфер исходной таблицы - исходная таблица

Перенос информации из буфера в исходную таблицу осуществляется каким-то другими механизмами.

То, что описал я - это перенос данных между таблицами. А что такое буфер - не в курсе. Какой механизм сброса буфера - понятия не имею.

PaulWist
ВладимирМТ.е. по команде TableUpdate() выполняется одна из этих 3 команд применительно к текущей записи View.

Ткни носом в хелп где об этом написано. Пока вижу

авторCommits changes made to a buffered row, a buffered table, cursor, or cursor adapter.
Ты путаешь понятия. Я описал перенос данных не из буфера, а между двумя таблицами, поскольку Local View - это однозначно таблица. Вот я и описал перенос данных из одной таблицы в другую. Из Local View в исходную таблицу.

Косвенных ссылок на то, что этот сброс осуществояется SQL-командами в HELP - полно. Но я не знаю ни одной SQL команды, которая одновременно выполняла бы 2 действия - модификацию и удаление.

PaulWist
ВладимирМНо именно, что "одна из", а не несколько.

Здесь можно только строить предположения о приоритетах, какая команда выполняется сначала, ведь сброс буфера скорее всего основан на GETFLDSTATE()
Опять. Речь не о буфере, а о взаимодействии таблиц.

Тут команда TableUpdate() вводит в заблуждение, поскольку применительно к Local View она выполняет 2 действия: сбрасывает собственно буфер Local View в сам Local View (тут все в порядке), а затем переносит изменения сделанные в Local View в исходную таблицу. И вот на этом этапе и срабатывают все те механизмы команд SQL о которых я написал выше.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33821695
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

Что бы нам не спорить о понятиях, выполни тест и прокоментируй.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
CLOSE DATA ALL

CREATE DATABASE 'LOCALVIEWDB.DBC'

CREATE TABLE 'TABLEFORVIEW.DBF' NAME 'TABLEFORVIEW' (ID I NOT NULL, ;
                           NAME C( 10 ) NOT NULL)

CREATE SQL VIEW "LOCALVIEW" ; 
   AS SELECT Tableforview.id, Tableforview.name FROM localview!tableforview

DBSetProp('LOCALVIEW', 'View', 'UpdateType',  1 )
DBSetProp('LOCALVIEW', 'View', 'WhereType',  3 )
DBSetProp('LOCALVIEW', 'View', 'FetchMemo', .T.)
DBSetProp('LOCALVIEW', 'View', 'SendUpdates', .T.)
DBSetProp('LOCALVIEW', 'View', 'UseMemoSize',  255 )
DBSetProp('LOCALVIEW', 'View', 'FetchSize',  100 )
DBSetProp('LOCALVIEW', 'View', 'MaxRecords', - 1 )
DBSetProp('LOCALVIEW', 'View', 'Tables', 'localview!tableforview')
DBSetProp('LOCALVIEW', 'View', 'Prepared', .F.)
DBSetProp('LOCALVIEW', 'View', 'CompareMemo', .T.)
DBSetProp('LOCALVIEW', 'View', 'FetchAsNeeded', .F.)
DBSetProp('LOCALVIEW', 'View', 'FetchSize',  100 )
DBSetProp('LOCALVIEW', 'View', 'Comment', "")
DBSetProp('LOCALVIEW', 'View', 'BatchUpdateCount',  1 )
DBSetProp('LOCALVIEW', 'View', 'ShareConnection', .T.)

DBSetProp('LOCALVIEW.id', 'Field', 'KeyField', .T.)
DBSetProp('LOCALVIEW.id', 'Field', 'Updatable', .F.)
DBSetProp('LOCALVIEW.id', 'Field', 'UpdateName', 'localview!tableforview.id')
DBSetProp('LOCALVIEW.id', 'Field', 'DataType', "I")

DBSetProp('LOCALVIEW.name', 'Field', 'KeyField', .F.)
DBSetProp('LOCALVIEW.name', 'Field', 'Updatable', .T.)
DBSetProp('LOCALVIEW.name', 'Field', 'UpdateName', 'localview!tableforview.name')
DBSetProp('LOCALVIEW.name', 'Field', 'DataType', "C(10)")
*
**********************************************
* заполним табличку
USE TABLEFORVIEW IN  0 
INSERT INTO TABLEFORVIEW (id, name ) VALUES ( 1 , 'One')
INSERT INTO TABLEFORVIEW (id, name ) VALUES ( 2 , 'Two')
INSERT INTO TABLEFORVIEW (id, name ) VALUES ( 3 , 'Three')
* пехали
SET MULTILOCKS ON 
SET DELETED OFF 
*
* поставим буфферизацию на табличку
CURSORSETPROP("Buffering" , 5 ,'TABLEFORVIEW')
*
* изменим первую запись в таблице
GO TOP IN TABLEFORVIEW
replace name WITH 'OneOne' IN TABLEFORVIEW
* и удалим её
DELETE IN TABLEFORVIEW
* запишем
?TABLEUPDATE(.t.,.t.,'TableForView')
* закроем и откроем табличку
USE IN TABLEFORVIEW
USE TABLEFORVIEW IN  0  && табличка не буфферизирована
* смотрим - видим измененную и удаленную запись
BROWSE 

*
* делаем тоже самое со View
USE LOCALVIEWDB!LocalVIEW IN  0 
* идем на вторую запись
GO  2  IN LocalView
replace name WITH 'TwoTwo' IN LocalVIEW
* и удалим её
DELETE IN LocalVIEW
* записываем
?TABLEUPDATE(.t.,.t.,'LocalView')
* смотрим View - всё замечательно есть изменение, есть удаление
SELECT LocalView 
BROWSE 
* смотрим табличку - а тут прилипла только пометка на удаление
SELECT TABLEFORVIEW
BROWSE 
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33822703
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Комментирую

1) "Голая таблица"

Работаем только с буфером таблицы. Все изменения по команде TableUpdate() переносятся из буфера в исходную таблицу. Причем сначала переносится метка на удаление и только потом модификация.

Как я это узнал. Поставил в триггерах таблицы .F. после того, как TableUpdate() вернул .F. посмотрел значение 5 элемента массива полученного по AERROR(). Там стояла 3. Т.е. сработал триггер на удаление.

2) Local View

По команде TableUpdate() происходит 2 события:

-) Сброс буфера Local View в собственно Local View
-) Перенос изменений сделанных в Local View в исходную таблицу. Заметь, здесь речь уже вообще не идет о буферах. Это просто обновление данных в одной таблице данными из другой.

Хотя порядок этих двух операций скорее всего обратный: сначала перенос из буфера Local View в исходную таблицу, а потом сброс буфера самого Local View.

Перед переносом вполне логично делается анализ на тип выполняемого изменения. Сначала делается анализ на факт удаления. Имеет место быть. Вот и выполняем удаление.

А вот следующего шага на модификацию уже удаленной записи не делается, что вполне логично. Какой смысл изменять не существующую запись?

Вообще-то, с точки зрения контейнера базы данных, записи помеченной как удаленная уже не существует. "Умерла так умерла". На ней не работают триггера на модификацию.

Попробуй в созданном Local View создать новую запись и тут же ее удалить. При сбросе буфера в исходной таблице новой удаленной записи не появится. Однако если то же самое сделать на самой таблице, то новая удаленная запись появится.

Разные механизмы работают при "простом" сбросе буфера и при переносе изменений из Local View в таблицу источник.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33823546
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМКомментирую

1) "Голая таблица"

Работаем только с буфером таблицы. Все изменения по команде TableUpdate() переносятся из буфера в исходную таблицу. Причем сначала переносится метка на удаление и только потом модификация.


Ну, что же, ты подтвердил мои предыдущие слова

PaulWistДля буфф. таблицы сбрасываются как изменения поля, так и пометка на удаление, а для View сбрасывается только пометка на удаление.

ВладимирМ2) Local View
.......
Перед переносом вполне логично делается анализ на тип выполняемого изменения. Сначала делается анализ на факт удаления. Имеет место быть. Вот и выполняем удаление.

А вот следующего шага на модификацию уже удаленной записи не делается, что вполне логично. Какой смысл изменять не существующую запись?

Вот это-то и удивило автора топика, для таблицы делаем replace-delete, получаем все изменения в таблице, он ожидал такого же поведения и для View, ан нет "облом-с".

Поэтому было написано

PaulWistДа, смотри-ка, какая особенность обновления view, действительно новое значение игнорируется, а выставляется только пометка на удаление. Даже затрудняюсь сказать глюк это или так и должно быть, совершенно разное поведение для таблицы и view

Ну и твоё заключение

ВладимирМрРазные механизмы работают при "простом" сбросе буфера и при переносе изменений из Local View в таблицу источник.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33823975
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то не получается переоткрыть структурный индекс и уничтожить неструктурный перед удалением

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LOCAL lcIdx

  CURSORSETPROP("Buffering",  3 , ThisForm.Alias)
  m.lcIdx   = SET("Index")
  m.lcIdx   = SUBSTR(lcIdx,  1 , AT(".cdx", lcIdx) +  3 )
  MESSAGEBOX(SET("Index"))
  CLOSE INDEXES
  &&SET INDEX TO
  SET INDEX TO &lcIdx
  SET ORDER TO
CURSORSETPROP("Buffering",  5 , ThisForm.Alias)

REQUERY()


После requery()
неструктурного индекса нет структурный виден на диске но
set index устанавливает связь на индекс исходной таблицы а стуктурный индекс view не видит
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33826448
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот это что за бред выполняю код без DELETE все проходит без ошибки

С DELETE проподает структурный индекс view и связь уходит на индекс исходной таблицы и соответсвенно вылетает ошибка TAG индекса не найден
у меня уже голова идет кругом от итих заморочек ну в чем тут дело
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
LOCAL lcIdx, lcOrder, lcDesc
  CURSORSETPROP("Buffering",  3 , ThisForm.Alias)
    m.lcOrder = ORDER(ThisForm.Alias)
    m.lcIdx   = SET("Index")
    m.lcIdx   = SUBSTR(lcIdx,  1 , AT(".cdx", lcIdx) +  3 )
    SET INDEX TO &lcidx
    IF !EMPTY(lcOrder) THEN
      SET ORDER TO TAG (lcOrder) ASCE
    ENDIF
  CURSORSETPROP("Buffering",  5 , ThisForm.Alias)
  
        BEGIN TRANSACTION  
       DELETE  &&Если убрать то все будет нормально
      TABLEUPDATE(.F., .T., ThisForm.Alias)
       ROLLBACK
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33826492
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мдее отследил ALIAS() он почему-то меняется после tableupdate на alias исходной
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
LOCAL lcIdx, lcOrder, lcDesc
  CURSORSETPROP("Buffering",  3 , ThisForm.Alias)
    m.lcOrder = ORDER(ThisForm.Alias)
    m.lcIdx   = SET("Index")
    m.lcIdx   = SUBSTR(lcIdx,  1 , AT(".cdx", lcIdx) +  3 )
    SET INDEX TO &lcidx
    IF !EMPTY(lcOrder) THEN
      SET ORDER TO TAG (lcOrder) ASCE
    ENDIF
  CURSORSETPROP("Buffering",  5 , ThisForm.Alias)
    
    BEGIN TRANSACTION
      MESSAGEBOX(ALIAS())  &&Alias view
      DELETE
      TABLEUPDATE(.F., .T., ThisForm.Alias)
      ROLLBACK
      &&SELECT (ThisForm.alias)  &&Ну и кто поменял область?? Триггер?
      MESSAGEBOX(ALIAS())  &&Alias исходной таблицы
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33827123
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопрос про индексы

Значит такая ситуация создается например 3 индекса для view
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
INDEX ON num1 TAG num1
INDEX ON num2 TAG num2
INDEX ON num1 + num2 TAG TotalTag

For i= 1  to  3 
  MessageBox(TAG(i))
endfor
Делаем перезапрос
REQUERY()

После requery создается неструктурный индекс с таким выражением что мы имеем?
Код: plaintext
1.
2.
3.
4.
INDEX ON num2 + num1 TAG TotalTag
For i= 1  to  4 
  MessageBox(TAG(i))
Endfor

Последнее два tag’a будут num1 + num2 и num2 + num1

Закрываю неструктурный индекс допустим перед удалением
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL lcIdx, lcOrder, lcDesc
  CURSORSETPROP("Buffering",  3 , ThisForm.Alias)
    m.lcOrder = ORDER(ThisForm.Alias)
    m.lcIdx   = SET("Index")
    m.lcIdx   = SUBSTR(lcIdx,  1 , AT(".cdx", lcIdx) +  3 )
    CLOSE INDEXES
    SET INDEX TO &lcidx
    IF !EMPTY(lcOrder) THEN
      SET ORDER TO TAG (lcOrder) IN (ThisForm.Alias) &tcSort
    ENDIF
  CURSORSETPROP("Buffering",  5 , ThisForm.Alias)
Имеем

For i=1 to 3
MessageBox(TAG(i))
Endfor

Последнее tag будет num1 + num2

Т.е индекс (num2+num1) который я создавал будет замещен на самый первый TotalTag num1 + num2.
И единственна возможность его восстановить это постоянно как надо удалить пачку записей индексировать и индексировать по нему.
Что так и поступать?
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33827585
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Sea!

Наверное правильной стратегией в данном случае будет:
1) Создать СРАЗУ все необходимые индексы - т.е. после первого открытия
представления - индексы все пойдут в структурный cdx - после перезапроса
ничего делать не нужно - "старые" индексы автоматически перестраиваются (и
текущий тег кстати остаётся текущим).
2) Перед перезапросом не просто снимать текущий тег, а явно удялять ВСЕ теги
(при этом естественно удалится и соответствующий структурный cdx) - после
перезапроса можно создавать новые теги - они пойдут в новый структурный cdx.
Во втором варианте есть особенность - если удалять старые теги ПОСЛЕ
перезапроса, то в VFP9SP1 становится невозможным создать новые структурные
теги - он как-то некоректно удаляет/закрывает этот самый структурный cdx, и
при очередном INDEX ON возникает ошибка 1113 File is not open. При этом
вообще как-то хитро "портятся" внутренние фоксовые таблицы открытых файлов -
т.е. "на пустом месте" начинают сыпаться те-же самые ошибки 1113 при
обращении к другим dbf-ам или индексам... В общем ради собственного
спокойствия лучше всё-же удалять теги ДО перезапроса... Будет время отпишу в
MSFT про эту ошибку - может пофиксят в SP2.

P.S. В VFP9SP1 поведение изменено - даже после перезапросов команда INDEX ON
.... TAG ... (без явного указания cdx файла) тег создаётся не в новом
"якобы-структурном" cdx (с именем "новго" tmp файла) а в старом cdx (который
хоть и отличается по имени от нового tmp тем не менее является структурным и
не мешает транзакциям). Но там есть баг описанный выше...

P.P.S. Сомневаюсь что после перезапроса можно "прицеплять" заранее
отцепленный cdx файл (ты его кстати так просто и не отцепишь - CLOSE INDEXES
не поможет - т.к. тот cdx является по сути структурным, а их данная команда
не отключает) - но даже если это и удастся то индекс в любом случае будет
неверным - т.е. потребует выполнения REINDEX (т.к. после перезапроса весьма
вероятно что соответствие между номерами записей в курсоре и значениями
индексного ключа будут совершенно другими нежели ДО перезапроса).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33828968
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я и так создаю все индексы вначале но дело в том что при множественной сортировке все равно придется создавать в любое время индекс и после первого же REQUERY он пойдет в неструктурный

Удалять все теги я не могу у меня есть теги связанные 1:1 с некоторыми временными курсорами + вторая таблица на параметр where бывает

Единственный выход возможен это делать параметр во view на order by
или постоянно жить с неструктурным индексом и ждать подвоха и вставлять везде (код запоминия tega, закрытие неструктурного, снова индексация)
И во время удаления очень трудно будет предсказать куда уйдет указатель записи после изменения сортировки.

Параметр на order by вы Igor Korolyov мне месяц назад сказали не делать вот и начался итот гимор.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33829368
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sea.s2Я и так создаю все индексы вначале но дело в том что при множественной сортировке все равно придется создавать в любое время индекс и после первого же REQUERY он пойдет в неструктурный
Он как раз останется структурным . Проверяется это через функцию

?CDX(1)

Т.е. стратегия следующая:

-) ДО начала молификации для View создается нужное количество тэгов структурного индекса. Просто командой INDEX ON ... TAG ... без указания имени файла

Код: plaintext
1.
2.
select MyView
INDEX ON MyField TAG MyField

-) Команда Requery() автоматически обновит содержимое этого структурного инедкса, при этом оставив его структурным . Ничего закрывать или удалять перед командой Requery() не надо.

Если возникает необходимость ПОСЛЕ команды Requery() создать еще один индекс, то в этом случае придется ЯВНО указать имя индексного файла

Код: plaintext
1.
2.
3.
4.
select MyView
LOCAL lcFileName
lcFileName = CDX( 1 )
INDEX ON MyField TAG MyField OF (m.lcFileName)

Надо указывать имя именно через CDX(1), поскольку, в версиях до VFP9, после Requery() имя структурного индекса отличается от имени файла.
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33829849
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я в шоке столькo проблем ушло от прибавления слова
OF (CDX(1, ThisForm.Alias))

Прошу у всех прощения, но я почему-то думал что TAG OF создает неструктурные TAG's и старательно итого избегал еще help смутил
"If you exclude the optional OF CDXFileName clause from TAG TagName, you create a structural compound index file."

Больше ничего закрывать и переиндексовывать не надо все в одном структурном индексе фуууу...
Зато узнал всякие полезные вещи спасибо всем!!
...
Рейтинг: 0 / 0
Replace, Delete in Transaction
    #33831507
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi ВладимирМ!

> Надо указывать имя именно через CDX(1), поскольку, в версиях до VFP9,
> после Requery() имя структурного индекса отличается от имени файла.

Скорее так:

В версиях до VFP9 команда INDEX ON ... TAG ... (без указания OF имя_CDX)
создаёт теги в cdx файле имеющем то-же самое имя что возвращает функция
DBF() - при этом для представлений возникает неприятный эффект, связанный с
тем, что после перезапроса индексный файл с именем = DBF() уже будет
неструктурным!
В VFP9 поведение изменено так, что INDEX ON ... TAG ... создаёт теги в
структурном CDX, если таковой имеется - независимо от текущего значения
DBF() для данного курсора. Если структурного CDX нет, то поведение конечно
идентично.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Replace, Delete in Transaction
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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