SQL Abfrage lässt sich nicht importieren (Fehler: Enthält evtl. nicht unterstützte Parameter oder Funktionen)

JanaMeinel

Mitglied
Teammitglied
Sehr geehrte Sage-AppDesigner Profis,

beim Versuch folgende SQL-Abfrage in den AppDesigner (Version 9.0.4692.0) zu importieren bekomme ich folgenden Fehler:

Fehler: Die Abfrage kann nicht graphisch dargestellt werden. Sie enthält evtl. nicht unterstützte Parameter oder Funktionen.

Die Abfrage enthält jedoch keinerlei Besonderheiten. Es ist eine einfache SQL-Abfrage über mehrere Tabellen, verbunden durch JOIN.

SELECT KHKArtikel.Artikelnummer AS Artikelnummer, KHKArtikel.Bezeichnung1 AS Bezeichnung1, KHKArtikel.Verkaufsmengeneinheit AS Verkaufsmengeneinheit, SUM(KHKVKVorgaengePositionen.GGGeliefert) AS 'LS-Bestand ohne RE', KHKLagerplatzbestaende.Lagerkennung AS Lager, SUM(KHKLagerplatzbestaende.Bestand) AS Lagerbestand, SUM(KHKVKVorgaengePositionen.GGGeliefert) + Sum(KHKLagerplatzbestaende.Bestand) AS 'Lagerbestand gesamt' FROM KHKAdressen INNER JOIN KHKKontokorrent ON KHKAdressen.Adresse = KHKKontokorrent.Adresse AND KHKAdressen.Mandant = KHKKontokorrent.Mandant INNER JOIN KHKVKVorgaenge INNER JOIN KHKVKVorgaengePositionen ON KHKVKVorgaengePositionen.Mandant = KHKVKVorgaenge.Mandant AND KHKVKVorgaengePositionen.VorID = KHKVKVorgaenge.VorID INNER JOIN KHKVKBelegePositionen ON KHKVKBelegePositionen.Mandant = KHKVKVorgaengePositionen.Mandant AND KHKVKBelegePositionen.VorPosID = KHKVKVorgaengePositionen.VorPosID INNER JOIN KHKVKBelege ON KHKVKBelegePositionen.Mandant = KHKVKBelege.Mandant AND KHKVKBelegePositionen.BelID = KHKVKBelege.BelID AND KHKVKBelege.Belegkennzeichen IN ( SELECT Kennzeichen FROM KHKVKBelegarten WHERE (GGGeliefert = - 1) AND (GGGeliefertWirkung = 1) AND (GGRetour = 0) AND (GGBerechnet = 0)) INNER JOIN KHKArtikel ON KHKVKBelegePositionen.Mandant = KHKArtikel.Mandant AND KHKVKBelegePositionen.Artikelnummer = KHKArtikel.Artikelnummer INNER JOIN KHKVariantenAnzeigeTexte INNER JOIN KHKArtikelVarianten ON KHKVariantenAnzeigeTexte.Mandant = KHKArtikelVarianten.Mandant AND KHKVariantenAnzeigeTexte.AuspraegungID = KHKArtikelVarianten.AuspraegungID ON KHKVKBelegePositionen.Artikelnummer = KHKArtikelVarianten.Artikelnummer AND KHKVKBelegePositionen.Mandant = KHKArtikelVarianten.Mandant AND KHKVKBelegePositionen.AuspraegungID = KHKArtikelVarianten.AuspraegungID ON KHKKontokorrent.Mandant = KHKVKBelege.Mandant AND KHKKontokorrent.Kto = KHKVKBelege.A0Empfaenger INNER JOIN KHKLagerplatzbestaende ON KHKArtikel.Artikelnummer = KHKLagerplatzbestaende.Artikelnummer AND KHKArtikel.Mandant = KHKLagerplatzbestaende.Mandant WHERE (KHKVKVorgaenge.Mandant = 1) AND ISNULL(KHKVKVorgaengePositionen.GGGeliefert, 0) > 0 AND (ISNULL(KHKVKVorgaengePositionen.GGGeliefert, 0) - ISNULL(KHKVKVorgaengePositionen.GGRetour, 0)) > ISNULL(KHKVKVorgaengePositionen.GGBerechnet, 0) AND ISNULL(KHKVKVorgaenge.GGErfuellt, 0) IN (0) GROUP BY KHKArtikel.Artikelnummer, KHKArtikel.Bezeichnung1, KHKArtikel.Bezeichnung2, KHKArtikel.Verkaufsmengeneinheit, KHKLagerplatzbestaende.Lagerkennung ORDER BY Artikelnummer

