Mensagem( "Anulando reajuste" )
WITH OBJECT cnMySql
:ExecuteCmd( "DELETE FROM JPPREHIS WHERE PHDATA=" + DateSql( mDataReajuste ) + " AND PHOBS LIKE 'REAJ.%'" )
:cSql := "SELECT PHID, PHITEM, PHCADAS, PHFORPAG, PHVALOR FROM JPPREHIS" + ;
" INNER JOIN" + ;
" ( SELECT MAX( PHID ) AS ULTIMOLANC FROM JPPREHIS GROUP BY PHITEM, PHCADAS, PHFORPAG ) AS ULTIMO" + ;
" ON JPPREHIS.PHID = ULTIMO.ULTIMOLANC" + ;
" ORDER BY PHITEM, PHCADAS, PHFORPAG"
:Execute()
DO WHILE ! :Eof()
SELECT jppreco
SEEK :StringSql( "PHITEM" ) + :StringSql( "PHCADAS" ) + :StringSql( "PHFORPAG" )
IF ! Eof()
RecLock()
REPLACE jppreco->pcValor WITH :NumberSql( "PHVALOR" )
RecUnlock()
ENDIF
:MoveNext()
ENDDO
:CloseRecordset()
END WITH
Não deu pra testar, porque JPPRECO ainda é DBF, mas tudo indica que seria isto:
UPDATE JPPRECO
JOIN
( SELECT PHID, PHITEM, PHCADAS, PHFORPAG, PHVALOR FROM JPPREHIS
INNER JOIN
( SELECT MAX( PHID ) AS ULTIMOLANC FROM JPPREHIS GROUP BY PHITEM, PHCADAS, PHFORPAG ) AS ULTIMO
ON JPPREHIS.PHID = ULTIMO.ULTIMOLANC
) AS NOVOPRECO
ON JPPRECO.PCITEM=NOVOPRECO.PHVALOR AND JPPRECO.PHCADAS = NOVOPRECO.PHCADAS AND JPPRECO.PCFORPAG=NOVOPRECO.PHFORPAG
SET JPPRECO.PCVALOR = NOVOPRECO.PHVALOR
Está correto?
JPPREHIS tem o histórico de preços, onde o cadastro é sempre sequencial.
A intenção é salvar o último lançamento de cada conjunto como preço atual em JPPRECO
Existe um preço diferente pra cada conjunto de cliente, produto e forma de pagamento
ULTIMO seria a seleção dos IDs de maior número sequencial
NOVOPRECO seria a seleção de preço desses IDs
e finalmente a atualização relacionando o atual com o NOVOPRECO.
Nota:
Só me preparando pra passar os preços também pra MySql, por enquanto só o histórico está em MySql.