Clipper On Line • Ver Tópico - FOR EACH pra GET

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

 

FOR EACH pra GET

Mensagempor JoséQuintas » 20 Ago 2020 17:17

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:

   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:

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

FOR EACH pra GET

Mensagempor JoséQuintas » 20 Ago 2020 17:39

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

   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

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

FOR EACH pra GET

Mensagempor Vlademiro » 21 Ago 2020 00:24

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 :


#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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

FOR EACH pra GET

Mensagempor Vlademiro » 21 Ago 2020 00:26

Assim foi o máximo que consegui :

  
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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

FOR EACH pra GET

Mensagempor JoséQuintas » 21 Ago 2020 09:04

Eu parti pra outro lado:

@ 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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

FOR EACH pra GET

Mensagempor JoséQuintas » 21 Ago 2020 17:14

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

SET KEY K_F10 TO Pesquisa


E na rotina de pesquisas, é o browse conforme a variável

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.
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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

FOR EACH pra GET

Mensagempor alxsts » 22 Ago 2020 00:16

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

#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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

FOR EACH pra GET

Mensagempor Vlademiro » 22 Ago 2020 03:36

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

Obrigado.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

FOR EACH pra GET

Mensagempor alxsts » 22 Ago 2020 19:25

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:
#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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

FOR EACH pra GET

Mensagempor Vlademiro » 22 Ago 2020 22:16

Ficou muito bom mesmo.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

FOR EACH pra GET

Mensagempor JoséQuintas » 23 Ago 2020 10:55

Estou estranhando isso.
Faça um teste.

@ 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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

FOR EACH pra GET

Mensagempor JoséQuintas » 23 Ago 2020 11:10

Aproveitando....

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

Algo do tipo:
@ 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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 22 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro