powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обновление таблицы через Local View
7 сообщений из 7, страница 1 из 1
Обновление таблицы через Local View
    #35306917
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
Уважаемые знатоки ! Помогите решить такую задачу
Есть таблица (PRICE) в ней хранятся остатки по карточке и Local View к ней (LVPRICE)
вводится приходный документ нужно в поля qmp и sum_mpr добавить количество и сумму прихода за месяц

Код: 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.
DO WHILE !EOF() AND  new_prihod.idr=rdoc_str_cs.id_rdoc
    SELECT rdoc_str_cs
...
   SELECT  lvPrice  
   SET ORDER TO id_k
*  Найдем запись с ИД карточки
   SEEK  rdoc_str_cs.id_kart 
    plOk=.F.
    DO WHILE !EOF() AND lvPrice.id_kart =rdoc_str_cs.id_kart 
*  найдем запись с нужной ценой
		IF lvPrice.price=rdoc_str_cs.price
			plOk=.T.
			EXIT 
		ENDIF 
		SKIP 
    ENDDO 
    SELECT LVprice
    IF !plOk 
        SELECT LVprice
    	m.id_price=pub_proc('newidCalculator','Tabl_id','Price')
	    INSERT INTO price (id_kart, idr,ns) ;
   	        values (rdoc_str_cs.id_kart,m.id_price, nastr.ns)
			REPLACE code_ei with rdoc_str_cs.code_ei, ;
		 	  price WITH rdoc_str_cs.price
    ENDIF 
    REPLACE qmp WITH qmp+rdoc_str_cs.q, sum_mpr WITH  sum_mpr+rdoc_str_cs.sumr
.... 
   SELECT rdoc_str_cs
  skip 
enddo 

Проблемма такая . Данные в lvPrice меняются а в таблице не желают. Причем если не ставить буферизацию на lvPrice то обрабатывается только одна запись в цикле, а затем вылетает ошибка "Конфликт обновления в курсоре ". Похоже на команде seek после коментария "Найдем запись с ИД карточки"

если в ините формы добавить
Код: plaintext
1.
2.
SET MULTILOCKS ON
CursorSetProp('Buffering',  5 , 'lvprice')
а после приведенного выше цикла вставить tableupdate(.T.) получим -
Документ обрабатывается полностью но данные в таблице попрежнему не меняются

После этого запускаю такую программу пересчета где есть такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
...
SELECT qprixod1
GO TOP  
DO WHILE !EOF()
*    SCATTER memvar
    m.id_price=id_price
    SELECT lvPrice
    IF !SEEK(m.id_price)
       APPEND BLANK
       REPLACE id_kart WITH qprixod1.id_kart, id_price  WITH m.id_price,;
       price  WITH qprixod1.price, code_ei WITH qprixod1.code_ei,;
       data_sozd WITH qprixod1.data,data_last WITH qprixod1.data ,;
       qmp WITH qmp +qprixod1.q
      SELECT qprixod1
      SKIP
      LOOP
    ENDIF   
    REPLACE qmp WITH qmp +qprixod1.q, sum_mpr WITH sum_mpr+qprixod1.sump
    SELECT qprixod1
    SKIP
ENDDO 
Все нормально. Нет ни какой буферизации . Хотя принцип такой же-в цикле меняем данные lvPrice, а Price сама меняется. И команда seek есть Но все работает нормально.
Подскажите где глюк и чего я не понимаю.
...
Рейтинг: 0 / 0
Обновление таблицы через Local View
    #35307036
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представление - это курсор показывающий состояние исходных таблиц на момент его открытия. Автоматически он не обновляется при изменении исходных таблиц. Для этого есть команда REQUERY(). Есть еще REFRESH() - только у него возможностей гораздо меньше.

