Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

AnfügeAbfrage - DomMax + 1

Begonnen von HaNe, Januar 27, 2020, 07:49:12

⏪ vorheriges - nächstes ⏩

HaNe

Hallöchen,
ich habe folgendes Problem. Mit einer Anfügeabfrage möchte ich Daten (ca. 50 Datensätze) an eine vorhandene Tabelle (Fertigungsauftrag) anfügen. Diese Tabelle besitzt ein indiziertes Feld -Ohne Duplikate-(FaNr), welches eine bestimmte fortlaufende Nr. besitzt. Ich will nun bei dieser Anfügeabfrage diesen Wert automatisch immer um 1 erhöhen: Mein Gedanke geht in diese Richtung:
FaNrNeu: Nz(DomMax("FaNr";"Fertigungsauftrag");0)+1
Ergebnis, wenn ich diese Abfrage als Auswahlabfrage erstelle: der größte Wert wird aus der vorhandenen Tabelle um 1 für alle ermittelten Datensätze erhöht. z.B. größter Wert in Tabelle= 1000, ermittelter Wert zum Anhängen liegt bei allen Datensätzen bei 1001.
Was mache ich hier falsch?

Grüße aus dem Erzgebirge
Hagen

DF6GL

Hallo,

das Ergebnis ist nicht falsch...  Eine Abfrage besitzt keinen prozeduralen Charakter, somit wird nicht jedes Mal beim Anfügen eines DS die maximale Anzahl der aktuellen DS ermittelt.

Als Alternative:
Verwende eine kleine Recordset-Schleife, in der der Feldwert jeweils um 1 erhöht  und  die Daten an die Tabelle angefügt werden.

HaNe

#2
Hallo nochmal,
vielen Dank für die schnelle Antwort. Leider bin ich im Bereich Schleifen noch kpl. unerfahren.
Gibt es irgendwo ein Beispiel, wo Datensätze mittels einer Schleife an das Ende einer Tabelle angefügt werden? Ich würde das dann für meine DB zurecht basteln.
Vielen Dank

Gruß
Hagen

Beaker s.a.

Hallo Hagen,
Falls es mit Abfragen bei dir besser bestellt ist als mit Schleifen, hilft vielleicht dies:
https://www.ms-office-forum.net/forum/showthread.php?t=298414
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)

HaNe

Hallo Ekkehard,
vielen Dank für die Hilfe. Ich muss mir das mal in Ruhe durcharbeiten. Aktuell sind das alles "böhmische Dörfer" für mich - hat aber nix mit der Nähe zur tschechischen Grenze zu tun ;D
Das mit den Schleifen klingt für mich sehr plausibel. Ich such mal weiter, ob ich da ein Beispiel im Net finde.

Gruß aus dem Erzgebirge
Hagen

DF6GL

#5
Hallo,

hier ein Minimal-Beispiel mit VBA  (Luftcode,  Feldnamen anpassen, Datentypen beachten!  Hochkommata bei TEXT-Feldern Feld2 und Feld3 nicht vergessen ):


Dim rs as Dao.Recordset, db as Database, i as Long


Set db = CurrentDb
Set rs = db.Openrecordset ("Select *, Max([IndizFeld]) as MaxAnz from tblDeineImporttabelle", dbOpenSnapshot)
i= rs!MaxAnz

Do Until rs.Eof
   i=i+1
   db.Execute "Insert into Fertigungsauftrag (IndizFeld, Feld1, Feld2, Feld3, Feld4) Values (" & i & "," & rs!Feld1 & ",'" & rs!Feld2 & "','" & rs!Feld3 & "'," & rs!Feld4 & ")",dbFailOnError
   rs.Movenext
Loop

rs.Close
Set rs = Nothing
Set db = Nothing


HaNe

Hallo DF6GL,
vielen Dank für das Beispiel. Ich arbeite hier mit Access 2007. Funktioniert da dieser Code auch?

Vielen Dank
Gruß
Hagen


HaNe

Hallo DF6GL,
leider kam ich gestern Abend erst zum Testen. Wie vermutet, funktioniert das "noch" nicht so, wie ich das gern möchte. Kann auch sein, ich habe mich falsch ausgedrückt. Deswegen habe ich mal schnell einen Auszug meiner DB erstellt und hier angehängt.
Die beiden Tabellen ABFDOK und ABFPOS sind Tabellen unserer Bürosoftware ( Sage ) und liefern die Daten. Diese sollen mit der Anfügeabfrage (AbfAlleDatenSageFa) an die Tabelle Fertigunsauftrag angefügt werden. In der Tbl Fertigungsauftrag gibt ein indiziertes Feld (Fertigungsauftrag_Nr), welches immer um 1 erhöht werden soll. Ich hatte also im Plan den größten Wert im Feld Fertigungsauftrag_Nr für jeden anzufügenden DS um 1 zu erhöhen.

Irgendwie bekomme ich das aber nicht hin...
Bin für jede Hilfe oder jeden Tipp sehr dankbar.....man lernt eben nie aus ;)

Vielen Dank schonmal für alle Hilfe.

Herzliche Grüße aus dem (leider noch immer schneefreien)Erzgebirge
Hagen

MzKlMu

#9
Hallo,
warum nimmst Du nicht einfach den Autowert ?
Das ist auch eine Zahl des Typs Longinteger.
Mit einer einmaligen Anfügeabfrage kann man den Autowert auch auf einen Anfangswert setzen.

Normalerweise verwenden man den Autowert als Primärschlüssel.
Wenn Du beim jetzigen Aufbau bleiben willst, so ist der Autowert überflüssig.
Wieso umfasst Deine Anfügeabfrage beide Tabellen ?
Was genau willst Du denn jetzt wo anfügen, einen kompletten Fertigungsauftrag mit allen seinen Positionen ?
Gruß Klaus