Dieser Fehler betrifft im Weiteren auch bereits im AppDesigner vorhandene SQLs. Diese lassen sich über die Vorschau zwar korrekt ausführen, jedoch nicht mehr bearbeiten. Der Quellcode wird nur teilweise angezeigt (SELECT Anweisung fehlt komplett).

Der Trace-Log wirft beim protkollieren folgenden Fehler:
System.InvalidCastException: Das Objekt des Typs "ActiveQueryBuilder.Core.DataSourceGroup" kann nicht in Typ "ActiveQueryBuilder.Core.DataSource" umgewandelt werden. bei ActiveQueryBuilder.Core.Link.?(DataSourceBase ?) bei ActiveQueryBuilder.Core.Link.LoadDataSourceList(DataSourceBase dataSourceOwner) bei ActiveQueryBuilder.Core.Link.SetLinkParamsInternal(DataSourceBase dataSourceOwner, SQLExpressionItem ast, LinkPlace place, Boolean newFlag) bei ActiveQueryBuilder.Core.DataSourceBase.?(SQLExpressionItem ?, List`1 ?) bei ActiveQueryBuilder.Core.DataSourceBase.?(SQLExpressionItem ?, List`1 ?) bei ActiveQueryBuilder.Core.DataSourceBase.AddLinksFromExpression(SQLExpressionItem expressionItem) bei ActiveQueryBuilder.Core.DataSourceBase.LoadJoins() bei ActiveQueryBuilder.Core.DataSourceGroup.LoadJoins() bei ActiveQueryBuilder.Core.DataSourceGroup.LoadJoins() bei ActiveQueryBuilder.Core.UnionSubQuery.LoadFromAST(SQLSubQuerySelectExpression subQuery) bei ActiveQueryBuilder.Core.UnionGroup.AddAST(SQLSubQuerySelectExpression unionSubQuery) bei ActiveQueryBuilder.Core.UnionGroup.LoadFromAST(SQLSubQueryExpressions subQuery) bei ActiveQueryBuilder.Core.SubQuery.LoadFromAST(SQLSubSelectStatement subQuery) bei ActiveQueryBuilder.Core.QueryRoot.?() bei ActiveQueryBuilder.Core.QueryRoot.?(String ?) bei Sagede.Shared.AppDesigner.Controls.SageSqlEditorUserControl.UpdateQueryBuilder(String sql, Boolean updateVm) => UpdateQueryBuilder in SageSqlEditorUserControl.xaml.cs(line 412)


System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. bei ActiveQueryBuilder.Core.AstNode.Dispose() bei ActiveQueryBuilder.Core.QueryBase.LoadFromAST(SQLSubQueryExpression astQuery) bei ActiveQueryBuilder.Core.UnionGroup.LoadFromAST(SQLSubQueryExpressions subQuery) bei ActiveQueryBuilder.Core.SubQuery.LoadFromAST(SQLSubSelectStatement subQuery) bei ActiveQueryBuilder.Core.QueryRoot.?() bei ActiveQueryBuilder.Core.QueryRoot.?(String ?) bei Sagede.Shared.AppDesigner.Controls.SageSqlEditorUserControl.UpdateQueryBuilder(String sql, Boolean updateVm) => UpdateQueryBuilder in SageSqlEditorUserControl.xaml.cs(line 412)


Über Tipps und hinweise zur Fehlersuche würde ich mich sehr freuen.

Vielen Dank!
 

Anhänge

  • AppDesignerFehler.txt
    2,7 KB · Aufrufe: 2
Hallo Jana,

der AppDesigner hat so seine Tücken - kannst du die Abfrage in eine View packen? Die Abfrage der View sollte problemlos funktionieren.

Viele Grüße
Marcel
 
Sicher würde ein View in diesem Falle als Workaround funktionieren.
Jedoch können wir nicht mehr auf unsere bestehenden Abfragen zugreifen.
(Nur noch über den SQL-Profiler)

Aber das kann ja beides nicht die Lösung sein... Zumal es ja schon mal funktioniert hat.

Trotzdem danke für den Tipp!
 
