Por que nao funciona Macro em code Block?
Moderador: Moderadores
- juniorcamilo
- Usuário Nível 3

- Mensagens: 343
- Registrado em: 10 Nov 2006 09:12
- Localização: Pará
Por que nao funciona Macro em code Block?
Qual a razao de nao funcionar Macro substituicao dentro de um Code Block?
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Macro em code Block
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 ?
Se você se refere a macro em code blocks, eu acho que é possível. Você poderia postar o seu exemplo ?
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
Ademir
- Usuário Nível 3

- Mensagens: 170
- Registrado em: 31 Jul 2007 16:28
- Localização: Porto Ferreira-SP
Re: Por que nao funciona Macro em code Block?
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:
Agora pergunto:
Tem alguma forma de se fazer isso usando code blocks ?
[]s.
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.
Tem alguma forma de se fazer isso usando code blocks ?
[]s.
-
MARCELOG
- Usuário Nível 4

- Mensagens: 546
- Registrado em: 15 Mar 2005 16:54
- Localização: Divinópolis/MG
Re: Por que nao funciona Macro em code Block?
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
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
Água mole em pedra dura tanto bate que até espirra!
-
Ademir
- Usuário Nível 3

- Mensagens: 170
- Registrado em: 31 Jul 2007 16:28
- Localização: Porto Ferreira-SP
Re: Por que nao funciona Macro em code Block?
Queria entender como validar um get usando um code block sem precisar usar UDFs, se é que isso é possível.
- juniorcamilo
- Usuário Nível 3

- Mensagens: 343
- Registrado em: 10 Nov 2006 09:12
- Localização: Pará
Re: Por que nao funciona Macro em code Block?
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...
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...
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])}[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
Ademir
- Usuário Nível 3

- Mensagens: 170
- Registrado em: 31 Jul 2007 16:28
- Localização: Porto Ferreira-SP
Re: Por que nao funciona Macro em code Block?
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.
@ 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.
-
ricardomouramarques
- Usuário Nível 1

- Mensagens: 13
- Registrado em: 19 Out 2007 00:41
- Localização: Minas Gerais
- Contato:
Re: Por que nao funciona Macro em code Block?
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:
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

Desse jeito não funciona mesmo. Você não está alterando o conteúdo da variável nome. Faça uma atribuição direta: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
Código: Selecionar todos
@ l,c get codigo pict ´999´ valid eval({||nome := "BANCO DO BRASIL S.A.",.T.})[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
ricardomouramarques
- Usuário Nível 1

- Mensagens: 13
- Registrado em: 19 Out 2007 00:41
- Localização: Minas Gerais
- Contato:
Re: Por que nao funciona Macro em code Block?
Solucionando o problema acima: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
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

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.
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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
ricardomouramarques
- Usuário Nível 1

- Mensagens: 13
- Registrado em: 19 Out 2007 00:41
- Localização: Minas Gerais
- Contato:
Re: Por que nao funciona Macro em code Block?
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.

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. 
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
