Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Bazy danych - pomóżcie!
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002
Bazy danych - pomóżcie!

Ponieważ w moim poście pt. "Bazy Danych - jak to zrobić?" Losmac podał mi sposób na zrobienie własnej bazy danych, a potem zamilkł, postanowiłem moje pytanie wyciągnąć do innego posta, bo do tamtego chyba nikt już nie zagląda. Oto mój kod (na podstawie kodu Losmaca):

Option Explicit

Type Uczen
    Id As Long
    Nazwisko As String
    Imie As String
    DataUr As String
End Type

Sub ZapiszRekord()
Dim rek As Uczen
Dim numFile As Long, i As Long


numFile = FreeFile
Open "\uczniowie.txt" For Random Access Write As #numFile
            rek.Id = i
        rek.Nazwisko = "Pierwsze zdanie"
        rek.Imie = "Drugie zdanie"
        rek.DataUr = i & "-" & i & "-1988"
        Put #numFile, i, rek
 
Close #numFile

End Sub

Sub odczyt()
    OdczytajRekord 5
End Sub

Sub OdczytajRekord(ktory As Long)
Dim rek As Uczen
Dim numFile As Long, i As Long


numFile = FreeFile
Open "\uczniowie.txt" For Random Access Read As #numFile
    Get #numFile, ktory, rek
Close #numFile

MsgBox rek.Id & vbCr & rek.Nazwisko & vbCr & rek.Imie & vbCr & rek.DataUr, vbInformation, "Uczeń " & ktory

End Sub


Moje pytanie dotyczy długości Stringów. Przy pewnej długości gdy nie zadeklaruje ich stałej długości, wyskakuje mi błąd "Bad record length". Znowuż gdy określę długość (czego chcę uniknąć), to nie może ona przekroczyć 64 znaków.

Czy ktoś wie jak to obejść? Potrzebuję przechowywać długie dane. Niekiedy ponad 1000 znaków...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


30-09-2004 13:54
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Pomoglo wstawienie w linii :

Open "\uczniowie.txt" For Random Access Write As #numFile len=32767

Tylko nie wiem jakie to ma konsekwencje i jaka dlugosc (w znakach) moze miec teraz moj rekord? Bo to co podalem to chyba jest w bajtach...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


30-09-2004 15:33
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003
Sorry...

Sorry Viper, ale nie miałem czasu...

Swoją linijkę:
Open "\uczniowie.txt" For Random Access Write As #numFile len=32767
zamień na:
Open "\uczniowie.txt" For Random Access Write As #numFile Len=Len(rek)

Co do reszty, odezwę się jeszcze... W ostatnim okresie ledwie wyrabiam w zakrętach


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

30-09-2004 20:06
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Więc tak nie wiem od czego zacząć
1. 32767 jest rzeczywiście maksymalną długością rekordu
2. Praca z takimi plikami opisana jest na stronie

http://support.microsoft.com/?kbid=150700 -  "How to Work with Random Access Files"
... To open a file for random access, use the following syntax for the Open statement:

Open <file name> For Random As <#filenumber> Len=RecordLength


( z powyższego wynika chyba, że należy w takim wypadku podawać długośc rekordu)
...
By using a user-defined type for each record, you can create records made of numerous fields with different types...


(poniżej rozmiary dla poszczególnych typów zmiennych )

- Integers require 2 bytes
- Boolean requires 2 bytes
- and characters in a string require 1 byte for each character

-( ale poniżej wyjaśniono, że jeszcze deskryptory przy zmiennej długości stringu)

3. a błąd, który Ci się pojawia i jego przyczyna jest omówiona na stronie:
http://www.a1vbcode.com/vbforums/shwmessage.aspx?ForumID=3&MessageID=2971&TopicPage=2 - "Bad record length (Error 59)"

gdzie wyjaśnione jest, że w takim przypadku jak Twój, gdzie zmienne stringowe (np w polach UDT) są zmiennej długości przewidziane są w pliku deskryptory określające długośc każdego łańcucha i wpisując dany rekord należy uwzględnić miejsce na nie. Zatem całaość Twojego rekordu + deksryptory dla każdego pola, które jest zmienną stringową o zmiennej długości nie może przekroczyć owych zaczarowanych 32767

The length of a record variable for a Get or Put statement does not match the length specified in the corresponding Open statement. Because a two- byte descriptor is always added to a variable-length string Put to a random access file, the variable-length string must be at least two characters shorter than the record length specified in the Len clause of the Open statement.

Variant data types also require a two-byte descriptor. Variants containing variable-length strings require a four-byte descriptor. Therefore, for variable-length strings in a Variant, the string must be at least 4 bytes shorter than from http://support.microsoft.com/default.aspx?scid=kb;en-us;Q142138 (trappable errors /vb(a)
I remembered something about udt's and strings. this is basically what i remembered.Maybe some readjustments on your string types will correct the bad rec len.


