Por que nao funciona Macro em code Block?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
juniorcamilo
Usuário Nível 3
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?

Mensagem por juniorcamilo »

Qual a razao de nao funcionar Macro substituicao dentro de um Code Block?
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Macro em code Block

Mensagem 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 ?
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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'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!
Ademir
Usuário Nível 3
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?

Mensagem 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.
MARCELOG
Usuário Nível 4
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?

Mensagem 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
Água mole em pedra dura tanto bate que até espirra!
Ademir
Usuário Nível 3
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?

Mensagem por Ademir »

Queria entender como validar um get usando um code block sem precisar usar UDFs, se é que isso é possível.
Avatar do usuário
juniorcamilo
Usuário Nível 3
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?

Mensagem 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...
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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])}
[]'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!
Ademir
Usuário Nível 3
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?

Mensagem 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.
ricardomouramarques
Usuário Nível 1
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?

Mensagem 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
 
Imagem
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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?
[]'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!
ricardomouramarques
Usuário Nível 1
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?

Mensagem 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.
Imagem
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'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!
ricardomouramarques
Usuário Nível 1
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?

Mensagem 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.
Imagem
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'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!
Responder