function & parameter
Moderador: Moderadores
function & parameter
Bom dia amigos !!
Estou com uma grande dificudade
no meu prog tem uma (function) quando ele executa a função beleza mas quando ele retorna da função ele retorna do ponto em que a função foi chamada ... Eu gostaria de saber uma forma de fazer quando ele retornar dessa função dar um (loop) e voltar ao inicio do programa (Do while .t.)
Alguem teria uma sugestão !
e gostaria que alguem me desse alguma esplicação sobre o (parameter ) como funciona onde geralmente é usado ! MUito grato
Estou com uma grande dificudade
no meu prog tem uma (function) quando ele executa a função beleza mas quando ele retorna da função ele retorna do ponto em que a função foi chamada ... Eu gostaria de saber uma forma de fazer quando ele retornar dessa função dar um (loop) e voltar ao inicio do programa (Do while .t.)
Alguem teria uma sugestão !
e gostaria que alguem me desse alguma esplicação sobre o (parameter ) como funciona onde geralmente é usado ! MUito grato
-
Alessandro
- Usuário Nível 3

- Mensagens: 141
- Registrado em: 07 Jul 2004 09:39
- Localização: Santo Antonio da Platina-PR
Veja bem...
1 - Você deve saber se ele continua independente do retorno dessa função. Se ele retorna para o início de qquer maneira então após a execução da função vc deve dar um LOOP, caso queira retornar ao DO WHILE anterior.
Ex.
Do While .t.
Funcao()
loop
enddo
2 - A passagem de parametros pode ser feita da seguinte maneira.
Funcao(cVAR) // Dessa maneira vc passa a variável para a função sem esperar o seu retorno
Funcao(@cVAR) // Dessa maneira vc passa a variável e recebe o seu conteúdo.
Espero ter esclarecido
1 - Você deve saber se ele continua independente do retorno dessa função. Se ele retorna para o início de qquer maneira então após a execução da função vc deve dar um LOOP, caso queira retornar ao DO WHILE anterior.
Ex.
Do While .t.
Funcao()
loop
enddo
2 - A passagem de parametros pode ser feita da seguinte maneira.
Funcao(cVAR) // Dessa maneira vc passa a variável para a função sem esperar o seu retorno
Funcao(@cVAR) // Dessa maneira vc passa a variável e recebe o seu conteúdo.
Espero ter esclarecido
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinhos
Só corrigindo o código postado pois o mesmo deixara voce num loop travado.
ou
Um DO..WHILE já é um loop e se voce estiver usando uma tabela o melhor é:
@braços :?)
Só corrigindo o código postado pois o mesmo deixara voce num loop travado.
Código: Selecionar todos
Do While .t.
if Funcao() // Se o retorno for o que voce espera
loop
endif
exit // para sair
enddo
Código: Selecionar todos
Do While .t.
if Funcao() // Se o retorno for o que voce espera e quer terminar o
exit // para sair
endif
enddo
Código: Selecionar todos
Do While .not. eof()
if Funcao() // Se o retorno for o que voce espera e quer terminar o
exit // para sair
endif
if .not. Funcao() // Se o segundo teste nao retornou seu dado
// Execute aqui outro código em outra tabela por exemplo e retorne
loop // para voltar sem pular para o proximo registro
endif
skip
enddo
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
-
Alessandro
- Usuário Nível 3