Reasumując:
- Jeśli chcesz mieć zmienna długość pól stringowych należałoby za każdym razem obliczać długość sumaryczną- np 32767 (z uwględnieniem deskryptorów dla każdego takiego pola)- rodzaj validacji

- 32767 chyba powinno pozostać tak jak jest, jeśli nie ma maksymalnej długości pól (ale zwykle w bazach danych się to określa, z wyjątkiem pola memo)

- Ponieważ jest to nazwisko i imię chyba mozna to ograniczyć ?


Przepraszam za "pstrokaty" tekst i za dużą liczbę cytatów i stron, ale na słowo raczej mi tu nie wierzycie...nie noszę spodni (ale to też nie jest do końca prawda)


_____________________________________________
Karolina

30-09-2004 22:15
Pokaż profil karolinavb  Wyślij email do karolinavb   
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Nic z tych rzeczy, że Ci nie wierzę! Wręcz przeciwnie-wierzę. Widzę, że piszesz bardzo mądrze z odniesieniami do źródeł. U mnie przyczyna leży gdzie indzie - ja po prostu nie rozumiem CO piszesz (merytorycznie). Jak wspominałem z baz danych jestem noga. Nie znam terminologii. Nie wiem nawet co to są deskryptory. Nie rozumiem też w końcu gdzie określam długość rekordu/pol. Czy w deklaracji typu, dodając po deklaracji zmienne * liczba, czy za pomocą len=liczba?

Nie wiem czemu, bo wczoraj tego zjawiska nie było, ale dzisiaj jak zostawię Len=32767, to plik strasznie "puchnie" i zaczyna zawierać szereg dziwnych znaków lub też (nie wiem czemu) znajduję w nim teksty z tego forum lub adresu ostatnio odwiedzonych stron www (możliwość pomyłki z innym plikiem wykluczona).

Losmac - jak dałem len=len(rek), to wrócił Error 59...

Karolino - spróbuję poczytać Twoje linki.

Dziękuję za pomoc.


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


01-10-2004 12:35
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Vi

Twój plik czyta się i zapisuje dobrze według kodu, który podałeś oczywiście pod warunkiem nie przekroczenia podanej wyżej zaczarowanej liczby.
Zobacz go pod np Total Commanderem heksadecymalnie. Jak wrócę z pracy wieczorem jeszcze go przeanalizuję i spróbuję objasnić ( jak będę umiała).
Sprawdź wirusy...
Oczywiście z taka scieżka jest na dysku systemowym u mnie w katalogu głównym


_____________________________________________
Karolina

01-10-2004 16:13
Pokaż profil karolinavb  Wyślij email do karolinavb   
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Mój plik oglądam wyłącznie pod Total Commanderem 6.03 a w sposób heksadecymalny (klawisz F3). Bardzo dziękuję Ci za deklarację chęci pomocy. W między czasie udało mi się napisać moduł z gotowymi funkcjami do obsługi tego typu bazy. Wysyłam Ci go na maila. Nie rozstrzygnięty pozostaje więc jedynie problem długości rekordów . Co do wypełniania zawartości pliku tekstami z tego forum, czy czymś innym (np. nazwami kontrolek z VB), to dzieje się to wtedy gdy np. rekordy 0, 1, 2, 3 nie są wypełnione i nagle zapisuję do rekordu 4.

[Post edytowany dnia 01-10-2004 17:04 przez Viper87]


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


01-10-2004 17:04
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
anonim




Typ: Nie zarejestrowany

karolinavb - (bardzo Jej za to dziękuję) podała kiedyś taki piękny link do dokumentu w formacie pdf - ado.pdf - o ile dobrze pamiętam. Są w nim zawarte najważniejsze informacje, umożliwiające obsługę baz danych z poziomu VB - wraz z kodem. Tekst dokumentu jest bardzo zbliżony do tekstu książki "Visual Basic 6. Programowanie baz danych. Biblia.". W VB "programuję" od ok. 2 miesięcy i dzięki tym informacjom obsługa baz danych nie jest dla mnie niczym strasznym (to działa) .

Proponuję Ci ładnie uśmiechnąć się do karolinyvb

02-10-2004 14:41
  
cyfra




Typ: neutral
Postów: 4
Zarejestrowany: May 2003

