Passagem de Parâmetro para o programa

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
diego1504
Usuário Nível 1
Usuário Nível 1
Mensagens: 16
Registrado em: 11 Jul 2007 23:34
Localização: São Paulo - SP

Passagem de Parâmetro para o programa

Mensagem por diego1504 »

Oi amigos clippeiros.


Queria saber se alguem já passou pela seguinte situação, pois estou nela agora.


Tenho um programa que gerar um relatório. a condição para os registros sairem no relatório é que vai ser informada um valor(quantidade de dias). Tudo que for inferior a esta quantidade de dias devera sair no relatorio.

Pois bem. o problema é que este valor de dias que o programa irá receber não pode ser por janela(read,get). Deve ser um valor externo vindo de um arquivo .bat

Pra quem conhece é mais ou menos igual ao´s PARMS do COBOL. Alguem sabe como fazer isso?


Imagino que fique assim no bat

executar programa, qtd_dias=360


Claro que não é assim. só para vocês terem uma ideia do que estou pensando, tenho que pegar um valor externo. Porque este programa será um batch. Portanto não pode haver janelas.


Alguem sabe como preparar o programa eo .bat para execução?

Obrigado
Diego Maciel
-----------
Clipper 5.3 + Blinker 6
COBOL + JCL + CICS + DB2 + VSAM
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Passagem de Parâmetro para o programa

Mensagem por Maligno »

Eu costumo fazer isso em alguns casos e é bem simples. Faça sua primeira função do programa receber argumentos, como se fosse uma função que a chamasse. Exemplo:


function First(cDias)
...
...
...


No batch, a execução é simples. Supondo que este seu programa se chama teste, sua execução no batch seria TESTE 30. Como First() é a primeira função do PRG principal, ela receberá esse argumento da linha de comando. Apenas lembre-se de que, vindo pela linha de comando, todos os argumentos serão sempre strings. Se precisar, converta.
[]'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!
Avatar do usuário
diego1504
Usuário Nível 1
Usuário Nível 1
Mensagens: 16
Registrado em: 11 Jul 2007 23:34
Localização: São Paulo - SP

Mensagem por diego1504 »

Ahhhhh tá!!

isso da linha de comando era o que eu queria!!!!não sabia que dava para fazer isso.

Maligno muito obrigado pela ajuda :{
Diego Maciel
-----------
Clipper 5.3 + Blinker 6
COBOL + JCL + CICS + DB2 + VSAM
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á

Re: Passagem de Parâmetro para o programa

Mensagem por Pablo César »

Desculpem a minha intromissão, mas que valha para esclarecimento. Eu não entendí direito o que o colega expôs. As minhas dúvidas são:

1. O programa que faz relatórios, é externo ?. É dizer, precisa passar parâmetros (Nº dias) para imprimir ?. Por exemplo IMP_REL 365.
Se for isto, e precisa ainda que o seu programa Clipper chame esse relatório, seja rodando em arquivo .BAT. Então eu indicaria, você gerar o arquivo .BAT (com o nome que sempre teve) através de dentro do seu aplicativo Clipper:

Código: Selecionar todos

MEMOWRIT("CHAMAREL.BAT","IMP_REL 365")
2. Agora se o seu aplicativo que imprime é uma função interna do Clipper e precisa receber parâmetro desde a linha de comando. Assim cmo disse o Maligno, eu indicaria com outro exemplo:

// Nas primeiras linhas do seu programa principal escreva:

Código: Selecionar todos

PARAMETERS VQDIAS /* Este comando indica que estaria recebendo o parâmetro externo desde a linha de comando. O valor que será passado desde a linha de comando SEMPRE será tipo caracter, portanto se precisar passar esta varável à função que imprime o relatorio, então converta assim: VQDIAS:=VAL(VQDIAS) */

// Daí em mais continua seu aplicativo chamndo a função do relatório.

IMP_REL(VQDIAS)
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
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem por Augusto »

Tudo bem... eu sei que o que o Maligno sugeriu funciona... mais eu uso assim:

Usando o mesmo exemplo, digamos que o nome do programa EXE seja TESTE e o seu BAT se chame EXECUTA, no prompt do DOS eu faço:

EXECUTA 30 //onde 30 seria a sua variável externa (var_ext)

Dentro do BAT seria:
TESTE %1

e lá dentro do PRG principal eu faço:

Código: Selecionar todos

public var_ext
param var_ext

// segue o prg normalmente usando a variável var_ext
Editado pela última vez por Augusto em 19 Jul 2007 10:13, em um total de 1 vez.
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
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á

Mensagem por Pablo César »

Augusto escreveu:

Código: Selecionar todos

public var_ext
param var_ext

// segue o prg normalmente usando a variável var_ext
Pois é, foi o mesmo que eu postei, mas não tem necessidade de declarar a variável como pública, Augusto. E eu não estou certo se é isso que o colega Diego precisa, pois ele menciona de uma BATCH, para quê seria então ?
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 »

Acho que o colega não teve dúvida quanto ao uso de parâmetros num batch. O problema foi receber argumentos dentro do programa.

Agora, um detalhe: os parâmetros de uma função nunca poderão ser públicos. Podem ser locais (definidos entre os parênteses) ou privados (fora dos parênteses, com a ajuda da cláusula PARAMETERS). Se houver uma variável pública de mesmo nome, ela ficará desconhecida dentro da função.
[]'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!
Avatar do usuário
diego1504
Usuário Nível 1
Usuário Nível 1
Mensagens: 16
Registrado em: 11 Jul 2007 23:34
Localização: São Paulo - SP

Mensagem por diego1504 »

Pablo César, pelo seu jeito eu consegui receber o valor. :)))

Maligno pela metodo de função que você indicou eu não consegui, a variavel da função estava recebendo NIL.

Olha como estava fazendo acho que fiz algo errado:

Código: Selecionar todos

getDias()
inkey(0)

function getDias(cDias)
private qtd_dias := val(cDias)

IF qtd_dias = 0
mensagem('Numero de parametro invalido. Por favor informe um numero maior que zero',0,0)
inkey(0)
ENDIF

mensagem('numero ecolhido:'+ qtd_dias + '',0,0)
RETURN(qtd_dias)


Obrigado a todos "mais uma vez" :)Pos
Diego Maciel
-----------
Clipper 5.3 + Blinker 6
COBOL + JCL + CICS + DB2 + VSAM
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 variável que receberá a string pela linha de comando deve ser um parâmetro (ou vários parâmetros, se for mais de um argumento) da primeira função do seu primeiro PRG. Exatamente por isso, você deverá compilar o programa com a opção /n do Clipper. Ao que me parece, pelo código que você apresentou, não é assim que você está fazendo. Veja que, antes da definição dessa primeira função, tenha ela o nome que tiver, nenhum código pode ser sequer mencionado.

Acho que você deve mudar para algo do tipo:

Código: Selecionar todos

//-----------------------------------------------------
function First(cDias)
if !ValidaDias()
   quit
end
...
quit

//-----------------------------------------------------
function ValidaDias(cDias)
local nDias := Val(cDias)
if nDias = 0
   // Erro
   return .F.
end
return .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!
Responder