function & parameter

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

function & parameter

Mensagem por ederxc »

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
Alessandro
Usuário Nível 3
Usuário Nível 3
Mensagens: 141
Registrado em: 07 Jul 2004 09:39
Localização: Santo Antonio da Platina-PR

Mensagem por Alessandro »

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
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Vamos aos testes alessandro VLW! Logo retorno com o resultado !
C:\Xharbour\Xdev\Fw\VSX
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Nossa cara ta embaixo dos meus olhos hein! valeu
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos

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
ou

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
Um DO..WHILE já é um loop e se voce estiver usando uma tabela o melhor é:

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
@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.
Alessandro
Usuário Nível 3
Usuário Nível 3
Mensagens: 141
Registrado em: 07 Jul 2004 09:39
Localização: Santo Antonio da Platina-PR

Mensagem por Alessandro »

Peço desculpa aos colegas......

Falha minha.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

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 :?)
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.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Rocinha

Mensagem por ederxc »

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+++
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

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 :?)
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.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Beleza rocinha ..gostei muito da explicação postarei o codigo para que possam dar uma olhada e ficaria muito grato ppor isso !
C:\Xharbour\Xdev\Fw\VSX
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

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 !
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

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

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
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 :?)
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.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

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 ?? :)
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

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 :?)
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.
Responder