Atualizar tabela com base em outra

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Atualizar tabela com base em outra

Mensagem 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()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Atualizar tabela com base em outra

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Atualizar tabela com base em outra

Mensagem 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...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder