Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Uses Crt;
- type
- Items = Record
- Id: word;
- Name: string[20];
- Manufacturer: string[20];
- Size: byte;
- Date: string[8];
- Price: longword;
- end;
- Orders = Record
- Id: word;
- Item: word;
- Name: string[20];
- Adress: string[20];
- Count: byte;
- Date: string[8];
- IsPaid: boolean;
- end;
- var
- Fv1: file of Items;
- ItemsTable: Items;
- ItemsEmpty: Items;
- Fv2: file of Orders;
- OrdersTable: Orders;
- temp: longword;
- ItemsToDelete: array[0..3] of word := (word.MaxValue,
- word.MaxValue, word.MaxValue, word.MaxValue);
- const
- ItemsName = 'Items.rost';
- ItemsBackup = 'ItemsBackUp.rost';
- OrdersName = 'Orders.rost';
- YesChar = 'yYуУ';
- NoChar = 'nNиИ';
- procedure AddItem;
- var
- input: string;
- begin
- if (FileSize(Fv1) > 0) then
- begin
- Seek(Fv1, FileSize(Fv1) - 1);
- Read(Fv1, ItemsTable);
- ItemsTable.Id := ItemsTable.Id + 1;
- end
- else ItemsTable.Id := 0;
- ItemsTable.Size := 0;
- repeat
- Write('Имя товара: ');
- Readln(input);
- until (input.Length <= 20) and (input <> ''.ToString());
- ItemsTable.Name := input;
- repeat
- Write('Производитель: ');
- Readln(input);
- until (input.Length <= 20) and (input <> ''.ToString());
- ItemsTable.Manufacturer := input;
- Write('Есть ли размер S (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 1;
- Write('Есть ли размер M (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 2;
- Write('Есть ли размер L (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 4;
- Write('Есть ли размер XL (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 8;
- repeat
- Write('Дата: ');
- Readln(input);
- input.Replace('.', '')
- until (input.Length = 8) and longword.TryParse(input, temp);
- ItemsTable.Date := input;
- repeat
- Write('Стоимость: ');
- Readln(input);
- until longword.TryParse(input, ItemsTable.Price);
- Write(Fv1, ItemsTable);
- end;
- procedure Show(Table: Items);
- begin
- if Table.Name = '' then
- begin
- exit;
- end;
- var size: string = ((Table.Size and 8) = 8 ? ' XL;' : '') + ((Table.Size and 4) = 4 ? ' L;' : '') + ((Table.Size and 2) = 2 ? ' M;' : '') + ((Table.Size and 1) = 1 ? ' S;' : '');
- WriteLn('Id:' + Table.Id.ToString() + ' Name:' + Table.Name + ' Manuf:' + Table.Manufacturer +
- ' Size:' + size + ' Price:' + Table.Price.ToString() + ' Date:' + Table.Date.ToString() + 'To Delete: ' + ItemsToDelete.Contains(Table.Id).ToString);
- end;
- procedure ListItems;
- begin
- Seek(Fv1, 0);
- while not (EOF(Fv1)) do
- begin
- Read(Fv1, ItemsTable);
- Show(ItemsTable);
- end;
- end;
- function FindById(Id: word): Items;
- begin
- ItemsTable.Id := MaxLongWord;
- Seek(Fv1, 0);
- while (not EoF(Fv1)) and (ItemsTable.Id <> Id) do
- begin
- Read(Fv1, ItemsTable);
- end;
- if ItemsTable.Id = Id then
- begin
- Result := ItemsTable;
- end
- else
- begin
- WriteLn('Не нашелся объект с таким Id');
- Result := ItemsEmpty;
- end;
- end;
- function FindById: Items;
- begin
- var Id: word;
- var input: string;
- repeat
- Write('Введите Id записи: ');
- ReadLn(input);
- until word.TryParse(input, Id);
- Result := FindById(Id);
- end;
- procedure FindByName;
- var
- name: string;
- count: word = 0;
- begin
- Write('Введите название товара: ');
- ReadLn(name);
- name := name.ToLowerInvariant;
- Seek(Fv1, 0);
- ItemsTable.Name := #13;
- while (not EoF(Fv1)) do
- begin
- Read(Fv1, ItemsTable);
- if Pos(name, ItemsTable.Name.ToLowerInvariant) = 1 then
- begin
- show(ItemsTable);
- count := count + 1;
- end
- end;
- if count = 0 then WriteLn('Не нашелся объект с таким именем');
- end;
- procedure AddOrder;
- var
- input: string;
- begin
- if (FileSize(Fv2) > 0) then
- begin
- Seek(Fv2, FileSize(Fv2) - 1);
- Read(Fv2, OrdersTable);
- OrdersTable.Id := OrdersTable.Id + 1;
- end
- else OrdersTable.Id := 0;
- repeat
- Write('Id товара: ');
- Readln(input);
- until (word.TryParse(input, OrdersTable.Item)) and (FindById(OrdersTable.Item) <> ItemsEmpty);
- repeat
- Write('Имя: ');
- Readln(input);
- until (input.Length <= 20) and (input <> ''.ToString());
- OrdersTable.Name := input;
- repeat
- Write('Адрес: ');
- Readln(input);
- until (input.Length <= 20) and (input <> ''.ToString());
- OrdersTable.Adress := input;
- repeat
- Write('Количество: ');
- Readln(input);
- until byte.TryParse(input, OrdersTable.Count) and (OrdersTable.Count > 0);
- repeat
- Write('Дата заказа: ');
- Readln(input);
- input.Replace('.', '')
- until (input.Length = 8) and longword.TryParse(input, temp);
- OrdersTable.Date := input;
- Write('Заказ оплачен?(y or n): ');
- Readln(input);
- OrdersTable.IsPaid := YesChar.Contains(input) ? True : False;
- Write(Fv2, OrdersTable);
- end;
- procedure Show(Table: Orders);
- begin
- if Table.Name = '' then
- begin
- exit;
- end;
- WriteLn('Id:' + Table.Id.ToString() + ' ItemId:' + Table.Item.ToString() + ' ItemsName:' + FindById(Table.Item).Name + ' Name:' + Table.Name + ' Adress:' + Table.Adress +
- ' Count:' + Table.Count.ToString() + ' Date:' + Table.Date.ToString());
- end;
- procedure ListOrders;
- begin
- Seek(Fv2, 0);
- while not (EOF(Fv2)) do
- begin
- Read(Fv2, OrdersTable);
- Show(OrdersTable);
- end;
- end;
- procedure Delete;
- var
- input: string;
- begin
- ItemsTable := FindById;
- Show(ItemsTable);
- if ItemsTable.Id <> ItemsEmpty.Id then begin
- if ItemsToDelete.Contains(ItemsTable.Id) then begin
- Write('Вы хотите отменить удаление? (y or n): ');
- ReadLn(input);
- if YesChar.Contains(input) then begin
- ItemsToDelete[ItemsToDelete.FindIndex(x -> x = ItemsTable.Id)] := word.MaxValue;
- end;
- end
- else
- begin
- Write('Вы хотите удалить? (y or n): ');
- ReadLn(input);
- if YesChar.Contains(input) then begin
- for var i := 0 to ItemsToDelete.Length - 1 do
- begin
- if ItemsToDelete[i] = word.MaxValue then begin
- ItemsToDelete[i] := ItemsTable.Id;
- end;
- end;
- end;
- end;
- end;
- end;
- procedure Zap;
- var
- Fv3: file of Items;
- begin
- Assign(Fv3, ItemsBackup);
- Rewrite(Fv3);
- Seek(Fv1, 0);
- while not (EOF(Fv1)) do
- begin
- Read(Fv1, ItemsTable);
- if not ItemsToDelete.Contains(ItemsTable.Id) then
- Write(Fv3, ItemsTable);
- end;
- Close(Fv1);
- Erase(Fv1);
- Close(Fv3);
- Rename(Fv3, ItemsName);
- Reset(Fv1);
- end;
- procedure Edit;
- type
- Data = (Name, Manufacturer, Size, Date, Price, Сохранить);
- begin
- var input: string;
- var choice := Data.Name;
- ItemsTable := FindById;
- Show(ItemsTable);
- var c: char;
- while choice <> Data.Сохранить do
- begin
- ClearLine;
- Console.SetCursorPosition(0, Console.CursorTop);
- Write('Что хотите изменить?: ');
- Write(choice.ToString);
- c := Readkey();
- if c = #0 then begin
- c := ReadKey();
- case c of
- #39: choice := Data(Min(ord(choice) + 1, 5));
- #37: choice := Data(Max(ord(choice) - 1, 0));
- end;
- end
- else
- begin
- if c <> #13 then continue;
- WriteLn('');
- case choice of
- Data.Name:
- begin
- repeat
- Write('Имя товара: ');
- Readln(input);
- until (input.Length <= 20) and (input <> ''.ToString());
- ItemsTable.Name := input;
- end;
- Data.Date:
- begin
- repeat
- Write('Дата: ');
- Readln(input);
- input.Replace('.', '')
- until (input.Length = 8) and longword.TryParse(input, temp);
- ItemsTable.Date := input;
- end;
- Data.Size:
- begin
- ItemsTable.Size := 0;
- Write('Есть ли размер S (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 1;
- Write('Есть ли размер M (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 2;
- Write('Есть ли размер L (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 4;
- Write('Есть ли размер XL (y or n): ');
- Readln(input);
- if YesChar.Contains(input) then ItemsTable.Size += 8;
- end;
- Data.Price:
- begin
- repeat
- Write('Стоимость: ');
- Readln(input);
- until longword.TryParse(input, ItemsTable.Price);
- end;
- Data.Manufacturer:
- begin
- repeat
- Write('Производитель: ');
- Readln(input);
- until (input.Length <= 20) and (input <> ''.ToString());
- ItemsTable.Manufacturer := input;
- end;
- Data.Сохранить:
- begin
- Seek(Fv1, ItemsTable.Id);
- Write(Fv1, ItemsTable);
- Show(ItemsTable);
- end;
- end;
- end;
- end;
- end;
- procedure Test;
- begin
- while True do
- begin
- WriteLn(ord(ReadKey()));
- end;
- end;
- procedure OpenDB;
- begin
- Assign(Fv1, ItemsName);
- Assign(Fv2, OrdersName);
- if not FileExists(ItemsName) then Rewrite(Fv1)
- else ReSet(Fv1);
- if not FileExists(OrdersName) then Rewrite(Fv2)
- else ReSet(Fv2);
- ItemsEmpty.Id := word.MaxValue;
- end;
- procedure CloseDB;
- begin
- Close(Fv1);
- Close(Fv2);
- end;
- procedure Menu;
- var
- input: string;
- begin
- WriteLn('Для списка команд введите help');
- while true do
- begin
- write('Введите команду: ');
- ReadLn(input);
- case input of
- 'add items': AddItem;
- 'add orders': AddOrder;
- 'list items': ListItems;
- 'list orders': ListOrders;
- 'quit': exit;
- 'find id': Show(FindById);
- 'find name': FindByName;
- 'clear': clrscr;
- 'edit': edit;
- {'delete': delete;}
- 'zap': zap;
- 'help':
- WriteLn('add items/orders - добавить значение в таблицу Товары/Заказы'
- + NewLine + 'list items/orders - вывести таблицу Товары/Заказы' + NewLine + 'find name - поиск по имени' + NewLine
- + 'find id - поиск по id' + NewLine + 'clear - отчистить консоль' + NewLine + 'quit - выйти');
- end;
- end;
- end;
- begin
- OpenDB;
- Menu;
- CloseDB;
- end.
Add Comment
Please, Sign In to add comment