Помощь - Поиск - Пользователи - Календарь
Полная версия: создание ведомостей
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
what is
Помогите найти ошибку, уже на грани нервного срыва... mega_chok.gif
В общем суть задачи в следующем:
в диалоге с пользователем создано 2 файла-справочника и 1 основной файл. Требуется сформировать из них ведомости следующего вида:


Ведомость 1. Поступление изделий на склады Дата – ХХ.ХХ.ХХ
№ Код Название Код Номенклатур. Наименование Колич. Цена Стоимость
п/п склада склада цеха номер

По складу ХХХХХ.ХХ
По цеху ХХХХХ.ХХ
Общий итог ХХХХХХХ.ХХ
{берутся данные из файла, справочника 1 и справочника 2}


Ведомость 2. < заголовок >
№ п/п Код склада Телефон Код цеха Количество изделий

По складу ХХХХХХ
Общий итог ХХХХХХХ
{берутся данные из файла и справочника 1}

Структура записи основного файла:
1. код склада - цифровое поле
2. код цеха-изготовителя - цифровое поле
3. номенклатурный номер изделия - цифровое поле
4. дата поступления изделия (ддммгг) - символьное поле
5. количество изделий - цифровое поле

Справочник 1
1. код склада - цифровое поле
2. название склада - символьное поле
3. ФИО зав.складом - символьное поле
4. служебный телефон - символьное поле

Справочник 2
1. номенклатурный номер изделия - цифровое поле
2. наименование изделия - символьное поле
3. цена изделия - цифровое поле

Программа вылетает на создании ведомости 1, пишет exitcode=100. Но ведомость1 создается, правда неправильно и неполностью. До 2-й ведомости она не доходит.

вот собственно процедуры на их создание:

type
tsprav2=record
nom_num:string[4];
name_izdel:string[9];
price:string[3]
end;

tosnfile=record
cod_stock:string[2];
cod_ceh:string[2];
nom_num:string[4];
data:string[8];
kol_vo:string[2]
end;

tipsprav1=record
cod_stock1:string[2];
name_stock1:string[6];
fio1:string[12];
tel1:string[9];
end;


ftsprav2=file of tsprav2;
ftipsprav1=file of tipsprav1;
var
name1, name2, namefile, nved1, nved2:string;
zap_sprav2 : tsprav2;
sprav2 : ftsprav2;
sprav1,ved1,ved2:text;
osnfile:file of tosnfile;
zap_file:tosnfile;
zap:tipsprav1;
temp:ftipsprav1;
{...............................................}

procedure ved_sozd;{общая процедура создания ведомостей}
var
ans,ans1,answer,answer1,answer2:char;
f1,fl1,fl2,fl3:boolean;
begin
fl1:=false;
fl2:=false;
fl3:=false;
f1:=true;
writeln('Vi hotite sozdat vedomosti? <y/n>');
readln(ans);
if (ans='y') or (ans='Y') then
begin
repeat
writeln('vvedite imya osnovnogo faila:');
readln(namefile);
assign(osnfile,namefile);
{$I-} reset (osnfile); {$I+}
if ioresult<>0 then
begin
writeln('faila *',namefile,'* net');
fl:=false;
writeln('Prodoljat vvod?<y/n>');
readln(answer);
if (answer='n') or (answer='N') then
exit;
end
else
begin
close(osnfile);
fl1:=true;
end;
until fl1;

repeat
writeln('vvedite imya faila-spravo4nika 1 :');
readln(name1);
name1:=name1 +'.txt';
assign(sprav1,name1);
{$I-} reset (sprav1); {$I+}
if ioresult<>0 then
begin
writeln('faila * ',name1,' * net');
writeln('Prodoljat vvod?<y/n>');
readln(answer2);
if (answer2='n') or (answer2='N') then
exit;
end
else
begin
close(sprav1);
fl2:=true;
end;
until fl2;

repeat
writeln('vvedite imya faila-spravo4nika 2:');
readln(name2);
assign(sprav2,name2);
{$I-} reset (sprav2); {$I+}
if ioresult<>0 then
begin
writeln('imya faila *',name2,'* net');
fl:=false;
writeln('Prodoljat vvod?<y/n>');
readln(answer1);
if (answer1='n') or (answer1='N') then
exit;
end
else
begin
close(sprav2);
fl3:=true;
end;
until fl3;
ved1_sozd(namefile,name1,name2);
ved2_sozd(namefile,name1);
writeln('Vedomosti sozdani!');
readkey;
end;
end;



Создание ведомости1

