11078
Goto Top

Standardwert eines Datenbankfeldes in Access per if-then-else Bedingung

Der Inhalt eines DB-Feldes soll automatisch (per Standardwert) eingesetzt werden - was eingesetzt wird, soll allerdings von den Inhalten eines anderen Feldes abhängig sein.

Hallo zusammen,

ich versuche gerade, in einer Tabelle einer Access-Datenbank für ein Feld einen Standardwert festzulegen, der je nach dem Inhalt eines anderen Feldes in jeder Reihe der Tabelle passend sein, also automatisch variieren soll.

Folgender Aufbau der Tabelle:


Note | ECTS
1 | (hier Standardwert)


Ein Feld beinhaltet (Schul-)Noten, die ein Feld weiter ("ECTS") automatisch in ein anderes Format (ECTS-Grading-Scale) gebracht werden sollen. Dieses andere Format lässt sich allerdings so nicht mathematisch berechnen, sondern liegt mir anhand von Beispielzahlen in einer "papiernen" Tabelle vor.

Erschwerend kommt hinzu, dass "Note" vom Datentyp her eine Zahl ist und "ECTS" ein String-Wert.

Meine Idee einer herangehensweise war folgendes: Ich lege für "ECTS" in der Entwurfsansicht der Tabelle als Standardwert eine "if-then-else"- Beziehung fest, in der ich die Zusammenhänge, wie man Noten in das ECTS-Format bringt, statisch abbilde.

Dazu habe ich folgendes in das Feld "Standardwert" bzw. über den Ausdrucksgenerator eingegeben:

if [Note] = 1 then [ECTS]="A"
if [Note] = 2 then [ECTS]="B"
if [Note] = 3 then [ECTS]="C"
if [Note] = 4 then [ECTS]="D"
if [Note] = 5 then [ECTS]="E"
if [Note] = 6 then [ECTS]="F"

(stark vereinfacht, in der Realität mussten es statt "ist gleich"- Bedingungen viele viele ">=" und "<=" werden)


Allerdings kann ich die Tabelle dann nicht abspeichern, weil es nur so kryptische Fehlermeldungen hagelt, die mich nicht auf den Fehler stoßen, so Dinge wie "sie haben möglicherweise einen Operanden aber keinen Operator eingegeben".


Was auch noch zu sagen ist: Die Tabellenfelder werden später in Word eingesetzt, um Seriendrucke der Tabellendaten zu erstellen. Deswegen war es mir wichtig, die Sache so zu lösen, dass ein ganz normales Tabellenfeld automatisch mit Inhalten gefüllt wird und nicht extra Abfragen oder komplizierteres angelegt werden müssen, die sich dann u.U. nicht so transparent in meine Word-Vorlage integrieren lassen.


Nun sind meine Access-Kenntnisse nie riesig gewesen und liegen dazu noch seit fast 3 Jahren ziemlich brach. Deshalb meine Fragen:

1. Was ist an obigem Beispiel falsch?
2. Geht es so überhaupt oder sollte ich es anders angehen?


Freue mich über jeden Tipp!


Gruß,
Tim

Content-Key: 17995

Url: https://administrator.de/contentid/17995

Printed on: April 19, 2024 at 22:04 o'clock

Mitglied: 13100
13100 Oct 18, 2005 at 15:51:46 (UTC)
Goto Top
suchst du jetz die richtige formel um access
beizubringen, in das feld ECTS A,B,C,...
zuschreiben, abhängig vom Feld NOTE, mit
den inhalten 1,2,3,....

...oder worum geht's eigentlich?
Mitglied: 11078
11078 Oct 18, 2005 at 16:07:53 (UTC)
Goto Top
Hallo,

suchst du jetz die richtige formel um access

beizubringen, in das feld ECTS A,B,C,...
zuschreiben, abhängig vom Feld NOTE,
mit
den inhalten 1,2,3,....

