Página 1 de 1

FOR/EACH com dois elementos

Enviado: 11 Abr 2023 16:09
por JoséQuintas
Pensei em usar aqui, só precisa tomar cuidado com as listas.

Código: Selecionar todos

      FOR EACH aList IN { ;
         { "JPNOTFIS", "NFFILIAL" }, ;
         { "JPPEDIDO", "PDCADASTRO" }, ;
         { "JPPEDIDO", "PDTRANSP" }, ;
         { "JPPEDIDO", "PDFORPAG" }, ;
         { "JPITEM", "IETRIPRO" }, ;
         { "JPCADASTRO", "CDMIDIA" }, ;
         { "JPESTOQUE", "ESNUMDEP" }, ;
         { "JPFINAN", "FIPARCELA" } }
         :ExecuteNoReturn( "UPDATE " + aList[ 1 ] + ;
            " SET " + aList[2] + " = '0'" + ;
            " WHERE" + ;
            " CONCAT( '', " + aList[2] + ") < '0000000' OR CONCAT( '', " + aList[2] + ") > '9999999'" )
      NEXT
Poderia ser:

Código: Selecionar todos

FOR EACH cTable, cColumn IN ;
   { "JPNOTFIS", "JPPEDIDO", "JPPEDIDO", "JPPEDIDO", "JPITEM", "JPCADASTRO", "JPESTOQUE", "JPFINAN" },
   { "NFFILIAL", "PDCADASTRO", "PDTRANSP", "PDFORPAG", "IETRIPRO", "CDMIDIA", "ESNUMDEP", "FIPARCELA" }
   :ExecuteNoReturn( "UPDATE " + cTable + ;
      " SET " + cColumn + " = '0'" + ;
      " WHERE" + ;
      " CONCAT( '', " + cColumn + ") < '0000000' OR CONCAT( '', " + cColumn + ") > '9999999'" )
NEXT

FOR/EACH com dois elementos

Enviado: 11 Abr 2023 16:17
por JoséQuintas
ou com 3 elementos

Código: Selecionar todos

FOR EACH cTable, cColumn, nValue IN ;
   { "JPNOTFIS", "JPPEDIDO", "JPPEDIDO", "JPPEDIDO", "JPITEM", "JPCADASTRO", "JPESTOQUE", "JPFINAN" },
   { "NFFILIAL", "PDCADASTRO", "PDTRANSP", "PDFORPAG", "IETRIPRO", "CDMIDIA", "ESNUMDEP", "FIPARCELA" },
   { 0,     0,     0,     0,     0,     0,     0,     1,     1 }
   :ExecuteNoReturn( "UPDATE " + cTable + ;
      " SET " + cColumn + " = '" + Str( nValue,1 ) + "'" + ;
      " WHERE" + ;
      " CONCAT( '', " + cColumn + ") < '0000000' OR CONCAT( '', " + cColumn + ") > '9999999'" )
NEXT
Não deixa de ser um uso pro recurso.

FOR/EACH com dois elementos

Enviado: 11 Abr 2023 16:25
por JoséQuintas
Complemento:

Fiquei na dúvida sobre colocar em SQL ou aqui.

Foi a alternativa que pensei pra alterar campos caractere pra numéricos no MySQL.
Primeiro precisa ter certeza de que só tem números lá.
Executar esses comandos e depois a alteração de caractere pra numérico.

Código: Selecionar todos

