Помощь - Поиск - Пользователи - Календарь
Полная версия: создание ведомостей
Форум «Всё о Паскале» > 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
------------------------------------------------------------------------------------

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