PDA

Vollständige Version anzeigen : komma durch Punkt ersetzen


Jens
06.06.2012, 18:08
guten abend
ich will mit nachfolgenden Code im Textfeld den Wert zB. 125,75 in 125.75
umwandeln.
Dim I As Integer

' alle Kommas durch Punkte ersetzen
For I = 1 To Len(Me!txtEinzelPreis)
If Mid(Me!txtEinzelPreis, I, 1) = "," Then
Me!txtEinzelPreis = Left(Me!txtEinzelPreis, I - 1) & _
"." & Mid(Me!txtEinzelPreis, I + 1)
End If
Next I

Ich erhalte aber aus mir leider noch nicht bekannten Fehler im Code 12.75,00 €.
Das Feldformat ist auf Euro und dezimalstellenanzahl auf automatisch eingestellt.
Was müsste ich noch ändern damit ich den richtigen Wert angezeigt bekomme.

gpswanderer
06.06.2012, 18:20
Hallo,
das Originalfeld kannst Du nicht ändern, das Komma ist ja in der Systemsteuerung als Dezimaltrennzeichen festgelegt. Du brauchst also zur Anzeige ein extra Feld. Das erzeugst Du am besten in der Abfrage.

PreisEngl: Ersetzen(Format([EinzelPreis];"currency");",";".")

Falls auch das Tausendertrennzeichen (das ist ja im englischen Format das Komma) benötigt wird, wird es etwas aufwendiger.

PreisEngl: Ersetzen(Ersetzen(Ersetzen(Format([EinzelPreis];"currency");",";";");".";",");";";".")

Hier wird erst das Komma durch ein Semikolon, dann der Punkt zum Komma und dann das Semikolon zum Punkt gemacht.

Jens
06.06.2012, 20:09
Danke für deine Hilfe, ich habe ein zusätzliches Feld eingefügt und die Datenherkunft angepasst.
Ich füge mal eine DB bei, weil der Fehler wahrscheinlich eher im Rechner-Formular liegt.
Der Code vom Rechner-Formular ist nicht von mir, habe ihn im Netz gefunden.

Jens

Anne Berg
06.06.2012, 20:48
Hallo,Ich füge mal eine DB bei, weil der Fehler wahrscheinlich eher im Rechner-Formular liegt.von welchem Fehler ist hier die Rede? Ursprünglich ging es um die fehlerhafte Ersetzung
von Komma durch Punkt - zu welchem Zweck überhaupt?! - und worum geht es nun?

BTW:
Zur Konvertierung von Dezimalkomma zu Punkt kann man die Str-Funktion einsetzen.

gpswanderer
06.06.2012, 20:58
Hallo,
Zur Konvertierung von Dezimalkomma zu Punkt kann man die Str-Funktion einsetzen.Aber nicht auch das Tausendertrennzeichen, da wird mit Str gar keins eingefügt.
Und die Formatierung geht verloren. Aus 120,10 € wird 120.1 und aus 1.234,80 € wird 1234.8

Jens
06.06.2012, 21:04
hallo
beim Aufruf des Rechner-Formulars wird nicht der korrekte Wert übergeben.

Jens

Anne Berg
06.06.2012, 21:08
Hallo.
Nach flüchtiger Ansicht des Codes möchte ich den Sinn der hier gestellten Komma-Punkt-Diskussion gern in Frage stellen
und hoffe, dass der TS sich nachträglich vielleicht doch noch zu seinen Beweggründen äußert.

@Klaus:
Und von Tausendertrennzeichen war seinerseits bislang auch gar nicht die Rede.
Ich vermute, hier liegt lediglich ein Problem im Umgang mit dem selbst- oder fremd-gebastelteten Rechner vor.

@Jens:
Du darfst dich auch gern mal etwas ausführlicher äußern...beim Aufruf des Rechner-Formulars wird nicht der korrekte Wert übergeben.nicht nur das, es wird auch nicht der korrekte Wert zurückgegeben.
Ist das also das eigentliche Problem?!

gpswanderer
06.06.2012, 21:22
@Anne,
mit Str geht ja das komplette Format verloren, nicht nur das Tausenderzeichen.
123,10 € => 123.1

Aber vermulich läuft das trotzdem auf Str raus, weil das Format ja gar nicht benötigt wird. Es sah am Anfang so aus, als ob hier ein Feld in englischer Zahlenformatierung ausgegeben werden soll. Das scheint aber nicht der Fall zu sein. Die DB habe ich mir noch nicht angesehen.

