Calc :: Plausibilitätsprüfung :: XX-XXXXX-9999-X99-N999

XX-XXXXX-9999-X99-N999

Hallo Listlinge,

Eine Kundennummer soll in einem Feld manuell erfasst werden. Dabei
setzt sich diese aus "X" für A-Z (GOSSBUCHSTABEN) und "9" für
0-9 Zeichen zusammen. Nur "N" ist statisch. Getrennt werden die
einzelnen Abschnitte durch das "-" Minus-Zeichen.

Frage: Wie kann für dieses eine Feld eine Plausibilitätsprüfung
gemacht werden. Hinweis: Ich spreche leider kein LO-Basic.

VIELEN DANK für evtl. Vorschläge oder das Schubsen in die richtige
Richtung !!!

Gruß aus Nürnberg

Achim

NS: Für die, die wissen wollen warum: Die Tabelle wird über Icon und
dem verbundenen Makro als CVS gespeichert (dann sofort wieder als
ods). Die CVS-Datei -bzw. die darin enthaltenen Daten- werden alle 2
Minuten automatisch im Hintergrund über Software ausgewertet. Auch
wenn diese Software den korrekten Aufbau der Kundennummer prüft,
erfährt der/diejenige nichts davon, wenn diese Software eine
Kundennummer wegen flaschen Aufbau ablehnt. Nur bei korrekter
Kundennummer wird über mehrere Rechner (Server)-Grenzen hinweg ein
neuer Kunde im Server-System angelegt.
Wer wissen will wie man so ein Kunden-Konzept über bash- und Perl-
Scripte für Linux realisert, kann mir gerne ein PM-Anfrage senden.

Hallo Achim,

Eine Kundennummer soll in einem Feld manuell erfasst werden. Dabei
setzt sich diese aus "X" für A-Z (GOSSBUCHSTABEN) und "9" für
0-9 Zeichen zusammen. Nur "N" ist statisch. Getrennt werden die
einzelnen Abschnitte durch das "-" Minus-Zeichen.

Frage: Wie kann für dieses eine Feld eine Plausibilitätsprüfung
gemacht werden. Hinweis: Ich spreche leider kein LO-Basic.

Wenn Du mit Datenbanken arbeiten würdest wäre das recht einfach:
Maskiertes Feld, Maske erstellen
Eingabemaske: AALAAAAALNNNNLANNLLNNN
Zeichenmaske: __-_____-____-___-N___
... und fertig ist die Eingabemaske, die genau diese von Dir verlangte
Eingabe ausgibt.
Nur habe ich leider keine Ahnung, wie der Inhalt dieser Felder in Calc
in eine Zelle übertragen werden kann - außer mit dem Umweg über eine
Datenbank, aus der der Feldinhalt an entsprechender Stelle wieder
ausgelesen wird ...

Gruß

Robert

Hallo Achim,

XX-XXXXX-9999-X99-N999

Eine Kundennummer soll in einem Feld manuell erfasst werden. Dabei
setzt sich diese aus "X" für A-Z (GOSSBUCHSTABEN) und "9" für
0-9 Zeichen zusammen. Nur "N" ist statisch. Getrennt werden die
einzelnen Abschnitte durch das "-" Minus-Zeichen.

Frage: Wie kann für dieses eine Feld eine Plausibilitätsprüfung
gemacht werden.

Die Lösung findest Du hier:
http://www.file-upload.net/download-7119512/Achim.ods.html

Gib in den Zellen A4 bis A19 Deine zu prüfenden Zeichenketten ein.
In der Spalte X erscheint eine 1, wenn die Zeichenkette Deinen
Bedingungen entspricht.

Um zu sehen, wie es gemacht wurde, blendest Du die Zeile 2 und 3 und
die Spalten B bis W ein und schaust Dir die Formeln an.

Gruß

Stefan

Eine *einfache*[1] Plausibilitätsprüfung kannst Du auch ohne Makro z. B.
mit

=NICHT(ISTFEHLER(SUCHEN("[A-Z]{2}-[A-Z]{5}-[0-9]{4}-[A-Z][0-9]{2}-N[0-9]{3}";A1;1)))

erreichen (in einer anderen Zelle, oder per bedingter Formatierung; dann
muss aber das NICHT weg gelassen werden). Einzige Voraussetzung ist, daß
Du die Option 'Extras => Optionen => Calc => Berechnen => [X] Reguläre
Ausdrücke ermöglichen' aktivierst.

[1] d. h. ohne Angabe, an welcher Position im String der Fehler
vorliegt, und auch ohne Berücksichtigung von Groß-/Kleinschreibung; wenn
Großbuchstaben zwingend erforderlich sind, würde ich sowieso eher
empfehlen, eine grundsätzliche automatische Umwandlung ('=GROSS(A1)' o.
ä.) beim /Auslesen/ vornehmen, als vom User zu verlangen, darauf zu achten.

