PDA

Vollständige Version anzeigen : Feldinhalt abhängig von anderem Datenfeld definieren


bernd-uses-access
14.02.2003, 17:43
Hallo, und schönen Freitag Nachmittag.

Ich arbeite mit A97.

Ich möchte in einer Abfrage den Inhalt eines Feldes in Abhängigkeit von dem Inhalt eines anderen Datenfeldes festlegen.


tbl_bauteile
[bauteilcode] [Nennweite] [wanddicke] [druckstufe]
R DN100 8mm
F DN50 PN40
B DN50 10mm PN25

tbl_spezifikation
[bauteilcode] [spezifikation]
R [Nennweite]&","&[wanddicke]
B [Nennweite]&","&[wanddicke]&"/"&[druckstufe]
F [Nennweite]&"/"&[druckstufe]

Ergebnis der Abfrage:
query_spezi
[bauteil] [spezi]
R DN100,8mm
F DN50/PN40
B DN50,10mm/PN25


Wie muß ich es anstellen, daß ich Access dazu kriege, daß es den Inhalt des Feldes [spezifikation] nicht nur als Datenfeldinhalt, sondern auch als "Arbeitsanweisung" zu verstehen.

Danke schon mal für Eure Antwort(en).

Gruß

Bernd

Nouba
14.02.2003, 17:58
Hallo Bernd,

Ändere die Abfrage in eine Tabellenerstellungsabfrage oder falls die Tabelle schon existent ist, in eine Anfügeabfrage um.

PS: bei Experimenten sollte immer ein Backup verfügbar sein. :)

Uwe Sendatzki
14.02.2003, 20:01
Hallo,

ein paar Dinge sind mir noch nicht klar.
Sind Nennweite, Wanddicke und Druckstufe in der Tabelle tbl_Bauteile NULL wenn nicht vorhanden? Gibst es nur die 3 genannten Bauteilcodes?

Gruss Uwe

bernd-uses-access
15.02.2003, 10:56
Hallo nochmal!

@Nouba:
Mein Haptproblem ist, daß ich nicht weiß, wie ich Access dazu kriege, daß es den Inhalt des Feldes [spezifikation] nicht nur als Datenfeldinhalt, sondern auch als "Arbeitsanweisung" zu verstehen. Dort habe ich beschrieben welche Daten aus welchen Datenfelden je nachdem welchen [bauteilcode] ich habe, in dem Datenfeld [spezi] der Abfrage erscheinen sollen.

@ Uwe:
Der Inhalt der Datenfelder, die nicht angewählt sind können null, 0 oder mit einem anderen Wert belegt sein, der mich aber für den entsprechenden Bauteiltyp nicht interessiert. Die Daten können übrigens in wesentlich mehrerer verschiedenen Datenfeldern stehen (die Tabelle hat 132 Datenfelder). Ich habe nur für die Beschreibung meiner Frage nur ein paar Datenfelder angegeben.
Es gibt auch wesentlich mehr Bauteilcodes. Die Anzahl ist unterscheidelich und die Bauteicodes können sich auch ändern. Deshalb möchte ich die Spezifikation auch in einem Datenfeld eingeben und nicht in der Abfrage mit "wenn-Bedingungen" jedesmal anpassen.

Ich hoffe Ihr könnt mir bei meinem Problem helfen.

Danke schon mal und entschuldigt die späte Antwort auf Eure Fragen.

Bernd

Nouba
15.02.2003, 13:31
Hallo Bernd,

daß es den Inhalt des Feldes [spezifikation] nicht nur als Datenfeldinhalt, sondern auch als "Arbeitsanweisung" zu verstehen.Kannst Du das mal beispielhaft erklären - speziell was unter "Arbeitsanweisung zu verstehen ist"?

(die Tabelle hat 132 Datenfelder)Da dürften Strukturprobleme vorliegen. Siehe auch den Link <i>Relationale Datenbanken</i> in meinem Footer.

