PDA

Vollständige Version anzeigen : Nummerieren in Access ganz anders


Die Vollidioten
26.09.2005, 07:31
Hallo Experten!
Ich habe da ein Problem das ich einfach nicht gelöst bekomme:
Ich habe in einer Abfrage folgende Ergebnisse:

MATNR___ERFMG___LaufNr
740________20_______1
466_________1_______2
088______3000_______3
099______5000_______4
311_______200_______5
982________12_______6
982________12_______6
273________50_______8
273________50_______8
273________50_______8
386_______194______11

Die LaufNummer habe ich nach einer Formel aus: Don Karl unter 3.11
erzeugt. Dies ist aber gerade nicht das was ich brauche.
Die Nummerierung soll nur bei gleichen Datensätzen durchgeführt werden und nicht generell. So das meine Abfrage folgendermaßen aussehen soll:

MATNR___ERFMG___LaufNr
740________20_______1
466_________1_______1
088______3000_______1
099______5000_______1
311_______200_______1
982________12_______1
982________12_______2
273________50_______1
273________50_______2
273________50_______3
386_______194_______1

Wer eine Lösung hat, darf sich mächtig was gutschreiben.

J_Eilers
26.09.2005, 07:37
Hi,

wie sieht denn dein bisheriger SQL-Code aus? Das könnte man wohl mit einer Unterabfrage machen, die die ERFMG mit dem vorherigen Wert vergleicht und dann die Anzahl zurückgibt.

Die Vollidioten
26.09.2005, 10:12
Hallo J_Eilers!

Ich habe in der Abfrage die Spalte LaufNr mit folgendem Code:
LaufNr: (Select Count (*) FROM [Budatneu] as Temp WHERE [Temp].[MATNR] < [Budatneu].[MATNR])+1

"Budatneu" ist die Tabelle aus der ich die Daten ziehe.

Gruß Herbert

J_Eilers
26.09.2005, 10:15
Ich meinte eigentlich die ganze Abfragesyntax (http://home.arcor.de/ar/arne.d/datenbanken/grundlagen/abfragen/index.html#SEC2). Damit kann man meist mehr sehen als in der Entwurfsansicht ;)

Smaug
26.09.2005, 10:43
wäre dies eine Möglichkeit ?
SELECT MatNr, ERFMG, Count (Autowertfeld) AS Laufnummer
FROM DeineTabelle
GROUP BY MatNr, ERFMG;
wenn es noch ein zusätzliches Datumsfeld gibt könnte man das evtl. noch als Sortierfeld aufnehmen.

Die Vollidioten
27.09.2005, 05:43
Hallo Jan!
Ich bin leider nicht so fit in SQL-Fragen, ich habe folgendes gefunden:

SELECT Budatneu.MATNR, Budatneu.BUDAT, Budatneu.CPUTM, Budatneu.BWART, Budatneu.ERFMG, (Select Count (*) FROM [Budatneu] as Temp WHERE [Temp].[MATNR] < [Budatneu].[MATNR])+1 AS LaufNummer
FROM Budatneu
ORDER BY Budatneu.MATNR;

Die Vollidioten
27.09.2005, 05:46
Hallo Smaug !
Ich komme noch nicht zurecht, nach einer Parameterabfrage bekomme ich nur lauter Nullen.

Gruß Herbert

Smaug
27.09.2005, 06:28
äh wieso Parameterabfrage ? Welcher Parameter wird abgefragt ?

J_Eilers
27.09.2005, 07:43
Und so:

SELECT
Budatneu.MATNR,
Budatneu.BUDAT,
Budatneu.CPUTM,
Budatneu.BWART,
Budatneu.ERFMG,
(SELECT Count(*) FROM Budatneu As Q
WHERE Q.MATNR = Budatneu.MATNR AND Q.BUDAT < Budatneu.BUDAT)+1 As NeueNummer
(Select Count (*) FROM Budatneu as Q WHERE Q.MATNR < Budatneu.MATNR)+1 AS LaufNummer
FROM
Budatneu
ORDER BY
Budatneu.MATNR;

Die Vollidioten
27.09.2005, 11:50
Hallo Jan!
Erstmal sorry, das ich immer in Zeitabständen antworte, aber ich habe in der Montagehalle mächtig Stress.
Ich habe die SQL-Anweisung wie oben gegen die "Alte" ausgetauscht und dann öffnet sich ein Fenster: "Datenquelle auswählen" ??
In der Beschreibung steht, ich soll die Datenquelle auswählen, die den Treiber beschreibt, mit dem eine Verbindung hergestellt werden soll?
Jetzt bin ich wirklich am Ende....
Gruß Herbert

J_Eilers
27.09.2005, 12:12
Das ist ziemlich komisch und ich denke, die Fehlermeldung kommt, wegen einem Fehler, den ich gemacht habe. Versuche es mal mit diesem Code:

SELECT
Budatneu.MATNR,
Budatneu.BUDAT,
Budatneu.CPUTM,
Budatneu.BWART,
Budatneu.ERFMG,
(SELECT Count(*) FROM Budatneu As Q
WHERE Q.MATNR = Budatneu.MATNR AND Q.BUDAT < Budatneu.BUDAT)+1 As NeueNummer,
(Select Count (*) FROM Budatneu as Q WHERE Q.MATNR < Budatneu.MATNR)+1 AS LaufNummer
FROM
Budatneu
ORDER BY
Budatneu.MATNR;

Nouba
27.09.2005, 12:16
Ich habe keine Ahnung, wozu die Abfrage eingesetzt wird - für einen Bericht gäbe es jedoch einfachere Lösungen.

cryson
27.09.2005, 12:24
Hi Herbert

ich weiss nicht ob du dein Problem jetzt schon gelöst hast und ich weiss ehrlich gesagt auch keine Lösung dazu. Allerdings brauche ich genau dass was du hast nämlich eine ganz normale laufende Nummer. Ich habe auch den Code so eingebaut wie du das als erstes hattest weil ich mir gleiche Ergebnisse erhoffte allerdings fängt er nicht bei 1 an und lässt zwischendurch auch mal ne ganze Menge Nummern aus. Ich brauche aber unbedingt eine bei 1 beginnende fortlaufende Nummer in der Abfrage und weiss net wie?

Bin ebenso verzweifelter und nicht sehr gewandter SQL-User..
Vielleicht kann mir irgendwer ja nen Beispiel code geben

PS.: Wusste net ob ich nen neuen Thread aufmachen sollte da die Themen ja eigentlich sehr eng bei einander liegen ^^

Viel Grüße
Falk

Smaug
27.09.2005, 12:28
laufende Nummern in Abfragen scheinen z.Zt. sehr gefragt zu sein. :D Für alle die sich mit der Forumsuche nicht zurechtfinden sei hier nochmal auf Donkarl (Link in meiner Fusszeile - bzw. wie in vielen anderen Fusszeilen auch) verwiesen: FAQ 3.11

cryson
27.09.2005, 12:40
jop thx habe ja was gelesen von don karl 3.11 aber net gewusst wo ich den guten Karl finde ;)