Wolfgang

Hallo

Hallo Listlinge,

Eine Kundennummer soll in einem Feld manuell erfasst werden. Dabei
setzt sich diese aus "X" für A-Z (GOSSBUCHSTABEN) und "9" für
0-9 Zeichen zusammen. Nur "N" ist statisch. Getrennt werden die
einzelnen Abschnitte durch das "-" Minus-Zeichen.

Frage: Wie kann für dieses eine Feld eine Plausibilitätsprüfung
gemacht werden. Hinweis: Ich spreche leider kein LO-Basic.

Eine *einfache*[1] Plausibilitätsprüfung kannst Du auch ohne Makro z. B.
mit

=NICHT(ISTFEHLER(SUCHEN("[A-Z]{2}-[A-Z]{5}-[0-9]{4}-[A-Z][0-9]{2}-N[0-9]{3}";A1;1)))

Präziser wäre:
=NICHT(ISTFEHL(SUCHEN("^[A-Z]{2}-[A-Z]{5}-[0-9]{4}-[A-Z][0-9]{2}-N[0-9]{3}$";A1)))

Werner

Ich habe deine Anmerkung, dass du kein Basic sprichst, gesehen. Aber wie wäre es mit einem fertigen Makro? :wink:

Das hat den Vorteil, dass die Formel =valid(...) nur eine Zelle in deinem Spreadsheet belegt. Außerdem bekommt der Anwender einen Hinweis darauf, wo in der Eingabe der erste Fehler ist.

~~Ab hier Basic-Code~~~~~~~~~
' Rolf Lochbühler, 2013-01-27

Option Explicit

Public Function valid( ByVal str As String ) As String

  Dim char As String
  Dim EXPECT_LEN As Integer
  Dim i As Integer
  Dim msg As String
  Dim STR_LEN As Integer
  
  EXPECT_LEN = Len( "XX-XXXXX-9999-X99-N999" )
  STR_LEN = Len( str )
  
  If STR_LEN < EXPECT_LEN Then
    msg = "Eintrag " & CStr(EXPECT_LEN - STR_LEN) & " Zeichen zu kurz."

  ElseIf STR_LEN > EXPECT_LEN Then
    msg = "Eintrag " & CStr(EXPECT_LEN - COUNT) & " Zeichen zu lang."

  Else

    i = 0
    msg = ""
    
    While msg = "" And i < STR_LEN

      i = i + 1
      char = Mid(str,i,1)

      Select Case i
        Case 1, 2, 4, 5, 6, 7, 8, 15:
          If char < "A" Or char > "z" Then
            msg = "Erwarte Buchstabe statt " & char & " an Stelle " & CStr(i) & "."
          End If
        Case 3, 9, 14, 18:
          If char <> "-" Then
            msg = "Erwarte Bindestrich statt " & char & " an Stelle " & CStr(i) & "."
          End if
        Case 10, 11, 12, 13, 16, 17, 20, 21, 22:
          If char < "0" Or char > "9" Then
            msg = "Erwarte Ziffer statt " & char & " an Stelle " & CStr(i) & "."
          End If
        Case 19:
          If char <> "N" Then
            msg = "Erwarte N statt " & char & " an Stelle 19."
          End if
      End Select
      
    Wend

  End If

  valid = "Ok"
  If msg <> "" Then
    valid = "Fehler: " & msg
  End If

End Function
~~Ende des Basic-Codes~~~~~~~~~

-rl

Hallo Robert,

vielen Dank für Deine Anregung!

Wenn Du mit Datenbanken arbeiten würdest wäre das recht einfach:

Eine DB aufzubauen, ist keine triviale Sache! Angefangen beim
Design ER-Modelle, Normalitäten, u.v.m ... bis hin zu den Eingabe-
und Anzeigemasken. Auch wenn ich mir das Design noch zutraue, ab
den Masken wird es bei mir schwierig.

Kommt erschwerrend hinzu, dass noch nicht fest steht, was alles wie
mit welchem Umfang in die Kunden-Datenbank hinein muss... (für eine
Unternehmensmutter mit acht Töchtern).

Also tue ich erstmal das was mir am leichtesten fällt - ich baue
einzelne funktionale Modelle (Insellösungen für die Töchter) die für
die ersten ca. 100 Kunden ausreichen sollten. Durch den
Praxisbetrieb werden sich dann schon die genauen Anforderungen
ergeben....

Und dann, wenn später dann die DB erstellt wird, dann wünschte ich
mir jemanden in Nürnberg mit Deinen Kenntnissen :wink:

Gruß

Achim

Hallo Stefan,

vielen Dank für Deinen Modellentwurf !

Den habe ich mir herunter geladen und lerne gerne etwas daraus!

