vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Random-Dateien und mehrdimensionale Arrays 
Autor: hwb
Datum: 01.12.09 17:52

Hallo,

hänge an einem Problem fest.
Wie speichert man und liest wieder ein
mehrdimensionale Arrays unter VB 6.
Input und Output sind kein Problem.
Put und Get schon.
Kann mir jemand helfen.
Bitte einfach halten, ich bin Anfänger.

Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: Danzi
Datum: 02.12.09 14:25

Hier ein Beispiel:
Private Type DatensatzType
    Nachname As String * 20
    Vorname As String * 20
    Datenfeld(10, 5) As Long
    Beliebig1 As Boolean
    Beliebig2 As Integer
    Beliebig3 As Currency
End Type
 
Private Sub MeinProgramm()
Dim FF1 As Integer
Dim Datensatz As DatensatzType
 
' Datei öffnen
FF1 = FreeFile
Open "Testdatei" For Random As FF1 Len = Len(Datensatz)
 
' 1. Datensatz mit Daten füllen
Datensatz.Vorname = "Fred"
Datensatz.Nachname = "Meier"
Datensatz.Datenfeld(0, 0) = 5
Datensatz.Datenfeld(1, 0) = 536
Datensatz.Datenfeld(3, 4) = 789
' 1. Datensatz speichern
Put FF1, 1, Datensatz
 
' 2. Datensatz mit Daten füllen
Datensatz.Vorname = "Hilde"
Datensatz.Nachname = "Schulz"
Datensatz.Datenfeld(0, 0) = 595
Datensatz.Datenfeld(1, 0) = 1119
Datensatz.Datenfeld(3, 4) = 3
' 2. Datensatz speichern
Put FF1, 2, Datensatz
 
' 1. Datensatz einlesen
Get FF1, 1, Datensatz
 
' 2. Datensatz einlesen
Get FF1, 2, Datensatz
 
' Datei schließen
Close FF1
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: hwb
Datum: 03.12.09 12:10

Danke für deine Überlegungen.
Nur beim Datensatz einlesen habe ich ein Problem.

Get #1, rec, Datensatz (rec 1,2,3 unsw) kann nicht
in einer For-Next Schleife ausgeführt werden.

For rec = 1 to 10
Get #1, rec, Datensatz
next

Warum ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: Danzi
Datum: 03.12.09 12:59

Wieso nicht?
Kommt eine Fehlermeldung?
Oder ein anderes Ergebnis als erwartet?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: hwb
Datum: 03.12.09 13:52

Fehlermeldung gibt es keine.
Die Daten der einzelnen Arrays werden
nicht eingelesen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: Danzi
Datum: 03.12.09 16:33

Das glaube ich nicht.
In Deiner Schleife werden die ersten 10 Datensätze eingelesen.
Das heißt, daß nach der Schleife der 10. Datensatz in der Variablen steht.
Natürlich ist das nicht sehr sinnvoll. Man liest für gewöhnlich einen bestimmten Datensatz ein, bearbeitet diesen und speichert ihn dann wieder.
Oder man liest alle Datensätze in einer Schleife ein und wertet sie zur Suche oder Anzeige in einer Liste aus. Das macht man dann aber innerhalb der Schleife. Zum Beispiel so:
Private Type DatensatzType
    Nachname As String * 20
    Vorname As String * 20
    Datenfeld(10, 5) As Long
    Beliebig1 As Boolean
    Beliebig2 As Integer
    Beliebig3 As Currency
End Type
 
Private Sub MeinProgramm()
Dim FF1 As Integer
Dim i As Long
Dim Datensatz As DatensatzType
 
FF1 = FreeFile
Open "Testdatei" For Random As FF1 Len = Len(Datensatz)
'Es werden alle Datensätze gesucht, die in der 5. Zeile und 3. Spalte
'des zweidimensionalen Arrays den Wert 3775 enthalten
For i = 1 To LOF(FF1) / Len(Datensatz)
    Get FF1, i, Datensatz
    If Datensatz.Datenfeld(5, 3) = 3775 Then
        'diesen Datensatz in eine Liste schreiben
    End If
Next
Close FF1
 
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: hwb
Datum: 03.12.09 16:53

hier mal mein Testprogramm: wer sieht den Fehler ?
so funktioniert es nicht !

Option Explicit ‘Modul

Type Datensatz
Baunamen(1 To 10, 1 To 10) As Variant
End Type

Public Bau As Datensatz

Public Zeichen As Integer
Public Zahl As Integer
----------------------------------------------

Private Sub Bauspeich_Click()

If Text2.Text = "" Then Exit Sub

