Seite 1 von 1

Falscher Datensatz wird geöffnet

Verfasst: Do, 06.10.2011 13:24
von Olek2
Hallo alle zusammen,

Nachdem mir mit meinem Problem mit de IF abfrage hier wunderbar geholfen werden konnte möchte ich euch mein nächtes nicht vorenthalten :)

Mit folgendem code hab ich das Problem das immer der erste Datensatz geöffnet wird. Wenn ich also den 6. Vertrag im Formular eingebe und sage er soll mir den Bericht erstellen
erstellt er den Bericht mit den Daten vom 1. Vertrag...
Ich habe jetzt hier nur deswegen 2 verschiedene Wege zum öffnen des Berichts genommen um zu zeigen das mit beiden Methoden der selbe Fehler Auftritt leider.

Code: Alles auswählen

Sub openReport
    oDoc = thisComponent
    oForm = oDoc.Drawpage.Forms(0)
    Miete = oForm.getString(oForm.findColumn("Miete"))
    
        if   Miete = "Miete" then
    	dim sReportName as string
		dim aReport()
		dim arg(1) as New com.sun.star.beans.PropertyValue
		sReportName = "Miet_Bericht"

			oContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
			oDatenbank = oContext.getByName(StarDesktop.CurrentComponent.getParent.getLocation())
			oVerb = oDatenbank.getConnection("","")
			arg(0).Name = "OpenMode"
			arg(0).Value = "open"
			arg(1).Name = "ActiveConnection"
			arg(1).Value = oVerb

			StarDesktop.CurrentComponent.getParent.getReportDocuments().loadComponentFromURL(sReportName,"Miet_Bericht", 0, Arg())
    else
  			oReport = ThisDatabaseDocument.reportDocuments.getbyname("Leasing_Bericht")
        	oReport.open
    end if
    
    
End Sub
Meine Vermutung ist ja das es der Fehler hier liegt und der Teil "ThisDatabaseDocuments" nicht den aktuellen Datensatz erkennt.

Code: Alles auswählen

oReport = ThisDatabaseDocument.reportDocuments.getbyname("Leasing_Bericht")

Re: Falscher Datensatz wird geöffnet

Verfasst: Do, 06.10.2011 20:52
von gogo
Ich gehe einmal davon aus, dass die Berichte "Miet_Bericht" und "Leasing_Bericht" eine Datenquelle haben - diese musste Du so modifizieren, dass nur der Datensatz angezeigt wird, den du brauchst. - Woher soll der Bericht denn sonst wissen welchen Datensatz Du sehen willst ;)

Berichte die mit dem Report-Builder erstellt wurden haben zwar eine Eingenschaft namens 'Filter', blos wie man die ansprechen kann hab ich noch nicht gefunden...

Wenn Du als Backend MySQL verwendest, und bei der Datenquelle des Berichtes "Art des Inhalts" SQL-Befehl steht, dann kannst Du diesen ja nach einer benutzerdefinierten Variablen filtern. Im Feld "Inhalt" steht dann z.B.:

Code: Alles auswählen

SELECT * FROM DatenBank.Tabelle where Tabelle.ID = @TabellenID;
Die Variable '@TabellenID' kannst Du dann im Makro das den Bericht aufruft per SQL-Statement setzen:

Code: Alles auswählen

oStatement = ThisDatabaseDocument.CurrentController.ActiveConnection.createStatement
oStatement.executeUpdate("SET @TabellenID=2;")
... wenn Du den Datensatz mit der ID 2 sehen willst.

g

Re: Falscher Datensatz wird geöffnet

Verfasst: Fr, 07.10.2011 08:17
von Olek2
Moin,

Ja die Berichte haben als Datenquelle die Base Tabelle. Was mich nur wundert ist das die IF-Abfrage mit dem aktuellen Datensatz arbeitet nur das öffnen des Berichtes nicht
da stellt sich mir die Frage woher weiss die IF-Abfrage welcehn Datensatz sie nehmen soll?

Und da mein Datensatz ständig wächst müsste sich diese TabellenID wie du sie vorschlägst automatisch eintragen..und dann müsste das Makro erst abfragen wie denn die ID ist
und dann die entsprechende ID öffnen und genau da ist mein Problem ich hab keine Ahnung wie ich das machen soll.
Wenn Du als Backend MySQL verwendest
Tut mir leid das versteh ich nicht hab nicht so die erfahrung mit base oder Basic...

Also ich weiss was nötig ist ein wert der sich automatisch mit einem Neuen Datensatz anlegt (geht auch Manuell? dann würd ich die Vertragsnummer nehmen.)
Und dieser Wert muss dann abgefragt werden durch das Makro und das Makro muss dann mit diesem Datensatz arbeiten...Nur hab ich keine Ahnung wie ich das machen soll leider.

Re: Falscher Datensatz wird geöffnet

Verfasst: Fr, 07.10.2011 11:42
von gogo
Die "If-Abfrage" Deines Makros bezieht sich auf den aktuellen Wert des Feldes "Miete" in Deiner Tabelle und zwar für den derzeit im Formular sichtbaren Datensatz.

Code: Alles auswählen

