Fortlaufende Nummer in Access (kein AutoWert...)
Hallo, ich habe eine Access-Tabelle ähnlich dieses Aufbaus:
ID | Auftrag | Artikel | etc.
1 | 123 | A
2 | 123 | B
3 | 456 | A
4 | 456 | C
5 | 456 | D
und möchte dies in eine neue Tabelle einfügen, die aber noch eine Pos-Nr hat:
ID | Auftrag | Artikel | Pos
1 | 123 | A | 1
2 | 123 | B | 2
3 | 456 | A | 1
4 | 456 | C | 2
5 | 456 | D | 3
Sortiert wird nach Auftrag und Artikel.
Wie muss der Befehl aussehen, damit ich diese fortlaufenden IDs erzeugen kann?
Ich zerbreche mir da schon den ganzen Tag den Kopf darüber...
Vielen Dank schonmal!
ID | Auftrag | Artikel | etc.
1 | 123 | A
2 | 123 | B
3 | 456 | A
4 | 456 | C
5 | 456 | D
und möchte dies in eine neue Tabelle einfügen, die aber noch eine Pos-Nr hat:
ID | Auftrag | Artikel | Pos
1 | 123 | A | 1
2 | 123 | B | 2
3 | 456 | A | 1
4 | 456 | C | 2
5 | 456 | D | 3
Sortiert wird nach Auftrag und Artikel.
Wie muss der Befehl aussehen, damit ich diese fortlaufenden IDs erzeugen kann?
Ich zerbreche mir da schon den ganzen Tag den Kopf darüber...
Vielen Dank schonmal!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 87333
Url: https://administrator.de/contentid/87333
Ausgedruckt am: 25.11.2024 um 14:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Godlike!
Ohne jetzt mal den Sinn des ganzen zu hinterfragen:
also in etwa so:
BG, Felix -misterdemeanor-
Ohne jetzt mal den Sinn des ganzen zu hinterfragen:
- Tabelle im Datenbankfenster kopieren (mit Daten)
- Dein Pos-Nr Feld in die neue Tabelle einfügen
- Eine Funktion (VBA) schreiben in der Du ein Recordset erstellst. Füttern tust Du das mit dem entsprechenden Select und Order By Klausel.
- Nun ratterst Du das Recordset einmal durch und setzt das Pos-Nr Feld mit einer CounterVariablen
also in etwa so:
Public Function SetzePos()
Dim sql As String
Dim rs As DAO.Recordset
Dim i As Integer
i = 1
sql = "SELECT * FROM Tabelle ORDER BY Auftrag, Artikel;"
Set rs = CurrentDb.OpenRecordset(sql)
Do Until rs.EOF
rs.Fields("Pos-Nr") = i
i = i + 1
rs.MoveNext
Loop
End Function
BG, Felix -misterdemeanor-
Setzt die angegebene Funktion nicht eine fortlaufende Nummer von 1..n?
Jepp. Hatte ich wohl falsch verstanden, bzw. Deine Darstellung nicht genau angeschaut *g
Also dann würde ich mir wohl die einzelnen "Aufträge" holen und in einer inneren Schleife dann die PosNr setzen...also in etwa:
Public Function SetzePos()
Dim sql As String
Dim rsAuftraege As DAO.Recordset
Dim rs As DAO.Recordset
Dim i As Integer
sql = "SELECT DISTINCT Auftrag FROM Tabelle;"
Set rsAuftraege = CurrentDb.OpenRecordset(sql)
Do Until rsAuftraege.EOF
sql = "SELECT PosNr FROM Tabelle " _
& "WHERE Auftrag=" & rsAuftraege.Fields("Auftrag") _
& " ORDER BY Auftrag, Artikel;"
Set rs = CurrentDb.OpenRecordset(sql)
i = 1
Do Until rs.EOF
rs.Fields("Pos-Nr") = i
i = i + 1
rs.MoveNext
Loop
rsAuftraege.MoveNext
Loop
End Function
Hb ich das nun richtig verstanden?
Angenehmes WE.
Moin Godlike,
falls das eine einmalige Aktion bleibt und Du schnell die jetzige Tabelle "Auftrag" nicht so richtig viele Positionen je Auftrag hat geht es relativ fix per SQL...
Vorgehen:
Wenn dann folgende Abfrage das Ergebnis darunter bringen würde:
... dann feuere folgendes Statement ab.
Danach sieht die "AuftragNeu"-Tabelle so aus:
-bzw- unter Berücksichtigung des neuen PKs
[oder optional halt ohne diese AutoID]
Grüße
Biber
falls das eine einmalige Aktion bleibt und Du schnell die jetzige Tabelle "Auftrag" nicht so richtig viele Positionen je Auftrag hat geht es relativ fix per SQL...
Vorgehen:
- Kopieren [nur die Struktur] der (ich sach ma) Tabelle "Auftrag" in "Auftragneu"
- Erweitern der neuen Tabelle um ein Feld "Pos"
- [Optional] Ich würde bei der Gelegenheit gleich dieses AutoId-Feld wegwerfen. Du hast doch den eindeutigen PK "Auftrag+Pos+Artikel"[/Optional]
- "Neue Abfrage" erstellen, falls irgendein Access-Abfrage-Assistent um die Ecke biegt. gleich eins auf die Schnauze und in die SQL-Ansicht
Wenn dann folgende Abfrage das Ergebnis darunter bringen würde:
Select * from Auftrag
ID auftrag artikel attribut1 etc
1 123 A blau extralarge
2 123 B orange mini
3 456 A blau extralarge
4 456 C lila pervers
5 456 B schwatt cool
... dann feuere folgendes Statement ab.
Insert INTO AuftragNeu (Auftrag, Artikel, Pos, Attribut1, Etc)
Select Auftrag, ThisArtikel, Pos, Thisattribut1, ThisEtc
FROM (
Select Auftrag, first(Artikel) as ThisArtikel,
(select IIF(max(pos) is NULL, 0, max(pos))+1 from auftragneu) as POS,
first(attribut1) as ThisAttribut1, First( etc) as Thisetc
FROM Auftrag
Where Auftrag & Artikel not in (Select Auftrag & Artikel from AuftragNeu)
GROUP by Auftrag
)
- Du bekommst die Sicherheitsabfrage. "Sie beabsichtigen, x Sätze anzufügen. Im Ernst?"
- Solange der Wert von x nicht Null (0) ist, kannst Du immer weiter diese Abfrage nochmal starten.
Danach sieht die "AuftragNeu"-Tabelle so aus:
Select * from AuftragNeu
ID auftrag artikel Pos attribut1 etc
1 123 A 1 blau extralarge
2 456 A 1 blau extralarge
3 123 B 2 orange mini
4 456 C 2 lila pervers
5 456 B 3 schwatt cool
SELECT auftrag,artikel,Pos, etc
FROM AuftragNeu
ORDER BY auftrag, Pos;
auftrag artikel Pos etc
123 A 1 extralarge
123 B 2 mini
456 A 1 extralarge
456 C 2 pervers
456 B 3 cool
[oder optional halt ohne diese AutoID]
Grüße
Biber
Danke, hat wunderbar geklappt ;)
Schön!
Nichtsdestotrotz ist Bibers Variante empfehlenswerter.
Den Lösungsweg den ich aufzeigte ist für mich einfach der schneller erstellte; um Biber´s SQL Statement zu bauen hätte ich sicher drei- bis viermal so lange benötigt als es schnell in VBA zu tippen.
Nun ja, wenn es bei einem einmaligen Rollover in einer Access DB bleibt...
Ansonsten hast Du dann ja Biber´s SQL Statement
BG, Felix -misterdemeanor-