Hallo zusammen,
ich habe mich erst seit 2 Tagen mit Access 2010 beschäftigt und muss für die Arbeit eine kleine Datenbank erstellen wo man Bauteile suche kann und zugleich den Bestand ändern kann. Sprich Bauteilmenge entnehmen/ hinzufügen kann.
Das suchen von Bauteilen klappt wunderbar nur jetzt stoße ich auf meine Grenzen und komme nicht weiter, stehen voll auf den Schlauch. Wie setzt man das ganze am besten um , das entnehmen/hinzufügen von bestehen Bauteilen ? Sprich das Lager auffüllen wieder ?
Habe im Formular zwei Buttons hinzugefügt , wo jeweils ein kleines Formular aufgerufenwerden soll. Bauteil auswählen, Name angeben, Anzahl angeben , Warenausgabe oder ob es Wareneingang(auswahlfeld), Datum(automatisch )hinzugefügen. Wieviele Tabellen müssen min. erstellt werden , wie sollen die in Beziehung stehen ? usw. Blicke da nicht durch. Könnte einer /mehrere Aushelfen, wäre für jede Hilfe dankbar. Die Datei habe ich im Anhang hinzugefügt.
mfg
Hallo,
konvertiere die DB mal nach Access2003 (MDB) ich habe nur Access2003.
Du benötigst (mindestens) folgende Tabellen:
- Bauteile
- Personentabelle (für die Namen)
- Vorgangsarten (Wareneingang, Warenausgabe usw.)
- Vorgaenge (Fremdschlüssel zu Name, Bauteil, Vorgangsart)
In der letzten Tabelle werden die Warenbewegungen erfasst als jeweils ein Datensatz. Zugänge mit positiver Menge und Abgänge negativ.
Der Bestand ergibt sich dann einfach über eine Summierung der Menge gruppiert über das Bauteil.
Der Bestand wird nicht als Tabellenfeld geführt, der Bestand wird immer errechnet.
Ich habe dir eine PN geschickt mit der umgewandelten datei in Access 2003. Beim Konventieren wurde das Formular und die Abfrage nicht mit umgewandelt.
Hallo,
Du hast eine PN. Der Link in der PN funktioniert nicht.
Lade die DB (abgespeckt, komprimiert und gezippt) hier hoch. Ich helfe ohnehin nicht per PN, alles läuft über das Forum.
Im Anhang findest Du eine einfache DB zu einer Lagerhaltung.
habe die db nochmal hochgeladen
Hallo,
die zwei Tabellen reicht nicht. Du brauchst die in meiner 1. Antwort zitierten Tabellen. Zusätzlich zur Herstellertabelle. Das Feld Bestand in der Tabelle ist überflüssig und kann gelöscht werden.
Mein obiges Beispiel zeigt wie es gemacht wird. Das Beispiel deckt Deine Anforderung komplett ab. Wenn Du es nicht verstanden hast, frage nach.
PS:
287 Datensätze hätte es in einer Beispieldb nicht gebraucht. ;D
Habe den Bestand gelöscht ;D
Und habe die 3 weiteren Tabellen erstellt, ka o die richtig sind. Irgendwo muss ja trotzdem aufgelistet werden , wieviel ich hinzufüge und entnehme.
Hallo,
Zitatka o die richtig sind
natürlich sind die nicht richtig. Du kannst doch nicht einfach die Tabelle aus dem Beispiel in Deine DB übertragen und meinen dass das passt. Das musst Du anpassen. Du kannst auch nicht einfach Felder löschen, weil Du meinst diese werden nicht benötigt. Das Feld "Multiplikator" bei den Vorgansarten ist unerlässlich. Darüber wird automatisch das Vorzeichen für die Menge bestimmt. Auch das Feld für die Menge (tblVorgaenge) hast Du einfach gelöscht, wo willst Du denn die Menge erfassen ? Du musst auch Beziehungen anlegen. Wie die Beziehungen anzulegen sind, findest Du auch in meinem Beispiel.
ZitatIrgendwo muss ja trotzdem aufgelistet werden , wieviel ich hinzufüge und entnehme
Wird es doch in meinem Beispiel. Hast Du Dir das eigentlich schon mal richtig zu Gemüte geführt ? Ich fürchte nein, sonst hättest Du gesehen, dass Menge und Multiplikator absolut notwendig sind. In diesem Beispiel ist
alles enthalten was Du brauchst, Listen für Eingang und Ausgang, wer es war sowie die Bestände. Alles in dem einen Formular (das Hauptformular) in das ein Unterformular integriert ist. Du musst das nur auf Deine DB übertragen.
Irgendwie musst Du hier auch etwas mitdenken, Access muss man lernen.
Hallo,
na, habe ich Dich erschreckt und Du hast aufgegeben ?
Nene, habe mich damit beschäftigt ! ;D
Habe aber nur noch 2 Probleme, dann ist es rdy im Groben, nur ich komme nicht drauf wie ich es umsetzen kann.
Folgendes:
Im Formular "Suchen" habe ich im Detailbereich einen Button erstellt , der für jeden Datensatz einzeln zählen soll. Wenn man auf ihn klickt soll sich das "bearbeiten" Formular öffnen, soweit klappt es :)
Mit diesem Formular soll man dann neue Datensätze einfügen in der "Bewegungsdaten : Tabelle " einfügen, das klappt auch soweit. Jetzt kommt das NUR/ABER :P
Der soll sich aber automatisch die Typ-Nr. rauslesen(Anzeige im Texfeld , Ist die Kontrolle , das man den richtigen Datensatz ausgesucht hat) und sobald man auf Speichern klickt, soll die richtige "ID" vom ausgesuchten Datensatz abgespeichert werden. Habe nur feste Werte zur Zeit eingetragen , in VBA. Das selbe ist mit den Listen-feldern, die sollen die "ID" übertragen und nicht den ausgesuchten Namen/Vorgang(ebenfalls fest "Wert" einegtragen.
Private Sub cmdSpeichern_Click()
Dim rcsBewegungsdaten As Recordset
Set rcsBewegungsdaten = CurrentDb.OpenRecordset("Bewegungsdaten", dbOpenDynaset)
rcsBewegungsdaten.AddNew
rcsBewegungsdaten.Fields("Datenbank_ID").Value = 1
rcsBewegungsdaten.Fields("Vorgang_ID").Value = 1
rcsBewegungsdaten.Fields("Personen_ID").Value = 1
rcsBewegungsdaten.Fields("Menge").Value = Me.txtMenge
rcsBewegungsdaten.Update
MsgBox "Der aktuelle Bestand vom jeweiligen Bauteil wurde aktualisiert."
DoCmd.Close
End Sub
Hallo,
ich habe nur Access2003 (MDB) wie ich weiter oben schon geschrieben habe.
Aber vorbab, binde das Formular an die Tabelle, dann braucht es zum Speichern keinen Code. Und die richtigen Werte werden auch übernommen, automatisch.
Du programmierst Sachen, die man nicht braucht. ;D
hmm , dan muss ich wieder eine Abfrage machen und als Unterformular anzeigen lassen oder
Hallo,
ja, es wäre auch die richtige Lösung. Was gefällt Dir daran nicht ?
Ich habe auch etwas Zweifel, dass Du das richtig umgesetzt hast.
Die Meldung "Der aktuelle Bestand vom jeweiligen Bauteil wurde aktualisiert." irritiert mich. Es gibt ja keinen Bestand zur Aktualisierung.
Kannst Du nicht mal konvertieren ? Ich habe keine Möglichkeit ACCDB's anzusehen.
Hab doch nichts geschrieben , das ich etwas dagegen habe. :) Ich bin für jede Lösung Dankbar!
Kann es dir leider nicht geben , er meckert. Das bestimmte Funktionen in Access 2003 bestimmte Funktionen nicht unterstützt. :(
Die MsgBox ist schon ok , beim hinzufügen eines neuen Datensatzes bestimme ich den Neuen Bestand von jeweiligen Bauteil.
Hallo,
dann zeige mal ein Bild der Beziehungen, aber so, dass man alle Felder der Tabellen sieht. Und keine zu großen Abstände zwischen den Tabellen, aber so, dass die Wege der Beziehungslinien klar zu erkennen sind.
Für die MDB würde es ja genügen, eine leere MDB anzulegen und die Tabellen der ACCDB zu importieren.
Auf die MsgBox solltest Du verzichten, auf Dauer nervt es, etwas bestätigen zu müssen, was sowieso klar ist.
Hast Du berechnete Felder in den Tabellen angelegt ? Wenn ja, solltest Du diese ohnehin entfernen. Berechnet wird in Abfragen.
Habe dir das Formular und die Abfrage als Bild angehängt. Und die Berechnung findet selbstverständlich in der Abfrage ( Suchen) statt. :) hast du mir nahe gelegt 8)
Hallo,
im Anhang findest Du eine Beipiel, wie ich das machen würde.
Öffne einfach mal das Formular "frmErfassung". Da befindet sich leiks ein Listenfeld zum Suchen das auch mit dem Kombi oben gefiltert werden kann. rechst siehst Du dann den Datensatz des Bauteils. Im Formular befindet sich auch ein Register mit 3 Seiten. Auf der 3.Seite siehst Du alle Vorgänge, dort kann nichts geändert werden. Je nach Vorgang wird WE bzw. WA gewählt, der entsprechende Vorgangschlüssel ist automatisch vorbelegt. Der Bestand rechts oben wird sofort aktualisiert.
Im Beziehungsfenster ist immer referentielle Integrität einzustellen. ID sollten auch nicht einfach ID genannt werden, Du verlierst sonst den Überblick, welche ID denn gemeint ist. Siehe auch mein Beispiel.
Das Beispiel ist weitgehend getestet, was aber nicht heißt, dass es fehlerfrei ist. Einfach mal rum probieren.
Zitat von: MzKlMu am September 19, 2015, 19:59:21
Im Beziehungsfenster ist immer referentielle Integrität einzustellen. ID sollten auch nicht einfach ID genannt werden, Du verlierst sonst den Überblick, welche ID denn gemeint ist. Siehe auch mein Beispiel.
Genau das habe ich immer gesucht und nie gefunden, geschweige wie das heisst :)= Nochmals danke !
Extrem gut, dann werde ich das gute Stück mal testen.
Möchte mich nochmal bei dir bedanken MzKlMu, das du mir geholfen hast.
Ich habe mich seitdem beschäftigt, vorallem mit dem filter. Ich habe zusätzlich noch 2 Suchfelder hinzugefügt und versucht diese ebenfalslls einzubinden in der Suche. Aber versagt bis jetzt nur. Könntest du mir Tipps geben wie ich das einbinden könnte , geschweige mit dem Suchfeld Typ-Nummer.
mfg Shayol
Hallo,
das mit der Art ist falsch. Die Art ist ja vom Hersteller abhängig, S7 macht ja nur Siemens. Es muss also bei der Art einen Fremdschlüssel zum Hersteller geben. In die Tabelle mit den Bauteilen kommt dann nur ein Fremdschlüssel zur Art. Der Fremdschlüssel "ID_Hersteller_F" entfällt, da die Art auch zweifelsfrei den Hersteller bestimmt. Oder kann eine Art auch mehrere Hersteller betreffen?
S7, S5 gibt es ja nur von Siemens, wie sieht das bei anderen Bauteilen aus ?
Nach Art zu filtern ist OK, aber wieso willst Du nach Typ filtern, es gibt bei den Typen ja auch keine Duplikate, wieso willst Du dann filtern?
Erst muss das geklärt sein, bevor wir weiter machen.
Eine Art kann auch mehrere Hersteller betreffen. Die sind nur noch nicht in der Db aufgelistet von mir, die DB wird später gefüllt , das werden extrem viele werden. Hab sie noh nicht eingetragen.
Beispiel:
Siemens -> S7
Viper -> S7
.... -> S7
Da die Liste noch länger wird würde es sich anbieten ebenfalls nach Typen zufiltern oder nur nach Typen filtern zulassen. Flexible solte der Filtern sein.
Hallo,
auf Grund der Tatsache, dass eine Art mehrere Hersteller haben kann, muss das Datenmodell geändert werden. Es wird eine Zwischentabelle zur Zuordnung der Art zum Hersteller notwendig.
Dadurch ändert sich auch der Filter bzw. dessen Zusammensetzung. Das dauert jetzt aber etwas.
https://www.youtube.com/watch?v=xq6pzJZqfRo (https://www.youtube.com/watch?v=xq6pzJZqfRo)
Habe bei Youtube das Video gefunden , bezüglich dem suchen/filtern. Sehr flexible das ganze und beliebig erweiterbar. Falls dich das Interessiert.
Gruß Patrick
Hallo,
da gibt es natürlich einiges zu meckern.
Auf das Video bezogen:
Suchen erfolgen immer über die ID (den Primärschlüssel) und nicht über den Klartext. Suchen über Zahlen geht schneller, bei vielen Datensätzen merkbar, außerdem ist ein Schlüsselfeld indiziert was für eine Suche unerlässlich ist..
Der Joker (*) bei der Suche über das Kombi ist Unsinn, es kann ja über das Kombi nur der vollständige Text übergeben werden, also macht der Joker hier keinen Sinn. Beim Textfeld ist das OK.
Von Parameterabfragen in der Form wird immer abgeraten, außerdem sind die Parameter nicht definiert.
Ich würde das Video auf keinen Fall verwenden ich halte das für nicht professionell.
Gut zu wissen , werde mir das merken .
Wollte dir nur das Video zeigen wie ich das meinte von d er Funktion her , bezüglich dem "suchen von Bauteilen" in meinem Fall. Manchmal drücke ich mich falsch aus , das wollte ich verhindern dadurch. ;D
Zitat von: MzKlMu am September 23, 2015, 20:14:26
Ich würde das Video auf keinen Fall verwenden ich halte das für nicht professionell.
Sorry, aber ich würde das so nicht stehen lassen wollen.
Nicht alles was nicht "professionell" ist, ist automatisch schlecht oder gar falsch.
Man kann das durchaus so machen (wie man sieht), aber natürlich kann man es auch "besser" machen. ;-)
Hallo,
die folgende Abfrage kannst du als Datensatzherkunft für das Listenfeld und als Datenquelle für das Formular einsetzen:
SELECT Bauteile.ID_Bauteil, Hersteller.Hersteller, Art.Art, Bauteile.Typ_Nummer, Bauteile.Beschreibung, Bauteile.ID_Hersteller_F,
Art.ID_Art, Bauteile.Schrank, Bauteile.Fach, Bauteile.Ebene, Bauteile.Reihe, Lager.Lager, Lager.Pfeiler, Lager.LagerOrtBeschreibung
FROM Lager INNER JOIN (Art INNER JOIN (Hersteller INNER JOIN Bauteile ON Hersteller.ID_Hersteller=Bauteile.ID_Hersteller_F)
ON Art.ID_Art=Bauteile.ID_Art_F) ON Lager.ID_Lager=Bauteile.ID_Lager_F
WHERE (
((Bauteile.Typ_Nummer) Like Forms!frmErfassung!txtTypNummer & "*") And
((Bauteile.ID_Hersteller_F)=Forms!frmErfassung!cboHersteller Or Forms!frmErfassung!cboHersteller Is Null) And
((Art.ID_Art)=Forms!frmErfassung!cboArt Or Forms!frmErfassung!cboArt Is Null)
)
ORDER BY Hersteller.Hersteller, Art.Art, Bauteile.Typ_Nummer, Bauteile.Beschreibung;
Und dies wäre der VBA-Code für das Hauptformular:
Private Sub Form_Open(Cancel As Integer)
DoCmd.Maximize
End Sub
Private Sub Form_Current()
Me.lstBauteilsuche = Me.ID_Bauteil
End Sub
Private Sub lstBauteilsuche_AfterUpdate()
Me.Recordset.FindFirst "[ID_Bauteil] = " & Me.lstBauteilsuche
End Sub
Private Sub cboHersteller_AfterUpdate()
frm_Requery
End Sub
Private Sub cboArt_AfterUpdate()
frm_Requery
End Sub
Private Sub txtTypNummer_AfterUpdate()
frm_Requery
End Sub
Sub frm_Requery()
Me.lstBauteilsuche.Requery
If Me.lstBauteilsuche.ListCount = 0 Then
MsgBox "Suchwerte nicht gefunden, der Filter wird zurückgesetzt."
btnFilterLoeschen_Click
Else
Me.Requery
End If
End Sub
Private Sub btnFilterLoeschen_Click()
Me.cboHersteller = Null
Me.cboArt = Null
Me.txtTypNummer = Null
Me.Requery
Me.lstBauteilsuche.Requery
End Sub
Beachte, dass ich das Textfeld umbenannt habe und achte darauf, dass alle benötigten Ereigniseigenschaften auf "Ereignisprozedur" eingestellt werden.
Die Datenauswahl wird also ebenso wie im Video allein über die Abfrage gesteuert, das Formular selbst wird nicht gefiltert.
Ich hoffe, das hilft dir weiter.
Hallo,
wie ich in #21 schon geschrieben habe, muss das Datenmodell geändert werden. Daher werden die Filter so nicht mehr funktionieren, denn die Zusammenhänge haben sich geändert. Die ID_Art_F gibt es in der Tabelle nicht mehr, ebenso die ID_Hersteller_F.
Ich bin nur noch nicht dazugekommen, das einzubauen, wie ich es gesagt habe.
Wird über das Wochenende aber klappen.
Hallo Klaus,
und ich dachte schon, du wärst nicht mehr dabei.
Hallo,
so, da bin ich wieder. Hat etwas länger gedauert.
Das Datenmodell wurde geändert. Es gibt jetzt eine Tabelle zur Zuordnung der Hersteller zur Art. Deren Primärschlüssel wird jetzt als Fremdschlüssel in die Bauteiltabelle übernommen.
Dieser Schlüssel ist die eindeutige Kombination aus Hersteller und Art.
Dazu ist ein weiteres Formular notwendig (frmArtHerstellerZuordnung) das diese Zuordnung macht.
Im Hafo Erfassung kannst Du jetzt einen Hersteller vorauswählen und erhältst für die Art nur den vorgewählten entsprechenden Hersteller.
Ich habe die Bauteiltabelle mal gekürzt, damit Du direkt siehst, wenn im Hafo eine andere Art gewählt wird. Vorher muss ein Hersteller gewählt werden.
DB anbei.