Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Hilfe zu SQLite, Aufbau, Abfrage, Ändern etc.


  • Please log in to reply
84 replies to this topic
fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Hi just me.

 

Hier der Abfrageaufbau, es funktioniert sogar :)

 

Aber vielleicht hast du noch Anmerkungen dazu...?

 

Code:

StartSearch:
b:=0
; Abrufen der Suchdaten
GuiControlGet, RMA_ID , , RMA_ID
GuiControlGet, RMA_KDNr , , RMA_KDNr
GuiControlGet, RMA_DID , , RMA_DID
GuiControlGet, RMA_ToDo , , RMA_ToDo
GuiControlGet, RMA_EndUser , , RMA_EndUser
GuiControlGet, RMA_FirsUser , , RMA_FirsUser
GuiControlGet, DBtoUse , , DBtoUse
GuiControlGet, RMA_UseDate , , RMA_UseDate
GuiControlGet, RMA_Date , , RMA_Date
; msgbox % "ID: " RMA_ID "`nKDNr: " RMA_KDNr "`nDID: " RMA_DID "`nToDo: " RMA_ToDo "`nEndUser: " RMA_EndUser "`nFirstUser: " RMA_FirsUser "`nDatenbank: " DBtoUse "`nDatum nutzen: " RMA_UseDate "`nDatum: " RMA_Date
; Prüfen ob Suchfelder genutzt wurden. Wenn nicht dann erfolgt ein Abbruch.
If (RMA_ID="" && RMA_KDNr="" && RMA_DID="" && RMA_ToDo="" && RMA_EndUser="" && RMA_FirsUser="" && RMA_UseDate=0)
	{
		msgbox, 262160, Keine Suchkriterien,Du hast keine Suchkriterien angegeben. Bitte gebe mindestens ein Kriterium an nachdem gesucht werden soll.
		Return
	}
; Startwerte des SQL Strings
SQL:=
SQL1 := "SELECT * FROM " . TableNameArchivAdmin . " WHERE"
SQL2 := ";"
; Platzhaltersuche wäre möglich wenn man statt = auf like umsteigt und % als Platzhalter nimmt. Realisierbar wäre dies wenn man auf % im String sucht und bei Erfolg einen Part mit like statt = nimmt.
; Aufbau des SQL Strings je nach Suchfeldnutzung des Users.
If (RMA_ID!="") {
	SQL:=SQL " Reminder_ID='" . RMA_ID . "'"
	b:=1
	}
If (RMA_KDNr!="") {
	If (b=1)
		SQL:=SQL " AND KD_Nr='" . RMA_KDNr . "'"
	else {
		SQL:=SQL " KD_Nr='" . RMA_KDNr . "'"
		b:=1
		}
	}
If (RMA_DID!="") {
	if (b=1)
		SQL:=SQL " AND D_ID='" . RMA_DID . "'"
	else {
		SQL:=SQL " D_ID='" . RMA_DID . "'"
		b:=1
		}
	}
If (RMA_ToDo!="") {
	if (b=1)
		SQL:=SQL " AND ToDo='" . RMA_ToDo . "'"
	else {
		SQL:=SQL " ToDo='" . RMA_ToDo . "'"
		b:=1
		}
	}
If (RMA_EndUser!="") {
	if (b=1)
		SQL:=SQL " AND Benutzer='" . RMA_EndUser . "'"
	else {
		SQL:=SQL " Benutzer='" . RMA_EndUser . "'"
		b:=1
		}
	}
If (RMA_FirsUser!="") {
	if (b=1)
		SQL:=SQL " AND FirstUser='" . RMA_FirsUser . "'"
	else {
		SQL:=SQL " FirstUser='" . RMA_FirsUser . "'"
		b:=1
		}
	}
If (RMA_UseDate=1) {
	RMA_Date:=SubStr(RMA_Date, 1, 8) . "000000"
	RMA_Date2:=RMA_Date
	RMA_Date2 += +1, Days
	if (b=1)
		SQL:=SQL " AND FullTime >'" . RMA_Date . "' AND FullTime <'" . RMA_Date2 . "'"
	else {
		SQL:=SQL " FullTime >'" . RMA_Date . "' AND FullTime <'" . RMA_Date2 . "'"
		}
	}
