Ir ao conteúdo
  • Cadastre-se

procedure verificar quantidade não funciona


Arthur2010

Posts recomendados

Olá gente(de novo rs rs) bom to com mais um probleminha, fiz uma consistência para verificar a quantidade digitada pelo usuário, se ele digitar algo diferente de número ele da erro, o problema é que se eu deixar essa verificação como procedure ela guarda um numero absurdo e sempre o mesmo (-453771264),

porém a verificação funciona perfeitamente se eu não a usar como procedure, se eu a colocar dentro da procedure de inserir dados funciona.

PROCEDURE verifica_quantidade;
VAR
p :string;
erro :integer;

BEGIN
repeat
write('quantidade');
readln(p);
val(p,ficha.qtd,erro); {converte em integer}
if (erro <> 0) then
mensagem_erro('Somente é aceito numeros inteiros')
else
if (p<'0') or (p>'32767') then
mensagem_erro('O numero deve esta na faixa de 0 a 32767');
until (erro=0) and (p >'0') and (p <'32767');
END;

Obrigado!

Link para o comentário
Compartilhar em outros sites

Eu faria assim:


PROCEDURE verifica_quantidade;
VAR p: string;
erro: integer;

BEGIN
repeat
write('quantidade');
readln(p);
val(p,ficha.qtd,erro); {converte em integer}
if (erro <> 0) then
mensagem_erro('Somente é aceito numeros inteiros')
else if (ficha.qtd < 0) or (ficha.qtd > 32767) then
mensagem_erro('O numero deve esta na faixa de 0 a 32767');
until (erro=0) and (ficha.qtd > 0) and (ficha.qtd < 32767);
END;

Link para o comentário
Compartilhar em outros sites

valecovo, a procedure avisa perfeitamente quando eu digito letra e só prossegue quando eu digito um número, porém, quando eu vou no listar e olho no arquivo de texto o número absurdo continua (-342622208).

vou pstar a inserir:

PROCEDURE inserir_dados;
{procedimento para inserir dados}
VAR i :integer;
op :char;
ficha :cadastro;
blOk :boolean;

BEGIN

clrscr;

blOk := FALSE;
i:= 0;
IF not existe('D:\Arquivo.dat') then
BEGIN
writeln('Arquivo nao existente. Deseja criar o Arquivo agora? (s/n) ?');
op:= readkey;
if upcase(op) = 'S' then
BEGIN
ASSIGN(arquivo,'D:\Arquivo.dat'); {assinala o arquivo}
REWRITE(arquivo); {cria um novo arquivo e substitui o original}
CLOSE(arquivo); {fecha o arquivo}
END;
END;
//repeat
while(blOk = FALSE) do begin
write('Codigo: '); readln(ficha.rescod);
blOk := verifica_codigo(ficha.rescod);
if(blOk = FALSE) then writeln('Codigo ja cadastrado, digite um codigo valido');
end;

write('Descricao: '); readln(ficha.desc);

verifica_quantidade;

write('Data de Entrada: '); readln(ficha.dat_ent);
writeln('Confirmar dados? s/n '); op:= readkey;
if upcase(op)='S' then
BEGIN
ASSIGN(arquivo,'D:\Arquivo.dat'); {assinala o arquivo}
RESET(arquivo); {abre o arquivo e fica no primeiro registo}
i:= filesize(arquivo); {determina o tamanho do arquivo}
seek(arquivo, i);
write(arquivo, ficha); {escreve no arquivo}
CLOSE(arquivo); {fecha o arquivo}
i := i+1;
END;
//teria um fim do repeat aqui
END;

Link para o comentário
Compartilhar em outros sites

E aê Arthur2010?? Mano, te aconselho a trabalhar com funções (é tão simples quanto procedures), mas já que você optou por procedures...

Bom, na procedure você usa a variavel/registro "ficha" para salvar a quantidade... porém não foi dclarada esta variável no escopo da procedure ("verifica_quantidade"), já na procedure "inserir_dados" existe a variável/registro "ficha", porém a procedure "verifica_quantidade" não está no escopo da procedure "inserir_dados", então com certeza a variavel/registro que está sendo acessada pela procedure "verifica_quantidade" (acredito que como não deu erro acusando que a variavel "ficha" não foi encontrada, deve existir uma variavel "ficha" que seja global...) não é a mesma que está sendo acessada pela procedure "inserir_dados" , isto que deve estar causando o erro...

