IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> создание ведомостей, из 3-х типизированных файлов
сообщение
Сообщение #1


только вперед...
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

Репутация: -  1  +


Помогите найти ошибку, уже на грани нервного срыва... 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;


.



--------------------
Завтра будет. Лучше???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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


Ты уверен, что условие not eof(sprav2) когда-нибудь выполнится? Я - нет...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


только вперед...
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 20.05.2007 21:24) *

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


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



Вот дура! Не вижу очевидного....
Спасибо.


--------------------
Завтра будет. Лучше???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


только вперед...
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

Репутация: -  1  +


Не помогло....все равно ведомость 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
------------------------------------------------------------------------------------

.


--------------------
Завтра будет. Лучше???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.10.2020 16:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name