Como utilizar a clausula Valid campo a campo com Vetores

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

rangelssilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 27 Jul 2007 15:24
Localização: São Paulo - SP

Como utilizar a clausula Valid campo a campo com Vetores

Mensagem por rangelssilva »

Boa NOite, Amigos Programadores.


Estava esses dias em cassa desenvolvendo algo mais ou menos assim: UMa funcao recebe um monte de vetores que mostram os gets/ read na tela para entrada de dados. Até aí sem problemas. So que na hora de validar os dados estou tendo um problema. na Função Pesq_Val_Dbf eu preciso que ao validar o codigo a funcao somente valide o proximo campo assim que eu ter digitado os dados referente ao campo anterior. E assim sucessivamente, para que por exemplo ao validar um campo a função nao passe para o proximo e fique mostrando (Mensagens) / testando (Clausula valid) para um monte de campos na hora errada (Tudo d euma vez). Cada campo deve ser verificado no momento da digitacao.....O objetivo final d afunÇão e atribuir um vetor que possui o nome do dbf para verificar cada conteudo dos campos atraves do dbf(Fazer teste de consistencia) e assim sucessivamente.....Não sei se fui claro....A função esta parcialmente completa.. SO falta ajustar como ele vai validar no momento certo campo a campo (So depois que o usuario digitar )...ALguem tem alguma sugestão......

Desde ja agradeço a paciencia......
Abração pessoal....

Código: Selecionar todos

// Procedimento para mostrar os campos e receber a entrada
// de dados de cada variavel
Function Mostra_Var(Vet_Variaveis,Vet_Var_Label,Vet_Var_Pict,Lin1,Col1,UltLin,PuloCol)

        local PrimeiraLinha,cont

        PrimeiraLinha=Lin1

        for cont=1 to len(Vet_Variaveis)

                // Caso a variavel nao tenha nome/ Label
                // A mesma recebe um nome padrao
                // Utilizado na sua declaracao
                // isso evita erro de acesso no vetor
                // Bound array error access
                If empty(Vet_Var_Label[cont])

                 //  aadd(Vet_Var_label,"varmen:")
                     Vet_Var_Label[cont]:="Varmen:"
            
                endif

                // Caso o vetor de pictures seja vazio
                // Adiciona-se uma mascara padrao
                // a fim de evitar erros de acesso no vetor
                // de mascaras
                //20/03/2010
                // Obs: Sera preciso verificar a existencia da posicao
                // no vetor para acabar com o Bound error caso a posicao
                // nao exista.
                if empty(Vet_Var_Pict[cont])

                   //  ains(Vet_var_label,cont)

                        aadd(Vet_Var_Pict,"")
                  //    Vet_Var_Pict[cont]:="@!"

                endif

// O problema e aqui????? Na clausula VAlid com chamada da função:

                @ Lin1,Col1 say Vet_Var_Label[cont] get Vet_variaveis[cont] Pict Vet_Var_Pict[cont];
                Valid Pesq_val_dbf(Vetnomedbf,VetnomeIndice,1,len(Vet_variaveis),Vet_variaveis[cont-1],Cont-1)=-1
           //     inkey(0)
                lin1++

                // se a linha for a ultima deve-se iniciar
                // da primeira linha aumentando a coluna
                // Efeito de pagina‡Æo a fim de evitar cortes
                if lin1=UltLin

                        Lin1=PrimeiraLinha
                        Col1=col1+PuloCol
                    
                endif

              //  @ 5,30 say cont
              //  inkey(0)

        next cont

Return(Vet_variaveis)


// Funcao auxiliar para procurar o valor de um campo dentro dos Dbfs
// Os dbfs estao dentro de um vetor, assim com os indices
// Com ela e possivel escolher a posicao inicial e posicao final e assim
// restringir quais dbfs serao utilizados para um valid por exemplo
Static Function Pesq_Val_Dbf(Vet_Nome_DBF,Vet_Nome_indice,Num_Dbf_Inic,Num_DBf_Fin,Pesq_Val,Num)


       Local Val_Encontrado,cont

      // cont=Num
      cont=1

       @ 5,5 say inkey()
       do while cont<13
       // for cont=Num_Dbf_Inic to Num_Dbf_Fin
                    
                     @ 1,1 say vetVar[cont]
                     @ 2,1 say Vet_Nome_dbf[cont]
                     @ 3,1 say Vet_Nome_indice[cont]
                     @ 1,30 say cont
                 //    @ 5,5 say pesq_val[1]

                // Caso a posicao no vetor seja vazia a procura nao deve
                // ser realizada, pois deve-se abrir um Dbf que exista
                // e nao com nome inexistente po posicao em branco
                if !empty(Vet_Nome_dbf[cont]) .or. !empty(Vet_Nome_dbf[cont])

                        Use &(Vet_Nome_dbf[cont]) index &(Vet_Nome_indice[cont])

                        dbgotop()

                        seek VetVar[cont]

                        if found()

                                Val_Encontrado=0
                                alert("Valor encontrado")
                              //  exit

                        elseif .not. found()  

                                Val_Encontrado=-1
                                alert("Valor Nao encontrado")
                              //  exit
                                
                        endif

                endif

      
      cont++

      enddo

      //  next cont
return(Val_Encontrado)

---
Nota da Moderação (Maligno):
A presente mensagem teve de ser editada para a inclusão das tags de indentação de código, necessárias para uma melhor compreensão do código fonte. Por favor, futuramente, não se esqueça de incluir essas tags. Avaliar o código alheio já é uma tarefa ingrata, que se torna muito mais difícil sem a devida indentação.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Como utilizar a clausula Valid campo a campo com Vetores

Mensagem por alxsts »

Olá!

[Rangel]:

Li duas vezes o enunciado da tua questão mas creio não ter entendido o suficiente.

Por favor:
- tente explicar de forma mais clara.
- poste o teu código entre as tags Code que aparecem na porção superior da janela de postagem. Mesmo entre estas tags, indente o código. Isto é regra do fórum. Se não seguida, terá sua mensagem editada por um moderador.

Desta forma, você ajudará a todos os que analisarem o teu problema e, consequentemente, a si mesmo.


Nota:
Esta mensagem foi escrita enquanto a mensagem do OP era editada pelo moderador Maligno.
[]´s
Alexandre Santos (AlxSts)
rangelssilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 27 Jul 2007 15:24
Localização: São Paulo - SP

Re: Como utilizar a clausula Valid campo a campo com Vetores

Mensagem por rangelssilva »

Boa Tarde, Amigos programadores......


Com relação ao ajuste no codigo fonte que postei vou ser mais objetivo e claro.
Vou direto a ponto.Tenho uma funÇão que através de varios vetores com nomes
das variáveis de memória, "Label" ,picture , monta meus Gets/Read na tela para entrada de dados como a seguir.(FunÇão mostra_var)

Até aí tudo bem......Ao girar dentro do comando "for" ela monta a tela
as variáveis para entrada de dados. no valid "Pesq_val_dbf" (Cada nome de dbf sera associado a uma variável de memoria para pesquisa) ou seja, para ver se o valor da variavel de memoria esta dentro do DBF( Comando Seek).
Resumindo cada Variavel de memoria esta relacionada a um dbf pela posicao de cada elemento do vetor. COm isso a funcao e generia para mostrar "1 ou 1000 variaveis na tela." (Controla tudo Gets /Read, picts, Valid, etc)

Meu problema está na função Pesq_val-Dbf() que antes de mais nada explicarei o funcionamento.

Ela recebe vetores com nomes de
Dbfs,Indices,e Valor a
ser procurado
que no caso e um vetor contendo 13 variaveis de memoria.
OU seja cada Dbf, indice, picture, "Label"
esta relacionado a uma variavel de memoria (Que estao guardadas
dentro de um vetor cada uma). Ou seja tudo da posicao 1 de todos os vetores
pode estar relaiconado a uma variavel codigo, da segunda posicao endereço, da terceira cep e assim sucessivamente. Então meus vetores devem ser preenchidos obecendo esse criterio....Tudo na ordem