For c = 1 To 10 ‘suche den nächsten freien Arrayplatz
If Bau.Baunamen(Zeichen, c) = "" Then Exit For
Next

Zahl = c

If Zahl = 0 Then Zahl = 1

Bau.Baunamen(Zeichen, Zahl) = Text2 ’Zeichen steht für eine Integer Variable die ich aus einer Listbox ausgewählt habe

Open "BauTest.dat" For Random As #2 Len = Len(Bau)
Put #2, Zeichen, Bau
Close #2

List2.Clear

For a = 1 To 10 zeigt alle Werte des 2.Arrays (Zahl) an
List2.AddItem Bau.Baunamen(Zeichen, a)
Next

End Sub
----------------------------------------------------------------------

Private Sub Form_Load()

Einlesen der Datei

Open "BauTest.dat" For Random As #2 Len = Len(Bau)
For a = 1 To 10
Get #2, a, Bau
Next
Close #2

List2.Clear

For b = 1 To 10
List2.AddItem Bau.Baunamen(Zeichen, b)
Next

End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: hwb
Datum: 03.12.09 18:50

Danke Danzi,
so wie du schreibst klappt es.
Jeden Datensatz einzeln aufrufen und anzeigen lassen.

Folgendes Problem tritt als Fehlermeldung im Modul auf,
wenn ich versuche die Dimensionen im Array zu vergrössern.
z.B. Datensatz(1 to 1000, 1 to 15, 1 to 50)
ist grösser wie 64 KB > Fehlermeldung!

Brauche aber für mein Programm diese Menge an Daten und muß
diese auch in einem einlesen um sie dann vergleichen zu können.

Mit den normalen Variabelen (Statisch) gibt es kein Problem.
Nur die Type-Variable spielt nicht mit.
Random-Dateien ohne Type-Variable geht wohl nicht ?

Sequentielle Dateien speichern in der Größe zu lange.

Vielleicht hat einer eine Idee...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: Danzi
Datum: 04.12.09 11:10

1. Fehler
Type Datensatz
Baunamen(1 To 10, 1 To 10) As Variant
End Type
Ein Variant hat keine fest Größe. Eine Random-Datenbank funktioniert aber nur mit einer festen Datensatzlänge. Warum nimmst Du Variant? Du mußt doch wissen, was in die Variable kommen soll.
Zum Beispiel eine Ganzzahl:
Type Datensatz
Baunamen(9, 9) As Long
End Type
oder Text:
Type Datensatz
Baunamen(9, 9) As String * 50
End Type

2. Fehler
Open "BauTest.dat" For Random As #2 Len = Len(Bau)
For a = 1 To 10
Get #2, a, Bau
Next
Close #2
Die Schleife hat überhaupt keinen Sinn, da in der Schleife ein und die selbe Variable (Bau) erst mit dem ersten Datensatz gefüllt wird, dann mit dem zweiten gefüllt (überschrieben) wird, dann mit dem dritten usw.
Zum Schluß steht in der Variablen der zehnte Datensatz.
Dann kannst Du ja gleich folgendes schreiben:
Open "BauTest.dat" For Random As #2 Len = Len(Bau)
Get #2, 10, Bau
Close #2
Ich glaube, daß Du es nicht so richtig verstehst.
Du hast eine Variable (Bau), die schon ein Array (Baunamen) mit zwei Dimensionen á 10 Werten (also 100 Werte) enthält.
Wenn Du den ersten Datensatz einliest
Get #2, 1, Bau
stehen in der Variablen 100 Werte. Also alle Werte aller Dimensionen.
Wenn Du jetzt den zweiten Datensatz (nicht die zweite Dimension) einliest
Get #2, 2, Bau
stehen in der Variablen nicht mehr die ersten 100 Werte sondern die nächsten 100 Werte.
Im übrigen glaube ich mittlerweile, daß Dein Problem nicht darin liegt, ein Array zu speichern. Das Array scheint mir eher eine Behelfslösung von Dir zu sein, da Du nicht weißt, wie man eine Random-Datenbank aufbaut. Bei einer Dimension von 1000 * 15 * 50 = 750000 Werte, liest man gerade nicht alle Werte ein, sonder nur die, die gebraucht werden (deshalb Random). Relationen werden durch mehrere Dateien und den Datensatznummern realisiert.
Ein Datensatz kann nur 64 KB größ sein. Ich programmiere seit 20 Jahren und bin noch nie an diese Grenze gestoßen. Trotzdem kann ich eine Random-Datei mit Millionen von Datensätzen innerhalb von Bruchteilen von Sekunden durchsuchen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: hwb
Datum: 04.12.09 15:04

