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

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?

Juno

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?

lumbumba

#17
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
---

Juno

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)

lumbumba

#19
Anbei die DB mit beiden Varianten:
---

Juno

#20
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)

lumbumba

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.
---

Juno

Ich habe meinen Fehler entdeckt...
Jetzt funktionierts!! Vielen Dank. ;D ;D

Juno

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]

lumbumba

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.


---

Juno

Könntest du mir vielleicht im kleinen Stil zeigen was du meinst? Also nur mit ein/zwei Felder?

lumbumba

#26
Anbei n sehr simples Bsp. in Formular 2.

Tabelle1 im entwurfsmodus öffnen, damit du siehst was ich meine. (ist möglichkeit b)
---

Juno

Ich bin ja total begeistert!!! Vielen Dank;D
Ich werds mir jetzt mal in meine DB umbauen.

Juno

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?

lumbumba

#29
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

Code (wie imma ohne Gewähr) [Auswählen]
...
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





---