Если LVPRICE полностью дублирует таблицу PRICE и используется для того чтобы указатели на разные записи установить, то проше так открыть:
Код: plaintext
use price in  0  alias lvprice again
тогда все будет обновляться, т.е. одна и таже таблица откроется дважды.
...
Рейтинг: 0 / 0
Обновление таблицы через Local View
    #35307917
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
Dima T
Представление - это курсор показывающий состояние исходных таблиц на момент его открытия. Автоматически он не обновляется при изменении исходных таблиц.

Это я знаю. Я может не совсем правильно описал проблемму. У меня в представлении хранится не вся таблица, а выбока из нее. Если менять данные напрямую в таблице, то для поиска нужны или дополнительные индексы или фильтры, поэтому стоит обратная задача:
Изменить данные в представлении , а чтобы в исходной таблице само поменялось

В коде программы нашел ошибку в команде INSERT TO указана имя исходно таблица заменил команду на APPEND BLANK и REPLACE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    SELECT LVprice
    IF !plOk 
        SELECT Lvprice
    	m.id_price=pub_proc('newidCalculator','Tabl_id','Price')
    	APPEND BLANK
	REPLACE id_kart WITH rdoc_str_cs.id_kart, idr WITH m.id_price, ns WITH nastr.ns,;
		code_ei with rdoc_str_cs.code_ei, ;
 	    price WITH rdoc_str_cs.price
           REPLACE qmp WITH qmp+rdoc_str_cs.q, sum_mpr WITH  sum_mpr+rdoc_str_cs.sumr

	ELSE 
    REPLACE qmp WITH qmp+rdoc_str_cs.q, sum_mpr WITH  sum_mpr+rdoc_str_cs.sumr
ENDIF 
Но итог такой же ПОЧЕМУ. В других программа меняю данные в представлениии и все изменения автоматом переходят в нужную таблицу .
...
Рейтинг: 0 / 0
Обновление таблицы через Local View
    #35307991
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nfpВ коде программы нашел ошибку в команде INSERT TO указана имя исходно таблица
Этот кусок и натолкнул на мысль что тебе наоборот все надо.

nfpзаменил команду на APPEND BLANK и REPLACE
Код: plaintext
1.
2.
3.
 ...
    	APPEND BLANK
	REPLACE id_kart WITH rdoc_str_cs.id_kart, idr WITH m.id_price, ns WITH nastr.ns,;
...

Тут может скрываться потенциальная ошибка (не связанная с твоей проблемой). Указывай явно алиасы с которыми работаешь:
Код: plaintext
1.
2.
3.
4.
APPEND BLANK in MyTable
REPLACE in MyTable id_kart WITH rdoc_str_cs.id_kart 
SKIP in MyTable
EOF('MyTable')
...
т.к. потом можешь добавить код, который сменит текущую рабочую область и тут будет ошибка. Да и читать такой код проще, SELECT лишний раз делать не надо.

Этот код непонятен:
nfp
Код: plaintext
DO WHILE !EOF() AND  new_prihod.idr=rdoc_str_cs.id_rdoc

1. EOF() - проверяется для текущей рабочей области. Ты уверен что при входе в цикл текущая rdoc_str_cs?
2. В rdoc_str_cs указатель при входе в цикл может быть где угодно, циклом с этого места и до конца записи обработаются. Проверь что указатель там где тебе надо устанавливается

Твой цикл:
nfp
Код: plaintext
1.
2.
3.
4.
5.
DO WHILE !EOF() AND  new_prihod.idr=rdoc_str_cs.id_rdoc
  ... && тело цикла
   SELECT rdoc_str_cs
  skip 
enddo 

Равнозначен такому
Код: plaintext
1.
2.
3.
SELECT rdoc_str_cs
scan while new_prihod.idr = rdoc_str_cs.id_rdoc
  ... && тело цикла
endscan

nfp Изменить данные в представлении , а чтобы в исходной таблице само поменялось

