Access für profis!

ich muss aus eine db2 datenbank eine tabelle abfragen
in eine spalte stehen N zahlen!!!
z.b. 841749873214523897612374623874681723469236487632896418397

und ich will sie bei mir so angezeigt haben:
z.b. 8417-4987-3214-5238-9761-2374-6238-7468-1723-4692-3648-7632-8964-1839

ich möchte immer nach vier zahlen ein bindestrich kommt!!

würde mich freuen wenn mir jemand helfen könnte
thx, dino

ich muss aus eine db2 datenbank eine tabelle abfragen
in eine spalte stehen N zahlen!!!
z.b. 841749873214523897612374623874681723469236487632896418397
und ich will sie bei mir so angezeigt haben:
z.b.
8417-4987-3214-5238-9761-2374-6238-7468-1723-4692-3648-7632-8964-1839
ich möchte immer nach vier zahlen ein bindestrich kommt!!

Hallo,

das ist gar nicht so schwierig. Ich habe gerade mal eine Funktion geschrieben, die das gewünschte erledigt. Der Aufruf ist: BlockWrite(Line,BlockLength,Separator), sie gibt einen String zurück, in dem alle BlockLength Stellen ein Separator eingefügt wird. Dabei ist zu beachten, dass als Line auch ein String erwartet wird, Du Deine Zahl vorher also evtl. konvertieren musst. Die Funktion lässt sich bestimmt auch noch optimieren, aber nach meinen (zugegebenermaßen oberflächlichen) Versuchen funktioniert sie.
Genug der Worte, sprechen wir Code:

Public Function BlockWrite(Line As String, BlockLength As Integer, Separator As String) As String
 Dim dStr As String
 dStr = ""
 Dim i, r As Integer
 For i = 0 To Len(Line) \ BlockLength - 1
 If dStr = "" Then
 dStr = Left(Line, BlockLength)
 Else
 dStr = dStr + Separator + Mid(Line, i \* BlockLength + 1, BlockLength)
 End If
 Next
 r = Len(Line) Mod BlockLength
 If r 0 Then
 If r = Len(Line) Then
 dStr = Line
 Else
 dStr = dStr + Separator + Right(Line, r)
 End If
 End If
 BlockWrite = dStr
End Function

Marc

ich danke dir erstmal für deine hilfe
ABER, ich kenne mich leider nicht so gut in access aus!!
ich mache access abfragen über diesen sql entwurfsansicht!!
und leider bin ich da nicht weiter bewandert!!!
könntest du mir vielleicht noch einpaar tips geben wo ich das einbaue!
danke dir schon mal für deine mühe für das ersteteil

OK, im Datenbankfenster gehst Du zum Bereich „Module“. Dort erstellst Du ein neues Modul und kopierst den Code-Teil aus meinem ersten Posting in das Code-Fenster. Dieses schließen, die Frage, ob Du speichern möchtest beantwortest Du mit „Ja“ (der Name, unter dem gespeichert wird, ist egal).
Jetzt öffnest Du Deine Abfrage (bzw. erstellst eine neue) im Entwurfsmodus. Ich gehe einfach mal davon aus, dass das Feld, dessen Inhalt formatiert werden soll auch in der Abfrage enthalten ist (sagen wir mal mit dem Feldnamen „NUMMER“). Jetzt fügst Du der Abfrage ein neues Feld hinzu, dort schreibst Du einfach in die erste Zeile: Ausdr1: BlockWrite([NUMMER];4;"-").
Das war’s schon. Abfrage ausführen und staunen. :smile:

Schönes (verlängertes) Wochenende
Marc

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

der gibt mir eine fehlermeldung

################################
Fehler beim kompilieren!!
erwartet: zeilennummer oder sprungmarke oder anweisung oder anweisungsende

OK HILFE
#################################
soll ich die ersten zwei zeilen dort stehen lassen die er selbst erzeugt oder mach muss mit denen machen!!

DANKKKKKKKKEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

es funktioniert!!
ich danke dir vielmals.
kann vielleicht morgen den tag etwas geniessen!!

jetzt noch etwas

was ist wenn ich z.b. aus
4124234876123983
folgendes haben möchte:
-1-4124-2-2348-3-7612-4-3983

und sollte es möglich sein, vielleicht die aufzählung irgendwie hervor heben!?!?!

thx im vorraus schon mal

es funktioniert!!
ich danke dir vielmals.
kann vielleicht morgen den tag etwas geniessen!!

Glückwunsch :smile:

was ist wenn ich z.b. aus
4124234876123983
folgendes haben möchte:
-1-4124-2-2348-3-7612-4-3983

Dazu ersetzt Du einfach die Funktion in dem erstellten Modul durch folgende:

Public Function BlockWrite(Line As String, BlockLength As Integer, Separator As String, Optional Count As Boolean = False) As String
 Dim dStr As String
 dStr = ""
 Dim i, r, Counter As Integer
 Counter = 1
 For i = 0 To Len(Line) \ BlockLength - 1
 If dStr = "" Then
 If Count Then
 dStr = Separator + "1" + Separator + Left(Line, BlockLength)
 Else
 dStr = Left(Line, BlockLength)
 End If
 Else
 If Count Then
 dStr = dStr + Separator + CStr(Counter) + Separator + Mid(Line, i \* BlockLength + 1, BlockLength)
 Else
 dStr = dStr + Separator + Mid(Line, i \* BlockLength + 1, BlockLength)
 End If
 End If
 Counter = Counter + 1
 Next
 r = Len(Line) Mod BlockLength
 If r 0 Then
 If r = Len(Line) Then
 If Count Then
 dStr = Separator + "1" + Separator + Line
 Else
 dStr = Line
 End If
 Else
 If Count Then
 dStr = dStr + Separator + CStr(Counter) + Separator + Right(Line, r)
 Else
 dStr = dStr + Separator + Right(Line, r)
 End If
 End If
 End If
 BlockWrite = dStr
End Function

Diese Funktion hat einen weiteren optionalen Parameter. Das heißt, dass dieser Parameter nicht unbedingt angegeben werden muss, dann verhält sich die Funktion wie vorher auch. Willst Du jetzt aber die Aufzählung einschalten brauchst Du einfach nur „Wahr“ (ohne „“) als zusätzlichen Parameter in Deine Abfragedefinition einfügen, also etwa sowas: x: BlockWrite([Nummer];4;"-";Wahr).

und sollte es möglich sein, vielleicht die aufzählung
irgendwie hervor heben!?!?!

Das geht so ohne Weiteres in Deiner Abfrage nicht.

Gruß
Marc

1 Like