Seite 1 von 2
(gelöst) Aufträgen chaotische Ablageorte zuordnen
Verfasst: Di 7. Jul 2015, 16:55
von Freischreiber
Hallo,
mir fehlt noch eine spezielle Funktion in meiner Datenbank, und ich dachte, 34 °C sind ideal für Datenbankprobleme
Ich möchte meinen Aufträgen Ablageorte für die sogenannte "chaotische Ablage" zuweisen können, also Buchstabenkürzel, die genau einen Ablageort bezeichnen und die irgendwann beim Auftrag wieder gelöscht werden (nämlich dann, wenn die dort gelagerten Gegenstände zurückgegeben oder weggeworfen werden und so der Ablageort wieder frei wird). Der Normalzustand ist ein Auftrag ohne Ablageort, es gibt viel mehr Aufträge als Ablageorte.
Solange ein Ablageort einem Auftrag zugeordnet ist, soll er für andere Aufträge blockiert/vergeben sein.
Andererseits soll es möglich sein, einem Auftrag mehrere chaotische Orte zuzuordnen, wenn mehrere Gegenstände untergebracht werden müssen.
Die Auftragstabelle hat einen Primärschlüssel AuftragsID. Es gibt eine endliche Anzahl von Ablageorten mit festen Bezeichnungen, zb schrank1, schrank2, ... die im Moment einfach in einer Tabelle t-ablageorte untereinander stehen.
Wie stellt man das an?
Gruß
Freischreiber
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Di 7. Jul 2015, 18:20
von RobertG
Hallo Freischreiber,
Du könntest die Aufträge doch direkt in der Tabelle speichern, die für die Ablageorte gedacht ist. "t-ablageorte" hat dann ein Feld "AuftragsID". So kannst Du nur einen Auftrag einem Ablageort zuordnen.
Gruß
Robert
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Di 7. Jul 2015, 19:41
von Freischreiber
Hallo Robert,
stimmt! 1 Auftrag : n Ablageorte... danke!
Jetzt habe ich versucht, im Auftragsformular eine Tabelle für die Auswahl von Ablageorten aufzuziehen:
- Subformular Ablageorte, Daten - Art des Inhalts: t-ablageorte, Verknüpfen von AuftragID zu AuftragID.
- Spalte Ablageort ersetzen durch Listenfeld
Und jetzt dachte ich, man könnte einfach als Art des Listeninhalts die Tabelle t-ablageorte angeben, gebundenes Feld 1.
Aber das scheint nicht zu gehen, obwohl die Tabelle richtig aufgebaut ist, Spalte 1 Ablageort, Spalte 2 AuftragsID.
Geht das wirklich nur mit einer Abfrage?
Gruß
Freischreiber

