PDA

Vollständige Version anzeigen : Addition von Feldinhalten mit SQL-String


Jörg65
08.06.2012, 17:38
Hallo zusammen,

in folgender Zeile soll das Feld Tage addiert werden, wenn der Wert 'a'
= MainLnkID ist.
Die Programmzeile werden auch ohne Fehlermeldung abgearbeitet.
Der Wert 'SummeTage' ist aber immer '=Leer'.

strSql = "select avg(Tage) as SummeTage from MA_Urlaub WHERE MainLnkID = " & a

Set DB = CurrentDb

Set RS = DB.OpenRecordset(strSql)

Form_Mitarbeiter.TUrlaubRest = SummeTage

Wäre schön, wenn mir jemand helfen könnte.


Gruß Jörg

Thomas Möller
08.06.2012, 18:06
Hallo Jörg,

strSql = "select avg(Tage) as SummeTage from MA_Urlaub WHERE MainLnkID = " & a
Set DB = CurrentDb
Set RS = DB.OpenRecordset(strSql)
Form_Mitarbeiter.TUrlaubRest = SummeTage

ich wage jetzt einfach die Behauptung, dass in Deinem Modul als erste Zeile nicht Option Explicit steht - oder? Füg das mal bitte ein.

Als nächstes habe ich eine Frage zu Deinem Code. Wo ist dieser gespeichert? Im Code-Modul für das Formular Mitarbeiter?
Dann könntest Du besser Me statt Form_Mitarbeiter schreiben.

Die Zuweisung an das Steuerelement kann nicht funktionieren. Du musst dem Code schon mitteilen, dass das Feld SummeTag aus dem Recordset verwendet werden soll.

Bezüglich der Summenbildung habe ich auch noch eine Frage. Bist Du mit den Begriffen durcheinandergekommen? AVG berechnet den Durchschnitt. Die Summe bildest Du mit SUM.

Mit all diesen Ergänzungen und Prämissen könnte Dein Code besser so aussehen:

strSql = "select SUM(Tage) as SummeTage from MA_Urlaub WHERE MainLnkID = " & a
Set DB = CurrentDb
Set RS = DB.OpenRecordset(strSql)
Me.TUrlaubRest = RS!SummeTage

'Aufräumen
RS.Close
Set rst = Nothing
Set DB = Nothing

Eine Bitte noch:
Wenn Du Code postest, kannst Du diesen in Code-Tags einfügen. Der Code ist dann leichter lesbar.

HTH

Anne Berg
08.06.2012, 18:08
Hallo Jörg,
in folgender Zeile soll das Feld Tage addiert werden1. Avg berechnet den Durchschitt und nicht die Summe

2. nach dem Öffnen des Recordsets musst du auf dessen Datenfelder über die Fields-Auflistung zugreifen

Demnach könnte folgender Code erwartungsgemäß funktionieren:strSql = "Select Sum(Tage) as SummeTage from MA_Urlaub WHERE MainLnkID = " & a
Set RS = CurrentDB.OpenRecordset(strSql)
Form_Mitarbeiter.TUrlaubRest = rs!SummeTage
RS.Closeoder kürzer:strSql = "Select Sum(Tage) From MA_Urlaub WHERE MainLnkID = " & a
Me!TUrlaubRest = CurrentDB.OpenRecordset(strSql)(0)
Ist a ein Formularsteuerelement, so sprich es mit Me!a an.

fraeser
08.06.2012, 18:10
Ich programmiere nur per ADO,
aber irgendwie fehlt der Bezug zum RecordSet...

Z.B.: Form_Mitarbeiter.TUrlaubRest = RS![SummeTage]

Wie gesagt, nur als Ansatz...

PS: Ist denn avg() korrekt?

Jörg65
09.06.2012, 10:13
@ Thomas Möller
Der dargestellte Code steht in einem Modul und Option Explicit ist gesetzt.
AVG war ein Versehen. Hatte es vorher nur zum Testen eingesetzt.