; SQL String zusammensetzen
SQL:=SQL1 SQL SQL2
; Pfad zur DB setzen
PfadtoSearchDB:=ArchivPath DBtoUse
; Datenbank öffnen
DB := New SQLiteDB
If !DB.OpenDB(PfadtoSearchDB) {
   MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
   ExitApp
}
;Abfrage durchführen
Gosub RefreshLV2
; DB schließen
DB.Close()
Return

RefreshLV2: ; Refresh für ListView2
LVName := "ResultsLV2" ; Name des Controls
If !DB.GetTable(SQL, Result) ; Führt den SQL String aus.
	MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
Else
	ShowTable(Result, LVName) ; Übergibt das Result an die Funktion die dann das ListView mit Daten befüllt.
Return

ShowTable(Table, LVName)
	{
		Gui, 1:Default
		Gui, ListView, %LVName%
		GuiControl, -ReDraw, %LVName%
		LV_Delete()
		If (Table.HasRows)
			{
				Loop, % Table.RowCount
					{
						Table.Next(Row)
						LV_Add("", Row*)
					}
			}
		GuiControl, +ReDraw, %LVName%
	}

Den unteren Part kennste ja schon :)

 

MfG
fump



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011
Hallo fump,
 
nur Kleinkram:
 
; Platzhaltersuche wäre möglich wenn man statt = auf like umsteigt und % als Platzhalter nimmt.
; Realisierbar wäre dies wenn man auf % im String sucht und bei Erfolg einen Part mit like statt = nimmt.
; Aufbau des SQL Strings je nach Suchfeldnutzung des Users.
SQL := ""
If (RMA_ID != "")
   SQL .= " AND Reminder_ID='" . RMA_ID . "'"
If (RMA_KDNr!="")
   SQL .= " AND KD_Nr='" . RMA_KDNr . "'"
If (RMA_DID != "")
   SQL .= " AND D_ID='" . RMA_DID . "'"
If (RMA_ToDo != "")
   SQL .= " AND ToDo='" . RMA_ToDo . "'"
If (RMA_EndUser != "")
   SQL .= " AND Benutzer='" . RMA_EndUser . "'"
If (RMA_FirsUser != "")
   SQL .= " AND FirstUser='" . RMA_FirsUser . "'"
If (RMA_UseDate = 1) {
   RMA_Date := SubStr(RMA_Date, 1, 8) . "000000"
   RMA_Date2 := RMA_Date
   RMA_Date2 += +1, Days
   SQL .= " AND FullTime >'" . RMA_Date . "' AND FullTime <'" . RMA_Date2 . "'"
   }
SQL := SubStr(SQL, 6) ; führendes ' AND ' übergehen

Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Sieht viel schöner aus happy.png Danke!

 

Würdest du mir auch was schreiben um ein = wenn % vorhanden in ein like umzustellen?



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011
; die %-Zeichen in der Eingabe müssen der SQL-Syntax für LIKE entsprechen
If (RMA_ID != "")
   SQL .= " AND Reminder_ID " . (InStr(RMA_ID, "%") ? " LIKE '" : " = '") . RMA_ID . "'"

Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Danke dir!



fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Hallo just me,

 

ich komm nicht weiter.

 

Aufgabenbeschreibung: Aus der DB von User1 soll ein Vorgang in die DB von User2 verschoben werden. Analog zum Archivierungsvorgang habe ich den Codeteil angepasst.

Code:

DBAliasTransmit := "UserDB" ; Aliasname für die Archivdatenbank
If (MooreIDs!=1)
	{
		User1Pfad:=LANPfad User1 "\Reminder-" User1 ".sql"
		User2Pfad:=LANPfad User2 "\Reminder-" User2 ".sql"
		DB := New SQLiteDB
		If !DB.OpenDB(User1Pfad) {
		   MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
		   ExitApp
		}
		Selection := " WHERE Reminder_ID= '" . RMIDOne . "';" ; Auswahlkriterien
		If !DB.Exec("ATTACH DATABASE '" . User2Pfad . "' AS " . DBAliasTransmit . ";") { ; Datenbank User2 hinzufügen
			SQLiteError(A_ThisLabel, DB, "ATTACH")
			Return   ; bei einem Fehler ist hier Schluss!
		}
		DB.Exec("BEGIN IMMEDIATE TRANSACTION;")
		SQL := "INSERT OR ROLLBACK INTO " . DBAliasTransmit . "." . TableName . " SELECT * FROM " . TableName . Selection
		If !DB.Exec(SQL) {
			SQLiteError(A_ThisLabel, DB, "INSERT")
			DB.Exec("ROLLBACK TRANSACTION;") ; Transaktion zurücksetzen (sicher ist sicher)
			DB.Exec("DETACH DATABASE " . DBAliasTransmit . ";") ; DB entfernen
			Return  ; bei einem Fehler ist hier Schluss!
		}
		SQL := "DELETE FROM " . TableName . Selection
		If !DB.Exec(SQL) {
			SQLiteError(A_ThisLabel, DB, "DELETE")
			DB.Exec("ROLLBACK TRANSACTION;") ; Transaktion zurücksetzen
			DB.Exec("DETACH DATABASE " . DBAliasTransmit . ";") ; DB entfernen
			Return   ; bei einem Fehler ist hier Schluss!
		}
		DB.Exec("COMMIT TRANSACTION;")   ; Alles ist fehlerfrei gelaufen, die Transaktion kann gültig gesetzt werden.
		If !DB.Exec("DETACH DATABASE " . DBAliasTransmit . ";") {   ; DB entfernen
			SQLiteError(A_ThisLabel, DB, "DETACH")
			Return  ; bei einem Fehler ist hier Schluss!
		}
	}

Ansich ist doch alles richtig oder?

 

Die Tabellennamen sind allerdings bei beiden DB's gleich. Kann dies das Problem sein? Denn wenn ich die Übertragung starte dann klappt das ATTACH aber der INSERT nicht. Ich bekomme die Meldung, dass ReminderID und Kundennummer nicht einmaling sind. In der DB von User2 gibt es diese ID aber zu 100% nicht.

 

Kannst du mir hier bitte helfen!

 

MfG
fump

 

// EDIT

SQL := "INSERT OR ROLLBACK INTO " . DBAliasTransmit . "." . TableName . " SELECT * FROM " . TableName . Selection
SQL := "DELETE FROM " . TableName . Selection

Wenn ich mir das Stück für Stück vorstelle den Ablauf dann kann das ja so gar nicht klappen.

Der erste SQL sagt "INSERT User2DB Reminder SELECT * FROM Reminder WHERE Reminder_ID=123456789;"

Hier kommt die Fehlermeldung das die ID nicht einmalig sei. Muss ja dann bedeuten, dass er den Select in die gleiche DB einfügen will oder?

Der zweite SQL würde folglich auch nicht klappen. Hier würde wohl nicht bei der User1DB sondern eher bei der User2DB der Vorgang wieder gelöscht werden.

 