werd mich da jetzt mal reinlesen :)

Gruß Falk

WMS
27.09.2005, 13:04
... wie wäre es denn mit dieser kleinen Funktion: :p

Public Function Lfd_Nr(T_Datei As String)
Dim db As DAO.Database, DS As DAO.Recordset, lfd As Integer
Dim MatNr_alt As Long

Set db = DBEngine.Workspaces(0).Databases(0)
Set DS = db.OpenRecordset(T_Datei, DB_OPEN_TABLE)
lfd = 1

DS.Index = "PRIMARYKEY" 'muss für jede Tabelle entsprechend eingestellt werden
DS.MoveFirst
Do While Not DS.EOF
DS.Edit
If DS!MatNr <> MatNr_alt Then
lfd = 1
Else
lfd = lfd + 1
End If
DS!lfdNr = lfd
DS.Update
DS.MoveNext
Loop
DS.Close
Set db = Nothing
Set DS = Nothing
End Function

Die Vollidioten
28.09.2005, 07:09
Hallo allerseits!
Mein Problem ist scheinbar wirklich gerade aktuell.
Das waren jetzt ein paar Fragen auf einmal.
Aber erstmal danke an alle Helfer.

An Falk!
Ich habe das Problem auch mit der Formel gehabt. Du hast bestimmt als Grundlage für Deine Abfrage eine Abfrage und keine Tabelle. Ich glaube Access nummeriert die Daten auch, die in der Abfrage vorher gefiltert wurden. So entstehen Lücken in der Zahlenreihe.

Hallo Nouba!
Warum ich die Abfrage brauche hat einen sehr komplizierten Hintergrund. Vielleicht gibt es ja einen anderen Weg, wie man an das gewünschte Ergebnis kommt. Ich habe halt versucht im Forum keine Romane zu schreiben, sondern das Problem versucht einzugrenzen.
Ich versuche Kennzahlen (Durchlaufzeit)für die Wareneingangskontrolle zu erarbeiten. Dazu habe ich aus SAP heraus nur sehr schlecht verwendbares Datenmaterial. Zur Verdeutlichung ein Beispiel: Nehmen wir an im Wareneingang wird eine Schachtel Schrauben angeliefert, geprüft und dann eingelagert. SAP stellt mir nun die Daten nur in einer Tabelle zur Verfügung. Das heißt ich habe das Datum des Wareneingangs und des Lagerzugangs in einer Liste. Z.B. so:

Nummer(MATNR)_____Datum(Budat)___Uhrzeit(CPUTM)____Menge(ERFMG)
988________________12.09.05________9:15_______________5
988________________14.09.05________14:20______________5

Die Kennzahlen werden wöchentlich aktualisiert. Der Zeitraum beträgt natürlich teilweise mehrere Wochen, da die Schrauben ja nicht unbedingt in der selben Woche angeliefert und eingelagert werden. Über eine Materialbelegnummmer die ich zusätzlich zur Verfügung habe kann ich nun zwar Anlieferung und Einlagerung trennen. (In 2 verschiedenen Abfragen) Im zweiten Schritt verknüpfe ich die beiden Abfragen wieder miteinander. Doch das geht nur solange gut, solange ich nur eine Lieferung an Schrauben habe.
Habe ich im Abfragezeitraum 2 oder mehrere Lieferungen also z.B.:
Nummer(MATNR)_____Datum(Budat)___Uhrzeit(CPUTM)____Menge(ERFMG)
988________________12.09.05________9:15_______________5 (Eingang)
988________________14.09.05________14:20______________5 (Lagerzugang)
988________________13.09.05________13:10______________5 (Eingang)
988________________15.09.05________17:54______________5 (Lagerzugang)

Access vergleicht in der Abfrage alle möglichen Varianten. So das ich dann 4 Ergebnisse habe. Zum Eingang am 12.09. gibt es den Zugang am 14.09. und am 15.09. und zum Eingang am 13.09. auch den Lagerzugang am 14.09. und 15.09.

Jetzt war meine Überlegung in den beiden Abfragen für die Anlieferung bzw. dem Lagerzugang die Teile durchzunummerieren. Ich hätte dann in einer nächsten Abfrage die Sachnummer, die Menge und jetzt auch die laufende Nummer 1:1 miteinander verknüpft und so eine eindeutige Zuordnung erreicht.

Puh, wahrscheinlich habe ich euch alle jetzt totgequatscht.
Sorry.

Die Vollidioten
28.09.2005, 07:42
Hallo Jan!
Ich erhalte nun ein Ergebnis. Es ist leider nicht das gewünschte.
Ich habe die Abfrage als Exceldatei mitgeliefert.
Nochmals Danke.
Euer Einsatz ist spitze.

Herbert
P.S.: Insider wissen, dass Kennzahlen im Wareneingang fast nicht machbar sind. Mit Euch werde ichs aber packen.
Morgen geht unsere Firma aufs Oktoberfest, da trinke ich einen Schluck auf Euch!!

J_Eilers
28.09.2005, 11:32
Das liegt dann wohl am Datum. Entweder erweiterst du dann den Code um die Uhrzeit oder du verwendest ein DCount()(-Ersatz) im Steuerelementinhalt eines Berichts. Bei dem langen Text steige ich leider nicht ganz durch. :confused: Was spricht denn da gegen einen "Autowert" oder einen zusammengesetzten Index?

Nouba
28.09.2005, 11:41
Mir geht es ähnlich wie Jan. Woher soll die erste Einlagerung wissen, ob der 9:15 oder der 13:10 Eingang betroffen ist? Hast Du den importierten Excel-Daten ein Autowertfeld spendiert?

Die Vollidioten
28.10.2005, 11:36
Hallo Leute!
Sorry erstmal, dass ich erst jetzt wieder was von mir hören lasse, aber ich war bis vor kurzem im Krankenstand (Bänderriss). In meinem Problem bin ich jetzt tatsächlich zu einer Lösung gekommen. Anbei der Code:

Public Function Lfd_Nr1()
Dim db As DAO.Database, DS As DAO.Recordset, lfd As Integer, lfd_neu As Integer
Dim MatNr_alt As String
Dim Erfmg_alt As Long

Set db = DBEngine.Workspaces(0).Databases(0)
Set DS = db.OpenRecordset("Budatneu3", DB_OPEN_TABLE)
lfd = 1

DS.MoveFirst
Do While Not DS.EOF
DS.Edit
If DS!MatNr <> MatNr_alt Then
lfd = 1
Else
If DS!Erfmg <> Erfmg_alt Then
lfd = 1
Else
lfd = lfd + 1
End If

End If
DS!lfdNr = lfd
MatNr_alt = DS!MatNr
Erfmg_alt = DS!Erfmg
DS.Update
DS.MoveNext
Loop
DS.Close
Set db = Nothing
Set DS = Nothing
End Function

Der Lösungsansatz von WMF hat mich auf die richtige Fährte geführt.
Also Mercy Euch allen.

Herbert

Roland04
28.10.2005, 12:46
hhmmm - wenn ich das verstanden habe was du meinst (???) könnte im ersten schritt eiene tabellenerstellungsabfrage gefragt sein um dort alle eingänge zu erfassen für die es noch keine einlagerung gibt um in dieser tabelle zu numerieren - dann sollte es keine lücken geben.