Neuigkeiten:

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

Mobiles Hauptmenü

AnfügeAbfrage - DomMax + 1

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

⏪ vorheriges - nächstes ⏩

MzKlMu

#15
Hallo,
wie ich bereits oben schrieb, kann man einem Autowert durch eine einfache Anfügeabfrage einen Startwert vorgeben.
Zitatund diesen FA dann neu anlege, würde durch den Autowert die Nr fehlen.
Und das ist bei Deiner Version nicht ? Du hast die gleiche Lücke, denn Du zählst ja mit +1 vom Maxwert hoch. Du musst vor der Vergabe einer neuen Nummer prüfen ob eine Lücke vorhanden ist, wenn ja, diese verwenden, wenn nicht Max+1. Und sinnvolles Prüfen auf eine Lücke geht nur mit einer Vorratstabelle in der alle Fertigungsnummern lückenlos vorhanden sind. Das ist auch ziemlicher Aufwand. Du solltest Dir daher auch mal überlegen, ob diese Nummer wirklich lückenlos sein muss.
Was stört an einer Lücke ?

Das Kopieren habe ich immer noch nicht verstanden, wer legt denn jetzt den Auftrag an, Du oder Sage ?
Und Positionsdaten kannst Du erst kopieren, wenn der neue Fertigungsauftrag angelegt ist, und dessen Primärschlüssel bekannt ist, denn der wird ja für die Positionen benötigt.
Gruß Klaus

PhilS

Zitat von: HaNe am Januar 31, 2020, 12:32:29
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.
Das klingt vernünftig. Was hast du daran auszusetzen? D.h. warum verwendest du nicht die von Sage generierte ID?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DF6GL

Hallo,

m. E. liegt das Problem an eindeutig indizierten Feldern in der Zieltabelle.  Entferne alle Indizes (Tabellenentwurf/Indizes) und setze den Primärschlüssel auf das Autowert-Feld.

Führe dann die Anfügeabfrage aus.


Um das Autowertfeld bei 1 beginnen zu lassen,  lösche die Fertigungsauftragstabelle und komprimiere/repariere anschließend die DB.

Auch von meiner Seite die Frage, warum die schon normalisierten Tabellen zu einem nicht normalisierten, alles beinhaltenden Datentopf zusammengemischt werden sollen.



Tipp:  entferne alle Feldbenennungen (Beschriftungen) aus den Tabellen,  sonst verbraucht man mehr Zeit für Orientierung bzw. Suche als für die Problemlösung.    ;)

HaNe

Hallo,

Zitat von: PhilS am Januar 31, 2020, 13:04:14
Das klingt vernünftig. Was hast du daran auszusetzen? D.h. warum verwendest du nicht die von Sage generierte ID?

Weil z.b. Ein Auftrag mit 5 Positionen eine ID bei Tbl DOK und nur eine ID bei Tbl Pos hat. Somit sind 5 Datensätze nicht eineindeutig bestimmt. Das geht meines Wissens nur über die Positionen im Auftrag. Deswegen betreibe ich ja den ganzen Aufwand ;)

Gruß
Hagen

PhilS

Zitat von: HaNe am Januar 31, 2020, 14:16:15
Weil z.b. Ein Auftrag mit 5 Positionen eine ID bei Tbl DOK und nur eine ID bei Tbl Pos hat. Somit sind 5 Datensätze nicht eineindeutig bestimmt. Das geht meines Wissens nur über die Positionen im Auftrag. Deswegen betreibe ich ja den ganzen Aufwand ;)
Und es gibt kein Merkmal in der Tabelle der Auftragsposition, um eine Position (ggfls. auch zusammen mit der AbfDokId) eindeutig zu identifizieren? - Das erscheint mir reichlich unwahrscheinlich. Überprüfe die Sage-Daten doch nochmal in dieser Hinsicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MzKlMu

