Página 1 de 1

Atualizar tabela com base em outra

Enviado: 10 Jun 2020 12:45
por JoséQuintas
Este deu trabalho, porque não se trata de apenas um.
Ainda mais chegando emails de erro um atrás do outro.
Parece que deu certo.

Código: Selecionar todos

   WITH OBJECT cnSQL
      :cSQL := "UPDATE JPPEDIDO" + ;
         " JOIN" + ;
         ;
         " ( SELECT SUM( IPISSBAS ) AS ISSBAS, SUM( IPISSVAL ) AS ISSVAL, " + ;
         " SUM( IPIIBAS ) AS IIBAS, SUM( IPIIVAL ) AS IIVAL, " + ;
         " SUM( IPIPIBAS ) AS IPIBAS, SUM( IPIPIVAL ) AS IPIVAL, " + ;
         " SUM( IPICMBAS ) AS ICMBAS, SUM( IPICMVAL ) AS ICMVAL, " + ;
         " SUM( IPFCPVAL ) AS FCPVAL, SUM( IPSUBBAS ) AS SUBBAS, " + ;
         " SUM( IPSUBVAL ) AS SUBVAL, " + ;
         " SUM( IPDIFVALI ) AS DIFVALI, SUM( IPDIFVALF ) AS DIFVALF, " + ;
         " SUM( IPPISBAS ) AS PISBAS, SUM( IPPISVAL ) AS PISVAL," + ;
         " SUM( IPCOFBAS ) AS COFBAS, SUM( IPCOFVAL ) AS COFVAL," + ;
         " SUM( IPVALNOT ) AS VALNOT, SUM( IPICSBAS ) AS ICSBAS," + ;
         " SUM( IPICSVAL ) AS ICSVAL, SUM( IPVALADU ) AS VALADU," + ;
         " SUM( IPVALIOF ) AS VALIOF, SUM( IPIMPVAL ) AS IMPVAL," + ;
         " SUM( IPVALCUS ) AS VALCUS" + ;
         " FROM JPITPED" + ;
         " WHERE IPPEDIDO = " + NumberSQL( nIdPedido ) + ;
         " GROUP BY IPPEDIDO ) AS TEMP" + ;
         ;
         " SET PDISSBAS = TEMP.ISSBAS, PDISSVAL = TEMP.ISSVAL," + ;
         " PDIIBAS = TEMP.IIBAS, PDIIVAL = TEMP.IIVAL," + ;
         " PDIPIBAS = TEMP.IPIBAS, PDIPIVAL = TEMP.IPIVAL," + ;
         " PDICMBAS = TEMP.ICMBAS, PDICMVAL = TEMP.ICMVAL," + ;
         " PDFCPVAL = TEMP.FCPVAL, PDSUBBAS = TEMP.SUBVAL," + ;
         " PDSUBVAL = TEMP.SUBVAL, PDDIFVALI = TEMP.DIFVALI," + ;
         " PDDIFVALF = TEMP.DIFVALF, PDPISBAS = TEMP.PISBAS," + ;
         " PDPISVAL = TEMP.PISVAL, PDCOFBAS = TEMP.COFBAS," + ;
         " PDCOFVAL = TEMP.COFVAL, PDVALNOT = TEMP.VALNOT," + ;
         " PDICSBAS = TEMP.ICSBAS, PDICSVAL = TEMP.ICSVAL," + ;
         " PDVALADU = TEMP.VALADU, PDVALIOF = TEMP.VALIOF," + ;
         " PDIMPVAL = TEMP.IMPVAL, PDVALCUS = TEMP.VALCUS" + ;
         " WHERE JPPEDIDO.IDPEDIDO = " + NumberSQL( nIdPedido )
      :ExecuteCmd()

Atualizar tabela com base em outra

Enviado: 10 Jun 2020 12:57
por JoséQuintas
Deixando os cálculos pro MySQL.
Talvez depois transformar em stored procedure.

Precisa muito cuidado, porque qualquer erro pode ser fatal, por exemplo, esquecer do WHERE, e atualizar todos os pedidos de uma vez.

Atualizar tabela com base em outra

Enviado: 10 Jun 2020 13:02
por JoséQuintas
reforçar isso, pra quem está iniciando:

No Clipper/Harbour REPLACE VAR WITH 1 troca só o registro atual.

No MySQL; UPDATE PEDIDOS SET VALOR = 5... isso troca TUDO

Comparado ao Clipper/Harbour, digamos que "ALL" é o default, igual REPLACE ALL
Então, OBRIGATORIAMENTE, SEMPRE tem que definir o alcance dos comandos.
Um errinho desses.... e lá se foi a base de dados...