Página 1 de 1

MySQL alterando DOUBLE pra DECIMAL

Enviado: 22 Mai 2023 19:40
por JoséQuintas
Tem outro jeito de fazer isto?
O objetivo é alterar de DOUBLE pra DECIMAL.
Alterar direto já sei que não dá.
hb_Eol() foi pra facilitar encontrar erros.

Código: Selecionar todos

STATIC FUNCTION Update0522a()

   LOCAL cnSQL := ADOLocal()

   IF ! cnSQL:TableExists( "HLLOCADOR" )
      RETURN Nil
   ENDIF

   SayScroll( "2023-05-22 Atualizando hllocador" )

   WITH OBJECT cnSQL
      IF ! :FieldExists( "NEWPREDIAL", "HLLOCADOR" )
         :ExecuteNoReturn( "ALTER TABLE HLLOCADOR" + hb_Eol() + ;
            " ADD COLUMN NEWPREDIAL DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWAGUA DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWLUZ DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWCONDOMINIO DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWTEL DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWOUTRAS DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWTXLIXO DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWIR DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWVALORNF DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWADICDIVS DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWDESCDIVS DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " ADD COLUMN NEWINDICE DECIMAL(9,6) NOT NULL DEFAULT '0'" )
      ENDIF
         :ExecuteNoReturn( "UPDATE HLLOCADOR" + hb_Eol() + ;
            " SET NEWPREDIAL=CAST( PREDIAL AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWAGUA=CAST( AGUA AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWLUZ=CAST( LUZ AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWCONDOMINIO=CAST(CONDOMINIO AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWTEL=CAST(TEL AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWOUTRAS=CAST(OUTRAS AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWTXLIXO=CAST(TXLIXO AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWIR=CAST( IR AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWVALORNF=CAST( VALORNF AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWADICDIVS=CAST( ADICDIVS AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWDESCDIVS=CAST( DESCDIVS AS DECIMAL(14,2) )," + hb_Eol() + ;
            " NEWINDICE=CAST( INDICE AS DECIMAL(9,6) ) " )
         :ExecuteNoReturn( "ALTER TABLE HLLOCADOR " + hb_Eol() + ;
            " DROP COLUMN PREDIAL," + hb_Eol() + ;
            " DROP COLUMN AGUA," + hb_Eol() + ;
            " DROP COLUMN LUZ," + hb_Eol() + ;
            " DROP COLUMN CONDOMINIO," + hb_Eol() + ;
            " DROP COLUMN TEL," + hb_Eol() + ;
            " DROP COLUMN OUTRAS," + hb_Eol() + ;
            " DROP COLUMN TXLIXO," + hb_Eol() + ;
            " DROP COLUMN IR," + hb_Eol() + ;
            " DROP COLUMN VALORNF," + hb_Eol() + ;
            " DROP COLUMN ADICDIVS," + hb_Eol() + ;
            " DROP COLUMN DESCDIVS," + hb_Eol() + ;
            " DROP COLUMN INDICE" )
         :ExecuteNoReturn( "ALTER TABLE HLLOCADOR" + hb_Eol() + ;
            " CHANGE COLUMN NEWPREDIAL PREDIAL DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWAGUA AGUA DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWLUZ LUZ DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWCONDOMINIO CONDOMINIO DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWTEL TEL DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWOUTRAS OUTRAS DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWTXLIXO TXLIXO DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWIR IR DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWVALORNF VALORNF DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWADICDIVS ADICDIVS DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWDESCDIVS DESCDIVS DECIMAL(14,2) NOT NULL DEFAULT '0'," + hb_Eol() + ;
            " CHANGE COLUMN NEWINDICE INDICE DECIMAL(9,6) NOT NULL DEFAULT '0'" )
   ENDWITH

   RETURN Nil

MySQL alterando DOUBLE pra DECIMAL

Enviado: 22 Mai 2023 20:48
por Fernando queiroz
cria um campo para o decimal e usa o CONVERT depois apaga o DOUBLE e modifica o nome do campo DECIMAL para o antigo DOUBLE
agora se o valor do double for muito grande vi dar erro

MySQL alterando DOUBLE pra DECIMAL

Enviado: 22 Mai 2023 20:57
por JoséQuintas
Foi o que fiz, mas CONVERT ou CAST ?

Código: Selecionar todos

CAST( valor AS DECIMAL(14,2) )

MySQL alterando DOUBLE pra DECIMAL

Enviado: 22 Mai 2023 21:01
por JoséQuintas
MySQL CAST vs CONVERT

MySQL CAST allows you to cast data from one data type to another data type.

MySQL CONVERT also allows you to convert data from one data type to another data type. It also allows you to convert character set of data into another character set. MySQL CAST cannot be used to change character set.
You can use MySQL CAST as well as MySQL CONVERT to convert data type of literals as well as columns.
Pra numérico valem os dois. Pra string entra codepage e CAST não trata isso.

MySQL alterando DOUBLE pra DECIMAL

Enviado: 22 Mai 2023 21:12
por JoséQuintas
Mudei um pouco, dava muito trabalho pra digitar.
E faltou acrescentar uma coisa CAMPOANTIGO AFTER CAMPONOVO, senão fica tudo no final.
Tá parecendo um json kkkk

Código: Selecionar todos

STATIC FUNCTION Update0522a()

   LOCAL aTabela, aList := { ;
      { "HLLOCADOR", { ;
         { "PREDIAL", 14, 2 }, ;
         { "AGUA", 14, 2 }, ;
         { "LUZ", 14, 2 }, ;
         { "CONDOMINIO", 14, 2 }, ;
         { "TEL", 14, 2 }, ;
         { "OUTRAS", 14, 2 }, ;
         { "TXLIXO", 14, 2 }, ;
         { "IR", 14, 2 }, ;
         { "VALORNF", 14, 2 }, ;
         { "ADICDIVS", 14, 2 }, ;
         { "DESCDIVS", 14, 2 }, ;
         { "INDICE", 9, 6 } } }, ;
      { "JPRECIBO", { ;
         { "ALUGUEL", 14, 2 }, ;
         { "MULTA", 5, 2 }, ;
         { "ABONO", 5, 2 }, ;
         { "PREDIAL", 14, 2 }, ;
         { "PREDIAL2", 14, 2 }, ;
         { "AGUA", 14, 2 }, ;
         { "LUZ", 14, 2 }, ;
         { "CONDOMINIO", 14, 2 }, ;
         { "TEL", 14, 2 }, ;
         { "TXLIXO", 14, 2 }, ;
         { "OUTRAS", 14, 2 }, ;
         { "IR", 14, 2 }, ;
         { "AIR", 14, 2 }, ;
         { "COM", 6, 2 }, ;
         { "VALORCOMIS", 14, 2 }, ;
         { "FIANCA", 14, 2 }, ;
         { "DESCALUG", 14, 2 }, ;
         { "INCENDIO", 14, 2 }, ;
         { "ADICDIVS", 14, 2 }, ;
         { "DESCDIVS", 14, 2 }, ;
         { "ADICMENSAL", 14, 2 }, ;
         { "DESCMENSAL", 14, 2 }, ;
         { "INDICE", 9, 6 } } }, ;
      { "INFORME", { ;
         { "VALOR", 14, 2 }, ;
         { "COM", 6, 2 }, ;
         { "VALORCOMIS", 14, 2 } } }, ;
      { "IMOVEL", { ;
         { "AREAC", 9, 2 }, ;
         { "AREAT", 9, 2 }, ;
         { "SALDODEV", 14, 2 }, ;
         { "PRESTACAO", 14, 2 }, ;
         { "CONDOMINIO", 14, 2 }, ;
         { "VALOR", 14, 2 }, ;
         { "COMISSAO", 7, 2 } } }, ;
      { "HLLOCATARIO", { ;
         { "ALUGUEL", 14, 2 }, ;
         { "ALUG1", 14, 2 }, ;
         { "MULTA", 5, 2 }, ;
         { "ABONO", 5, 2 }, ;
         { "PREDIAL", 14, 2 }, ;
         { "PREDIAL2", 14, 2 }, ;
         { "AGUA", 14, 2 }, ;
         { "LUZ", 14, 2 }, ;
         { "CONDOMINIO", 14, 2 }, ;
         { "TEL", 14, 2 }, ;
         { "OUTRAS", 14, 2 }, ;
         { "TXLIXO", 14, 2 }, ;
         { "INDICE", 9, 6 }, ;
         { "IR", 14, 2 }, ;
         { "COM", 14, 2 }, ;
         { "FIANCA", 14, 2 }, ;
         { "DESCALUG", 14, 2 }, ;
         { "INCENDIO", 14, 2 }, ;
         { "ADICDIVS", 14, 2 }, ;
         { "DESCDIVS", 14, 2 }, ;
         { "ADICMENSAL", 14, 2 }, ;
         { "DESCMENSAL", 14, 2 } } }, ;
      { "HLDIMRAT", { ;
         { "RATEIO", 6, 2 } } }, ;
      { "HLDIMO1", { ;
         { "INDICE", 9, 6 } } }, ;
      { "HLDIMO", { ;
         { "VALOR", 14, 2 }, ;
         { "VALORCOMIS", 14, 2 } } }, ;
      { "HLCOFRE", { ;
         { "VALOR", 14, 2 }, ;
         { "SALDO", 14, 2 } } }, ;
      { "HLCAIXA11", { ;
         { "VAB", 14, 2 }, ;
         { "VAF", 14, 2 }, ;
         { "DIFE", 14, 2 } } }, ;
      { "HLCAIXA", { ;
         { "VALOR", 14, 2 }, ;
         { "COM", 6, 2 }, ;
         { "VALORCOMIS", 14, 2 } } }, ;
      { "HLALUGUEL", { ;
         { "AREA", 7, 2 }, ;
         { "VALOR", 14, 2 }, ;
         { "ABONO", 5, 2 }, ;
         { "LIQUIDO", 14, 2 }, ;
         { "DESCALUG", 14, 2 } } }, ;
      { "CORRENTE", { ;
         { "VALOR", 14, 2 }, ;
         { "VALANT", 14, 2 }, ;
         { "COM", 6, 2 }, ;
         { "VALORCOMIS", 14, 2 } } } }

   SayScroll( "2023-05-22 Atualizando double pra decimal" )

   FOR EACH aTabela IN aList
      DoubleToDecimal( aTabela[1], aTabela[2] )
   NEXT

   RETURN Nil
E a conversão

Código: Selecionar todos

STATIC FUNCTION DoubleToDecimal( cTabela, aList )

   LOCAL cnSQL := ADOLocal(), aField

   IF ! cnSQL:TableExists( cTabela )
      RETURN Nil
   ENDIF

   SayScroll( "Atualizando tabela " + cTabela )

   WITH OBJECT cnSQL
      :cSQL := "ALTER TABLE " + cTabela
      FOR EACH aField IN aList
         :cSQL += " ADD COLUMN NEW" + aField[1] + ;
         " DECIMAL(" + Ltrim( Str( aField[2] ) ) + "," + Ltrim( Str( aField[3] ) ) + ;
         ") NOT NULL DEFAULT '0' AFTER " + aField[1] + iif( aField:__EnumIsLast,"","," )
      NEXT
      :ExecuteNoReturn( :cSQL )

      :cSQL := "UPDATE " + cTabela + " SET"
      FOR EACH aField IN aList
         :cSQL += " NEW" + aField[1] + "=CAST(" + aField[1] + " AS DECIMAL(" + ;
         Ltrim(Str( aField[2])) + "," + Ltrim(Str(aField[3])) + ") )"  + ;
         iif( aField:__EnumIsLast, "", "," )
      NEXT
      :ExecuteNoReturn( :cSQL )

      :cSQL := "ALTER TABLE " + cTabela
      FOR EACH aField IN aList
         :cSQL += " DROP COLUMN " + aField[1] + iif( aField:__EnumIsLast, "", "," )
      NEXT
      :ExecuteNoReturn( :cSQL )

      :cSQL := "ALTER TABLE " + cTabela
      FOR EACH aField IN aList
         :cSQL += " CHANGE COLUMN NEW" + aField[1] + " " + ;
         aField[1] + " DECIMAL(" + Ltrim( Str( aField[2] ) ) + "," + ;
         Ltrim( Str( aField[3] ) ) + ") NOT NULL DEFAULT '0'" + ;
         iif( aField:__EnumIsLast, "", "," )
      NEXT
      :ExecuteNoReturn( :cSQL )
   ENDWITH

   RETURN Nil
Crio o campo NEWcampo AFTER campo
Atualizo NEWCampo = CAST( campo AS DECIMAL(n,n) )
Apago o campo
Renomeio NEWcampo pra campo

Tem tabela que demora, mas se fizer campo a campo vai ser pior.
Aqui demorou quase 3 minutos pra fazer todas.
tabela.png
A parte curiosa, é que não é a tabela com mais registros que demora mais.