Kompatibilitätseinstellungen – Punkt und Komma als Platzhalter verwenden (Teil 2)

Automatisch übersetzt von Deepl

Wir haben eine Reihe von Blogbeiträgen über Kompatibilitätseinstellungen und die geheimen Optionen begonnen, die Ihnen helfen können, die Leistung und das Verhalten Ihrer Anwendungen drastisch zu verbessern. Im ersten Beitrag ging es um QUERY BY FORMULA.

Im zweiten Teil der Kompatibilitätsserie geht es um die internationale Nutzung Ihrer Geschäftsanwendungen. Das kann bedeuten, dass Sie in andere Länder verkaufen – oder dass Ihre Mitarbeiter aus anderen Ländern kommen, um eine Zeit lang zu arbeiten, aber ihre lokalen Systeme verwenden.

Wenn Sie jemals Berichte wie „die Zahlen werden als >>>>>>>>> angezeigt“ gesehen oder erhalten haben , ist dieser Blogbeitrag für Sie.

Sie sind sich nicht sicher, wie Ihre Zahlen angezeigt werden? Überprüfen Sie Ihre Datenbankeinstellungen:

Wenn die obige Option bereits aktiviert ist oder gar nicht angezeigt wird (Anwendungen, die mit 4D v11 oder später erstellt wurden), ist alles in Ordnung und Sie brauchen nicht weiterzulesen.

Wie es funktionieren soll

Der 4D Entwickler entwirft für den internationalen Einsatz, während der Endanwender alle regionalen Einstellungen verwenden kann, sogar gemischte Einstellungen im Client/Server Modus.

Beispiel: „###,##0.00“ wird in Deutschland als „1.234,56“ angezeigt, in den USA als „1.234.56“, in der Schweiz als „1’234.56“

Wie es früher funktionierte (Kompatibilitätsmodus)

Der 4D Entwickler hat für eine bestimmte regionale Einstellung (in der Regel die lokale) entwickelt und der Endbenutzer musste genau dieselben Einstellungen haben.

Beispiel: „###,##0.00“ wird in Deutschland als „>>>>>>>>“ angezeigt, in den USA als „1.234.56“, in der Schweiz als „>>>>>>>>>“

wie es jetzt funktioniert (nur internationale Entwicklung)

In den neueren 4D Versionen ist alles in den 4D Methoden in einem internationalen Format:

  • Ein konstanter numerischer Wert wird mit einem Punkt als internationales Dezimaltrennzeichen definiert (z. B. 5,3).
  • Datumsangaben werden im internationalen Format „jjjj-mm-tt“ (2018-07-31) definiert. Beachten Sie das „-“ als Begrenzungszeichen und die Reihenfolge von Jahr/Monat/Tag.
  • Die Zeiten werden im 24-Stunden-Format angegeben.

Sobald der Wert angezeigt (oder formatiert) wird, werden die aktuellen regionalen Einstellungen verwendet.

Ich schreibe diesen Blogbeitrag zum Beispiel auf einem deutschen System, also ergibt String(!2018-07-31!) „31.07.2018“ und String(5.3) 5,3. Unterschiedliche Ergebnisse bei unterschiedlichen regionalen Einstellungen – für dieselbe Anwendung.

Dies erfordert ein Umdenken bei langjährigen Entwicklern, aber als Ergebnis erhalten Sie international funktionierende Anwendungen ohne zusätzlichen Aufwand.

Hinweise zur Migration

Um das Verhalten der regionalen Einstellungen zu ändern, müssen Sie alle Stellen ändern, an denen lokale Einstellungen fest kodiert sind. Dies könnte eine fast unmögliche Aufgabe sein. Aus diesem Grund gibt es eine Kompatibilitätsoption, die standardmäßig auf „kompatibel“ eingestellt ist.

Aber es gibt eine Menge zu verdienen, also schauen wir mal, wie schwierig es wirklich ist.

Hart kodierte Konstanten in Methoden

Gute Nachrichten! Es gibt nichts, was Sie tun müssten. Wenn Sie eine 4D Methode in v2004 erstellen und $i:=5,3 (deutsches System) schreiben und diese Methode in 4D v16 oder neuer öffnen, werden Sie $i:=5,3 sehen .

Das Gleiche gilt für Datums- und Zeitangaben. Problem gelöst!

