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.
Hallo,
wobei brauchst Du Hilfe?
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.
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.
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.
Hallo Franz,
oder wolltest du sonst noch etwas wissen?
Hallo,
ja, wobei ich schon vorher das gefragt habe:
Wo kann ich nun helfen, bzw. wo kommst Du nicht klar?
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?
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.
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
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
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
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]
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 soAnbei 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]
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
vielen Dank!! Dat funktioniert ja in deiner DB. Jetzt habe ich das versucht in meine DB einzubauen. Habe ein kleines Problemchen.
Ich verwende anstatt der Optionsgruppe ein Kombinationsfeld. Wenn ich jetzt einfach den Namen meines Kombifeldes anstelle der Optionsgruppe eintrage kommt ein Fehler. Was muss ich da beachten?
Ach nee, ich habs geregelt. Jetzt kommt aber die Fehlermeldung "Das Feld ist zu klein für die Datenmenge, die Sie hinzufügen wollten. Versuchen Sie, weniger Daten einzufügen.
Woran könnte das liegen?
du willst die Nummer speichern? Wie sieht das daten feld dafür aus? Ist es ein Long Integer, Double oder string? Weil wie ich schon oben erwähnt hatte sind die zahlen sehr gross, ein longfeld kann diese Zahlen nicht erfassen, d.h. du mußt ggf das Datenfeld anpassen, double oder Text.
Da ich leider dein DB nicht öffnen kann weis ich leider nicht was dein Kombifeld zurückgibt, ich nehme mal an bmu.bgs, bmu.nwl, bgu.uns
Dann hier mal die Rückgabefunktion bei der du das als Text angeben kannst.
ZitatFunction NeueFreieNr__(ByVal Section As String, ByVal FilePathWOE As String, Optional ByVal BoolDeaktiviereNeueNr As Boolean = False) As String
Dim ff As Integer
Dim s As String
Dim sf1() As String, sf2() As String
Dim lRet As Long, i As Long
Dim sNeueNr As String
Const DataE = ".dat"
Const LockE = ".LCK"
If Len(Section) = 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: lRet = LOF(ff): Close #ff
s = String$(lRet, 0)
lRet = GetPrivateProfileSection(Section, s, lRet, FilePathWOE & DataE)
s = Left(s, lRet)
sf1() = Split(s, Chr(0))
For i = 0 To UBound(sf1)
If Len(sf1(i)) > 0 Then
sf2() = Split(sf1(i), "=")
If sf2(1) = "ACTIVE" Then
sNeueNr = sf2(0)
Exit For
End If
End If
Next
'//------------------------------------------------------------------------------------------------------------------
'// Deaktiviere Nummer im Nummernpool
'//------------------------------------------------------------------------------------------------------------------
If Len(sNeueNr) > 0 Then
lRet = WritePrivateProfileString(Section, sNeueNr, " Ist Nicht mehr verwendbar", FilePathWOE & DataE)
NeueFreieNr__ = sNeueNr
End If
Sub_KillLockAndExit:
'//------------------------------------------------------------------------------------------------------------------
'// 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
ja, das Kombifeld gibt bmu.bgs etc. zurück.
Wenn ich das Feld jetzt als Text anlege und dann deinen Code verwende kommt folgender Fehler:
Fehler beim Komplieren:
Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft.
Beim Debuggen zeigt er auf diese Zeile:
Me.nw_nr = NeueFreieNr_(Me.vktyp_nameopt, sFileWOE, True)
Anbei die DB mit beiden Varianten:
Ich bekomme dann wieder die Fehlermeldung mit der Größe.
Beim debuggen wird mir dieser Code angezeigt:
Me.nw_nr = NeueFreieNr__(Me.vktyp_nameopt, sFileWOE, True)
Wenn möglich speichere deine DB unter einen anderen namen(kopieren mit explorer), öffne diese (neue) und unter Extras-->Datenbank Dienstprogramme-->datenbank konvertieren in das format 2003 auswählen. Lade dies dann mal hoch, ich versuchs zu blicken warum's bei dir nicht will.
Ich habe meinen Fehler entdeckt...
Jetzt funktionierts!! Vielen Dank. ;D ;D
Ich habe jetzt noch ein zweites Problem... Vielleicht kannst du mir dabei auch behilflich sein
Ich muss für die gleiche Software eine Datei aus meinem Access exportieren. Anbei ist eine Demo-Datei.
Das ganze funktioniert dann so:
1. Ich lege in einem Formular einen neuen DS an.
2. mit dem klick auf einen Button soll dann diese Datei erstellt werden. Die Datei beinhaltet immer nur die Daten eines Datensatzes aus Access.
Die Datei ist eigentlich so aufgebaut:
"Feldbeschreibung","Feldinhalt"
Ich habe das bisjetzt so gelöst:
Dim strDateiname As String
strDateiname = "E:\...\test.bs"
Open strDateiname For Output As #1
Write #1, "BGSDokument.Layer.Daten.Abfallbezeichnung", Nz(avv_name, "")
Write #1, "BGSDokument.Layer.Daten.Abfallschluessel", Nz(vk_avv, "")
Write #1, "BGSDokument.Layer.Daten.Nachweisnummer.NachweisNr", Nz(nw_nr, "")
Write #1, "BGSDokument.Layer.Daten.Menge", Nz(vk_mengeTo, "")
Aber vielleicht kennt jemand von euch eine bessere Variante. Weil so muss ich ziemlich viele Zeilen schreiben.
[Anhang gelöscht durch Administrator]
Ich glaub du kommst leider nicht darum herum, ne menge Zeilen zu schreiben, da irgendwo ja die Verknüpfungen zwischen der Feldbeschreibung(z.B. BGSDokument.Layer.Daten.ATBListe.Befoerderer[1].NameUndAdresse.Name.Name1) und dem Feldinhalt hergestellt werden muss. Du könntest einen teil des Feldinhaltes mittels einer Konstante abkürzen, aber um die Anzahl der Zeilen kommst du nicht drum herum.
Mir fallen imo 2 Möglichkeiten ein
a) du erstellst eine Tabelle in der die Verknüpfungen hergestellt werden, ggf die Feldbeschreibung auf verschiedene Spalten zerlegen und lässt bei der schreibroutine eine Abfrage darauf los oder
b) du gibst einen Teil der Feldbeschreibung als Feldbeschreibung in den entsprechenden Feldern der Tabellen an und liest bei der Schreibroutine mittels Auslesen der Properties diese aus und setzt sie zusammen.
Beide Versionen sind jetzt aber keine Angelegenheit die man jetzt so im vorbeigehen realisieren kann.
Könntest du mir vielleicht im kleinen Stil zeigen was du meinst? Also nur mit ein/zwei Felder?
Anbei n sehr simples Bsp. in Formular 2.
Tabelle1 im entwurfsmodus öffnen, damit du siehst was ich meine. (ist möglichkeit b)
Ich bin ja total begeistert!!! Vielen Dank;D
Ich werds mir jetzt mal in meine DB umbauen.
Bin schon auf das erste Problem gestoßen :(
Man kann nicht zufällige 2 Beschreibungen hinterlegen oder?
Ich habe hier wieder die Differenz zwischen bmu.bgs und bmu.uns.
Beide Arten DS sind in der gleichen Tabelle hinterlegt und unterscheiden sich nur über ein Kombifeld.
bmu.bgs und bmu.uns würden aber zwei verschiedene Beschreibungen benötigen.
Zur Not müsste ich das dann in 2 verschiedene Tabellen abspeichern. Oder hättest du einen anderen Vorschlag?
doch ginge, die schnellste und einfachste wäre die unterschiedlichen beschreibungen durch die Pipe von einander zu trennen.
z.b.ATBListe.Befoerderer[1].Nummer.BehoerdlicheNr|ATBListe.Befoerderer[2].Nummer.BehoerdlicheNr|
aber hier mußt du darauf achten das die Reihenfolge stimmt also z.b. 1=bmu.bgs,2=bmu.nwl,3=bmu.uns
oder du gibst die Überschrift gleich mit
bmu.bgs=ATBListe.Befoerderer[1].Nummer.BehoerdlicheNr|bmu.uns=ATBListe.Befoerderer[2].Nummer.BehoerdlicheNr|
dazu dann noch in die Funktion angepasst:
Gilt für die erste Möglichkeit
...
dim sf() as string
...
sf() = split(prop.Value,"|")
if ubound(sf) >=1 then
sOut = sOut & "Write #ff " & Chr(34) & prop.Value & Chr(34) & ", " & Chr(34) & _
Switch(sUeberscrift = "bmu.bgs",sf(0), sUeberscrift = "bmu.nwl",sf(1),sUeberscrift = "bmu.uns",sf(2) ) & _
Chr(34) & vbCrLf
else
sOut = sOut & "Write #ff " & Chr(34) & prop.Value & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
end if
Sobald ich nach dem | etwas eintrage dann bekomme ich diese Fehlermeldung:
Index außerhalb des gültigen Bereichs.
Mir wird dann diese Zeile angezeigt:
Switch(sUeberscrift = "bmu.bgs", sf(0), sUeberscrift = "bmu.nwl", sf(1), sUeberscrift = "bmu.uns", sf(2)) & _
Anbei aktualisierte:
Vielen Dank. Das funktioniert jetzt fast ;)
Wenn ich folgendes eintrage "||text" und ich von bmu.bgs ausgehe dann bekommen ich "","" eingetragen
Wenn ich aber "text||" eintrage habe ich keine Probleme
Außerdem wenn ich den Inhalt in eine Textdatei exportiere werden zu viele "" gesetzt.
Der Inhalt sieht dann so aus:
"""Feldbeschreibung"",""Feldinhalt""
""Feldbeschreibung2"",""Feldinhalt""
"
Wie kann ich das verhindern?
Du must durch eine simple Routine prüfen ob in dem entsprechenden String des Arrays etwas steht
bezogen auf das Bso.
...
For Each fld In rs.Fields
For Each prop In fld.Properties
If prop.Name = "Description" Then
sf() = Split(prop.Value, "|")
If UBound(sf) >= 1 Then
s = Switch(sUeberschrift = "bmu.bgs", sf(0), sUeberschrift = "bmu.nwl", sf(1), sUeberschrift = "bmu.uns", sf(2))
If Len(s) > 0 Then sOut = sOut & "Write #ff " & Chr(34) & s & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
Else
sOut = sOut & "Write #ff " & Chr(34) & prop.Value & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
End If
End If
Next prop
Next fld
....
was ist das "s". (Variable nicht definiert)
Wenn du in deinen Modulen "Option Explicit" verwendest, was ich auch immer anschalte, mußt du jede verwendete Variable dimmen, sprich in diesem Fall die Zeile
Dim s as string
einfügen.
"Option Explicit" kannst du aber auch ausschalten, wenn man sehr einfache Variablen verwendet aus ein oder zwei Buchstaben, nur wenn die Namen komplexer werden kannst du ggf. richtig Spaß haben wenn's an die Fehlersuche geht.
ok.
Hättest du auch eine Lösung für das Problem mit den "" siehe #32?
Achso, hab ich überlesen. ;D
nimm mal alle Chr(34) & raus
Dann verschwinden alle!!
Wenn ich das in einem Textfeld ausgebe dann stimmt das alles. Wenn ich das aber in eine Textdatei ausgebe dann habe ich entweder alle "" doppelt (mit & Chr(34) oder überhaupt nicht (ohne & Chr(34). Macht das sinn????
So ist mein code:
...
strDateiname = "E:\.....\" & Me![vk_nr] & ".bs"
sUeberschrift = [vktyp_nameopt] '<-- hier muß der Wert Übberschrift erzeugt werden
Set rs = Me.Recordset
For Each fld In rs.Fields
For Each prop In fld.Properties
If prop.Name = "Description" Then
sf() = Split(prop.Value, "|")
If UBound(sf) >= 1 Then
s = Switch(sUeberschrift = "bmu.bgs", sf(0), sUeberschrift = "bmu.nwl", sf(1), sUeberschrift = "bmu.uns", sf(2))
If Len(s) > 0 Then sOut = sOut & Chr(34) & s & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
Else
sOut = sOut & Chr(34) & prop.Value & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
End If
End If
Next prop
Next fld
Open strDateiname For Output As #1
Write #1, sOut
Close #1
Anbei wieder ein codeschnipsel, beachte aber da ich nicht weis wie die erzeugte Datei von dir gehandhabt wird, dies nur möglichkeiten sind, welche aber ggf. nicht für dich geeignet ist.
Prozedere:
eine vorhandene Datei wird gelöscht, und danach wieder mit neuen Inhalt erstellt
...
...
For Each fld In rs.Fields
For Each prop In fld.Properties
If prop.Name = "Description" Then
sf() = Split(prop.Value, "|")
If UBound(sf) >= 1 Then
s = Switch(sUeberschrift = "bmu.bgs", sf(0), sUeberschrift = "bmu.nwl", sf(1), sUeberschrift = "bmu.uns", sf(2))
If Len(s) > 0 Then sOut = sOut & Chr(34) & s & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
Else
sOut = sOut & Chr(34) & prop.Value & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
End If
End If
Next prop
Next fld
Dim ff As Integer
ff = freefile
Kill strDateiname
Open strDateiname For Binary As #ff
Put #ff, , sOut
Close #ff
Soll aber der vorhanden Text erhalten bleiben und der neue Text Angefügt werden so lautet die
Put #ff, LOF(ff) + 1, sOut
Soll jetzt aber der vorhandene Text erhalten bleiben aber nach unten geschoben werden so ist dieser Text zunächst einzulesen, mit dem neuen String zu mischen und wieder zurückzuschreiben.
dim sSave as string
...
Open strDateiname For Binary As #ff
sSave = string$(lof(ff),0)
Get #ff, , sSave
sOut = sOut & sSave
SEEK #ff,1
Put #ff, , sOut
Close #ff
bei den beiden zuletzt genannten ist aber die Zeile Kill strDateiname zu deaktivieren.
Danke deine Codes helfen mir zwar, aber nicht um das oben angesprochene Problem zu lösen.
Anbei ein paar Dateien um dir das Problem zu zeigen. Die sample... Datei ist die Vorgabe. So muss die Datei aussehen.
die 91...-Datei ist erstellt mit "& Chr(34)". Die 81....-Datei ist ohne"& Chr(34) erstellt. Vergleich mal die "Anführungszeichen".
Kann ich so nicht bestätigen, bei mir wird die Datei mit dem oben dargestellten Code irgendwie richtig nach deinen Vorgaben erzeugt.
Ich habe aber immer noch das Problem mit den Anführungszeichen. Kann man irgendwo einstellen ob man die mit exportieren möchte?
Wie gesagt wenn ich das in ein Textfeld exportiere dann habe ich das gleiche Ergebnis wie du. Aber wenn ich das ganze in eine Textdatei exportiere dann erscheinen die extra Anführungszeichen....
Zitat von: Juno vom November 04, 2010, 15:25:01So ist mein code:...
strDateiname = "E:\.....\" & Me![vk_nr] & ".bs"
sUeberschrift = [vktyp_nameopt] '<-- hier muß der Wert Übberschrift erzeugt werden
Set rs = Me.Recordset
For Each fld In rs.Fields
For Each prop In fld.Properties
If prop.Name = "Description" Then
sf() = Split(prop.Value, "|")
If UBound(sf) >= 1 Then
s = Switch(sUeberschrift = "bmu.bgs", sf(0), sUeberschrift = "bmu.nwl", sf(1), sUeberschrift = "bmu.uns", sf(2))
If Len(s) > 0 Then sOut = sOut & Chr(34) & s & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
Else
sOut = sOut & Chr(34) & prop.Value & Chr(34) & ", " & Chr(34) & rs(fld.Name) & Chr(34) & vbCrLf
End If
End If
Next prop
Next fld
Open strDateiname For Output As #1
Write #1, sOut
Close #1
Dieser dein Code erzeugt Textdateien mit zu vielen ". Das liegt daran das du die Datei im Output-Modus (Open strDateiname For Output As #1)
Wenn du hingegen die Datei im binary-Modus öffnest und mit Put in die Datei schreibst, wird genau das übertragen was in dem String sOut steht, und es werden keine zusätzlichen " erzeugt.
Open strDateiname For Output As #1
Write #1, sOut
Close #1ff = Freefile
Open strDateiname For Binary As #ff
Put #ff, , sOut
Close #ff
danke!!! ;D ;D
Ich habe jetzt noch eine Frage hierzu:
Wie kann ich oben den Code verwenden mit einem Recordset welches eine SQL-Abfrage als Datenquelle hat? Also so:
Set rs = db.OpenRecordset("SELECT * FROM qryDetDispo4 WHERE vk_nr = " & Me!vk_nr)
Der ganze Code funktioniert dann irgendwie nicht mehr so richtig.
Vielleicht könntest du mir nochmal helfen. :)