Hallo,
ZitatEin Auftrag mit 5 Positionen eine ID bei Tbl DOK und nur eine ID bei Tbl Pos hat. Somit sind 5 Datensätze nicht eineindeutig bestimmt.
Das kann doch nicht sein. Es würden ja 4 Datensätze einfach in der Luft hängen. Wie willst Du die Positionen zuordnen, wenn es kein eindeutiges Merkmal gibt. Sehr verworren das Ganze.
In der Tabelle ..POS muss es in jedem Datensatz einen Fremdschlüssel geben zur Tabelle ...DOK. Das kann nicht anders sein, sonst wäre der ganze Aufbau der SAGE DB in Frage zu stellen.

PS:
Hier werden ganze Romane geschrieben als Antworten und Du schreibst nur einen einzigen Satz zur letzten Antwort. Was ist mit meinen Anmerkungen zum Autowert und Deiner ID (mit Max+1) in meiner Antwort #15 ?
Gruß Klaus

DF6GL

#21
Hallo,
Zitat
Ein Auftrag mit 5 Positionen eine ID bei Tbl DOK und nur eine ID bei Tbl Pos hat. Somit sind 5 Datensätze nicht eineindeutig bestimmt.

Das ist zwar richtig, dennoch falsch interpretiert.  In tblDok  existiert ein eindeutiges Feld "lfdNr"  (Tabellenfeldname, nicht dessen Benennung "ABFDocID"  !), das als Primärschlüssel angesehen werden kann und mit dem Fremdschlüsselfeld "ABFPosAuftragId"  in Tabelle "ABFPos" sogar in Beziehung steht. Das Feld ABFPos.ABFPosDocId ist als Primärschlüssel der Position-Tabelle anzusehen und wird auf bei einer Zusammenführung eindeutig bleiben, soll heißen damit ist eine bestimmte Position in einem bestimmten Auftrag eindeutig identifizierbar.

Wenn sich die Beziehung nicht zu einer 1:n-Beziehung (Inhalte der verknüpften Feld gleich)  ändern lässt, dass sind die Ausgangstabellen nicht datenkonsistent.

Also bitte die Frage beantworten, wozu die beiden Tabellen in einer weiteren Tabelle (Fertigungsauftrag) zusammengemischt werden sollen.

Wenn denn nun unbedingt ein Autowert , der lediglich eine nichtssagende hochlaufende Nummer hier bedeutet, gebraucht werden sollte, dann reicht es, in Tabelle ABFDok lediglich ein Feld von Datentyp Autowert einzufügen.  Damit wäre der Fall schon erledigt und es braucht keine Abfragen oder sonstwas dazu.

Zudem sollte das Feld LfdNr in TBLDok eindeutig (Index ohne Duplikate) indiziert werden.

HaNe

Zitat von: MzKlMu am Januar 31, 2020, 12:49:19
Hallo  Klaus,
wie ich bereits oben schrieb, kann man einem Autowert durch eine einfache Anfügeabfrage einen Startwert vorgeben.
vielen Dank für alle Hilfe. Ich werde nun als erstes die FA-Nr. durch ein Autowert erstellen lassen.
Du schreibst hier mit Hilfe einer Anfügeabfrage. Könntest du mir hier einen Tipp geben wie den Autowert festlegen kann?
Zitat
Und das ist bei Deiner Version nicht ? Du hast die gleiche Lücke, denn Du zählst ja mit +1 vom Maxwert hoch. Du musst vor der Vergabe einer neuen Nummer prüfen ob eine Lücke vorhanden ist, wenn ja, diese verwenden, wenn nicht Max+1. Und sinnvolles Prüfen auf eine Lücke geht nur mit einer Vorratstabelle in der alle Fertigungsnummern lückenlos vorhanden sind. Das ist auch ziemlicher Aufwand. Du solltest Dir daher auch mal überlegen, ob diese Nummer wirklich lückenlos sein muss.
Was stört an einer Lücke ?
...die Tabelle ist nur ein Beispiel. Im Original sind alle Datensätze ausgefüllt.
Zitat
Das Kopieren habe ich immer noch nicht verstanden, wer legt denn jetzt den Auftrag an, Du oder Sage ?
Und Positionsdaten kannst Du erst kopieren, wenn der neue Fertigungsauftrag angelegt ist, und dessen Primärschlüssel bekannt ist, denn der wird ja für die Positionen benötigt.
Die Aufträge werden zuerst bei Sage angelegt und dann zu einem Fertigungsauftrag generiert. Es war/ist mein Hauptanliegen neue Fertigungsaufträge mittels einer Anfügeabfrage zu erstellen. Da ich nun die FA-Nr. mittels Autowert generiere - ich bin ja lernfähig  ;) :) ;) -, entfällt das ermitteln der letzten FA-Nr. Bisher habe ich das über Makros, Schritt für Schritt gemacht.
Nochmals vielen Dank für alle Hilfe.
Gruß
Hagen

