PDA

Vollständige Version anzeigen : Verknüpfungsfehler


Smmabart
03.03.2005, 11:17
Hallo!

Wenn ich eine Select-Anfrage mache kriege ich einen Laufzeitfehler in dem steht:"Verknüfungsausdruck nicht unterstützt!"
Was hat das zu bedeuten?

Der Code:
SelectAnfrage = "SELECT ABIS_OG_BUCHUNGS_INFO.RECH_COA_ADR_NR, ABIS_OG_ABRECHNUNG.ANR_KST, ABIS_OG_BUCHUNGS_INFO.RECH_DAT_JAHR, ABIS_OG_BUCHUNGS_INFO.AUFT_VARB_ART, Format([ANR_KST],temp) & Right([ANR_JAHR],2) & Format([ANR_LFD],temp1) AS AuftrNr, ABIS_OG_ABRECHNUNG.AUFT_TEIL_NR, ABIS_OG_BUCHUNGS_INFO.RECH_NR, ABIS_OG_BUCHUNGS_INFO.AUFT_RECH_DAT, ABIS_OG_BUCHUNGS_INFO.INSP_RECH_NR, ABIS_OG_BUCHUNGS_INFO.INSP_RECH_DAT, ABIS_OG_BUCHUNGS_INFO.RECH_BRUTTO_BETR_EURO, ABIS_OG_BUCHUNGS_INFO.RECH_BRUTTO_BETR, ABIS_OG_ABRECHNUNG.SCH_NR, ABIS_OG_ABRECHNUNG.OG_SCH_NAME, ABIS_OG_ABRECHNUNG.SCHIFF_TYP, ABIS_OG_ABRECHNUNG.AUFT_BUCH_TEXT, ABIS_OG_ABRECHNUNG_DETAIL.UMS_KENN, ABIS_OG_ABRECHNUNG_DETAIL.UMS_ART, ABIS_OG_ABRECHNUNG_DETAIL.UMS_KEY, ABIS_OG_ABRECHNUNG_DETAIL.RECH_HV_BETR_EURO, ABIS_OG_ABRECHNUNG_DETAIL.RECH_HV_BETR_EURO_ANZ, ABIS_OG_ABRECHNUNG_DETAIL.RECH_BETR, ABIS_OG_ABRECHNUNG_DETAIL.RECH_BETR_ANZ, ABIS_OG_ABRECHNUNG.AUFT_BES_ORT," & _
"ABIS_OG_ABRECHNUNG.AUFT_BES_BIS_DAT, ABIS_OG_BUCHUNGS_INFO.RECH_WAE,[TB Waehrungsliste INR].[Kurs EUR x KURS], [RECH_HV_BETR_EURO]*[Kurs EUR x KURS] AS RECH_BETR_INR INTO [Test 2005 - 0039 und 0091]" & _
"FROM ((ABIS_OG_BUCHUNGS_INFO INNER JOIN ABIS_OG_ABRECHNUNG ON ABIS_OG_BUCHUNGS_INFO.RECHNUNG_ID = ABIS_OG_ABRECHNUNG.RECHNUNG_ID) INNER JOIN ABIS_OG_ABRECHNUNG_DETAIL ON (ABIS_OG_ABRECHNUNG.AUFTRAG_ID = ABIS_OG_ABRECHNUNG_DETAIL.AUFTRAG_ID) AND (ABIS_OG_ABRECHNUNG.RECHNUNG_ID = ABIS_OG_ABRECHNUNG_DETAIL.RECHNUNG_ID)) LEFT JOIN [TB Waehrungsliste INR] ON ABIS_OG_ABRECHNUNG.AUFT_BES_BIS_DAT = [TB Waehrungsliste INR].Datum" & _
"WHERE (((ABIS_OG_ABRECHNUNG.ANR_KST) = 39 Or (ABIS_OG_ABRECHNUNG.ANR_KST) = 91) And ((ABIS_OG_BUCHUNGS_INFO.AUFT_RECH_DAT) >= #2/1/2005# And (ABIS_OG_BUCHUNGS_INFO.AUFT_RECH_DAT) <= #2/28/2005#) And ((ABIS_OG_ABRECHNUNG_DETAIL.UMS_ART) <> temp2) And ((ABIS_OG_ABRECHNUNG_DETAIL.UMS_KEY) > 0))"

Set db = CurrentDb
Set rs = db.OpenRecordset(SelectAnfrage)

