Calc-Bereich per Code in Base-Tabelle übertragen

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

Moderator: Moderatoren

Knoddler
Beiträge: 5
Registriert: Do, 23.06.2011 15:07
Wohnort: Dillingen im Saarland

Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von Knoddler »

Hallo,

ich bin Forums- und auch OOo-Neuling und habe da ein Problem.

Bislang hatte ich für meine Mitarbeiter einen Vordruck konzipiert, der eine Art Kontrollcheckliste darstellt. Diese ist als dynamischer Vordruck angelegt, der in Abhängigkeit von der konkreten Situation aus unterschiedlichen Modulen aufgebaut werden kann. Mit jedem Erstellen dieses Vordrucks wird für jeden Einzelfall eine Datenbank befüllt, in die verschiedene Kopfdaten aus dem Vordruck (bspw. Kundenname, Kontonummer, Wiedervorlagedatum, Erstelldatum) einfließen. D.h. jeder Ausdruck des Vordruckes schaufelt einen neuen Datensatz in die Datenbank.
Bislang hatte ich das ganze über die LotusSmartSuite-Anwendungen 123 und Approach realisiert und das lief über viele Jahre reibungslos. Hier wurde mit dem jedem Ausdrucken des Vordrucks (aus der Anwendung 123) die dort in einem Tabellenbereich hinterlegten Kopfdaten über eine Datenverbindung in die Approach-Datenbank eingefügt. Das ganze funktionierte auch, wenn mehrere Mitarbeiter gleichzeitig auf die Anwendungen zugegriffen haben.
Leider hat der IT-Dienstleister meines Arbeitgebers die Unterstützung der Lotus-Anwendungen aufgekündigt. Stattdessen stehen den Mitarbeitern in der Breite nunmehr ausschließlich die OpenOffice-Anwendungen zur Verfügung.
Ich habe nunmehr versucht die Anwendung auf OOo (Calc und Base) umzuschreiben, was mir hinsichtlich des Vordruckes (Calc) auch gelungen ist. Über ein Dialogfeld in Calc wird der Vordruck entsprechend den Eingaben aufgebaut und kann über eine Schaltfläche ausgedruckt werden. Was ich bislang nicht geschafft
habe, ist die Kopfdaten des Vordruckes, die in einem Tabellenbereich der
Vordrucktabelle gespeichert sind, mit jedem Drucken per Makro bzw. Code in eine
Datenbank (Access oder Base) zu transferieren.
Ich hoffe, meine Darstellung des Problems ist verständlich.
Vielen Dank bereits an dieser Stelle für Eure Ideen bzw. Hilfestellung.
MfG
Knoddler

PS
Da ich leider nur sporadisch an dieser Sache arbeiten kann, bitte ich auch um Nachsicht, wenn ich nicht gleich auf Eure Vorschläge antworte.
MfG
Klaus
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von komma4 »

Willkommen im Forum.
Knoddler hat geschrieben:verschiedene Kopfdaten aus dem Vordruck (bspw. Kundenname, Kontonummer, Wiedervorlagedatum, Erstelldatum) einfließen. D.h. jeder Ausdruck des Vordruckes schaufelt einen neuen Datensatz in die Datenbank.
[...] funktionierte auch, wenn mehrere Mitarbeiter gleichzeitig auf die Anwendungen zugegriffen haben.
Was spricht dagegen, diesen Vordruck als Formular einer Datenbank zu realisieren?

Du solltest sowieso eine "richtige" Datenbank verwenden (bzw. einbinden), nicht die in BASE eingebaute HSQLDB!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Knoddler
Beiträge: 5
Registriert: Do, 23.06.2011 15:07
Wohnort: Dillingen im Saarland

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von Knoddler »