HaNe

Zitat von: DF6GL am Januar 31, 2020, 15:03:24
Hallo,
Zitat
Ein Auftrag mit 5 Positionen eine ID bei Tbl DOK und nur eine ID bei Tbl Pos hat. Somit sind 5 Datensätze nicht eineindeutig bestimmt.

Das ist zwar richtig, dennoch falsch interpretiert.  In tblDok  existiert ein eindeutiges Feld "lfdNr"  (Tabellenfeldname, nicht dessen Benennung "ABFDocID"  !), das als Primärschlüssel angesehen werden kann und mit dem Fremdschlüsselfeld "ABFPosAuftragId"  in Tabelle "ABFPos" sogar in Beziehung steht. Das Feld ABFPos.ABFPosDocId ist als Primärschlüssel der Position-Tabelle anzusehen und wird auf bei einer Zusammenführung eindeutig bleiben, soll heißen damit ist eine bestimmte Position in einem bestimmten Auftrag eindeutig identifizierbar.

Wenn sich die Beziehung nicht zu einer 1:n-Beziehung (Inhalte der verknüpften Feld gleich)  ändern lässt, dass sind die Ausgangstabellen nicht datenkonsistent.

Genau das habe ich die ganze Zeit geschrieben...nur eben die Bezeichnung aus der Entwurfsansicht verwendet...

Zitat
Also bitte die Frage beantworten, wozu die beiden Tabellen in einer weiteren Tabelle (Fertigungsauftrag) zusammengemischt werden sollen.
Ich benötige Daten mit einer Fertigungsauftragsnr. Dies ist Grundbestandteil unserer Zertifizierung.(Arbeiten mit lückenlos nachweisbaren Fertigungsaufträgen) Deswegen will ich die Daten in einer extra Tabelle speichern.
In unserer Fertigung werden die Fertigungszeiten mit Scannern/Datensammlern gescannt. Über die Fertigungsauftragsnr. kann ich die Fertigungsaufträge den gescannten Zeiten wieder zuordnen.
Deswegen betreibe ich ja den ganzen Aufwand. Bis jetzt hat das alles auch super funktioniert. Anfang des Jahres habe ich meine DB-Fertigungsauftrag in eine Front und BackEnd geteilt. Hier habe ich die Fertigunsauträge und deren Nr. über Makros erstellt und da dauert das Erstellen eines Datensatzes fast 10 Sekunde. Und da kam die Idee mit den Anfügeabfragen.
Ich bin kein Programmiere, sondern habe mir mein Wissen durch Testen und Tüfteln selbst beigebracht. Nach und nach kommen dann eben Verbesserungen.
Man lernt eben nie aus - eben "learning by doing" ;) ;) ;)

Vielen Dank für alle Hilfe

Gruß Hagen

DF6GL

Hallo,

wie auch immer, hast Du den Autowert-Feld in tblDok eingefügt?

Ist es das, was Du brauchst?

Eigentlich Off Topic:
Zitat
"Lückenlos nachweisbaren Fertigungsaufträgen...."
Heißt was genau?

Zitat" Über die Fertigungsauftragsnr. kann ich die Fertigungsaufträge den gescannten Zeiten wieder zuordnen." 
ja, ist ja der Sinn solcher Geschichten.  Wo kommt die Fertigungsauftragsnummer her?

Mir ist das ganze Prozedere nicht klar.

Aber wie gesagt, es ist Off Topic



MzKlMu

