Автоматическое рабочее место для работника склада

ВВедение.
      Данная программа автоматизированного рабочего  места  разработана  для
работников складских помещений, естественно если  у  них  имеется  компьютер
классом  не  ниже  Pentium.  Сейчас  на   рынке   программного   обеспечения
появляются все больше и больше различных программ для работы  не  только  со
складом, но и  различные  другие  программные  средства  автоматизированного
рабочего  места,  но  стоимость  их  лицензионных  копий  доходит  порой  до
нескольких десятков тысяч, а моя программа может быть конечно  маленько  еще
«сыровата», но в процессе работы с нею её можно «довести ее до  ума»  и  все
это лишь за пятерку по программированию  цена   не  велика  за  произведение
программного искусства. Каковы её  плюсы:  ну  это  естественно  простота  и
понятность (для русского человека)  интерфейса  программы,  что  не  требует
дополнительного обучения или прохождения специальных  курсов,  особенно  для
женщин,  работающих  на  складах  и  не  посвященных  в  азы  компьютеров  и
программного обеспечения; не требовательность к системным  ресурсам  машины;
легкость ввода и отслеживания; простота резервирования базы данных (всего  1
файл), что не маловажно для такой  программы.  При  написании  и  разработке
курсового проекта я научился работать с Borland  Pascal,  Microsoft  Windows
95OSR2, Microsoft  Word  97  SR-2  которые  использовались  для  работы  над
курсовым проектом, научился использовать справку и  другие  функции  Borland
Pascal при  этом  даже  разобрался  с  английским  языком  и  использованием
электронных словарей переводчиков таких как Promt, Stylus, Magic Gooddy  98.
Огромное спасибо Волкову А.И. – за отличное  преподавание  предметов,  Billу
Gaits – за то что он умеет зарабатывать деньги собственным умом,  Мерзлякову
Д.С. – за поддержку  в  трудную  минуту,  Барышеву  А.А.  –  за  техническую
поддержку, Русских А.И. – за  программную  поддержку,  Казакову  В.С.  –  за
разрешение работать на компьютере, Sting, Queen, и другим за хорошую  музыку
во время работы над курсовым.
                                I.  Задание.
      Составить программу  автоматического  рабочего  места  для  работы  со
складом.
      Программа должна предоставлять пользователю возможность:
1. Вводить новый товар, указывая следующие параметры
      V Наименование;
      V Количество;
      V Цену;
      V Дату поступления.
2. Осуществлять поиск товара по наименованию и выдавать его параметры.
3. Помечать выбывший товар, указывая дату выдачи.
4. Выводить список имеющегося товара с  возможностью  сортировки  по  любому
   параметру.
5. Выводить список выбывшего товара  с  возможностью  сортировки  по  любому
   параметру.
6. Выдавать общую статистическую характеристику:
      V Общая стоимость имеющегося товара;
      V Количество имеющегося товара;
      V Количество выбывшего товара.
7. Сохранять и восстанавливать всю информацию АРМ с диска.


            I. описание переменных и алгоритма работы программы.
Описание переменных.
 V basskl – основная запись с необходимыми переменными это:
                  > naim – наименование товара;
                  > kol – количество товара;
                  > price – цена товара;
                  > kol_p – количество пришедшего товара;
                  > kol_r – количество товара который ушел;
                  > date_p – дата прихода товара;
                  > date_r – дата расхода товара.
 V f – file базы слада;
 V list – массив данных базы;
 V schet – cчетчик;
 V curs – показатель позиции;
 V stran – счетчик позиции курсора;
 V i – переменная использования;
 V mcurs – переменная начальной позиции меню;
 V k –переменная определения клавиши;
 V res –переменная выбора меню;
 V da – переменная использования;
 V er – переменная ошибки преобразования;
 V tx – переменная текста при поиске;
 V fil – переменная имени базы;
 V key – флажок;
 V seter – переменная использования.

