Página 1 de 2
Por que nao funciona Macro em code Block?
Enviado: 03 Jul 2008 06:56
por juniorcamilo
Qual a razao de nao funcionar Macro substituicao dentro de um Code Block?
Macro em code Block
Enviado: 03 Jul 2008 08:44
por Pablo César
Junior, você é mesmo de poucas palavras... daria para exemplificar o que você está dizendo, por favor ?.
Se você se refere a macro em code blocks, eu acho que é possível. Você poderia postar o seu exemplo ?
Enviado: 03 Jul 2008 10:18
por Maligno
Se bem entendi o que ele quis dizer, não pode ser feito dentro de um bloco de código. Mas o ideal seria ter um exemplo do que precisa ser feito.
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 08:19
por Ademir
Bom dia amigos !
Aproveitando o assunto "Code Blocks" queria dizer que nunca usei tal recurso. Mas estive pesquisando um pouco e me interessei em aprender mais sobre o assunto. Por exemplo, vamos dizer que tenho dois gets (CODIGO E NOME). Quero que o get NOME seja preenchido por "BANCO DO BRASIL S.A" toda a vez que o codigo for igual a 1. Como faço hoje:
Código: Selecionar todos
@ l,c get codigo pict ´999´ valid retbanco(codigo,@nome)
@ l,c get nome
read
function retbanco(cod,nom)
if cod = 1
nom="BANCO DO BRASIL S.A."
endi
retu .t.
Agora pergunto:
Tem alguma forma de se fazer isso usando code blocks ?
[]s.
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 08:55
por MARCELOG
Olá amiguinho,
para entender um code block veja a função eval(), que realiza a avaliação/execução do mesmo com os parâmetros passados.
Um code block é como um fragmento de código que pode ser passado e, se você entender a sua dinâmica, não vai deixar de usá-lo em diversas situações.
Dentro de code block não pode ser usado comandos mas apenas funções/procedures.
Ex1:
Procedure main()
local cBloco := '{|x|alert(x)}', bBloco
bBloco := &cBloco // converti um texto num bloco de código
Eval(bBloco,'teste') // avaliei/executei o bloco com o parâmetro
teste(cBloco) // para ser avaliado em outra função/ procedure
Return
Procedure teste(cBloco)
local bBloco
bBloco := &cBloco // converti um texto num bloco de código
Eval(bBloco,'margarida') // avaliei/executei o bloco com outro parâmetro
Return
Viu! Se no lugar da função alert() você tivesse colocado uma chamada a outra função, esta seria realizada com base nos parâmetros recebidos.
Então, você pode criar literalmente um código de programaçã com base em string e mandar executá-lo sem sobrecarga no sistema.
Espero ter ajudado.
MarceloG
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 09:04
por Ademir
Queria entender como validar um get usando um code block sem precisar usar UDFs, se é que isso é possível.
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 12:49
por juniorcamilo
um ex. rapido
aMat0 := {{},{}}
aMat2 := {{},{}}
aMat3 := {{},{}}
i := 1
as matrizes contem registros dentro delas. o cCont muda dependendo da posicao da matriz c for > 4065, somo cCont e vai passando para outras matrizes.
Brow:SkipBlock := {|n| pularegistro(n,@i,Len(aMat&cCont.[1]) }
um teste que quiz fazer dentro de um tBrow usando matriz e tendo muitos registro para mostrar tipo uns 8000 registros...
Enviado: 04 Jul 2008 17:59
por Maligno
Da forma como você quer é impossível, mas há alternativas. Se o esquema for esse, com três matrizes, bote-as dentro de uma só e indexe. Resolve o problema de forma fácil. Exemplo:
Código: Selecionar todos
aMat := {{{},{}},; // aMat0
{{},{}},; // aMat2
{{},{}} ; // aMat3
}
i := 1
a := 1
Brow:SkipBlock := {|n| pularegistro(n,@i,Len(aMat[a][1])}
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 18:33
por Ademir
Boa noite a todos. Cheguei a tentar isso mas ainda nao funciona:
@ l,c get codigo pict ´999´ valid eval({|x,y| y=´BANCO DO BRASIL S.A.´,.t.},codigo,@nome)
@ l,c get nome
read
O campo nome continua em branco, mesmo passando a variavel por referencia. Não sei se o que fiz está certo, pois como disse, nunca usei code blocks.
[]s.
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 18:50
por ricardomouramarques
Ademir,
Veja, o preprocessador já cria um bloco de código com a expressão que você passa após o VALID. O que está acontecendo é que ele está colocando o seu bloco de código dentro de outro bloco de código.
Basta fazer como o exemplo abaixo que dará certo:
Código: Selecionar todos
cls
nCod := 0
cNome := space(40)
Set Message to 23 CENTER
DO WHILE LASTKEY() <> 27
@ 10,10 say "codigo " Get nCod picture "9999";
Valid ( cNome := "Banco do Brasil", .t. )
@ 12,10 say "nome " Get cNome picture "@!";
read
ENDDO
Enviado: 04 Jul 2008 19:00
por Maligno
Ademir escreveu:Código: Selecionar todos
@ l,c get codigo pict ´999´ valid eval({|x,y| y=´BANCO DO BRASIL S.A.´,.t.},codigo,@nome)
@ l,c get nome
read
Desse jeito não funciona mesmo. Você não está alterando o conteúdo da variável nome. Faça uma atribuição direta:
Código: Selecionar todos
@ l,c get codigo pict ´999´ valid eval({||nome := "BANCO DO BRASIL S.A.",.T.})
Mas fica a pergunta: pra quê criar uma complicação extra com bloco de código, se você poderia simplesmente utilizar uma função? Não acha que seria bem mais fácil?
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 19:20
por ricardomouramarques
Bom dia amigos !
Aproveitando o assunto "Code Blocks" queria dizer que nunca usei tal recurso. Mas estive pesquisando um pouco e me interessei em aprender mais sobre o assunto. Por exemplo, vamos dizer que tenho dois gets (CODIGO E NOME). Quero que o get NOME seja preenchido por "BANCO DO BRASIL S.A" toda a vez que o codigo for igual a 1. Como faço hoje:
Solucionando o problema acima:
Código: Selecionar todos
cls
aBancos := { "Banco do Brasil ", "Caixa Economica Federal"}
nCod := 0
cNome := space(40)
DO WHILE LASTKEY() <> 27
@ 10,10 say "codigo " Get nCod picture "9999";
Valid ( if( nCod <= len(aBancos), cNome := aBancos[nCod], cNome := Space(40) ), .t. )
@ 12,10 say "nome " Get cNome picture "@!";
read
ENDDO
No exemplo acima, vc pode inserir quantas instituições bancárias desejar na matriz "aBancos" sem precisar alterar mais nada no código que dará certo.
Enviado: 04 Jul 2008 19:44
por Maligno
Bom, se for pra fazer o código todo, sugiro o uso de uma matriz bidimensional com os códigos corretos dos bancos e não uma seqüência fixa, que só vai atrapalhar ao invés de ajudar. Exemplo: 104=CEF, 001=BB, 237=Bradesco, etc. Ou seja, o usuário digita 104 e o programa preenche o nome do banco. Caso contrário, como o usuário vai saber que o número 2, por exemplo, se refere à CEF?
Mas ainda acho mais proveitoso o uso de uma função, justamente por quê uma função de busca desse tipo até poderia ser reutilizada em outro ponto do programa. Bloco de código é muito útil, mas no lugar certo.
Re: Por que nao funciona Macro em code Block?
Enviado: 04 Jul 2008 20:05
por ricardomouramarques
Complementando o que o maligno disse, realmente o melhor é umar função. E pra melhorar, guardar esse dados em um banco de dados ( um dbf ), onde vc digita o código do banco e ele pequisa por esse. Dessa maneira é possivel ediar e inserir novas instituições financeiras pelo proprio sistema, sem a necessidade de ficar alterarando e recompilando o código a cada vez que o cliente resolva trabalhar com um banco qualquer que não estava previsto.
Enviado: 04 Jul 2008 21:09
por Maligno
A alternativa do uso de um DBF é até interessante, mas se for apenas para identificar o banco (nome e número), levando-se em conta que nem são tantos assim, eu ainda prefiro deixar em código mesmo. A busca é mais rápida, é menos código, etc. Mais fácil.
