Neuigkeiten:

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

Mobiles Hauptmenü

Freie Rangfolge in Tabelle ändern bei gelöschtem Datensatz

Begonnen von 69bruno, März 02, 2012, 09:58:25

⏪ vorheriges - nächstes ⏩

69bruno

Hallo,

ich habe folgendes Problem, zu dem ich keine Lösung finde, da ich auch nicht genau weiß, wie ich danach suchen soll.
Ich habe 2 Tabellen, die in einer Beziehung zueinander stehen. Die erste Tabelle heißt Verfahrenstabelle, die zweite todo-tabelle.
Verknüpft sind sie über zwei Felder, die in der Verfahrenstabelle Verfahrensnummer heißt und in der Todo-Tabelle Kennziffer.

In die Todo-Tabelle werden Datensätze geschrieben, die irgendwann bearbeitet werden sollen. Sie erhalten eine Rangfolge (Feld: Rang) die frei vergeben werden kann oder eben keinen Inhalt hat. (Soll eine Priorität darstellen.)

Jetzt möchte ich einen Datensatz in der Verfahrentabelle übernehmen, da er ab jetzt bearbeitet wird. Dazu müsste er aus der Todotabelle gelöscht werden und alle anderen Datensätze der Todo-Tabelle, deren Rang höher ist als der aktuell zu bearbeitende müssen im Rang um 1 reduziert werden.

Hierfür habe ich in dem dazugehörigen Formular eine Schaltfläche eingefügt, die diese Aktion starten soll.
Mein Problem, wie lautet der Code.
Ich denke, es müsste irgendwie über die openrecordset methode gehen, aber ich finde keine gute Beschreibung.

Mein Gedankengang:

openrecordset
select rang where kennziffer = verfahrensnummer
move first
do until end of file
if rang >= formular!Rang then
rang = rang -1
next

und dann noch den aktuellen Datensatz löschen........

Please help !   ??? ??? ???

Achso.....Access 2003
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

DF6GL

Hallo,

ganz genau versteh ich das Vorhaben nicht..

"Jetzt möchte ich einen Datensatz in der Verfahrentabelle übernehmen, da er ab jetzt bearbeitet wird"

Soll damit ein Datensatz aus Tabelle todo in die Tabelle Verfahren verschoben werden?

Was hat das für einen Sinn? ("da er ab jetzt bearbeitet wird":  das ist lediglich ein Status eines Datensatzes in der todo-Tabelle)    Es sieht so aus, als wenn die Tabellen falsch aufgebaut sind und gar nicht logisch in Beziehung stehen können.

Welche Inhalt/Bedeutung haben die beiden Tabellen genau?


69bruno

....ok, nicht genau beschrieben...... die Todo-tabelle enthält Daten, die nicht mehr benötigt werden.
Sie ist auch der Datenbank erst später hinzugekomen, da Anforderung von chefe.

In der Verfahrenstabelle werden neue Daten hinzugefügt, die nur noch die Kennziffer von der Todo-Tabelle einschließen.

Ungefähr so:
Todo enthält: Kunde hat bedarf gemeldet, zeichnung liegt vor, bearbeiter wird sein.........

Verfahrenstabelle enthält: gefertigt am, kosten, abgesandt.........
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

DF6GL

Hallo,

die Beschreibung ist noch viel zu unklar, um Dein Problem/Aufgabe richtig interpretieren zu können...

Liste auf  und beschreib entweder alle Felder in beiden Tabellen und die dazu gehörende Beziehung oder lad die DB (datenreduziert/anonymisiert und gezippt) hier hoch.

Was es mit dem sich ändernden Rang zu tun hat, erschliesst sich mir bis jetzt noch gar nichtt.

69bruno

#4
Ok, da es aber ne Menge Tabellen und Felder sind, die meisten aber nichts mit dem Problem zu tun haben hier ein neuer Versuch der Erläuterung:

Chef erhält eine Auftragsanfrage. Er gibt sie in die Todo-Tabelle ein. Als Index, der sich bis zum Auftrags-Abschluss durchzieht wird eine Kennziffer vergeben. Chef gibt folgende Zusatzinformationen ein:
Seine Priorität des möglichen Auftrags (Rang)
Liegen alle Unterlagen vor
Wer soll es mal bearbeiten
was soll beachtet werden...... etc.

