MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 11.01.2017, 18:12   #1
GünterD
Neuer Benutzer
Neuer Benutzer
Standard Acc2010 - undefinierte Funktion

Hallo Zusammen,

ich möchte aus einer Excel-Anwendung eine Abfrage in einer Access-DB starten.
In der Access-Abfrage ist eine Funktion "aBewertung" wie folgt definiert:
Code:

Public Function aBewertung(iDMC As String, sAG As String) As Variant
Dim rs As New ADODB.Recordset
Dim cVorher As Integer
Dim cNachher As Integer
Dim strSQL As String

aBewertung = "1;99999999;"

If iDMC = "" Or sAG = "" Or Len(sAG) < 2 Then
    Exit Function
End If

cVorher = Nz(DLookup("Vorher", "tbl_Einschleusen", "Schublade like '" & sAG & "'"))
cNachher = Nz(DLookup("Nachher", "tbl_Einschleusen", "Schublade like '" & sAG & "'"))

strSQL = "select idmc, Arbeitsergebnis as AGe,op ,auftrag  from ttbl_Daten where iDMC like '" & iDMC & "' order by OP;"

rs.Open strSQL, ActiveConnection:=CurrentConnection, _
             CursorType:=adOpenKeyset, LockType:=adLockReadOnly

    rs.MoveLast

    If CInt(Right(rs!op, 2)) = cVorher Then
        If CInt(Right(rs!op, 2)) < cNachher Then
            aBewertung = "0" & ";" & rs!Auftrag & ";"
        Else
            aBewertung = "1" & ";" & rs!Auftrag & ";"
        End If
    End If

rs.Close: Set rs = Nothing

End Function
Beim Aufruf aus Excel mit dem SQL-Befehl
Code:

SQL = "SELECT aBewertung('[" & DMC & "]','[" & sAG & "]') AS Bewertung " & _
      "FROM ttbl_Daten " & _
      "GROUP BY aBewertung('[" & DMC & "]','[" & sAG & "]');"
erhalte ich die Fehlermeldung

Zitat:

Laufzeitfehler '-2147217900(80040e14)':
Undefinierte Funktion 'aBewertung' in Ausdruck.

Der Aufruf bzw. die Abfrage in Access
Code:

SELECT aBewertung([DMC],[sAG]) AS Bewertung
FROM ttbl_Daten
GROUP BY aBewertung([DMC],[sAG]);
funktioniert ohne Probleme.
Was mache ich falsch oder wo ist der Denkfehler?

Danke im Voraus
Günter

__________________

Gruß Günter
GünterD ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 18:31   #2
ebs17
MOF Guru
MOF Guru
Standard

Wenn man Abfragen mit Access ausführt, sorgt der Expression Service dafür, dass man innerhalb von Jet-SQL auch Funktionen aus Access (NZ, DLookup u.a.), aus VBA sowie auch eigendefinierte Funktionen (hier aBewertung) anwenden und ausführen kann. Dieser Expression Service wirkt bei Aufruf von Excel aus nicht.

Man müsste also primär versuchen, die Verarbeitungslogik durch reines SQL umzusetzen.
Die verwendete Logik verstehe ich noch nicht, aber in der eigendefinierten Funktion werden selber drei Abfragen ausgeführt. Wenn man die sinnvoll in die richtige Abfrage überführen könnte, würde ich durchaus auch einen Effizienzgewinn erwarten.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende

Geändert von ebs17 (11.01.2017 um 18:42 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 18:41   #3
GünterD
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Eberhard,

ja genau, das ist mein Problem.
Ich bin in SQL-Abfragen nicht so fit und wollte mir eine Krücke bauen.

__________________

Gruß Günter
GünterD ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 18:44   #4
ebs17
MOF Guru
MOF Guru
Standard

Wie ich oben ergänzt hatte, verstehe ich die Logik der Funktion nicht ausreichend, und SQL hat eh eine andere Logik.

Könntest Du an Hand von einigen Daten beschreiben, was da passieren soll?

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.01.2017, 18:11   #5
GünterD
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Danke für dein Angebot Eberhard.
Ich habe versucht mich selbst durchzubeißen.
Dabei hänge ich gerade an folgender SQL-Anweisung
Code:

SELECT Max(ttbl_Daten.OP) AS AGmax, ttbl_Daten.iDMC
FROM ttbl_Daten
GROUP BY ttbl_Daten.iDMC
HAVING (((Max(ttbl_Daten.OP)) Like "107") AND ((ttbl_Daten.iDMC) Like "001340200112017011317263302063"))
ORDER BY Max(ttbl_Daten.OP) DESC;
Wie kann ich ihn abfangen, wenn das Ergebnis NULL ist, d.h. kein Datensatz gefunden wird?

__________________

Gruß Günter
GünterD ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.01.2017, 18:30   #6
ebs17
MOF Guru
MOF Guru
Standard

Wie würde denn das Ergebnis nachfolgend genutzt?

Wenn ein Formular oder Listenfeld mit dieser Datenherkunft leer bleibt, dürfte der User auch ohne vorherige Schulung wissen, was Phase ist.
Ein Recordset könnte man auf EOF prüfen.

NULL selber ist in SQL kein Fehler, sondern ein möglicher Zustand. An der Stelle muss daher nichts abgefangen werden, wohl aber in diversen VBA-Konstellationen.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.01.2017, 10:06   #7
GünterD
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Eberhard,
ich habe mir deine Tips zu Herzen genommen und die "NULL"-Abfrage umgangen.

In Access sieht die Abfrage jetzt so aus
Code:

SELECT IIf((IIf([abf_AGSu].[ssu]-[abf_AGOK].[sok]>0,1,0)=0 And IIf([abf_AGmax].[AGmax]=[sAG],0,1)=0),0,1) AS eST, abf_AGmax.Auftrag
FROM (abf_AGOK INNER JOIN abf_AGSu ON abf_AGOK.iDMC = abf_AGSu.iDMC) INNER JOIN abf_AGmax ON abf_AGSu.iDMC = abf_AGmax.iDMC
GROUP BY IIf((IIf([abf_AGSu].[ssu]-[abf_AGOK].[sok]>0,1,0)=0 And IIf([abf_AGmax].[AGmax]=[sAG],0,1)=0),0,1), abf_AGmax.Auftrag, abf_AGOK.iDMC
HAVING (((abf_AGOK.iDMC) Like [DMC]));
Sie funktioniert auch ohne Probleme.
Den Code habe ich jetzt in Excel wie folgt übertragen.
Code:

SQL = "SELECT IIf((IIf([abf_AGSu].[ssu]-[abf_AGOK].[sok]>0,1,0)=0 And IIf([abf_AGmax].[AGmax]='" & sAG & "',0,1)=0),0,1) AS eST, abf_AGmax.Auftrag " & _
"FROM (abf_AGOK INNER JOIN abf_AGSu ON abf_AGOK.iDMC = abf_AGSu.iDMC) INNER JOIN abf_AGmax ON abf_AGSu.iDMC = abf_AGmax.iDMC " & _
"GROUP BY IIf((IIf([abf_AGSu].[ssu]-[abf_AGOK].[sok]>0,1,0)=0 And IIf([abf_AGmax].[AGmax]=[sAG],0,1)=0),0,1), abf_AGmax.Auftrag, abf_AGOK.iDMC " & _
"HAVING (((abf_AGOK.iDMC) Like '" & DMC & "'));"
Hier bekomme ich die Meldung

Zitat:

Laufzeitfehler ' -2147217887 (80040e21)':
In der Abfrage ist der angegebene Ausdruck
IIf(IIf([abf _AGSu]. [ssu]-[abf _AGOK] . [sok] >0, 1,0)=0 And
IIf([abf _AGmax]. [AGmax] ='2030',0, 1)=0,0, 1)" nicht als Bestandteil einer
Aggregatfunktion enthalten.

Hast eine Tipp warum es nicht funktioniert?
Danke im Voraus.

__________________

Gruß Günter
GünterD ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.01.2017, 10:55   #8
ebs17
MOF Guru
MOF Guru
Standard

Mein Hinweis war nicht, in einer Abfrage NULL zu vermeiden.

Zitat:

Hast eine Tipp warum es nicht funktioniert?

Nur eine Vermutung. Ich halte es für möglich, dass der SQL-Intergreter die IIF-Kaskaden in Verbindung mit dem Gruppieren nicht versteht.

Bezüglich VBA-Umsetzung: Der Ausdruck im SELECT-Teil ist durch den Einbau einer Variablen anders als der Ausdruck beim Gruppieren.
Ob die Umsetzung der obigen Anweisung entspricht, kannst Du mit der Ausgabe ins Direktfenster überprüfen:
Code:

Debug.Print SQL

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.01.2017, 18:08   #9
GünterD
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Eberhard,

habe es jetzt hinbekommen indem ich die "IIF"'s vereinfacht habe.
Danke

__________________

Gruß Günter
GünterD ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.