Unterkategorie nummerieren
Hi,
ich habe ein kleines Problem, ich schreibe für meine Firma eine kleine DB die Bauteilnummern vergibt.
Die Bauteilnummern können müssen aber nicht Unterbauteilnummern haben, wenn sie aus mehreren Teilen bestehen.
Die Bauteilnummern werden mit einem Autowert angelegt, die Unterbauteilnummer sollen allerdings immer von 1-n nummeriert werden und sollen daher kein Autowert haben.
Kann mir bitte jemand sagen was ich schreiben muss das als Standartwert immer die richtige Nummerierung steht, dass soll und darf nämlich nicht von Hand geschehen.
LG Nadine
Antwort schreiben
Antwort 1 von lleopard vom 19.07.2019, 08:47 Options
Moin Janine,
wie sieht das denn aus, wenn ein Bauteil Unterbauteile hat?
Steht dann in einem Feld ein entsprechender Eintrag, der das unterbauteil dem Basuteil eindeutig zuordnet?
Das Problem ist, daß du - wenn du ein Autowert-Feld hast - nicht die Werte aus diesem Feld einfach löschen oder überschreiben kannst. Das löst sofort einen Fehler aus. Also muß ein Bauteil immer eine eigene Nummer haben, und die Unterbauteile müssen sich eindeutig dem Bauteil zuordnen lassen...
Eigentlich sollte man ja davon ausgehen können...
Dann ist auch die lösung recht einfach:
Gehe unter Module => neu
Dann schreibst du:
Function BauteileUnterbauteile ()
dim dbs as dao.database
dim rs as dao.recordset
dim rt as dao.recordset
dim stg as string
dim i as integer
set dbs = currentdb
'Um Haupt-Bauteile zu unterscheiden, tu ich mal so als hättest du die Hauptbauteile in einem Feld "ÜbergeordnetesBauteil" als solche gekennzeichnet und suche mir die nun raus:
set rs = dbs.openrecordset ("Select * FROM Bauteile Where Bauteile.ÜbergeordnetesBauteil=1")
'Focus auf den ersten DS
rs.movefirst
'In die Schleife durch alle Bauteile
do while rs.eof
stg = rs!BauteilName
set rt = dbs.openrecordset ("Select * FROM Bauteile Where Bauteile.BauteilName = '[" & stg & "]' AND ÜbergeordnetesBauteil=0")
'Hier filtern wir nun genau auf die Unterbauteile, die den Namen des Bauteils haben, aber kein Bauteil sind.
'Jetzt gehen wir einfach die Datensätze in rt durch:
if not rt.bof then 'das schließt aus, daß wir nix haben
rt.movefirst 'Auf den ersten Datensatz fokussieren
i = i + 1 'Unseren Zähler initialisieren
do while rt.eof = false
rt.edit 'Zum aktualisieren vorbereiten
rt!Unterbauteilnummer = i
rt.Update
i = i + 1 'Zähler hochsetzen
rt.movenext
loop
end if
rs.movenext 'Das Nächste Bauteil aufrufen
i = 0 'Zähler wieder auf Null setzen
loop 'Und wieder ab durch die Schleife...
rs.close: rt.close: set rs = Nothing: set rt = Nothing: set dbs = Nothing
End function
Das Ganze mußt du noch an deine Tabelle anpassen, is ja klar... und mit ein paar Anpassungen sollte das auch funktionieren...
Gruß Leo
Antwort 2 von Teddy7 vom 19.07.2019, 09:10 Options
oder so:
dim suche as string
suche = "Bauteil = " & DeineBauteilnummer
DeineUnternummer = 1
on error resume next
DeineUnternummer = dmax("DeineUnternummer", "DeineTabelle", suche) + 1
on error goto 0
Diesen Code einfügen im "BeiÄnderung"-Ereignis eines Feldes, das auf jeden Fall erfasst werden muß.
Dieser Code sucht für die vorgegebene Bauteilnummer die größte bisher gespeicherte Unternummer und addiert 1 drauf.
Der Befehl on error resume next ist eingefügt falls der Dmax-Befehl scheitert (weil z.B. noch nix in der Tabelle steht).
Dann soll er mit dem nächsten Befehl weitermachen - d.h. in der Unternummer bleibt 1 stehen.
on error goto 0 schaltet wieder auf die normale Fehlerbehandlung um.
!!!Achtung - wenn mehrere Personen gleichzeitig mit dem Programm arbeiten (am gleichen Bauteil) dann KANN es hier zu Fehlern kommen (eine Unternummer 2x vergeben). In diesem Fall sollte man eine eigene Tabelle führen, in die man die Bauteilnummer und die letzte vergebene Unternummer schreibt. Diese Tabelle würde man dann hier lesen, die Position um 1 erhöhen und den Datensatz speichern.
Das ist dann aber aufwändigerer Code, der dem von Leo nahekommt.
Gruß
Teddy
Antwort 3 von Janine123 vom 19.07.2019, 19:18 Options
Erstmal ein großes dickes Dankeschön, für die detailierte Hilfe. Ich werde es heute Abend gleich mal ausprobieren und bin gespannt ;)
Liebe dankbare Grüße an euch zwei
Janine123
Antwort 4 von wasa vom 24.07.2019, 11:09 Options
Hallo,
Eure Hilfe ist echt Gold wert, vielen Dank und gleich noch ne Frage, nein zwei:
1. Ich habe ein Memofeld, da steht mal viel und mal wenig darin. Dieses Memofeld wird in einem Bericht angedruckt und soll sich der Textmenge anpassen. Weiß jemand wie das geht?
2. Ich habe ein Formular mit Versuchsberichten und darin einen Unterbericht mit mehreren Sätzen (Bauteile), für jeden dieser Sätze gibt es wiederum einen separaten Bericht, wie kann ich auch diesen im Formular anzeigen bzw. wie verknüpfe ich diese?
*Threadedit* \t\
Admininfo: Führ bitte fremde Threads nicht fort indem du eigene Anfragen anhängst.
Die User werden es dir danken. Siehe FAQ 2.
lg
Traude
Antwort 5 von Teddy7 vom 24.07.2019, 12:25 Options
Normalerweise: neue Frage -> neuer tread !!
1) Eigenschaft vergrößern/verkleinern auf ja stellen
!!! auch den zugrhörigen Bereich so einstellen und das Feld als unterstes oder in einen eigenen Bereich (gruppieren)
stellen.
2) was denn nun ? Formular oder Bericht ??
Wenn es sich um die Daten eines Versichsberichts handelt, die in einem Formular stehen, dann kann man natürlich im Unterformular nochmal ein Unterformular einfügen.
Fraglich ist hier aber, ob man da nicht mit Registern übersichtlicher ist.
Gruß
Teddy