STATIC FUNCTION Update0411()

   LOCAL cnSQL := ADOLocal(), aList

   WITH OBJECT cnSQL
      FOR EACH aList IN { ;
         { "JPNOTFIS", "NFFILIAL", '0' }, ;
         { "JPPEDIDO", "PDCADASTRO", '0' }, ;
         { "JPPEDIDO", "PDTRANSP", '0' }, ;
         { "JPPEDIDO", "PDFORPAG", '0' }, ;
         { "JPITEM", "IETRIPRO", '0' }, ;
         { "JPCADASTRO", "CDMIDIA", '0' }, ;
         { "JPESTOQUE", "ESNUMDEP", '1' }, ;
         { "JPFINAN", "FIPARCELA", '1' } }
         :ExecuteNoReturn( "UPDATE " + aList[ 1 ] + ;
            " SET " + aList[2] + " = " + StringSQL( Str( aList[3], 1 ) ) + ;
            " WHERE" + ;
            " CONCAT( '', " + aList[2] + ") < '0000000' OR CONCAT( '', " + aList[2] + ") > '9999999'" )
      NEXT
      :ExecuteNoReturn( "ALTER TABLE JPNOTFIS CHANGE COLUMN NFFILIAL NFFILIAL INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "ALTER TABLE JPPEDIDO CHANGE COLUMN PDCADASTRO PDCADASTRO INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "ALTER TABLE JPPEDIDO CHANGE COLUMN PDTRANSP PDTRANSP INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "ALTER TABLE JPPEDIDO CHANGE COLUMN PDFORPAG PDFORPAG INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "ALTER TABLE JPITEM CHANGE COLUMN IETRIPRO IETRIPRO INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "ALTER TABLE JPCADASTRO CHANGE COLUMN CDMIDIA CDMIDIA INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "ALTER TABLE JPESTOQUE CHANGE COLUMN ESNUMDEP ESNUMDEP INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "ALTER TABLE JPFINAN CHANGE COLUMN FIPARCELA FIPARCELA INT(11) NOT NULL DEFAULT '0'" )
      :ExecuteNoReturn( "UPDATE JPESTOQUE SET ESNUMDEP=1 WHERE ESNUMDEP=0" )
      :ExecuteNoReturn( "UPDATE JPFINAN SET FIPARCELA=1 WHERE FIPARCELA=0" )
   ENDWITH

   RETURN Nil
Dá pra fazer o FOR/EACH pros outros comandos, já que tem tabela e campo na lista, e a definição é a mesma.
Os últimos comandos, são porque já rodei em algumas bases antes de alterar o default.
E só pensei em usar o recurso mas não usei .... rs

FOR/EACH com dois elementos

Enviado: 11 Abr 2023 16:33
por JoséQuintas
versão final

Código: Selecionar todos

STATIC FUNCTION Update0411()

   LOCAL cnSQL := ADOLocal(), cTable, cColumn, nValue

   WITH OBJECT cnSQL
      FOR EACH cTable, cColumn, nValue IN ;
         { "JPNOTFIS", "JPPEDIDO", "JPPEDIDO", "JPPEDIDO", "JPITEM", "JPCADASTRO", "JPESTOQUE", "JPFINAN" }, ;
         { "NFFILIAL", "PDCADASTRO", "PDTRANSP", "PDFORPAG", "IETRIPRO", "CDMIDIA", "ESNUMDEP", "FIPARCELA" }, ;
         { 0,          0,            0,          0,          0,          0,          1,         1 }
         :ExecuteNoReturn( "UPDATE " + cTable + ;
            " SET " + cColumn + " = " + StringSQL( Str( nValue, 1 ) ) + ;
            " WHERE" + ;
            " CONCAT( '', " + cColumn + ") < '0000000' OR CONCAT( '', " + cColumn + ") > '9999999'" )
         :ExecuteNoReturn( "ALTER TABLE " + cTable + ;
            " CHANGE COLUMN " + cColumn + ;
            " " + cColumn + " INT(11) NOT NULL DEFAULT " + StringSQL( Str( nValue, 1 ) ) )
      NEXT
      :ExecuteNoReturn( "UPDATE JPESTOQUE SET ESNUMDEP=1 WHERE ESNUMDEP=0" )
      :ExecuteNoReturn( "UPDATE JPFINAN SET FIPARCELA=1 WHERE FIPARCELA=0" )
   ENDWITH

   RETURN Nil

FOR/EACH com dois elementos

Enviado: 11 Abr 2023 19:50
por JoséQuintas
Complemento:

Se por acaso o número de elementos for diferente, começa a sequência novamente.
Por exemplo, num cálculo de dígito de controle:

Código: Selecionar todos

nSoma := 0
cVar  := "123456789"
FOR EACH cLetra, nFator IN cVar, { 1, 2 }
   nSoma += ( Val( cLetra ) * nFator )
NEXT
É interessante o troço.

É só lembrar que isso existe, e se aparecer alguma situação que possa usar, é usar.