Mit Recordset Datei durchsuchen

ronaldo84

Erfahrenes Mitglied
Hallo
Ich habe einen Recordset. In dem stehen alle Artikelnummern einer Tabelle.
Code:
rst.Open "Select artnr FROM Preisliste_Win "
Jetzt möchte ich das mehrere Dateien mit allen Aritkelnummern durchsucht wird.
Code:
	If rst.RecordCount > 0 Then
		With rst
			nummer = !artnr
			MsgBox (nummer)
		Do While Not rst.EOF
			 FN1 = FreeFile()
			 Open strVorlage For Input As #FN1
 
			 Do While Not EOF(FN1)
				Line Input #FN1, strLine
				MsgBox (strLine & "," & nummer)
				If InStr(strLine, nummer) > 0 Then
					'MsgBox ("Update preisliste_win SET ArtID = " & counter & " Where artnr= " & nummer & "")
					'DB.Execute ("Update preisliste_win SET ArtID = " & counter & " Where artnr= " & !artnr & "")
				End If
				'If Len(Trim$(strLine)) = 0 Then
				'End If
			 Loop
			 Close #FN1
			 rst.MoveNext
			 Loop
		End With
	End If
	rst.Close
Aber leider klappt das nicht so ganz. Er bringt zwar keine Fehlermeldung aber irgendwie geht er in den Reocrdset nicht weiter. Wenn eine Datei zuende durchsucht ist fängt er die Suche mit der gleichen Artikelnummer und in der gleichen Datei wieder an. Weiß jemand warum? Habe ich etwas falsch gemacht?
 
Hallo Ronaldo,

das With rst ist 1. ziemlich sinnfrei in deinem Code, aber da liegt nicht der Fehler :-)

Die Nummer weist du schon vor der Schleife zu die durchlaufen wird.
Du musst die Nummer in der Schleife zuweisen damit diese sich beim
nächsten Record aktualisiert.

Etwa so

Code:
If rst.RecordCount > 0 Then
	Do While Not rst.EOF
                        nummer = !artnr
	        MsgBox (nummer)
		
                        FN1 = FreeFile()
	        Open strVorlage For Input As #FN1
 
		Do While Not EOF(FN1)
		      Line Input #FN1, strLine
		      MsgBox (strLine & "," & nummer)
		      If InStr(strLine, nummer) > 0 Then
			'MsgBox ("Update preisliste_win SET ArtID = " & counter & " Where artnr= " & nummer & "")
			'DB.Execute ("Update preisliste_win SET ArtID = " & counter & " Where artnr= " & !artnr & "")
		      End If
			'If Len(Trim$(strLine)) = 0 Then
			'End If
	               Loop
	        Close #FN1
	rst.MoveNext
	Loop
End If
	rst.Close


Jens
 
Okay das hat geklappt. Nun stehe ich aber vor einem weiterem Problem.

Code:
While FileCounter <= 48940
	 SourceFile = "c:\Datenbank\daten\" & FileCounter & ".htm" 'Ausgangsdatei
 
 
 
	rst.Open "Select herstellernummer, ArtID FROM Preisliste_Win "
		Do While Not rst.EOF
			With rst
				If IsNull(!herstellernummer) = False Then
					nummer = !herstellernummer
				End If
			End With
			FN1 = FreeFile()
			Open SourceFile For Input As #FN1
				Do While Not EOF(FN1)
					Line Input #FN1, strline
					If RowCounter = 78 Then	  'Zeile mit Herstellernummer
						If InStr(strline, nummer) > 0 Then
							ChangeCounter = ChangeCounter + 1
							DB.Execute ("Update preisliste_win SET ArtID = '" & FileCounter & "' Where herstellernummer= '" & nummer & "'")
							FileContent = True
							Exit Do
							Close #FN1
							Exit Do
							FileCounter = FileCounter + 1
							Wend
						Else
							FileContent = False
							Exit Do
							rst.MoveNext
							RowCounter = 0
							Loop
						End If
					End If
					If FileContent = False Then
						Close #FN1
						Kill SourceFile
					End If
rst.Close
FileCounter = FileCounter + 1
'Wend
 
MsgBox ("Anzahl Ersetzungen:" & ChangeCounter)}
Und zwar habe ich wie gesagt mehere HTML Dateien. Diese sollen nacheinander geöffnet werden und mit dem kompletten rst durchsucht werden. Bevorzugt in Zeile 78, weil dort die Herstellernummer steht.
Wenn also die Herstellernummer in der Datei gefunden wurde soll in der Tabelle Preisliste_win die ArtID eingefügt werden. und die Datei muss nicht weiter durchsucht werden. Weder von dem aktuellem Wert im rst noch mit den folgenden Werten. Deshalb wollte ich den FileCounter um eins erhöhen und die While Schleife neu aufrufen. Aber das klappt nicht.
Er sagt
Aber ersmal weiter.
Wenn der Wert vom Recordset nicht in der Zeile 76 gefunden wird soll die Suche abgebrochen werden und die Datei mit dem nächsten Wert aus dem rst durchsucht werden. Der RowCounter wird dann wiedr auf null gesetzt und die Datei soll von vorne durchsucht werden. Wenn die Datei komplett vom rst durchsucht wurde und kein Wert zugetielt werden konnte wird soll die Datei gelöscht werden (Wenn FileContent = False ist)
SO das soll dieser Quelltext machen. Nun ist aber wie gesagt das Problem mit dem Wend. Wie kann ich die While-Schleife mit neuem Wert neu aufrufen?
Hoffe das ist verständlich. Würde mich sehr über eure mithilfe freuen.
 
Hallo Ronaldo,

da sind einige Fehler darin enthalten.
Hab jetzt nur mal auf die schnelle ein paar Änderungen gemacht die ich aber ohne
die DB und mal einem File nicht testen kann.
Ich weiß auch nicht ob der FileCounter bei 0 oder 1 beginnen muss.
Bin jetzt von 0 ausgegangen.
Schau dir einfach mal den Code an.

Code:
While FileCounter <= 48940
    SourceFile = "c:\Datenbank\daten\" & FileCounter & ".htm" 'Ausgangsdatei
    rst.Open "Select herstellernummer, ArtID FROM Preisliste_Win "
        Do While Not rst.EOF
            If Not IsNull(rst!herstellernummer) Then
                nummer = rst!herstellernummer
            Else
                GoTo weiter
            End If
            
            FN1 = FreeFile()
            Open SourceFile For Input As #FN1
                Do While Not EOF(FN1)
                    Line Input #FN1, strline
                    RowCounter = RowCounter + 1
                    If RowCounter = 78 Then   'Zeile mit Herstellernummer
                        If InStr(strline, nummer) > 0 Then
                            ChangeCounter = ChangeCounter + 1
                            DB.Execute ("Update preisliste_win SET ArtID = '" & FileCounter & "' Where herstellernummer= '" & nummer & "'")
                            FileContent = True
                            RowCounter = 0
                            Exit Do
                        Else
                            FileContent = False
                            Exit Do
                        End If
                    End If
                Loop
            Close #FN1
            
            FileCounter = FileCounter + 1
            
            If FileContent = False Then
               Kill SourceFile
            End If
weiter:
            rst.MoveNext
        Loop
    rst.Close
Wend
 
MsgBox ("Anzahl Ersetzungen:" & ChangeCounter)

Jens
 
Danke erstmal für deine Mühen. Aber wenn ich mir deinen Code anschaue dann fallen mir 2 Sachen auf.

1.) Wenn ein Wert aus dem Recordset in der Datei gefunden wird wird die Datei trotzdem mit den weitern Einträgen aus dem Recordset durchsucht. Das muss nicht sein. Sobald ein Recordset in einer Datei gefunden wurde braucht diese nicht weiter durchsucht werden.
Am liebsten wäre es mir das dann auch der gefundene Eintrag aus dem Recordset entfernt wird. Aber ich weiß nicht wie man das machen kann.


2.) Wenn die Datei mit einem Wert aus dem RST durchsucht wird. Wird die Datei danach sofort gelöscht, ohne das sie mit den restlichen durchsucht wird. Also eher so?:

Weil die Datei soll ja nur gelöscht werden wenn sie mit allen Werten durchsucht wurde und dann nichts gefunden wurde.

Was hälst du davon?
Code:
While FileCounter <= 48920
SourceFile = "c:\Datenbank\daten\" & FileCounter & ".htm" 'Ausgangsdatei
rst.Open "Select herstellernummer, ArtID, ArtNr FROM Preisliste_Win "
Do While Not rst.EOF
With rst
If Not IsNull(herstellernummer) = False Then
	nummer = !herstellernummer
	Row = 78
	search = herstellernummer
Else
	nummer = !artnr
	Row = 71
	search = artnr
End If
End With
FN1 = FreeFile()
Open SourceFile For Input As #FN1
Do While Not EOF(FN1)
	Line Input #FN1, strline
	 If RowCounter = Row Then 
	 If InStr(strline, nummer) > 0 Then 'Wenn Herstellernummer bzw. ArtNr gefunden
	 ChangeCounter = ChangeCounter + 1 'Änderungscounter erhöhen
	 DB.Execute ("Update preisliste_win SET ArtID = '" & FileCounter & "' Where " & search & " = '" & nummer & "'") 
	 FileContent = True
	 Exit Do 'Exit aus Schleife Do While not EOF(FN1)
	 Close #FN1 'Datei schliessen
	 Exit Do ' Exit aus Do While Not rst.EOF
	 GoTo weiter
	 End If
	 End If
	 FileContent = False
	 Exit Do
	 rst.MoveNext
	 RowCounter = 0
	 Close #FN1
	 Loop
weiter:
	 rst.Close
	 If FileContent = False Then
	 Kill SourceFile
	 End If
	 FileCounter = FileCounter + 1
Wend

Nur da kommt jetzt wieder der Fehler Wend ohne While.
 
Zurück