Página 1 de 3

Navegar entre GET´s

Enviado: 28 Mai 2007 08:02
por ederxc
Bom dia amigos , estou com um pequeno probleminha , tenho uma tabela cujo cada get tem uma rotina de pesquisa em um *.dbf diferente e funciona normalmente porem ñ esta de um jeito que eu diria muito funcional , pois a cada get sou obrigado a executar um read pois este get esta dentro de um questionamento e apos sua execução ñ posso voltar a ele e altera-lo em TEMPO REAL , ou seja ,se o usuario errar e perceber o erro no modo de lançamento só podera alterar depois de ter gravado esses dados o DB goataria de saber se ha uma forma mais coerente de fazer isso , logo abaixo segue parte do fonte para melhor entendimento deste modulo ...


Código: Selecionar todos

SELE C
   DO WHILE  VFORN <> COD .or. VFORN=0   
      @09,14 GET VFORN  PICT '999' COLOR('w+/b') 
      READ
      IF EMPTY(VFORN)
         SAVE SCREEN
         PESQFOR()     //menu com pesquisa por nome em um Dbedit()
      ENDIF
      SET ORDER TO 1
      REST SCREEN
      IF DBSEEK(VFORN) //aqui restorna da função o codigo          
         VFORN=COD
         VMOSTFORN=FORN
         @09,14 SAY STRZERO(VFORN) PICT '999' COLOR('GR+/B')
         @09,19 SAY VMOSTFORN  PICT '@!'  COLOR('GR+/B')
      ELSE
         ALERT('FORNECEDOR NAO CADASTRADO',,'N/GB')
         LOOP
      ENDIF
   ENDDO      
   DO WHILE  VPROD=0 
      SELE D          
      SELE A
      SET ORDER TO 1
      VPROD=0
      DO WHILE VPROD <> COD .OR. VPROD=0
         @10,11 GET VPROD  PICT '9999999999999'  COLOR('GR+/B')
         READ
         IF EMPTY(VPROD)
            SAVE SCREEN
            PESQPROD()  //menu com pesquisa por nome em um Dbedit()
         ENDIF
         SET ORDER TO 1            
             rest screenn
         IF DBSEEK(VPROD) //aqui restorna da função o codigo                   
             VPROD=COD
             VMOSTPROD=DESC
             @10,11 SAY STRZERO(VPROD) PICT '9999999999999'  
             @10,27 SAY VMOSTPROD  PICT '@!'       COLOR('GR+/B')             
          ELSE
            ALERT('PRODUTO NAO CADASTRADO',,'N/GB')
            LOOP
          ENDIF
       ENDDO
Creio que haja uma forma mais simples de fazer isso

Enviado: 28 Mai 2007 13:50
por Pablo César
Oi Eder !

Para que seja possível a navegação entre GETs, você terá que levar em conta que DEVE ser feito TODOS os GETs em sequência logo após utilizar apenas UM "READ". As validações você deverá fazé-las em cada GET através de uma função que verifique e valide tal GET especificamente. Nessa função, talvez você precise pesquisar em outro DBF e dar a mensagem ao usuário que tal código não foi encontrado !. Mas lembre que antes de retornar ao GET, você deva se posicionar na área em que estava e no registro que estava (e na ordem que estava também).

Para os casos que você deseje exibir outra tabela (digamos que queira exibir o nomes dos clientes no GET onde o usuário deveria colocar o código do cliente (mas o usuário não lembra), este recurso você faz no mesmo GET no parâmetro WHEN e chamar uma função que exiba e retorne ao GET (mas com o mesmo cuidado que no VALID, ao retornar).

Você captou, colega ?

Um clip-abraço :)Pos

Enviado: 28 Mai 2007 14:08
por Pablo César
Baseado no seu código, veja o exemplo:

Código: Selecionar todos

VFORN:=0
VPROD:=0
SETKEY(-1,{|V1,V2,V3|PESQFOR(V1,V2,V3)}) // utilizo o F2 para chamar a funcao
MENSAGEM("Coloque o c¢digo do fornecedor ou <F2>")
@ 09,14 GET VFORN  PICT '999' COLOR('w+/b') VALID VQFORN(VFORN)
@ 10,11 GET VPROD  PICT '9999999999999'  COLOR('GR+/B') VALID VQPROD(VPROD)
READ


FUNCTION VQFORN(VFORN)
IF VFORN=0
   RETURN .T.
ENDIF
VQSEL1:=SELECT()
VQORD1:=INDEXORD()
VQREC1:=RECNO()
SELE 1
SET ORDER TO 1
SEEK STR(VFORN,3,0)
IF FOUND()
   VCOD:=STRZERO(1->COD,3,0)
   VRET:=.T.
   @ 09,19 SAY (1->MOSTFORN) PICT '@!'  COLOR('GR+/B')
ELSE
   VCOD:=""
   // ALERT('FORNECEDOR NAO CADASTRADO',,'N/GB') // nao utilize o ALERT
   MENSAGEM("Fornecedor nao cadastrado !",3)
   VRET:=.F.
ENDIF
SELECT(VQSEL1)
SET INDEX TO VQORD1
GOTO VQREC1
KEYBOARD VCOD
RETURN VRET

FUNCTION VQPROD(VPROD)
IF VPROD=0
   RETURN .T.
ENDIF
VQSEL2:=SELECT()
VQORD2:=INDEXORD()
VQREC2:=RECNO()
SELE 2
SET ORDER TO 1
SEEK STR(VPROD,3,0)
IF FOUND()
   VCOD:=(2->COD)
   VRET:=.T.
   @ 09,19 SAY (2->MOSTPROD) PICT '@!'  COLOR('GR+/B')