O porblema real é que depois que a tela foi contruida e estou digitando os dados de entrada acontece o seguinte:

Estou entrando com os dados da primeira variavel. O cont=1, valida a mesma sem problemas.
Ao chegar na segunda eu nao consigo fazer a validacao, porque? POrque utilizei o comando
"exit" e o mesmo sai do "For/Next" e o cont continua igual a 1. Resumindo a variável "cont" deveria ser igual a 2 para que a segunda variavel seja validada de acordo com o nome Dbf que está na posição 2 do vetor. Quando chego na terceira o "cont" deve ser igual a 3 para que o terceiro campo seja validado de acordo com o dbf que esta na terceira posicao do vetor e assim sucessivamente.

O problema e que se eu apagar o comando "exit" o controle acaba fazendo o teste ate a ultima
variavel de memoria, enquanto estou ainda entrando com valores da
primeira variavel. Ou seja perde o controle. Sai atropelando tudo...
Não tenho ideia de como solucionar.
A idéia aqui é fazer com que a funÇão mesmo com o comando exit, volte a operar
somente depois que eu digitei os dados do primeiro campo e assim sucessivamente.
Será que DEu pra entender.....?
Alguem teria alguma sugestão....??????/


Ao preencher o primeiro campo a validacao acontece sem problemas

Código: Selecionar todos

// Procedimento para mostrar os campos e receber a entrada
// de dados de cada variavel
Function Mostra_Var(Vet_Variaveis,Vet_Var_Label,Vet_Var_Pict,etc)


	Local Cont


	For cont=1 to len(Vet_Variaveis)


		@ Lin1,Col1 say Vet_Var_Label[cont] get Vet_variaveis[cont];
		Pict Vet_Var_Pict[cont] Valid Pesq_val_dbf (Vetnomedbf,VetnomeIndice,
		1,len(Vet_variaveis),Vet_variaveis[cont-1],Cont-1)=-1


	next cont


Return(Ve_Variaveis)

// Funcao auxiliar para procurar o valor de um campo dentro dos Dbfs
// Os dbfs estao dentro de um vetor, assim como os indices 
Static Function Pesq_Val_Dbf(Vet_Nome_DBF,Vet_Nome_indice,Pesq_Val)


      Local Val_Encontrado,cont

      // cont=Num
      cont=1

       
      for cont=1 to 13                    
              // Parte destinada ao meu controle depois sera apagada
              -----------------------------------------------------
              @ 1,1 say vetVar[cont]
              @ 2,1 say Vet_Nome_dbf[cont]
              @ 3,1 say Vet_Nome_indice[cont]
              @ 1,30 say cont
              --------------------------------------------------------
 
                // Caso a posicao no vetor seja vazia a procura nao deve
                // ser realizada, pois deve-se abrir um Dbf que exista
                // e nao com nome inexistente por causa da  posicao em branco 
                // do vetor
                if !empty(Vet_Nome_dbf[cont]) .or. !empty(Vet_Nome_dbf[cont])

                        Use &(Vet_Nome_dbf[cont]) index &(Vet_Nome_indice[cont])

                        dbgotop()

                        seek VetVar[cont]

                        if found()

                                Val_Encontrado=0
                                alert("Valor encontrado")
                                exit

                        elseif .not. found()  

                                Val_Encontrado=-1
                                alert("Valor Nao encontrado")
                                exit
                                
                        endif

                endif

      
                cont++


      next cont

return(Val_Encontrado)
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Como utilizar a clausula Valid campo a campo com Vetores

Mensagem por Toledo »

Rangel, eu só acho estranho você colocar no GET uma matriz...

Código: Selecionar todos

get Vet_variaveis[cont]
Acho que você deveria trocar por uma macro.

Código: Selecionar todos

gMacro:=Vet_variaveis[cont]
@ Lin1,Col1 say Vet_Var_Label[cont] get &gMacro.;
Pict Vet_Var_Pict[cont] Valid Pesq_val_dbf (Vetnomedbf,VetnomeIndice,1,len(Vet_variaveis),Vet_variaveis[cont-1],Cont-1)=-1
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Responder