Een vraagje over een recordset en het inlezen van lijnen (VBA)

Status
Niet open voor verdere reacties.

AMBERTJE

Gebruiker
Lid geworden
27 aug 2009
Berichten
121
Hoi iedereen,

Hier ben ik weer met een groot vraagteken.
Eerst ff een beetje de achtergrond uitleggen:
In een db (ooit opgezet door iemand die al lang weg is) wordt een .txt file ingelezen, deze txt file bevat verschillende lijnen die apart moeten ingelezen worden en kunnen herkend worden aan de 4 éérste karakters in zo'n lijn.

Vb van de 2 verschillende records:
702050000100018329268690326/04/201000:01:0026/04/2010 23/04/201000:00186801B0100012010000024003L0025/04/201020:09:06
Dit is een lijn die begint met 7020

702150000100018329268690000000000283086524690926 0 000000100000000100000000000SP00000000000000010000 0000000000000000000000000000 0000000000000000000000000000 000000000000000000000000000000060000000600000006000000000000000000000000000000000000000000000000000008005LP000000180 000000000016289598 000000000000000000
Dit is een lijn die begint met 7021

Het verschil om in te lezen wordt opgevangen met een Select Case en is geen enkel probleem.

Het probleem is dat ik bij Case 7021 wil uitsluiten dat in het Field.(Referentie) een getal komt onder 99999.
Ik heb al geprobeerd met CancelUpdate maar toch ben ik hier niet zeker van en misschien is er een betere manier.
Als er een lijn komt met bijv.0006651 mag deze niet weggeschreven worden in de recordset en de teller mag niet verhogen.
Zulke lijnen moeten als het ware deleted worden.

Dit is de code:
Code:
Private Function fSD_inlezen()

    Dim txt As TextStream
    Set txt = fso.OpenTextFile(strBestand)
    
    Dim rst7020 As DAO.Recordset, lng7020 As Long
    Dim rst7021 As DAO.Recordset, lng7021 As Long
    
    Dim strLijn As String
    Set rst7020 = CurrentDb.OpenRecordset("SELECT * FROM Tbl_SD_7020 WHERE Code_Import=" & lngCodeImport)
    Set rst7021 = CurrentDb.OpenRecordset("SELECT * FROM Tbl_SD_7021 WHERE Code_Import=" & lngCodeImport) [COLOR="darkgreen"]' & "And (Referentie > '99999')") werkt niet[/COLOR]

    Dim strVeld As String
    
    With txt
        Do Until .AtEndOfStream
            strLijn = .ReadLine
            Select Case VBA.Left(strLijn, 4)
                Case "7020"
                    With rst7020
                        lng7020 = lng7020 + 1
                        .AddNew
                        .Fields("ID_7020").Value = lng7020
                        .Fields("Code_import").Value = lngCodeImport
                        
                        strVeld = VBA.Mid(strLijn, 5, 2)
                        .Fields("DC").Value = VBA.CByte(strVeld)
                        
                        
                        strVeld = VBA.Mid(strLijn, 24, 2)
                        .Fields("WH").Value = VBA.CByte(strVeld)
                        
                        strVeld = VBA.Mid(strLijn, 7, 8)
                        .Fields("Customer_ID").Value = VBA.CLng(strVeld)
                        
                        
                        strVeld = VBA.Mid(strLijn, 44, 10)
                        .Fields("Deldate").Value = fString_To_Date(strVeld)
                        
                        
                        strVeld = VBA.Mid(strLijn, 104, 4)
                        .Fields("OrderType").Value = strVeld
                        .Update
                    End With
                    
                Case "7021"
                    With rst7021
                        strVeld = VBA.Mid(strLijn, 42, 18)
                            lng7021 = lng7021 + 1
                        .AddNew
                        .Fields("ID_7020").Value = lng7020
                        .Fields("ID_7021").Value = lng7021
                        .Fields("Code_import").Value = lngCodeImport
                                                
                        strVeld = VBA.Mid(strLijn, 42, 18)
                      [B][COLOR="navy"] If strVeld > 99999 Then [/COLOR][/B]                           
                       .Fields("Referentie").Value = VBA.Trim(strVeld)
                        
                            strVeld = VBA.Mid(strLijn, 24, 18)
                            .Fields("PalletNumber").Value = VBA.Trim(strVeld)
                        
                            strVeld = VBA.Mid(strLijn, 63, 9)
                            .Fields("Qty_Ordered").Value = VBA.CLng(strVeld) / 100
                        
                        
                            strVeld = VBA.Mid(strLijn, 72, 9)
                            .Fields("Qty_Shipped").Value = VBA.CLng(strVeld) / 100
                        
                            strVeld = VBA.Mid(strLijn, 81, 9)
                            .Fields("Qty_NotShipped").Value = VBA.CLng(strVeld) / 100
                        
                            strVeld = VBA.Mid(strLijn, 90, 2)
                            .Fields("ReasonCode").Value = strVeld
                        
                            strVeld = VBA.Mid(strLijn, 253, 9)
                            .Fields("Case_Weight").Value = VBA.CDbl(strVeld) / 1000
                           
                            .Update
[B][COLOR="navy"]    Else
                            rst7021.CancelUpdate
                        End If[/COLOR][/B]                   
                  End With
            End Select
        Loop
        .Close
    End With
    Set txt = Nothing
    Set fso = Nothing
    rst7020.Close
    Set rst7020 = Nothing
    rst7021.Close
    Set rst7021 = Nothing
End Function

Ik kan de db niet meesturen want die is gigantisch groot.

Groetjes,
Ambertje
ja ik ben met veel tegelijk bezig :(
 
Laatst bewerkt:
Kun je niet een testbestandje maken met wat meer records er in? Bij voorkeur uiteraard goede en foute...
 
Kun je niet een testbestandje maken met wat meer records er in? Bij voorkeur uiteraard goede en foute...


Hallo iedereen,

Probleem is opgelost, in de functie fStringToDate die wordt opgeroepen om een datum naar string om te zetten zat een foutje.

Groetjes en bedankt :cool:
Ambertje
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan