Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage in Code integrieren

Begonnen von mad, März 03, 2022, 14:49:55

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

habe zwei Codes von zwei Buttons zu einem zusammengeführt - funktioniert soweit.

Private Sub btnInvNeu_Click()
     If IsNull(Me!InventarNr) Then
     
            Me!InventarNr.Locked = False
            Me!InventarNr = Forms!frmKategorien!UFArten!UFTypen!TypID & "0001"
            Me!InventarNr.Locked = True
         
      Else
     
            Me!InventarNr.Locked = False
            DoCmd.GoToRecord , , acLast
             DoCmd.RunCommand acCmdSelectRecord
             DoCmd.RunCommand acCmdCopy
             DoCmd.RunCommand acCmdRecordsGoToNew
             DoCmd.RunCommand acCmdSelectRecord
             DoCmd.RunCommand acCmdPasteAppend
             'Me!InventarNr.Locked = False
             Me.InventarNr = Nz([InventarNr]) + 1
             Me!InventarNr.Locked = True
       End If
End Sub

Was macht der Code: jenachdem ob im Feld "InventarNr" im "UFArtikel" (ist ein UF von "UFTypen") eine InventarNr angezeigt wird oder nicht,
wird der entsprechende Teil (if...then...else...) des Codes angewendet.
Heißt, wenn keine InventarNr vorhanden, wird aus dem Feld "TypID" im "UFTypen"+0001 eine InventarNr (z.B. 2030140001) erstellt.
Wenn bereits eine InventarNr vorhanden ist (z.B. 2040150006) eine nächste +1 (z.B. 2040150007) erstellt.
Dies funktioniert aber nur solange ich als Datensatzquell die "tblArtikel" und "tblTypen" ungefiltert anwende.
Eine Zahlenkombination aus den ersten 6 Zahlen kann durchaus mehrfach vorkommen, eindeutig wird die InventarNr erst mit den letzten 4 Zahlen!


Nach Umstellung meiner DB auf verschiedene Abteilungen je nach Login funktioniert das leider so nicht mehr.
Denn wenn ich bei dem letzten Beispiel bleibe kann es sein das 4 der angelegten InventarNr der Abteilung x und die anderen 2 der Abteilung y und so weiter zugeordnet sein können.
Dann wird event. die InventarNr 2040150004 bei Abteilung x als letztes angezeigt obwohl es aber in wirklichkeit 6 InventarNr dazu gibt.
Dann würde im ersten Moment zwar eine neue InventarNr mit 2040150005 angelegt, kann aber nicht abgeschlossen werden da die DB erkennt das es diese InventarNr bereits gibt und jeder nur einmal vorkommen darf.
Das selbe wäre es wenn zwar für die Abteilung x keine InventarNr dieser Typen angezeigt wird aber doch bei anderen schon welche Vorhanden wären.

Nun hätte ich mir eine Abfrage (abfxxxx) vorbereitet, sh. Sql-Code:

SELECT IIf(Left([InventarNr],6)=[Artikel_TypID],[InventarNr]) AS InventarNrNEU
FROM tblArtikel
WHERE (((tblArtikel.Artikel_TypID)=[Forms]![UFTypen]![Artikel_TypID]));


die je nach dem welche "TypID" im "UFTypen" angezeigt wird, ALLE dazugehörigen "InventarNr", unabhängig von der Abteilungszuordnung, die es gibt anzeigt. Abfrage kann dann nätürlich wiederrum leer sein oder eine entsprechende Anzahl an InventarNr anzeigen.

Nun würde ich gerne die Abfrage (abfxxxx), so oder so ähnlich, in den obigen Code integrieren wollen, so daß InventarNr-Vergabe auf das Ergebnis der Abfrage "abfxxxx" zugreift und so hoffentlich meine InventarNr-Vergabe wieder funktioniert, entweder TypID+0001 wenn leer oder InventarNr+1 wenn bereits InventarNr vorhanden.

Wie müsste ich das anstellen?


Gruss
mad

Beaker s.a.

Hallo,
Atomare Inhalte gehören in getrennte Felder. Deren Eindeutigkeit
stellt man über einen Mehrfelderindex ein.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

mad

Hallo Ekkehard,

leider verstehe ich nicht was damit gemeint ist.