1. Pojawia ci się błąd po len=len(rek) bo rek nie ma określonej długości, a chodzi o stringi które nie są ograniczone.
3. Pojawiają ci się dziwne znaki w pliku ponieważ ustawiasz długość rekordu większą (max.) od danych które zapisujesz, efektem tego jest uzupełnienie brakujących miejsć danymi z bufora czyli śmieciami, i nie jest to błąd ani działanie jakiegoś wirusa...
jeżeli chcesz korzystać z bazy odnosząc się do rekordów (po to wykorzystałeś taki sposób zapisu) to musisz usztywnić wielkość rekordu (skąd program ma wiedzieć gdzie jest początek rekordu skoro nie wie ile zajmuje on bitów...) dlatego musisz użyć dla stringów w typie np. Nazwisko as string * 100
czyli długość stringu 100 znaków
Jeżeli baza ma być przetwarzana w pamięci, a nie w pliku to polecam prostszą metodę zapisywania do pliku instrukcją input#
Input [#]NrPliku, ListaZmiennych

I jeżeli w typie przechowujesz datę to ustaw zmienną as Date...

[Post edytowany dnia 02-10-2004 15:23 przez cyfra]

02-10-2004 15:16
Pokaż profil cyfra  Wyślij email do cyfra   
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Witam!

Anonimie - czy mógłbyś mi podać namiary na ten plik PDF? Przeszukałem forum, ale niestety nie znalazłem go. Jeśli to coś w stylu Biblii, to jak możesz móć, że jest dobre!?

Cyfra - dziękuję bardzo za wyjaśnienia. Z tym buforem tak coś podejrzewałem, ale teraz jak ktoś to potwierdził, to mi ulżyło .
Co do sposobu zapisu, to najpierw próbowałem wykorzystać strukturę INI i zapisywać do pliku liniami, wcześniej kodując XORem, ale za dużo z tym zachodu i kod jest strasznie zagmatwany. Do tego wiele do życzenia pozostawia sposób przeszukiwania takiej "bazy", czy dodawnia "rekordów".
Jeśli natomiaast ustalę długość rekordu, to przy zapisie krótkich wyrazów mam strasznie dużo pustych miejsc! To mi się nie podoba. Gdy natomiast nie ustalę długości, to przy pewnej długości dostaję słynny Error 59...
Znam tego typu bazy danych pisane w Delphi, które mają zapisane w sobie bardzo długie teksty, a nie mają pustych miejsc czy "śmieci z bufora" w podglądzie .
Znowuż ADO, czy DAO nie chcę angażować do projektu, bo to tak, jakby użyć dźwigu do podniesienia tabliczki czekolady...

Więc co? Mam wymyślić własny format plikó, żeby móc zrobić bazę słówek? No bez przesady...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


02-10-2004 17:00
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
anonim




Typ: Nie zarejestrowany

Viper link dla Ciebie

http://board.freeweb.pl/posts.php?board_id=1543&topic_id=77129&post_id=893868&select=893868#post893868

Nie bardzo zrozumiałem tekst: "Jeśli to coś w stylu Biblii, to jak możesz móć, że jest dobre!?" - książkę "Visual Basic 6. Programowanie baz danych. Biblia." oceniam dość pozytywnie, więc chyba mogę tak mówić - o ile chodziło Ci o mówienie.


"Znowuż ADO, czy DAO nie chcę angażować do projektu, bo to tak, jakby użyć dźwigu do podniesienia tabliczki czekolady..." - i tu nie przyznam Ci racji, ale każdy ma prawo do swojego zdania. Raz napisane konkretne moduły, można wykorzystać w przyszłości do "podniesienia nie tylko tabliczki ale i całego kontenera czekolady" - ale to już Twój wybór. Powodzenia.

02-10-2004 22:04
  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Bardzo dziękuję za linka. Plik jest rzeczywiście komunikatywny. Co do reszty, to właśnie miałem na myśli tę książkę. Mam ją-stoi u mnie na półce i do dzisiaj nie przyniosła mi żadnego pożytku... Stąd moje porównanie .

A co do kontenera czekolady, to po wiem, że co za dużo to niezdrowo. A na serio-przemyślę sprawę.


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


02-10-2004 22:17
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Tam nie żadnych śmieci.... tam są znaki 00 - puste, przynajmniej u mnie na 3 komputerach więc co ?
Pliki wysłałam ale to jeszcze nie to.

P.S. Po co jeździć taczką (plikami tekstowymi) jak można porsche (bazy danych)


_____________________________________________
Karolina

03-10-2004 10:32
Pokaż profil karolinavb  Wyślij email do karolinavb   
cyfra




Typ: neutral
Postów: 4
Zarejestrowany: May 2003

Karolinavb, to że masz 00 zamiast innych danych to nie oznacz że nie są to śmieci...
Jeżeli długość danych, które mają zostać zapisane jest mniejsza niż długość wskazana w sekcji Len rozkazu Open, rozkaz Put zapisze następne rekordy na granicy wskazanej długości rekordu. Wolne miejsce między końcem rekordu i początkiem następnego rekordu jest zapełnione bieżącą zawartością bufora plikowego.
z Kursu Visual Basic 4 All (jest na tej stronie)
Co do baz danych i plików tekstowych, bazy danych to zaawansowane nażędzia do przechowywania i manipulowania danymi, pliki tekstowe natomiast to prosty i czytelny sposób przechowywania danych.
Jeżeli ktoś zamierza jedynie "przechowywać informacje" to na pewno powinien użyć do tego plików tekstowych, chyba że zamierza wykorzystać wyszukiwanie, sortowanie, zależności między tabelami itd. to może zastanowić się nad bazami danych.

03-10-2004 14:31
Pokaż profil cyfra  Wyślij email do cyfra   
Wszystkich odpowiedzi: 13 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1