Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Pascal] Baza danych, nie zapisuje rekordu do tablicy, niezgodność typów

dzięcioł15 13 May 2012 01:13 2663 22
IGE-XAO
  • #1
    dzięcioł15
    Level 11  
    Witam. Wiem że są podobne problemy opisane w postach na forum, ale ciężko idzie mi zrozumienie programu napisanego przez inną osobę. Proszę o pomoc w przeanalizowaniu mojego programu. Jest to baza danych w Pascalu na pracę semestralną. Chodzi o, to że prawdopodobnie program nie zapisuje rekordu do tablicy i nie zgadzają się typy zapisywanych rekordów. Jaśniej wytłumaczyć nie potrafię.

    Ogólnie mówiąc program ma za zadanie zapisać dane samochodu do bazy danych składającej się maks z 50 elementów. Tablica jest zadeklarowana na maks 50 elementów, ale nie wiem czy będą tam zapisane samochod=record czy kolejne elementy indywidualnie w tym zadeklarowanym rekordzie. Proszę o wyjaśnienie w miarę możliwości. Później tablica ma zostać zapisana do pliku co określa niedziałająca procedura "zapisz". Procedura "wczytaj" także nie działa. Najważniejsze dla mnie jest sprawdzenie czy rekordy są zapisywane do tablicy i dlaczego tablica nie jest zapisywana do pliku. Z resztą prawdopodobnie poradzę sobie.


    Code: pascal
    Log in, to see the code
  • IGE-XAO
  • Helpful post
    #2
    ed-ek
    Level 34  
    Najpierw assign(...) potem rewrite(...). Masz kawałek kodu:
    Code: pascal
    Log in, to see the code
  • Helpful post
    #3
    adamz74
    Level 32  
    1. Dokończ procedurę "wypisz" i zobaczysz co się znajduję w Twojej bazie.

    2. Czy już przemyślałeś metodę usuwania rekordów z takiej statycznej tablicy rekordów? Usunięcie rekordu ze środka spowoduje powstanie "dziury", z którą trzeba będzie coś zrobić...

    3. Nic dziwnego, że dostajesz błąd o niezgodności typów... otwierasz/tworzysz plik tekstowy i próbujesz zapisywać do niego dane binarne! Deklaracja zmiennej plikowej powinna wyglądać jako "file of [typ]".

    http://4programmers.net/Turbo_Pascal/Pliki_w_Turbo_Pascalu

    Pozdr!

    PS. Bazę danych jednak lepiej jest robić na listach jedno- lub dwukierunkowych...
  • IGE-XAO
  • #4
    dzięcioł15
    Level 11  
    Niejasny jest dla mnie ten zapis:
    Code: pascal
    Log in, to see the code

    Jakie ma on zadanie?

    Chciałem stworzyć procedurę wypisz, ale nie działała tak samo jak procedura zapisz. Z tego wnioskowałem, że do tablicy nie są zapisywane żadne dane, albo tablica jest błędnie zadeklarowana.

    O usuwaniu na razie nie myślałem. Najpierw chcę zrobić działający zapis i odczyt, a także wypisywanie na ekran. Usuwanie odłożyłem na później.


    Procedura Wypisz nadal nie działa. Nie wiem co jest.


    Code: pascal
    Log in, to see the code

    Naprawdę bardzo proszę o pomoc. To moja praca semestralna. Jeśli nic z niej nie zrozumiem, pozostanie mi zabrać papiery ze szkoły. Kupowanie pracy nie ma sensu. Chodzę do szkoły by się czegoś nauczyć i bardzo proszę... Pomóżcie.
  • #5
    adamz74
    Level 32  
    1. Nie inicjujesz zmiennej il_elementow wartością 0 na początku programu.
    2. "rek[i].ile_rec:=ile_rec;"... zapisujesz całą tablice i w pliku musisz przechować ilość rekordów. Jakbyś zapisywał po rekordzie, to wystarczyłoby policzyć wczytane rekordy.
    3. Na początek, zobacz czy jest tworzony plik i czy coś zawiera (np. otwórz w notatniku). Musisz poprawić procedurę zapisu, bo w chwili obecnej nie będzie działała całkowicie poprawnie :(
    4. Co mają robić procedury WYPISZ i WCZYTAJ? Chyba coś mocno zamieszałeś...

    Procedura WYPISZ mogłaby wyglądać:
    Code: pascal
    Log in, to see the code
  • Helpful post
    #6
    ed-ek
    Level 34  
    Plik nie jest plikiem tekstowym a binarnym, inny jest tryb odczytu. Podaję Twój skrócony kod. Działają opcje 1,2,4,0
    Code: pascal
    Log in, to see the code
  • #7
    dzięcioł15
    Level 11  
    Quote:
    1. Nie inicjujesz zmiennej il_elementow wartością 0 na początku programu.
    Na początku programu czy w procedurze dodaj?
  • Helpful post
    #8
    adamz74
    Level 32  
    Zmienna globalna, inicjujesz na początku programu.
  • Helpful post
    #9
    ed-ek
    Level 34  
    Podam kod który powinien Ci pomóc. Strukturę zredukowałem aby dużo nie pisać. Po pierwszym uruchomieniu program tworzy bazę: c:\samochod.000 i wypełnione jest tylko pole tab[0].ile_samochodow;
    Code: pascal
    Log in, to see the code
  • #10
    dzięcioł15
    Level 11  
    Ok wszystko działa, tylko nie mam pojęcia jak wykonać procedurę edytuj. Coś tam napisałem ale mi to nie działa. Prosiłbym o wyjaśnienie dlaczego ta procedura nie działa tak jak powinna. A powinna wczytać numer identyfikatora rekordu który ma być edytowany, po czym powinna usunąć ten rekord, a następnie powinna dać możliwość wpisania nowego rekordu w to miejsce. Podaję cały kod źródłowy:



    Code: pascal
    Log in, to see the code
  • Helpful post
    #11
    adamz74
    Level 32  
    Tak na szybko... przemyśl procedurę EDYTUJ, bo obecna jej zawartość nie odpowiada czynnościom, które chcesz wykonać :(

    Weź rozbij całą procedurę na czynności proste, typu:
    1. pobranie identyfikatora,
    2. wyszukanie rekordu,
    3. itd...
    i spróbuj rozrysować algorytm. To Ci znacznie pomoże.

    Swoją drogą po co usuwać cały rekord, jak chcesz edytować jego zawartość. Jest to czynność zbędna i lepiej będzie wyglądało wyświetlenie obecnej wartości i danie możliwości jej zmiany pole po polu.
  • #12
    dzięcioł15
    Level 11  
    Quote:
    MAM PROCEDURĘ! YEEEEAHHH MOTHER...LOVER!!! PROGRAM GOTOWY!!!! Później wstawię pełny gotowy kod źródłowy :). Niech inni sobie porównują :). Dzięki za wskazówki wszystkim :). Temat zamknę jak tylko oddam pracę do sprawdzenia.




    Sorry ale mam jedno najważniejsze pytanie. Jak zrobić unikatowy identyfikator w bazie? Nie mam pojęcia. Poddaję się. Dawać jako stałą czy co?

    Code: pascal
    Log in, to see the code
  • #13
    arnoldziq
    Moderator of Programming
    Jako identyfikator możesz wstawić np. pozycję w bazie danych.
    Ma to wadę, że w momencie fizycznego usunięcia jakiegoś rekordu, identyfikator nie będzie już unikatowy :/
    Możesz także odczytać ostatni element w bazie danych i do jego identyfikatora dodać 1.
  • #14
    dzięcioł15
    Level 11  
    Jako identyfikator mam wstawioną teraz pozycję rekordu w bazie danych. I właśnie dlatego że nie jest to identyfikator unikatowy, postanowiłem zapytać o inne rozwiązanie.

    Co masz na myśli mówiąc:
    Quote:
    Możesz także odczytać ostatni element w bazie danych i do jego identyfikatora dodać 1.
    ?
  • #15
    arnoldziq
    Moderator of Programming
    Code: pascal
    Log in, to see the code

    Mniej więcej coś takiego...
    Oczywiście tylko przy tworzeniu nowego rekordu.
  • #16
    dzięcioł15
    Level 11  
    Baniak puchnie.... Znowu dopada mnie załamka. Mam wielkie chęci do nauki, ale zdolności już nie te i załamuję się przez trudności w przyswajaniu wiedzy.

    Próbuję jeszcze (z pominięciem unikatowego identyfikatora) zrobić pętlę która będzie obniżać o jeden, wartość każdego tab[i].identyfikator wyższego niż usunięty rekord w procedurze usuń, po usunięciu rekordu.. Napisałem coś takiego:


    Code: pascal
    Log in, to see the code


    Ta pętla nie działa tak jakbym chciał. Możecie coś doradzić towarzysze?


    Chodzi o to by przeprowadzać operacje w tablicy a dopiero później móc ją zapisać do pliku. W tablicy chcę obniżyć identyfikatory wszystkich tab[i].identyfikator od usuniętego rekordu w górę tak by nie zostało wolne miejsce.
  • #17
    adamz74
    Level 32  
    Tak ogólnie, to bym się zastanowił, czy unikalny identyfikator jest Ci potrzebny.

    Unikalny identyfikator jest potrzebny w "dorosłych" bazach danych, gdzie robisz powiązania między tabelami. Tutaj chyba wystarczy Ci numer wiersza w tabeli...
  • #18
    arnoldziq
    Moderator of Programming
    dzięcioł15 wrote:
    Baniak puchnie.... Znowu dopada mnie załamka. Mam wielkie chęci do nauki, ale zdolności już nie te i załamuję się przez trudności w przyswajaniu wiedzy.

    Ale po co to robisz ?
    Skoro identyfikator ma być unikatowy, to właśnie nie powinieneś go zmieniać.
    Jedyne założenia to dodawanie rekordów na końcu pliku a usuwanie z dowolnego miejsca.
    Przesuwanie ich w którąkolwiek stronę jest bez sensu.
  • #19
    dzięcioł15
    Level 11  
    Uczę się w szkole policealnej na profilu technik-informatyk. Mam pracę semestralną z Pascala. Unikalny identyfikator jest częścią zadania, ale chcę go ostatecznie pominąć. Nie mam już na to czasu. Chyba wpadłem na pomysł jak przesunąć identyfikatory by nie zostało puste miejsce po wykasowaniu. Chcę zrobić to w tablicy i dać możliwość wyboru zapisu do pliku.
  • #20
    arnoldziq
    Moderator of Programming
    Jeżeli masz zamiar cokolwiek przesuwać, to zrezygnuj z identyfikatorów... bo one zawsze będą odpowiadały pozycji w pliku. Więc są zupełnie zbędne.
    To strata czasu i pamięci. Ale zrobisz co będziesz chciał.
  • #21
    dzięcioł15
    Level 11  
    Polecenie każe mi dać opcję "wyszukaj". Dałem więc taką procedurę by wyszukiwała po identyfikatorach. Przypominam że operację chcę wykonać w tablicy a dopiero później zapisać do pliku. Opcja edytuj też korzysta z identyfikatorów.

    Po za tym, ta funkcja i tak nie działa, mimo dopasowania do programu:
    Quote:
    Code: pascal
    Log in, to see the code
  • #22
    arnoldziq
    Moderator of Programming
    No wiesz...
    Ta funkcja, w tej formie jest, jakby Ci to powiedzieć... niedokończona.
    Myślałem, że domyślisz się, że jest to tylko schemat, jak powinno to wyglądać ...
  • #23
    dzięcioł15
    Level 11  
    Wiem że jest to schemat poglądowy, ale nawet po przystosowaniu do programu i tak nie działał. M.in. dlatego że w Pascalu (o ile mi wiadomo) nie ma czegoś takiego jak "openfile", albo seek(plik,eof(plik)); też nie chce działać.

    Nie jestem jeszcze na tyle zaawansowany by rozumieć każdy schemat. Nie rozumiem jak program usuwa rekord z bazy. Zapis ten, rozpisał ktoś wyżej, ale nie zrozumiałem tego zapisu. Ciężko mi przychodzi pojmowanie różnych rzeczy. Przez głupotę człowiek nie uczył się za młodu to teraz nadrabia po pracy. Ale ogólnie jest ok.

    Zrobiłem przesuwanie rekordu w tablicy. Chyba wszystko już działa jak trzeba.

    ####################################
    Program działa. Wysłałem go już do wykładowcy. Dziękuję wszystkim raz jeszcze :). Temat zamykam.