Uwe Sendatzki
15.02.2003, 14:45
Hallo,

ich habe die "Arbeitsanweisung" so verstanden, das ACCESS (hier:SQL) den Inhalt des Feldes Spezifikation interpretieren soll.
Das wird dir mit SQL nicht gelingen. Ich denke du wirst nicht umhin kommen den Inhalt das Feldes Spezifikation und des Feldes Bauteilcode an eine Funktion zu übergeben, die dann die Spezifikation interpretieren, per SQL die erforderlichen Werte aus der tbl_bauteile holt und entsprechend aufbereitet.

Gruss Uwe

bernd-uses-access
15.02.2003, 15:16
Hallo Nouba,
Hallo Udo,

zunächst zu den 132 Datenfeldern: Die Tabelle(n) mit der großen Anzahl an Datensätzen wird nicht von mir erstellt, sondern die Tabelle kommt aus einem anderen Programm. Die Tabellen werden von einem 3D-CAD Programm erstellt. In dieser Tabelle sind die Daten, die das Bauteil spezifizieren. Für meine Zwecke werde ich davon ca. 15 - 20 Stck. nutzen, wobei für ein Bauteil nicht mehr als ca. 6 Datenfelder ausgelesen werden.

Ich versuche nochmals zu erklären, was ich vor hab´:
In den verschiedenen Datenfeldern sind die einzelnen Informationen in je einem Datenfeld gespeichert, wie z.B. Nennweite, Wanddicke, Druckstufe usw.
Für die verschiedenen Bauteile (definiert über die Bauteil-Codes, z.B. R für Rohr oder F für Flansch) sind verschiedene Informationen für eine Bestellung notwendig. Um ein Rohr zu bestellen muß ich z.B. die Nennweite und die Wanddicke in das Feld [Spezi] für "Bauteilbestellspezifikation" durch ein Komma getrennt eintragen. Für einen Flansch muß ich in das selbe Feld [Spezi] die Nennweite, die Wanddicke und die Druckstufe eintragen. Für andere Bauteile wiederum sind nochmals andere Daten aus anderen Datenfeldern in dem Feld [Spezi] einzutragen.

Da sich die die Spezifikationsdaten eben unterscheiden und die Bauteil-Codes ändern will ich diese Infos, was ich eben in dem Feld [Spezi] haben will, in einer eigenen Tabelle definieren.
In einer Abfrage würde ich ebenbei dem Bauteil Rohr folgendes schreiben: Spezi: wenn ([bauteil-code] ="R";[Nennweite]&","&[Wanddicke];). Da ich das aben nicht für jeden Bauteilcode in der Abfrage anpassen will und es auch zu viele verschieden Bauteil-Codes gibt will ich die "Arbeitsanweisung" für die Abfrage in einer Tabelle eintragen und dann nur über eine Verknüpfung in der Abfrage die entsprechenden Daten in dem Feld [Spezi] haben.

So, das ist jetzt viel Text. Habt Ihr eine Idee q´wie ich das Problem lösen kann?

Gruß

Bernd

@Uwe: Wie meinst Du das mit "in eine Funktion übergeben ....". Ich bin kein Profin in Access. Hast Du ein Beispiel?

Nouba
15.02.2003, 16:05
Hallo Bernd,

das Resultat erhälst Du mit

<pre><font face="Courier New, Courier, monospace" size="3">SELECT<br> Bauteilcode<br>, Nennweite &amp; ("," + Wanddicke) &amp; ("/" + Druckstufe) AS Spezifikation<br>FROM tbl_Bauteile</font></pre>

eine Tabelle tbl_Spezifikation erstellst Du mit

<pre><font face="Courier New, Courier, monospace" size="3">SELECT<br> Bauteilcode<br>, Nennweite &amp; ("," + Wanddicke) &amp; ("/" + Druckstufe) AS Spezifikation<br>INTO tbl_Spezifikation<br>FROM tbl_Bauteile AS B</font></pre>