Hallo komma4,
vielen Dank für die erste schnelle Antwort.
Eigentlich ist die Umsetzung in der Form darauf zurückzuführen, dass ich das Layout der Anwendung über Calc an das bisherige Layout anlehnen kann, so dass die Mitarbeiter mit dem Gewohnten weiterarbeiten können.
Übergangsweise hat ein externer EDV-Dienstleister die Sache via Access realisiert, wobei die Anwendung den Mitarbeitern, die Access nicht zur Verfügung haben über eine Runtime-Version zur Verfügung gestellt wird. Die Umsetzung hakt auch an manchen Stellen, was zu Beschwerden der Kollegen führt, so dass ich versuche die Anwendung wieder so auf die Beine zu stellen, dass es wie gewohnt und stabil läuft.
Vielleicht noch zu meinem Hintergrund: Ich bin weder Programmierer, noch im EDV-Bereich tätig. Ich hatte nur in der Vergangenheit festgestellt, dass sich über Makros in der LotusSmartSuite-Welt mir und meinen Kollegen vieles leichter machen lässt. Und so wäre es schön, wenn es mir gelänge, das auch unter Open Office zu realisieren.
Zum konkreten Fall zurück:
Wenn sich ein Export des Tabellenbereiches aus Calc in Access realisieren ließe, wäre das natürlich auch ein Thema, da die Datenbank eigentlich nur Auswertungs- und Wiedervorlagezwecken dient und von den Mitarbeitern nicht mehr bearbeitet wird.
Meine laienhafte Vorstellung ist die, dass ich den besagten Tabellenbereich aus Calc in ein Array packe, das dann über einen Datenkanal oder Datenverbindung per Code in die korrespondierende Tabelle der Datenbank überführe, sprich: anhänge.
Den Code, der den Ausdruck des Vordruckes und das Bepacken des Arrays generiert, habe ich mal angefügt:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Drucken_Kobo
on Error goto Err_Handler
Dim oDoc as object
Dim oSheetQuelle as object
Dim oSheetZiel as object
dim oRange as object
dim oQuelle as object
Dim oZiel as object
Dim oCon as object
Dim oCursor as object 
Dim oPrinter as Object
Dim oDrBereich as Object
Dim sDBerAnf as string
Dim sDBerEnd as string
Dim lEndBerColumn as long
Dim lEndBerRow as long
Dim aDruckBer(0)
'GlobalScope.BasicLibraries.LoadLibrary("Tools")
REM Fügt das Unterschriftenmodul an 
oDoc = ThisComponent
oCon = oDoc.getCurrentController()
osheetQuelle = oDoc.sheets.GetByName("Kontrollelem")
oSheetZiel = odoc.sheets.GetByName("KOBOMÄBL")
oQuelle = oSheetQuelle.getCellRangeByName("El_BfV").RangeAddress
Fr_Zelle_Kobo
oZiel = oSheetZiel.getCellByPosition(oFrZe.Column, oFrZe.Row).CellAddress
'Msgbox s
'printdbgInfo(oziel)
oCon.select(oziel)
oSheetZiel.CopyRange(oZiel, oQuelle)

REM Hier muss jetzt der Druckbereich in Abhängigkeit von der Anzahl der Komponenten festgelegt werden
oDoc = ThisComponent
oSheet = ThisComponent.sheets.getByName("Kobomäbl")
'oCon = oDoc.getCurrentController()
'Ermittelt den Bereich, der als Druckbereich alle eingestellten Module umfasst
oRange = oSheet.getCellRangeByName("a17")
oCursor = osheet.CreateCursorByRange(oRange)
oCursor.GotoStart()
nSp = oCursor.getRangeAddress.startColumn
oCursor.gotoEnd()
nZe = oCursor.getRangeAddress.endRow
oZelle = oSheet.getCellByPosition(nSp, nZe +1)
lEndBerColumn = ozelle.cellAddress.column + 11
lEndBerRow = ozelle.cellAddress.row

sDrBerEnd = ozelle.celladdress.row
oDrBereich = oSheet.getCellRangeByPosition(0,0,lEndBerColumn,lEndBerRow)
aDruckBer(0) = oDrBereich.RangeAddress
oSheet.setPrintAreas(aDruckBer())
aDruck = osheet.getPrintAreas