@ All
Ich habe allerdings SummeTage nicht dem Recordset zugeordnet.

Also, besten Dank für Eure Hilfe.

Gruß Jörg

Thomas Möller
09.06.2012, 10:32
Hallo Jörg,

Also, besten Dank für Eure Hilfe.

wie sieht denn jetzt Dein vollständiger Code aus?
Ich z.B. würde beim Zugriff auf ein Steuerelement in einem geöffneten Formular statt:

Form_Mitarbeiter.TUrlaubRest = RS!SummeTage

lieber schreiben:

Forms!Mitarbeiter.TUrlaubRest = RS!SummeTage

CU

Jörg65
09.06.2012, 10:58
Hallo Thomas,

so sieht der Code jetzt aus.

Sub Resturlaub()
Dim DB As dao.Database
Dim RS As dao.Recordset
Dim strSql As String
strSql = "select sum(Tage) as SummeTage from MA_Urlaub WHERE MainLnkID = " & InterID
Set DB = CurrentDb
Set RS = DB.OpenRecordset(strSql)
Forms!Mitarbeiter.TUrlaubRest = Forms!Mitarbeiter.TUrlaubstage - RS!SummeTage
RS.Close
DB.Close
InterID = 0
End Sub

Aber welchen Vorteil bringt es mit sich, wenn ich
'Forms!Mitarbeiter' statt 'Form_Mitarbeiter' schreibe ?

Thomas Möller
09.06.2012, 11:12
Hallo Jörg,

so sieht der Code jetzt aus.

RS.Close
DB.Close


beim Aufräumen hast Du nur "die Hälfte" gemacht. Es fehlt noch das Explizite setzen auf Nothing. Es gibt zwar immer wieder Aussagen, die sagen, man können darauf verzichten, da eine Variable, die ihren Scope verliert, automatisch entfernt wird. Es gibt aber genauso die Überlegung, dass es zum guten Stil gehört, Objekte, die man selbst deklariert und instanziert hat, am Ende wieder sauber aufzuräumen.
In der Vergangenheit gab es bei Vorgängerversionen schon mal ein Problem mit hängenden Instanzen von Access, wenn man die geöffneten Objekt-Instanzen nicht auf Nothing gesetzt hat.

Was das DB.Close angeht: dies ist überflüssig. Du kannst nur ein Objekt schließen, welches Du selber geöffnet hast. Mittels CurrentDb greifst Du aber auf die geöffnete Access-Instanz zu. Diese kannst Du so nicht schließen. Zum Glück übergeht Access diesen Fehler für Dich.

Mein Code zum Aufräumen würde daher, wie schon geschrieben, so aussehen:

'Aufräumen
RS.Close
Set rst = Nothing
Set DB = Nothing

CU

Jörg65
09.06.2012, 11:32
Mein Code zum Aufräumen würde daher, wie schon geschrieben, so aussehen:

'Aufräumen
RS.Close
Set rst = Nothing
Set DB = Nothing

CU

Aber warum steht RS.Nothing vor RS.Close ?

Und ich möchte noch mal nach Forms!..... fragen.
Warum Forms!.... statt Form_........

Thomas Möller
09.06.2012, 12:06
Hallo Jörg,


Mein Code zum Aufräumen würde daher, wie schon geschrieben, so aussehen:

'Aufräumen
RS.Close
Set rst = Nothing
Set DB = Nothing

Aber warum steht RS.Nothing vor RS.Close ?

in dem von mir zitierten Code-Fragmet wird erst das Recordset geschlossen (RS.Close) und dann die Recordset-Variable zerstört (Set rst = Nothing).

Leider habe ich an es dieser Stelle veräumt, den Namen der Recordset-Variable an Deine Namenskonvention anzupassen.
Der Code sollte es also so aussehen:

'Aufräumen
RS.Close
Set RS = Nothing
Set DB = Nothing

CU