Makro für BaseDaten in Calc verarbeiten u. Bericht erstellen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Makro für BaseDaten in Calc verarbeiten u. Bericht erstellen

Re: Makro für BaseDaten in Calc verarbeiten u. Bericht erste

von Rolando » Di, 05.07.2011 17:40

Vielen Dank für die Zeilen. ich muß das mal genau ansehen und etwas probieren. Kann eine Weile dauern.

Re: Makro für BaseDaten in Calc verarbeiten u. Bericht erste

von komma4 » Di, 05.07.2011 12:02

Rolando hat geschrieben:Den gerade im Formular geöffneten Datensatz in eine RohdatenCalcdatei exportieren
Soweit verstanden.

OK, die ID des aktuell angezeigten Datensatzes bekommst Du mit folgendem Code, gebundenen an Kontrollfeld>Ereignisse>Aktion bestätigen:

Code: Alles auswählen

Sub aktuellerDatensatz( oEvent ) 
' 2011-07-05

oFormular = oEvent.Source.Model.Parent

iID = oFormular.getInt( oFormular.findColumn( "id" ) )

' Call makro_DatenExportieren( iID )

End Sub

Nun kannst Du das Makro von DPunch umbauen.
In die Calc-Datei kommt dann eine weitere Schaltfläche, die den Bericht aufruft.

Wenn Du das mit einem Bericht-Designer in BASE machen willst, wirst Du nicht umhinkommen, eine Hilfstabelle zu nehmen.
In diese wird die gewählte ID geschrieben, danach wird der Bericht gefiltert.

Damit bist Du aber schon wieder an meinem zuvor genannten Beispiel:
durch Auswahl der Schaltfläche wird ein Datensatz in die Hilfstabelle geschrieben (Mitarbeiter-ID/oder -Name, ID des gewählten Datensatzes).
Das kannst Du dann auch für den CALC Export nutzen

Code: Alles auswählen

SELECT d.*, h.mID, h.dID FROM "Datentabelle" as "d", "Hilfstabelle" as "h" WHERE d.ID = h.ID
Drag&Drop der Ergebnistabelle nach Calc, voila!


Noch ein Wort zur HSQLDB: Datensicherung!

Geht Dir die ODB kaputt, sind alle Formulare und Daten weg.

Besser ist eine echte Datenbank (MySQL, PostgreSQL) zur Datenhaltung (und -pflege, -sicherung).
Dann trotzdem die tägliche (bei Entwicklung: stündliche?!) Datensicherung der ODB nicht vergessen.

Wenn mehrere Personen gleichzeitig mit dem Datenbestand arbeiten wollen kommst Du um eine "echte" DB sowieso nicht herum.



Kommen wir weiter?

Re: Makro für BaseDaten in Calc verarbeiten u. Bericht erste

von Rolando » Di, 05.07.2011 09:27

Hallo Komma4 vielen Dank fürs Lesen. Es sind wenige (teils wechselnde) Anwender, die das Base Formular aufrufen und Daten eingeben. Das gleiche Formular kann aber nicht zweimal aufgerufen werden. Das wird blockiert. Wenn der Anwender die Daten eingegeben hat ruft er den Bericht auf wenn er will und andere schlagen nur im Formular nach einem Datensatz nach und rufen den Bericht auf.

Es handelt sich immer um den Datensatz, der gerade aufgerufen ist. Das kann der jüngste Datensatz sein oder auch ein älterer was der Anwender eben gerade nachgeschlagen hat. Der Datensatz wird eigentlich immer vorher im Formular angesehen, weil die Anwender dort nachschlagen wenn sie einen Bericht sehen wollen.

Dann habe ich eine Calc Arbeitsdatei in welcher statistische Berechnungen stattfinden, die recht komplex sind. Diese Arbeitsdatei greift auf die vom makro aus base erzeugte und gespeicherte CalcRohdatendatei zu.

Was also das makro soll ist: Den gerade im Formular geöffneten Datensatz in eine RohdatenCalcdatei exportieren, immer mit dem gleichen Namen am gleichen Ort abspeichern. Im Anschluss soll ein Bericht aufgerufen werden, der auf den Ergebnisteil der oben erwähnten Arbeitsdatei zugreifen soll. das heißt die Rohdaten des geöffneten Datensatz sind gespeichert und die Arbeitsdatei ist ja mit dieser CalcRohdaten-Datei verknüpft und bildet automatisch Ihr Ergebnis bei Aufruf. Wenn das Makro also den Bericht aufruft muss der Bericht auf Daten in der Arbeitsdatei zugreifen. Was bedeutet, dass der Bericht nicht auf Base zugreift sondern auf eine Calcdatei. Das bedeutet man muss dem Bericht irgendwie einen Datenquellenwechsel klarmachen.

Der Datensatz hat eine ID, den Primärschlüssel
openoffice 3.3.0
Windows 7 professional SP1
Ganz unten steht HSQL Datenbank Engine

Eigentlich ist das so, dass das Makro der Moderator für Basisaktionen darstellt, das auf immer wieder neue Projekte, die in Calc bearbeitet werden, angewendet werden kann. Wäre ja praktisch sowas. Man muss also nicht alle Formeln in Basic übersetzen sondern arbeitet im gewohnten Calc.

Das oben vorgeschlagene mit dem Rüberziehen in Calc und als Vorlage abspeichern habe ich getestet und werde es zur "Abspeicherung" und Aufruf der kompletten Datenbank in einem Calc File verwenden. Das hat aber nichts mit unserer Aufgabenstellung zu tun.

Vielen Dank Roland

Re: Makro für BaseDaten in Calc verarbeiten u. Bericht erste

von komma4 » Mo, 04.07.2011 18:04

Sag' doch mal konkret, was Du möchtest:

Der Anwender (wie viele denn insgesamt?) arbeiten mit ein(em) BASE-Formular(en)?
Muss er mit der ODB arbeiten? Oder nur den Bericht erzeugen?


Soweit ich Dich verstanden habe geht es immer um den jüngsten Datensatz?

Der hat eine ID oder Zeitstempel?

Muss der Datensatz im Formular erst angesehen werden? Oder reicht es den Bericht mit dem aktuellsten vorhandenen Datensatz zu erstellen?

Welche OOo-Version?
Welches Betriebssystem?
Welche Datenbank (embedded HSQLDB? Angabe steht in der Statuszeile der ODB)

Re: Makro für BaseDaten in Calc verarbeiten u. Bericht erste

von komma4 » Mo, 04.07.2011 14:37

Moderation,4: Crossposting ohne Referenz ist unhöflich!


http://www.oooforum.org/forum/viewtopic.phtml?t=124986

Re: Makro für BaseDaten in Calc verarbeiten u. Bericht erste

von komma4 » Mo, 04.07.2011 13:57

Willkommen im Forum.

Rolando hat geschrieben:3. Bei Klick auf Schaltfläche soll nur ein Datensatz (immer der aktuell geöffnete) aus Base in eine Calc Datei(A) exportiert werden
Dafür braucht es kein Makro.
Eine BASE-Abfrage genügt: hier beschrieben viewtopic.php?f=8&t=24477&start=0#p104754

Deinen Bericht kannst Du mit Writer gestalten und die benötigten Felder aus Calc per DDE einsetzen.

Viel Erfolg!

Makro für BaseDaten in Calc verarbeiten u. Bericht erstellen

von Rolando » Mo, 04.07.2011 12:19

Hallo,
ich bin Anfänger und neu im Forum und will ein Makro schreiben. Ich habe einen Export Code (siehe unten von Mitglied DPunch). Für die ganze Datenbank. In meinem Fall soll nur jeweils der aktuelle Datensatz geholt werden. Zusammengefasst: Makro öffnet aktuellen Datensatz speichert und überschreibt einen Calc File und ruft einen Bericht oder eine Abfrage auf.

Wer weiß was hierzu. Vorteil ist, daß man im komfortablen Base Formular Daten erheben kann, im gewohnten Calc verarbeiten und mit dem komfortablen Base Bericht oder der Abfrage die Ergebnisse darstellen kann. Das wäre eine gute Lösung für die einfachste Anwendung mit Base und Calc. 1. Datenerfassung 2. Datenverarbeitung 3. Ergebnisdarstellung
So ein Makro wäre doch Spitze und vielfältig einsetzbar. Wenn wir das hier hinkriegen, könnten das viele verwenden. Bei uns läuft OpenOffice 3.3.0.
Der am Ende des Makros auskommentierte Bereich funktioniert noch nicht.