Für die erste Tabelle, die als CVS-Datei gespeichert wird, halte ich
diese vielen zusätzlichen Spalten und Zeilen allerdings für störend.
Natürlich könnte ich das Script entsprechen erweitern, dass diese
Daten aus der CSV-Datei verworfen werden. ODER ich setze diese
Prüfungen in eine andere Tabelle und referenziere die Prüfungen auf
die Tabelle-Spalte die geprüft werden soll.

Aber ob das nicht etwas viel aufwand ist....? Dennoch glaube ich
dass Dein Vorschlag an anderer Stelle zum Einsatz kommen wird.

Gruß

Achim

Hallo Wolfgang,

=NICHT(ISTFEHLER(SUCHEN("[A-Z]{2}-[A-Z]{5}-[0-9]{4}-[A-Z][0-9]{2}
-N[0-9]{3}";A1;1)))

Das sieht sehr gut aus! Das werde ich sicherlich an dieser oder
anderer Stelle sehr gut gebrauchen können !!!

Gruß

Achim

Hallo Rolf,

Dein Code ist wohl ein absolutes "Sahnehäuptchen" - das wird niemand
abstreiten können.

Aber wie wird er eingebaut (1) und wie wird dieser aufgerufen?
Automatisch - oder per Icon?
Wie verbinde ich den Code mit den einzelnen Spalten B2 bis B101 ?

Ich (und sicherlich auch andere) bin (sind) sehr gespannt auf Deine
nächste Mail !

Gruß

Achim

(1) Ich meinde damit nicht:
Copy + Paste in
Menü::Extras::Makros verwalten::Libre Office Basic ...

Hallo Rolf,

ich glaube ich habe verstanden.

In (ausgeblendeter) Celle C2 für Celle B2 (wo die Kundennummer
eingetragen wird)

=wenn( B2<>"" ; valid(B2) ; "" )

Ist das so richtig?

Gruß Achim

Stimmt. Asche auf mein Haupt! Was passiert, wenn die Zelle leer ist, hatte ich vergessen zu testen. :-/

Aus irgend einem Grund ist dann nämlich das Argument str = "0" statt ein leerer String und es wird die gleiche Meldung ausgegeben wie wenn in der Zelle ein Zeichen steht, nämlich dass der Text 21 Zeichen zu kurz ist. Wieder was gelernt.

Aber das Problem fängst du mit dem wenn() sowieso ab. Ist ja auch sinnvoll, keine Fehlermeldung auszugeben, wenn noch niemand was eingegeben hat. :wink:

Habe übrigens gerade noch einen kleinen Fehler gefunden, deshalb hier nochmal der ganze Code. Nur die Zeile «msg = "Eintrag " & CStr(STR_LEN - EXPECT_LEN) & " Zeichen zu lang."» hat sich geändert.

~~Ab hier Basic-Code~~~~~~~~~
' Rolf Lochbühler, 2013-01-27

Option Explicit

Public Function valid( ByVal str As String ) As String

  Dim char As String
  Dim EXPECT_LEN As Integer
  Dim i As Integer
  Dim msg As String
  Dim STR_LEN As Integer
  
  EXPECT_LEN = Len( "XX-XXXXX-9999-X99-N999" )
  STR_LEN = Len( str )
  
  If STR_LEN < EXPECT_LEN Then
    msg = "Eintrag " & CStr(EXPECT_LEN - STR_LEN) & " Zeichen zu kurz."

  ElseIf STR_LEN > EXPECT_LEN Then
    msg = "Eintrag " & CStr(STR_LEN - EXPECT_LEN) & " Zeichen zu lang."

  Else

    i = 0
    msg = ""
    
    While msg = "" And i < STR_LEN

      i = i + 1
      char = Mid(str,i,1)

      Select Case i
        Case 1, 2, 4, 5, 6, 7, 8, 15:
          If char < "A" Or char > "z" Then
            msg = "Erwarte Buchstabe statt " & char & " an Stelle " & CStr(i) & "."
          End If
        Case 3, 9, 14, 18:
          If char <> "-" Then
            msg = "Erwarte Bindestrich statt " & char & " an Stelle " & CStr(i) & "."
          End if
        Case 10, 11, 12, 13, 16, 17, 20, 21, 22:
          If char < "0" Or char > "9" Then
            msg = "Erwarte Ziffer statt " & char & " an Stelle " & CStr(i) & "."
          End If
        Case 19:
          If char <> "N" Then
            msg = "Erwarte N statt " & char & " an Stelle 19."
          End if
      End Select
      
    Wend

  End If

  valid = "Ok"
  If msg <> "" Then
    valid = "Fehler: " & msg
  End If

End Function
~~Ende des Basic-Codes~~~~~~~~~

Hallo Achim,

Also tue ich erstmal das was mir am leichtesten fällt - ich baue
einzelne funktionale Modelle (Insellösungen für die Töchter) die für
die ersten ca. 100 Kunden ausreichen sollten. Durch den
Praxisbetrieb werden sich dann schon die genauen Anforderungen
ergeben....

Ich habe das jetzt mit einem kleinen Makro hinbekommen:
Der Inhalt des Formularfeldes wird ausgelesen und in eine Zelle der
Tabelle geschrieben. Wenn das im Formularfeld an den Fokusverlust
gebunden wird ist das kein Problem. Kann natürlich auch bei jeder
Änderung des Inhaltes ablaufen.

sub Inhalt_Uebertragen
  oDoc = thisComponent
  oSheet = oDoc.sheets(0) 'Erstes Tabellenblatt
  oDrawpage = oSheet.Drawpage
  oForm = oDrawpage.Forms.getByName("Formular")
  oFeld = oForm.getByName("Maske")
  oCell = oSheet.getCellRangeByName("$B$1") 'Genaue Position der Zelle
Einstellen
  oCell.string = oFeld.Text
end sub

Ich habe die Variablen nicht definiert (alle o.. als DIM o... AS OBJECT)
Wenn der Zelle dann noch zugewiesen wird, dass sie keinen Rand haben
soll, dann fällt es überhaupt nicht auf, dass Du zwischendurch in ein
Formular kommst.
Ich habe das einmal hier hochgeladen.
http://robert.familiegrosskopf.de/lo_hb/Formularfeld_Calc.ods
Das Tabellenblatt enthält jetzt nur das Formularfeld und ein Feld, das
testet, ob der Wert auch im Tabellendokument vorhanden ist.

In Deiner Situation würde ich aber erst einmal das machen, wo Du Dir
sicher bist.

Gruß

Robert

Hallo Robert,

das sieht auch nach eine spannenden Lösung aus.

Dein Makro habe ich der Tabelle zugeordnet. In Tabelle1, Celle B1
blinkt ein breiter Cursor in einem weißen "mutmaßlichem internem
Fenster". So als ob da mal mehr gewesen ist....

In Tabelle2 in Celle D2 steht die Formel

=tabelle1.maske1

Das Ergebnis dieser Formel lautet:

#NAME?

Ergo ist bei Dir etwas eingestellt was bei mir fehlt. Was muss ich
noch tun?

Gruß Achim

Hallo Achim,

Dein Makro habe ich der Tabelle zugeordnet. In Tabelle1, Celle B1
blinkt ein breiter Cursor in einem weißen "mutmaßlichem internem
Fenster". So als ob da mal mehr gewesen ist....

Wie "zugeordnet"? Eigentlich war das so eingabefertig. Zelle B1 hat ein
Eingabefeld (mit dem breiten Cursor. Der Wert wird bei der Eingabe
direkt auch in die Zelle geschrieben (das macht das Makro). Der breite
Cursor gehört zum Eingabefeld.
In B4 lese ich das nur noch einmal zum Test aus, ob der Inhalt wirklich
in B1 steht. Das war also für mich nur zur Absicherung.

In Tabelle2 in Celle D2 steht die Formel

=tabelle1.maske1

Das Ergebnis dieser Formel lautet:

#NAME?

Na ja, das war von vorherigen Tests noch übrig geblieben. Die Tabelle 2
und die Tabelle 3 spielen keine Rolle.

Ergo ist bei Dir etwas eingestellt was bei mir fehlt. Was muss ich
noch tun?

Versuche einfach einmal mit dem breiten Cursor eine Eingabe. Das Feld
ist nach Deinen Bedingungen erstellt. Sobald Du eine falsche Eingabe
machst geht der Cursor nicht weiter.

Vielleicht sollte zu dem Feld noch eine Eingabehilfe vorhanden sein,
damit die einzugebenden Formate klar sind.

Gruß

Robert

Hallo Robert,

Na ja, das war von vorherigen Tests noch übrig geblieben. Die
Tabelle 2 und die Tabelle 3 spielen keine Rolle
....
Versuche einfach einmal mit dem breiten Cursor eine Eingabe.

Dann ist alles o.k. - dann funktioniert alles einwandfrei.

> Dein Makro habe ich der Tabelle zugeordnet.
Wie "zugeordnet"? Eigentlich war das so eingabefertig.

Stimmt - Dein Modell war vollständig. Dieser Handgriff war von mir
doppelt und somit unnötig.

Yepp; durch die beiden Zeichen '^' (Textanfang) und '$' (Textende) wird
auch noch sicher gestellt, daß sich keine zusätzlichen Zeichen vor oder
hinter dem gefundenen String befinden (ich hatte eigentlich eine
separate Längenüberprüfung im Sinn, nur vergessen zu erwähnen).

Wolfgang