ELSE
   // ALERT('PRODUTO NAO CADASTRADO',,'N/GB') // nao utilize o ALERT
   MENSAGEM("Produto nao cadastrado !",3)
   VRET:=.F.
ENDIF
SELECT(VQSEL2)
SET INDEX TO VQORD2
GOTO VQREC2
RETURN VRET
Este é o conceito básico. Lembre que o conceito de chamar funções nas versões 5.0 do Clipper ou maiores, você pode obter retornos e passar parâmetros.

Um clip-abraço :)Pos

Enviado: 28 Mai 2007 14:25
por ederxc
// ALERT('FORNECEDOR NAO CADASTRADO',,'N/GB') // nao utilize o ALERT
Não entendi o por que de ñ usar o alert "ñ saio de casa sem ele" qual a vantagem de trocar por mensagem , nunca usei este recurso ! ´o)

Enviado: 28 Mai 2007 15:15
por ederxc
Para os casos que você deseje exibir outra tabela (digamos que queira exibir o nomes dos clientes no GET onde o usuário deveria colocar o código do cliente (mas o usuário não lembra), este recurso você faz no mesmo GET no parâmetro WHEN e chamar uma função que exiba e retorne ao GET (mas com o mesmo cuidado que no VALID, ao retornar).

WHEN ñ tem no NG , como funciona , tem algum exemplo deste recurso tabem ?

Enviado: 28 Mai 2007 16:14
por Eolo
WHEN é um argumento do GET, e funciona como pré-validação.

No exemplo...
@10,10 get quantidade
@10,12 get preco when usuario=="EDER"
read
... só é dado GET no preço se o usuário for o "Eder".

Enviado: 28 Mai 2007 16:29
por ederxc
beleza Eolo entendi perfeitamente ! Obrigado ...

Enviado: 28 Mai 2007 18:00
por Augusto
Eolo escreveu:@10,10 get quantidade
@10,12 get preco when usuario=="EDER"
read
Eolo... funcionaria se nesse exemplo fosse:

Código: Selecionar todos

@10,10 get quantidade
@10,12 get preco when quantidade==10
??

Enviado: 28 Mai 2007 18:06
por Maligno
Se você analisar o PPO do fonte, verá que a cláusula WHEN será traduzida para um bloco de código, que será avaliado pelo comutador de campos do sub-sistema de GETs. Logo, a resposta à sua pergunta é sim. O seu WHEN será avaliado on-the-fly normalmente.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 28 Mai 2007 19:05
por Augusto
All right Mailigno... Thank you very much....

Enviado: 28 Mai 2007 19:26
por Eolo
Vc pode até usar funções no WHEN e várias condições...

Código: Selecionar todos

*...
@10,10 get quant
@11,10 get unit
@12,10 get desc when (domingo() .and. quant>100 .and. cli=="ZÉ")
read

* dá GET no DESCONTO só se for domingo,
* a quantidade for maior que 100 e
* o cliente for o "ZÉ"
* ...

Código: Selecionar todos

function domingo
a=iif(dow(date())=1,.t.,.f.)
retu a

Enviado: 28 Mai 2007 19:43
por Maligno
Complementando seu complemento, Eolo: muita gente usa WHEN para apresentar uma mensagem de auxílio sensível ao contexto, usando uma função qualquer que sempre retorna TRUE.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 28 Mai 2007 20:05
por Eolo
Maligno,
É mais ou menos o que eu faço, só não postei pra não complicar...

Augusto,
Aí vai um exemplo, bem simples: na medida em que vc navega entre os GETs, diferentes mensagens vai sendo mostradas na última linha.

Código: Selecionar todos

@10,10 get quant when pfs("Digite a quantidade")
@12,10 get prod when pfs("Tecle F2=Lista de Produtos")
@11,10 get unit when pfs("Digite o preço unitário")
read

function pfs(a)
@24,0 say pad(a,80)
retu .t.

Re: Navegar entre GET´s

Enviado: 28 Mai 2007 20:52
por janio
ederxc escreveu: Creio que haja uma forma mais simples de fazer isso
Olá,

Eu utilizo GET com DO WHILE's aninhados. Dessa maneira, ao teclar ESC sempre volta para o GET anterior. Veja:

Código: Selecionar todos

   BEGIN SEQUENCE
   DO WHILE .T.
   @ li+04,ci+15 GET vCIDADE PICT "@!" VALID EXGVLR(vCIDADE) .AND. BlqAcento(vCIDADE)
   READ

      IF LASTKEY() = 27
         EXIT
      ENDIF

   DO WHILE .T.
   @ li+06,ci+15 GET vESTADO PICT "@!" valid CONF_EST(vESTADO)
   READ

       IF LASTKEY() = 27
          EXIT
       ENDIF

    DO WHILE .T.
    @ li+08,ci+15 GET vPOPULA PICT "@E 99,999,999" valid (!empty(vPOPULA))
    READ

        IF LASTKEY() = 27
           EXIT
        ENDIF

    BREAK
    ENDDO
    ENDDO
    ENDDO
    ENDSEQUENCE

    IF LASTKEY() = 27
       RESTORE SCREEN FROM P16CCID
       LOOP
    ENDIF
Jânio

Enviado: 29 Mai 2007 08:50
por ederxc
Pessoal , seria possivel dentro de minha função de pesquisa haver outro Get?

Pois acho que é ae que estou "comendo bronha" . Dentro de minha função existe um get para pesquisar por nome e retonar o codigo ou seja se caso o usuario esqueça o codigo "ele sempre esquece" ele pesquisaria por nome e é por isso a necessidade de mais um get na função.


Minha duvida , o valid apenas valida um bloco de instruções para o get a que ele se refere , ou seria possivel um segundo get dentro da função e eu estrou fazendo coisa errada ?





:)´