Vollkommen richtig, das kann nicht die Lösung sein, wenn es vorher schon funktioniert hatte. In diesem Fall am besten mittels Ticket bei Sage melden, das klingt nach einem Fehler im AppDesigner.
 
Das Control, das im AppDesigner verwendet wird, ist nicht so mächtig, wie ein MS SQL Server Management Studio und nicht jede komplexe Abfrage wird funktionieren. In diesem Fall scheitert es am Join der Vorgänge. Wenn Sie die Abfrage vereinfachen und die problematischen Joins umstellen, können Sie mit dem SQL-Editor des AppDesigners arbeiten:

SELECT
KHKArtikel.Artikelnummer,
KHKArtikel.Bezeichnung1,
KHKArtikel.Bezeichnung2,
KHKArtikel.Verkaufsmengeneinheit,
SUM(KHKVKVorgaengePositionen.GGGeliefert) AS LagerBestandOhneRE,
KHKLagerplatzbestaende.Lagerkennung AS Lager,
SUM(KHKLagerplatzbestaende.Bestand) AS Lagerbestand,
SUM(KHKVKVorgaengePositionen.GGGeliefert) + SUM(KHKLagerplatzbestaende.Bestand) AS LagerbestandGesamt
FROM KHKVKVorgaengePositionen
INNER JOIN
KHKVKVorgaenge
ON KHKVKVorgaengePositionen.Mandant = KHKVKVorgaenge.Mandant AND
KHKVKVorgaengePositionen.VorID = KHKVKVorgaenge.VorID
INNER JOIN
KHKVKBelegePositionen
ON KHKVKVorgaengePositionen.VorPosID = KHKVKBelegePositionen.BelPosID AND
KHKVKVorgaengePositionen.Mandant = KHKVKBelegePositionen.Mandant
INNER JOIN
KHKArtikel
ON KHKVKBelegePositionen.Mandant = KHKArtikel.Mandant AND
KHKVKBelegePositionen.Artikelnummer = KHKArtikel.Artikelnummer
INNER JOIN
KHKArtikelVarianten
ON
KHKVKBelegePositionen.Artikelnummer = KHKArtikelVarianten.Artikelnummer AND
KHKVKBelegePositionen.Mandant = KHKArtikelVarianten.Mandant AND
KHKVKBelegePositionen.AuspraegungID = KHKArtikelVarianten.AuspraegungID
INNER JOIN
KHKVariantenAnzeigeTexte
ON
KHKArtikelVarianten.AuspraegungID = KHKVariantenAnzeigeTexte.AuspraegungID AND
KHKArtikelVarianten.Mandant = KHKVariantenAnzeigeTexte.Mandant
INNER JOIN
KHKLagerplatzbestaende
ON KHKVKVorgaengePositionen.Mandant = KHKLagerplatzbestaende.Mandant AND
KHKVKVorgaengePositionen.Artikelnummer = KHKLagerplatzbestaende.Artikelnummer AND
KHKVKVorgaengePositionen.AuspraegungID = KHKLagerplatzbestaende.AuspraegungID
INNER JOIN
KHKKontokorrent
ON KHKVKVorgaenge.Mandant = KHKKontokorrent.Mandant AND KHKVKVorgaenge.Empfaenger = KHKKontokorrent.Kto
INNER JOIN
KHKAdressen
ON KHKKontokorrent.Mandant = KHKAdressen.Mandant AND KHKKontokorrent.Adresse = KHKAdressen.Adresse
INNER JOIN
KHKVKBelege
ON KHKVKBelegePositionen.BelID = KHKVKBelege.BelID AND
KHKVKBelegePositionen.Mandant = KHKVKBelege.Mandant
WHERE
(KHKVKVorgaengePositionen.Mandant = @Mandant) AND
(ISNULL(KHKVKVorgaengePositionen.GGGeliefert, 0) > 0) AND
(ISNULL(KHKVKVorgaengePositionen.GGGeliefert, 0) -
ISNULL(KHKVKVorgaengePositionen.GGRetour, 0) >
ISNULL(KHKVKVorgaengePositionen.GGBerechnet, 0)) AND
(ISNULL(KHKVKVorgaenge.GGErfuellt, 0) IN (0)) AND
(KHKVKBelege.Belegkennzeichen IN
(SELECT Kennzeichen FROM KHKVKBelegarten WHERE
GGGeliefert = - 1 AND GGGeliefertWirkung = 1 AND GGRetour = 0 AND GGBerechnet = 0))
GROUP BY KHKArtikel.Artikelnummer, KHKArtikel.Bezeichnung1, KHKArtikel.Bezeichnung2,
KHKArtikel.Verkaufsmengeneinheit, KHKLagerplatzbestaende.Lagerkennung