Sehe gerade, es geht auch mit einer Abfrage so nicht... die hinterlegten Ablageorte stehen zwar zur Wahl, aber man kann keinen speichern. Irgendwas stimmt da noch nicht.
Es kommt die Fehlermeldung: SQL-Status: HY010 Fehler in der Funktionsfolge.
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Di 7. Jul 2015, 20:52
von RobertG
Hallo Freischreiber,
den Ablageorten werden die Aufträge zugeordnet - nicht umgekehrt.
Dein Formular basiert also auf den Ablageorten. Die Aufträge kannst Du aus einem Listenfeld aussuchen. Das kann dann ruhig eine zusammengesetzte Abfrage sein, damit Du genug erkennen kannst.
Welche verschiedenen Ablageorte ein Auftrag hat, das könntest Du anschließend in einem Unterformular über eine Abfrage sehen.
Willst Du das Ganze anders gestalten, so kommst Du um eine Verbindungstabelle nicht herum. In dieser Verbindungstabelle ist dann zwangsläufig der Ablageort der Primärschlüssel. Dann wird dem Unterformular der Schlüsselwert aus dem Hauptformular für den Auftrag mitgegeben und Du wählst unterschiedliche Ablageorte in einem Listenfeld (innerhalb eines Tabellenkontrollfeldes) aus. Das besondere Problem ist hier allerdings, dass Du vermutlich häufig Fehlermeldungen der Datenbank bekommst, weil Du einen Ablageort aussuchen willst, der leider schon belegt ist.
Gruß
Robert
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Mi 8. Jul 2015, 07:45
von Freischreiber
Hallo Robert,
bei Lösung 1:
Welche verschiedenen Ablageorte ein Auftrag hat, das könntest Du anschließend in einem Unterformular über eine Abfrage sehen.
Heißt das: anlegen kann man die Verbindung nur von den Ablageorten aus? Oder wäre so eine Abfrage editierbar, so daß man vom Auftragsformular aus einen freien Ort suchen könnte?
Alternativ:
Gibt es eine einfachere Lösung, wenn man pro Auftrag nur einen Ablageort erlaubt? Eine 1:1-Beziehung? Das war mein erster Versuch, hab ich aber auch nicht hingekriegt.
Gruß
Freischreiber
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Mi 8. Jul 2015, 09:19
von RobertG
Hallo Freischreiber,
ich hänge einmal die einfachen Lösungen an. Die Tabellen sind unter Extras → Beziehungen nicht verknüpft, da unterschiedliche Ansätze gewählt wurden.
Das Ganze ist ähnlich dem, was im Handbuch mit der Mediendatenbank erstellt werden muss. Das Problem dort: Es kann kein Buch doppelt ausgeliehen werden. Trotzdem wird die Lesernummer nicht bei den Büchern gespeichert sondern dem Leser Bücher zugeordnet. Die Regelung, welche Bücher denn vorhanden sind, erfolgt schließlich bei der Ausgabe. Die Ausgabe geht einfach nicht weiter, wenn das Buch nach Datenbank nicht zur Ausleihe zur Verfügung steht (weil es z.B. noch entliehen ist).
Gruß
Robert
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Mi 8. Jul 2015, 16:45
von Freischreiber
Hallo Robert,
das funktioniert! Was mich nur sehr irritiert ist, daß anscheinend keine Beziehungen nötig sind. Solange man nur das Formular verwendet, stellt das Listenfeld sicher, daß man nur existierende Ablageorte auswählt.
Würden Beziehungen denn schaden?
Und: Kann die Listenfeldabfrage so verändert werden, daß nur solche Ablageorte noch zur Auswahl stehen, für die es noch keinen zugeordneten Auftrag gibt, also leere?
Gruß
Freischreiber
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Mi 8. Jul 2015, 19:56
von RobertG
Hallo Freischreiber,
die Beziehungen habe ich deshalb nicht definiert, da die beiden Formulare auf unterschiedliche Beziehungen aufbauen. Wenn Du Dich dafür entscheidest, mit 3 Tabellen zu arbeiten, dann solltest Du die Beziehungen auch entsprechend über die Datenbank absichern.
Es ist ja ohne weiteres möglich, Beziehungen zwischen Tabellen zu nutzen ohne so etwas in einer Datenbank über Relationen zu hinterlegen. In MySQL habe ich anfangs nie Relationen hinterlegen können, weil der Tabellentyp das gar nicht zuließ, den ich nutzte...
Du kannst die Listenfeldabfrage natürlich anpassen, so dass nur die Auswahlen möglich sind, die auch noch frei sind. Das ist allerdings nicht so einfach:
Du hast einen Auftrag und mehrere Ablageorte ausgewählt. Das Listenfeld ist so definiert, dass nur die Ablageorte erscheinen, die noch nicht gewählt sind:
Code: Alles auswählen
SELECT "Ablage", "ID" FROM "Ablage" WHERE "ID" NOT IN (SELECT "Ablage_ID" FROM "Ablage_Auftrag")
Wenn Du anschließend das Formular neu aufrufst wird auch das Listenfeld aktualisiert. Du siehst jetzt ----- keine Ablageorte mehr, da die im Listenfeld ja nicht vorgesehen sind.
Ich habe so etwas jetzt einmal mit Hilfe eines Tabellenkontrollfeldes und eines danebenliegenden Listenfeldes erstellt. Das Listenfeld müsste nach jedem neuen Speichervorgang aktualisiert werden - geht nur über ein angehängtes Makro.
Wenn Du das neue Formular öffnest, dann siehst Du die bisherigen Einträge im Tabellenkontrollfeld, nicht aber im Listenfeld.
Gruß
Robert
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Fr 10. Jul 2015, 10:00
von Freischreiber
Hallo Robert,
ich habe bei deinen beiden Beispieldateien echte Probleme mit dem Öffnen von Formularen. Es gibt beim Formularstart mehrere Programmabstürze mit Wiederherstellung, bis ein Formular dann aufgeht. Ist an den Dateien etwas besonderes?
Das geänderte Formular in der neuen Datei sieht sehr gut aus, es gibt aber irgendwann eine ID-Fehlermeldung.
Hängt das mit dem benötigten Makro zusammen?
Das Makro müßte nur das Listenfeld-Formular aktualisieren?
Gruß
Freischreiber
Re: Aufträgen chaotische Ablageorte zuordnen
Verfasst: Fr 10. Jul 2015, 16:12
von RobertG
Hallo Freischreiber,
Abstürze kann ich nicht nachvollziehen. Allerdings habe ich auch keine externe HSQLDB-Datenbank angeschlossen. Das kann wohl zu Problemen mit internen Datenbanken führen.
Das einfachste Makro für die Listbox im Unterformular wäre:
Code: Alles auswählen
SUB ListeninhaltAktualisieren(oEvent AS OBJECT)
oFeld = oEvent.Source.getByName("ListBox")
oFeld.refresh()
END SUB
Wird an "Nach der Datensatzaktion" des Formulars gebunden.
Das ist aber noch nicht ideal, da eigentlich schon der Abspeichervorgang und das Weitergehen zum nächsten Datensatz direkt von dem Listfeld ausgelöst werden müssten.
Nachtrag: ich habe das jetzt einmal zusammen mit einer Abspeicherung in das Formular eingebaut. Bei mir ohne jegliche Probleme.
Gruß
Robert