Aus der Kundenanfrage wird jetzt ein Auftrag. Der vorher vom Chef ausgewählte Bearbeiter fängt die Bearbeitung an. Er ruft die Kennziffer in der Verfahrenstabelle auf (hier ist auch nur die Verfahrensnummer aus der Todo-Tabelle zu sehen)
und gibt seine Daten ein.
Das wären:
Bearbeitet am
Materialkosten
Stundenaufwand
Ergebnis des Auftrages
Die Daten der Kundenanfrage werden nicht mehr benötigt und sollen daher wieder gelöscht werden. Hatte der Auftrag die Priorität 1, dann ist er ja jetzt abgearbeitet und die Kundenanfrage 2 muss auf die erste Priorität wechseln.

So, genauer kann ich es glaub ich nicht mehr beschreiben.

Da es sich um eine Produktivdatenbank handelt und es tatsächlich um Personaleinstellungsverfahren geht (Und schon sehr viele Personenbezogene Daten enthalten sind), kann ich sie schlecht hochladen.

Aber ich werde eine Kopie ziehen und ohne Daten hochzuladen versuchen.

Und schon gibt es das nächste Problem, die DB ist in Front- und Backend aufgeteilt. Gibt es eine einfache Möglichkeit, sie wieder zusammenzuführen ???
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

Wurliwurm

Zitat von: 69bruno am März 02, 2012, 09:58:25
openrecordset
select rang where kennziffer = verfahrensnummer
move first
do until end of file
if rang >= formular!Rang then
rang = rang -1
next

und dann noch den aktuellen Datensatz löschen........

Mir ist jetzt noch nicht ganz klar, wie der Prozess aussehen soll. Für die Operation, den Du oben beschrieben hast, sehe ich aber, daß keine Schleife nötig ist, sondern daß diese mit einer SQL-Update-Anweisung machbar wäre:

UPDATE TODO
SET RANG = RANG - 1
WHERE
kennziffer = verfahrensnummer
AND
rang >= formular!Rang

Am saubersten ist es, wenn Du die Löschanweisung und obige Updateanweisung in eine Transaktion zusammenfasst.

DF6GL

Hallo,


"Gibt es eine einfache Möglichkeit, sie wieder zusammenzuführen"

Lösch die  Verknüpfungen aus dem Frontend(!).

Importiere(!) die Tabellen aus den Backend.

69bruno

#7
So,

hier die DB

Und bitte nicht lachen, bin kein IT'ler, aber bisher hat die Db gute Dienste geleistet......

[Anhang gelöscht durch Administrator]
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

DF6GL

Hallo,

niemand lacht, eher wird die DB-Struktur und das Konzept bedauert.  :'(


Ansonsten mußt Du halt eineFunktion à la Wurliwurm umsetzen



69bruno

Aha,

ich dachte, ich hätte das mit der Struktur schon überdacht, damit so wenig wie möglich redundante Daten enthalten sind.
Das jetzt ein Part vorgeschaltet werden soll, war ja nicht meine Idee...

Aber da ich mehrere DB's betreibe, wäre es nett, wenn man mir sagen würde, was genau bedauernswert ist ;-)
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

DF6GL

Hallo,

naja,  will mich mal nicht weiter um "bedauernswert" auslassen, vermutlich ist die DB, so wie sie ist, auch nicht stark änderbar.


Wo liegt denn nun konkret das Problem?  Kannst Du den (Prinzip-)Code von Wuriwurm nicht umsetzen oder wodran liegt es?

Ansonsten bleiben durchaus Fragen offen, z. B. was soll passieren, wenn nicht  Rang #1 bearbeitet wird , sondern z. B. Rang #3.

69bruno

#11
 ::) Genau so ist es, der Gedanke von Wurmiwurm sieht mir stark nach SQL aus, ich möchte das ja aber hinter eine Schaltfläche legen und da kenne ich das nur mit VBA code.

Ein kleiner Hinweis auf Mängel in der DB wäre aber wirklich gut, da ich wie gesagt mehrere DB's habe und an neuen sitze.....
Soll natürlich kein Access-Lehrgang werden, aber so Tipps in Form von zB "zu viele Tabellen", "zu viele Beziehungen", "unübersichtliche Formulare" oder was auch immer würden die folgenden DB's wohl verbessern......
(Das ganze war mal eine Exceltabele, die in der Breite über zwei 19 '' Monitore geöffnet werden musste, damit man sie überhaupt bearbeiten konnte. Deshalb habe ich die (1 zu 1 was die Felder betrifft) in Access umgesetzt)