Im Detail:
Das Makro soll folgendes ausführen.
1. Ich habe ein Formular das schreibt Roh-Daten in eine Base Tabelle. Läuft schon.
2. In diese Tabelle soll eine Schaltfläche mit einem Makro. Schaltfläche schon eingebaut.
3. Bei Klick auf Schaltfläche soll nur ein Datensatz (immer der aktuell geöffnete) aus Base in eine Calc Datei(A) exportiert werden. (Läuft schon über alle Datensätze mit Deinem Code. Vielen Dank. Aber brauche ich nur für nur einen Datensatz.
4. Also diese exportierte Calc Tabelle mit dem einen Datensatz öffnet sich und soll nun abgespeichert werden an einem definierten Ort und mit immer dem gleichen Namen. Die Calc Datei(A) darf immer wieder überschrieben werden.
5. Diese abgespeicherte Rohdatentabelle (A) ist mit einer Calc Datei (B) verknüpft, die Berechnungen durchführt. Die Ergebnisse der Berechnungen in der Calc Datei (B) sollen nun vom Makro über den Aufruf eines Base Berichtes oder einer Abfrage ausgelesen werden und geöffnet werden, so daß derjenige, der die Schaltfläche betätigt diesen Bericht sieht. Der Bericht oder die Abfrage braucht nicht gespeichert werden.
7. Alle Schritte bis zum Öffnen des Berichtes sollten versteckt ablaufen. Erst der Bericht soll wieder sichtbar werden. ev. mit oDoc.lockControllers und oDoc.unlockControllers

Calc Datei (B) muß nicht geöffnet werden sondern es müssen nur die Ergebnisfelder als Bericht oder Abfrage ausgelesen werden. Da die Calc Datei (A) ja immer den aktuellen Datensatz enthält ist ja der Base Bericht immer aktuell.

Da wir mit Calc besser umgehen können und unsere benötigten Berechnungen darin ausführen, wollten wir unsere Berechnungen nicht in Basic übersetzen. Obwohl das ja eventuell gehen soll: Für uns zu kompliziert.Mit einem Makro das das obige kann, können wir komfortabel Daten in eine Datenbank eingeben und komfortabel per Klick (eben für unsere nichversierten Anwender) einen Ergebnisbericht an die Oberfläche holen.

Code: Alles auswählen

Sub ExportData
   REM Speicherpfad
   sPath = "C:"
   REM Dateiname
   sTitle = "Datenexport vom " & Date & ".ods"
   REM Name der Abfrage, Tabelle oder SQL-Statement
   'sQueryName = "Screening_Tabelle_1"
   'sQueryName = "Abfrage_Screening_Tabelle_1"
   sQueryName = "SELECT * FROM ""Screening_Tabelle_1"""
  'sQueryName = "SELECT * FROM ""Abfrage_Screening_Tabelle_1"""
      
   sURL = ConvertToURL(sPath & "/" & sTitle)
   If FileExists(sURL) Then
      i = MsgBox(">" & sTitle & "<" & Chr(13) & "Datei existiert bereits." & _
                  Chr(13) & Chr(13) & "Überschreiben?",52,"Hinweis")
      If i <> 6 Then
         Exit Sub
      End If
   End If
   oCon = thisComponent.Parent.CurrentController.ActiveConnection
   If oCon.Tables.hasByName(sQueryName) Then
      oPrepStatement = oCon.prepareCommand(sQueryName,0)
   ElseIf oCon.Queries.hasByName(sQueryName) Then
      oPrepStatement = oCon.prepareCommand(sQueryName,1)
   Else
      oPrepStatement = oCon.prepareCommand(sQueryName,2)
   End If
   oResult = oPrepStatement.executeQuery
   aColumns = oPrepStatement.Columns.ElementNames
   oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc","_blank", 0, Array())
   oSheet = oDoc.Sheets(0)
   nColumnCount = UBound(aColumns)
   Dim aLine(nColumnCount)
   Dim aData(0)
   aData(0) = aColumns
   nUpperBoundary = 0
   Do While oResult.Next
      nUpperBoundary = UBound(aData)+1
      ReDim Preserve aData(nUpperBoundary)
      ReDim aLine(nColumnCount)
      For i = 0 To nColumnCount
         aLine(i) = oResult.getString(i+1)
      Next i
      aData(nUpperBoundary) = aLine
   Loop
   oRange = oSheet.getCellRangeByPosition(0,0,nColumnCount,nUpperBoundary)
   oRange.setDataArray(aData)
   Dim args(0) as New com.sun.star.beans.PropertyValue
   Dim Dateiname
   args(0).Name = "Overwrite"
   args(0).Value = True
'Dateiname = GetVariable(oDoc,"Screening_Tabelle_1")
'URL = "C:\Users\user\Documents\"
'sURL = ConvertToURL(URL + Dateiname)
'oDoc.storeAsURL(sURL, arg())

End Sub


Moderation,4: CODE tags gesetzt

Nach oben