Автоматическое рабочее место для работы со складом ВВедение.
Данная программа автоматизированного рабочего места разработана для работников складских помещений, естественно если у них имеется компьютер классом не ниже Pentium. Сейчас на рынке программного обеспечения появляются все больше и больше различных программ для работы не только со складом, но и различные другие программные средства автоматизированного рабочего места, но стоимость их лицензионных копий доходит порой до нескольких десятков тысяч, а моя программа может быть конечно маленько еще “сыровата”, но в процессе работы с нею её можно “довести ее до ума” и все это лишь за пятерку по программированию цена не велика за произведение программного искусства. Каковы её плюсы: ну это естественно простота и понятность (для русского человека) интерфейса программы, что не требует дополнительного обучения или прохождения специальных курсов, особенно для женщин, работающих на складах и не посвященных в азы компьютеров и программного обеспечения; не требовательность к системным ресурсам машины; легкость ввода и отслеживания; простота резервирования базы данных (всего 1 файл), что не маловажно для такой программы.
При написании и разработке курсового проекта я научился работать с Borland Pascal, Microsoft Windows 95OSR2, Microsoft Word 97 SR-2 которые использовались для работы над курсовым проектом, научился использовать справку и другие функции Borland Pascal при этом даже разобрался с английским языком и использованием электронных словарей переводчиков таких как Promt, Stylus, Magic Gooddy 98. Огромное спасибо Волкову А. И. – за отличное преподавание предметов, Billу Gaits – за то что он умеет зарабатывать деньги собственным умом, Мерзлякову Д. С. – за поддержку в трудную минуту, Барышеву А. А. – за техническую поддержку, Русских А. И. – за программную поддержку, Казакову В. С. –за разрешение работать на компьютере, Sting, Queen, и другим за хорошую музыку во время работы над курсовым. Задание.
Составить программу автоматического рабочего места для работы со складом. Программа должна предоставлять пользователю возможность: Вводить новый товар, указывая следующие параметры Наименование; Количество; Цену; Дату поступления.
Осуществлять поиск товара по наименованию и выдавать его параметры. Помечать выбывший товар, указывая дату выдачи.
Выводить список имеющегося товара с возможностью сортировки по любому параметру.
Выводить список выбывшего товара с возможностью сортировки по любому параметру. Выдавать общую статистическую характеристику: Общая стоимость имеющегося товара; Количество имеющегося товара; Количество выбывшего товара. Сохранять и восстанавливать всю информацию АРМ с диска. Описание переменных. basskl – основная запись с необходимыми переменными это: naim – наименование товара; kol – количество товара; price – цена товара; kol_p – количество пришедшего товара; kol_r – количество товара который ушел; date_p – дата прихода товара; date_r – дата расхода товара. f – file базы слада; list – массив данных базы; schet – cчетчик; curs – показатель позиции; stran – счетчик позиции курсора; i – переменная использования; mcurs – переменная начальной позиции меню; k –переменная определения клавиши; res –переменная выбора меню; da – переменная использования; er – переменная ошибки преобразования; tx – переменная текста при поиске; fil – переменная имени базы; key – флажок; 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 происходит запись файла базы, закрытие файла. Алгоритм программы. 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) 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 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=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 begin inc(stran); Ekran end; if ((curs=20)) or ((Schet 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 IOResult0 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 seter1 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 Rewrite(f); Sortirovka(1); for i: =0 to Schet-1 do Write(f, List[i]); close(f); end.