PDA

Vollständige Version anzeigen : Suche eines zugehörigen Datensatzes


Perfectdark
29.10.2007, 15:07
Ok, threadtitel ist nicht besonders aussagekräftig, aber ich versuche mal hier zu erklären, was ich will.
bin neu bei access. kaum erfahrung.


Ich habe Probennummern: SampleID (tblSamples)
Gewisse Proben können sogennannte Kontrollen sein. (definiert über Kontrolle? Ja/nein)

Jede Probe kann in mehreren Experimenten auftauchen. (tblExperiments)
Jedes Experiment enthält mind. 1 Kontrolle und 1 nicht-kontrolle.
Experiment definiert über ExperimentID

Zu jedem Experiment gibts Daten (tblAnalysisData)
In dieser Tabelle enthält jeder Datensatz SampleID und ExperimentID.
jedoch sind da alle Daten in einer Tabelle zu jedem experiment.
Zum Datensatz gehören auch 3 Werte: absoluteNumberA, absoluteNumberB, absoluteNumberC

Ich will jetzt eine Abfrage erstellen, die folgendes kann:

- Parameter ist SampleID, Anwender gibt diese ein
- Die Anfrage gibt mir gewünschte gespeicherte Daten zurück + den Mittelwert aus absoluteNumberA, absoluteNumberB, absoluteNumberC

-> hab ich schon gemacht, funktioniert.
Kleines Problem: primitiv. Mittelwert einfach absoluteNumberA, absoluteNumberB, absoluteNumberC/3. Wie kann ich das "programmieren"? Es könnte nämlich mal vorkommen, dass zb absoluteNumberC 0 "empty" ist. also nur 2 werte, die verrechnet werden müssen.
Lösung?



Grosses Problem:

Der Benutzer gibt ne SampleID an. Jetzt soll die Abfrage/funktion zu jedem Experiment dieser SampleID die dazugehörige kontrolle finden, den Mittelwert aus absoluteNumberA, absoluteNumberB, absoluteNumberC der Kontrolle berechnen und zurückgeben.
Dieser Wert wird dann für eine weitere berechnung benötigt, die leicht im Expressionbuilder zu machen ist. (formel mit nem Log)
Und wenn die gesuchte SampleID eine Kontrolle ist, findet die berechnung nicht statt.

War das verständlich? Ist das möglich? Wie? Inputs?


Und noch ne allgemeine frage über funktionen.

Wie kann ich da werte aus der tabelle nehmen für berechnungen?
bzw. kann ich da einfach sowas eingeben wie "tblAnalysisData!absoluteNumberC" und es findet den Wert?

hcscherzer
29.10.2007, 16:43
Moin,
ein paar Fragen und Anmerkungen:
1. hast Du die Tabellen verknüpft und wenn ja, mit welchen Beziehungen?
2. Jedes Experiment enthält mind. 1 Kontrolle und 1 nicht-kontrolle.wie überprüfst Du das?
3. Wie kann ich das "programmieren"Ganz einfach: indem Du die Funktion schreibst in einem globalen Modul, z.B.: public function mmw(a as double, b as double, c as double) as double
dim anz as integer
if not isnull(a) then
anz = anz + 1
mmw = a
endif
if not isnull(b) then
anz = anz + 1
mmw = mmw + b
endif
if not isnull(c) then
anz = anz + 1
mmw = mmw + c
endif
if anz = 0 then
mmw = 0
else
mmw = mmw / anz
end if
end function
4. für das 'grosse Problem' ein Formular erstellen, wo der Benutzer die Sample_ID eingeben (Textfeld) oder auswählen (Kombifeld) kann. Danach wird eine Abfrage ausgeführt, die sich per Kriterium auf die ausgewählte ID bezieht und die Ergebnisse werden in einem Listenfeld (oder Unterformular) ausgegeben.

Perfectdark
29.10.2007, 21:50
boa mist riesen post geschrieben und das ***** forum hat mich ausgeloggt und alles war weg.

