Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: buzzy666 am 20.08.14 - 14:10:14

Titel: SQL-SELECT "spinnt"
Beitrag 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
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: umi am 20.08.14 - 14:57:26
Evtl ein problem mit den Anführungszeichen beim bereitstellen der query?  oder Gross/klein Schreibung? bzw ein fehlendes Fulltrim ?
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: m3 am 20.08.14 - 15:09:41
Und 2 Selects? Warum nicht ein JOIN?
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: Ralf_M_Petter am 20.08.14 - 16:57:45
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
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 08:39:40
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
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 08:47:11
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)

Titel: Re: SQL-SELECT "spinnt"
Beitrag von: Ralf_M_Petter am 21.08.14 - 08:50:15
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.

Titel: Re: SQL-SELECT "spinnt"
Beitrag von: umi am 21.08.14 - 08:51:53
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?
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: Ralf_M_Petter am 21.08.14 - 08:59:24
Poste doch mal den Lotusscript code, den du verwendest um das SQL abzusetzen.

Grüße

Ralf
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 09:01:27
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...
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 09:06:28
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

Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 09:07:07
Eventuell solltest du jemand beiziehen, der mehr Erfahrung mit SQL hat.

Den Eindruck hab ich auch ;-)
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 09:07:30
gelöscht...
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 09:27:01
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...
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: Ralf_M_Petter am 21.08.14 - 09:46:08
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
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 10:07:07
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?

Titel: Re: SQL-SELECT "spinnt"
Beitrag von: Ralf_M_Petter am 21.08.14 - 10:08:52
Mach doch ein Select auf die Tabelle und update dann wie beschrieben.

Grüße

Ralf
Titel: Re: SQL-SELECT "spinnt"
Beitrag von: buzzy666 am 21.08.14 - 10:36:42
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