[erledigt]Spreadsheet SQL

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

Moderator: Moderatoren

gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

[erledigt]Spreadsheet SQL

Beitrag von gschuckar »

Moin,
vielleicht sehe ich den Wald vor lauter Bäumen nicht.

Bis dato wurde ein Spreadsheet als Datenbank benutzt. Weil die Daten im Laufe der Zeit sehr umfangreich geworden sind, wurde jetzt eine Datenbank, in der die Daten jetzt gespeichert werden sollen, erstellt. Eingaben über eine mit JAVA erstellte Eingabemaske funktionieren einwandfrei. Das Auslesen der Daten aus dieser Datenbank und das Darstellen z.B. in einem JTable funktionieren auch einwandfrei.

Zur Darstellung von Statistiken sollen Spreadsheets verwendet werden. Die Templates sind ja schon vorhanden und können weiter verwendet werden. Erste Teste liefen schon erfolgreich.

Jetzt sollen alle im Spreadsheet befindlichen Daten in die Datenbank gebracht werden. Dazu habe ich diese aus dem Spreadsheet per getDataArray in ein Array eingelesen. Das funktioniert. Bis auf die Datumsspalte werden auch alle Daten per for Schleife und System.out.println auf der Konsole angezeigt.
Aus diesem Array möchte ich die Datensätze jetzt per SQL in die Datenbank schreiben.

Leider bekomme ich es nicht hin, ein mit getDatArray oder auch getFormulaArray in einem Array befindliches Datum in ein benutzbares umzuwandeln. Es wird mir bei allen Alternativen, die ich kenne immer der 1.1.1970 in verschiedensten mit SimpleDateFormat erstellten Formaten angezeigt. Die aus dem Spreadsheet z.B. ausgelesene Zahl 36616 repräsentiert das Datum 31.3.2000. Dieses Datum möchte ich per SQL in eine Datenbank Postgresql schreiben. Die Routinen sind fertig und funktionieren, wenn ich das Datum über ein Textfeld eingebe, aufbereite und einem SQL-String übergebe. Mit der Zahl 366616 kann die Datenbank jedoch nichts anfangen. Soweit.

Alternativ zu getDataArray habe ich mir jetzt überlegt, das Sheet mit SQL auszulesen. Dazu müsste ich eine "datenbankverbindung" zum Spreadsheet herstellen.
Geht das? Ich habe nirgends etwas dazu gefunden.
[edit] Noch ein Nachsatz: ich programmiere das Ganze mit JAVA auf Linux UBUNTU 12.04 [/edit]
Vielleicht ist mein grundsätzlicher Ansatz ja auch falsch?
Gruß
Gerd
Zuletzt geändert von gschuckar am Mo, 20.10.2014 19:49, insgesamt 1-mal geändert.
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Spreadsheet SQL

Beitrag von Karolus »

Hallo

Für `Postgresql Datum` bekomme ich bei Tante Google dieses
http://glossar.hs-augsburg.de/Datums-_u ... PostgreSQL

Zitat:

Code: Alles auswählen

Operator        Example                                                 Result

+               date '2001-09-28' + integer '7'                         date '2001-10-05'
Daraus würde ich ableiten:

Code: Alles auswählen

date '1899-12-30' + integer 'x' 
wobei x der Datumswert aus Calc ist.

Für SQL vmtl. so etwas:

Code: Alles auswählen

DateAdd( d, x, '1899-12-30') 
?
http://www.sql-und-xml.de/server-daten/ ... teadd.html

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

Re: Spreadsheet SQL

Beitrag von gschuckar »

Moin Karolus,

alles richtig. Wie bereitsgeschrieben, das Eintragen in die Datenbank funktioniert soweit. Was mich stört, ist der Zahlenwert, den ich mit gatDataArray oder auch getFormulaArray aus dem Sheet auslese. Der SQL String benötigt ein Datum. Die Frage ist: Wie wandle ich den gelesenen Zahlenwert, z.B. 36616 in das Datum 31.3.2000 um. Wie ich das dann SQL gerecht formatiere, ist nicht das Problem.