procedure ved1_sozd(var namefile:string;
var name1:string;
var name2:string); {создание 1-й ведомости}
var
i,k,j,t,l,b,code,code1,r:integer;
sumsk,sumceh,sum,summ:integer;
fl,f,fl1,fl2,fl3:boolean;
y,m,d,w:word;
p,n,kol_vo,price:string;
ans:char;
Begin
fl:=false;
repeat
writeln('vvedite imya ved 1:');
readln(nved1);
nved1:=nved1+'.txt';
assign(ved1,nved1);
{$I-} reset (ved1); {$I+}
if ioresult=0 then
begin
writeln('imya faila * ',nved1,' * yje est');
writeln('-->Perezapisat?<y/n>');
readln(ans);
if (ans='y') or (ans='Y') then
begin
rewrite(ved1);
f:=true;
end

else
begin
close(ved1);
writeln('Prodoljat vvod?<y/n>');
readln(answer1);
if (answer1='n') or (answer1='N') then
exit;
end;
end
else
begin
rewrite(ved1);
f:=true;
end;
until f;
GetDate(y,m,d,w);
assign(sprav2,name2);
reset(sprav2);
assign(osnfile,namefile);
reset(osnfile);
assign(temp,'tiptemp');
reset(temp);
i:=0;
writeln(ved1,'Vedomost 1 Postuplenie izdeliy na skladi data:',d,'.',m,'.',y);
writeln(ved1,' ');
writeln(ved1,'-------------------------------------------------------------------------------------');
writeln(ved1,' N Cod Nazvanie Cod Nomen. Naimenovanie Kol-vo Cena Stoimost ');
writeln(ved1,'p/p sklada sklada ceha nomer izdeliya ');
writeln(ved1,'-------------------------------------------------------------------------------------');
sumsk:=0;
sumceh:=0;
sum:=0;
read(osnfile,zap_file); {считываем 1-ю запись}
n:=zap_file.cod_stock; {запоминаем ее в переменные}
p:=zap_file.cod_ceh;
seek(osnfile,0);{ставим указатель в начало осн. файла}

while not(eof(osnfile)) do
begin
fl1:=true;
read(osnfile,zap_file);{считываем 1-ю запись}
if zap_file.cod_stock<>n then {начинает выполняться со 2-го цикла}
begin
writeln(ved1,' po skladu',sumsk:12);
sumsk:=0; {после обнуляется}
fl1:=false;
end;
fl2:=true;
if zap_file.cod_ceh<>p then
begin
if fl1 then
writeln(ved1,' po cehy ',sumceh:12);
sumsk:=0;
fl2:=false;
end;
n:=zap_file.cod_stock; {также начинает выполняться со 2-го цикла}
p:=zap_file.cod_ceh; {это тоже}
inc(i);
write(ved1,i:3,zap_file.cod_stock:9);
fl:=true;
while (not eof(temp)) and fl do
begin
read(temp,zap); {ищем в 1-м справ имя скада, сравнивая запись с кодом склада из осн. файла}
if zap.cod_stock1=zap_file.cod_stock then
begin
write(ved1,zap.name_stock1:11); {если нашли, то вписываем в файл-ведомость 1}
fl:=false;
end;
end;
write(ved1,zap_file.cod_ceh:9,zap_file.nom_num:10); {затем вписываем в ведомость1 код цеха и номенклатурный номер}
fl:=true;
while (not eof(sprav2)) and fl1 do {ищем во 2-м справочнике имя изделия , сравнивая номенкл. номер из осн. файла}
begin
read(sprav2,zap_sprav2);
if zap_sprav2.nom_num=zap_file.nom_num then
begin
write(ved1,zap_sprav2.name_izdel:17); {если нашли, то записываем в ведомость}
fl1:=false;
end;
end;
end;
seek(sprav2,0); {опять на начало указатель}
seek(osnfile,0);
summ:=0; {это будет стоимость, т.е. цена*кол-во}
fl3:=true;
while (not eof(sprav2)) and f do {сравнивая с номенкл. номером из осн.файла находим цену, также берем кол-во из осн.файла}
begin
read(osnfile,zap_file);
if zap_sprav2.nom_num=a then
begin
kol_vo:=zap_file.kol_vo;
price:=zap_sprav2.price;
val(kol_vo,k,code); {преобразуем строки в числа}
val(price,r,code1);
if (code=0) and (code1=0) then
summ:=k*r; {это стоимость}
writeln(ved1,zap_file.kol_vo:8,zap_sprav2.price:8,summ:10); {записываем все в ведомость}
{ b:=filepos(osnfile); нужно ли..? }
fl3:=false;
end;
sum:=sum+summ; {общая суммма}
sumsk:=sumsk+sum; {по складу}
sumceh:=sumceh+sum; {по цеху}

