Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Feldinhalt nach 35 Zeichen aufteilen in zweites Textfeld

Begonnen von nasnbaer, Juni 17, 2014, 01:05:12

⏪ vorheriges - nächstes ⏩

nasnbaer

Hallo liebe Experten,

hier der Hintergrund:
Es soll aus einem Datensatz in einem Bericht ein Überweisungsformular gedruckt werden.
in der Tabelle sind alle für den Zahlungsempfänger wichtigen Daten der Überweisung enthalten:
ID | ZahlungsempfängerName | Gesamtbetrag | IBAN                         | Bankname                 | Verwendungszweck
1  | Ibel GmbH                       | 300,00 Euro    | DE123456789123456 | Sparkasse Heidelberg | RE20140022123, RE20140012323ee, RE20140045, RE2014ABCD12, RE3303-443
2  | Holz AG                          | 780,00 Euro    | DE66655588844411AB | Volksbank Ulm          | 499ABg, ILD44973, OP4440-787, IN2200, Lief22329, 2014000000034

Also es wird pro Überweisung (sehr oft Sammelüberweisungen) ein Datensatz angelegt. Ein Datensatz hat im Feld "Verwendungszweck" mindestens eine Rechnungsnummer stehen, kann aber auch mehrere Rechnungnummern enthalten. Mir ist klar, dass das eigentlich gegen jede Datenbank-Normalisierung spricht, aber die Tabelle ist jetzt so aufgebaut und das hat seine Gründe. Die Rechnungsnummern sind völlig verschieden aufgebaut (mal mit führendem "RE", nur Zahlen, nur Buchstaben, mit oder ohne Trennzeichen, etc). Getrennt sind die Rechnungsnummern immer mit einem Komma, gefolgt von einem Leerzeichen. Diese Trennung könnte ich auch noch anders einstellen, wenn das nötig wäre.

Auf einem herkömmlichen Überweisungsträger hat man zwei Verwendungszweckfelder mit je 35 Zeichen (35, wenn man es maschinell ausfüllt, was bei mir ja der Fall ist).
In dem Bericht habe ich ein Bild von einem Überweisungsträger hinterlegt und pro Verwendungszweck-Feld ein Textfeld darüber gelegt.
Nun meine Frage: Wie könnte ich es erreichen, dass das erste Textfeld "merkt", wenn es nicht mehr ausreicht um alle Rechnungsnummern anzuzeigen (also wenn die Rechnungsnummern inkl. aller Komma und Leerzeichen mehr als 35 sind), die verbleibenden Rechnungsnummern automatisch in das zweite Verwendungs-Textfeld aufteilt?
Es darf dabei keine Rechnungsnummer "auseinandergerissen" werden. Es muss also am Leerzeichen oder am Komma getrennt werden.

Hat jemand eine Idee?
Vielen Dank!


   

MzKlMu

Hallo,
Du solltest die DB umbauen. Die Rechnungsnummern gehören in eine exzta Tabelle. Dann kannst Du mit einer Abfrage die Felder Verwendungszeck aus dieser Tabelle flexibel auffüllen, damit die 35 Zeichen maximal genutzt werden können.
Mit der extra Tabelle kann Du das mit dem Merken sehr leicht erreichen.
Gruß Klaus

nasnbaer

Danke für die Antwort. Also die Datenbank umbauen ist keine Alternative. Ich wüsste jetzt auch nicht, wie ich es mit Abfragen hinbekomme dass sich die entsprechenden Rechnungsnummern automatisch auf Verwendungszweck1 und Verwendungszweck2 aufteilen. Das scheint mir nicht ganz so einfach zu sein. Es gibt aber auch eine Tabelle, da gibt es pro Rechnungsnummer einen Datensatz (mit Wareneingangsdatum, Rechnungsdatum, Rechnungsbetrag, etc).
Die Frage ist weiterhin: Ist es möglich den Feldinhalt wie oben beschrieben, aufzuteilen?
Danke!

MaggieMay

Hallo,

ich könnte mir dazu folgende Lösung vorstellen:Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)
    Dim vArr As Variant, strVWZ As String, i, j
   
    If Len(Me.vwz) > 35 Then
        vArr = Split(Me.vwz, ",")
        For i = LBound(vArr) To UBound(vArr)
            If strVWZ = "" Then
                strVWZ = Trim(vArr(i))
            ElseIf Len(strVWZ & ", " & vArr(i)) < 36 Then
                strVWZ = strVWZ & ", " & Trim(vArr(i))
            Else
                j = j + 1
                Me.Controls("vwz" & j) = strVWZ
                strVWZ = Trim(vArr(i))
            End If
        Next
        j = j + 1
        Me.Controls("vwz" & j) = strVWZ
        For j = j + 1 To 4
            Me.Controls("vwz" & j) = ""
        Next
    Else
        Me!vwz1 = Me!vwz
    End If
End Sub
unter der Voraussetzung, dass es vier Zeilen (vwz1-vwz4) für den Verwendungszweck gibt und dass das Steuerelement vwz den kompletten Text enthält.
Eine Prüfung, ob die vier Felder ausreichen, müsste noch hinzugefügt werden.
Freundliche Grüße
MaggieMay

nasnbaer

Vielen Dank MaggieMay!
Das werde ich mal ausprobieren. Allerdings gibt es auf dem SEPA-Überweisungsformular nur zwei Verwendungszweck-Felder/Zeilen.
Das ÜFormular sieht so aus:
https://www.enviam.de/irj/go/km/docs/z_ep_em_unt_media/unternehmensportal/Privatkunden/2_Strom/2.5_Kundeninformation/SEPA/SEPA-Ueberweisung.jpg

Ich nehme an, dass ich dann einfach die Zeile
For j = j + 1 To 4
ändere in
For j = j + 1 To 2

Mein Feld in der Datenbank enthält alle Rechnungsnummern und auch die Kundennummer die wir beim Lieferanten haben (das habe ich oben noch vergessen zu erwähnen, aber die KuNr ist auch nicht anders aufgebaut als eine Rechnungsnummer). Das Feld mit dem kompletten Verwendungszweck in der Tabelle (tblUeberweisungen) heißt (Verwendungszweck).
Wenn ich deinen Code richtig verstehe, dann ist Me.vwz ein Textfeld auf dem Bericht, welches vwz benannt ist und das kann ich ja ausblenden.
Und ich muss noch 2 weitere Textfelder anlegen die vwz1 und vwz2 heißen?
Wo ich den Code unterbringe "Detailbereich_Format" ist mir noch nicht so ganz klar, aber das finde ich sicher noch heraus.

Danke schön!

MaggieMay

Zitatändere in
For j = j + 1 To 2
Ja, damit sollen nicht benutzte Zeilen gelöscht werden, aber das dürfte bei nur zwei Zeilen nicht nötig sein, das auf diese Art mit der Schleife zu machen. Du weißt ja anhand der Textlänge genau, ob der Verwendungszweck aufgeteilt werden muss oder nicht. Die Frage "auf wie viele Zeilen" stellt sich ja nun nicht mehr.
Allerdings sollte nun erst recht überprüft werden, ob zwei Zeilen tatsächlich ausreichen.
Was ist, wenn nicht?
ZitatUnd ich muss noch 2 weitere Textfelder anlegen die vwz1 und vwz2 heißen?
Das sind die beiden Zeilen für den Verwendungszweck, die müsstest du ja eigentlich schon haben.
ZitatWo ich den Code unterbringe...
Das ist die Ereignisprozedur zum Formatereignis des zugehörigen Berichtsbereichs.

PS:
Neugierige Frage: Wo(zu) setzt man denn heutzutage noch Überweisungsträger ein?
Freundliche Grüße
MaggieMay

nasnbaer

Hallo MaggieMay,

und nochmals Danke!
Also mein Bekannter hat echt ernsthaft etwas gegen Online-Banking. Deshalb geht er bis auf Weiteres immer noch mit den Überweisungsträgern zur Bank und lässt sich die Kopie als Beleg abstempeln. Das Erstellen der Überweisungen ging bisher mit einem uralten DOS-Programm und das Drucken auf einem Nadeldrucker (Ja: Nadeldrucker) und auf einem Überweisungsträger mit Durchschlag. Jetzt gibt die Bank wohl keine Überweisungsträger mit Durchschlag mehr raus und außerdem müsste das DOS-Programm nun mit den Sepa-Nummern aktualisiert/angepasst/geändert werden. Das geht nicht mehr in dem alten Programm.
Jetzt wird auf Windows 7 gearbeitet, Access 2013 und mit handelsüblichen Überweisungsvordrucken (zB Zweckform, DataBecker oder was auch immer) sowie einem normalen Tinten- oder Laserdrucker.

Und du hast recht: Es müsste eigentlich geprüft werden ob alle Rechnungsnummern zusammen plus Kundenreferenznummer in die beiden Textzeilen (insg. 2x 35 Zeichen) passen.
Sollte das nicht so sein, müsste eigentlich ein zweites Berichtsblatt ausgedruckt werden, wieder mit Kundenreferenznummer und den restlichen Rechnungsnummern.
Aber: Es ist eher selten, dass soviele Rechnungen auf einen Überweisungsträger müssen und außerdem kann er sich im Vorfeld die Überweisung (also den Datensatz) "zusammenklicken". Man kann also vorher in einem Formular auswählen für welche Rechnungen man jetzt eine Überweisung fertig machen möchte. Und in dem Formular ist ein Text-Zeichen-Zähler drin, bei dem man genau sieht, ob alles noch auf einen Überweisungsträger geht, oder ob man bei einer Rechnung wieder das Häkchen rausnehmen muss.
Klar: Automatisch neues Berichtsblatt generieren wäre natürlich eleganter.

Leider häng ich jetzt ein wenig, es klappt noch nicht so ganz mit dem Aufteilen des Textes in die beiden Textfelder im Bericht.
Ich muss mir auch noch mal ansehen, warum ich den Code in das Ereignis "Detailbereich_Format" unterbringe und nicht in das Ereignis im Bericht "Beim Anzeigen" oder "Bei Laden" was für mein Verständnis logisch wäre. Aber ich bin da nicht so der Spezialist und mache es so wie du es vorgeschlagen hast. Wie gesagt:  noch gehts nicht so 100%, gibt auch keine Fehlermeldung.
Ich versuche es morgen nochmal und gebe Bescheid wenn ich nicht zurecht komme.


Danke schön!



MaggieMay

Hallo,
ZitatWie gesagt:  noch gehts nicht so 100%
zeig mal ein Beispiel, wo es nicht klappt und beschreibe was daran falsch ist.
Zitatund nicht in das Ereignis im Bericht "Beim Anzeigen" oder "Bei Laden" was für mein Verständnis logisch wäre
Das Format-Ereignis des Detailbereichs ist das einzig geeignete Ereignis in einem Bericht datensatzbezogene Aktionen durchzuführen.
Freundliche Grüße
MaggieMay

nasnbaer

Hallo MaggieMay!

Jetzt hat es geklappt. Dein Code war der richtige, ich musste nichts daran ändern.


Mein Fehler lag daran, dass ich den Bericht mit
DoCmd.OpenReport BerichtsName, acViewReport, , Filter
öffnen wollte. Das funktioniert dann aber nicht.
Jetzt öffne ich ihn mit "acViewPreview" und dann klappts einwandfrei.

Vielen herzlichen Dank für deine Mühe!

Wenn sonst nichts mehr ist, schließe ich das Thema.


MaggieMay

ZitatMein Fehler lag daran, dass ich den Bericht mit
DoCmd.OpenReport BerichtsName, acViewReport, , Filter
Ja, es ist nunmal so, dass bei der Berichtsansicht keine Format-Ereignisse ausgelöst werden.
Das sollte sich allmählich herumgesprochen haben.
Freundliche Grüße
MaggieMay