MS-Office-Forum

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

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 31.12.2018, 11:56   #1
Markus2018
Neuer Benutzer
Neuer Benutzer
Standard T-SQL : MSSQL 2016 - MSSQL VBA Funktion in UPDATE String ausführen

Hallo,

ich habe das Problem dass ich das Ergebnis einer VBA Funktion nicht in meine Spalte der SQL DB einfügen kann.

Laut einem älteren Post von mir ist es möglich eine VBA Funktion in einem SQL Update String auszuführen.

https://www.ms-office-forum.net/foru...79#post1897779

Ich arbeite in VisualStudio und die Funktion steht in Get_Geodaten.vb und wird über ModulTest.aspx über einen Button aufgerufen

Code:

'Meine DB
Dim con As SqlConnection = New SqlConnection("Data Source=DEVWIN10sqlexpress;Initial Catalog=Kundensuche;Integrated Security=True")

'SQL Str
Dim sqlStr1 As SqlCommand = New SqlCommand("UPDATE [Kundensuche].[dbo].[KDNR_ohne_Geodaten] SET [KDNR_ohne_Geodaten].[Lng] = Get_Status([KDNR_ohne_Geodaten].[Adresse])", con)


   con.Open()
   sqlStr1.ExecuteNonQuery()
   con.Close()
Code:

  Public Function Get_Status(Get_StringAdresse As String)

        Dim StringAdresse As String
        StringAdresse = Get_StringAdresse

        Dim request As HttpWebRequest
        Dim response As HttpWebResponse = Nothing
        Dim reader As StreamReader

        request = DirectCast(WebRequest.Create("https://maps.googleapis.com/maps/api/geocode/json?address=" & StringAdresse & "&key=GOOGLE_API_KEY"), HttpWebRequest)

        response = DirectCast(request.GetResponse(), HttpWebResponse)
        reader = New StreamReader(response.GetResponseStream())

        Dim rawresp As String
        rawresp = reader.ReadToEnd()

        Dim jResults As Object = JObject.Parse(rawresp)

        Get_Status = jResults("status")

        Debug.Print(Get_Status)

    End Function
Die Funktion einzeln funktioniert - wenn ich sie in dem SQL String verwende erhalte ich folgenden Fehler:

Get_Status wird nicht als Name einer integrierten Funktion erkannt.

Nouba meinte in dem vorherigen Beitrag dass ich das mit jeder SQL DB machen kann.
Markus2018 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 31.12.2018, 13:53   #2
hcscherzer
MOF Guru
MOF Guru
Standard

Wenn die Function in einem VBA Modul gespeichert ist und die SQL Anweisung zum SQL Server geschickt wird, ist das kein Wunder, dass die Function dort nicht ausgeführt wird, denn der SQL Server kennt sie nicht.

Die einzige Möglichkeit, die mir einfällt, wäre, die Function auf dem SQL Server anzulegen.
Allerdings bin ich mir da nicht sicher, ob und wie da der Webservice aufgerufen werden kann.

Nebenbei:

Zitat: von Markus

Laut einem älteren Post von mir ist es möglich ...
Nouba meinte in dem vorherigen Beitrag ...

Beides lese ich aus dem von Dir zitierten Thread nicht heraus.

Und noch etwas:

Zitat:

Ich arbeite in VisualStudio

Dann ist die Sprache Deiner Wahl nicht VBA sondern VB ... ein kleiner aber feiner Unterschied.

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.

Geändert von hcscherzer (31.12.2018 um 14:00 Uhr).
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 31.12.2018, 15:51   #3
Markus2018
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Wäre es eine Möglichkeit ein Recordset mit Select * from Tabelle zu füllen und dann jedes einzelne Element updaten?

Das andere wäre ein Dlookup aber das wäre sehr langsam oder?

Übrigens ich keine VB.net sry ^^
Die Funktion auf dem SQL Server anzulegen wird scheinbar auch nicht möglich sein.

Was ist denn der genauer Unterschied zwischen VB und VBA?��

Zu dem anderen Threads hier die Zeile die ich meinte:
[code]

Dim strSQL As String
strSQL = "UPDATE Suchergebnis_filtered_by_table_and_order_type " & _
"SET Abstand = Round(CalcDistance(" & lngStadt & ', ' & latStadt & ', Lng, Lat),2) " & _
"WHERE Betrag > " & umsatzForm
CurrentDb.Execute strSQL, dbFailOnError

[code]
Markus2018 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 31.12.2018, 20:09   #4
hcscherzer
MOF Guru
MOF Guru
Standard

Mit einem Recordset ist das problemlos möglich.

Auch Lookup() kennt der SQL Server nicht.

Der Unterschied zwischen VB.Net und VBA ist, dass es zwei unterschiedliche Basic Dialekte sind. VB.Net ist vom Objektmodell viel umfangreicher, kennt echte OOP (die in VBA nur rudimentär angelegt ist) und solche wunderbaren Dinge wie DataSet, DataTable etc., die in VBA überhaupt nicht bekannt sind.

Im Code-Beispiel erkenne ich den Funktionsaufruf von ROUND(); das ist aber beileibe keine benutzerdefinierte sondern eine Standardfunction, die sowohl in VB als auch in SQL definiert ist. Und dann gibt es die Function CalcDistance(), die sicher von Ihnen geschrieben ist. Aber der maßgebliche Unterschied sollte Ihnen auch auffallen: der SQL Befehl wird nicht gegen eine externe DB auf einem SQL Server sondern gegen die lokale CurrentDb gefeuert. Und da sind selbstverständlich eingebundene lokal definierte Functions kein Problem.

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 01.01.2019, 18:59   #5
stendate
MOF User
MOF User
Standard

Hallo,

Zitat: von Markus2018 Beitrag anzeigen

Die Funktion auf dem SQL Server anzulegen wird scheinbar auch nicht möglich sein.

doch, das sollte möglich sein:

Code:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Example:
/*
	select dbo.Get_Status('Eine Adresse (URL-Encoded)')
*/
CREATE FUNCTION Get_Status
(
	@Get_StringAdresse VARCHAR(255)
)
RETURNS VARCHAR(255)
AS
BEGIN
	DECLARE @result VARCHAR(255) = '';
	DECLARE @queryString VARCHAR(255) = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + @Get_StringAdresse + '&key=GOOGLE_API_KEY';
	
	DECLARE @MSXML2_XMLHTTP as Int;
	DECLARE @ResponseText as Varchar(8000);
	DECLARE @ResponseStatus INT = 0;

	EXEC sp_OACreate 'MSXML2.XMLHTTP', @MSXML2_XMLHTTP OUT;
	EXEC sp_OAMethod @MSXML2_XMLHTTP, 'open', NULL, 'get', @queryString, 'false'
	EXEC sp_OAMethod @MSXML2_XMLHTTP, 'send'
	EXEC sp_OAMethod @MSXML2_XMLHTTP, 'ResponseText', @ResponseText OUTPUT
	EXEC sp_OAMethod @MSXML2_XMLHTTP, 'Status', @ResponseStatus OUTPUT;
	EXEC sp_OADestroy @MSXML2_XMLHTTP

	DECLARE @IsJson BIT = 0;
	IF ISJSON(@ResponseText) = 1 BEGIN
		SET @result = JSON_VALUE(@ResponseText, '$.status')
	END

	RETURN @result;

END
GO

Getestet auf SQL Server 2016.
stendate 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 02:55 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 - 2019, Jelsoft Enterprises Ltd.

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