Hallo Danzi,

jetzt machst du mich neugierig.
Wie kann ich tausende von Daten einlesen
ohne mehrdimensionale Arrays.
Beispiel:
Ich habe 1000 Baustellen-
den Baustellen ordne ich bis zu 15 verschiedene
Bauarbeiter zu-
die Bauarbeiter arbeiten an verschiedenen Tagen
und haben unterschiedliche Stunden gearbeitet.

Bisher habe ich dieses mit Arrays gemacht > (1000,15,50)

Irgendwie denke ich verkehrt. Baue mir dadurch riesige Dateien auf.
An die VB-Datenbank habe ich mich noch nicht gewagt.

Gibt es einfachere Methoden ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: Danzi
Datum: 04.12.09 15:59

Aha! Du erzeugst mit Deiner Methode Daten-Redundanz (viele Daten sind doppelt bzw. mehrfach vorhanden). Wenn der Arbeiter Müller-Lüdenscheidt an 10 verschiedenen Baustellen arbeitet, steht sein Name in jedem der 10 Baustellen-Datensätze. Das verbraucht Speicherplatz und Zeit. Wenn Müller-Lüdenscheidt dann auch noch heiratet und nun Krause heißt, dann hat man 10 mal seinen Namen zu ändern. So funktioniert das nicht. Sondern so [u]zum Beispiel
Private Type BauarbeiterType
    Nachname As String * 20
    Vorname As String * 20
    Stundensatz As Double
    Gewerk As Long
End Type
 
Private Type BaustelleType
    Bezeichnung As String * 50
    Bauarbeiter(100) As Long
End Type
 
 
Private Sub Programm()
Dim FF1 As Integer
Dim i As Long
Dim Bauarbeiter As BauarbeiterType
Dim Baustelle As BaustelleType
 
' einen (z. B. den 5.) Bauarbeiter speichern
Bauarbeiter.Nachname = "Müller-Lüdenscheidt"
Bauarbeiter.Vorname = "Alfred"
Bauarbeiter.Gewerk = 1
Bauarbeiter.Stundensatz = 17.5
FF1 = FreeFile
Open "Bauarbeiter" For Random As FF1 Len = Len(Bauarbeiter)
Put FF1, 5, Bauarbeiter
Close FF1
 
' einen weiteren (z. B. den 23.) Bauarbeiter speichern
Bauarbeiter.Nachname = "Krause"
Bauarbeiter.Vorname = "Peter"
Bauarbeiter.Gewerk = 44
Bauarbeiter.Stundensatz = 25.75
FF1 = FreeFile
Open "Bauarbeiter" For Random As FF1 Len = Len(Bauarbeiter)
Put FF1, 23, Bauarbeiter
Close FF1
 
 
' eine (die erste) Baustelle speichern
Baustelle.Bezeichnung = "Berliner Hochseilbahn"
Baustelle.Bauarbeiter(0) = 23 ' der 1. Bauarbeiter dieser Baustelle steht als 
' 23. Bauarbeiter in der Bauarbeiter-Datei
Baustelle.Bauarbeiter(1) = 5 ' der 2. Bauarbeiter dieser Baustelle steht als 5. 
' Bauarbeiter in der Bauarbeiter-Datei
FF1 = FreeFile
Open "Baustellen" For Random As FF1 Len = Len(Baustelle)
Put FF1, 1, Baustelle
Close FF1
 
 
' eine (die erste) Baustelle einlesen
FF1 = FreeFile
Open "Baustellen" For Random As FF1 Len = Len(Baustelle)
Get FF1, 1, Baustelle
Close FF1
' die Bauarbeiter zu dieser Baustelle einlesen
FF1 = FreeFile
Open "Bauarbeiter" For Random As FF1 Len = Len(Bauarbeiter)
Liste.Clear
For i = 0 To 100
    If Baustelle.Bauarbeiter(i) > 0 Then
        Get FF1, Baustelle.Bauarbeiter(i), Bauarbeiter
        Liste.Add RTrim$(Bauarbeiter.Nachname)
    End If
Next
Close FF1
 
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: hwb
Datum: 05.12.09 10:38

Danke für das Beispiel.
Denke das ich die nächsten Wochen damit verbringen
werde mein Programm zu ändern.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Random-Dateien und mehrdimensionale Arrays 
Autor: wb-soft
Datum: 05.12.09 13:10

Hi!

Eigentlich schreit das ja direkt nach einer Datenbank. Obwohl ich auch schon eine Lösung mit Textdateien gesehen habe, die super funktioniert. Also ist der Vorschlag von Danzi durchaus eine Option.


mfg

WB
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel