Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Zahl aus Textdatei einlesen.

Begonnen von Juno, Oktober 27, 2010, 09:35:23

⏪ vorheriges - nächstes ⏩

Juno

Hallo zusammen,

ich habe ein Problem und hoffe ihr könnt mir helfen.... ;)

Ich habe eine Textdatei als ein Nummern-Pool. Diese Textdatei kommt von einer anderen Software.
Und ich muss jetzt aus dieser Textdatei auf Knopfdruck eine Nummer in meinen aktuellen DS übernehmen.

Die Datei ist so aufgebaut:
BGS
1000000000 = ACTIVE
1000000001 = ACTIVE
1000000002 = ACTIVE

UNS
2000000000 = ACTIVE
2000000001 = ACTIVE
2000000002 = ACTIVE


In meiner Datenbank habe ich 2 verschiedene "arten" Datensätze. Die Art "BS" muss immer eine Nummer aus dem Abschnitt "BGS" bekommen und die Art "US" muss immer eine Nummer aus dem Abschnitt "UNS" bekommen.

Es gibt noch folgende Vorgaben:
Die Entnahme von Nummern aus dem Pool muss unter Berücksichtigung des Datei-Lockings erfolgen. Bevor die Datei für Zugriff geöffnet werden darf, muss eine Datei gleichen Namens erweitert um das Suffix ".LCK" im gleichen Verzeichnis erstellt werden. Findet eine Anwendung bereits ein entsprechendes Lockfile vor, darf kein Zugriff auf den Pool erfolgen, bis das Lockfile verschwunden ist und ein eigener Lock erfolgreich erstellt wurde.
Nummern können durch Setzen des rechten Wertes auf eine Zeichenfolge ungleich "ACTIVE" oder durch komplette Löschung einer Zeile aus der Datei entnommen werden. Die Nummern werden automatisch von der anderen Software aufgefüllt.


Juno

Ich brauche Hilfe dabei wie ich die Zahl auf Knopfdruck aus der Datei in meinen Datensatz einfügen kann.

Beispiel:
DS_id = 48
Typ = "US"
Nummer = Wenn ich einen Button klicke soll jetzt hier die nächste freie Nummer aus der textdatei entnommen werden gemäß den oben genannten Vorgaben.

DF6GL

Hallo,

das habe ich ja schon verstanden...

Nur die Lösung der Vorgabe kann halt nicht insgesamt einfach nur so hier hingeklatscht werden, weil sie nicht nur aus einer und nur aus 2 oder 3 Zeilen Code besteht....

Vielleicht solltest Du Dir ein Konzept überlegen, wie ein gangbarer Lösungsweg sein könnte, z. B.:

--Auf LCK-Datei_Existenz prüfen und bei Abwesenheit eine LCK-Datei erzeugen.
--TXT-Datei per VBA gruppiert in eine Access-Tabelle einlesen mit einem solchen Ergebnis:

BGS  1000000000   ACTIVE
BGS  1000000001   ACTIVE
BGS  1000000002   ACTIVE
UNS  2000000000   ACTIVE
UNS  2000000001   ACTIVE
UNS  2000000002   ACTIVE
.
.


--Mit einem Kombifeld, dessen Datensatzherkunft diese Tabelle entspr. gefiltert (nach "BGS" oder "UNS") ausliest, wird eine gewünschte Nummer (unklar ist, wie die Tabellen heißen, wer die Auswahl vollführen soll nach welchen Vorgaben und wann das Ganze passieren soll) ausgewählt und weiterverarbeitet.
--Danach erfolgt das Setzen von "INACTIV" im betroffenen Datensatz (oder das Löschen desselben, je nachdem, was gefordert ist)
--Zuletzt wird die vorhandene TXT-DAtei gelöscht und die Access-Tabelle wieder (per VBA) in eine (neue) TXT-Datei passend formtiert exportiert, sowie die  LCK-Datei gelöscht.



Juno

so wie du das geschildert hast hatte ich mir das vorgestellt.

Zu deinen Fragen:
- Das Kombifeld existiert bereits und heißt "vktyp_nr". Das Feld wo die ausgelesene Nummer eingefügt werden soll heißt "vk_zedalnr". Die Tabelle heißt "vkobjekte"
- Wenn der Benutzer einen neuen DS angelegt hat kann er über das Kombifeld auswählen UNS/BGS. Danach kann er dann auf einen Button klicken und es soll dann die nächste freie Nummer in vk_zedalnr eingetragen werden.
- Die verwendete Nummer soll dann in der Datei gelöscht werden.

Juno

Hallo Franz,

oder wolltest du sonst noch etwas wissen?

DF6GL

Hallo,

ja, wobei ich schon vorher das gefragt habe:

Wo kann ich nun helfen, bzw. wo kommst Du nicht klar?



Juno

Ich habe den ersten Schritt gemacht (Also überprüfen ob Datei existiert, wenn nicht dann anlegen der .lck Datei)
Aber wie mache ich das mit dem Einlesen des Inhaltes?

DF6GL

Hallo,

nun, die Txt-Datei per open-Command öffnen und Zeile für Zeile einlesen (z. B. mit Line Input).  Dabei die "Überschrift" und die "Datenzeilen" erkennen und separat so behandeln, dass "Zeilen"  (3 Variablen) so entstehen, wie Du vorher gepostet hast. Dann diese "Zeilen" als je einen Datensatz per Recordset (oder mittels Anfüge-SQL-String) in eine Tabelle schreiben.


Juno

ZitatDabei die "Überschrift" und die "Datenzeilen" erkennen und separat so behandeln, dass "Zeilen"  (3 Variablen) so entstehen,

Ich habe noch nie eine Datei eingelesen. Habe also keinen Dunst wie ich deine Hilfestellung realisieren soll. Könntest du das auf dumm-deutsch-für-anfänger erklären?
Wenn ich wüsste wie das ging dann würde ich nicht hier im Forum fragen...  ;) ;D

lumbumba

#10
Hier mal n bsp, obs hilft weis ii net
Function NeueFreieNr_(ByVal sUeberschrift As String) As Long
   Dim sBuff As String
   Dim sf() As String
   Dim i As Long, NumKreis As Long
   Dim ff As Integer
   
   ff = FreeFile
   Open "laufwerk:\Path\DeineNummernTextDatei.txt" For Binary As ff                               '<-- Hier deine Datei angeben
   sBuff = String$(LOF(ff), 0)
   Get #ff, , sBuff
   Close #ff
   sf() = Split(sBuff, vbCrLf)
   NumKreis = Switch(sUeberschrift = "BGS", 1, sUeberschrift = "UNS", 2)
   For i = 1 To UBound(sf) 'sf(0) wird übersprungen
       If Val(Left(sf(i), 1)) = NumKreis And InStr(sf(i), "ACTIVE") > 0 Then
           NeueFreieNr_ = Val(sf(i))
           Exit For
       End If
   Next
End Function
---

DF6GL

Hallo,

und hier noch meine Version (nur Einlesen und Speichern in einer Tabelle:


Sub FileRead()
Dim lu As Long, strP1 As String, Zeile As String, a
Dim db As Database
Set db = CurrentDb

lu = FreeFile
Open "c:\aom.txt" For Input As #lu

Do Until EOF(lu)

    Line Input #lu, Zeile
   
    If Len(Zeile) > 0 Then
   
        If Len(Zeile) = 3 Then
        strP1 = Zeile
        a = Split(Zeile, "=")
    Else
        a = Split(Zeile, "=")
    End If
   
    If UBound(a) = 1 Then db.Execute "insert into tblTest (Feld1,Feld2,Feld3) values ('" & strP1 & "','" & Trim(a(0)) & "','" & Trim(a(1)) & "')"

    End If
Loop
Close #lu
Set db = Nothing

End sub

Juno

vielen Dank für die 2 Lösungen. Aber beide funktionieren nicht so richtig.

Bei Lösung wo die Zahl direkt in ein Feld geschrieben wird kommt nur einen 0.

Und bei der zweiten Lösung werden die Zahlen zwar ausgelesen aber in der Tabelle ist immer ein Viereck mit einem Fragezeichen. Außerdem gibt es keine Unterscheidung zwischen BGS und UNS.

Ich denke mal das die Probleme davon kommen, dass ich die Situation nicht richtig beschrieben habe. Deshalb anbei eine Demo-Datenbank und Textdatei.

Von der Sache her würde mir die erste Lösung besser gefallen. Aber gibt es dann auch eine Möglichkeit die Zeile in der Textdatei zu löschen oder auf Inaktive zu setzen?


[Anhang gelöscht durch Administrator]

lumbumba

#13
1. Da ich kein Acc2007 oder höher hab kann ich die DB nicht öffnen.
2. jup du hattest es leider nicht ganz genau beschrieben denn z.B. UNS <> [bmu.uns] darum gibt er dir auch nur Null zurück weil er die richtige Section nicht findet. desweiteren seh ich gerade das dein Nummernkreis riesige Werte beinhaltet. Ich schau mal ob ich's mit doubles gebacken bekomme.
ZitatAber gibt es dann auch eine Möglichkeit die Zeile in der Textdatei zu löschen oder auf Inaktive zu setzen?
Ja auch das wäre drinne. momentchen, please hold the line .. oda so

Anbei eine 2003er bsp, ist nur ein Formular
im Code mußt du den Path für sFileWOE anpassen. bei mir lautet er "h:\documentNumberPool"
zudem wird von folgender vorraussetzung ausgegangen: Die einzelnen Nummernkreise beginnen immer mit einer eindeutigen Zahl, also bmu.bgs mit 1, bmu.uns mit 2 etc.



[Anhang gelöscht durch Administrator]
---

lumbumba

#14
Hier mal der geänderte Code, erstellt auch ne Lock-file



Private Sub Befehl10_Click()

    Dim sFileWOE As String
    sFileWOE = "h:\documentNumberPool" <--Hier mußt du den path anpassen

    If Len(Dir(sFileWOE & ".LCK")) = 0 Then
        Me.Text0 = NeueFreieNr_(Me.Rahmen2, sFileWOE, True)
    Else
        MsgBox "Nummernliste momentan gesperrt." & vbCrLf & _
               "Probieren sie es später wieder."
    End If
End Sub

Function NeueFreieNr_(ByVal lNumKreis As Long, ByVal FilePathWOE As String, Optional ByVal BoolDeaktiviereNeueNr As Boolean = False) As String
   On Error GoTo Sub_ERR_Handle
   Dim sBuff As String
   Dim sf() As String
   Dim i As Long, NumKreis As Long, lRet As Long
   Dim ff As Integer
       
   Const DataE = ".dat"
   Const LockE = ".LCK"
   If lNumKreis = 0 Then Exit Function
   '//------------------------------------------------------------------------------------------------------------------
   '// Erstelle LCK-File
   '//------------------------------------------------------------------------------------------------------------------
   ff = FreeFile: Open FilePathWOE & LockE For Binary As ff: Put #ff, 1, 1: Close #ff
   '//------------------------------------------------------------------------------------------------------------------
   '// Hole nächste freie Nummer
   '//------------------------------------------------------------------------------------------------------------------
   ff = FreeFile: Open FilePathWOE & DataE For Binary As ff: sBuff = String$(LOF(ff), 0): Get #ff, , sBuff
   sf() = Split(sBuff, vbCrLf)
   'NumKreis = Switch(sUeberschrift = "BGS", 1, sUeberschrift = "UNS", 2, sUeberschrift = "ATA", 3)
   NumKreis = lNumKreis
   For i = 1 To UBound(sf) 'sf(0) wird übersprungen
       If Val(Mid(sf(i), 2, 1)) = NumKreis Then
           If InStr(sf(i), "ACTIVE") > 0 And InStr(sf(i), "INACTIVE") = 0 Then
               NeueFreieNr_ = Format(Val((sf(i))))
               If BoolDeaktiviereNeueNr = True Then
                   sf(i) = vbTab & Format(Val(sf(i))) & vbTab & "= Is InActive"
                   Put #ff, 1, Join(sf(), vbCrLf)
               End If
               Exit For
           End If
       End If
   Next
Sub_KillLockAndExit:
   Close #ff
   '//------------------------------------------------------------------------------------------------------------------
   '// Lösche LCK-File
   '//------------------------------------------------------------------------------------------------------------------
   Kill FilePathWOE & LockE
   Exit Function
   
Sub_ERR_Handle:
   Debug.Print Err.Number, Err.Description
   Err.Clear
   GoTo Sub_KillLockAndExit
   
End Function



---