Die letzte Zeile wird als Fehler angesehen (gelb markiert)!

genschman
03.03.2005, 11:21
Hi,

ich könnte mir vorstellen, dass da einige Leerzeichen in dem Select fehlen.
Außerden muss in der Openrecordset-Anweisung, wenn sie sich nicht auf eine existierende Tabelle bezieht, der Parameter dbOpenDynaset verwendet werden!
Set rs = db.OpenRecordset(SelectAnfrage, dbOpenDynaset)

Smmabart
03.03.2005, 11:32
Das dbOpenDynaset habe ich noch nie benutzt und es hat auch immer ohne funktioniert.
Die Select-Abfrage ist von Access selbst erstellt worden und wurde nur in die VB_anzeige rüberkopiert.

Ich habe echt keine Ahnung was da falsch ist oder was das überhaupt zu bedeuten hat!

Anne Berg
03.03.2005, 12:17
Nun ja, da hast du dann wohl beim Umbrechen deines Monster-Codes ein paar Leerzeichen verloren ;)

Man kann übrigens bei solch langen Tabellennamen mit Aliasnamen recht nett für Übersicht sorgen ;)

Smmabart
03.03.2005, 12:37
Wie funktioniert das mit AliasNamen???

Anne Berg
03.03.2005, 12:44
Das könnte dann z.B. so aussehen:SELECT B.RECH_COA_ADR_NR, A.ANR_KST, B.RECH_DAT_JAHR, B.AUFT_VARB_ART,
Format([ANR_KST],temp) & Right([ANR_JAHR],2) & Format([ANR_LFD],temp1) AS AuftrNr,
A.AUFT_TEIL_NR, B.RECH_NR, B.AUFT_RECH_DAT, B.INSP_RECH_NR,
B.INSP_RECH_DAT, B.RECH_BRUTTO_BETR_EURO, B.RECH_BRUTTO_BETR,
A.SCH_NR, A.OG_SCH_NAME, A.SCHIFF_TYP, A.AUFT_BUCH_TEXT,
D.UMS_KENN, D.UMS_ART, D.UMS_KEY,
D.RECH_HV_BETR_EURO, D.RECH_HV_BETR_EURO_ANZ,
D.RECH_BETR, D.RECH_BETR_ANZ,
A.AUFT_BES_ORT, A.AUFT_BES_BIS_DAT,
B.RECH_WAE,
[TB Waehrungsliste INR].[Kurs EUR x KURS],
[RECH_HV_BETR_EURO]*[Kurs EUR x KURS] AS RECH_BETR_INR
INTO [Test 2005 - 0039 und 0091]
FROM ((ABIS_OG_BUCHUNGS_INFO AS B
INNER JOIN ABIS_OG_ABRECHNUNG AS A
ON B.RECHNUNG_ID = A.RECHNUNG_ID)
INNER JOIN ABIS_OG_ABRECHNUNG_DETAIL AS D
ON (A.AUFTRAG_ID = D.AUFTRAG_ID)
AND (A.RECHNUNG_ID = D.RECHNUNG_ID))
LEFT JOIN [TB Waehrungsliste INR]
ON A.AUFT_BES_BIS_DAT = [TB Waehrungsliste INR].Datum
WHERE (((A.ANR_KST) = 39 Or (A.ANR_KST) = 91)
And ((B.AUFT_RECH_DAT) >= #2/1/2005#
And (B.AUFT_RECH_DAT) <= #2/28/2005#)
And ((D.UMS_ART) <> temp2)
And ((D.UMS_KEY) > 0))

Smmabart
03.03.2005, 13:06
Da geht gar nichts :(
Im Überwachungsfenster zeigt er mir an, dass er den string irgendwo abschneidet, nicht bei einem Absatz oder so. Einfach wahllos in der ersten Zeile!
Hat denn keiner eine Idee?

Anne Berg
03.03.2005, 13:18
Was hast du denn jetzt mit dem Code gemacht? Und warum verwendest du nicht eine gespeicherte Abfrage? Mit dem "Parameter" (temp2) bekommst du so oder so Ärger ;)

Smmabart
03.03.2005, 13:26
Ich hatte den Code wie Du ihn geschrieben hast mal reinkopiert und ausprobiert.

Die temps habe ich schon geändert.
Das Problem ist, dass die Select-Anfrage als string definiert ist. Dieser kann aber nur 255Zeichen aufnehmen....meine Anfrage hat aber leider 1206 => zuviel :)