Ich habe es mal so versucht:
Erstmal ein ungebundenes Kombifeld in das UFArtikel eingefügt. Diesem Feld die Datensatzherkunft wie folgt zugeordnet:
SELECT IIf(Left([InventarNr],6)=[Artikel_TypID],[InventarNr]) AS InventarNrNEU
FROM tblArtikel
WHERE (((tblArtikel.Artikel_TypID)=[Forms]![frmKategorien]![UFArten]![UFTypen]![UFArtikel]![Artikel_TypID]));
Kann aber als Steuerelementeinhalt nicht "InventarNrNEU" auswählen.

Was ist den mit,
ZitatAtomare Inhalte gehören in getrennte Felder
und
Zitat...über einen Mehrfelderindex
gemeint?


Gruss
mad

mad

Hallo Zusammen,

habe nun auf mein ungebundenes Kombifeld "InventarNrNEU" als Datensatzherkunft meine Abfrage "abfInvNeu" angewendet. Die Abfrage habe ich umgeändert so das der Max-Wert angezeigt wird.

SELECT Max(IIf(Left([InventarNr],6)=[Artikel_TypID],[InventarNr])) AS InventarNrNEU
FROM tblArtikel
GROUP BY tblArtikel.Artikel_TypID
HAVING (((tblArtikel.Artikel_TypID)=[Forms]![frmKategorien]![UFArten]![UFTypen]![UFArtikel]![Artikel_TypID]));

Beim öffnen des Formulars ist allerdings das Kombifeld "InventarNrNEU" standartmäßig immer leer. Als Auswahlmöglichkeit wird mir der Max-Wert angezeigt.
Kann ich den Max-Wert beim öffnen der Formulars gleich anzeigen lassen? Es gibt ja sowieso nur den einen Wert.


Gruss
mad

MzKlMu

Hallo,
Zitat von: undefinedAtomare Inhalte gehören in getrennte Felder
Damit ist gemeint, dass die Bestandteile der Inventarnummer in getrennte Felder müssen. Für den Primärschlüssel nimmt man dann einen Autowert.
Zur Inventarnummer werden die beiden Felder erst in einer Abfrage wo man die TypID mit der LfdNr verkettet.
Damit ist das Hochzählen viel einfacher, weil die Inventarnr bereits getrennt vorliegt und nicht erst zerlegt werden muss. Das Hochzählen kann mann direkt bei dem Standardwert des Feldes für die LfdNr als Ausdruck einbauen. Dann braucht es noch nicht mal VBA.
In der Handhabung macht es sonst keinen Unterschied, dass die InvNr erst zusammengesetzt werden muss. Das geschieht in einer Abfrage und ist für den User nicht unterscheidbar.
Über die dann 2 Feder legt man einen zusammengesetzten eindeutigen Index (siehe Hilfe zu Index), sodass auch dann Duplikate ausgeschlossen sind wenn die Invnr aus 2 Feldern besteht.
Gruß Klaus

Beaker s.a.

Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

mad

Danke erstmal.
Das Hochzählen hat ja bisher funktioniert, solange ich die Inhalte nicht gefiltert habe.

Ich hätte jetzt auch eine Lösung, bräuchte aber noch einen Code so das der Max-Wert oder leer immer im Feld "InventarNrNEU" aktualisiert wird.

Habe diesen Code in einem Forum gefunden:
  With Me!DeinKombifeld
    If .ListCount > 0 Then
      .Value = .ItemData(.ListCount - 1)
    End If
  End With

Funktioniert aktuell wenn in der Abfrage "abfInvNEU" Feld "InventarNrNEU" ein Wert vorhanden ist.
Sobald ich weiterklicke und die Abfrage "abfInvNEU" Feld "InventarNrNEU" eigentlich leer ist, wird das Kombisfeld nicht mehr geleert.
Wie müsste der Code geändert werden so das wenn ich weiterklicke das Feld "InventarNrNEU" jenachdem ob in der Abfrage "abfInvNEU" Feld "InventarNrNEU" ein Wert vorhanden oder leer ist, immer angepaßt wird?


Gruss
mad

mad

Hallo Zusammen,

hab's nach langem ausprobieren geschafft.
Habe nun auf ein Listenfeld umgestellt, dort immer den letzten (Max) Wert anzeigen lassen und mit

Me!InventarNrNEU = Me!InventarNrNEU.ItemData(0)
diesen gleich ausgewählt/markiert.


Danke
mad