Кроме переменных в программе используются процедуры и функции описание
которых приведено ниже;
Функция probel;
Используется для дополнения текста требуемыми количествами пробелов.
Вход: Текст, требуемая длина.
Выход: Текст требуемой длины.

Функция Edtext;
Используется для вывода на экран в нужную позицию текста и его  последующего
редактирования
Функция работает следующим образом:
Зацикливается до тех пор пока не будет нажатия Enter или Esc.  В  это  время
выводит на экран текст в  нужную  позицию,  обновляется  ,  ожидает  нажатия
клавиш или delete.
Вход: Координаты, текст, длина текста, флажок.
Выход: Вывод на экран текста, отредактированный текст.

Функция Cifri;
Подобна функции Edtext только ввод текста ограничен цифрами.
Работает также.

Процедура Prishlo;
Применяется для вывода на экран меню «Приход» и занесения данных  в  позицию
базы.
Описание работы: Работает со строкой массива базы.  Выводит  на  экран  меню
«Приход», преобразует текстовые переменные после ввода в строки меню.

Процедура Ushlo;
Аналогична   процедуре   Prishlo   .Заменена   только   формула   вычисления
количества.


Процедура Vvodnov;
Процедура обеспечивающая вывод на  экран  меню  «Новый  товар»,  ввод  новой
строки в базу.
Работает: Ограничивается строкой, для работы с переменными  записи,  выводит
на экран  меню,  пользователем  редактируются  строки  меню,  преобразуются,
увеличивается счетчик числа строк базы на 1.

Процедура Edzapic;
Используется для редактирования записи в текущей позиции курсора листинга
перечня товаров.
Вход: Позиция
Выход: отредактированный текст в данной позиции.

Процедура Ekran;
Отображает  на  экране  заголовок  таблицы   базы   и   заполняет   таблицу,
рассчитывает и отображает на  экране  нижнюю  строку  состояния  базы  общую
сумму, общий приход, общий расход, общее количество товаров.
Описание: Формирует окно для работы, отображает заголовок таблицы, цикл  для
вывода первых двадцати строк базы в окно, обнуление счетчиков сумм, цикл  на
все позиции базы, расчет сумм в этом цикле вывод результата на экран в  виде
строки состояния.

Функция Vivstr;
Формирует строку по позиции в базе.
Обнуляется. Работает со строкой в массиве базы. Производит преобразование  в
стринговые переменные  числовых  значений  базы  (количества  цены,  приход,
расход), сумма формируется путем вычисления.  Добавление  нужными  пробелами
функцией Probel.

Процедура Vivlist;
Обеспечивает  формирование  экрана  с   помощью   процедуры   Ekran,   вывод
поясняющей строки. Подкрашивание строки  в  позиции  курсора,  опрос  клавиш
курсора и служебных (для ввода  новой,  корректировки,  удаления).  Работает
следующим  образом:  Выполняет   процедуру   Ekran,   прорисовывает   строку
пояснения, цикл пока не нажата клавиша «влево», «вправо», «Enter»,  «Esc»  –
опрашивает клавиатуру с помощью функции «Readkey»  если  нажата  «Вниз»  или
«Вверх» уменьшаетя или увеличивается соответственно текущий счетчик  позиций
меню

Функция Vstroca;
Функция организует главное меню в верхней строке экрана.
Устанавливает параметры цвета, выводит на экран массив  с  переменными  меню
т.е. названиями меню. Опрашивает  клавиатуру  на  нажатие  клавиши  «Влево»,
«Вправо», «Enter» выполняет соответствующие  этим  клавишам  команды.  Затем
если было нажато «Esc» функция  принимает  значение  меньшее  1  и  затем  в
головной программе происходит выход.

Процедура Sortirovka;
Сортирует данные по заданной колонке.
 Организуется цикл на все позиции массива  базы.  База  переносит  данные  в
