FOR/EACH com dois elementos

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

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

FOR/EACH com dois elementos

Mensagem 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
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

FOR/EACH com dois elementos

Mensagem 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.
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

FOR/EACH com dois elementos

Mensagem 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
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

FOR/EACH com dois elementos

Mensagem 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
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

FOR/EACH com dois elementos

Mensagem 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.
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