Zu der Frage mit Rang 3 ist die Antwort einfach. Wenn Rang 3 bearbeitet wird, muss danach jeder Datensatz mit größerem Rang als 3 um eins im Rang reduziert werden und der Original-Rang 3-Datensatz gelöscht werden  ::)
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

ebs17

Zitatder Gedanke von Wurmiwurm sieht mir stark nach SQL aus
Klar. SQL und Datenbank passen genau so gut zusammen wie Wasser und Meer, also nicht wundern.

Eine Aktionsabfrage muss zur Ausführung aufgerufen werden, und schon hast Du eine VBA-Sequenz für Deinen Buttonklick:
CurrentDb.Execute "UPDATE ...", dbFailOnError

MfGA
ebs
Mit freundlichem Glück Auf!

Eberhard

69bruno

 ;D Ne, wundern tu ich mich nicht, aber ich habe so meine Probleme mit SQL.....
habe bisher alles im VBA-Code hinbekommen.
Bin leider noch aus der Generation Dbase, TurboPascal und Turtle ..... und das ist auch schon Urzeiten her.

Was ich bis jetzt hinbekommen habe, ist, mir die Tabelle nur mit dem Datensatz anzuzeigen, dessen Kennziffer der Verfahrensnummer aus dem Formular entspricht. Wobei ich dazu die Verfahrensnummer in ein Modul (juhu())packen musste, welches eben nur die Verfahrensnummer ausgibt, um sie als Kriterium in eine Abfrage zu packen.

Den Datensatz würde ich jetzt löschen,
DELETE TodoTabelle.Rang, TodoTabelle.Dienststelle, TodoTabelle.Organisationseinheit, TodoTabelle.Funktion, TodoTabelle.[Funktion / Stelle / Befristung], TodoTabelle.Kennziffer, TodoTabelle.[SB Ausschreibung], TodoTabelle.[SB Verfahrensbegleitung], TodoTabelle.[Leitung Auswahl], TodoTabelle.Bedarfsmeldung, TodoTabelle.[Entscheidung über Ausschreibung], TodoTabelle.[Anforderung Ausschreibung], TodoTabelle.[Ausschreibungstext liegt vor], TodoTabelle.[TD liegt vor], TodoTabelle.Geschäftsgang, TodoTabelle.Zuleitung, TodoTabelle.Erörterung, TodoTabelle.Zustimmung, TodoTabelle.Veröffentlichung, TodoTabelle.Bewerbungsende, TodoTabelle.Vorauswahltermin, TodoTabelle.Vorstellungstermin, TodoTabelle.Rollenspieler, TodoTabelle.Bemerkungen
FROM TodoTabelle
WHERE (((TodoTabelle.Kennziffer)=juhu()));

ABER.....ich brauche ja noch den Rang, um danach alle größeren Ränge um 1 zu reduzieren.
Kann man jetzt in SQL den Rang dieses Datensatzes in eine Variable speichern ? Die Auflistungen der SQL-Anweisungen, die ich im Inet gefunden habe, sehen keinen derartigen Befehl vor !? Würde für mich bedeuten, ich muss im Formular ein UFormular einpflegen, dass den Rang enthält und ihn vor Aufruf der SQL-Anweisung in eine Globale Variable einspeisen....oder ???
Ich hoffe, das Problem ist verständlich....
BY the way habe ich gelernt, dass Namen mit Bindestrichen in SQL nicht laufen (TodoTabelle statt Todo-Tabelle)

If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

DF6GL

Hallo,

hier eine  Lösung mit SQL:

Private Sub btnBearbeiten_Click()
Dim db As Dao.Database, rs As Dao.Recordset, lngRang As Long

Set db = CurrentDb
lngRang = db.OpenRecordset("select Rang from [todo-Tabelle] where kennziffer = '" & Me!Verfahrensnummer & "'", dbOpenSnapshot)(0)

db.Execute "delete * from [todo-Tabelle] where Rang = " & lngRang, dbFailOnError
db.Execute "update [todo-Tabelle] set Rang = Rang - 1 where Rang > " & lngRang, dbFailOnError

Set db = Nothing
End Sub