Numerische Formate verwenden – Filter.

Obwohl 4D die Verwendung von harten Formaten(z.B. „###.##0,00„) in Methoden oder Formularen erlaubt, raten wir seit über 20 Jahren davon ab.

blank

Wenn Sie überall Filter verwendet haben, ist es extrem einfach, sie zu ändern. Sie haben vielleicht 5 oder 10 Filter, aber wahrscheinlich nicht mehr als 20. Sie müssen also Ihre Filter vom lokalen Format auf das internationale Format umstellen(d. h. Punkte („.“) für Dezimalzahlen und Kommas („,“) als Tausendertrennzeichen verwenden).

Aktivieren Sie anschließend das Kontrollkästchen für die Kompatibilität und Sie sind fertig!

Wie findet man hart kodierte Filter in Methoden?

Dieser Schritt ist nicht ganz so einfach wie die oben genannten. Auch wenn Sie in Ihren Anwendungen Filter verwendet haben, sind Sie sich vielleicht nicht sicher, ob Sie die Filter (gelegentlich) übersprungen und in einigen Fällen „quick & dirty“-Code erstellt haben oder nicht.

Beispiel:

$text:= String(5300; "### ##0") // to be used in Sweden with a space for thousands

Wie findet man sie?

Da es nicht so viele verschiedene Formate gibt, ist es ganz einfach!

##0 ^^^0 0,00 ***0 sind typische Formate. Es wird nur ein (möglichst eindeutiger) Teil des Formats benötigt. Wenn Sie eines dieser Textfragmente in Ihren Methoden finden, sind die Chancen ziemlich gut, dass sie hart kodiert sind. Verwenden Sie das Suchwerkzeug im Entwurfsmodus, um nach diesen Codefragmenten zu suchen und die Ergebnisse zu durchsuchen.

Wenn Sie nur wenige finden, gehen Sie sie manuell durch und ersetzen Sie sie durch Filter, wie z. B.:

$text:= String(5300;"|mynumberformat") // vertical line before filter name

Wenn Sie viele finden, durchsuchen Sie sie manuell und überprüfen Sie, ob Ihre Suchbedingung korrekt war. Nehmen Sie gegebenenfalls eine Feinabstimmung vor.

Es mag etwas Arbeit erfordern, aber Sie werden in der Lage sein, einige Muster zu definieren, die die meisten Fälle abdecken. Diese Muster sollten eine automatische „Suchen & Ersetzen“-Operation ermöglichen.

Je nach Aufwand könnten Sie sogar eine Methode schreiben, die Ihren Code durchläuft und für Sie sucht, indem Sie die METHOD GET CODE und METHOD SET CODE Befehle.

So finden Sie alle fest eingebauten Filter in Formularen

4D bietet keine Suchoption für Formulare, so dass Sie nicht automatisch nach fest kodierten Formaten in ihnen suchen können. Aber da wir Entwickler sind, können wir das selbst tun …

Zunächst müssen wir eine Liste aller Formulare für alle Tabellen erstellen und diese in einer Schleife durchgehen. Dann brauchen wir für jedes Formular eine Liste aller Objekte, die wir ebenfalls in einer Schleife durchgehen. Und schließlich prüfen wir für jedes Objekt, ob es ein numerisches Format verwendet, und wenn ja, ob es fest codiert ist. Ist dies der Fall, melden wir es.

Die gute Nachricht: Dieser Code liefert eine Liste, die der Option Suchen im Entwurfsmodus für Methoden ähnelt. Die schlechte Nachricht: Sie müssen jedes Ergebnis öffnen und das Format manuell zuweisen, was einige Zeit in Anspruch nehmen kann.

$report:=""
For ($table;0;Get last table number)
ARRAY TEXT ($arr_Names;0)

If ($table=0) // project forms
FORM GET NAMES ($arr_Names)
Else
If (Is table number valid($table))
FORM GET NAMES (Table($table)->;$arr_Names)
End if
End if

For ($forms;1;Size of array($arr_Names))
If ($table=0)
FORM LOAD ($arr_Names{$forms})
Else
FORM LOAD (Table($table)->;$arr_Names{$forms})
End if

FORM GET OBJECTS (arrObjNames;arrObjPtrs;arrPages;Form all pages)
For ($i;1;Size of array(arrObjNames))
$type :=OBJECT Get type(*;arrObjNames{$i})
If (($type=Object type text input) | ($type=Object type listbox column) \
| ($type=Object type listbox footer) | ($type=Object type static text))
$format :=OBJECT Get format(*;arrObjNames{$i})
If (($format#"") & (($format#"|@")))
If (($format="@,@")|($format="@.@"))
$report :=$report+$arr_Names{$forms}+char(9)+"Objektname: "+arrObjNames{$i}+char(9)+"Format: "+$format+char(13)
End if
End if
End if
End for
FORM UNLOAD
End for
End for

If ($report="")
$report :="Alles ist gut!"
End if

ALERT (
$report)
SET TEXT TO PASTEBOARD ($report)

Reihenfolge der Operationen

In Ihrer aktuellen Anwendung:

  • Überprüfen Sie Ihre Filter und erstellen Sie neue (falls erforderlich)
  • Lassen Sie alle Filter weiterhin die regionalen Einstellungen verwenden… noch keine Änderungen!
  • Ändern Sie alle Methoden und Formulare so, dass sie Filter verwenden
  • Setzen Sie ein.

Gleichzeitig mit einer Kopie Ihrer Anwendung:

  • Entweder intern oder für ausgewählte Beta-Tester:
    • Ändern Sie die Filter, um das internationale Format zu verwenden
    • Aktivieren Sie das Kontrollkästchen Kompatibilität
    • Kompilieren Sie und stellen Sie die Anwendung mehrere Wochen lang für die Tester bereit.
    • Sobald alles getestet und überprüft ist, stellen Sie die Anwendung für alle bereit (ersetzen Sie die bestehende)

Ähnliche Befehle

Auch wenn Sie in fast allen Fällen wollen, dass die Zahlen entsprechend den regionalen Einstellungen formatiert werden, gibt es einige Ausnahmen. So können Sie zum Beispiel beim Import oder Export von Daten andere Regeln verwenden. Dies hängt davon ab, wer die Daten verwenden wird oder wer sie bereitgestellt hat. Ein weiteres Beispiel sind Daten in einem XML- oder JSON-Format, bei denen immer ein Punkt („.“) als Dezimaltrennzeichen verwendet wird.

Ihre Aufgabe ist es nur, diese Ausnahmen zu behandeln, nicht das normale Verhalten.

Um eine Zahl in eine Zeichenkette zu konvertieren, die einen Punkt als Dezimaltrennzeichen verwendet, verwenden Sie überall auf der Welt, unabhängig von der regionalen Einstellung des Benutzers:

String($mynumber; "&xml")

Hinweis: Auch das Format heißt XML, kann also für jeden Anwendungsfall verwendet werden, solange Sie einen Punkt als Dezimaltrennzeichen verwenden wollen.

Wenn Sie hingegen eine Zeichenkette parsen wollen und wissen, dass die Zeichenkette einen Punkt als Dezimaltrennzeichen verwendet(weil Sie sie aus einem XML- oder JSON-Dokument importiert haben), verwenden Sie:

Num($mystring;".")

Schlussfolgerung

Bei älteren, gut etablierten Anwendungen kann etwas Arbeit erforderlich sein, aber das Ergebnis sind Anwendungen, die Sie überall mit korrekten Zahlenformaten einsetzen können. Das entlastet Ihren technischen Support und hilft auch Ihren Kunden. Eine Win-Win-Situation!

Thomas Maul
• VP of Strategy, 4D Product Line • Als die deutsche Niederlassung von 4D 1988 gegründet wurde, trat Thomas dem Unternehmen als Technischer Direktor bei und half beim Aufbau der 4D Entwicklergemeinschaft in Deutschland und Österreich. Nach vielen Jahren, in denen er Kunden bei technischen Problemen unterstützte und zunehmend in Vertriebs- und Managementfragen involviert war, wurde er 1999 zum Geschäftsführer von 4D Deutschland befördert. Seit 2005 war er als Mitglied der Geschäftsleitung an der weltweiten Strategie des Unternehmens beteiligt, was zu seiner jetzigen Position als Vice President of Strategy, 4D Product Line, führte, wo er für die Definition und Umsetzung der Gesamtstrategie für die 4D Produktlinie in Verknüpfung mit den Teams für Programm, F&E, Vertrieb und Marketing verantwortlich ist.