:: Visual Foxpro, Foxpro for DOS
Изменение данных
lemenev
Автор

Сообщений: 113
Дата регистрации: 23.06.2022
Помогите разобраться с методикой обновления данных.
Допустим у меня есть 2 таблицы:
таблица счетов продажи Sbit с уникальным полем Kod и
таблица товаров по счёту Sbit2 с полем Sbit.
Таблицы связаны отношением 1 ко многим по условию Sbit.Kod = Sbit2.Sbit

1 Допустим я ввожу новый счёт
xKod = NewKod() && получение нового уникального кода
Получаю пустой курсор товаров по счёту:
SELECT * FROM Sbit2 WHERE Sbit2.Sbit=xKod INTO CURSOR temp READWRITE
Добавляю и заполняю записи
Сохраняю результат:
Т.к. поле temp.Sbit пустое, то
REPLACE ALL Sbit WITH xKod
SELECT Sbit2
APPEND FROM temp
ISERT INTO Sbit (Kod) VALUES (xKod)

2 Позже я могу отредактировать существующий счёт:
Ищу в таблице Sbit нужный счёт
xKod = Sbit.Kod
Получаю курсор товаров по счёту:
SELECT * FROM Sbit2 WHERE Sbit2.Sbit=xKod INTO CURSOR temp READWRITE
Редактирую записи.
Сохраняю результат:
Т.к. поле temp.Sbit не пустое, то
UPDATE Sbit2 SET список полей FTOM temp
WHERE Sbit2.Sbit=xKod AND Sbit2.Tovar=temp.Tovar


3 Проблема возникает, когда при редактировании существующего счёта добавляются новые записи:
Ищу в таблице Sbit нужный счёт
xKod = Sbit.Kod
Получаю курсор товаров по счёту:
SELECT * FROM Sbit2 WHERE Sbit2.Sbit=xKod INTO CURSOR temp READWRITE
Добавляю новые и редактирую старые записи.

Как лучше организовать сохранение результата?
В этом случае в части записей поле temp.Sbit не пустое, а в части пустое.
Т.е. при APPEND часть записей удвоится.
При UPDATE вновь добавленные записи пропадут.
При INSERT пропадут изменения старых записей.
Можно в два приёма: сначала INSERT новых записей, затем UPDATE всех записей.
Пожалуйста, подскажите оптимальную стратегию.
Ratings: 0 negative/0 positive
Re: Изменение данных
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Похоже, в этот раз придется Тарану раскрыть тайны своих двух классов.
Ratings: 0 negative/0 positive
Re: Изменение данных
Burn

Сообщений: 5643
Откуда: Днепр
Дата регистрации: 02.01.2002
А кто мешает прописывать sbit в момент добавления новой записи если у вас всегда есть xKod?
Ratings: 0 negative/0 positive
Re: Изменение данных
Alsim

Сообщений: 3636
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Интересный способ
Делаю так, если больше никак, только без update, а просто через удаление перед записью и insert. (у меня Fox7)
***
А почему не связать, установить буферизацию у таблиц и работать с ними напрямую?
Сохранять измы через
=Tableupdate(.T.,.T.,"Sbit")
=Tableupdate(.T.,.T.,"Sbit2")
или отменять, если передумали
=TABLEREVERT(.t.,"Sbit")
=TABLEREVERT(.t.,"Sbit2")

Просто, надёжно и работает больше 20лет ;)



Исправлено 1 раз(а). Последнее : Alsim, 15.09.22 08:41
Ratings: 0 negative/0 positive
Re: Изменение данных
lemenev
Автор

Сообщений: 113
Дата регистрации: 23.06.2022
Burn
А кто мешает прописывать sbit в момент добавления новой записи если у вас всегда есть xKod?
А что дальше? У части записей из курсора есть «прототипы» в таблице Sbit2, а у части – нет. Так пустое поле в курсоре является признаком: запись старая иди новая.
Можно, конечно, пройтись SCAN по курсору, для старых записей делать UPDATE, а для новых – INSERT. Но хотелось бы вариант без цикла.
Ratings: 0 negative/0 positive
Re: Изменение данных
Joys

Сообщений: 3511
Откуда: Старая Русса
Дата регистрации: 25.06.2000
lulgu
Похоже, в этот раз придется Тарану раскрыть тайны своих двух классов.



------------------




Исправлено 1 раз(а). Последнее : Joys, 15.09.22 11:56
Ratings: 0 negative/0 positive
Re: Изменение данных
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
GETNEXTMODIFIED(nRecordNumber [, cTableAlias | nWorkArea] [, lNoFire])


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Изменение данных
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
lulgu
Похоже, в этот раз придется Тарану раскрыть тайны своих двух классов.

Е-бало завали и не трогай меня.
Ratings: 0 negative/1 positive
Re: Изменение данных
lemenev
Автор

Сообщений: 113
Дата регистрации: 23.06.2022
Alsim
А почему не связать, установить буферизацию у таблиц и работать с ними напрямую?
Я раньше так делал, накладывая фильтр на таблицу Sbit2
Решил специально усложнить задачу, заведя временный курсор, чтобы не блокировать таблицы надолго.
Ratings: 0 negative/0 positive
Re: Изменение данных
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
lemenev
Можно, конечно, пройтись SCAN по курсору, для старых записей делать UPDATE, а для новых – INSERT. Но хотелось бы вариант без цикла.

Не очень понял, что мешает добавить в Where критерии отбора на пустой или не пустой код? В версии VFP9 команда Insert-SQL допускает использование запросов

* Обновление ранее существовавших
* поле temp.Sbit заполнено
UPDATE Sbit2
SET список полей
FROM temp
WHERE Sbit2.Sbit=m.xKod <-- Это лишнее. Можно убрать, но и так можно
AND Sbit2.Tovar=temp.Tovar
AND Sbit2.Sbit=temp.Sbit <-- вот это добавляем
* Создание новых
* поле temp.Sbit пустое
INSERT INTO Sbit2 (Sbit, список полей)
select m.xKod, список полей
FROM temp
WHERE empty(temp.Sbit) <-- вот это добавляем



Исправлено 1 раз(а). Последнее : Владимир Максимов, 15.09.22 20:18
Ratings: 0 negative/1 positive
Re: Изменение данных
lemenev
Автор

Сообщений: 113
Дата регистрации: 23.06.2022
Владимир Максимов

Спасибо
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика