Baza danych - projekt w Pascalu.

0

Czesć! Mam do napisania projekt sklepu. Mam mieć 3 pliki rekordowe.
Magazyn- zawiera, nazwy towarów, id, ilość
Klienci: imiona, nazwiska, towar zakupiony, ilość zakupionego towaru
Sprzedaż: Nazwa, ilość, cena, id

Może mi ktoś wyjaśnić jak mam to połączyć wszystko? wg moje toku myslenia ( pewnie błędny)

1 Dodajemy towar do magazynu ( nazwa, ilość, id)
2 Sprawdzamy czy towar jest w magazynie, jeżeli jest dodajemy do sprzedaży go ( dodając cenę), jeżeli nie wypisujemy odpowiedni komunikat
3 sprzedajemy towar- tzn klient kupuje towar, podaje swoje dane oraz nazwe towaru i ilość zakupu- zapisujemy do pliku
4 zmniejszamy towar w pliku sprzedaży o tyle o ile klient zakupił towar.

Dobrze myślę? Jeżeli tak to teraz implementacja; kod jaki napisałem jednak odbiega od powyższego schematu sporo.. tzn zapisuje towary do pliku magazyn, odczytuje caly plik magazynu, dodaje klientów( bez sprawdzenia na razie czy towar istnieje) oraz odczytuje liste klientów

Problemem moim jest; Jak mam sprawdzic czy jest taki towar w magazynie? oraz jak zmniejszyć ilość towaru w sprzedaży kiedy klient kupi towar?
Nie wiem czy nie powinienem tu użyć tablic rekordowych i najpierw do nich zapisywać dane a dopiero potem do pliku...

program SKLEP;

{$mode objfpc}{$H+}

uses  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };



type
bazmagazyn =record
 nazwa:string[50];
 ilosc:integer;
 id:integer;
 rodzaj: string[30];
end;

type
  bazklijent = record
   imie: string [20];
   nazwisko: string[30];
   towar:string[50];
   ilosc: word;
  end;

  type
    bazsprzedaz= record
    nazwa:string[50];
    id : word;
    cena: word;
    end;

var
 dodtowar: bazmagazyn;
 dodklijent: bazklijent;
magazyn:file of bazmagazyn;
klijent: file of bazklijent;
sprzedaz: file of bazsprzedaz;

menu, menu2: byte;
maxilosc,i:word;


procedure dodaj_towar();


begin
{$I-}
assign(magazyn, 'magazyn.sdb');
reset(magazyn);
seek(magazyn,filesize(magazyn));
writeln('prosze podac nazwe towaru');
readln(dodtowar.nazwa);
writeln('podaj ilosc towaru');
readln(dodtowar.ilosc);
writeln('podaj id towaru');
readln (dodtowar.id);
write(magazyn,dodtowar);
close(magazyn);
{$I+}

 end;

procedure  odczytaj_dane();
      var
      tab: array[1..100] of bazmagazyn;
      ilosc,x:integer;

  begin
  {$I-}

  assign(magazyn,'magazyn.sdb');
  reset(magazyn);

while not EOF(magazyn) do
begin

read(magazyn, dodtowar);
writeln( 'Nazwa towaru - ' , dodtowar.nazwa);
writeln('Ilosc towaru w magazynie - '  , dodtowar.ilosc);
writeln('ID towaru -  ' ,   dodtowar.id);
writeln;
end;

close(magazyn);
{$I+}

  end;


{procedure szukaj_id();
var
id:integer;
begin
 assign(magazyn, 'magazyn.sdb');
 reset (magazyn);
 writeln('Podaj ID towaru jakiego szukasz');
 readln(id);
 if id=  then
  writeln(dodtowar.nazwa, dodtowar.ilosc, dodtowar.id)
    else
      writeln('brak ID');

  end;
  }
 procedure dodaj_klijent();
 var  ilosc:integer;

 begin

 assign(klijent, 'klijent.sdb');
 reset (klijent);
 seek(klijent,filesize(klijent));
 writeln('Podaj swoje imie');
 readln(dodklijent.imie);
 writeln('Podaj swoje nazwisko');
 readln(dodklijent.nazwisko);
 writeln('Jaki towar chcesz zakupic?');
 readln(dodklijent.towar);
 writeln('podaj ilosc zakupu');
 readln(dodklijent.ilosc);
 if ilosc<1 then writeln('przepraszamy, ale ilsoc towaru nie moze byc mniejsza od 1');
 write(klijent, dodklijent);
 close(klijent);
  end;

 procedure odczyt_klijent();
    begin
 assign(klijent,'klijent.sdb');
  reset(klijent);