ist die Tabelle vorhanden, kannst Du hiermit Daten anfügen

<pre><font face="Courier New, Courier, monospace" size="3">INSERT INTO tbl_Spezifikation ( Bauteilcode, Spezifikation )<br>SELECT <br> Bauteilcode, Nennweite &amp; ("," + Wanddicke) &amp; ("/" + Druckstufe) AS Spezifikation<br>FROM tbl_Bauteile</font></pre>

Uwe Sendatzki
15.02.2003, 16:20
Hallo,

man kann in einer SQL auch eigene Funtionen verwenden. Angenommen du hast eine Funktion
Public Function Get_Spezifikation(byval bauteilcode as integer) as string
in einem allgemeinen Modul (nicht Klassenmodul eines Formulars) geschrieben, dann kannst in einer SQL formulieren:

Select bauteilcode, Get_Spezifikation(bauteilcode) as Spezifikation from tblbauteile;

Für jeden Datensatz der Tabelle wird die Funktion einmal aufgerufen und der bauteilcode des Datensatzes übergeben. Die Funktion müsste dann die erforderliche Spezifikation erstellen.

Ene Idee die das Verfahren mit den 132 Spezifikationsspalten vielleicht vereinfacht:

Die Tabelle tbl_Spezifikation baust du wie folgt auf

bauteilcode (Integer) (Primary Key)
Lfdnr (Integer) (Primary Key)
Spezifikationsspalte (Integer)
Trennzeichen (string)

Jeder Datensatz enthält also nur einen Teil der Spezifikation und das zugehörige Trennzeichen zum nächsten Teil. Ausserdem eine laufende Nummer damit beliebig viele Teile zu einer Spezifikation gehören können.
Die Spezifikationsspalte zeigt auf die Spalte in tbl_bauteile. Dieser Zeiger muss 0-basiert sein (die 3. Spalte wird z.b. mit Zeiger 2 angesprochen)

Du erstellst ein Query:

qryBauteilSpezifikation
Parameters parmBauteilspezifikation Integer;
Select * from tbl_Spezifikation where bauteilcode = parmBauteilcode
Order by Lfdnr;

Das Query rufst du in der o.g. Funktion auf:

Get_Spezifikation(byval bauteilcode as integer) as string
dim qdf as querydef
dim rs as recordset
dim rs2 as recordset
dim s as string

set qdf = currentdb.querydefs("qryBauteilspezifikation")
qdf.Parameters("parmBauteilcode") = bauteilcode
set rs = qdf.openrecordset(dbopensnapshot)

set rs2 = currentdb.openrecordset("tbl_Bauteile",dbopensnapshot)

'Übergebenen Bauteilcode in tbl_bauteile suchen
rs2.Findfirst("bauteilcode=" & bauteilcode)

if not rs2.nomatch then
do while not rs.eof
'Spezifikation erstellen
s = s & rs2.fields(rs!Spezifikationsspalte) & rs!Trennzeichen
loop
endif

rs.close
rs2.close
set rs = nothing
set rs2 = nothing
set qdf = nothing

Get_Spezifikation=s

End Function

So. war ne Menge Tipperei für 2 Finger.
Ich habe es nicht getestet. Aber damit wirst du schon klarkommen.

Gruss Uwe

Uwe Sendatzki
15.02.2003, 16:23
oha,

es muss heissen
Parameters parmBauteilcode Integer;

Uwe

bernd-uses-access
15.02.2003, 16:59
Hallo Nouba,

danke schon mal für Deine Antwort.
Ich habe nur noch das Problem, daß die einzelnen Einträge, aus welchen Datenfelder die Spezifikationsdaten zu entnehmen sind sehr unterschidelich sind. Es gibt weit mehr als die hier dargestellten Varianten.

Ich habe eine schnell erstellte Datenbank erstellt, in der ich versuche das Problem darzustellen. In der Abfrage [query_zuordnung] im Feld [spezi] zeige ich, was ich gerne als Ergebnis hätte. Das ganze ist Bestandteil einer Großen Datenbank.

