Clipper On Line • Ver Tópico - Update,.,,Join
Página 1 de 1

Update,.,,Join

MensagemEnviado: 16 Ago 2017 18:32
por JoséQuintas
Como ficaria o equivalente disto totalmente em MySql

   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.

Update,.,,Join

MensagemEnviado: 17 Ago 2017 16:32
por alxsts

Update,.,,Join

MensagemEnviado: 17 Ago 2017 19:38
por JoséQuintas
Me chamaram a atenção estes:

Trocar pelo valor default
UPDATE employee SET salary=DEFAULT;


Trocar conforme expressão
employee SET salary =
CASE dept
WHEN 'Sales' THEN salary+1000
WHEN 'Technology' THEN salary+500
WHEN 'Marketing' THEN salary+500
ELSE salary
END;


Renumerar, usando ordem de trás pra frente.
UPDATE employee SET id=id+100 order by id desc;


Outros eu até já havia usado, por exemplo o UPDATE com limite, usei no servidor de e-mails pra liberar uma qtde de e-mails por vez.

Na pesquisa para o comando que postei aqui, cheguei a encontrar pergunta num fórum para essa segunda questão mas sem resposta, só indicaram pra fazer um comando por vez. Acabei ficando curioso em saber como poderia ser, e o texto do link acabou mostrando esse CASE.

Isso mostra o quanto se perde usando DBF: muito fonte pra pouca coisa... rs
E ainda não dá pra considerar isso como uso avançado, tem muito mais recurso pela frente.

Gostei mesmo, valeu.

Mais um como retribuição... rs
Atualizando estoque sem precisar do aplicativo fazer isso.

http://www.devmedia.com.br/implementando-controle-de-estoque-no-mysql-com-triggers-e-procedures/26352