Talvez aqui fique melhor de entender:
disto
Código: Selecionar todos
WITH OBJECT cnSQL
:cSQL := "UPDATE JPITEM " + ;
" LEFT JOIN JPPRECO ON PCPRODUTO = IDPRODUTO" + ;
" SET" + ;
"IECUSCON = " + NumberSQL( mieCusCon ) + "," + ;
" IEVALOR = GREATEST( " + NumberSQL( mieCusCon ) + ", " + ;
" ROUND( IEULTPRE * IF( JPPRECO.PCPRODUTO IS NULL, 1.04, 1.03 ), 2 )," + ;
" ROUND( IEVALOR * IF( JPPRECO.PCPRODUTO IS NULL, 1.04, 1.03 ), 2 ) )" + ;
" WHERE IDPRODUTO = " + NumberSQL( nIdProduto ) + ;
" LIMIT 1"
:ExecuteCmd()
ENDWITH
pra isto
Código: Selecionar todos
WITH OBJECT cnSQL
:cSQL := "UPDATE JPITEM " + ;
" JOIN " + ;
" ( SELECT IF( EXISTS ( SELECT DISTINCT PCPRODUTO FROM JPPRECO WHERE IDPRODUTO=" + ;
NumberSQL( nIdProduto ) + " ), 1.03, 1.04 ) AS MARGEM ) AS X" + ;
" SET" + ;
"IECUSCON = " + NumberSQL( mieCusCon ) + "," + ;
" IEVALOR = GREATEST( " + NumberSQL( mieCusCon ) + ", " + ;
" ROUND( IEULTPRE * X.MARGEM, 2 )," + ;
" ROUND( IEVALOR * X.MARGEM, 2 ) )" + ;
" WHERE IDPRODUTO = " + NumberSQL( nIdProduto )
:ExecuteCmd()
ENDWITH
Basicamente é aplicar 1.03 ou 1.04 como margem, caso exista em JPPRECO ou não.
O SELECT mais interno faz esse trabalho: Uma tabela X com 1 registro, com o campo MARGEM, preenchido conforme existe ou não.
O externo, com JOIN, apenas usa X.MARGEM.
Dependendo do ponto de vista, simplificou.