Recordset Type beim Einspeichern überprüfen

Naui

Grünschnabel
Hi alle zusammen,

ich stehe vor folgendem Problem:

Ich lese eine CSV ein in der Daten stehen, stelle die Spaltenüberschriften in einem Flexgrid dar.
danach lese ich eine Datei von einer AS400 aus.
Mit rs.fields(x).type bekomm ich den Feldtyp herraus (200, also VarChar)
wie bekomme ich es also nun hin das die zusätzlichen Daten, gespeichert in einem Stringarray (0 bis x) überprüft werden ob diese auch tatsächlich diesen Typ vom rs.fields(x).type einhalten ...

steh irgendwie völlig auf dem Schlauch...bitte um Hilfe

Gruss Naui


Ps. Sry für den Tippfehler im Thema
 
Bin zwar zeimlich aus der Übung was VB angeht, aber kannst du den Inhalt nicht mit VarType auf Richtigkeit prüfen

Gruß Thomas
 
Ähm jaa schon also mit VarType(array) .. aber entweder steh ich vollkommen auf der Leitung oder es ist nich richtig ,
da ich ja a) ein spezifisches array prüfen will zb das array(13) da sagt er typen unverträglich
B) mach iche nur vartype(array) dann sagt er 0 , also empty...
 
Bring mal ein wenig Code wie es bis jetzt aussieht.
Willst du ein array prüfen? Oder die Inhalte bevor du sie in einen array schreibst? Irgendwie komm ich nicht draus
 
Verstehe ich jetzt nicht. Wenn ich

Code:
a = Array("feld 1", "feld 2", 3)
MsgBox VarType(a(0))
MsgBox VarType(a(1))
MsgBox VarType(a(2))

ausführe, bekomme ich die Werte 8, 8 und 3 angezeigt. 8 steht für String/Text und 3 für Ganzzahl, stimmt also.
 
Also ich lese die CSV aus

Code:
Private Sub cmdCSV_Click()

Dim Data     As String
Dim Output() As String
Dim a        As Integer
Dim rowcount As Integer
   
On Error GoTo Fehler

CommonDialog1.Filter = "All Files (*.*)|*.*|CSV Datei (*.csv)|*.csv|Text Datei(*.txt)|*.txt"
CommonDialog1.FilterIndex = 2
CommonDialog1.ShowOpen

ff = FreeFile

Open CommonDialog1.FileName For Input As #ff
 
    MSFlexGrid1.TextMatrix(0, 0) = "Feldname"
    MSFlexGrid1.TextMatrix(0, 1) = "Feldnr"
           
    Line Input #ff, Data
        Output = Split(Data, ";")
        rowcount = UBound(Output) + 1
        MSFlexGrid1.Rows = rowcount
    Seek 1, 1
                
    Line Input #ff, Data
        Output = Split(Data, ";")
        For a = 0 To rowcount - 1
            MSFlexGrid1.Rows = a + 2
            MSFlexGrid1.TextMatrix(a + 1, 0) = Output(a)
            MSFlexGrid1.TextMatrix(a + 1, 1) = a
        Next a
        
Close #ff
 
Fehler:
    If Err.Number = 76 Then
        Exit Sub
    End If
    
    If Err <> 0 Then
        MsgBox "" & Err.Description
    Else:
        MsgBox "Datei " & CommonDialog1.FileName & " importiert"
        cmdAS.Enabled = True
        cmdAS.Caption = "Bibliothek einlesen"
    End If

End Sub


Dann lese ich die Field ausm rs in comboboxen mit
Code:
Public Sub cmdAS_Click()

Dim I               As Integer
Dim fields          As Integer
Dim fieldcounter    As Integer
Dim cocount         As Integer

AS400Connection

fields = rs.fields.Count
cocount = MSFlexGrid1.Rows - 2

On Error GoTo Fehler

combox(0).Text = ""
  For I = 1 To cocount
    Load combox(I)
    With combox(I)
      .Text = ""
      .Width = 2415
      .Left = 3960
           .Visible = True
      .Top = combox(I - 1).Top + 315
    End With
  Next I
 
 I = 0

Do
   Do
      Me!combox(I).AddItem rs.fields(fieldcounter).Name
      fieldcounter = fieldcounter + 1
    Loop Until fieldcounter = fields
    fieldcounter = 0
        I = I + 1
    Loop Until I = cocount + 1
    
Do
    I = I + 1
Loop Until I = 8

Fehler:
    If Err.Number = 360 Then
        For I = 1 To cocount
            Unload combox(I)
        Next I
    cmdAS_Click
    End If
End Sub


un zu guter letzt Speicher ich ich die recordset field als CSV überschriften wieder ab und addiere darunter jeweils die zugehörigen Datenfelder aus der alten CSV mit

Code:
Private Sub cmdSave_Click()

Dim ff              As Integer
Dim I               As Integer
Dim rowcount        As Integer
Dim listcount       As Integer
Dim listmax         As Integer
Dim colmax          As Integer
Dim counter1        As Integer
Dim counter2        As Integer
Dim outCount        As Integer
Dim restCount       As Integer
Dim restMax         As Integer
Dim comboxCount     As Integer
Dim Output()        As String
Dim rest(0 To 2000) As Variant


listmax = combox(0).listcount
colmax = MSFlexGrid1.Rows - 2




For counter1 = 0 To colmax
    For counter2 = 0 To colmax
        If combox(counter1).Text = combox(counter2).Text And Not combox(counter2).Text = "" And Not counter2 = counter1 Then
            MsgBox "Mindestens ein Eintrag wurde doppelt ausgewählt!Bitte nur einen Eintrag auswählen"
            Exit Sub
        End If
    Next counter2
Next counter1

ff = FreeFile

Open CommonDialog1.FileName For Input As #ff
 
If Not EOF(ff) Then
    Line Input #ff, Data
        Output = Split(Data, ";")
        rowcount = UBound(Output) + 1
        MSFlexGrid1.Rows = rowcount
    Seek 1, 1
End If

Do While Not EOF(ff)
    Line Input #ff, Data
    Output = Split(Data, ";")
        For outCount = 0 To rowcount - 1
            MSFlexGrid1.Rows = outCount + 2
            I = I + 1
            rest(I) = Output(outCount)
            restMax = MSFlexGrid1.Rows - 1

                For restCount = 0 To restMax
                    MSFlexGrid1.TextMatrix(outCount + 1, 0) = rest(restCount)
                    MSFlexGrid1.TextMatrix(outCount + 1, 1) = restCount - 1
                Next restCount
        Next outCount
Loop

Close #ff
  
ff = FreeFile




Open "C:/test.csv" For Output As #ff
 
Do
    If listcount = listmax - 1 Then
        Print #ff, combox(0).List(listcount)
    Else:
        Print #ff, combox(0).List(listcount) + ";";
    End If
    listcount = listcount + 1
Loop Until listcount = listmax


For restCount = MSFlexGrid1.Rows To I Step MSFlexGrid1.Rows - 1
    listcount = 0
Do
    Do Until comboxCount = colmax + 1
        If combox(comboxCount).Text = combox(comboxCount).List(listcount) Then
            Print #ff, rest(comboxCount + restCount);
        End If
    comboxCount = comboxCount + 1
    Loop
        
    If listcount = listmax - 1 Then
        Print #ff, ""
    Else
        Print #ff, ";";
    End If
    
    comboxCount = 0
    listcount = listcount + 1

Loop Until listcount = listmax
Next restCount

Close #ff
End Sub



Der rest(x) ist also das Array mit den Datenfeldern aus der alten CSV ... wenn ich nun in die neue csv speicher will ich das er prüft ob das array rest(x) auch zugelassen wird von dem jeweiligen rs.fields(x).type ...


PS Hoffe das ich euch nich verwirrt hab mit den ellenlangen codes :D
 
Zuletzt bearbeitet:
PS Hoffe das ich euch nich verwirrt hab mit den ellenlangen codes

Mich schon.

Aber mal was anderes.
Du speicherst den Datensatz aus der CSV Datei im Array "rest", dieses Array ist aber eindimensional. Wäre es nicht besser du würdest einen eigenen Datentyp erstellen der den Aufbau hat wie die Angaben aus der CSV Datei kommen
Und wo ist in deinem Quellcode der Teil wo das Array überprüft wird
 
Du speicherst den Datensatz aus der CSV Datei im Array "rest", dieses Array ist aber eindimensional. Wäre es nicht besser du würdest einen eigenen Datentyp erstellen der den Aufbau hat wie die Angaben aus der CSV Datei kommen

Das verstehe ich nicht wirklich..kannst du mir anhand von meinem Code vll ein Beispiel zeigen ? oder eben genauer erklären was du meinst ?

Zum anderen, hatte ich vergessen :D aber da es nich wirklich funktioniert .. naja hier aufjedenfall wie ich es gedacht hatte

Code:
Private Sub Command2_Click()

AS400Connection

 Dim vt As VbVarType

Label(0).Caption = VarType(rest)
  If rs.fields(0).type= VarType(rest) Then
  MsgBox "Geht!"
End If
End Sub


Habs halt noch nicht in das eigentliche abspeichern eingefügt, da ich es erst testen will....
 
Zuletzt bearbeitet:
Also ich kenne ja die Daten nicht die aus der CSV Datei kommen, aber nehmen wir mal an es ist eine Artikelliste:

Artikelnummer, Bezeichnung1, Bezeichnung2, VK_Preis, EK_Preis, Lieferantennummer

Dann enthält dein Array:

Code:
rest(0) = 12345 (Artikelnummer)
rest(1) = bla bla bla (Bezeichnung1)
rest(2) = noch mehr bla (Bezeichnung2)
rest(3) = 5,50 (VK Preis)
rest(4) = 1,80 (EK Preis)
rest(5) = 99999 (Lieferantennummer)

Wenn du einen eigenen Datentyp erstellst

Code:
Type Daten
  art_nummer As String
  bez1 As String
  bez2 As String
  vk As Single
  ek As Single
  lieferant As String
End Type

dann wäre irgendwie deutlicher welcher Wert wohin gespeichert wird und bei der Zuweisung könntest du dann immer gleich prüfen ob der Wert der übergeben wird auch den entsprechenden Typ hat.


Code:
If rs.fields(0).type= VarType(rest) Then MsgBox "Geht!"End If

So müsste es gehen:

Code:
IF rs.fields(0).type = VarType(rest(123)) then MsgBox "Geht!"
 
Zuletzt bearbeitet:
Hm Okay, ist aber rein theoretisch nicht egal das ich rest sowieso als string deklariert habe ? oder macht das einen unterschied ?

So und zu dem anderen...wenn ich
Code:
IF rs.fields(0).type = VarType(rest(123)) then MsgBox "Geht!"

schreibe...kommt der Fehler 13 "Typen unverträglich"
 

Neue Beiträge

Zurück