while not EOF(klijent) do
begin
read(klijent, dodklijent);
writeln( 'Imie  - ', dodklijent.imie);
writeln('Nazwisko - ', dodklijent.nazwisko);
writeln('Towar - ', dodklijent.towar);
writeln( 'Ilosc - ', dodklijent.ilosc);

end;

close(klijent);

   end;
begin
      repeat
 writeln('Witaj w bazie danych: ');
 writeln(' 1 - Dodaj towar do sprzedazy');
 writeln(' 2 - Odczytaj cala baze');
 writeln(' 3 - Wyswietl konkretny towar po ID.');
 writeln(' 4 - Edytuj towar po ID.');
 writeln(' 5 - Dodaj klijenta sklepu');
 writeln(' 6 - wyswietl klijentow sklepu');
 writeln(' 7 - Koniec programu');
   writeln;
   writeln (' Prosze wybrac swoja opcje: ');

     readln(menu);


 case menu of


 1:begin
       writeln('Ile chcesz  dodac towarow?');
          readln(maxilosc);
      for i:=1 to maxilosc do

       begin

      dodaj_towar;
      writeln('Dziekuje, zapisano informacje do bazy');
       end;
     end;
 2: begin
    writeln('towar na magazynie to:');
    odczytaj_dane;
    end;
 3:   begin
     // szukaj_id;
      end;
 4:begin
   end;
 5:begin
     dodaj_klijent;
     writeln('zlozono zamowienie, dziekujemy');
   end;
   6:  begin
      writeln('dane klijentow sklepu to: ');
      odczyt_klijent;
       end;
 end;
 until menu=7;
readln;
end.
1
  1. Formatowanie
  2. Nazwy zmiennych, funkcji i procedur po angielsku.
  3. Pomysł z tablicami rekordów dobry bo to jest mały projekt pewnie na zaliczenie więc tablice wystarczą, ewentualnie listy.
  4. Do zapisu wykorzystaj TFileStream. Jeśli używasz turbo pascala to zerknij tu: http://www.lazarus.freepascal.org
  5. Obuduj wszystko w odpowiednie klasy/klasę.
  6. Jeśli zdecydujesz się zamiast tablic wykorzystać listę jednokierunkową bo do tego wystarczy to zerknij tu: http://pastebin.com/WnqrWvap (autor: @furious programming) przy czym musisz zmienić TData na odpowiedni typ oraz poprawić metodę Find (niestety superuniwersalnej klasy tego typu się nie da zrobić).
  7. A jeśli stwierdzisz jednak, że brak Ci wiedzy i chcesz by ktoś Ci to zrobił to kontaktuj się ze mną na PW przy czym na wiadomości z ofertami poniżej 100zł nawet nie odpowiem.
0

Nie mieliśmy list oraz klas- klasy= programowanie obiektowe? Nie chcę by ktoś mi to robił, tym bardziej za pieniądze. Jak sam nie zrobię, to co mi po studiach jak nic umiał nie będę? Czasami jednak brak pomysłu na rozwiązanie dalszego problemu.

0

No to zrób to na talicy dynamicznej tych rekordów. A poza tym jakiej pomoc od nas oczekujesz? Póki nie sformatujesz kodu po ludzku (jeśli nie umiesz sam, to są do tego gotowe narzędzia i rozwiązania) to niewiele osób będzie chciało na to spojrzeć. Nie pisząc już o tym, że wszelką dodatkową pomoć znajdziesz googlując.

0

Jak można wczytać plik do tablicy rekordów?

0

Funkcjami BlockRead albo ReadFile z WinAPI. I może pokombinuj oraz pogoogluj zanim zapytasz.

0

albo pętelką ;)

0

Koledzy skupili się na poradach czysto programistycznych, natomiast wydaje mi się, że zabrakło jednej tabeli do pełnego rozwiązania zadania, bo w takim razie tabela z danymi kupującego jest albo zbyteczna, albo powinna wymaga uzupełnienia dodatkowymi dwiema, transakcji klienta i jego zakupów - na tej podstawie można zdjąć stan z magazynu (chociażby). W obecnym projekcie "sklep" nie wypełnia zadania nauki programowania. Zadanie powinno być skonsultowane z nauczycielem i doprecyzowane - przecież w przyszłości (niekoniecznie programistycznej) musisz wiedzieć co lub czego od Ciebie oczekują - więc nie obawiaj sie zadawać pytań zleceniodawcy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1