#25
Hallo,
auch ich habe das Vorhaben immer noch nicht so recht verstanden.
In Deiner Beispieldb sind 2 Tabellen mit einer Verknüpfung, sind das die Tabellen aus Sage ?
Wenn ja, so entsprechen die Tabellen aber nicht Deinem Satz:
ZitatSage 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.
Wenn das Tabellen aus dem System sind, so darf es doch nicht sein, dass es in der Positionstabelle Datensätze gibt die nicht den richtigen Fremdschlüsselwert zur ...DOK Tabelle haben.
Wenn sich in den Beziehungen keine referentielle Integrität einstellen lässt, so stimmen diese Tabellen nicht, definitiv. Hier musst Du erst mal ansetzen.


Noch mal zum Autowert. Wenn Du die Fertigungsnummer wirklich lückenlos brauchst, ist der Autowert ungeeignet. Bei einem Autowert können Lücken nicht mit vertretbarem Aufwand geschlossen werden. Den Autowert kann man wie folgt auf einen Wert setzen:
INSERT INTO  Tabellenname (Autowertfeld)
SELECT 18000 As X
FROM Tabellenname

Den Datensatz dann löschen. Der nächste angelegte DS erhält dann die Nummer 18001.
Und wenn Du das mit dem Max+1 machst, musst Du auch Aufwand betreiben zum Schließen der Lücke, denn auch da kann ja ein Datensatz gelöscht werden. Und diese Lücke schließt sich da auch nicht von alleine. Dafür musst Du dann sorgen gem. den Hinweisen die ich in #15 schon gab.

Und wenn es wirklich lückenlos sein muss (bitte unbedingt prüfen, selbst das Finanzamt braucht keine lückenlossen Rechnungsnummern), so wird nicht gelöscht, sondern mit einen Feld als storniert gekennzeichnet und dann mit einer neuen Nr. neu angelegt. Und dann geht auch wieder der Autowert.

Bitte kläre erst mal die Randbedingungen.
Gruß Klaus

HaNe

#26
Hallo @all,
zuerst möchte ich mich nochmals ganz sehr bedanken für alle Hilfe, Anregungen und Tipps.
Es sind in den letzten Tagen viele Fragen aufgetreten, welche ich sicherlich hätte im Vorfeld - durch noch genauere Beschreibung der aktuellen DB - hätte klären können.
Grundlage meiner DB(erstellen von Fertigungsaufträgen) ist unser Programm PC-Kaufmann von Sage KHK. Dieses Programm hat als Grundlage eine AccessDatenbank mit vielen Tabellen und Abfragen. Wir legen mit dieser Software die Aufträge an und ich verwende die angelegten Daten in meiner DB zum Erstellen der Fertigungsaufträge. Die Tabellen ABFDOK und ABFPOS sind aktuell Tabellen mit jeweils ca. 100000 Datensätzen. Diese sind bei mir mit der originalen Datei von Sage verknüpft. So aktualisieren sich neu angelegte Aufträge sofort in meiner DB. Das öffnen dieser Tabellen dauert aber relativ lange. Deswegen habe ich mich entschieden, alle benötigten Daten in die Tabelle Fertigungsaufträge zu schreiben. Die Tabelle FA(Fertigungsaufträge) enthält auch ein Feld mit der FA-Nr, welche ich aktuell über ein Makro generiere. Hierbei lese ich den größten Wert aus dem letzten DS der Tabelle FA.FaNr aus und erhöhe diesen um 1.Mit diesem eineindeutigen Wert verknüpfe ich dann meine weiteren Datenbanken (z.B. die Zeiterfassung mit Pocketscannern). Der Hauptgrund liegt einfach darin, daß das öffnen und/oder verwenden der Daten von den Sage-Tabellen sehr lange dauert. Aktuell benötige ich 6-10 Sekunden, um einen Datensatz zu erstellen - sicherlich meinem Unwissen von 2007/2008 geschuldet - denn seit dieser Zeit existiert meine DB. So lange braucht es, um die Daten aus dieser MDB-Datei verwenden zu können. Ich kann die Tabellen von Sage auch nicht bearbeiten - da liegt ein Schreibschutz drauf. Bin ja schon dankbar die Daten lesen zu können.Sonst müsste ich für jeden Fertigungsauftrag alle Daten nochmal per Hand eintragen....
Somit kann ich den Tabellen von Sage auch keine Felder wie Autowert hinzufügen.
Wenn ich diese beiden Tabellen importieren würde, dauert die Erstellung eines Fertigungsauftrages nur einen bruchteil einer Sekunde -ich hätte dann aber nicht sofort die neu angelegten Aufträge zur Verfügung. Da das Importieren aber auch sehr lange dauert, habe ich mich für die Verknüpfung entschieden.
Soweit nochmal zu den vorliegenden Gegebenheiten. Vielleicht konnte ich mit dieser doch etwas längeren Ausführung die ein oder andere Frage klären.

