Karteileichen in Tables.ElementNames

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Luke78
**
Beiträge: 29
Registriert: Do, 27.09.2012 19:43

Karteileichen in Tables.ElementNames

Beitrag von Luke78 »

Hallo zusammen!

Hab für meine Datenbank eine reset Funktion geschrieben, um jeweils nach wildem Testen und Daten schreiben, ändern und löschen, einamal alles zu löschen und die IDs auf null zu setzen.

Klappt auch soweit, nur sind in ThisComponent.DataSource.Tables.ElementNames noch Tabellennamen vorhanden, die längst gelöscht und/oder umbenannt wurden.
Kommt man irgendwie an die Refeferenzierung dran und kann die entfernen?

Code: Alles auswählen

sub resetAll()
	dim Tables as Object
	dim sSQL		as String		
	dim oConnection	as Object	
	dim oSQLQuery	as Object

	Tables		= ThisComponent.DataSource.Tables.ElementNames
	oConnection	= ThisDatabaseDocument.DataSource.GetConnection("","")	

	dim i as Integer
	for i = 0 to uBound( Tables)
		Print(Tables(i))
		sSQL	= "DELETE FROM ?"
	
		sSQL		= replace( sSQL, "?", """" & Tables(i) & """")
		oSQLQuery	= oConnection.createStatement()
		oSQLQuery.executeUpdate( sSQL)

		sSQL	= "ALTER TABLE ? ALTER COLUMN ""ID"" RESTART WITH 0"

		sSQL		= replace( sSQL, "?", """" & Tables(i) & """")
		oSQLQuery	= oConnection.createStatement()
		oSQLQuery.executeUpdate( sSQL)
	next
end sub
Fast vergessen, wird ja Wert drauf gelegt ;-) Windows 7 64-bit - LibreOffice 3.5.6.2
LO 3.6.5.2 auf Windows 7 64bit
"Ein Programm ist immer nur so gut wie sein Benutzer" - "Software has no brain, use your own"
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Karteileichen in Tables.ElementNames

Beitrag von F3K Total »

Hi,
mit

Code: Alles auswählen

thisdatabasedocument.datasource.Tables.removebyname("alteTabelle")
kannst Du sie löschen.
Vorher mußt du dir was basteln, mit dem du anhand der elementnames herausbekommst, ob die Tabelle in der DB noch existiert.
EDIT: z.B mit dieser Abfrage:

Code: Alles auswählen

Select TABLE_NAME from INFORMATION_SCHEMA.SYSTEM_TABLES WHERE TABLE_SCHEM = 'PUBLIC'
Gruß R
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Karteileichen in Tables.ElementNames

Beitrag von F3K Total »

Got it:

Code: Alles auswählen

sub delete_Karteileichen
    dim Tables as Object
    dim sSQL      as String      
    dim oConnection   as Object   
    dim oSQLQuery   as Object
    dim bfound as boolean
    
    sTables      = ThisComponent.DataSource.Tables.ElementNames
    oConnection   = ThisDatabaseDocument.DataSource.GetConnection("","")   
    SSql = "Select TABLE_NAME from INFORMATION_SCHEMA.SYSTEM_TABLES WHERE TABLE_SCHEM = 'PUBLIC'"
    oSQLQuery   = oConnection.createStatement()
    
    for i = 0 to ubound(sTables)
        bfound = false
        sTable = sTables(i)
        SQLResult = oSQLQuery.executequery(sSQL)
        while SQLResult.next
            sexistingTable = SQLResult.getstring(1)
            if sexistingTable = sTable then bfound = true
        wend
        if not bfound then thisdatabasedocument.datasource.Tables.removebyname(sTable)
    next i
end sub
Gruß R

EDIT: Habe gerade herausprobiert, wie es zu den Leichen kommt: Wenn man Tabellen löscht, werden sie aus der eingebetteten DB entfernt. Vergißt man jetzt das .odb Dokument zu speichern, sind die Leichen da. Werden Tabellen gelöscht und die .odb gespeichert, fehlen die Leichen.
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Karteileichen in Tables.ElementNames

Beitrag von juetho »

Kleine Ergänzung: Ich empfehle bei solchen Löschungen, immer von hinten her zu arbeiten:

Code: Alles auswählen

    for i = ubound(sTables) to 0 step -1
Beim Löschen "vorwärts" ist es immer möglich, dass von zwei aufeinander folgenden Löschkandidaten der zweite übergangen wird: Zuerst wird der Kandidat an Position i gelöscht; dadurch rutschen alle noch vorhandenen Einträge um einen Index nach vorne (der nächste Löschkandidat bekommt also die Position i); dann geht die Schleife weiter nach Position i+1. Der nächste Löschkandidat wird also überhaupt nicht geprüft.

Je nachdem wie intern die Arrays verwaltet werden und ubound(sTables) ausgewertet wird, besteht außerdem das Risiko, dass bei den letzten Positionen kein Objekt mehr zur Verfügung steht und es zu einer "NoSuchElementException" kommt.

Wie gesagt: So etwas muss nicht passieren, aber es ist denkbar. Wenn man "von hinten her" arbeitet, sind solche Probleme ausgeschlossen. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Karteileichen in Tables.ElementNames

Beitrag von F3K Total »

Jupp, ist sinnvoll.
Gruß R
Luke78
**
Beiträge: 29
Registriert: Do, 27.09.2012 19:43

Re: Karteileichen in Tables.ElementNames

Beitrag von Luke78 »

Wow, Danke für die umfassende Antwort!!

Eigentlich hab ich den Finger immer am Strg + S Abzug ;-)

Aber gerade bei großen Umbennennungsaktionen (leider manchmal nötig) spielt man ja auch immer mit der Gefahr von Programmabstürzen.

Wird sowas bei Querys etc. dann auch analog auftauchen? Gerade da ists ( im Zuge von Anwenderfehlern) ja um die Stabilität nicht immer weit bestellt.

Guten Start in den Tag!
LO 3.6.5.2 auf Windows 7 64bit
"Ein Programm ist immer nur so gut wie sein Benutzer" - "Software has no brain, use your own"
Antworten