Neuigkeiten:

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

Mobiles Hauptmenü

Pop up Eingabeformular

Begonnen von Klaus S. aus B, März 23, 2015, 18:10:33

⏪ vorheriges - nächstes ⏩

Klaus S. aus B

Hallo zusammen,

ich bräuchte mal wieder einen guten Tipp.
Ich muss in einer DB IP Adressen speichern. Dafür habe ich schon einen guten Tipp bekommen.
http://www.access-o-mania.de/forum/index.php?topic=19705.msg108778#msg108778

Jetzt ist mir aber doch aufgefallen, dass ich pro DS ca. 10 IP Adressen speichern muss. Bei 4 Felder / IP sind mir das doch etwas viele Felder.
Jetzt habe ich die Idee, dass ich die eigentliche Speicherung doch in einem Textfeld mache, aber um Eingabefehler zu vermeiden, die Aufteilung in die vier Blöcke (Feld vom Typ Byte) für die Eingabe beibehalten will.
Also schwebt mir vor beim Klick auf ein IP Feld öffnet sich ein Popup Formular, mit vier Feldern und zwei Buttons (speichern & abbrechen).

Wie ich dem Popup mitteilen kann, aus welchem Feld heraus es aufgerufen wurde, habe ich eine Idee (docmd.openform .... (openargs) "Feldname").
Jetzt hänge ich aber, wie ich mit dem Wert für das Textfeld wieder "ins Formular zurückkomme".  ???

Kann mir jemand einen Tipp geben?

Gruß
Klaus 

Wurliwurm

Nachdem eine IP-4-Adresse eine 32-Bit-Zahl ist, kann man sie auch so speichern und das würde ich dir vorschlagen. Es braucht dann halt Konvertierungen in beide Richtungen. Das halte ich für weniger fehlerträchtig als die Punkt-Formatierungen in der Datzenbank zu verwenden.

OpenArgs kann leider nur mit zeichenartigen Daten verwendet werden. Solche Popups, wie dir eins vorschwebt, löse ich folgendermaßen:

Es gibt ein Popup-Formular mit einer lokalen Objektvariable von Typ Eingabefeld. Außerdem eine öffentliche Sub-Routine BindeForm( byref p_field ) mit einem Eingabeargument vom Typ Eingabefeld. In der BindeForm-Routine wird dann die lokale Variable gesetzt.

Außerdem gibt es in einem Modul eine öffentliche Routine oeffnePopup mit Argument vom Typ Field. In dieser Routine wird Docmd.Openform für das Popup ohne Argumente aufgerufen und eine Zeile darunter BindeForm.

Das Popup-Formular hat einen Button, das beim Klick den Wert aus dem Eingabefeld in das aufrufende Feld übergibt
Me.objTextFeld.Value = Me.txtInput.Value

Aus dem aufrufenden Formular muss dann einfach oeffnePopup mit dem entsprechenden Eingabefeld aufgerufen werden. Also nur eine Zeile Code. Funktionoert auch in Endlosformularen. Durch die extra Modul-Routine kann das Popup-Formular leicht ausgetauscht werden, ohne in den ganzen aufrufenden Formularen am Docmd.openForm rumbasteln zu müssen.

daolix

ZitatJetzt ist mir aber doch aufgefallen, dass ich pro DS ca. 10 IP Adressen speichern muss. Bei 4 Felder / IP sind mir das doch etwas viele Felder.
Huh? Bei vollständiger Normalisierung, die IPs in eigener Tabelle mit PK&FK, bleiben es nur 4 Felder die du zeichnen musst, den Rest erledigt Acc im UFrm von alleine.

Klaus S. aus B

HAllo Daolix,

sorry, das verstehe ich nicht. Was bedeutet PK&FK? Und wieso vier Felder "zeichnen"?

Wenn ich normalisiere, habe ich zumindest mal die 10 Felder mit dem ID pro DS.
In der IP tabelle habe ich dann außer dem ID Feld noch vier Felder für die Blöcke.
Verstehe also nicht so ganz, wie ich hier was sparen kann?

Gruß
Klaus

daolix

Hallo
vergiss meinen Text von oben, hatte deinen eingangsthread
ZitatJetzt ist mir aber doch aufgefallen, dass ich pro DS ca. 10 IP Adressen speichern muss. Bei 4 Felder / IP sind mir das doch etwas viele Felder.
so gelesen als ob du die 10 ip's waagerecht in der Tabelle speicherst.
Wieso das dir jetzt zu viele Felder sind verstehe ich dann eigentlich nicht mehr.



Klaus S. aus B

Hallo Daolix,

jetzt in ich völlig verwirrt.