Ich hoffe ich habe den Sinn der Abfrage beibehalten.
Achten Sie bitte darauf, dass Aliasnamen nicht in Anführungsstrichen stehen, denn der Alias wird zum Namen der Felder in den Datenquellen. Leerzeichen und Zahlen sind daher nicht zulässig.
 
Die originale Abfrage konnte man ganz sicher noch nie im SQL-Editor des AppDesigner bearbeiten.
Können Sie bitte diese Lösung in der originalen Form an den Customer Support weitergeben.
Aus der Abfrage kann über "Abfrage importieren" eine Datenquelle angelegt werden.
Editieren über den SQL-Editor wird nicht funktionieren. Man kann jedoch alle Bestandteile der Abfrage in den Eigenschaften der Datenquelle einzeln bearbeiten.
 
Zuletzt bearbeitet:
Das Control, das im AppDesigner verwendet wird, ist nicht so mächtig, wie ein MS SQL Server Management Studio und nicht jede komplexe Abfrage wird funktionieren. In diesem Fall scheitert es am Join der Vorgänge. Wenn Sie die Abfrage vereinfachen und die problematischen Joins umstellen, können Sie mit dem SQL-Editor des AppDesigners arbeiten:

Ich hoffe ich habe den Sinn der Abfrage beibehalten.
Achten Sie bitte darauf, dass Aliasnamen nicht in Anführungsstrichen stehen, denn der Alias wird zum Namen der Felder in den Datenquellen. Leerzeichen und Zahlen sind daher nicht zulässig.
Vielen Dank für die Antwort und die Mühe! Ich hatte befürchtet, dass es an den JOINS liegt. Ich war schon dabei das SQL aufzulösen, das brachte leider nicht den gewünschten Erfolg und die Unsicherheit stieg, ob das jemals im AppDesigner laufen würde. Ich teste die Abfrage mal noch durch. Kleine Korrekturen sollten kein Problem sein.


Die originale Abfrage konnte man ganz sicher noch nie im SQL-Editor des AppDesigner bearbeiten.
Können Sie bitte diese Lösung in der originalen Form an den Customer Support weitergeben.
Aus der Abfrage kann über "Abfrage importieren" eine Datenquelle angelegt werden.
Editieren über den SQL-Editor wird nicht funktionieren. Man kann jedoch alle Bestandteile der Abfrage in den Eigenschaften der Datenquelle einzeln bearbeiten.
Das Problem betrifft eine andere Abfrage, welche ich importiert hatte.
Ich habe die originalen SQLs noch da. Wir prüfen mal, ob wir diese noch in den AppDesigner über "Abfrage importieren" neu anlegen können. Dann müssten wir zwar alle Elemente neu an die neue Datenquelle binden, aber das Problem wäre gelöst.

Kann man eine bestehende SQL-Abfrage ersetzen? Sozusagen "Abfrage auf eine bestehende Datenquelle importieren"?

Vielen Dank für die Unterstützung!
 
Hallo @JanaMeinel,

ich habe mir deine Abfrage im Detail nicht angesehen, jedoch hilft es mir manchmal, wenn ich die Abfrage in ein Sub-Select packe. Zuletzt habe ich Gebrauch davon gemacht, als ich mit einem UNION gearbeitet habe. Direkt im AppDesigner funktionierte der UNION nicht, verpackt in einem Sub-Select schon.

Mit dem Sub-Select arbeitet Sage an einigen Stellen auch. Zum Beispiel in der Datenquelle vom Element "Offene VK-Lieferungen".

Beispiel

SELECT *
FROM (<<hier deine Abfrage einfügen>>)

Viele Grüße
Michael Koch
 
Zuletzt bearbeitet:
Kann man eine bestehende SQL-Abfrage ersetzen? Sozusagen "Abfrage auf eine bestehende Datenquelle importieren"?
Diese Möglichkeit gibt es nicht, aber sie können Ihre Lösung über "Exportieren" sichern, dann die Datenquelle löschen und neu importieren.
Die Vorlage sollte man dann aber so anpassen, dass die Feldnamen (Aliase) schon so benennen, wie sie dann in der Datenquelle heißen sollen.
 
Zurück
Oben