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