HaNe

Hallo Klaus,
vielen Dank für deine schnelle Antwort.
Den Autowert kann ich leider nicht nehmen, da ich die Daten in anderen Programmen weiter verarbeite . Wenn ein Fertigungsauftrag einmal eine Nr. bekommen hat, darf diese nie geändert werden.

Den Autowert kann ich ohne Probleme als Primärschlüssel deklarieren. Es dürfen nur keine doppelten Fertigungsauftragsnummern vergeben werden.

Die Daten, welche in anfügen möchten stammen aus den beiden Tabellen DOK und POS, werden in der Abfrage verknüpft und das Ergebnis soll an die Tabelle Fertigunsgauftrag angefügt werden. Die DOK-Datei enthält die Kopfdaten vom Auftrag - die POS-datei enthält die Auftragspositionen.
Ziel solle es sein:
Es wird in SageKHK ein Auftrag angelegt und aus den angelegten Daten wird dann ein Fertigungsauftrag für meine Fertigung generiert.
Verwendet werden alle Felder, welche in der Anfügeabfrage AbfAlleDatenSageFa vorhanden sind. Diese sollen dann an die Fertigungsauftragstabelle angehängt werden.
Die Felder aus der Tabelle Fertigungsauftrag welche nicht in der Abfrage nicht enthalten sind, brauche ich für nachträgliche Eintragungen.

Ich hoffe das ich mich nun nicht zu kompliziert ausgedrückt habe.

Gruß
Hagen

PhilS

Zitat von: HaNe am Januar 31, 2020, 12:03:11
Den Autowert kann ich leider nicht nehmen, da ich die Daten in anderen Programmen weiter verarbeite . Wenn ein Fertigungsauftrag einmal eine Nr. bekommen hat, darf diese nie geändert werden.
Das ist nicht ungewöhnlich.
Worin unterscheidet sich aber jetzt das Resultat von deinem Ansatz mit DMax von einem Autowert?

Nebenbei: Wenn du einer Funktion einen Wert aus der Quelltabelle übergibst, wird diese schon für jeden Datensatz einzeln ausgeführt.

Zitat von: HaNe am Januar 31, 2020, 12:03:11Es wird in SageKHK ein Auftrag angelegt und aus den angelegten Daten wird dann ein Fertigungsauftrag für meine Fertigung generiert.
Sollte dann nicht auch SageKHK die eindeutige ID für den Auftrag vergeben?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MzKlMu

Hallo,
ZitatWenn ein Fertigungsauftrag einmal eine Nr. bekommen hat, darf diese nie geändert werden.
Genau daher wäre doch der Autowert geeignet, den kann man nicht mehr ändern, das wird von Access automatisch verhindert, wohingegen die selbst vergebene Nummer ohne eigene Gegenmaßnahmen völlig problemlos geändert werden kann. Es spricht also alles eher für den Autowert.

Üblicherweise würde man ein solches Vorhaben mit einem Hauptformular für die Kopfdaten und einem Unterformular für die Positionsdaten realisieren.
Und Du musst doch nur die Positionsdaten kopieren, die Daten für den Fertigungsauftrag kommen doch aus SageKHK.
Gruß Klaus

HaNe

Hallo PhilS,
vielen Dank für die Antwort.
Wenn ich einen Autowert nehme, geht der doch bei 1 los. Ich habe aber bereits im aktuellen Fertigungsauftragsprogramm ca. 18000 Fertigungsaufträge, welche ich erhalten muss und kann also die Nr 1-18000. nicht nochmal verwenden. Außerdem, wenn ich einen Fertigunsauftrag nachträglich löschen möchte und neu generiere, würde der FA dann eine andere Nr bekommen und die alte Nr wäre durch Autowert nicht mehr vorhanden. Ich brauche aber eine lückenlose Reihenfolge.

Sage hat die Tabellen so aufgebaut das in der DOK ein Autowert ist(AbfDokId) und dieser Wert als ABFPosAuftragID in der Tabelle Pos auftaucht. So können diese beiden Tabellen verknüpft wieder verknüpft werden und man bekommt alle Daten, welche in einem Auftrag vorhanden sind. An der Struktur kann ich leider nichts ändern.

Gruß
Hagen

HaNe

Hallo,
Zitat von: MzKlMu am Januar 31, 2020, 12:18:23
Hallo,
ZitatWenn ein Fertigungsauftrag einmal eine Nr. bekommen hat, darf diese nie geändert werden.
Genau daher wäre doch der Autowert geeignet, den kann man nicht mehr ändern, das wird von Access automatisch verhindert, wohingegen die selbst vergebene Nummer ohne eigene Gegenmaßnahmen völlig problemlos geändert werden kann. Es spricht also alles eher für den Autowert.

Üblicherweise würde man ein solches Vorhaben mit einem Hauptformular für die Kopfdaten und einem Unterformular für die Positionsdaten realisieren.
Und Du musst doch nur die Positionsdaten kopieren, die Daten für den Fertigungsauftrag kommen doch aus SageKHK.

Ich brauche aber lückenlose FA-Nummer. Wenn ich nachträglich einen Fertigungsauftrag löschen muss - es werden z.B. wichtige Daten im Auftrag geändert - und diesen FA dann neu anlege, würde durch den Autowert die Nr fehlen.
In der alten DB realisiere ich das Vorhaben auch über Haupt und Unterformular.
Nur dauert das erstellen der Daten. Habe die alte DB in Front und BackEnd geteilt und sicher damals (2008)noch mehr Fehler programmiert, wie heute. Deshalb bin ich aktuell am Ändern dieser Datenbank.

Gruß
Hagen