Wünsche ALLEN ein schönes WE.
Gruß
Hagen

MzKlMu

Hallo,
Du hast jetzt viel geschrieben, aber zu den eigentlichen Hinweisen und Fragen gar nichts.
Was machst Du mit der Lücke, wenn Du statt des Autowertes das Feld mit DMax+1 hochzählst ?
Da ensteht doch auch eine Lücke wenn Du einen Datensatz löschst. Daher nie löschen, sondern sondern als storniert kennzeichnen. Wie in #25 auch angemerkt.
ZitatProgramm PC-Kaufmann von Sage KHK.
Wenn das richtig programmiert wurde, wovon ich jetzt ausgehe, so können die Daten Deines Beispiels nicht stimmen.
In der ...POS Tabelle darf es keine leeren Schlüsselfelder geben. Es muss möglich sein, referentielle Integrität einstellbar sein. Hast Du die richtigen Schlüsselfelder verbunden ?
Wenn das alles so stimmt wie in Deinem Beispiel, hat SAGE das nicht richtig gemacht.
Hier solltest mal als erstes ansetzen und die Datenlage aus SAGE überprüfen, das kann so nicht stimmen.
Das wure schon in #20 und 25 geschrieben.

Gruß Klaus

HaNe

Hallo Klaus,
zum Problem Lücke: Meine Annahme durch Unwissenheit war, das ich den Autowert nicht ändern kann und somit Zahlen(Nummern) in der Reihenfolge fehlen könnten/würden. Aktuell ändere ich die FA-Nr per Hand, wenn ich einen neuen DS nach dem Löschen erstelle. Sicher meiner Unwissenheit geschuldet...aber es geht ;)

zu Punkt 2: die angehängten Tabellen DOK und POS sind Ausschnitte der kpl. Daten. Ich kann hier nur max. 3000kb hochladen. Die DB mit alles Datensätzen dieser Tabellen hat aber aktuell 105812kb(komprimiert/reorganisiert und als Zip). Deswegen habe ich bei den Tabellen nur die letzten DS übernommen. In den originalen Tabellen sind jeweils mehr als 100000 Datensätze.

Ich teste aktuell zusätzlich noch eine andere Idee. Ich versuche mal die Daten meiner DB mit der Sage-DB nicht zu verknüpfen, sondern zu importieren und beim Starten meiner DB immer die neuen DS an die Tabelle DOK und POS anzufügen. Vieleicht geht das auch über einen Zeitstempel, damit sich die DB immer aktualisiert(?).Mal sehen ob das was bringt.

Gruß
Hagen

MzKlMu

#29
Hallo,
die Daten des Beispiels sind falsch. Völlig unabhängig davon, dass das nur ein Ausschnitt ist.
Wie bereits mehrfach geschrieben (aber bei Dir nicht ankommt) das Fremdschlüsselfeld in der ..POS Tabelle darf nicht leer sein.
Es muss (auch mit dem Ausschnitt der Daten) referentielle Integrität einstellbar sein.
Oder SAGE hat die Datenbank falsch angelegt, was ich nicht glaube.
Das muss als erstes geklärt werden, sonst macht alles weitere keinen Sinn.

Und noch mal der Hinweis:
Wenn lückenlos erforderlich ist, so darf nicht gelöscht werden, sondern nur als storniert gekennzeichnet.
Wenn Du Lücken wieder füllst, passt das ja nicht mehr zum Datum, eine neues Datum ist plötzlich zwischendrin, was erst recht zu dem Verdacht der Manipulationen führen könnte.
Gruß Klaus