'oDoc = ThisComponent
'oSheet = ThisComponent.sheets.getByName("Kobomäbl")
'oCon = oDoc.getCurrentController()
oRange = oSheet.getCellRangeByName("a1")
ocon.select(oRange)
oprinter = ThisComponent.getPrinter()
	dim arg(0) as new com.sun.star.beans.PropertyValue
	arg(0).name = "CopyCount"
	arg(0).value = 1
	ThisComponent.print(arg())
osheet = oDoc.sheets.getByName("Eing_dat")
oRange = osheet.getCellRangeByName("a1")
oCon = oDoc.getCurrentController()
oCon.select(oRange)	
DBTransfer

Exit sub

Err_Handler:
msgbox Err &  ":" & chr(10) & Error & " in Zeile: " & Erl

End Sub

Sub DBTransfer
on Error goto Err_Handler
Dim oDBRange as object
Dim oDoc, oSheet, oCon as object
Dim aTranferContainer()
oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName("Makros")
oDBRange = oSheet.getCellRangeByName("TÜ")
aTransferContainer() = oDBRange.DataArray()

Exit sub

Err_Handler:
msgbox Err &  ":" & chr(10) & Error & " in Zeile: " & Erl

End Sub
Hab ja keine Ahnung, ob ich den Code jetzt richtig eingefügt habe (Forumsneuling!).
Ich hoffe daraus geht jedenfalls hervor, wie ich mir das vorgestellt habe.
Vielen Dank für eine Rückanwort.



Moderation,4: CODE tags gesetzt
MfG
Klaus
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von komma4 »

Knoddler hat geschrieben:Wenn sich ein Export des Tabellenbereiches aus Calc in Access realisieren ließe
Dies -IMHO- auf keinen Fall.

Man kann mit BASIC bei einer über BASE registrierten Datenbank eine Verbindung aufbauen und SQL absetzen (INSERT Befehle).

Dabei sind die Daten aus CALC jedoch den Spalten der DB-Tabelle zuzuordnen - ein "Rüberwerfen" eines Datenarrays reicht da nicht.


Ob sich das mit Access realisieren lässt, kann ich Dir (mangels MS-Erfahrung) auch nicht beantworten.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Knoddler
Beiträge: 5
Registriert: Do, 23.06.2011 15:07
Wohnort: Dillingen im Saarland

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von Knoddler »

Hallo,
Danke für den Tipp.
Dann werde ich mal in meiner Literatur auf die Suche gehen, wie ich eine Datenverbindung aufbauen und über diesen SQL-INSERT-Befehl weiterkommen kann.
Übrigens:
Was bedeutet "-IMHO-"? Ich kann mir darunter überhaupt nichts vorstellen.
MfG
Klaus
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von komma4 »

Knoddler hat geschrieben:Dann werde ich mal in meiner Literatur auf die Suche gehen
Kannst auch hier im Forum (über Google) danach suchen:
connection sql site:de.openoffice.info

196 Treffer, bspw.: viewtopic.php?f=18&t=15947

Knoddler hat geschrieben:Was bedeutet "-IMHO-"?
in my humble opinion „Meiner unmaßgeblichen/bescheidenen/ehrlichen Meinung nach“
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Knoddler
Beiträge: 5
Registriert: Do, 23.06.2011 15:07
Wohnort: Dillingen im Saarland

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von Knoddler »

Hallo,
da bin ich mal wieder.
Ich habe mal versucht auf der Basis der Hinweise auf meine Anfrage hin und im Forum mein Problem so zu lösen, dass ich die einzelnen Tabellenfelder meines zu übertragenden Calc-Bereiches in einzelne String-Variablen speichere, die ich dann über eine INSERT-Anweisung einer (Roh-)Tabelle meiner Datenbank zuordne.
Allerdings erhalte ich den folgenden Fehlerhinweis: Siehe Dateianhang Writer-Dokument.
Mein Basic-Code sieht folgendermaßen aus:

Code: Alles auswählen

Sub SchreibeDB
On Error goto Err_handler   

