Das Notes Forum
Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: buzzy666 am 20.08.14 - 14:10:14
-
Hi zusammen,
ich bin grad dabei einen Agenten zu schreiben, der eine View (View 1) eines MS SQLServers 2012 ausliest. Jeder Datensatz hat eine Spalte UUID mit deren Inhalt ich einen SELECT auf ne andere View (View 2) absetzte:
SELECT * FROM dbo.vw_timelogs WHERE uuid = 'C222AEFA-E63A-45FA-AEF1-0149C6503A06'
Kriege ich lediglich beim *letzten* Datensatz der View 2 einen Treffer - bei den ersten 300 Datensätzen behauotet er, dass er nix findet.
Das gleiche tritt bei einem SELECT auf View 3 auf (mit einem anderen Key).
Wenn ich nun jedoch den Agenten hartcodiert mit den beiden Keys aufrufe, findet er enstprechende Datensätze, obwohl die gleichen Keys beim Aufruf via Schleife über alle Datensätze keinen Treffer gebracht haben.
Ich versteh's net :-:
Hat jemand nen Tipp für mich?
Danke & Gruß,
Buzzy
-
Evtl ein problem mit den Anführungszeichen beim bereitstellen der query? oder Gross/klein Schreibung? bzw ein fehlendes Fulltrim ?
-
Und 2 Selects? Warum nicht ein JOIN?
-
Ich nehme mal an, du verbindest dich mit ODBC. Wenn ja dann drehe doch einfach mal die Ablaufverfolgung im ODBC ein und schaue welche SQL Statements dein Agent an den SQL Server schickt. Dann solltest du das Problem offensichtlich werden.
Grüße
Ralf
-
Moing zusammenm
also das Problem hat sich jetzt verschoben - ich hab nun eine neue View bekommen, wo alles drin steht (mit einem JOIN, m3 *g*).
Nun hab ich aber das gleiche Problem beim Updaten eines abgeholten Datensatzes - wenn ich daraus erfolgreich ein NotesDok erstellt habe, möchte ich den SQL-Datensatz markieren:
"UPDATE dbo.vw_CasetrackerLookup SET Verarbeitet = '1' WHERE UUID = '} + CStr(uuid) + {'"
wobei ich mir "uuid" wieder aus der Tabelle hole - nachdem uuid ein "uniqueidenitifer" ist, muss ich beim SELECT den Datentyp casten, damit ich ihn überhaupt in eine LS-Variable stecken kann:
SELECT CAST(uuid as CHAR(255)) as uuid, * FROM dbo.vw_CasetrackerLookup
Muss ich "uuid" zur Verwendung im UPDATE nochmal konvertieren?
@Ralf: wo stelle ich das ein? Ich hab die Datenquelle über "Verwaltung/ODBC-Datenquellen" angelegt - da finde ich keine entsprechende Option.
Ich habe zum Erstellen den Treiber "SQL Server (6.01.*)" genommen...
Danke & Gruß,
Buzzy
-
Evtl ein problem mit den Anführungszeichen beim bereitstellen der query? oder Gross/klein Schreibung? bzw ein fehlendes Fulltrim ?
Also ich hab mit das SQL mal ausgeloggt, da ist kein Leerzeichen drin, das nicht rein gehört:
UPDATE dbo.vw_CasetrackerLookup SET Verarbeitet = '1' WHERE UUID = 'C222AEFA-E63A-45FA-AEF1-0149C6503A06'
Wenn ich das Statement so im SQLManager absetze, klappt alles:
UPDATE [CoMo].[dbo].[vw_CasetrackerLookup] SET [Verarbeitet] = '1' WHERE [UUID] = 'C222AEFA-E63A-45FA-AEF1-0149C6503A06'
(Die Syntax ist hier anders, aber das dürfte ja dem "Notes"-SQL egal sein...der SELECT klappt ja auch)
-
Ich verstehe das mit den geschwungenen Klammern in deinem Update nicht. uuid ist doch in Lotusscript ein String oder warum musst du den extra nocheinmal mit CSTR bearbeiten. Übrigens ist dein Code für SQL Injections anfällig und sollte so nicht gemacht werden. Eventuell solltest du jemand beiziehen, der mehr Erfahrung mit SQL hat.
Bezüglich der Ablaufverfolgung. Die kannst du wie in folgenden Screenshot angezeigt einschalten.
-
Moin
und wenn Du dieses Statement UPDATE [CoMo].[dbo].[vw_CasetrackerLookup] SET [Verarbeitet] = '1' WHERE [UUID] = 'C222AEFA-E63A-45FA-AEF1-0149C6503A06'
vom Notes aus absetzt?
-
Poste doch mal den Lotusscript code, den du verwendest um das SQL abzusetzen.
Grüße
Ralf
-
Ich verstehe das mit den geschwungenen Klammern in deinem Update nicht. uuid ist doch in Lotusscript ein String oder warum musst du den extra nocheinmal mit CSTR bearbeiten. Übrigens ist dein Code für SQL Injections anfällig und sollte so nicht gemacht werden. Eventuell solltest du jemand beiziehen, der mehr Erfahrung mit SQL hat.
Bezüglich der Ablaufverfolgung. Die kannst du wie in folgenden Screenshot angezeigt einschalten.
Ah, danke - die SQL.log wird aber nicht erzeugt bei mir...ich kann auch nicht die Pfade anpassen...
-
Poste doch mal den Lotusscript code, den du verwendest um das SQL abzusetzen.
Grüße
Ralf
Here we go:
Im Initialize wird nur die Connection aufgebaut und dann diese Funktion aufgerufen
Function getAllLogs(whereString As string) As Boolean
set result = New ODBCResultSet
Set qry = New Odbcquery
'### zum Abfragen der Datensätzte ##############
Set qry.Connection = con
Set result.Query = qry
If whereString = "" Then
qry.SQL = "SELECT CAST(uuid as CHAR(255)) as uuid, * FROM dbo.vw_CasetrackerLookup WHERE Verarbeitet = '0'"
Else
qry.SQL = "SELECT * FROM dbo.vw_CasetrackerLookup WHERE " + whereString
End If
'################################################
'### zum Updaten eins erfolgreich abgeholten Datensatze ###
Dim updateQuery As New Odbcquery
Dim updateResult As New Odbcresultset
Set updateQuery.Connection = con
Set updateResult.Query = updateQuery
'############################################
result.Execute
Dim user As String
Dim category As String
Dim durationMin As Integer
Dim task As String
Dim caseUNID As String
Dim ticketUNID As String
Dim billable As string
Dim uuid As String
Dim newTimeLog As NotesDocument
If result.IsResultSetAvailable Then
Do
result.NextRow
user = getNotesName(result.GetValue("Username"))
If user = "" Then
Call LogEvent("Kein NAB-Dok gefunden zu '" + result.GetValue("Username") + "'",SEVERITY_HIGH,Nothing)
End If
category = result.GetValue("Zeitart")
durationMin = result.GetValue("Dauer")
task = result.GetValue("Aufgabe")
caseUNID = result.GetValue("Case")
ticketUNID = result.GetValue("Ticket")
uuid = result.GetValue("uuid")
Call LogEvent(uuid + ": " + user + " / " + category + " / " + CStr(durationMin) + " / " + task,SEVERITY_LOW,Nothing)
'Set newTimeLog = New NotesDocument(thisdb)
'newTimeLog.form = "entry"
'nach dem erfolgreichen Abholen eines Datensatzes wird er in SQL auf "Verarbeitet" gesetzt
updateQuery.SQL = {UPDATE dbo.vw_CasetrackerLookup SET Verarbeitet = '1' WHERE UUID = '} + CStr(uuid) + {'}
'updateQuery.SQL = {UPDATE dbo.vw_CasetrackerLookup SET Verarbeitet = '1' WHERE Ticket = '1921'}
Call LogEvent(updateQuery.SQL,SEVERITY_LOW,Nothing)
updateResult.Execute
GoTo exitLoop
Loop Until result.IsEndOfData
exitloop:
result.Close(DB_CLOSE)
End If
End Function
-
Eventuell solltest du jemand beiziehen, der mehr Erfahrung mit SQL hat.
Den Eindruck hab ich auch ;-)
-
gelöscht...
-
Moin
und wenn Du dieses Statement UPDATE [CoMo].[dbo].[vw_CasetrackerLookup] SET [Verarbeitet] = '1' WHERE [UUID] = 'C222AEFA-E63A-45FA-AEF1-0149C6503A06'
vom Notes aus absetzt?
Probier ich mal...
-
Eigentlich solltest du kein Update verwenden, sondern du kannst einfach das Resultset updaten. Das sollte viel einfacher sein.
Also ungefähr so nach dem Select:
call result.setValue("Verarbeitet","1")
result.UpdateRow
Siehe Designer Hilfe http://intranet.ntc.edu/help4.nsf/968106ad371128cb8525619e007ae2ac/7c7bbd9c1b39230d852564d2001a30df?OpenDocument
-
Eigentlich solltest du kein Update verwenden, sondern du kannst einfach das Resultset updaten. Das sollte viel einfacher sein.
Also ungefähr so nach dem Select:
call result.setValue("Verarbeitet","1")
result.UpdateRow
Siehe Designer Hilfe http://intranet.ntc.edu/help4.nsf/968106ad371128cb8525619e007ae2ac/7c7bbd9c1b39230d852564d2001a30df?OpenDocument
Klappt auch nicht - ich hab auch mal geschaut, ob die View "ReadOnly" ist - isse nicht. Kann ich Views überhautp updaten, oder geht das nur auf Tabellen?
-
Mach doch ein Select auf die Tabelle und update dann wie beschrieben.
Grüße
Ralf
-
Mach doch ein Select auf die Tabelle und update dann wie beschrieben.
Grüße
Ralf
Mach ich doch - ich schleife über das ResultSet des Selects, lese meine Felder aus, verwurste die und sage am Ende der Schleife
Call result.setValue("Verarbeitet","1")
updateStatus = result.UpdateRow
wie Du vorgeschlagen hast.
result.UpdateRow gibt FALSE zurück
die Connection selber steht auf "Autocommit = TRUE"
und das ResultSet ist nicht ReadOnly