Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pascal-projekt sklepu-baza danych

Boshi 30 Gru 2013 19:19 2487 28
  • #1 30 Gru 2013 19:19
    Boshi
    Poziom 12  

    Cześc, mam stworzyć bazę danych w pascalu, problemem jest na razie o co dokładnie chodziło nauczycielowi a mianowicie.

    Baza danych do której mozna dodawać, kasować, przeglądać(z pliku), kiedy ktos kupi jakis towar, to ilosc w magazynie ma sie zmniejszyc o dana ilosc, ale, ale; mam mieć dwa pliki elementowe, w którym jeden jest baza rekordow jeden : sprzedaż a drugi kupno. Nie bardzo wiem jak to wszystko mam połączyc. Ma być to sklep internetowy generalnie. Jak ma to rozumieć? w pliku sprzedaż mam mieć towary zapisane a w kupnie tak jak by magazyn i on zmieniałby się jeżeli ktoś zakupi towar ? Niestety bardzo skąpo nam to nauczyciel wytłumaczył.

    Jako, że zapis i odczyt z pliku jak i całe menu nie są dla mnie jakimś problem, te dwa pliki nie bardzo rozumiem.

    0 28
  • #2 30 Gru 2013 21:02
    Dżyszla
    Poziom 42  

    Można to zrealizować tak, że baza (tabela) zakupów będzie przechowywać przykładowo ID, towar, ilość, ilość_składowana; a sprzedaż: ID, towar, ilość, ID_dostawy (czyli zakupu). Teraz dodając dane do sprzedaży wyszukujesz na zakupach tam, gdzie jest dany towar w ilości_składowanej > 0 i zmniejszasz o tyle, o ile sprzedajesz. Przynajmniej ja bym to tak widział :)

    0
  • #3 31 Gru 2013 01:27
    Boshi
    Poziom 12  

    Ja myślałem to mniej więcej tak:

    Główny program z menu całym , dodawanie, kasowanie, sortowanie itd
    1 plik- sprzedaż- przechowuje jak pisałels; ID towaru, ilosc jego id-dostawy itd
    2 plik - kupno -inwentaryzacje produktów, ilsoc aktualnie składowana itd.

    Teraz, wybieram opcje sprzedazy towaru np 2 książki, po akceptacji ilosc w pliku kupno sie zmniejsza? a gdy np dodam kolejna ksiazke to ilosc sie zwiekszy w pliku kupno?

    jezuu nie wiem jak ja to zaimplementuje do programu.

    p.s Gdyby to była baza danych mysql :D

    0
  • #4 31 Gru 2013 17:00
    Dżyszla
    Poziom 42  

    Ale w takim układzie nie masz zakupów, tylko stany magazynowe. Jeśli np będziesz chciał liczyć marżę, to mocno sobie to utrudnisz; nie masz też ewidencji zakupów. Przynajmniej ja tak to widzę.
    Nie ma znaczenia, czy to SQL tak, inny czy własny mechanizm - my tu rozmawiamy nad organizacją bazy a nie implementacją ;)

    0
  • #5 01 Sty 2014 17:52
    Boshi
    Poziom 12  

    Więc resumując już.

    główny program z menu
    plik sprzedaży
    plik kupna?

    0
  • #7 10 Sty 2014 13:43
    Boshi
    Poziom 12  

    Dobra zacząłem to powoli pisać, ale natknąłem się na problem natury technicznej niestety :)

    Jak można zrobić wyszukiwanie po nazwie lub id towaru ? moim pomysłem jest stworzenie tablicy rekordów i wszystko zapisywane do niej, bo w tej chwili program zapisuje od razu do pliku dane. Nie mam pomysłu jak to można zrobić teraz ? program przecież nie znajdzie sobie w pliku ID np 5 i wyświetli go.. nie jest aż tak inteligentny.

    Ktoś pomoże?

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    0
  • #8 10 Sty 2014 14:04
    arnoldziq
    Moderator Programowanie

    Niestety, w takiej "ręcznie" tworzonej bazie danych, wszelkie wyszukiwanie musisz wykonać samodzielnie.
    Prosta pętka; odczytujesz rekordy po kolei i powtarzasz tę operację do momentu natrafienia na wyszukiwaną informację, lub koniec pliku.

    0
  • #9 10 Sty 2014 15:28
    the_fifth_horseman
    Poziom 32  

    Boshi napisał:
    Dobra zacząłem to powoli pisać, ale natknąłem się na problem natury technicznej niestety :)

    Jak można zrobić wyszukiwanie po nazwie lub id towaru ? moim pomysłem jest stworzenie tablicy rekordów i wszystko zapisywane do niej, bo w tej chwili program zapisuje od razu do pliku dane. Nie mam pomysłu jak to można zrobić teraz ? program przecież nie znajdzie sobie w pliku ID np 5 i wyświetli go.. nie jest aż tak inteligentny.

    Ktoś pomoże?
    Nie musisz wszystkich rekordów przechowywać w pamięci. Zapoznaj się z drzewami binarnymi oraz B-drzewami. Zindeksuj plik zawierający rekordy wykorzystując do tego drzewa. Zapisz je w osobnym pliku. Przy wyszukiwaniu, używasz drzewa aby ustalić pod jakim adresem w pliku rekordów znajduje się dany wpis. Pamiętaj tylko żeby aktualizować te indeksy przy aktualizacji pliku z danymi.

    0
  • #10 10 Sty 2014 17:50
    Boshi
    Poziom 12  

    Niestety nie mieliśmy takiego rozwiązania jak drzewko i nie wiem czy możemy używać czegoś takiego.

    Coś takiego ?

    Otwieramy plik, lecimy petla aż do końca pliku, sprawdzając czy jest towar o id=1

    Jeżeli to ma tak byc, to nie wiem, bo musiałbym wpisać kazdy towar recznie.. bezsensu wydaje mi się.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 21 [minuty]:

    Jeszcze jak by ktoś pomógł napisac procedurę do tego programu ktora sama uzupelnia id po dodaniu i zwieksza za kazdym razem o 1. Kombinuje i kombinuje i nie moge dojść do tego.

    0
  • #11 11 Sty 2014 17:27
    Boshi
    Poziom 12  

    Zdecydowałem jednak na stworzenie 3 tablic rekordowych ponieważ potem operacje na samym pliku będą uciążliwe. Problem w tym, że nie mam pojęcia jak wczytać dane z pliku do tablicy aby operować na niej a potem zapisać dane spowrotem do pliku

    0
  • #12 11 Sty 2014 21:41
    kradam
    Poziom 14  

    Boshi napisał:
    program przecież nie znajdzie sobie w pliku ID np 5 i wyświetli go.. nie jest aż tak inteligentny.

    Programy są na tyle "inteligentne", na ile inteligentni są ich twórcy :-))))

    Nie wiem skąd pomysł, aby ładować tę bazę do pamięci. Jest to ZŁY POMYSŁ.

    Poza tym polecam poszukać sobie wyszukiwarką "baza w Pascalu".

    0
  • #13 11 Sty 2014 23:55
    Boshi
    Poziom 12  

    Tak szukałem, ale każde rozwiązanie bazuje na czymś zupełnie innym... u jednych są tablice rekordowe na których operują, na innych w ogóle nie ma tablic i operacje są bezpośrenio na pliku... Więc może naprowadź na coś, jak ty byś widział może cały projekt? mam duży mętlik w głowie już z tym.

    0
  • #14 16 Sty 2014 15:53
    Boshi
    Poziom 12  

    3 pytania mam po przeróbce programu;

    1 Jak wczytać dane z pliku do tablicy po każdym uruchomieniu programu?
    2 czemu po dodaniu danych do tablicy potem zapisaniu do pliku wyskakuje błąd jeżeli chcem odczytać dane z pliku.. bez dodawania danych odczytuje normalnie?
    3 jak zrobić by dodając towar z magazynu do sprzedazy, ubywała ilość w magazynie?

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    http://pastebin.com/GkQb9D8q
    większe okno

    0
  • Pomocny post
    #15 16 Sty 2014 16:28
    arnoldziq
    Moderator Programowanie

    Po pierwsze, musisz się zdecydować na jedną z metod postępowania z baza danych.
    Albo pracujesz, na zdefiniowanych tablica, które czytasz i zapisujesz do plików przy starcie i końcu programu, albo operujesz bezpośrednio na plikach.

    Boshi napisał:
    1 Jak wczytać dane z pliku do tablicy po każdym uruchomieniu programu?

    Jeżeli zdecydujesz się na tablicowanie danych przy starcie, to wszystkie twoje procedury zapisu bezpośredniego do pliku są niepoprawne.
    Z kolei, jeżeli zdecydujesz se na zapis bezpośredni do plików, to niepotrzebnie deklarujesz dość spore tablice, które tylko zajmują miejsce w pamięci.

    Boshi napisał:
    2 czemu po dodaniu danych do tablicy potem zapisaniu do pliku wyskakuje błąd jeżeli chcem odczytać dane z pliku.. bez dodawania danych odczytuje normalnie?

    To, w takim przypadku jak twój jest dość częste.
    Zastosuj dyrektywy kompilatora {I-} do uniknięcia błędów związanych IO.
    Poza tym, skoro pliki nie istnieją, to jak chcesz je odczytać?
    Pomyśl nad zastosowaniem procedury rewrite(plik);

    Boshi napisał:
    3 jak zrobić by dodając towar z magazynu do sprzedazy, ubywała ilość w magazynie?

    To już jest zależne od metody dostępu do plików jaką zastosujesz.
    Najprościej jest odczytać wszystkie dane sprzedaży i jeżeli jakaś tyczy się danego towaru, to pomniejszyć jego stan o odczytaną wartość sprzedaży.

    Zastanów się też nad deklaracją swoich zmiennych, bo to co masz w tej chwili, to totalny chaos.
    Może coś takiego:
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #16 16 Sty 2014 16:36
    Boshi
    Poziom 12  

    arnoldziq Dziękuję.

    Chyba wolałbym na tablicach bo jednak wydaje mi się, że prościej na nich się operuje. Pliki tworzone są ręcznie więc istnieją, dlatego otwieram plik przez procedurę reset.
    Spróbuję z dyrektywą.

    idąc dalej; co masz na myśli mówiąc, że procedury zapisu są nie poprwane? Jak w takim razie powinny wyglądać?

    0
  • Pomocny post
    #17 16 Sty 2014 16:46
    arnoldziq
    Moderator Programowanie

    Jeżeli definitywnie zdecydowałeś się na tryb tablicowy, to trzeba całą tablicę odczytać przy starcie programu i zapisać ja wraz ze zmianami przy końcu.
    Zapisywanie poszczególnych danych nie ma sensu.

    Zrób dwie procedury; odczyt danych i zapis danych. Obie powinny odczytywać zapisywać wszystkie dostępne tablice w całym ich rozmiarze.
    1. Pierwszą (odczyt) uruchomisz na starcie programu.
    2. Robisz z danymi co będziesz chciał. Dodajesz, zmieniasz itd.
    3. Na końcu programu zapiszesz wszystkie zmiany drugą procedurą.

    0
  • #18 16 Sty 2014 16:48
    Boshi
    Poziom 12  

    Tak to rozumiem. Wykonam tak jak mówisz. Jedynie mam problem aby wczytać teraz te dane z pliku do tablicy(szczerze nie mam pojęcia jak to wykonać)
    , operować na tych danych a na końcu zapisać je z powrotem do pliku.

    0
  • #19 16 Sty 2014 17:32
    arnoldziq
    Moderator Programowanie

    Tak na szybko :

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    Masz tutaj zapis, odczyt i pokazywanie listy towarów.

    0
  • #20 16 Sty 2014 18:21
    Boshi
    Poziom 12  

    Dziękuję za pomoc!

    Gdy natknę ci na problem jeszcze jakiś to napisze ;)

    0
  • #21 16 Sty 2014 18:28
    kradam
    Poziom 14  

    Gdybym kiedyś zajął się edukacją, to delikwenta z takim rozwiązaniem wywaliłbym za drzwi i nakazałbym mu wrócić jak już się dowie dlaczego wyleciał ;-)

    0
  • #22 16 Sty 2014 18:36
    arnoldziq
    Moderator Programowanie

    kradam napisał:
    Gdybym kiedyś zajął się edukacją, to delikwenta z takim rozwiązaniem wywaliłbym za drzwi i nakazałbym mu wrócić jak już się dowie dlaczego wyleciał ;-)

    Może dlatego, że swego czasu wykładałem na uczelni wyższej, nic co ktoś wymyśli w kwestii programowania nie jest mnie w stanie zadziwiać :P
    Ale wracając do tematu.
    Autor tematu zdecydował się na takie a nie inne rozwiązanie. Jeżeli nauczyciel się do tego przyczepi, to dobrze. Zawsze będzie można coś zmienić, poprawić i czegoś nowego się nauczyć.
    A od czegoś trzeba zacząć, więc dowolny działający program, który spełnia założenia projektowe, to jest dobry start i postęp w dobrym kierunku.

    0
  • #23 18 Sty 2014 16:15
    Boshi
    Poziom 12  

    Hmm, może mi ktoś powiedzieć, dlaczego ten kod

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    wczytuje dane z pliku magazynu, ale wyswietla dane sprzedazy oprócz tego? Jak zrobić, by ładował do tablicy magazynu wszystkie dane z pliku i je potem wyświetlił?

    Wyświetlanie

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Dodatkowa tablica
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #24 20 Sty 2014 10:13
    arnoldziq
    Moderator Programowanie

    Niestety, tak się kończy bałagan w kodzie.
    Zwłaszcza kłania się nazewnictwo zmiennych.

    Odczytujesz dane do tablic "studenci" i "tab_magazyn":

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    A wyświetlasz tab_magazyn i tab_sprzedaz:
    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    To trochę dziwne, no nie?
    Po co Ci ta dodatkowa tablica?
    Poza tym, trochę mi się w tym kodzie ilość "begin" i "end" nie zgadza.
    Może zamieść cały kod i napisz dokładnie z czym jest problem.

    0
  • #25 20 Sty 2014 14:20
    Boshi
    Poziom 12  

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    głównie potrzebuje wczytać dane z plików do tablic i potem operować na tablicach, na końcu zapisać rezultat. Podałeś ostatnio kod, jednak przy próbie przerobienia go, nie bardzo chce wczytywać do tablicy.

    0
  • Pomocny post
    #26 20 Sty 2014 17:40
    arnoldziq
    Moderator Programowanie

    Wprowadziłem odrobinę ładu do tego twojego kodu.
    Zobacz teraz, czy to jest to o co chodzi.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #27 20 Sty 2014 18:32
    Boshi
    Poziom 12  

    Tak działa wszystko jak należy. Widzę, że zmieniłeś też sprzedaż, na paragon co faktycznie jest dużo lepszym pomysłem. Zapis, odczyt działa genialnie. Jedynie jaki zauważyłem mankament to brak warunku dla cześciowej sprzedazy towaru. Można np sprzedać na kilka razy większą ilość towaru niż jest w magazynie.

    Dorobiłem zmniejszanie z magazynu i dodatkową tabelę sobie pokazującą po sprzedaży ilość.

    Dzięki za pomoc wielkie, doprowadziłeś temat do końca praktycznie. Ewentualnie jak masz jeszczę chęć to popdowiedz gdzie można ten warunek umiecić i będzie to wszystko już:)

    0
  • #28 21 Sty 2014 10:09
    arnoldziq
    Moderator Programowanie

    W tym projekcie nie ma możliwości "poprawnego" dodawania towaru.
    Możesz tylko zmienić jego ilość na magazynie. W takim przypadku, sprawdzanie tylko, czy bieżąca sprzedaż nie przekracza stanu ogólnego, jest jedynym wyjściem.

    Procedura dodawania towaru na stan, powinna zawierać datę "dodania" następnej partii towaru do magazynu. Na podstawie tych informacji, oraz dat i ilości sprzedaży, możesz obliczyć dokładną ilość towaru w magazynu w tej chwili.
    Inaczej jest to niemożliwe.

    0
  • #29 23 Sty 2014 16:59
    Boshi
    Poziom 12  

    W takim razie dziękuję Ci za wszelką pomoc w przerobieniu kodu i wskazówki na przyszłość ;)

    0