REM Variable deklarieren
Dim oDatabaseContext As Object
Dim oDataSource As Object
Dim oConnection As Object
Dim oStatement as Object
Dim sSql, saktenf_kto, sSB, SKunde, sKust, sOEBest, sWV, sZeitstempel As String
Dim oDoc, oSheet as Object

Rem Variablen füllen   

oSheet = ThisComponent.sheets.GetByName("makros")
saktenf_Kto = oSheet.getCellRangeByName("ak").Getstring
sKunde = oSheet.getCellRangeByName("Kdn").Getstring
sSB = oSheet.getCellRangeByName("EBEA").Getstring
sKust = osheet.getCellRangeByName("Kust").Getstring
sOEBest = oSheet.getCellRangeByName("OE_Best").Getstring
sWV = oSheet.getCellRangeByName("WVTERM").Getstring
SZeitstempel = osheet.getCellRangeByName("TimeStamp").Getstring

   
REM Datenbank-Verbindung aufbauen  
   
oDatabaseContext=CreateUnoService("com.sun.star.sdb.DatabaseContext")         
oDataSource=oDatabaseContext.getbyname("WVDB")         ' Datenquelle holen
'If not oDatasource.ispasswordrequired then					'nur wenn passwortgeschützt
oConnection=oDataSource.getConnection("","")         ' Verbindung erstellen
'else														'nur wenn passwortgeschützt	
'oConnection=oDataSource.getConnection("benutzername","passwort")		'nur wenn passwortgeschützt
'EndIf															'nur wenn passwortgeschützt
   
oStatement = oConnection.createStatement()                  
REM Datensatz erzeugen, in DB schreiben mit SQL einfügen
sSql = "INSERT INTO ""TÜ"" (""aktenf_kto"", ""SB"", ""Kunde"", ""kust"", ""OEBest"", ""WV"", ""Zeitstempel"") VALUES ('"+saktenf_kto+"', '"+sSB+_
"', '"+sKunde+"'. '"+sKust+"', '"+sOEBest+"', '"+sWV+"', '"+sZeitstempel+"')"
oStatement.executeQuery(sSql)
oStatement.close()      ' Verbindung und Statement schliessen
   
Exit sub

Err_Handler:
msgbox Err &  ":" & chr(10) & Error & " in Zeile: " & Erl

End Sub
Ich hoffe, dass ich (als Neuling) den Code so korrekt eingefügt habe und nicht irgendwem noch zusätzliche Arbeit bereite. Wenn ich allerdings die in der vorliegenden Erfassungsmaske vorhandene Schaltfläche "Code" betätige, tut sich leider nichts.

Für weitere Hilfen zu meinem Problemchen wäre ich unendlich dankbar.



Moderation,4: CODE tags gesetzt
Dateianhänge
Exeption.odt
(14.81 KiB) 33-mal heruntergeladen
MfG
Klaus
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von komma4 »

Du willst sieben Spalten setzen, die Fehlermeldung zeigt Dir aber (deutlich!), dass nach drei gesetzten Variablen ein Punkt kommt (Tippfehler nach Kunde).

Das passt nicht!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Knoddler
Beiträge: 5
Registriert: Do, 23.06.2011 15:07
Wohnort: Dillingen im Saarland

Re: Calc-Bereich per Code in Base-Tabelle übertragen

Beitrag von Knoddler »

Hallo,
die Fehlermeldung hab ich wohl gesehen und auch, dass nur 3 Werte rüberkommen. Dass ich dann aber den Punkt als Komma gesehen habe ist wohl meiner Blindheit zu verdanken. Ich sollte doch meine Brille tragen.
Jedenfalls vielen Dank für den Hinweis und entschuldige meine Unachtsamkeit.
Da spielt sicherlich auch noch eine gehörige Portion Unsicherheit bei mir mit.

Und es funktioniert tatsächlich so, die Daten werden übertragen.
Nochmals, vielen Dank für die Tipps und die Hilfe.
MfG
Klaus
Antworten