Jens
06.06.2012, 21:27
hallo
Ziel soll eigentlich sein das der Wert aus dem Feld txtEinzelPreis an das Rechner-Formular übergeben wird und dort noch andere Rechenoperationen ausgeführt werden.
Nur wird nicht der korrekte Wert an den Rechner übergeben.
Beim Start des Themas dachte ich noch das es am Komma im Textfeld liegt.

Jens

gpswanderer
06.06.2012, 21:30
Hallo,
dann verwende die Str Funktion, das reicht dann.

Jens
06.06.2012, 21:32
kannst Du mir bitte noch einen Tip zur Str Funktion geben

Jens

gpswanderer
06.06.2012, 21:47
Hallo,
kannst Du mal erklären, was Du da überhaupt vorhast?
Wozu den Rechner?

Es wäre ganz gut, wenn Du Dich zu längeren Erläuterungen hinreisen lassen könntest.

Anne Berg
06.06.2012, 21:48
Ich habe den Code noch nicht ganz durchschaut, aber ich vermute, dass die Ersetzung von Komma durch Punkt oder umgekehrt der Auslöser für die Probleme ist. Wozu soll das überhaupt gut sein? Schau dir den Windows-Rechner an, dort wird auch das Komma angezeigt. Oder muss deine Anwendung auch international lauffähig sein? Dann verlass dich doch auf die Systemeinstellungen!

Ein Beispiel für die fehlerhafte Programmierung:
Gib eine Dezimalzahl mit Nachkommastellen ein und wechsle das Vorzeichen --> das Komma verschwindet spurlos!

@Jens:kannst Du mir bitte noch einen Tip zur Str Funktion gebenDie Beschreibung findest du in der Access-Hilfe.

@Klaus:Wozu den Rechner?Die Frage würde ich nicht stellen. Warum sollte man nicht auch mal einen Taschenrechner programmieren?

Jens
06.06.2012, 21:58
die Variante mit dem Windows-Rechner habe ich schon in meiner DB integriert aber dabei kann ich doch nur den Rechner öffnen und nicht das Ergebnis aus dem Rechner in ein Formular übergeben.

Jens

Anne Berg
06.06.2012, 22:39
OK, das Problem ist aber definitiv nicht, wie man Komma durch Punkt ersetzt, sondern dass dies überhaupt versucht wird.

Daher noch einmal die Frage, warum machst du das?!
(oder ist dies Teil des "geerbten" Codes?)

Jens
07.06.2012, 05:00
guten morgen
die Sache mit dem Komma durch Punkt tauschen ist es nicht , war wie schon geschrieben eine Vermutung von mir.
Ich habe es auch schon entfernt.
Bei Eingabe von 12,35 im Feld txtEinzelpreis wird im Rechner-Foremular 12,35.
Vielmehr wird beim Laden des Rechner-Formulares im Code
If Not IsNull(Me.OpenArgs) Then
Me![Anzeige] = Me.OpenArgs
If InStr(Me![Anzeige], ".") = 0 Then
Me![Anzeige] = Me![Anzeige] & "."
End If
der Wert irgendwie verwurschtelt.
Ich komme hier leider selbst nicht weiter

Jens

Marsu65
07.06.2012, 06:47
Was soll den der Kode,
(der in Codetags gesetzt übrigens lesbarer wird):
If Not IsNull(Me.OpenArgs) Then
Me![Anzeige] = Me.OpenArgs
If InStr(Me![Anzeige], ".") = 0 Then
Me![Anzeige] = Me![Anzeige] & "."
End If
denn bewirken?
(Mal davon abgesehen, dass bei der dargestellten Form ein END IF fehlt)
Ein Punkt am Ende eines Strings zu hängen, macht keine Zahl draus. ;)


BTW und total OT:
... der Wert irgendwie verwurschtelt.
ein weiteres mal das Unwort des Monats :cool:

Anne Berg
07.06.2012, 18:19
Hallo miteinander.

Ich bin übrigens weiterhin der Meinung, dass die mAn sinnfreie Ersetzung von Komma durch Punkt, die an mehreren Stellen im Klassenmodul zu finden ist, Ursache für sämtliche Fehler ist.

gpswanderer
07.06.2012, 18:36
Hallo,
meine Frage weiter oben, wozu ein Rechner bezog sich nicht auf den Rechner ansich, sondern mehr wozu der Rechner dient.
Bisher vermisse ich immer noch eine Erklärung was mit dem Rechner im Formular überhaupt gemacht werden soll. Oder sollte ich das überlesen haben?
Ansonsten sehe ich das wie Anne, eine einmalige Konvertierung (mit Str) sollte reichen.
Aber man müsste halt mal wissen, was der Rechner bezwecken soll.

Jens
07.06.2012, 19:42
Guten abend zusammen

den Rechner wollte ich wie schon weiter oben erwähnt zur Berechnung von Preisen und diversen Zuschlägen bzw. Abschläge, Rabatte etc.

Das Rechner-Formular als einzelnes funktioniert , nur wenn aus einem anderen Formular per openArgs ein Wert übergeben wird tritt der Fehler auf.
Wie und wo sollte eine einmalige Konvertierung (mit Str) erfolgen?

Jens

Marsu65
07.06.2012, 20:03
Dann stelle ich mal die nächsten Fragen:
...nur wenn aus einem anderen Formular per openArgs ein Wert übergeben wird...
Zeige doch mal welche Werte du wie übergibst?

Was passiert mit den Werten (Openargs) in deinem Rechnerformular?
Oben gezeigter Kode scheinbar nicht, da der unvollständig ist und so keinen Sinn ergibt.

Jens
07.06.2012, 20:16
Hallo Marsu
mit dem Code

Private Sub Befehl2_Click()
On Error GoTo Err_Programminfo_Click
Me![txtEinzelPreis] = ap_calculator(Me![Test])

Exit_Programminfo_Click:
Exit Sub

Err_Programminfo_Click:
MsgBox Err.Description
Resume Exit_Programminfo_Click
End Sub


übergebe ich aus dem Formular den Wert an das Rechner-Formular

dabei wird aus zB 12,35 im Rechner-Formular 12,35.
Aber damit der Rechner korrekt arbeitet müsste 12.35 übergeben werden.

Beim Arbeiten im Rechner-Formular wird bei Eingabe gleich Komma in Punkt umgewandelt.

Jens

Marsu65
07.06.2012, 20:22
Hallo Jens,
zuerst wiederholt die Bitte, Kode auch hier im Forum als solchen formatieren.

Versuch mal folgendes, vlt. reicht das ja schon.
ergänze Me![txtEinzelPreis] = ap_calculator(Me![Test])
wie folgt:
Me![txtEinzelPreis] = ap_calculator(Str(Me![Test]))

Jens
07.06.2012, 20:30
Hallo Marsu

mit dem geänderten Code erhalte ich im Rechner-Formular 1235.

Jens

Beaker s.a.
07.06.2012, 21:06
Hallo,
Also, die Profs mögen mich berichtigen, wenn ich was übersehen habe, aber
ich sehe hier
Me![txtEinzelPreis] = ap_calculator(Me![Test])

nicht, wie einem Form seine .OpenArgs übergeben werden.
OpenArgs kann man doch nur per DoCmd.OpenForm übergeben.
Was ist denn ap_calculator?
Ich glaube mich aus eigener Anwendung (finde es aber gerade nicht wieder) erinnern zu können, dass, wenn man eine Zahl per .OpenArgs (ist ja immer String) übergeben will, man da zweimal den Typ umwandeln muss.
Beim Öffnen:
DoCmd.OpenForm _
FormName:="MeinForm", _
OpenArgs:=Format(Me!FeldMitWert)

und im aufgerufenen Form
Dim decWert As Decimal 'oder passender anderer Typ
decWert = Val(OpenArgs)
Wie gesagt, sicher bin ich mir nicht (bitte nicht schlagen), aber vielleicht ist es ja einen Versuch wert.
gruss ekkehard

Anne Berg
08.06.2012, 16:07
@Beaker s.a.: Was ist denn ap_calculator? ap_calculator ist eine Funktion im Modul mod_ap_calculator.
Das ist nicht schwer zu finden, wenn man mal die Suche im VBA-Code bemüht.
Was du nicht siehst, nämlich die Übergabe der OpenArgs, findest du in besagter Funktion.

