FOR EACH pra GET

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 pra GET

Mensagem por JoséQuintas »

Tava mexendo num fonte aqui, e achei interessante postar.
Mostra o que pode ser feito com FOR/EACH, sem precisar de macro, e facilita muito.

Eu tinha feito assim:

Código: Selecionar todos

   IF Len( mlcLicList ) > 0
      @ Row() + 1, 1  SAY Pad( "Lic.01", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 1, LIC_DATA ]
      IF AddMonth( mlcLicList[ 1, LIC_DATA ], mlcLicList[ 1, LIC_VALIDADE ] ) - mlcLicList[ 1, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 1, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 1
      @ Row() + 1, 1  SAY Pad( "Lic.02", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 2, LIC_DATA ]
      IF AddMonth( mlcLicList[ 2, LIC_DATA ], mlcLicList[ 2, LIC_VALIDADE ] ) - mlcLicList[ 2, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 2, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 2
      @ Row() + 1, 1  SAY Pad( "Lic.03", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 3, LIC_DATA ]
      IF AddMonth( mlcLicList[ 3, LIC_DATA ], mlcLicList[ 3, LIC_VALIDADE ]) - mlcLicList[ 3, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 3, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 3
      @ Row() + 1, 1  SAY Pad( "Lic.04", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 4, LIC_DATA ]
      IF AddMonth( mlcLicList[ 4, LIC_DATA ], mlcLicList[ 4, LIC_VALIDADE ] ) - mlcLicList[ 4, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 4, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 4
      @ Row() + 1, 1  SAY Pad( "Lic.05", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 5, LIC_DATA ]
      IF AddMonth( mlcLicList[ 5, LIC_DATA ], mlcLicList[ 5, LIC_VALIDADE ] ) - mlcLicList[ 5, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 5, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 5
      @ Row() + 1, 1  SAY Pad( "Lic.06", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 6, LIC_DATA ]
      IF AddMonth( mlcLicList[ 6, LIC_DATA ], mlcLicList[ 6, LIC_VALIDADE ] ) - mlcLicList[ 6, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 6, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 6
      @ Row() + 1, 1  SAY Pad( "Lic.07", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 7, LIC_DATA ]
      IF AddMonth( mlcLicList[ 7, LIC_DATA ], mlcLicList[ 7, LIC_VALIDADE ] ) - mlcLicList[ 7, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 7, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 7
      @ Row() + 1, 1  SAY Pad( "Lic.08", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 8, LIC_DATA ]
      IF AddMonth( mlcLicList[ 8, LIC_DATA ], mlcLicList[ 8, LIC_VALIDADE ] ) - mlcLicList[ 8, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 8, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 8
      @ Row() + 1, 1  SAY Pad( "Lic.09", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 9, LIC_DATA ]
      IF AddMonth( mlcLicList[ 9, LIC_DATA ], mlcLicList[ 9, LIC_VALIDADE ] ) - mlcLicList[ 9, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 9, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 9
      @ Row() + 1, 1  SAY Pad( "Lic.10", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 10, LIC_DATA ]
      IF AddMonth( mlcLicList[ 10, LIC_DATA ], mlcLicList[ 10, LIC_VALIDADE ] ) - mlcLicList[ 10, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 10, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 10
      @ Row() + 1, 1  SAY Pad( "Lic.11", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 11, LIC_DATA ]
      IF AddMonth( mlcLicList[ 11, LIC_DATA ], mlcLicList[ 11, LIC_VALIDADE ] ) - mlcLicList[ 11, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 11, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
   IF Len( mlcLicList ) > 11
      @ Row() + 1, 1  SAY Pad( "Lic.12", LIC_TAMANHODESC, "." ) + ".:" GET mlcLicList[ 12, LIC_DATA ]
      IF AddMonth( mlcLicList[ 12, LIC_DATA ], mlcLicList[ 12, LIC_VALIDADE ] ) - mlcLicList[ 12, LIC_PRAZO ] < Date()
         @ Row(), Col() + 2 SAY Padc( "VENCIDA", 40 ) COLOR SetColorAlerta()
      ENDIF
      Encontra( AUX_LICTIP + mlcLicList[ 12, LIC_CODIGO ], "jptabel", "numlan" )
      @ Row(), 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
   ENDIF
agora mudei pra isto:

Código: Selecionar todos

   FOR EACH oLicenca IN mlcLicList
      IF Val( oLicenca[ LIC_CODIGO ] ) != 0
         Encontra( AUX_LICTIP + oLicenca[ LIC_CODIGO ], "jptabel", "numlan" )
         @ Row() + 1, 1 SAY Pad( Trim( jptabel->axDescri ), LIC_TAMANHODESC, "." )
         @ Row(), Col() SAY ":" GET oLicenca[ LIC_DATA ] VALID oLicenca[ LIC_DATA ] <= Date()
         @ Row(), Col() + 2 SAY Str( oLicenca[ LIC_VALIDADE ], 3 ) + "m"
         @ Row(), Col() + 2 SAY Dtoc( AddMonth( oLicenca[ LIC_DATA ], oLicenca[ LIC_VALIDADE ] ) )
         @ Row(), Col() + 2 SAY Str( oLicenca[ LIC_PRAZO ], 3 ) + "d"
         IF AddMonth( oLicenca[ LIC_DATA ], oLicenca[ LIC_VALIDADE ] ) - oLicenca[ LIC_PRAZO ] < Date() ;
            .OR. ( oLicenca[ LIC_DATA ] > Date() .AND. oLicenca[ LIC_DATA ] - oLicenca[ LIC_PRAZO ] < Date() )
            @ Row(), Col() + 2 SAY Padc( "VENCIDA", 20 ) COLOR SetColorAlerta()
         ELSEIF oLicenca[ LIC_DATA ] > Date()
            @ Row(), Col() + 2 SAY Padc( "DATA ERRADA", 20 ) COLOR SetColorAlerta()
         ENDIF
      ENDIF
   NEXT
Antes era um texto, e a data pra ser digitada, pra cada um dos ítens da lista.
Agora tem texto, data, meses, data vencto, dias pra aviso, pra cada um dos ítens da lista

Pois é.... dobrou a quantidade de informação, e ficou mais simples que antes, graças ao uso do FOR/EACH
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 pra GET

Mensagem por JoséQuintas »

Mexi mais um pouco, também facilitou outra coisa:

Código: Selecionar todos

   CASE cVarName $ "nidlictip,maxlic01,maxlic02,maxlic03,maxlic04,maxlic05,maxlic06,maxlic07,maxlic08,maxlic09,maxlic10,maxlic11,maxlic12"
Agora adotei o nome padrão da id. de cadastro

Código: Selecionar todos

   CASE cVarName $ "nidlictip"
      AUXLICTIPClass():GridSelection()
É a rotina de pesquisa/browse direcionada ao nome da variável do GET.
Se é a identificação do cadastro, só pode ser ele (Id Lic Tip - Id do Licenciamento/Tipo)

Essa foi uma mudança que comecei neste ano.
Não importa a tela, campo chave de tabela NOS FONTES sempre vai ser o nome de identificação único daquela tabela, mesmo que nas bases de dados isto não seja assim.
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
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

FOR EACH pra GET

Mensagem por Vlademiro »

Eu faço assim também.

Mas tem uma questão no GET que eu nunca resolvi de forma satisfatória.

Olha só.

Eu gosto de centralizar as validações em um único ponto. Eu crio uma função e fico chamando ela em todos os valids.

Exatamente como o exemplo abaixo :

Código: Selecionar todos


#include "inkey.ch"

REQUEST HB_CODEPAGE_PTISO

PROCEDURE MAIN

    LOCAL GetList := {}
    
    hb_CdpSelect("PTISO")
    /*
    QUERIA EVITAR ISSO. 
    PORQUE USO MACROS DENTRO DA FUNÇÃO DE VALIDAÇÃO vVALID
    */
    PRIVATE cCodigo := SPACE(5)
    PRIVATE cNome := SPACE(40)
    PRIVATE nSal := 0.00
    
    SetMode( 50 , 140 )
    CLS
    @ 10,10 SAY "Codigo : " GET cCodigo PICTURE "99999" VALID vValid()  //<-------------- A mesma função
    @ 12,10 SAY "Nome.. : " GET cNome PICTURE "@!" VALID vValid() //<-------------- A mesma função
    @ 14,10 SAY "Salar. : " GET nSal PICTURE "@RE 999,999.99" VALID vValid() //<-------------- A mesma função
    READ
    
    IF LASTKEY() <> K_ESC
        ? cCodigo
        ? cNome
        ? nSal
    ELSE
        ALERT("CANCELEI")
    ENDIF
    
    RETURN
    
/* AQUI CENTRALIZO AS VALIDAÇÕES */
STATIC FUNCTION vVALID()

    LOCAL cReadVar := READVAR()
    LOCAL xVar 
    LOCAL lRet := .t.
    
    DO CASE
    CASE cReadVar == "CCODIGO"
        
        xVar := &cReadVar // Mas preciso do valor e só dá certo se for PRIVATE
        IF EMPTY( xVar )
            Alert("Informe um valor válido para o código")
            lRet := .f.
        ENDIF
        
    CASE cReadVar == "CNOME"
    
        xVar := &cReadVar
        IF EMPTY( xVar )
            Alert("Informe um valor válido para o nome")
            lRet := .f.
        ENDIF
    
    
    CASE cReadVar == "NSAL"
    
        xVar := &cReadVar
        IF xVar <= 0
            Alert("Informe um valor válido para o salário")
            lRet := .f.
        ELSE
            IF xVar < 1000
                Alert("Esse valor é muito baixo")
                lRet := .f.
            ENDIF
        ENDIF

    ENDCASE
    
    RETURN lRet
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

FOR EACH pra GET

Mensagem por Vlademiro »

Assim foi o máximo que consegui :

Código: Selecionar todos

  
STATIC FUNCTION Valid( cControl , xVal ) // <------ Passo o nome e o valor no valid para evitar a macro. Uso uma rotina genérica para isso.

    LOCAL lRet := .t.

    IF UPPER( cControl ) == "TEXT_DESCRICAO"
        IF EMPTY( xVal )
            alert("Digite um valor para a descrição do grupo de material")
            lRet := .f.
        ENDIF
    ENDIF

    RETURN lRet
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 pra GET

Mensagem por JoséQuintas »

Eu parti pra outro lado:

Código: Selecionar todos

@ 1, 0 Get nIdCliente VALID ClienteClass():Valida( nIdCliente )
@ 2, 0 GET nIdProduto VALID ProdutoClass():Valida( nIdProduto)
Mas você pode ter acesso a tudo da getsys.
Começando pelo get atual:

GetActive():VarGet()
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 pra GET

Mensagem por JoséQuintas »

Esqueci de dizer: uso o outro jeito pra pesquisas/browses

Código: Selecionar todos

SET KEY K_F10 TO Pesquisa
E na rotina de pesquisas, é o browse conforme a variável

Código: Selecionar todos

cVar := Lower( ReadVar() )
DO CASE
CASE cVar == "nidcadastro"
   CadastroClass():GridSelection()
...
se for identificação de cadastro (nIdCadastro), faz o browse da tabela Cadastro, e assim por diante.
Como são campos únicos, mesmo nome nas tabelas, nada pra se preocupar.
Se tiver exceção, verifico também o nome do módulo.
Campo que não está na lista não acontece nada, então nem precisa ficar ativando/desativando isso.

Por isso o FOR/EACH ficou melhor ainda.

Código: Selecionar todos

aList := { 1, 2, 3, 4, 5, 6, 7 }
FOR EACH nIdCadastro IN aList
   @ Row() + 1, GET nIdCadastro ...
NEXT
Nesse caso, já fica pronta a pesquisa por F9 também, sem nada adicional.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

FOR EACH pra GET

Mensagem por alxsts »

Olá!
Vlademiro escreveu:Mas tem uma questão no GET que eu nunca resolvi de forma satisfatória.

Código: Selecionar todos

#include "inkey.ch"

REQUEST HB_CODEPAGE_PTISO

PROCEDURE MAIN

    LOCAL GetList := {}
    
    hb_CdpSelect("PTISO")

    LOCAL cCodigo := SPACE(5)
    LOCAL cNome := SPACE(40)
    LOCAL nSal := 0.00
    
    SetMode( 50 , 140 )
    CLS
    @ 10,10 SAY "Codigo : " GET cCodigo PICTURE "99999" VALID vValid( GetActive() )  //<-------------- A mesma função
    @ 12,10 SAY "Nome.. : " GET cNome PICTURE "@!" VALID vValid( GetActive() ) //<-------------- A mesma função
    @ 14,10 SAY "Salar. : " GET nSal PICTURE "@RE 999,999.99" VALID vValid( GetActive() ) //<-------------- A mesma função
    READ
    
    IF LASTKEY() <> K_ESC
        ? cCodigo
        ? cNome
        ? nSal
    ELSE
        ALERT("CANCELEI")
    ENDIF
    
    RETURN

//-------------------------------------------------------------------------------    
/* AQUI CENTRALIZO AS VALIDAÇÕES */

STATIC FUNCTION vVALID( oGet )

    LOCAL lRet := .t.
    LOCAL cMessage := ""
    LOCAL xVar := oGet:varGet()
    
    SWITCH Upper( oGet:name() )
       CASE "CCODIGO"
          IF EMPTY( xVar )
             cMessage := "Informe um valor válido para o código"
          ENDIF
       CASE "CNOME"
          IF EMPTY( xVar )
             cMessage := "Informe um valor válido para o nome"
          ENDIF
       CASE "NSAL"
          IF xVar <= 0
             cMessage := "Informe um valor válido para o salário"
          ELSE
             IF xVar < 1000
                cMessage := "Esse valor é muito baixo"
             ENDIF
          ENDIF
    END
    
    If ! Empty( cMessage )
       Alert( cMessage )
       lRet := .F.
    Endif
    
    RETURN lRet
//-------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

FOR EACH pra GET

Mensagem por Vlademiro »

Depois de tantos anos apareceu a solução! Depois vou testar em uma classe que criei.

Obrigado.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

FOR EACH pra GET

Mensagem por alxsts »

Olá!

Tinha esquecido dos EXITs do comando SWITCH...END. A variável lRet não é necessária e foi retirada. Segue a nova versão:

Código: Selecionar todos

#include "inkey.ch"

REQUEST HB_CODEPAGE_PTISO

PROCEDURE MAIN

    LOCAL GetList := {}
    
    LOCAL cCodigo := SPACE(5)
    LOCAL cNome := SPACE(40)
    LOCAL nSal := 0.00

    hb_CdpSelect("PTISO")    

    SetMode( 50 , 140 )
    CLS
    @ 10,10 SAY "Codigo : " GET cCodigo PICTURE "99999" VALID vValid( GetActive() )  //<-------------- A mesma função
    @ 12,10 SAY "Nome.. : " GET cNome PICTURE "@!" VALID vValid( GetActive() ) //<-------------- A mesma função
    @ 14,10 SAY "Salar. : " GET nSal PICTURE "@RE 999,999.99" VALID vValid( GetActive() ) //<-------------- A mesma função
    READ
    
    IF LASTKEY() <> K_ESC
        ? cCodigo
        ? cNome
        ? nSal
    ELSE
        ALERT("CANCELEI")
    ENDIF
    
RETURN

//-------------------------------------------------------------------------------    
/* AQUI CENTRALIZO AS VALIDAÇÕES */
STATIC FUNCTION vVALID( oGet )

   LOCAL xVar, cMessage := ""
   
   xVar := oGet:varGet()
   
   SWITCH Upper( oGet:name() )
      CASE "CCODIGO"   // mesma validação para os campos código e nome
      CASE "CNOME"     // mesma validação para os campos código e nome
         IF EMPTY( xVar )
            cMessage := "Informe um valor válido para este campo"
         ENDIF
         EXIT
      CASE "NSAL"
         IF xVar <= 0
            cMessage := "Informe um valor válido para o salário"
         ELSE
            IF xVar < 1000
               cMessage := "Esse valor é muito baixo"
            ENDIF
         ENDIF
         EXIT
   END
   
   If ! Empty( cMessage )
      Alert( cMessage )
   Endif
   
RETURN Empty( cMessage )
//-------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

FOR EACH pra GET

Mensagem por Vlademiro »

Ficou muito bom mesmo.
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 pra GET

Mensagem por JoséQuintas »

Estou estranhando isso.
Faça um teste.

Código: Selecionar todos

@ 1, 2 GET vCliente VALID ValidacaoGeral()
...

FUNCTION ValidacaoGeral()

   LOCAL oGet := GetActive()
...
E dependendo do resultado, se usa isso sempre, altera a GETSYS pra fazer isso e pronto.
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 pra GET

Mensagem por JoséQuintas »

Aproveitando....

Uma coisa que achei interessante no Visual Basic 6, é que se usar array para os textbox, a validação é única.

Algo do tipo:

Código: Selecionar todos

@ 1, 0 GET aVar[1]
@ 2, 0 GET aVar[2]
@ 3, 0 GET aVar[3]

FUNCTION aVar_Valid( nIndex )
A função Valid é automática, vinculada ao nome do campo, que se for array é único.
No caso do Visual Basic 6, eu colocava no campo equivalente ao "cargo" da GETSYS, as definições de tipo, picture, e se era vinculado a alguma tabela.
Nesse caso, nem importava o nome do textbox/get, só mesmo a forma de fazer validação.
Por exemplo, indicar CNPJ, e isso já fazia usar a rotina de validação de CNPJ, ou indicar cliente e já validar o código de cliente.

Pense nisso também: pra que uma rotina cheia de DO CASE pra decidir a validação, se pode usar OkCliente(), OkCnpj(), OkProduto(), etc. e já evita erro e já vai diretamente na validação que precisa.
Passei por essas fases, depois cheguei nas classes de cadastro, e cada uma já tem sua rotina de validação.
ClienteClass():Valida( nCodigoCliente, lAceitaZero, lMostraNome )
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