стороннюю базу. Выбирает столбец сортировки сравнивает  со  сторонней  базой
если больше то переносит в стороннюю базу запоминает позицию. В конце  цикла
переставляет позиции основной базы.
Описание алгоритма работы программы.
Очищается экран выводится меню для  указания  месторасположения  и  названия
файла базы по умолчанию это «С:\base.dat» затем проверяется создан  ли  файл
если нет то создается.  Организуется  цикл  до  конца  файла  переписываются
данные в массив базы. Обнуляются переменные.  организуется  меню  по  данным
функции Vstroka затем происходи выбор с помощью оператора Case  по  которому
осуществляются переходы. В случае  «1»  прихода  функции  Vstroka  выводится
листинг данных базы и заголовков, организация движения  курсора  по  строкам
базы при помощи процедуры Vivlist. В случае результата «2» формируется  окно
с тенью «Пришло», заполняется окно с помощью процедуры  Prishlo  по  текущей
позиции  курсора  экрана  и  листинга.  «3»   формируется   окно   «Расход»,
заполняется  с  помощью  процедуры  Ushlo.  «4»  организуется  окно   «Найти
наименование» вводится  текст  с  помощью  функции  Edtext.  сравнивается  с
наименованиями базы если находит устанавливает курсор на это место. Если  не
находит выводит сообщение и устанавливает  на  конечную  позицию.  «5»  Окно
сортировки. Выполняется процедура Sortirovka. При других  значениях  функции
Vstroca происходит запись файла базы, закрытие файла.
                           II. Алгоритм программы.
                            IV. Текст программы.
Program kursovoi;
uses crt;
type  basskl = record
       naim:string[40];
       kol:integer;
       price:single;
       kol_p:integer;
       date_p:string[8];
       kol_r:integer;
       date_r:string[8];
       end;

var f:file of basskl;
    List:array[0..255] of basskl;
    Schet:Integer;
    curs,stran,i,mcurs:integer;
    k:char;
    Res,da,er,seter:Integer;
    Tx,files:String;
    key:boolean;
const
    mnu:array[1..6] of string[13]=(
    '    Ввод     ',
    '   Приход    ',
    '   Расход    ',
    '   Найти     ',
    '  Сортировка ',
    '   Выход     ');

function Probel(Text:String;Len:Integer):String;
 begin
   While length(Text)<Len do Text:=Text+' ';
   Probel:=copy(Text,1,len)
 end;

