PDA

Vollständige Version anzeigen : Fehler in A00 und AXP


TommyK
24.11.2003, 11:10
Hallo,

bei der Konvertierung einer A97 DB in das A00-Format kam es zu unerklärlichen Totalabstürzen der msaccess.exe.
Auch ein importieren aller Objekte in eine neue DB usw. haben nichts gebracht. Ach wurde kein Kompilierungsfehler angezeigt.
Nach einiger Zeit hab ich dann den Fehler gefunden, den ich hier mal vorstellen möchte.

Also es handelt sich um eine Parameterabfrage im VBA-Code.
hier die A97-Version:

strSQL = "PARAMETERS [tbl_Kalender] Long; SELECT Year([Kalenderdatum]) AS Cal " _
& "FROM tbl_Kalender WHERE (((Year([Kalenderdatum]))=[tbl_Kalender]));"

Set db = CurrentDb
Set qdf = db.CreateQueryDef("qry_DayYear_Exist", strSQL)
qdf.Parameters![tbl_Kalender] = Forms![frm_Betriebskalender]![txt_tbl_Jahr]
Set rst = qdf.OpenRecordset

Alles läuft zur vollen Zufriedenheit.
Wenn jetzt dieser Code in A00 oder AXP benutzt wird, steigt Access aus.

Hier jetzt die Version für A00/AXP:
strSQL = "PARAMETERS tbl_Kalender Long; SELECT Year([Kalenderdatum]) AS Cal " _
& "FROM tbl_Kalender WHERE (((Year([Kalenderdatum]))=tbl_Kalender));"

Set db = CurrentDb
Set qdf = db.CreateQueryDef("qry_DayYear_Exist", strSQL)
qdf.Parameters!tbl_Kalender = Forms![frm_Betriebskalender]![txt_tbl_Jahr]
Set rst = qdf.OpenRecordset

Der Fehler sind die eckigen Klammern bei den Parametern

Es wird beim kompilieren unter A00/XP kein Fehler angezeigt aber Access steigt dann zur Laufzeit aus. Werden die eckigen Klammern entfernt, ist alles in Ordnung.
strSQL = "PARAMETERS [ tbl_Kalender] Long; SELECT Year([Kalenderdatum]) AS Cal " _
& "FROM tbl_Kalender WHERE (((Year([Kalenderdatum]))=[ tbl_Kalender] ));"

Set db = CurrentDb
Set qdf = db.CreateQueryDef("qry_DayYear_Exist", strSQL)
qdf.Parameters![ tbl_Kalender] = Forms![frm_Betriebskalender]![txt_tbl_Jahr]
Set rst = qdf.OpenRecordset

Der Code ohne eckige Klammer läuft dann auch unter A97.

Ich dachte mir dies vielleicht Diesen oder Jenen interessieren könnte.

Sascha Trowitzsch
01.12.2003, 13:31
Kann das Problem nachvollziehen.

Aber als Bug würde ich allein die Tatsache ansehen, dass beim Kompilieren oder bei Erstellung der Query kein Fehler gemeldet wird.

Das Access ansonsten Schwierigkeiten mit der Abfrage hat kann ich mir vorstellen:

Du benennst den Parameter gleich wie die Tabelle!
Ich denke, dass WHERE (xyz)=[tbl_Kalender] den Fehler hervorruft, weil Access möglicherweise Tabelle und Feld durcheinander bringt. (Könnte an den erweiterten VBA-Möglichkeiten in JET-SQL von Jet 4.0 liegen.)
Wenn du den Parameter anders benennst, so gibt es auch bei eckigen Klammern kein Problem.

Ein Absturz sollte natürlich trotzdem nie auftreten. Insofern ist könnte man es als Bug des SQL-Parsers ansehen.

Ciao, Sascha

TommyK
01.12.2003, 14:59
Hallo Sascha,


Ich denke, dass WHERE (xyz)=[tbl_Kalender] den Fehler hervorruft

war nur ein Bsp. In der DB habe ich noch weitere Parameterabfragen, dort haben die Parameter eine ordentliche Bezeichnung . Es tritt aber ebenfalls der Fehler auf.

Sascha Trowitzsch
01.12.2003, 16:35
Bei mir nicht. Nur wenn Parametername und Tabellenname identisch sind.
Hast du das neueste Jet-ServicePack drauf? (Bei mir SP8)

Ciao, Sascha

TommyK
01.12.2003, 17:56
@Sascha,

nee, das SP8 hab ich noch nicht drauf.

Ich hab es aber nochmal getestet.
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Function</span> Count_Flag_Days(intFlag <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">If</span> ExistObject(&quot;qry_Count_Flags&quot;, 1) <span class="TOKEN">Then</span> DoCmd.DeleteObject acQuery, &quot;qry_Count_Flags&quot;
&nbsp;
strSQL = &quot;PARAMETERS [Krit_Year] Long, [iFlag] Short; SELECT tbl_Kalender.Kalenderdatum FROM tbl_Kalender &quot; _
&amp; &quot;WHERE (((Year([Kalenderdatum]))=[Krit_Year]) AND ((Weekday([Kalenderdatum]))&gt;=2 <span class="TOKEN">And</span> (Weekday([Kalenderdatum]))&lt;=6) AND ((tbl_Kalender.Art)=iFlag));&quot;
&nbsp;
<span class="TOKEN">Set</span> db = CurrentDb
<span class="TOKEN">Set</span> qdf = db.CreateQueryDef(&quot;qry_Count_Flags&quot;, strSQL)
qdf.Parameters![Krit_Year] = Forms![frm_Betriebskalender]![txt_tbl_Jahr]
qdf.Parameters![iFlag] = intFlag
<span class="TOKEN">Set</span> rst = qdf.OpenRecordset
Count_Flag_Days = AnzahlDS(rst)
qdf.Close
rst.Close
db.Close
<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>

in der Funktion ist nun definitiv kein Tabellenname drin, aber nach der
Konvertierung schmiert Access 00/XP ab.