Also ich muss in einem Datensatz ca. 10 IP Adressen speichern. Wenn ich jetzt jede IP Adresse auf vier Blocks aufspalte, habe ich vierzig Felder in diesem DS nur für die IP's. Die anderen Felder, die zu einem DS gehören, kommen noch dazu. Dass ist mir etwas zuviel.

Ob ich jetzt 10 Textfelder mit je einer IP Adresse mit "." getrennt, oder eine ID, die auf eine Tabelle "tbl_IPs" verweist, habe ist erst mal gleich.

Ich verstehe aber nicht ganz wie ich in einem Formular auf mehrere DS aus der Tabelle tbl_Ips verlinken kann?

Vielleicht noch zum Hintergrund: die IPs sind z.B. die IP Adresse des Rechners, die Subnetmaske, der DNS Server,....
Die gehören alle in einen DS.

Gruß
Klaus

daolix

Ahso ich verstehe, verschiedenartige IP's. Hardcoredatenbänkler würden auch das in eine separaten Tabelle mit entsprechender Kennzeichnung auslagern. So in die Richtung:
Tabelle_Datensatz
ID_DS(Autowert) Primärkey
DieAnderenFelder...
...


Tabelle _DSIPs
ID_IP(Autowert) Primärkey
ID_DS(Zahl) foreignKey  --> Verweist auf den Datensatz der anderen Felder
LTyp(zahl) für RechnerIP, SubNet, DNS, ...
B1(byte)
B2(byte)
B3(byte)
B4(byte)



Wenn du jetzt aber unbedingt weiter waagerecht in nder Tabelle speichern willst:
Erstelle eine kleinen Hilstabelle mit vier feldern vom Type Byte.
Erstelle ein Formular(dein Popup) auf basis dieser Tabelle. Die Tabelle wird benötigt um richtige eingabe zu gewähleisten. Ansonsten verfährst du weiter wie von Wurliwurm beschrieben.

MzKlMu

Hallo,
im Grunde war die Antwort von DaoLix in #2 schon die richtige Antwort.
Du musst normalisieren.

Du benötigs hier 3 Tabellen:

- IPs (in 4 Feldern mit PS = 5 Felder)
- IPBedeutung (Rechners, Subnetmaske, DNS Server mit PS = 2 Felder)
- Zuordnung

In die Zuordnung kommen 2x Fremdschlüssel die jeweils auf die IP Tabelle verweisen sowie ein Fremdschlüssel zur IPBedeutung, weiterhin ein Feld das die IP Adresse kennzeichnet. (Z.B. Rechner XYZ, DNS Server X)
Gruß Klaus

Klaus S. aus B

Hallo Klaus und Daolix,

ok, datenbanktechnisch ist das sicher korrekter, wenn man das normalisiert. Ich will ja auch immer dazulernen, hänge aber einfach am "wie".

Im wesentlichen hänge ich an zwei Punkten:
1. das der Benutzer zu jeder IP adresse angeben, bzw. auswählen muss, um welche "Art" (z.B. DNS, Gateway, Subnet,...) es sich handelt, ist inakzeptabel. Zum einen ist die Fehlerquote, dass er eine Adresse vergisst viel zu hoch, zum anderen ist das zu benutzerunfreundlich.

  2. wie kann ich in einem Formular innerhalb eines DS auf mehrere DS in einer anderen Tabelle verweisen? Das Formular soll ja so ähnlich aussehen, wie im Anhang.

Die Idee von Wurliwurm in #1 fand ich schon ganz vielversprechend. Ich habe noch nicht geblickt, wie genau das geht, klingt aber schonmal sehr gut.

Gruß
Klaus

Wurliwurm

Ich finde die Idee, eine IP4-Adresse in vier Felder in einer Datenbank aufzuteilen, gelinde gesagt ziemlich daneben. Eine Analogie wäre, eine Postleitzahl in 5 Spalten aufzuteilen. Wie gesagt ist eine IP4-Adresse eine 32-Bit-Zahl (VB-Datentyp Long). Die Aufteilung mit den Punkten ist nur für das Auge. Sinnvoll ist die Lösung mit den 4 Feldern nur, wenn  man nicht programmieren will oder kann und deshalb so speichert wie es im Formular aussieht.

Du kannst jetzt natürlich 10 Adresse quer in einer Tabelle speichern, aber das ist dann und nur dann sinnvoll, wenn es immer genau 10 Adressen pro Zeile sind. Sonst hast Du immer leere Spalten (NULL-Werte) und bei 11 IP-Adressen mußt Du wieder das herumbasteln anfangen.

Es bietet sich IMHO die weiter oben von daolix beschriebene Tabellenstruktur an mit Kombination ID_DS, ID_Typ und davon abhängig die IP-Adresse. Das ist die sinnvollste Speicherungsform.