function Edtext(x,y:Integer; Text:String;Len:Integer;var
key:boolean):String;
 var c:char;
 begin
   key:=true;
   Edtext:='';
   repeat
     gotoxy(x,y);
     write(Text);
     write(Probel('',len));
     gotoxy(x,y);
     write(Text);
     c:=Readkey;
     if c=#8 then delete(Text,length(Text),1);
     if c in ['A'..'z',' ','.','0'..'9','А'..'я','-'] then Text:=Text+c;
     Text:=copy(Text,1,len);
   until (c=#27) or (c=#13);
   if c=#13 then Edtext:=Text else key:=false;
 end;

function Cifri(x,y:Integer; Text:String;Len:Integer;var
key:boolean):String;
 var c:char;
 begin
   key:=true;
   Cifri:='';
   repeat
     gotoxy(x,y);
     write(Text);
     write(Probel('',len));
     gotoxy(x,y);
     write(Text);
     c:=Readkey;
     if c=#8 then delete(Text,length(Text),1);
     if c in ['.','0'..'9','-'] then Text:=Text+c;
     Text:=copy(Text,1,len);
   until (c=#27) or (c=#13);
   if c=#13 then Cifri:=Text else key:=false;
 end;

procedure Prishlo(posiz:integer);
var Tx:String;
    er:integer;
    key:Boolean;
    kl:integer;
begin
     clrscr;
     With List[Posiz] do begin
     writeln('                     Приход');
     writeln(' Количество           ->');
     writeln(' Дата прихода ДД.ММ.ГГ->');
     val(Cifri(25,2,'',6,key),kl,er); if NOT key then exit;
     kol_p:=kol_p+kl; kol:=kol+kl;
     Date_p:=Cifri(25,3,'',8,key); if NOT key then exit;
     end;
end;

procedure Ushlo(posiz:integer);
var er:integer;
    key:Boolean;
    kl:integer;
begin
     clrscr;
     With List[Posiz] do begin
     writeln('                     Расход');
     writeln(' Количество           ->');
     writeln(' Дата расхода ДД.ММ.ГГ->');
     val(Cifri(25,2,'',6,key),kl,er); if NOT key then exit;
     kol_r:=kol_r+kl; kol:=kol-kl;
     Date_r:=Cifri(25,3,'',8,key); if NOT key then exit;
     end;
end;

procedure Vvodnov;
var Tx:String;
    er:integer;
    key:Boolean;
begin
     clrscr;
     With List[Schet] do begin
     writeln('                      Новый товар');
     writeln(' Наименование товара  :');
     writeln(' Количество           :');
     writeln(' Цена                 :');
     writeln(' Дата прихода ДД.ММ.ГГ:');  {readln(date_p);}
     Naim:=Edtext(25,2,'',20,key); if NOT key then exit;
     val(Cifri(25,3,'',6,key),kol,er); if NOT key then exit;
     kol_p:=kol;
     val(Cifri(25,4,'',10,key),price,er); if NOT key then exit;
     Date_p:=Cifri(25,5,'',8,key); if NOT key then exit;
     inc(Schet);
     end;
end;

procedure Edzapic(posiz:integer);
var Tx:String;
    er:integer;
    key:Boolean;
begin
     clrscr;
     With List[posiz] do begin
     writeln('                   Редактирование товара');
     writeln(' Наименование товара  :');
     writeln(' Цена                 :');
     Tx:=Edtext(25,2,Naim,20,key); if key then Naim:=tx;
     str(price:0:2,tx);
     tx:=Cifri(25,3,tx,10,key);  if key then val(tx,price,er);
     end;
end;

 function vstroca(var curs:integer):integer;
 var i:integer;
 begin
     Textbackground(15);
     TextColor(0);
     gotoxy(1,1); write(Probel('',80));
  for i:=0 to 5 do
  begin
     gotoxy(i*13+1,1); write(mnu[i+1]);
  end;
     Textbackground(0);
     TextColor(14);
     gotoxy((curs-1)*13+1,1); write(mnu[curs]);
  repeat
     k:=readkey;
     Textbackground(15);
     TextColor(0);
     gotoxy((curs-1)*13+1,1); write(mnu[curs]);
     if k=#0 then k:=readkey;
     case k of
     #75: if curs>1 then dec(curs) else curs:=6;
     #77: if curs<6 then inc(curs) else curs:=1;
     end;
     Textbackground(0);
     TextColor(14);
     gotoxy((curs-1)*13+1,1); write(mnu[curs]);
     if k=#13 then vstroca:=curs;
  until (k=#27) or (k=#13);
  if k=#27 then vstroca:=-1;
  end;

 function VIVSTR(nstr:integer):String;
 var Skol,sprice,summ,
     Pkol,Rkol:String[10];
 begin
     VIVSTR:='';
     if (nstr<Schet) and (nstr>=0) then
     With List[nstr] do
     begin
         str(kol,skol);
         str(price:9:2,sprice);
         str(price*kol:9:2,summ);
         str(kol_p,pkol);
         str(kol_r,rkol);

VIVSTR:=Probel(naim,20)+Probel(skol,6)+Probel(sprice,11)+Probel(summ,11)+
         Probel(Pkol,6)+Probel(Date_p,10)+Probel(Rkol,6)+Probel(Date_r,9);
     end;
 end;

 procedure Ekran;
 var i:integer;
     Summ_,Sum_p,Sum_r:Double;
 begin
     Window(1,2,80,25);
     Textbackground(5);
     TextColor(10);
     Clrscr;
     gotoxy(1,1);
     Textbackground(3);
     write(Probel('Наименование',20)+Probel('Кол-во',9)+Probel('Цена',10)+
     Probel('Сумма',7)+Probel('Приход ',7)+Probel('Дата
пост',10)+Probel('Расход',6)
     +Probel(' Дата выд',9));
     Textbackground(5);
     TextColor(14);
     for i:=0 to 20 do
     begin
       gotoxy(1,2+i); Write(Vivstr(i+stran));
     end;
     Textbackground(15);
     TextColor(0);
     gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
     Summ_:=0; Sum_p:=0; Sum_r:=0;
     for i:=0 to Schet-1 do
     begin
       Summ_:=Summ_+(List[i].price*List[i].kol);
       Sum_p:=Sum_p+(List[i].price*List[i].kol_p);
       Sum_r:=Sum_r+(List[i].price*List[i].kol_r);
     end;
     Textbackground(4);
     TextColor(15);
     gotoxy(1,23); write(Probel('',80));
     gotoxy(1,23); write(' Итого:     ',
        Summ_:12:2,' руб.   Приход: ',Sum_p:0:2,' руб.
Расход:',Sum_r:0:2,' руб.');
         gotoxy(15,24); write ('Общее количество наименований товара:
',schet,' шт');
 end;

procedure Sortirovka(num:Integer);
var i,j,k:Integer;
    Bas:Basskl;
begin
 for i:=0 to Schet-1 do
 begin
   Bas:=List[i];
   for j:=i+1 to Schet-1 do
   begin
     case Num of
    1: if Bas.Naim>List[j].naim then begin Bas:=List[j]; k:=j end;
    2: if Bas.kol>List[j].kol then begin Bas:=List[j]; k:=j end;
    3: if Bas.price>List[j].price then begin Bas:=List[j]; k:=j end;
    5: if Bas.kol_p>List[j].kol_p then begin Bas:=List[j]; k:=j end;
    6: if Bas.date_p>List[j].date_p then begin Bas:=List[j]; k:=j end;
    7: if Bas.kol_r>List[j].kol_r then begin Bas:=List[j]; k:=j end;
    8: if Bas.date_r>List[j].date_r then begin Bas:=List[j]; k:=j end;
      end;
    end;
    List[k]:=List[i]; List[i]:=Bas;
  end;
end;

 procedure Vivlist(var seek,curs:integer);
 var c,k:char;
     i:integer;
 begin
   Ekran;
   Textbackground(3);
   gotoxy(1,24); write(Probel(' <- -> - меню | Ins - Добавить | Ctrl+F8 -
Удалить | Ctrl+Enter - Изменить',79));
   Textbackground(15);
   TextColor(1);
   gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
   repeat
     c:=readkey;
     Textbackground(5);
     TextColor(14);
     gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
     if c=#0 then k:=readkey;
     case k of
     #72: begin  {Вверх курсор}
           if (curs=1) and (stran>0) then begin dec(stran); Ekran end;
           if (curs>1) then dec(curs);
          end;
     #80: begin  {Вниз курсор}
           if (curs=20) and (stran+20<Schet) then
             begin inc(stran); Ekran end;
           if ((curs<20) and (Schet>=20))
           or ((Schet<20) and (curs<Schet)) then inc(curs);
          end;
     #101:  begin{Удалить} {Ctrl+F8}
            if Schet>0 then
            for i:=curs+stran-1 to Schet-1 do
            begin
              List[i]:=List[i+1];
            end;
            dec(Schet);
            dec(curs);
            Ekran;
          end;
      #82: begin  {Ins  - новая запись}
            Window(12,12,72,17);
            Textbackground(0);
            clrscr;
            Window(10,11,70,16);
            Textbackground(7);
            clrscr;
            {новоя запись}
            Vvodnov;
            Sortirovka(1);
            Window(1,1,80,25);
            Ekran;
          end;
     end;
     if c=#10 then {Ctrl+Enter}
     begin
            Window(12,12,72,17);
            Textbackground(0);
            clrscr;
            Window(10,11,70,16);
            Textbackground(7);
            clrscr;
            {новоя запись}
            Edzapic(Curs+stran-1);
            Sortirovka(1);
            Window(1,1,80,25);
            Ekran;
     end;
     Textbackground(15);
     TextColor(1);
     gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
  until (k=#27) or (k=#13) or (k=#75)or (k=#77);
  Window(1,1,80,25);
 end;

begin
  clrscr;
  Window(16,12,66,15);
  Textbackground(9);
  textcolor (3);
  clrscr;
  write ('       Введите название и полный путь базы');
  gotoxy (3,3);
  readln (files);
  if files='' then files:='c:\base.dat';
  assign(f,files);
  {$I-}
  reset(f);
  {$I+}
  if IOResult<>0 then rewrite(f);
  Schet:=0;
  While not eof(f) do
  begin
    inc(Schet);
    read(f,List[Schet-1]);
  end;
  Textbackground(0);
  clrscr;
  curs:=1; stran:=0; mcurs:=1; seter:=15;
  repeat
   Ekran;
   Window(1,1,80,25);
   res:=vstroca(mcurs);
   case res of
   1:begin
       Vivlist(stran,curs);
       Window(1,1,80,25);
       end;
   2:begin
       Window(16,12,66,15);
       Textbackground(0);
       clrscr;
       Window(14,11,64,14);
       Textbackground(7);
       clrscr;
       {Запуск новой записи}
       Prishlo(Curs+stran-1);
       Window(1,1,80,25);
     end;
   3:begin
       Window(16,12,66,15);
       Textbackground(0);
       clrscr;
       Window(14,11,64,14);
       Textbackground(7);
       clrscr;
       {Запуск новой записи}
       Ushlo(Curs+stran-1);
       Window(1,1,80,25);
     end;
   4:begin {Поиск}
       Window(16,12,66,14);
       Textbackground(7);
       clrscr;
       Window(14,11,64,13);
       Textbackground(8);
       clrscr;
       Gotoxy(2,2); Write('Найти наименование:');
       Tx:=Edtext(25,2,'',20,key);
       for i:=0 to Schet-1 do
       if List[i].naim=tx then begin seter:=1; break; end;
       if i>20 then begin curs:=1; stran:=i end
       else begin curs:=i+1; stran:=0; end;
       if seter<>1 then
       begin
       Window(16,12,66,14);
       Textbackground(7);
       clrscr;
       Window(14,11,64,13);
       Textbackground(8);
       clrscr;
       Gotoxy(2,2); Write('Наименование ненайдено'); readln; stran:=1;
curs:=1;
      end;
      Vivlist(stran,curs);
       Window(1,1,80,25);
     end;

      5:begin {Сортировка}
       Window(16,12,66,14);
       Textbackground(0);
       clrscr;
       Window(14,11,64,13);
       Textbackground(7);
       clrscr;
       Gotoxy(2,2); Write('Введите поле для сортировки (1..8):');
       val(Cifri(38,2,'',1,key),da,er);
       if da in [1..8] then  Sortirovka(da);
       Window(1,1,80,25);
     end;

   end;
  until (res<1) or (res=6);
  Rewrite(f);
  Sortirovka(1);
  for i:=0 to Schet-1 do Write(f,List[i]);
  close(f);
end.



-----------------------

Выполнила:


студентка гр. ВМ1-99


Н.В. Позднякова

Проверил:
старший преподаватель

А.И. Волков



            Ижевского Государственного Технического Университета


                     Чайковский Технологический Институт



                Кафедра общественно образовательных предметов


г. Чайковский, 2000 г.

ТЕМА: Автоматическое рабочее место для работы со складом.


                               Курсовая работа



           Министерство общего и профессионального образования РФ