logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

dzięcioł15 13 Maj 2012 01:13 2840 22
REKLAMA
  • #1 10890302
    dzięcioł15
    Poziom 11  
    Posty: 65
    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.


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 10890588
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Najpierw assign(...) potem rewrite(...). Masz kawałek kodu:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #3 10890630
    adamz74
    Poziom 33  
    Posty: 1286
    Pomógł: 269
    Ocena: 194
    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...
  • #4 10891422
    dzięcioł15
    Poziom 11  
    Posty: 65
    Niejasny jest dla mnie ten zapis:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    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.


    Kod: text
    Zaloguj się, aby zobaczyć kod

    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 10894303
    adamz74
    Poziom 33  
    Posty: 1286
    Pomógł: 269
    Ocena: 194
    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ć:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #6 10894436
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Plik nie jest plikiem tekstowym a binarnym, inny jest tryb odczytu. Podaję Twój skrócony kod. Działają opcje 1,2,4,0
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 10900054
    dzięcioł15
    Poziom 11  
    Posty: 65
    Cytat:
    1. Nie inicjujesz zmiennej il_elementow wartością 0 na początku programu.
    Na początku programu czy w procedurze dodaj?
  • Pomocny post
    #8 10901124
    adamz74
    Poziom 33  
    Posty: 1286
    Pomógł: 269
    Ocena: 194
    Zmienna globalna, inicjujesz na początku programu.
  • Pomocny post
    #9 10906282
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    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;
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #10 10924125
    dzięcioł15
    Poziom 11  
    Posty: 65
    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:



    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #11 10925540
    adamz74
    Poziom 33  
    Posty: 1286
    Pomógł: 269
    Ocena: 194
    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.
  • REKLAMA
  • #12 10927633
    dzięcioł15
    Poziom 11  
    Posty: 65
    Cytat:
    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?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #13 10929312
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    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 10930449
    dzięcioł15
    Poziom 11  
    Posty: 65
    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:
    Cytat:
    Możesz także odczytać ostatni element w bazie danych i do jego identyfikatora dodać 1.
    ?
  • #15 10930464
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Mniej więcej coś takiego...
    Oczywiście tylko przy tworzeniu nowego rekordu.
  • #16 10930669
    dzięcioł15
    Poziom 11  
    Posty: 65
    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:


    Kod: text
    Zaloguj się, aby zobaczyć kod


    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 10931489
    adamz74
    Poziom 33  
    Posty: 1286
    Pomógł: 269
    Ocena: 194
    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 10932432
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    dzięcioł15 napisał:
    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 10933551
    dzięcioł15
    Poziom 11  
    Posty: 65
    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 10933565
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    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 10933835
    dzięcioł15
    Poziom 11  
    Posty: 65
    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:
    Cytat:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #22 10934428
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    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 10934769
    dzięcioł15
    Poziom 11  
    Posty: 65
    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.

Podsumowanie tematu

✨ W dyskusji poruszono problem z zapisywaniem rekordów do tablicy w programie bazodanowym napisanym w Pascalu. Użytkownik miał trudności z niezgodnością typów oraz z procedurami zapisu i odczytu danych. Odpowiedzi sugerowały poprawki w kodzie, takie jak inicjalizacja zmiennych, poprawne otwieranie plików oraz użycie odpowiednich typów danych. Użytkownik zrozumiał, że identyfikatory powinny być unikalne, ale rozważał ich pominięcie. Ostatecznie, po wielu próbach, udało mu się zrealizować funkcjonalność programu, w tym przesuwanie rekordów w tablicy oraz zapis do pliku.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA