none
Eingabe in Form-Feld wird von vorne aufgefüllt

    Frage

  • Hallo zusammen,

    Win XP / Access XP

    In einer Access Anwendung habe ich folgendes eigenartige Phänomen.

    Ziel meines Vorgehens ist:

    In einem Endlos-Formular eine bestimmte Rechnungsnummer auszuwählen, dann die dazugehörige KundenNr zu ändern, damit die Rechnung der geänderten KundenNr (Rechnungsanschrift) zugeordnet wird.

    Das Form hat als Datenherkunft eine Abfrage, die über die [KndNr] mit den beiden Tabellen [Kunden]![KndNr] und [Rechnungen]![RKNr] 1:1 verbunden sind.

    Die Eingabe bzw. Änderung der KundenNr erfolgt im Form-Feld [RKNr], das über die Abfrage an die Tabelle [Rechnungen] gebunden ist.

    Bei jeder Änderung der KundenNr [RKNr] löse ich eine Ereignisprozedur [RKNr_Change()] aus, damit jede Änderung mit [IF Me.Dirty Then Me.Dirty = False] sofort gespeichert wird,. Das gute daran ist, dass für jede Änderung, aus der an das Form gebundenen Abfrage sofort der dazugehörige [Kunde] angezeigt wird.

    Nun zeigt sich aber folgendes Problem: Ich möchte die KundenNr 123 eingeben

    Eingabe: 1        wegen [IF Me.Dirty Then Me.Dirty = False] wird Kunde 1 angezeigt.

    Eingabe: 2        die zwei setzt der Curser vor die 1, so dass im Feld 21 anstatt 12 steht und Kunde 21 angezeigt wird.

    Eingabe: 3        die drei wird vor die zwei gesetzt, im Feld steht 321 statt 123

    Wenn ich die 123 – Eingabe ohne Ereignisprozedur, d.h. ohne [IF Me.Dirty Then Me.Dirty = False] eingebe, wird die 123 richtig angezeigt, allerdings sieht man dann nicht sofort den zugehörigen Kunden-Name.

     

    Ich wäre sehr dankbar, wenn mir einer der Experten hierfür eine Erklärung/Lösung geben könnte.

     Schon mal besten Dank

    Richard

    Dienstag, 12. Februar 2013 10:56