Wenn Du ein Formular haben willst, dessen Aussehen nicht von dieser Speicherungsform bestimmt wird (das wäre ein Haupt- und Unterformular), dann mußt Du einiges programmieren.

Mein Vorschlag mit dem Eingabeformular bezieht sich auf deine Idee, die Eingabe und Anzeige zu trennen. Zum Beispiel mit einem Popup-Formular, das sich bei Doppelklick auf eine IP-Adresse öffnet und dessen vier Eingabefelder eine Referenz auf jeweils 4 Felder des Popup-Formulars gesetzt bekommen.

daolix

ZitatIch finde die Idee, eine IP4-Adresse in vier Felder in einer Datenbank aufzuteilen, gelinde gesagt ziemlich daneben. Eine Analogie wäre, eine Postleitzahl in 5 Spalten aufzuteilen. Wie gesagt ist eine IP4-Adresse eine 32-Bit-Zahl (VB-Datentyp Long). Die Aufteilung mit den Punkten ist nur für das Auge.
Ich halte die Idee für ideal. Denn eben, du must hier keine Überprüfung der Eingabe programmieren.
Die Annalogie mit der PLZ passt nicht. Die Inhalt der Eingabe der Ziffen bei der plz ändern sich nicht, die Eingabe als Byte als resultierender 32Bit wert schon.
Die Aufteilung mit Punkten ist nicht nur fürs Auge, sondern auch aus kompatibilitätsgründen eindeutiger, denn die 32Bitzahl muss ja nicht vorzeichenbehaftet sein und ab IP 128.0.0.0 unterscheiden sich long und dword.

Wurliwurm

#11
Zitat von: daolix am März 24, 2015, 16:51:30
Ich halte die Idee für ideal. Denn eben, du must hier keine Überprüfung der Eingabe programmieren.

Jede 32Bit-Zahl ist (prinzipiell) eine korrekte IP4-Adresse. Genauso wie eine 32-Bit-Zahl negativ sein kann, kann es jeder der 4 8-Bit-Werte sein. Es muß also bei Deiner Lösung für jeden der 4 Werte sichergestellt sein, daß dieser nicht negativ ist.

Ich hab mal dazu gegoogelt, wie man das speichern soll und die Speichern als 32Bit-Zahl wird eindeutig favorisiert
z.B.:
http://www.sirmark.de/computer/mysql-ip-adressen-optimal-speichern-880.html

Wobei das jetzt nicht kriegsentscheidend ist, wie man das speichert :-)


Wurliwurm

Zitat von: Wurliwurm am März 24, 2015, 17:23:13
Es muß also bei Deiner Lösung für jeden der 4 Werte sichergestellt sein, daß dieser nicht negativ ist.

Das stimmt nicht. Der Datentyp "Byte" im Access läßt keine negativen Zahlen zu. Nehm ich zurück.

Klaus S. aus B

 ???

...da habe ich ja eine Diskussion losgetreten.  ;)
Vielleicht muss ich noch etwas mehr zum Zweck und der Verwendung sagen.

Es sind grundsätzlich immer gleich viele IP Adressen (um genau zu sein 13). Es kann zwar sein, dass die eine oder andere mal leer ist, aber das wird eher selten der Fall sein und die leeren Felder machen mir jetzt keine Probleme. Mehr werden es nie!
Bei variabler Anzahl hätte ich automatisch auf HaFo/UFo eingeschwenkt.
Es sind auch immer die gleichen "Typen" (also IP Adresse, Subnet, DNS, Proxy,...), eine manuelle Zuordnung zur Adresse ist also auch nur zusätzliche Arbeit ohne Nutzen.

Mit den Adressen wird "nicht gearbeitet", d.h. sie werden nicht exportiert und irgendwo eingelesen oder so. Ich brauch Sie nur zur Erstellung von Berichten; zur Dokumentation der ursprünglichen Konfiguration, bzw. zur Fehlersuche, wenn etwas mit der Verbindung hakt.
Da man die Werte im Zweifel "manuell / optisch" vergleichen muss, ist eine übersichtliche Darstellung mit Punkten extrem wichtig.
Und da man die Werte auch eintippen muss und nicht importieren kann, bin ich an einer möglichst komfortablen Lösung interessiert.

Gruß
klaus

daolix

@Wurliwurm
letzlich isses jehuppt wie jesprungen ob dword oder long, wenn man den 32BitWert einfach in seine Bytes (kein SByte) zerlegt und nicht berechnet.
@Klaus S. aus B
Anbei ein simples bsp eines Popup zur IP-Eingabe. Dieses Bsp speichert die IP als string