tblsamples 1.n zu tblanalysisdata (kein primärschlüssel)
tbl experiments 1:n tblanalysisdata (enthält SampleID und experimentID)


Kontrolle wird nicht überprüft. Das wäre dann wohl der nächste schritt.

zu 4.

das formular gibts schon nur, muss zb wenn ich sampleID 2 suche, die dazugehörige kontrolle (zb SampleID 1) "gefunden" werden für jedes exp. mit SampleID 1. (ist nicht immer zwingend die gleiche kontrolle)

Also wenn der user SampleID 2 eingibt und die abfrage startet, muss diese die kontrolle finden. wi soll das gehen? sehe ich überhaupt nicht ein.

Anne Berg
29.10.2007, 22:58
Und noch ne allgemeine frage über funktionen.Beispiel:x = DLookUp("absoluteNumberC","tblAnalysisData"[,"(Kriterium)"])
PS:und das ***** forum hat mich ausgeloggt Achte mal beim Einloggen auf die CheckBox "Angemeldet bleiben" (o.ä.)

Perfectdark
30.10.2007, 15:20
x = DLookUp("absoluteNumberC","tblAnalysisData"[,"(Kriterium)"])

ok, aber wie definiere ich "kriterium"?

1. "Control" in tblSamples = wahr sein
2. "ExperimentID" in tblAnalysisData von "SampleID gesucht" = "ExperimentID" von "SampleID mit "Control" in tblSamples = wahr sein

irgendwie scheint mir das unmöglich zu sein :eek:

Perfectdark
31.10.2007, 13:53
kann mir da keiner helfen?

wenn ich folgendes schreibe:

Expr3: DLookUp("[absoluteNumberA]";"[tblAnalysisData]";"[tblSamples]![Control]=Yes AND [tblExperiments]! [ExperimentID] = [ExperimentID]")

kommt folgende Fehlermeldung:

"You canceled the previous operation"

Wenn ich die abfrage starte per formular.

Starte ich die abfrage "manuell" :

"Invalid use of "." "!" or "()" in query expression ..." (also ausdruck oben)

Dieser fehler hängt eindeutig mti dem ausdruck zusammen.

EDIT:
DLookUp("[absoluteNumberA]";"[tblAnalysisData]";"[tblSamples]![Control]=Yes" "AND [tblExperiments]! [ExperimentID] = [ExperimentID]")

so scheint es zu gehen.

EDIT2:

gleiches für absoluteNumberB und C gemacht.

Die Werte stimmen. Es will sie mir aber nicht "wissenschaftlich" anzeigen obwohl so eingestellt???
Gut, nicht so schlimm, aber das problem:

Wenn ich den mittelwert errechne, kommt ne völlig falsche Zahl raus. Also nicht (absoluteNumberA,B,C) / 3

hm, ok lol. was soll das denn? Wenn ich zb. A + B mache und A=25000 ist und B=240 bekomm ich 25000240 raus??????

Perfectdark
31.10.2007, 14:57
Aber wenn ich A-B mache, rechnet er das hingegen richtig???

versteht das hier jemand?

Anne Berg
31.10.2007, 15:45
Das wird mit den Datentypen zusammenhängen. ;)

(Text wird verkettet, Zahlen addiert)

Perfectdark
31.10.2007, 17:30
ja hab ich vermutet, aber wieso gibt mri das keien normale zahl raus??? ist ja als solche gespeichert.

Arne Dieckmann
31.10.2007, 17:36
Eine Zahl kann auch in einem Textfeld stehen .... Kontrolliere im Tabellenentwurf den Felddatentyp von "absoluteNumberA". Was ist dort eingestellt?

Ansonsten solltest du mehr von deinem Code zeigen (VBA: Variablendeklaration und dergleichen, oder wenn's eine Abfrage ist, die SQL-Ansicht).


Die Subtraktion funktioniert, weil Access in dem Fall die Typen anpasst - Strings lassen sich eben relativ schlecht voneinander abziehen und umgekehrt gut miteinander verketten.

Perfectdark
01.11.2007, 10:36
ne ist ganz klar ne double. habs auch nochmals geprüft.

code gibts eigentlich nichts ausser die mittelwertberechnung.

Und wie gesagt. bin Anfänger. ;)