Miete = oForm.getString(oForm.findColumn("Miete"))
Der Bericht hat nichts mit dem zu tun, was das Forumlar gerade macht. Er besteht "vollkommen selbstständig".
Olek2 hat geschrieben: Und dieser Wert muss dann abgefragt werden durch das Makro und das Makro muss dann mit diesem Datensatz arbeiten...Nur hab ich keine Ahnung wie ich das machen soll leider.
Also: Woher soll der Bericht wissen, dass Du genau diesen Datensatz brauchst?

Du musst irgenwie den Datensatz kennzeichnen, damit der Bericht weiß welchen er darstellen soll.

Wenn ich das richtig verstanden haben, dann beutzt Du die interne Datenbank von Base. Da ist es wie im von ,4 beschriebenen Thread am einfachsten eine Spalte an die Tabelle dranzuhängen, in der immer der aktuelle Datensatz gekennzeichnet wird. Also:

1. Eine Spalte an Deine Tabelle dranhängen, (z.B. mit dem Namen "Druck", Datentyp z.B. Tinyinteger)
2. Datenherkunft des Berichtes verändern: am Besten eine Abfrage erstellen und speichern, die etwa so aussieht:

Code: Alles auswählen

Select * from ""Tabellenname"" where ""Tabellenname"".""Druck"" = 1;
3. Ausdruckmakro von oben verändern:

nach : Miete = oForm.getString(oForm.findColumn("Miete")) etwa Folgendes einfügen

Code: Alles auswählen

AktuelleID = oForm.getString(oForm.findColumn("ID")) '<===== sollte der Primärschlüssel Deiner Tabelle nicht 'ID' heißen,
                                                     '       dann hier und weiter unten ändern!
oStatement = ThisDatabaseDocument.CurrentController.ActiveConnection.createStatement
oStatement.executeUpdate("Update ""Tabellenname"" SET ""Tabellenname"".""Druck"" = 0 where ""Tabellenname"".""Druck"" = 1;")
oStatement.executeUpdate("Update ""Tabellenname"" SET ""Tabellenname"".""Druck"" = 1 where ""Tabellenname"".""ID"" = " & AktuelleID & ";")
Diese Zeilen verändern den Inhalt der Spalte "Druck". Da sollten dann überall Nuller drinstehen, nur beim aktuell angezeigten Datensatz ein Einser ... und der bewirkt, dass in der Abfrage (siehe Punkt 2) eben nur dieser Datensatz angezeigt wird.

g

Re: Falscher Datensatz wird geöffnet

Verfasst: Fr, 07.10.2011 14:24
von gogo
... hab mich noch ein bisschen gespielt, und dabei noch Folgendes rausgefunden:

Den Filter eines Reports kann man per Model verändern, allerdings nur wenn er geladen ist, sprich zur Runtime.

Code: Alles auswählen

oModelOfReport = ThisDatabaseDocument.currentcontroller.model.reportDocuments.getByName("Name_des_Berichtes")

with oModelOfReport
     .openDesign
     .Component.Filter = "Druck = 1"
     .open
     .close
end with
... wirklich schön ist das nicht, denn der Bericht ist ja kurze Zeit im Designmodus geöffnet, aber man gewinnt dadurch die volle Funktionalität des Filters.

g

Re: Falscher Datensatz wird geöffnet

Verfasst: Mo, 10.10.2011 10:37
von Olek2
Moin,

Es funktioniert alles :) ich danke euch....

Hab ne Abfrage in Base erstellt die "Druck" abfragt und davon den Bericht erstellen lassen so gehts :)

Danke euch allen

Re: Falscher Datensatz wird geöffnet

Verfasst: Fr, 13.01.2012 12:46
von Frieder D.
Hallo Makro und Excel Anfänger
Makro und Excel Anfänger hat geschrieben:Hallo,

hoffe ich finde hier noch Hilfe.
1. Wenn du ein neues Problem hast, dann erstelle auch einen neuen Beitrag, und schreibe es nicht unter einen vorhandenen Beitrag.
2. wenn ich das richtig sehe handelt es sich bei deinen Makro um ein "MS Exel" Makro und nicht um ein OpenOffice oder LibreOffice -Makro.
Da dies hier ein OpenOffice-Forum ist bist du also hier im falschen Forum. Probiere es doch mahl hier: http://www.ms-office-forum.net/forum/
Es sei denn du möchtest zu Libreoffice oder OpenOffice wechseln, dann hilft dir bestimmt jemand dein Makro in starBasic zu übersetze.
3.Deine Beschreibung ist einfach zu ungenau. Wichtig ist immer die Angabe deiner Software-Version, das Modul, indem das Makro angewarnt werden soll,
sowie eine detaillierte Beschreibung was das Makro machen soll.
4.Wenn du ein Foren-Neuling bist, lese bitte immer in der FAQ
wie mann neue Beiträge erstellt, und auf was man bei der Schilderung von Problemen achten sollte.
5. Wenn du ernsthaft an einer Lösung deines Problems interessiert bist, dann melde dich doch bitte im Forum an, und schreibe nicht als Gast.
Dadurch bekommst du mehr Rechte, und wirst per E-Mail über Antworten in deinen Beiträgen informiert.

Gruß Frieder