Welcher Datentyp kann das schaffen? Wie kann ich meine Abfrage definieren?

Anne Berg
03.03.2005, 13:50
Wie kommst du darauf? Das verstehe ich jetzt nicht :confused:
String (Datentyp)

Ein grundlegender Datentyp, der Zeichen speichert. Eine Variable vom Typ String hat entweder eine feste oder eine variable Länge und enthält ein Zeichen pro Byte. Zeichenfolgen fester Länge werden mit einer feststehenden Länge deklariert und können 1 bis etwa 64 KB Zeichen (2^16) aufnehmen. Zeichenfolgen variabler Länge können eine beliebige Länge bis maximal 2 Milliarden Zeichen (2^31) (ungefähr 64 KB Zeichen [2^16] für Microsoft Windows, Version 3.1 und früher) haben - abzüglich eines kleinen Speicherbereichs zur Speicherverwaltung.

Anne Berg
03.03.2005, 13:52
Ach übrigens, mit dem SQL-Formatter kann man sich etwas umfangreicheren Code wunderbar aufbereiten und sogar VBA-mäßig formatieren lassen! Link (http://www.sqlinform.com/)

Smmabart
03.03.2005, 14:29
Den Link schaue ich mir mal an.
Ich komme darauf, weil ich mir im Überwachungsfenster meinen string angeschaut habe und der bei 255Zeichen abgeschnitten ist. Der String läßt sich also nur mit 255 Zeichen füllen.
Ich denke es liegt nicht an der Anfrage sondern einfach an der Länge die der String aufnehemen kann.
Jetzt bin ich auf der Suche nach einer Variable, wo ich meine Zeichen unterkriege! :)

Anne Berg
03.03.2005, 23:24
... aber den Beitrag #10 hast du auch gelesen, oder :confused:

Smmabart
04.03.2005, 07:41
Moin Moin!

Ja, den habe ich gelesen und auch in der Hilfe und in Büchern gefunden. Trotzdem ist es eben so, dass beim anzeigen des strings im Überwachungsfenster eine Menge fehlt. Access hört einfach mittendrin auf.
Ich habe dann mal den ausgelesenen unvollständigen string in WORD kopiert und die Zeichen zählen lassen und sie da, 253.
Woran kann sowas liegen? Ist mit der Anfrage was nicht korrekt? Bei mir liegt die Vermutung nur nahe, dass der string einfach nicht alles aufnehmen kann.

Nouba
04.03.2005, 07:47
Dann lasse Dir die Zeichenkette mal mit Debug.Print SelectAnfrage ausgeben, prüfe ob er abgeschnitten wird und wenn nicht, kopiere ihn in die SQL-Ansicht einer neuen Abfrage zum Testen.

Smmabart
04.03.2005, 08:06
Hallo Nouba!

Also, ich habe mal das gemacht was du gesagt hast und die Anfrgae ist im Debug.Print vollständig und funktiuniert auch in einer neuen Testabfrage.
Nun stellt sich die Frage warum läßt es sich nicht als Recordset öffnen?

Nouba
04.03.2005, 08:34
In VBA dürfte IMHO bei ~ 2k Zeichenlänge Schluß für Abfragetexte im Speicher sein. Da Zeichenketten als Unicode vorliegen, dürfte in Realität bei ~ 1000 Zeichen die Grenze erreicht sein. Ich würde deshalb die Abfrage in der DB speichern, wo dieses Limit nicht gilt.

Smmabart
04.03.2005, 08:38
Ich glaube ich habe jetzt den Fehler entdeckt:
Das ist doch eine SELECT INTO abfrage und die wird doch automatisch in einer Tabelle gespeichert. Dann kann ich sie ja nicht mehr als Recordset öffnen oder? Wenn ich da einen Denkfehler mache müßt ihr das sagen. Aber für mich ist dann diese Operation unlogisch! Oder???

Arne Dieckmann
04.03.2005, 08:46
Da hast du wohl recht, und alle anderen hatten ebenfalls Tomaten auf den Augen - bei dem SQL-Monster aber auch kein Wunder. Dann musst du den SQL-String eben mit Execute ausführen:
Dim db as Database
Dim selectAnfrage as String

Set db = CurrentDb
selectAnfrage="..." 'das spare ich mir jetzt ...
db.Execute selectAnfrage, dbFailOnError