Alle Antworten

  • Hallo Richard
    Versuch' es statt dessen mit dem AfterUpdate Ereignis des Controls, in dem Du die Kundennummer eingibst. Dieses Ereignis wird erst ausgelöst, wenn die Eingabe abgeschlossen ist und Du z.B. Enter drückst oder zu einem anderen Feld wechselst.
    Gruss
    Henry

    Mittwoch, 13. Februar 2013 02:31
  • Hallo Henry,

    danke für Deine Antwort.

    Wie von Dir vorgeschlagen, habe ich mein Ereignis nun an AfterUpdate gelegt.

    Allerdings hat sich mit dem Change – Ereignis ein schönes Phänomen ergeben.

    Ich möchte KuNr 123 eingeben

    -          Nach der Eingabe der 1 wird sofort gespeichert (wg. Change) und der Kunde 1 angezeigt

    -          Bei der Eingabe der 2 kommt es zu 21 und wieder wird sofort gespeichert und der Kunde 21 wird angezeigt, u.s.w.

    Aber, offensichtlich, weil nach jeder Eingabe sofort gespeichert wird, kommt es statt 123 zu 321.

     

    Wäre schön gewesen, aber nun muss ich doch, wie von Dir vorgeschlagen mich mit AfterUpdate zufrieden geben.

    Nochmals besten Dank für die Unterstützung

    Gruss // Richard

    Mittwoch, 13. Februar 2013 19:01
  • Hallo Richard

    Auch dafür gibt es Lösungen. Du kannst mit SelStart den Cursor innerhalb des Controls wieder an das Ende stellen. Allerdings, falls dann der Benutzer 13 eingegeben hat, aber eigentlich 1223 eingeben wollte, und den Cursor nun nach der 1 positioniert und die erste 2 eingibt, dann springt der Cursor wieder ans Ende. Also auch nicht schön. Aber selbst dafür gäbe es die Möglichkeit die Cursor Position vor dem wegschreiben zu merken und den Cursor nachher wieder da hin zu stellen, wo er vorher war.

    Allerdings ist IMO die bessere Lösung für so ein Vorhaben eine Combobox zu verwenden, in der Du die Kundennummer und den Namen in einem Feld ausgibst. Dazu kannst Du das erste sichtbare Feld in der Datenquelle so aufbereiten lassen, dass es z.B. dann "KundenNr & ' - ' & KundenName" beinhaltet. Nun kann der Benutzer hier beginnen die Kundennummer einzugeben und sieht immer gleich den Namen daneben, weil die Combobox Autocomplete macht. Und das, ohne jeweils die Daten neu einzlesen zu müssen. Als gebundenes (und unsichtbares) Feld verwendest Du die Kundennummer alleine und nun tut's genau das, was Du willst.

    Noch ein Hinweis: Das, was Du machst bewirkt, dass bei jedem Tastendruck der Datensatz weggeschrieben und neu eingelesen werden muss. Dies mag ok sein, wenn Du wenige Datensätze hast und eine lokale Datenbank als Backend verwendest. Sobald Du dann aber die Datenbank (Backend oder SQL Server) auf einem Server hast und mehrere Benutzter an den Daten arbeiten, kann das ziemlich mühsam werden, weil dann nach jedem Tastendruck in diesem Feld einige Gedenksekunde eingeschaltet werden. So möchte ich auf keinen Fall arbeiten müssen. Ich würde mir das also schon nochmal überlegen. Eine Kombobox scheint mir hier den wesentlich günstigeren Ansatz darzustellen und erlaubt zudem, dass der Benutzer auch mit der Maus - wenn er das dann so will - den Kunden direkt in der Kombobox auswählen kann.

    Gruss

    Henry

    Donnerstag, 14. Februar 2013 03:09
  • Hallo Henry,

    besten Dank für Deine ausführliche Erklärung. Mir ist jetzt auch klar geworden, dass Dein Vorschlag meine Frage über eine Combobox zu lösen viel besser ist.

    Nur ist mir das Vorgehen noch nicht klar, deshalb beschreibe ich nochmal meine Frage.

    Ich habe zwei Tabellen

    -          tblKunden

    -          tblRechnungen

    Die Rechnungsdaten aus [tblRechnungen] sind über die Kunden-Nr [RKNr] bestimmten Kunden zugeordnet.

    Nun soll eine Rechnung auf einen anderen Kunden umgeschrieben werden, d.h. in der [tblRechnungen] muss zunächst die Rechnungsnummer [RechNr] gesucht werden, dann die andere Kunden-Nr [RKNr] eingetragen werden.

    Im Moment habe ich meine beiden Tabellen über eine Abfrage 1:1 mit der Kundennummer verknüpft. Diese Abfrage ist Datenherkunft für ein Endlosformular, in dem ich die entsprechende Kundennummer mit der gewünschten anderen überschreibe und somit den Rechnungsdatensatz der anderen Kundennummer zugewiesen habe.

    Es wäre schön, wenn Du mir nochmal das Vorgehen erklären könntest.

    Besten Dank und ein schönes Wochenende

    Richard

    Freitag, 15. Februar 2013 11:52
  • Hallo Richard

    "Hölzel Richard" schrieb im Newsbeitrag news:73cc0d79-0c44-4547-9ce5-dfc47cda687a@communitybridge.codeplex.com...

    Ich habe zwei Tabellen
    -          tblKunden
    -          tblRechnungen
    Die Rechnungsdaten aus [tblRechnungen] sind über die Kunden-Nr [RKNr]
    bestimmten Kunden zugeordnet.
    Nun soll eine Rechnung auf einen anderen Kunden umgeschrieben werden,
    d.h. in der [tblRechnungen] muss zunächst die Rechnungsnummer [RechNr]
    gesucht werden, dann die andere Kunden-Nr [RKNr] eingetragen werden.
    Im Moment habe ich meine beiden Tabellen über eine Abfrage 1:1 mit der
    Kundennummer verknüpft. Diese Abfrage ist Datenherkunft für ein
    Endlosformular, in dem ich die entsprechende Kundennummer mit der
    gewünschten anderen überschreibe und somit den Rechnungsdatensatz der
    anderen Kundennummer zugewiesen habe.

    Ich gehe davon aus, dass es nicht üblich ist, dass Rechnungen auf andere Kunden überschrieben werden müssen und das eher der Ausnahmefall ist.
    Wie ich das lösen würde (Luftcode ungetestet):
    Ich würde das über eine ungebundene Combobox (cboNeuerKunde) machen und die mit "Rechnung auf folgenden Kunden überschreiben" beschriften.
    Dahinter eine Schaltfläche "überschreiben". In der Combobox dann eine Datenquelle, welche etwa so aussehen würde:

    SELECT KundenNr, KundenNr & ' - ' & KundenName
    FROM Kunden
    ORDER BY KundenNr

    Gebundene Spalte: 1, Anzahl Spalten 2, Spaltenbreite: 0cm; 10cm Standardmässig bei Form_Current Ereigniss dann:

    Me!cboNeuerKunde = NULL

    Hinter der Schaltfläche dann folgender Code beim Click Ereignis:

    If IsNull(Me!cboNeuerKunde) Then
     MsgBox "Sie müssen zuerst einen Kunden auswählen"
     me!cboNeuerKunde.SetFocus
    Else
     Me!KundenNummer = me!cboNeuerKunde
     Me.Dirty = False
    End If

    Me!NeuerKunde wäre dann die KundenNummer, die in der Tabelle Rechnungen enthalten und in der Datenquelle des Forms drin ist.

    Ich verstehe allerdings noch nicht, wieso Du hier eine 1:1 Beziehung zwischen Rechnungen und Kunden hast. Eigentlich würde ich eine 1:N beziehung erwarten, also Eine Rechnung muss genau einem Kunden zugeordnet sein und ein Kunde kann 0 bis mehrere Rechnungen haben.

    Gruss
    Henry

    Montag, 18. Februar 2013 04:20
  • Hallo Richard, Hallo auch Henry,

    auch wenn das natürlich nur mittelbar mit der exakten Fragestellung zu tun hat, stellt sich, wie von Henry im Ansatz schon beleuchtet, die Frage, welcher Vorgang im Kontext kaufmännischer Buchführung die Änderung des Rechnungsempfängers unter Beibehaltung der Rechnungsnummer zuläßt. Und in der Tat kann es sich eigentlich nur um eine 1:n-Beziehung handeln.

    Ich würde dem aber noch eine weitere Komponente hinzufügen, insbesondere eben unter dem kaufmännischen Gesichtspunkt: in ähnlichen Fällen hat sich bei mir eine dritte Tabelle bewährt, mit einem Feld KD-Nr und einem Feld Rechn-Nr, jeweils verknüpft mit dem entspr. Feld in tblkunden bzw. tblRechnungen.
    D.h. die Rechnungen sind nicht unmittelbar mit den Kunden verknüpft sondern über diese Zuordnungstabelle.
    Hier läßt sich nun durch Hinzufügen weiterer Felder, wie z.B. Datum, Mitarbeiter etc. eine Historie dieser und anderer Änderungen bei der Rechnungslegung einfügen.

    Hinzukommt, daß ich den unmittelbaren Eingriff in den ggf. sensiblen Datenbestand der Rechnungslegung über ein Endlosformular  für recht problematisch halte. Ich würde dies in jedem Fall zumindest mit einer Sicherheitsabfrage versehen, im besten Fall über ein separat zu öffnendes Formular in der Dialog-Ansicht.

    Gruß

    Giorgio

    Montag, 18. Februar 2013 18:06
  • Hallo Henry,

    danke für Deine weitere Erklärung, jetzt ist es angekommen.

     Ich habe jetzt in meinem Form zwei Comboboxen.

    Mit der einen wähle ich die Rechnung über die Rechnungsnummer, für die der Kunde geändert werden soll.

    Mit der zweiten Combobox wähle ich den Kunden und über das Ereignis AfterUpdate der Combobox übernehme ich mit [Me!KundenNr = me!cboNeuerKunde] die KundenNr in die Rechnungs-Tabelle.

    Ist mein AfterUpdate mit Deinem Hinweis "Dahinter eine Schaltfläche "überschreiben". In der Combobox" so gemeint?

     Zu Deinen Hinweis 1:1 Beziehung, natürlich stimmt es, es muss eine 1:n Beziehung sein.

     Und zu der Frage weshalb es bei Rechnungen zu Anschriftsänderungen kommt.

    Beispiel: der Sohn gibt sein Fahrrad zur Reparatur und erhält nach der Fertigstellung eine Rechnung. Da der Vater bezahlt, bittet der Kunde die Rechnung auf den Vater zu ändern.

     

    Nochmals besten Dank, es war wieder mal eine grosse Hilfe!

    Richard

    Dienstag, 19. Februar 2013 16:58
  • Hallo Richard

    Ich würde die Kundennummer nicht im AfterUpdate der Combobox übernehmen, sondern beim Klick auf eine Schaltfläche, die rechts von der Combobox liegt. Zudem noch eine Warnmeldung, damit der Benutzer informiert wird, dass er jetzt etwas macht, was er nicht machen sollte. Sonst kann es schnell mal passieren, dass da aus Versehen ein falscher Kunde eingetragen wird, ohne dass es jemand bemerkt.

    Zu Deinem Beispiel:
    Das korrekte und buchhalterisch/steuertechnisch richtige Verfahren wäre folgendes:
    - Rechnung an den Sohn stornieren, damit ist das Saldo des Sohnes wieder auf 0. Der Sohn erhält dann eine Storno für die Rechnung.
    - Eine neue Rechnung für den Vater mit neuer Rechnungsnummer ausstellen. Dort kann z.B. der Hinweis auf die stornierte Rechnung an den Sohn mit der entsprechenden Rechnungsnummer drauf gesetzt werden.

    Natürlich kann der Inhalt der Rechnung in die neue Rechnung kopiert werden. Aber die gleiche Rechnungsnummer zu verwenden, wenn die Rechnung auf einen anderen Kunden geändert wird, ist nicht statthaft, ebenso, dass eine bereits zugestellte Rechnung geändert und nochmals ausgestellt wird. Sobald Du eine Rechnung aus den Händen gibst, musst Du davon ausgehen, dass diese für steuerliche Zwecke (Abzüge, etc.) benutzt wird, selbst wenn Du das Original wieder zurück erhälst. Sie könnte z.B. kopiert worden sein.

    Das könnte (je nach Land) dazu führen, dass zwei Rechnungen Deiner Kunden (die des Vaters und die des Sohnes) mit der gleichen Rechnungsnummer bei der Steuerbehörde eingehen und Du aber nur eine einreichst. Das gibt ziemlich unschönen Erklärungsbedarf. Es gibt Gründe, wieso eine Rechnungsnummer nicht mehrfach benutzt werden darf und so nebenbei auch lückenlos fortlaufend sein muss. Die Steuerbehörden sind da ziemlich pingelig, wenn es zu einem Audit kommt.

    Gruss
    Henry

    "Hölzel Richard" schrieb im Newsbeitrag news:22383b6d-4101-4b37-bf79-c4cfb6e2ff8c@communitybridge.codeplex.com...

    Mit der zweiten Combobox wähle ich den Kunden und über das Ereignis
    AfterUpdate der Combobox übernehme ich mit [Me!KundenNr =
    me!cboNeuerKunde] die KundenNr in die Rechnungs-Tabelle.
    Ist mein AfterUpdate mit Deinem Hinweis "Dahinter eine Schaltfläche
    "überschreiben". In der Combobox" so gemeint?

    _Beispiel_: der Sohn gibt sein Fahrrad zur Reparatur und erhält nach
    der Fertigstellung eine Rechnung. Da der Vater bezahlt, bittet der
    Kunde die Rechnung auf den Vater zu ändern.

    Mittwoch, 20. Februar 2013 01:29
  • Hallo Henry,

    besten Dank für Deine nochmalige Erklärung, besonders auch zu den korrekten buchhalterischen verhalten, beim Ändern von Rechnungsnummern.

    Danke und viele Grüsse

    Richard

    Freitag, 22. Februar 2013 11:33