...oder worum geht's eigentlich?


Ja, darum geht es. Das Feld Note existiert bereits und jetzt soll auch noch ein Feld ECTS hinzukommen. Damit man dieses Feld über hunderte Reihen nicht manuell per Hand füllen muss, suche ich nach der Möglichkeit dies über Standardwerte zu machen. Der Vorteil: Ich müsste nur einmal Bedingungen festlegen, welche Note welchem ECTS-Wert entspricht und Access füllt auf dieser Basis das neue Feld.

Alternativ habe ich aber auch die Frage gestellt, ob jemand eine bessere Möglichkeit außer über die Standardwerte kennt, die gleichzeitig auch noch praktikabel ist, wenn ich die Felder der Tabelle zur Weiterverarbeitung in Word für Serienbriefe einsetzen will. Denn soweit ich es überblicke, kann ich in Word nur "Felder" aus Access-Datenbanken über Platzhalter einsetzen und nicht Ergebnisse von Abfragen, VBA, etc. pp.


Ciao,
Tim
Mitglied: 13100
13100 Oct 18, 2005 at 16:13:08 (UTC)
Goto Top
abfrage - entwurfsansicht: als feld angeben

ECTS: Wenn([note]=1;"A";Wenn([note]=2;"B";Wenn([note]=3;"C";Wenn([note]=4;"D";Wenn([note]=5;"E";Wenn([note]=6;"F";""))))))


insofern du eine englische version hast, "wenn" mit "if" ersetzen.

wer is eigentlich bei microsoft auf die idee gekommen,
die befehle ins deutsch zu übersetzen - erschiessen sag ich.
Mitglied: 11078
11078 Oct 18, 2005 at 17:17:35 (UTC)
Goto Top
Hallo,


abfrage - entwurfsansicht: als feld angeben

ECTS:
Wenn([note]=1;"A";Wenn([note]=2;"B";Wenn([note]=3;"C";Wenn([note]=4;"D";Wenn([note]=5;"E";Wenn([note]=6;"F";""))))))

Ich fürchte, Du hast mich nicht richtig verstanden oder ich habe mich unpräzise ausgedrückt? In der Tabelle soll ohne, dass ich viel Arbeit habe, ein neues Feld für alle bereits bestehenden Datensätze automatisch befüllt werden. Eine Abfrage würde aber doch erfordern, dass schon etwas drin steht, oder?

Wenn ich mir Deinen Tipp als SQL ansehe, kommt so etwas dabei raus:

SELECT Scheine.ECTS
FROM Scheine
WHERE (((Scheine.ECTS)=IIf([note]=1,"A",IIf([note]=2,"B",IIf([note]=3,"C",IIf([note]=4,"D",IIf([note]=5,"E",IIf([note]=6,"F",""))))))));

Aber SELECT Scheine.ECTS bringt ja gar nichts, weil in Scheine.ECTS ja noch nichts drin steht. Das soll ja erst automatisiert geschehen.

Mal ganz davon abgesehen, dass ich - wie gesagt - über die Access-Seriendruck-Funktion innerhalb von Word nur Felder ("Note", "ECTS", usw.) in die Vorlage einsetzen kann, damit Word dann für jeden einzelnen Datensatz in einem separaten Ausdruck die Platzhalter durch Werte aus der Tabelle ersetzt. Abfragen kann ich da nicht einsetzen.

Deshalb habe ich einen Kniff gesucht, wie ich ein Tabellen-Feld über alle Datensätze automatisch nach einigen Bedingungen, die von einem anderen bereits gefüllten Feld abhängen, befüllen lassen kann.

Totzdem danke für Deinen Tipp!


Gruß,
Tim
Mitglied: 13100
13100 Oct 18, 2005 at 18:35:24 (UTC)
Goto Top
es is für die entwurfsansicht geschrieben.

die sql umwandlung in access is ein thema
für sich, um es kurz zumachen, zum vergessen.