Gruß

Bernd

bernd-uses-access
15.02.2003, 17:03
Hallo Uwe

und danke für Deine ausführliche Antwort.

Ich bin, wie bereits erwähnt, kein Access-Profi, sondern eher Anwender.

Ich versuch´ Deinen Vorschlag zu kapieren und umzusetzen.

... ich sehe schon, daß mein Problem in jedem Fall nicht so ganz schnell und einfach zu lösen ist.

Gruß

Bernd

Uwe Sendatzki
15.02.2003, 19:18
Hallo,

mir ist noch was aufgegangen.

Die Spalte "Spezifikationsspalte " kannst du auch als Text definieren und weiterhin die Spaltennamen der tbl_bauteile verwenden wie bisher.

Gruss Uwe

Nouba
15.02.2003, 21:49
Hallo Bernd,

um einige <i>Iif</i>s oder wirst Du wohl nicht rumkommen, weil stellenweise auch Felderinhalte bei Bauteilen vorkommen, die nicht in die Rechnung sollen. Stutzig machen mich aber Deine Angaben zu den Wunschergebnissen. z.B.

<code>2 FB [model_code]&": "&[cp_1_nom_pipe_diam]&" , "&[cp_1_sch_thk] Blindflansch</code>

<i>cp_1_nom_pipe_diam</i> ist bei allen FB Null - was soll ich davon halten?

bernd-uses-access
16.02.2003, 10:24
Hallo und guten Morgen Nouba!

Was sind diese "Iifs", die Du ansprichst?

Zu den, von Dir genannten Null-Werten in [cp_1_nom_pipe_diam] bei [model_code] FB (steht übrigens für Blindflansche). Bei mir ist hier immer "25" (in der Tabelle pdtable_34) eingetragen (was übrigens Zufall ist; hier können auch andere Werte stehen).

Gruß

Bernd

bernd-uses-access
16.02.2003, 20:05
Hallo Nouba!?

Wie war das mit den "Iifs oder "?

Gruß

Bernd

Nouba
16.02.2003, 21:28
Hallo Bernd,

vergiß die Iifs. Mit einer Funktion geht das leichter.

<pre><font face="Courier New, Courier, monospace" size="3">Public Function SetSpezFormat( _<br> ByVal Modell As Variant, _<br> Optional ByVal OutsideD1 = "kein 1. Außen Ø", _<br> Optional ByVal Nennweite1 = "keine NW1", _<br> Optional ByVal OutsideD2 = "kein 2. Außen Ø", _<br> Optional ByVal Nennweite2 = "keine NW2", _<br> Optional ByVal Druckstufe = "keine Druckstufe", _<br> Optional ByVal Ventilnennweite = "keine Ventilnennweite") _<br> As Variant<br><br> Dim strErgebnis As String<br><br> If IsNull(Modell) Then Exit Function<br> strErgebnis = Modell &amp; ": "<br><br> Select Case Modell<br><br> Case "B90", "FB", "TR"<br> strErgebnis = strErgebnis &amp; _<br> (Replace(Format(OutsideD1, "0.0"), ",", ".") + " , ") &amp; _<br> Nennweite1<br><br> Case "RDE", "RDK", "TSV"<br> strErgebnis = strErgebnis &amp; _<br> (Replace(Format(OutsideD1, "0.0"), ",", ".") + " , ") &amp; _<br> (Nennweite1 + " / ") &amp; _<br> (Replace(Format(OutsideD2, "0.0"), ",", ".") + " , ") &amp; _<br> Nennweite2<br><br> Case "VENTIL"<br> strErgebnis = strErgebnis &amp; _<br> "Sonderarmatur , " &amp; _<br> ("DN" + Nennweite1 + " / ") &amp; _<br> Druckstufe<br> End Select<br> SetSpezFormat = strErgebnis<br>End Function</font></pre>