Smmabart
04.03.2005, 09:03
OK! Dann möchte ich mich vielmals bei allen bedanken für ihre Geduld und Hilfe!
Ein dickes Lob an Euch, ihr seid spitze! :)

Der endgültige Code lautet nun:

SelectAnfrage = "SELECT ABIS_OG_BUCHUNGS_INFO.RECH_COA_ADR_NR, ABIS_OG_ABRECHNUNG.ANR_KST, ABIS_OG_BUCHUNGS_INFO.RECH_DAT_JAHR, ABIS_OG_BUCHUNGS_INFO.AUFT_VARB_ART, Format([ANR_KST],'0000 ') & Right([ANR_JAHR],2) & Format([ANR_LFD],' 00000') AS AuftrNr, ABIS_OG_ABRECHNUNG.AUFT_TEIL_NR, ABIS_OG_BUCHUNGS_INFO.RECH_NR, ABIS_OG_BUCHUNGS_INFO.AUFT_RECH_DAT, ABIS_OG_BUCHUNGS_INFO.INSP_RECH_NR, ABIS_OG_BUCHUNGS_INFO.INSP_RECH_DAT, ABIS_OG_BUCHUNGS_INFO.RECH_BRUTTO_BETR_EURO, ABIS_OG_BUCHUNGS_INFO.RECH_BRUTTO_BETR, ABIS_OG_ABRECHNUNG.SCH_NR, ABIS_OG_ABRECHNUNG.OG_SCH_NAME, ABIS_OG_ABRECHNUNG.SCHIFF_TYP, ABIS_OG_ABRECHNUNG.AUFT_BUCH_TEXT, ABIS_OG_ABRECHNUNG_DETAIL.UMS_KENN, ABIS_OG_ABRECHNUNG_DETAIL.UMS_ART, ABIS_OG_ABRECHNUNG_DETAIL.UMS_KEY, ABIS_OG_ABRECHNUNG_DETAIL.RECH_HV_BETR_EURO, ABIS_OG_ABRECHNUNG_DETAIL.RECH_HV_BETR_EURO_ANZ, ABIS_OG_ABRECHNUNG_DETAIL.RECH_BETR, ABIS_OG_ABRECHNUNG_DETAIL.RECH_BETR_ANZ, ABIS_OG_ABRECHNUNG.AUFT_BES_ORT, ABIS_OG_ABRECHNUNG.AUFT_BES_BIS_DAT, ABIS_OG_BUCHUNGS_INFO.RECH_WAE, " & _
"[TB Waehrungsliste INR].[Kurs EUR x KURS], [RECH_HV_BETR_EURO]*[Kurs EUR x KURS] AS RECH_BETR_INR INTO [TEST] " & _
"FROM ((ABIS_OG_BUCHUNGS_INFO INNER JOIN ABIS_OG_ABRECHNUNG ON ABIS_OG_BUCHUNGS_INFO.RECHNUNG_ID = ABIS_OG_ABRECHNUNG.RECHNUNG_ID) INNER JOIN ABIS_OG_ABRECHNUNG_DETAIL ON (ABIS_OG_ABRECHNUNG.RECHNUNG_ID = ABIS_OG_ABRECHNUNG_DETAIL.RECHNUNG_ID) AND (ABIS_OG_ABRECHNUNG.AUFTRAG_ID = ABIS_OG_ABRECHNUNG_DETAIL.AUFTRAG_ID)) LEFT JOIN [TB Waehrungsliste INR] ON ABIS_OG_ABRECHNUNG.AUFT_BES_BIS_DAT = [TB Waehrungsliste INR].Datum " & _
"WHERE (((ABIS_OG_ABRECHNUNG.ANR_KST)=39 Or (ABIS_OG_ABRECHNUNG.ANR_KST)=91) AND ((ABIS_OG_BUCHUNGS_INFO.AUFT_RECH_DAT)>=#2/1/2005# And (ABIS_OG_BUCHUNGS_INFO.AUFT_RECH_DAT)<=#2/28/2005#) AND ((ABIS_OG_ABRECHNUNG_DETAIL.UMS_ART)<>'BF') AND ((ABIS_OG_ABRECHNUNG_DETAIL.UMS_KEY)>0));"

Debug.Print SelectAnfrage

Set db = CurrentDb
db.Execute SelectAnfrage, dbFailOnError

RefreshDatabaseWindow