habe "if [Note] = 1 then [ECTS]="A"" als
logischen denkansatz aufgefasst - mein fehler.

die problematik mit dem seriendruck verstehe
ich in der tat nich, da eigentlich keines bestehen
sollte.

ob es sinnvoll is, in access mit sql zu arbeiten,
muss wohl jeder für sich entscheiden - ich würde
es nich benützen.
Mitglied: 11078
11078 Oct 18, 2005 at 18:57:09 (UTC)
Goto Top
Hallo Angeldust,


es is für die entwurfsansicht
geschrieben.

Ja, das habe ich ja verstanden face-smile

die sql umwandlung in access is ein thema
für sich, um es kurz zumachen, zum
vergessen.

Wie gesagt, ich kann nicht gut Access aber dafür gut SQL - ich schau mir deshalb die "Kriterien" der Abfrage manchmal in der Sql-Ansicht an, um besser zu verstehen, was da genau passiert.


habe "if [Note] = 1 then
[ECTS]="A"" als
logischen denkansatz aufgefasst - mein
fehler.

NEIN NEIN! Du hast es 100% richtig erfasst, und um es kurz zu machen: Dein Tipp geht nicht über den Weg einer normalen Abfrage (weil in das Feld ECTS ja erst noch etwas rein soll, bevor man es überhaupt abfragen kann). ABER: Habe festgesstellt, dass Dein Tipp prima funktioniert, wenn man statt normaler "Abfrage" in Access "Aktualisierungsabfrage" auswählt.

Dann werden die Werte durch die Abfrage nämlich nicht aus der Tabelle gelesen sondern in sie gesetzt. Wenn in die DB neue Noten kommen, muss man eben einmal die Anfügeabfrage starten, damit die passenden ECTS-Einträge ergänzt werden.

Also: Du hast mir absolut geholfen!!! Großes Dankeschön! face-smile


die problematik mit dem seriendruck
verstehe
ich in der tat nich, da eigentlich keines
bestehen
sollte.

Vielleicht reden wir da aneinander vorbei, aber die Problematik ist ja jetzt weg...

Vielen Dank nochmal und
schönen Feierabend!


Tim
Member: Atti58
Atti58 Oct 18, 2005 at 18:58:16 (UTC)
Goto Top
Du musst den Typ der Abfrage auf "Aktualisierungsabfrage" setzen und diese Formel:

"Wenn([test].[note]=1;"A";Wenn([test].[note]=2;"B";Wenn([test].[note]=3;"C";Wenn([test].[note]=4;"D";Wenn([test].[note]=5;"E";"F")))))"

bei "Spalte" Schein, "Zeile" Aktualisieren einsetzen, wobei test der Tabellenname ist,

Gruß

Atti.
Member: Atti58
Atti58 Oct 18, 2005 at 19:01:24 (UTC)
Goto Top
... na, da kam ich wohl ein Mü zu spät face-wink ...

Gruß

Atti.
Mitglied: 13100
13100 Oct 18, 2005 at 19:10:46 (UTC)
Goto Top
wie auch immer, geht doch face-smile
Mitglied: 11078
11078 Oct 18, 2005 at 19:12:52 (UTC)
Goto Top
Hi Atti,

... na, da kam ich wohl ein Mü zu
spät face-wink ...


Nein, so ist mir aufgefallen, dass es natürlich "Aktualisierungsabfrage" heißen muss und nicht "Anfügeabfrage". Habe das im obigen Beitrag von mir geändert, damit niemand was völlig falschen liest...


So, jetzt reicht es aber für heute Abend.
Feierabend!


Gruß,
Tim
Member: Biber
Biber Oct 18, 2005 at 19:46:35 (UTC)
Goto Top
@tim, @Atti,

ich hasse so komplizierte Abfragen (die überfordern mich immer).
Meine Variante der Aktualierungsabfrage wäre:
UPDATE Scheine SET ECTS=Chr(Note+64); face-big-smile face-big-smile face-big-smile