Но итог такой же ПОЧЕМУ. В других программа меняю данные в представлениии и все изменения автоматом переходят в нужную таблицу .
Если в представлении не прописано что оно должно обновлять исходную таблицу, то изменения туда не попадут. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	Create sql View vPrice as SELECT Price.nPriceId as nVPriceId, Price.nKatalogId, ...;
 	FROM price;
	Order by cKatalog, nCena

	DbSetProp('vPrice', 'View', 'Tables', 'Price')
	DbSetProp('vPrice.nVPriceId', 'Field', 'UpdateName', 'price.nPriceId')
	DbSetProp('vPrice.nVPriceId', 'Field', 'KeyField', .t.) && Задаем ключевое поле
	DbSetProp('vPrice.nKol', 'Field', 'Updatable', .t.) && Задаем обновляемые поля
	DbSetProp('vPrice', 'View', 'SendUpdates', .t.) && Разрешаем сохранение изменений
В таком представлении изменения будут сохраняться. Если пересчет всей таблицы делаешь, то лучше использовать табличную буферизацию, все менять, а потом разом сохранять через TABLEUPDATE().

Глюки еще может грид привносить, он сам записи блокирует, если твой LVPRICE на форме в гриде отображается, то убирай с грида фокус куда-нибудь перед твоим расчетом, на кнопку или на поле ввода какое-нибудь.
...
Рейтинг: 0 / 0
Обновление таблицы через Local View
    #35308184
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
Дима ,спасибо за такой большой и подробный ответ !!!
Разрешение на сохранение имеется.
Дело в том, что в этой же пакете, но в других формах такое обновление проходит (пример приведен в первом посте). Попробую применить все Ваши советы, и внимательно посмотреть коды программ, которые нормально работают. Возможен вариант с гридом.
А пока если не сложно ответьте еще на несколько вопросов. Заранее благодарен
1 почему программа ломается если не делать буферизацию. (после 1-го прохождения цикла на команде SEEK выдает "Конфликт обновления в курсоре ") Почему тут требуется буферизация
2 Если я перед какими либо действиями сделал буфферизацию командой
CursorSetProp('Buffering', 5, 'lvprice') то после их выполнения и сохранения изменений я должен отменить буфферизацию командой CursorSetProp('Buffering', 1, 'lvprice'). Так? Но сейчас не могу точно вспомнить все подробности, но была такая ситуация. Эти команды отрабатывали нормально, а переходил на другую форму выдавалась ошибка о несоответствии типа буферизации. Писал CursorSetProp('Buffering', 3, 'lvprice') - работало нормально.Но мне надо не изменить тип буферизации мне нужно ее отменить . В этом примере lvprice- тот же самый Local View
...
Рейтинг: 0 / 0
Обновление таблицы через Local View
    #35308456
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nfp1 почему программа ломается если не делать буферизацию. (после 1-го прохождения цикла на команде SEEK выдает "Конфликт обновления в курсоре ") Почему тут требуется буферизация
2 Если я перед какими либо действиями сделал буфферизацию командой
Грида точно нет который этот курсор использует? SET MULTILOCK ON есть?

nfpCursorSetProp('Buffering', 5, 'lvprice') то после их выполнения и сохранения изменений я должен отменить буфферизацию командой CursorSetProp('Buffering', 1, 'lvprice'). Так?
Не так. Вью без буферизации не бывают, только оптимистическая строки (3) или таблицы(5), остальные типы буферизации только для таблиц. Об этом в сообщении об ошибке написано. Для вью по умолчанию 3. По-хорошему - запоминай как было и восстанавливай в конце:
Код: plaintext
1.
2.
3.
4.
local lnBufState
lnBufState = CursorGetProp('buffering', 'lvprice')
CursorSetProp('Buffering',  5 , 'lvprice')
...
CursorSetProp('Buffering', lnBufState, 'lvprice')
...
Рейтинг: 0 / 0
Обновление таблицы через Local View
    #35308713
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
Спасибо! В гридах LVPRICE не используется.Еще раз спасибо за помощь. Надо смотреть еще раз код программы. Появятся новые вопросы напишу.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обновление таблицы через Local View
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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