обновление значения с несколькими условиями - PullRequest
0 голосов
/ 24 сентября 2018

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

Я изменил таблицу вручную в базе данных.Промежуточное значение является одним из столбцов в таблице и вычисляется на основе значения base2. В первой строке у меня есть значение base2, и я рассчитываю, чтобы получить промежуточное значение в первой строке, теперь во второй строке мне нужно установитьновый base2 = предыдущий base2 + предыдущее промежуточное значение.Вот почему у меня есть два счетчика, чтобы отследить, где находятся позиции предмета.Counter1 считает индекс itemid, а counter2 отслеживает цикл внутри itemid

Вопрос в том, как установить этот новый base2.Можно ли установить мою новую базу 2 на одной линии?Или мне нужно будет установить другую переменную в промежуточное значение в предыдущей строке и добавить ее в качестве новой переменной в base2?

Ниже приведено то, что я хочу получить, но есть ошибки (функция отсутствует)).

UPDATE TABLE2 SET base2=   
    (base2+INTERMEDIATEVALUE WHERE loadingordinal=counter2 AND itemid=counter1)    
WHERE loadingordinal=counter2 +1 AND itemid=counter1

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

В 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
   ...
0 голосов
/ 24 сентября 2018

Я не уверен, что такое INTERMEDIATEVALUE, но если это таблица, то вы можете следовать приведенному ниже запросу или просто настроить его.Вы можете выполнять подзапросы для достижения этого типа условия

UPDATE TABLE2 
SET base2 = base2 + (SELECT * 
                     FROM INTERMEDIATEVALUE 
                     WHERE loadingordinal=counter2 AND itemid=counter1) 
WHERE loadingordinal=counter2 +1 AND itemid=counter1
...