Esta aqui um exemplo (usando a sua procedure):


program exemplo;
uses crt;
type
cadastro = record
rescod : String[3];
desc : String[20];
qtd : integer;
end;
var
arquivo : File of cadastro;
opcao : integer;
function verifica(strCod : String):Boolean;
var
FichaLida : Cadastro;
begin
verifica := TRUE;
assign(arquivo,'Arquivo.dat');
reset(Arquivo);
while((not EoF(Arquivo)) AND (verifica = TRUE)) do begin
read(Arquivo,FichaLida);
if(strCod = FichaLida.rescod) then verifica := FALSE;
end;
close(Arquivo);
end;
function menu() : integer;
var
OpcaoValida : Boolean;
Opcao : char;
begin
OpcaoValida := FALSE;
clrscr();
while(OpcaoValida = FALSE) do begin
writeln('#-Menu-#',#13,#10,' 1.Inserir',#13,#10,' 2.Registros',#13,#10,' 3.Sair');
Opcao := readKey();
if(Opcao = '1') then menu := 1
else if (Opcao = '2') then menu := 2
else if (Opcao = '3') then menu := 3;
if((menu <= 3)AND(menu >=1)) then OpcaoValida := TRUE;
end;
end;
[b]procedure InserirDados;[/b]
var
Fichasalvar : Cadastro;
blOk :Boolean;
[b]PROCEDURE le_qtd;
VAR p: string;
erro: integer;
BEGIN
repeat
write(' *Insira codigo:',#13,#10,' >>');
readln(p);
val(p,fichaSalvar.qtd,erro); {converte em integer}
if (erro <> 0) then
writeln('Somente é aceito numeros inteiros')
else if (fichaSalvar.qtd < 0) or (fichaSalvar.qtd > 32767) then
writeln('O numero deve esta na faixa de 0 a 32767');
until (erro=0) and (fichaSalvar.qtd > 0) and (fichaSalvar.qtd < 32767);
END;[/b]
begin
blOk := FALSE;
clrscr();
Write('#-Inserir Dados-#',#13,#10,' *Insira a descricao do produto:',#13,#10,' >>');
readln(FichaSalvar.desc);
while(blOk = FALSE) do begin
write(' *Insira codigo:',#13,#10,' >>');
readln(FichaSalvar.resCod);
blOk := verifica(FichaSalvar.rescod);
if(blOk = FALSE) then writeln('#codigo ja existe...');
end;
le_qtd;
assign(Arquivo,'Arquivo.dat');
reset(Arquivo);
seek(Arquivo,FileSize(Arquivo));
write(Arquivo,FichaSalvar);
close(Arquivo);
writeln(#13,#10'Registro Salvo...');
readkey();
[b]end;[/b]
procedure Registros;
var
FichaLida : Cadastro;
iCont : Integer;
begin
iCont := 0;
ClrScr();
WriteLn('#-Registros Salvos no Arquivo-#');
assign(Arquivo,'Arquivo.dat');
reset(Arquivo);
while(Not EoF(Arquivo)) do begin
iCont := iCont + 1;
read(Arquivo,FichaLida);
writeln('-->Registro ',iCont,#13,#10,' .Descricao: ',FichaLida.Desc,#13,#10,' .Codigo: ',FichaLida.rescod,#13,#10' .Quantidade:

',FichaLida.qtd,#13,#10);
end;
close(Arquivo);
Writeln('#Existem ',iCont,' registros no arquivo...');
readKey();
end;
begin
assign(arquivo,'Arquivo.dat');
{$i-}
reset (Arquivo);
{$i+}
opcao := 1;
if (IOResult <> 0) then rewrite (Arquivo);
close(Arquivo);
while(Opcao <> 3) do begin
opcao := menu();
if (Opcao = 1) then InserirDados
else if(Opcao = 2) then Registros;
end;
end.

Bom acredito que a solução seria você declarar a procedure "verifica_quantidade" dento do escopo da procedure "inserir_dados" (assim eles compartilhariam da mesma váriavel ficha, ou torne a variavel ficha global)...

Espero que ajude...

Falou, abraço.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!