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É"
* ...
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 ?

´