Bei allem, was ich zu diesem Thema finde steht geschrieben, das calc z.B. ein Datum als Zahlenwert speichert. Soweit okay. Erst durch Formatieren der Zelle wird für den Betrachter aus 36616 das Datum 31.3.200. Soweit auch klar.
Es steht auch geschrieben, das der Zahlenwert die Anzahl der vergangenen Sekunden seit dem 1.1.1970 darstellt. Auch klar.
Jetzt teilen wir doch einmal 36616 / 60 = 610,266 Minuten / 60 = 10,17 Stunden. Das bedeutet, das diese Zahl immer noch den 1.1.1970 repräsentiert. Also ist liest gatDataArray das datumsfeld nicht korrekt aus, oder? In dem Feld steht aber 31.3.2000. Also scheint hier der Fehler zu liegen und nicht bei der Umwandlung der Zahl ins Datum, oder sehe ich da etwas verkehrt? Ich habe den Eindruck, das getDataArray und auch getFormulaArray hier etwas nicht korrekt ausliest.
Die Zahl 36616 müsste doch viel größer sein, denke ich.

Gruß
Gerd
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Spreadsheet SQL

Beitrag von Karolus »

Hallo
Ich fürchte du bringst da noch eineiges durcheinander.

Calc speichert intern Datumswerte als Anzahl der Tage seit dem 30.12.1899

Ein Unix Date/Timestamp ist die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr

??? Datenbanken speichern Datumswerte intern vmtl in einer Struktur aus Jahr, Monat, und Tag ???
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

Re: Spreadsheet SQL

Beitrag von gschuckar »

Moin Karolus,
erstmal Danke für Deine Bemühungen. Es hilft mir Stück für Stück weiter.
Calc speichert intern Datumswerte als Anzahl der Tage seit dem 30.12.1899
Okay .....
Ein Unix Date/Timestamp ist die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
Auch Okay.
??? Datenbanken speichern Datumswerte intern vmtl in einer Struktur aus Jahr, Monat, und Tag ???
Auch richtig, ist aber zur Zeit nicht das Problem. Das Speichern eines DATE in einer Datenbank habe ich bereits gelöst.

Das Problem ist: Wie wandle ich das in Calc (als Anzahl der Tage) gespeicherte Datum in ein mit Java lesbares/nutzbares Datum um. Ich schreibe absichtlich JAVA, und nicht LINUX weil ich am Ende die Java Anwendung sowohl auf einem Windows wie auf einem LINUX System laufen lassen möchte.

Es scheint nicht so einfach zu sein.

Leider bin ich mit meinen Versuchen noch nicht so richtig weiter gekommen. Wenn ich ein Ergebniss habe, werde ich dies hier kund tun.

Gruß
gerd
gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

Re: Spreadsheet SQL

Beitrag von gschuckar »

Moin Leute,
jetzt habe ich eine Lösung für das Problem gefunden. Das Problem noch einmal in Kürze: Umwandeln eines Datums, welches in einer Celle einem Calc Spreadsheet, in ein für einen SQL String verarbeitbares Datum, um das dann in eine Postgresql Datenbank einzutragen. Ich habe keine Möglichkeit gefunden oder erarbeiten können, dies auf direktem Wege, d.h Spreadsheet laden, Datum extrahieren umwandel und in einen SQL String packen, zu machen. Ich mache das jetzt so:

Spreadsheet laden und als csv File speichern.
Dann csv File laden mit der folgenden Routine:

Code: Alles auswählen

private void loadBatch(){
       	BufferedReader br = null;
	String line = "";
	String cvsSplitBy = ";";
	try {
            br = new BufferedReader(new FileReader(sBatchFile));
            
            while ((line = br.readLine()) != null) {
                String[] batch = line.split(cvsSplitBy);
                saveBatch(batch);
		}

	} catch (FileNotFoundException e) {
		Logger.debug(e);
	} catch (IOException e) {
		Logger.debug(e);
	} finally {
		if (br != null) {
			try {
                            br.close();
			} catch (IOException e) {
                            Logger.debug(e);
			}
		}
	}
	System.out.println("Done");
    }
In savebatch(String[] _sBatch) wandle ich dann das Datum mit diesem Code teil um:

Code: Alles auswählen

 String ablese_datum = _sBatch[1]; // In _sBatch[1] steht das umzuwandelnde Datum
        SimpleDateFormat sdfToDate = new SimpleDateFormat("dd.MM.yyyy");
        java.util.Date date1 = sdfToDate.parse(_sBatch[1]);
        java.sql.Date sqlDate = new java.sql.Date(date1.getTime());
Das jetzt nur zu Info. Vielleicht hilft es ja jemanden anderen weiter. Das funktioniert so ganz wunderbar. Vielleicht könnte man den Code noch ein wenig optimieren. Hübsch kommt später.

Gruß
Gerd
Antworten