Обновление значения с несколькими условиями
Я пытаюсь добавить несколько условий. Я хотел бы обновить base2 с суммой себя с промежуточным значением, и я хотел бы опубликовать некоторые условия на промежуточное значение и base2.
Я изменил таблицу вручную в базе данных. Промежуточное значение является одним из столбцов в таблице и рассчитывается на основе значения base2. В первой строке у меня есть значение base2, и я рассчитываю, чтобы получить промежуточное значение в первой строке, теперь во второй строке мне нужно установить новый base2 = предыдущий base2 + предыдущее промежуточное значение. Вот почему у меня есть два счетчика, чтобы проследить, где находятся позиции предмета. Counter1 считает индекс itemid, а counter2 отслеживает цикл внутри itemid
Вопрос в том, как установить эту новую базу2. Можно ли установить мою новую базу 2 на одной линии? Или мне придется установить другую переменную в промежуточное значение в предыдущей строке и добавить ее в качестве новой переменной в base2?
Здесь ниже то, что я хочу иметь, но есть ошибки (функция отсутствует)).
UPDATE TABLE2 SET base2=
(base2+INTERMEDIATEVALUE WHERE loadingordinal=counter2 AND itemid=counter1)
WHERE loadingordinal=counter2 +1 AND itemid=counter1
2 ответа
В VFP делать такие обновления через Update_SQL сложно. К счастью, есть много способов решить эту проблему, и один из них - использовать команду xBase (в xBase вы можете использовать REPLACE для SQL-UPDATE. Replace по умолчанию работает с "текущей строкой" (не включает в себя предложение scope). Я не могу предоставить ни схему, ни примеры данных, поэтому я приведу лишь простой пример. Ваш код будет выглядеть так:
local lnPrevious, lnItemId
lnItemId = -1
Select Table2
Scan
&& Save Current Id (ItemID?)
lnItemId = Table2.ItemID
&& Do calculation using previous value
&& On first row it is the same as base2
lnPrevious = base2
scan While Table2.ItemId = m.lnItemId
Replace Base2 with m.lnPrevious, ;
IntermediateValue with DoCalculation(Base2)
&& Previous value for next row
lnPrevious = Base2 + IntermediateValue
endscan
skip -1 && Endscan would move the pointer
Endscan
Обратите внимание, что если вам нужно больше, чем ItemId (или, возможно, передать непосредственно Base2 и IntermediateValue, а не lnPrevious), вы также можете сделать что-то вроде:
local loRow
scan
scatter to name loRow memo
scan while table2.ItemId = m.loRow.ItemId
...
Я не уверен, что такое INTERMEDIATEVALUE, но если это таблица, то вы можете следовать приведенному ниже запросу или просто настроить его. Вы можете сделать подзапросы для достижения этого типа условия
UPDATE TABLE2
SET base2 = base2 + (SELECT *
FROM INTERMEDIATEVALUE
WHERE loadingordinal=counter2 AND itemid=counter1)
WHERE loadingordinal=counter2 +1 AND itemid=counter1