~~
Abgesehen davon würde ich auf das (redundante) Feld ECTS ganz verzichten, nur das Feld "Note" aus Access übernehmen und die Konvertierung "chr( Feld "Note"+64)" mit Word-Makros machen.

Frank / der Biber aus Bremen
Mitglied: 11078
11078 Oct 19, 2005 at 07:41:50 (UTC)
Goto Top
Hi Frank,

ich hasse so komplizierte Abfragen

Tja, aber ich bin gleichzeitig Student und (seit 4 Jahren) Uni-Mitarbeiter.
Der eine Teil meiner Seele sagt daher: Mach es Dir einfach, der andere sagt:
Mach es so wie alle hier - so umständlich wie nur irgend möglich...
Das Resultat liegt dann meistens in der Mitte face-smile

Abgesehen davon würde ich auf das
(redundante) Feld ECTS ganz verzichten, nur
das Feld "Note" aus Access
übernehmen und die Konvertierung
"chr( Feld
"Note"
+64)" mit
Word-Makros machen.


chr(64) ist nach den mir zugänglichen ASCII-Tabellen das "@"-Symbol. Entweder habe ich den Witz dahinter nicht verstanden oder daraus ergibt sich ein Word-Feature, das mir unbekannt ist.


Gruß,
Tim
Mitglied: 13100
13100 Oct 19, 2005 at 07:55:18 (UTC)
Goto Top
man beachte das pluszeichen.
Mitglied: 11078
11078 Oct 19, 2005 at 08:07:05 (UTC)
Goto Top
Moin,

man beachte das pluszeichen.

ja, wer richtig liest ist ganz klar im Vorteil face-smile


Einen schönen Arbeitstag,
Tim
Member: Biber
Biber Oct 19, 2005 at 08:21:33 (UTC)
Goto Top
Och, Tim,
sollte gar kein Witz sein. Würde hier niemals Witze auch nur versuchen und bin ohnehin absolut humorlos.

Was ich meinte, war dir Fortsetzung Deiner @-Reihe
Chr(0+64)="@"
Chr(1+64)="A"
Chr(2+64)="B"
Chr(3+64)="C"
Chr(4+64)="D"
Chr(5+64)="E"
Chr(6+64)="F"
Meinte den Tipp also durchaus konstruktiv. Das UPDATE-Statement oben habe ich so in M$-Access verwendet. Und das tut, was es soll.
Schönen Tag Dir

Frank
[Edit] Hast Du ja wieder vor mir gemerkt...bin wieder zu spät...[/Edit]
Mitglied: 16640
16640 Oct 19, 2005 at 09:17:54 (UTC)
Goto Top
Moin,

ich habe einen anderen Lösungsansatz, der vielleicht hilfreich sein kann:

Erstelle eine Function im VBA-Editor. Hier ein Beispielcode:
Public Function noten(zahl As Integer) As String
    Select Case zahl
        Case 1
            noten = "A"  
        Case 2
            noten = "B"  
        Case 3
            noten = "C"  
        Case 4
            noten = "D"  
        Case 5
            noten = "E"  
        Case 6
            noten = "F"  
    End Select
End Function
Sobald diese Funktion verfügbar ist, kannst Du in einer Abfrage
select note, noten(note) from Tabelle
alles ausgeben, auch Deine gewünschten konvertierten Noten. Du kannst diese Funktion an fast allen Stellen in Access einsetzen, leider nicht für die Berechnung eines Standardwertes in einer Tabellendefinition.

Du könntest Dir damit die Speicherung der konvertierten Werte ersparen und somit jederzeit eine aktuelle Ausgabe der Werte erhalten, auch bei Änderung der der Berechnung zugrunde liegenden Formel.

Vielleicht ist das ja ein wenig hilfreich auf dem Weg zur Lösung ...

hand
dba