Ich bin überfragt... :(



hd0202
  • Members
  • 709 posts
  • Last active: Feb 14 2016 08:05 PM
  • Joined: 13 Aug 2006

Ich denke, du musst die zweite Datenbank anders qualifizieren, z.B.:

If !DB2.Exec("ATTACH DATABASE '" . User2Pfad . "' AS " . DBAliasTransmit . ";") { ; Datenbank User2 hinzufügen

Ebenso beim Insert und den weiteren Aktionen.

 

Hubert



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Hallo,
 
ich habe mir darüber auch schon Gedanken gemacht, als ich die ATTACH Anweisung gefunden habe. Versuch mal Folgendes:

SQL := "INSERT OR ROLLBACK INTO " . DBAliasTransmit . "." . TableName . " SELECT * FROM Main." . TableName . Selection ; oder auch main kleingeschrieben
SQL := "DELETE FROM Main." . TableName . Selection

Wenn ich die Doku richtig verstanden habe, sollte der interne Name der per OpenDB() geöffnete Datenbank "main" sein.


Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Weder kleingeschrieben noch großgeschrieben klappts.

Es kommt weiterhin dieser Fehler:

 

4pqjsnhtqftq.png



fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Ich denke, du musst die zweite Datenbank anders qualifizieren, z.B.:

If !DB2.Exec("ATTACH DATABASE '" . User2Pfad . "' AS " . DBAliasTransmit . ";") { ; Datenbank User2 hinzufügen

Ebenso beim Insert und den weiteren Aktionen.

 

Hubert

 

Daran liegts nicht da der ATTACH ja einwandfrei funktioniert. Erst beim INSERT kommt der Fehler.



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Hast Du den Inhalt aller kritischen Variablen und der Datenbanken daraufhin überprüft, ob Du wirklich mit zwei verschiedenen Datenbanken arbeitest und die Kombination von Reminder_ID und KD_Nr in der Zieldatenbank wirklich nicht existiert?


Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Oh man, du hattest recht... Gestern abend hab ich es schonmal versucht und einen Fehler erhalten. Da muss es sich aber um fehler beim DETACH gehandelt haben denn da war der falsche Alias noch drin.

 

Im Editor hab ich dann gerade gesehen das der Eintrag tatsächlich schon vorhanden war.

 

Nunja, es klappt also nun.

Kann man per Update SQL Befehl auch nur einen Teil Updaten ohne die anderen anzurühren? Ich möchte nur den Namen der in der Var User1 als FirstUser in der DB speichern. Am einfachsten gehts wohl vor der Übertragung in die User2 DB.

 

EDIT:

SQL := "UPDATE " . TableName . " SET FirstUser='" . User1 . "' WHERE Reminder_ID='" . RMIDOne . "';"

So gehts... ich dachte man müsste immer allles updaten wenn man UPDATE nutzt. Hab es nun einfach mal getestet. :)



fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Hallo just me!

 

Ich schwimme mal wieder... Bei der Wärme hier sogar mehr als nur mit dem Code :)

 

Ich will prüfen ob in der Zeile mit der ID 123456789123 schon ein FirstName vorhanden ist. Dazu möchte ich nur diese eine Zelle aus der betreffenden Zeile auslesen.

 

Ich hab mir die SQL Hilfe angeschaut. Der String müsste so aussehen:

SQL:="SELECT FirstName FROM" . TableName . "WHERE Reminder_ID='" . RMIDOne . "';"

Ich weiß aber nun nicht mit welchem Befehl ich diesen SQL Strin ausführen soll um das gewünschte Ergebnis zu erhalten.

 

Bring bitte Licht ins Dunkel :)

 

Danke im Voraus!

 

MfG
fump



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Wenn Du Daten aus der Datenbank auslesen willst, geht das immer nur mit GetTabel() oder Query().

 

Edit: Da fehlen zwei Leerzeichen:

SQL:="SELECT FirstName FROM " . TableName . " WHERE Reminder_ID='" . RMIDOne . "';"

Prefer ahkscript.org for the time being.


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Danke für den Hinweis, die doofen Leerzeichen hab ich übersehen.

 

Viel schlimmer ist das ich mich im Var Namen vertan habe. Ich werd in Zukunft alles mehrmals kontrollieren. Hab ich eigentlich getan... dennoch übersehen das der Name falsch war...

 

Aber im Moment seh ich nur noch Code... Träum schon davon. Es muss halt fertig werden :)

 

Es funktioniert leider nicht :(

Egal ob Query oder GetTable.

 

Code:

User1Pfad:=LANPfad User1 "\Reminder-" User1 ".sql"
User2Pfad:=LANPfad User2 "\Reminder-" User2 ".sql"
DB := New SQLiteDB
If !DB.OpenDB(User1Pfad) {
   MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
   ExitApp
}
SQL:="SELECT FirstUser FROM " . TableName . " WHERE Reminder_ID='" . RMIDOne . "';"
If !DB.Query(SQL, CheckFirstName) { ; Führt den SQL String aus.
	MsgBox, 16, SQLite Error: Query, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
	Return
}
msgbox % CheckFirstName
NameLen:=StrLen(CheckFirstName)
If (NameLen<6)
	{
		msgbox bin hier
		SQL := "UPDATE " . TableName . " SET FirstUser='" . User1 . "' WHERE Reminder_ID='" . RMIDOne . "';"
		If !DB.Exec(SQL) {
			SQLiteError(A_ThisLabel, DB, "UPDATE")
			DB.Exec("ROLLBACK TRANSACTION;") ; Transaktion zurücksetzen (sicher ist sicher)
			Return
		}
	}

CheckFirstName ist immer leer obwohl es nicht so sein dürfte. Beim ausführen des SQL kommt kein Fehler.

 

Ich komm nicht auf die Lösung.

 

Hab es hier nochmal nachgelesen: http://de.wikibooks...._Daten_abfragen

Der SQL String sollte korrekt sein :(