SQL sieht so aus:

SELECT tblSamples.SampleNumber, tblSamples.SampleType, tblSamples.SampleDescription, fktAvg(tblAnalysisData!absoluteNumberA,tblAnalysisData!absoluteNumberB,tblAnalys isData!absoluteNumberC) AS MeanCfu, Log([MeanCtrl])-Log([MeanCfu]) AS [Antimicrobial Activity], tblExperiments.ExperimentID, DLookUp("[absoluteNumberA]","[tblAnalysisData]","[tblSamples]![Control]=YES" And "[tblExperiments]! [ExperimentID] = [ExperimentID]") AS CtrlA, DLookUp("[absoluteNumberB]","[tblAnalysisData]","[tblSamples]![Control]=YES" And "[tblExperiments]! [ExperimentID] = [ExperimentID]") AS CtrlB, DLookUp("[absoluteNumberC]","[tblAnalysisData]","[tblSamples]![Control]=YES" And "[tblExperiments]! [ExperimentID] = ExperimentID]") AS CtrlC, fktAvg([CtrlA],[CtrlB],[CtrlC]) AS MeanCtrl
FROM tblExperiments INNER JOIN (tblSamples INNER JOIN tblAnalysisdata ON tblSamples.SampleID = tblAnalysisdata.SampleID) ON tblExperiments.ExperimentID = tblAnalysisdata.ExperimentID
WHERE (((tblSamples.SampleNumber) Like "*" & [Forms]![frmQryData]![prmqryData] & "*"))
ORDER BY tblSamples.SampleNumber;


EDIT:

das mit dem dlookup stimmt aber nicht spuckt einfach immer die gleiche zahl aus.

Anne Berg
01.11.2007, 17:35
Hallo,
die Abfrage ist syntaktisch falsch, die Kriterien in den DLookUps betreffend. Auch kannst du nicht Datenfelder anderer Tabellen dort einbeziehen.DLookUp("[absoluteNumberA]","[tblAnalysisData]","[tblSamples]![Control]=YES" And "[tblExperiments]! [ExperimentID] = [ExperimentID]") AS CtrlA,
DLookUp("[absoluteNumberB]","[tblAnalysisData]","[tblSamples]![Control]=YES" And "[tblExperiments]! [ExperimentID] = [ExperimentID]") AS CtrlB,
DLookUp("[absoluteNumberC]","[tblAnalysisData]","[tblSamples]![Control]=YES" And "[tblExperiments]! [ExperimentID] = ExperimentID]") AS CtrlC,
Richtiger wäre es folgendermaßen:DLookUp("[absoluteNumberA]","[tblAnalysisData]","[Control]=-1 AND [ExperimentID]=" & [ExperimentID]) AS CtrlA, wenn die Datenfelder in der Basistabelle vorhanden wären. Andernfalls musst du eine Abfrage einsetzen.

PS: von einer Addition kann ich da aber jetzt nichts finden.

Perfectdark
01.11.2007, 20:47
PS: von einer Addition kann ich da aber jetzt nichts finden.

aha ja die ist weg. hab ich nur zum testen eingefügt, weil die mittelwerte offensichtlich falsch waren. ;)


wenn die Datenfelder in der Basistabelle vorhanden wären. Andernfalls musst du eine Abfrage einsetzen.

Aha also ich könnte einfach ne abfrage machen, in der
absoluteNumberA-C vorkommen, ExperimentID und Control und dann diese als domäne verwenden?

Anne Berg
01.11.2007, 21:52
Ja, so könnte das gehen.

Perfectdark
14.11.2007, 11:38
Das hat übrigens auch funktioniert.

Hab jetzt beim testen nochgemerkt, dass die funktion Log eigentlich ln ist und nicht Log10.
mit der suche hier konnte ich das "problem" aber schnell beheben.