end;

writeln(ved1,' po skladu',sumsk:12);
writeln(ved1,' po cehu ',sumceh:12);
writeln(ved1,' vsego ',sum:12);
writeln(ved1,'------------------------------------------------------------------------------------');
close(osnfile); close(temp); close(sprav2); close(ved1);
writeln;
writeln('Vedomost postypleniya sformirovana');
writeln('Nagmite ENTER');
readkey;
end;



Создание ведомости2

procedure ved2_sozd (var namefile:string;
var name1:string);
var
fl:boolean;
kol,kolob:integer;
a,pole:string;
ans:char;

begin
fl:=false;
repeat
writeln('vvedite imya ved 2:');
readln(nved2);
nved2:=nved2+'.txt';
assign(ved2,nved2);
{$I-} reset (ved2); {$I+}
if ioresult=0 then
begin
writeln('fail* ',nved2,' * yje est');
writeln('-->Perezapisat?<y/n>');
readln(ans);
if (ans='n') or (ans='N') then
begin
close(ved2);
writeln('Prodoljat vvod?<y/n>');
readln(answer1);
if (answer1='n') or (answer1='N') then
exit;
end
else
rewrite(ved2);
fl:=true;
end
else
begin
rewrite(ved2);
fl:=true;
end;
until fl;
assign(osnfile,namefile);
reset(osnfile);
assign(temp,'tiptemp');
reset(temp);
writeln(ved2,'Vedomost 2 Nali4ie izdeliy na skladah ');
writeln(ved2,'--------------------------------------- -----------------');
writeln(ved2,'| N | Cod | Slujebniy | Cod | Kol-vo |');
writeln(ved2,'|p/p| sklada | telefon | ceha | izdeliy |');
writeln(ved2,'---------------------------------------------------------');
i:=0; kolob:=0;
while not eof(osnfile) do
begin
inc(i);
write(ved2,'',i:3,'');
read(osnfile,zap_file);
a:=zap_file.cod_stock;
write(ved2,a:4);
kol:=0;
while not eof(temp) do
begin
read(temp,zap);
if zap.cod_stock1=a then {по коду склада ищем в 1-м справочнике служ.телефон, когда нашли записываем в ведомость2}
write(ved2,zap.tel1:11,zap_file.cod_ceh:4,zap_file.kol_vo:7);
val(zap_file.kol_vo,kol,code); {преобразуем строку в число}
end;
kolob:=kolob+kol;
writeln(ved2,kolob:10);{общее кол-во}
end;
writeln(ved2,' vsego:',kolob:11);
close(osnfile); close(sprav1); close(ved2);
writeln;
writeln('Vedomost nali4iya izdeliy sformirovana');
writeln('Najmite ENTER');
readkey;
end;


.

volvo
Единственное опасное место (в свете приведенного тобой номера ошибки) - здесь:
while (not eof(sprav2)) and f do  {сравнивая с номенкл. номером из осн.файла находим цену, также берем кол-во из осн.файла}
begin
read(osnfile,zap_file); { <--- !!! }


Ты уверен, что условие not eof(sprav2) когда-нибудь выполнится? Я - нет...
what is
Цитата(volvo @ 20.05.2007 21:24) *

Единственное опасное место (в свете приведенного тобой номера ошибки) - здесь:
while (not eof(sprav2)) and f do  {сравнивая с номенкл. номером из осн.файла находим цену, также берем кол-во из осн.файла}
begin
read(osnfile,zap_file); { <--- !!! }


Ты уверен, что условие not eof(sprav2) когда-нибудь выполнится? Я - нет...



Вот дура! Не вижу очевидного....
Спасибо.
what is
Не помогло....все равно ведомость 1-ю по-нормальному вообще не создает...а при создании 2-й вылетает....
В чем же косяк..? Люди, помогите, в этой проге смысл моего существования...(((

Вот что она создает вместо ведомости....жесть какую-то...

 
Vedomost 1 Postuplenie izdeliy na skladi data:20.5.2007

-------------------------------------------------------------------------------------
N Cod Nazvanie Cod Nomen. Naimenovanie Kol-vo Cena Stoimost
p/p sklada sklada ceha nomer izdeliya
-------------------------------------------------------------------------------------
1 1 wer 11 31 po skladu 0
2 14 7 65 po skladu 0
3 2 13 6 po skladu 0
4 4 11 56 po skladu 0
5 7 15 43 po skladu 0
6 8 65 6 po skladu 0
7 9 10 11 po skladu 0
po cehu 0
vsego 0
------------------------------------------------------------------------------------

.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.