- Mensagens: 141
- Registrado em: 07 Jul 2004 09:39
- Localização: Santo Antonio da Platina-PR
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
"Reconhecer um erro é sinal de grande sabedoria."
Eu também erro, e muitas vezes em minhas posatagens eu fico corrigindo o que coloquei pra num dá zebra.
Quando vc postou seu código voce apenas colocou uma alusão ao que o outro colega poderia fazer e ai o resto ficava por conta dele, vc agiu correto.
Mas como uma base de conhecimento este fprum graças a Deus tem muito em experiencia, de todos nós.
@braços :?)
"Reconhecer um erro é sinal de grande sabedoria."
Eu também erro, e muitas vezes em minhas posatagens eu fico corrigindo o que coloquei pra num dá zebra.
Quando vc postou seu código voce apenas colocou uma alusão ao que o outro colega poderia fazer e ai o resto ficava por conta dele, vc agiu correto.
Mas como uma base de conhecimento este fprum graças a Deus tem muito em experiencia, de todos nós.
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Rocinha
O Prog funciona da seguinte forma irei digitar a chave (dbseek) se ele acha no banco de dados ele chama a função e mostra na tela o lançamento da pesquisa se ñ acha da continuidade e abre para cadastro de nova nota fiscal .. no caso ... (me corrijam se estiver errado) seria mais viavel o (loop) pois ñ quero quebrar o (do while) pois se depois de visualizar a nota eu quiser cadastrar uma nova nota fica inviavel sair do prog .. por isso o (loop) no caso seria o mais viavel ...
Mas como sempre digo ... o recipiente de conhecimento ñ tem fim !
garanto que sobre isso ñ vou errar mais ... Vlw pessoal ..
este forum é d+++
Mas como sempre digo ... o recipiente de conhecimento ñ tem fim !
garanto que sobre isso ñ vou errar mais ... Vlw pessoal ..
este forum é d+++
C:\Xharbour\Xdev\Fw\VSX
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Na verdade, programação e nada mais do que automatização de processos e se voce esta viabilizando uma entrada numerica dada pelo usuario erros podem acontecer e com muita frequencia.
Adote a seguinte formula pois vejo que seu usuário esta tendo de digitar numeros na seguencia até conseguir um novo.
Cadastro de notas - esta opção deverá existir sempre para novas notas, e logo na entrada forneca um numero temporario, o de orçamento, ao terminar e confirmar tudo, de aos pedidos e itens o numero de pedido finalmente. Só forneça o numero de nota após a impressão deste pedido.
Manutenção - Esta opção é a mais incorpada de todas pois nela voce colocará um browse para visualizar todos os pedidos cadastrados e as funções periféricas como alterar, deletar, imprimir pedido e imprimir nota, serão acionadas através dele.
Facilite a vida de seu usuário e adquira o conhecimento no formato de programação que voce usará quando migrar para Windows seja lá qual for a linguagem que voce usar.
E por que digo isto:
Voce irá criar procedure e/ou funções externas ao browse e por consequencia quando seus modulos forem crescendo em numero voce só precisara, recortar e colar(metáforicamente falando, os blocos para criar o novo, pois a lógica é a mesma.
Veja:
Funcão Cadastro()
Funcao Manutencao()
Funcão Deleta()
Funcão Altera()
Funcão Pesquisa()
Funcão Imprime()
Estrutura:
Funcão Cadastro()
Funcao Manutencao()
+------------>Funcão Deleta()
+------------>Funcão Cadastro()
+------------>Funcão Pesquisa()
+------------>Funcão Imprime()
Função cadastro:
Function Cadastro( lNovo )
if lNovo
// Se estiver cadastrando coloque .t. em lNovo se for alterar coloque .f.
dbGoBottom()
dbSkip
endif
// Carregue as Variaveis aqui
variavel1 := arquivo->campo1
...
// Faça os GETs aqui
@ ... GET variavel1
...
if lastkey()
// Se não for gravar os dados deixe sair sem alteracoes
exit
endif
// Coloque aqui uma pergunta se deseja mesmo salvar
if LaPregunta() = 'N'
exit
endif
if lNovo
// Se o registro é novo
VariavelDoCodigo := PsqControle( dbf() )
dbAppend()
else
// Se estiver em rede
dbRLock()
endif
// Coloque aqui os REPLACEs
arquivo->campo1 := variavel1
...
return
Como visto somente no final e depois de confirmar o codigo foi salva. esta estrutura é valida para todo o tipo de cadastro é quase que um padrão.
Os reforços ficam por conta dos VALIDs que voce colocara nos GETs principais quanto a verificação de existencia ou não se um certo registro.
Se possivel poste o código em questão para analisarmos, talvez voce não queira altera-lo mas pode ser importante detectar pontos que quando o codigo engordar ficarão quase que impossiveis de fazer manutenção.
@braços :?)
Na verdade, programação e nada mais do que automatização de processos e se voce esta viabilizando uma entrada numerica dada pelo usuario erros podem acontecer e com muita frequencia.
Adote a seguinte formula pois vejo que seu usuário esta tendo de digitar numeros na seguencia até conseguir um novo.
Cadastro de notas - esta opção deverá existir sempre para novas notas, e logo na entrada forneca um numero temporario, o de orçamento, ao terminar e confirmar tudo, de aos pedidos e itens o numero de pedido finalmente. Só forneça o numero de nota após a impressão deste pedido.
Manutenção - Esta opção é a mais incorpada de todas pois nela voce colocará um browse para visualizar todos os pedidos cadastrados e as funções periféricas como alterar, deletar, imprimir pedido e imprimir nota, serão acionadas através dele.
Facilite a vida de seu usuário e adquira o conhecimento no formato de programação que voce usará quando migrar para Windows seja lá qual for a linguagem que voce usar.
E por que digo isto:
Voce irá criar procedure e/ou funções externas ao browse e por consequencia quando seus modulos forem crescendo em numero voce só precisara, recortar e colar(metáforicamente falando, os blocos para criar o novo, pois a lógica é a mesma.
Veja:
Funcão Cadastro()
Funcao Manutencao()
Funcão Deleta()
Funcão Altera()
Funcão Pesquisa()
Funcão Imprime()
Estrutura:
Funcão Cadastro()
Funcao Manutencao()
+------------>Funcão Deleta()
+------------>Funcão Cadastro()
+------------>Funcão Pesquisa()
+------------>Funcão Imprime()
Função cadastro:
Function Cadastro( lNovo )
if lNovo
// Se estiver cadastrando coloque .t. em lNovo se for alterar coloque .f.
dbGoBottom()
dbSkip
endif
// Carregue as Variaveis aqui
variavel1 := arquivo->campo1
...
// Faça os GETs aqui
@ ... GET variavel1
...
if lastkey()
// Se não for gravar os dados deixe sair sem alteracoes
exit
endif
// Coloque aqui uma pergunta se deseja mesmo salvar
if LaPregunta() = 'N'
exit
endif
if lNovo
// Se o registro é novo
VariavelDoCodigo := PsqControle( dbf() )
dbAppend()
else
// Se estiver em rede
dbRLock()
endif
// Coloque aqui os REPLACEs
arquivo->campo1 := variavel1
...
return
Como visto somente no final e depois de confirmar o codigo foi salva. esta estrutura é valida para todo o tipo de cadastro é quase que um padrão.
Os reforços ficam por conta dos VALIDs que voce colocara nos GETs principais quanto a verificação de existencia ou não se um certo registro.
Se possivel poste o código em questão para analisarmos, talvez voce não queira altera-lo mas pode ser importante detectar pontos que quando o codigo engordar ficarão quase que impossiveis de fazer manutenção.
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
rocinha apenas uma duvida !!
quando lanço as notas
cada produto fica gravado dessa forma no banco de dados
000001 vassoura
000001 sabonete
000001 sabão
//etc...
Para pesquisa e visualização de cada nota procuro pela nota junto com o fornecedor como o Sr. havia me indicado a fazer
usando (skip )
Dessa forma na qual estou fazendo funciona ... Mas gostaria de saber do Sr. se esta correto dessa forma ou teria alguma outra forma de gravar no banco de dados !
quando lanço as notas
cada produto fica gravado dessa forma no banco de dados
000001 vassoura
000001 sabonete
000001 sabão
//etc...
Para pesquisa e visualização de cada nota procuro pela nota junto com o fornecedor como o Sr. havia me indicado a fazer
usando (skip )
Dessa forma na qual estou fazendo funciona ... Mas gostaria de saber do Sr. se esta correto dessa forma ou teria alguma outra forma de gravar no banco de dados !
C:\Xharbour\Xdev\Fw\VSX
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Antes de mais nada esqueça o Sr. fica parecendo que tenho 40 anos, mas eu tenho 42, hehehe.
Veja bem:
Voce pode encontrar nos sitemas por aí pelo menos tres formas de controle, de filtragens e de pesquisas, sendo elas, cronológicas, alfabeticas e numéricas.
Ao se desenhar tabelas voce deve pensar na coisa da qual ela ira suportar e posteriormente nos vinculos que ira ter e quais os controles ela disponibilizará, exemplo:
Um arquivo de pedidos poderia ter quais vinculos:
Cronológicos:
Como data de orcamento, data de confirmação(pedido), data de liberação(faturamento), data de emissão(nota) e data de cancelamento, por exemplo.
Alfabéticos:
Se voce guarda o nome do cliente neste arquivo depois poderá fazer uma pesquisa resumo de todos os pedidos de um determinado cliente ou alfabeticamente um total de faturamento.
Numéricos:
Seu arquivo poderá conter numero de orçamento, numero de pedido, numerod de nota fiscal, codigo do cliente, codigo do vendedor, codigo da natureza de operação e ai vai.
Veja que a estrutura de uma venda segue o seguinte padrão:
1 cliente para N pedidos para N itens
Pesando desta forma tanto o arquivo de pedidos como o de itens deve suportear um vinculo direto com o arquivo de clientes, ou seja, deve possuir o campo codigo de cliente para que voce então possa fazer a filtragem e levantamentos dos itens deste cliente bem como deve conter o codigo do pedido para que voce possa filtrar os itens e emitir o pedido ou nota.
Porque voce necessita ter alguns campos em outras tabelas, ou seja, porque itens necessita ter o campo codigo de cliente?
Resposta é simples voce poderá fazer um levantamento de 1 para N do arquivo de itens obtendo assim uma listagem referente a um produto que apresente todos os clientes que o adquiriram.
Portanto os arquivos devem possuir pelo menos estes campos.
clientes - idcliente(cliente)
pedidos - idpedido(pedido), idcliente(cliente)
itens - idpedido(pedido), idcliente(cliente), iditem(produto)
No momento da impressão de uma nota voce fatá a pesquisa por idpedido(pedido) em pedidos e encontrando passara a pesquisar por idpedido(pedido) em itens e encontrando iniciara então a impressão de seus itens.
Espero que neste breve resumo voce tenha sacado que uma tabela precisa ter alguns campos e vinculos que as vezes achamos que não precisa, mas por enquanto sua base de dados é pequena e quando crescer eles ficarão mais evidentes no momento de uma pesquisa detalhada ou relatório.
@braços :?)
Antes de mais nada esqueça o Sr. fica parecendo que tenho 40 anos, mas eu tenho 42, hehehe.
Veja bem:
Voce pode encontrar nos sitemas por aí pelo menos tres formas de controle, de filtragens e de pesquisas, sendo elas, cronológicas, alfabeticas e numéricas.
Ao se desenhar tabelas voce deve pensar na coisa da qual ela ira suportar e posteriormente nos vinculos que ira ter e quais os controles ela disponibilizará, exemplo:
Um arquivo de pedidos poderia ter quais vinculos:
Cronológicos:
Como data de orcamento, data de confirmação(pedido), data de liberação(faturamento), data de emissão(nota) e data de cancelamento, por exemplo.
Alfabéticos:
Se voce guarda o nome do cliente neste arquivo depois poderá fazer uma pesquisa resumo de todos os pedidos de um determinado cliente ou alfabeticamente um total de faturamento.
Numéricos:
Seu arquivo poderá conter numero de orçamento, numero de pedido, numerod de nota fiscal, codigo do cliente, codigo do vendedor, codigo da natureza de operação e ai vai.
Veja que a estrutura de uma venda segue o seguinte padrão:
1 cliente para N pedidos para N itens
Código: Selecionar todos
cliente
|
------------pedido 1
| |
| --------------- iten 1
| --------------- iten 2
| --------------- iten N
|
------------pedido 2
| |
| --------------- iten 1
| --------------- iten 2
| --------------- iten N
|
------------pedido N
|
--------------- iten 1
--------------- iten 2
--------------- iten N
Porque voce necessita ter alguns campos em outras tabelas, ou seja, porque itens necessita ter o campo codigo de cliente?
Resposta é simples voce poderá fazer um levantamento de 1 para N do arquivo de itens obtendo assim uma listagem referente a um produto que apresente todos os clientes que o adquiriram.
Portanto os arquivos devem possuir pelo menos estes campos.
clientes - idcliente(cliente)
pedidos - idpedido(pedido), idcliente(cliente)
itens - idpedido(pedido), idcliente(cliente), iditem(produto)
No momento da impressão de uma nota voce fatá a pesquisa por idpedido(pedido) em pedidos e encontrando passara a pesquisar por idpedido(pedido) em itens e encontrando iniciara então a impressão de seus itens.
Espero que neste breve resumo voce tenha sacado que uma tabela precisa ter alguns campos e vinculos que as vezes achamos que não precisa, mas por enquanto sua base de dados é pequena e quando crescer eles ficarão mais evidentes no momento de uma pesquisa detalhada ou relatório.
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Então amigo rocinha no caso de qualquer lançamento cadastro etc...
seria definitivamente "padrão" os vinculos no caso da forma que estou fazendo esta correta pois se fizermos uma analogia simples da sua explicação a unica coisa que trocariamos seria o nº clinete por Nº NF..
-------NF
|
|
FORNECEDOR
|
|
| ----ITEM 1
|
|-----ITEM 2
|
|-----ITEM 3
...CUJO CADA ITEM TERIA O Nº DE (NF,FORNECEDOR,E SEU PROPRIO Nº)
CREIO QUE SEJA ISSO MESMO ! OU ESTOU ERRADO ??
seria definitivamente "padrão" os vinculos no caso da forma que estou fazendo esta correta pois se fizermos uma analogia simples da sua explicação a unica coisa que trocariamos seria o nº clinete por Nº NF..
-------NF
|
|
FORNECEDOR
|
|
| ----ITEM 1
|
|-----ITEM 2
|
|-----ITEM 3
...CUJO CADA ITEM TERIA O Nº DE (NF,FORNECEDOR,E SEU PROPRIO Nº)
CREIO QUE SEJA ISSO MESMO ! OU ESTOU ERRADO ??
C:\Xharbour\Xdev\Fw\VSX
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Sim e não.
Sim - voce poderia se referir aos itens de uma nota após ela ter sido gerada pois ao voce lançar os pedidos em sequencia voce ainda assim não sabe qual o pedido será impresso primeiro, pois algum pedido pode ter a prioridade de saida e por isto será impresso antes de outros.
Não - pelo fato dos itens não terem sido impressos ainda em uma nota qualquer a unica forma mais provavel e direta de obter os itens seria pelo numero de pedido, pois como voce ainda não tem o numero da nota se voce pesquisa-se pelo numero do cliente os itens que apareceria seria os dos ultims pedidos todos juntos.
Toda nota precisa de um pedido e nem todo pedido vira nota, pode ficar como orçamento ou ser dispensado, cancelado antes da emissão, etc.
na verdade comercialmente falando a sequencia de geração de nota é:
1 - orçamento - o arquivo de pedidos deve conter os campos idorcamento e dtorcamento. Ao entrar no modulo de feitura de orcamento pega-se um numero de orcamento e anota junto com a data de orcamento.
2 - ordem de producao - o arquivo de pedidos deve conter o campo idop e dtop se for o caso de uma empresa que produz seus itens. Quando o orcamento for aprovado, sua rotina de confirmação deve pegar um novo numero de OP e anotar junto com a data de inicio da produção.
3 - pedidos - o arquivo de pedidos deve conter o campo idpedido e dtpedido. Quando sua ordem de produção for terminada é hora de liberar o pedido anotando o numero de pedido para ele e sua data de entrada no faturamento.
4 - notas - quando o pedido estiver liberado pelo comercial para faturamento é hora de emitir a nota, anotando-se para isto o numero da nota e sua data de saida em idnota e dtnota.
Em suma voce deverá controlar os codigos de orçamento, produção, pedido e nota fiscal além de acrescentar os campos que mencionei a sua tabela de pedidos.
Crie seu modulo de faturamento de forma aberta e de fácil manutencao dos pedidos. Num dia de muitos pedidos nem todos vão virar nota e muito menos nem todos serão impressos no mesmo dia.
@braços :?)
Sim e não.
Sim - voce poderia se referir aos itens de uma nota após ela ter sido gerada pois ao voce lançar os pedidos em sequencia voce ainda assim não sabe qual o pedido será impresso primeiro, pois algum pedido pode ter a prioridade de saida e por isto será impresso antes de outros.
Não - pelo fato dos itens não terem sido impressos ainda em uma nota qualquer a unica forma mais provavel e direta de obter os itens seria pelo numero de pedido, pois como voce ainda não tem o numero da nota se voce pesquisa-se pelo numero do cliente os itens que apareceria seria os dos ultims pedidos todos juntos.
Toda nota precisa de um pedido e nem todo pedido vira nota, pode ficar como orçamento ou ser dispensado, cancelado antes da emissão, etc.
na verdade comercialmente falando a sequencia de geração de nota é:
1 - orçamento - o arquivo de pedidos deve conter os campos idorcamento e dtorcamento. Ao entrar no modulo de feitura de orcamento pega-se um numero de orcamento e anota junto com a data de orcamento.
2 - ordem de producao - o arquivo de pedidos deve conter o campo idop e dtop se for o caso de uma empresa que produz seus itens. Quando o orcamento for aprovado, sua rotina de confirmação deve pegar um novo numero de OP e anotar junto com a data de inicio da produção.
3 - pedidos - o arquivo de pedidos deve conter o campo idpedido e dtpedido. Quando sua ordem de produção for terminada é hora de liberar o pedido anotando o numero de pedido para ele e sua data de entrada no faturamento.
4 - notas - quando o pedido estiver liberado pelo comercial para faturamento é hora de emitir a nota, anotando-se para isto o numero da nota e sua data de saida em idnota e dtnota.
Em suma voce deverá controlar os codigos de orçamento, produção, pedido e nota fiscal além de acrescentar os campos que mencionei a sua tabela de pedidos.
Crie seu modulo de faturamento de forma aberta e de fácil manutencao dos pedidos. Num dia de muitos pedidos nem todos vão virar nota e muito menos nem todos serão impressos no mesmo dia.
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