@Jens:Das Rechner-Formular als einzelnes funktioniert , Wie stellst du das fest?! Das Problem tritt doch erst auf, wenn du den unsachgemäß manipulierten "Dezimalwert" weitergibst.

Nachtrag:
Beantworte doch bitte mal die Frage, warum du an der Darstellung mit dem Dezimalpunkt unbedingt festhalten willst.
Wird das Programm im englischsprachigen Raum eingesetzt?
Dann sollte der Punkt dort automatisch erscheinen, sofern du die Komma-Taste austauschst.

Marsu65
08.06.2012, 18:12
So, nu habe ich mal unter die Motorhaube geguckt:
Das Kernproblem ist, dass der Programmierer des Rechners Strings in Doubles übergibt und umgekehrt.
Da werden (bei deutscher Sparcheinstellung) schon mal aus Punkten Kommata et vice versa oder sie verschwinden eben.
Würde man das an allen Stellen bereinigen, funktioniert es auch.

Ich nehme mal an, dass der Rechner aus dem englischsprachigen Raum kommt, wo das keine Rolle spielt.

Jens
08.06.2012, 20:35
guten Abend
ich bin jetzt gerade erst von Arbeit zurück .
Erst mal vielen Dank für die vielen Infos.

Den Rechner will ich nur bei mir in der DB verwenden und es würde keine Rolle spielen ob es bei einer englichen Spracheinstellung funktioniert.
Wie sollten ich den Code wo abändern.
"Strings in Doubles übergibt und umgekehrt"
Ich wäre für einen Tip noch sehr dankbar.

Jens

Anne Berg
09.06.2012, 20:10
Hallo,

der Name "AP-Calculator" lässt auf die Herkunft von dem Softwareanbieter Access-Paradies schließen:Der kleine Rechner wird in Access-Anwendungen eingebaut und rechnet mit Werten der Formularfelder. Dabei können Werte direkt übergeben und zurückgegeben werden.
Im (kostenpflichtigen) Original sollte das Tool also funktionieren. Sieh zu, dass du den Originalzustand des Codes wiederherstellst.

Marsu65
09.06.2012, 22:54
Das würde dann auch erklären, warum die sqrt und 1/x- Funktionen in der Bsp.-Datei nicht belegt sind.
Diese gibt es im Original AP-Calculator nicht.

Damit wird es auch auf
Wie sollten ich den Code wo abändern.
bis auf den allgemeinen Hinweis, den du schon erhalten hast, diesbezgl. keine weitere Unterstützung mehr von mir geben.

Zu konkreten anderen Fragen gerne.

Ich halte eh nicht viel davon, Kode einzusetzen, den man nicht versteht.
Das kann auch mal ins Auge gehen. ;)

Anne Berg
11.06.2012, 15:15
Hallo Jens,

wenn du eine Lizenz für den AP_Calculator hast, so kannst du dich an den Vertreiber wenden, denn der Fehler ist wohl doch schon von Anfang an drin gewesen, wie es sich inzwischen herausgestellt hat.

EmiliaM
12.06.2012, 12:07
Hallo,

sorry, dass ich reinquatsche, aber beim Lesen des eigentlichen Zwecks:

den Rechner wollte ich wie schon weiter oben erwähnt zur Berechnung von Preisen und diversen Zuschlägen bzw. Abschläge, Rabatte etc.

würde ich fragen, wozu brauchst du eigentlich ein Rechnerformular?

Rechnen von Gesamtpreis, Rabatt, plus/minus Zuschlag/Abschlag, das kann man doch in ein paar Code-Zeilen in einer eigenen stinknormalen Funktion erledigen. Zumal diese auch die spezifischen Business Logic Regeln berücksichtigen kann. VBA kann doch die 4 Grundrechenarten, mehr braucht es nicht.

ebs17
12.06.2012, 12:31
wozu brauchst du eigentlich ein Rechnerformular?
Eine sehr gute Frage, zumal da Benutzerintelligenz gefordert ist und schlichte Tippfehler zusätzliche Fehler verursachen können.
Einen Benutzer sollte man doch bestmöglich von anstrengenden Operationen verschonen, bei Berechnungen sowieso, wo doch bei schlichten Fällen wie Dreisatz, Prozent- und Bruchrechnung garantiert jeder zweite durchfällt. Einen Taschenrechner in der Hand zu halten bedeutet noch lange nicht, dass man rechnen kann (und dieser Trend verstärkt sich).