[Gelöst] Standardwerte im Formular

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

Moderator: Moderatoren

Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

[Gelöst] Standardwerte im Formular

Beitrag von Christiana »

Hallo,

hier bin ich wieder mit meinem nächsten Problem.

Ein Screenshot von meinem Formular findet ihr
hier

Ich habe in meinem Formular in der oberen Tabelle Standardwerte für einige Spalten gesetzt.
Das funktioniert auch, aber leider nicht immer. Wenn schon Zeilen in meiner Tabelle vorhanden sind und ich eine neue Zeile aufrufe, erscheinen die gewünschten Standardwerte. Rufe ich in meinem Hauptformular einen anderen Datensatz auf, erscheinen nun in der Tabelle in der ersten Zeile ebenfalls die gewünschten Standardwerte. Mache ich nun aber, ohne irgendeine Eingabe zu tätigen ein Reload, bleibt die erste Zeile leer. Ebenso verhält es sich, wenn ich in meinem Hauptformular wieder einen Datensatz aufrufe, zu dem es in dem Unterformular noch keine Datensätze gibt. Merkwürdig daran ist auch, dass xray mir die Standardwerte richtig anzeigt . Diese erscheinen aber nicht in meiner Tabelle.
Hat jemand eine Erklärung für dieses Verhalten bzw. wie erreiche ich, dass meine Standardwerte bei jedem neuen Datensatz auch in der ersten Zeile erscheinen?

Viele Grüße
Christiana
Zuletzt geändert von Christiana am Mi, 01.07.2009 11:28, insgesamt 1-mal geändert.
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Standardwerte im Formular

Beitrag von Christiana »

Hallo,

zur Veranschaulichung und zum besseren Testen lade ich heute mal mein Calc-Formular und die DB-Tabelle hoch. Beide sind stark vereinfacht und anonymisiert.
Da das Kontingent für Dateianhänge immer noch vollständig ausgenutzt ist, ladet euch bitte meine Dateien hier und hier herunter.
Zum Testen bitte im Makro sAuftrag folgendermaßen anpassen:
1.Aufruf: sAuftrag = ”2008100“
2.Aufruf: sAuftrag = ”2009100“
3.Aufruf: sAuftrag = ”2009200“

Vielen Dank für eure Mühen
Christiana
OOo 3.1 mit WIN XP SP 3 und PostgreSQL 8.2
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Standardwerte im Formular

Beitrag von turtle47 »

Hallo Christiana,
Christiana hat geschrieben:Wenn schon Zeilen in meiner Tabelle vorhanden sind und ich eine neue Zeile aufrufe, erscheinen die gewünschten Standardwerte.
Ich würde mal sagen der Schein trügt.
Du setzt einen Filter mit sAuftrag = "2009100" und dann ist der Inhalt der Tabelle gleich null.
Das kannst Du sehen, wenn Du mal folgenden Test machst:

Code: Alles auswählen

	.......
	oGrid = oForm.getByName("TableControl")    
	oForm.reload()   
	'xray oGrid
	msgbox oGrid.parent.RowCount
	.......
Die MsgBox zeigt dann auch "0" an. Ausserdem ist die Steuerleiste in der Tabelle ausgegraut, also nicht funktionsfähig!
Warum beim ersten Mal der übergebene Text in der Tabelle erscheint kann ich Dir nicht sagen, aber das dürfte eigentlich nicht sein. Wo nix ist, kann man normalerweise auch nichts eintragen.

Man könnte jetzt folgendes machen:

Code: Alles auswählen

	.......
	oForm.reload()
	if oGrid.parent.RowCount = 0 then
	'tu irgendwas
	end if
	.......
Ich hoffe, ich konnte etwas Licht ins Dunkle bringen. 8)

Viel Erfolg.

Jürgen

Edit hat sich nochmal Gedanken gemacht:

Also, wenn Du mehrere gleiche Auftragsnummern hast, dann kannst Du das mit der If-Abfrage vergessen.
Auch wenn sich jetzt vielleicht einige die Haare raufen, ich habe mich mal an ein "INSERT INTO"-Statement gewagt:

Was wichtig ist, dass man "sAuftrag" beim Einfügen mitgibt, weil danach ja wieder gefiltert wird!

Code: Alles auswählen

Sub TestFormular2
Dim Context
Dim DB
Dim Conn 
Dim Stmt
Dim Result
Dim strSQL As String
	sAuftrag = "2009105"
	oDoc   = thisComponent     
	oSheet = oDoc.sheets.getByName("Tabelle1")
	oDraw  = oSheet.drawpage
	oForm  = oDraw.Forms.getByName("Standard")
	
	'Folgenden Filter kannst Du glaube ich vergessen
	'oForm.CommandType    =  2
	'oForm.Command        = "SELECT * FROM flst_alt WHERE auftrag = '" & sAuftrag & "';"    
	'oForm.Order			 = "auftrag, gemarkung, flur, flurstueck" 
	'oGrid = oForm.getByName("TableControl")    
	'oForm.reload()   	   
	'if oGrid.parent.RowCount = 0 then   
	' Ende vergessen
 	
	Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
	DB=Context.getByName("test_standardwerte")
	Conn=DB.getConnection("","")


	DBTables = Conn.getTables()
	TableName$ = "flst_alt"
	If DBTables.hasByName(TableName$) Then
	
	Stmt=Conn.createStatement()
	strSQL="INSERT INTO ""flst_alt""(""auftrag"",""gemarkung"",""flur"") VALUES (" & sAuftrag & ",'Gemarkung','24')"
	Stmt.executeUpdate(strSQL)
	oForm.Command        = "SELECT * FROM flst_alt WHERE auftrag = '" & sAuftrag & "';"    
	oForm.Order			 = "auftrag, gemarkung, flur, flurstueck" 
	Conn.close() 
	oForm.reload()
	End If
	'end if      	
End Sub
Was ich noch nicht rausgefunden habe ist das Aufheben von:

Code: Alles auswählen

oForm.Command        = "SELECT * FROM flst_alt WHERE auftrag = '" & sAuftrag & "';" 
damit wieder alle Datensätze angezeigt werden.
Vielleicht kann mir ja da jemand mal unter die Arme greifen. Danke.
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Standardwerte im Formular

Beitrag von Christiana »

Hallo Jürgen,

vielen Dank für Deine Hilfe. Licht ins Dunkle hast Du schon allein dadurch gebracht, dass du mir versuchst zu helfen.

Allerdings habe ich auch gemerkt, dass ich mich nicht immer verständlich genug ausgedrückt habe.
Christiana hat geschrieben:Wenn schon Zeilen in meiner Tabelle vorhanden sind und ich eine neue Zeile aufrufe, erscheinen die gewünschten Standardwerte.
Damit meinte ich, wenn ich z.B. zum Auftrag 2008100, zu dem ja schon Zeilen in der Tabelle vorhanden sind, noch eine neue Zeile hinzufügen möchte, dann kommen wie gewünscht die Standardwerte.

Eigentlich dachte ich ja auch, dass die Standardwerte auch erscheinen sollten, wenn die Tabelle noch leer ist.
Aber leider ist dem ja nicht so.

Dieser Ansatz hier gefällt mir sehr gut:
turtle47 hat geschrieben:.......
oForm.reload()
if oGrid.parent.RowCount = 0 then
'tu irgendwas
end if
.......
Allerdings habe ich dazu noch eine Frage. Entspricht oGrid.parent.RowCount = 0 gleich oForm.RowCount?
Dann könnte man die Abfrage noch folgendermßen ergänzen:

Code: Alles auswählen

if oForm.isNew and oForm.RowCount = 0 then...
turtle47 hat geschrieben:Was ich noch nicht rausgefunden habe ist das Aufheben von:
oForm.Command = "SELECT * FROM flst_alt WHERE auftrag = '" & sAuftrag & "';"
damit wieder alle Datensätze angezeigt werden.
Das kann man folgendermaßen erreichen:

Code: Alles auswählen

    oForm.Command        = "SELECT * FROM flst_alt;" 
Und damit hast du mich eben auf eine tolle Idee gebracht, die ich allerdings noch nicht geprüft habe.
Vielleicht könnte ich an die Stelle von 'tu irgendwas diesen Code einfügen:

Code: Alles auswählen

 oForm.Command        = "SELECT * FROM flst_alt;" 
 oForm.reload()
 oForm.Command        = "SELECT * FROM flst_alt WHERE auftrag = '" & sAuftrag & "';" 
Wenn die Tabelle flst_alt immer voller wird, könnte dann der Zugriff sehr lange dauern.
Vielleicht sollte ich die Tabelle speziell für diesen Fall in der DB noch einmal anlegen und nur mit einem Datensatz füllen.

Hoffentlich habe ich mich diesmal verständlicher ausgedrückt und Du kannst meinen Gedanken folgen.
Wenn das alles nicht klappt, bleibt mir ja immer noch das "INSERT INTO"-Statement.

Du hast mich auf viele neue Ideen gebracht und das ist gut so!
Also nochmals vielen herzlichen Dank!

Christiana
OOo 3.1 mit WIN XP SP 3 und PostgreSQL 8.2
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Standardwerte im Formular

Beitrag von turtle47 »

Hallo Christana,
Christiana hat geschrieben: Allerdings habe ich dazu noch eine Frage. Entspricht oGrid.parent.RowCount = 0 gleich oForm.RowCount?
Ich habe es mir xray nochmal überprüft und es scheint gleich zu sein.

Arbeitest Du auch mit xray?
Christiana hat geschrieben: Das kann man folgendermaßen erreichen:

Code: Alles auswählen
oForm.Command = "SELECT * FROM flst_alt;"
Oh man, vor den Kopf hau. So geht es. Vielen Dank. :D
Christiana hat geschrieben:Du hast mich auf viele neue Ideen gebracht und das ist gut so!
Das freut mich. :lol:

Schönen Tag noch.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Standardwerte im Formular

Beitrag von eBayer »

Hallo Christiana, Hallo Jürgen,
ich verfolge dieses Thema schon einen Weile interssehalber.
Besonders oForm.Command....... gefällt mir ganz gut. Ich selber hätte es bisher über einen über eine Variable versorgten Filter gelöst.
Vielleicht findet Ihr ja hier noch ein paar gute Ideen, oder Varianten zum Thema (siehe Link).
Ich bin jedenfalls begeistert über die Makro-Beispiele.
http://www.oooforum.org/forum/viewtopic.phtml?t=65111
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Standardwerte im Formular

Beitrag von Christiana »

Hallo eBayer,

vielen Dank für Deinen Link zu den Makro-Beispielen im englischen Forum.
Das muss ich mir auf jeden Fall noch einmal genauer anschauen. Solche Beispiele kann man nie genug haben. :D

Code: Alles auswählen

Ich selber hätte es bisher über einen über eine Variable versorgten Filter gelöst.


Genauso habe ich es am Anfang auch gemacht. Aber in meinem Fall soll der Anwender wirklich nur auftragsbezogen hintereinander weg arbeiten und an der Stelle nicht die Möglichkeit haben alle Aufträge zu sehen. Die Navigationsleiste meines Tabellenkontrollfeldes habe ich ausgeschaltet und dafür das Formular-Steuerelement ”Navigationsleiste“ eingefügt. Diese beinhaltet auch Filter- und Sortierfunktionen. Wenn ich mit oForm.Filter arbeite, ist der Filter-Button gedrückt und wenn ich ihn aufhebe, werden alle Aufträge angezeigt und genau das soll nicht sein. So kam ich dann auf die Idee das Ganze über den Command-Befehl einzuschränken.

In der Mehrzahl der Anwendungen wird der Filter-Befehl sicher die bessere Variante sein - je nach Aufgabenstellung.

Viele Grüße
Christiana
OOo 3.1 mit WIN XP SP 3 und PostgreSQL 8.2
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Standardwerte im Formular

Beitrag von Christiana »

Hallo Jürgen,

meine letzte Idee mit den Command-Befehlen hat nur in meinem Test-Formular geklappt, weil sich das Tabellenkontrollfeld in meinem Original-Formular in einem Subformular befindet und dann dauert das Ganze einfach zu lange. So habe ich doch noch auf Deine Idee mit dem "INSERT INTO"-Statement zurückgegriffen. Mir gefiel anfangs nur die Idee mit den Standardwerten besser, weil ich mich dann nicht auch noch um das Löschen der Zeile kümmern muss, falls jemand nur so herumgeklickert hat und keine zusätzlichen Werte eingegeben hat. Ebenso muss ich nun verhindern, dass man eine neue Zeile eingibt ohne in die erste Zeile zusätzliche Werte eingegeben zu haben. Ich musste schließlich feststellen, alles halb so schlimm. Ging alles wesentlich schneller als die Versuche die Sache mit den Standardwerten zum Laufen zu bringen.

Übrigens ist mir noch eine andere Variante zum "INSERT INTO"-Statement eingefallen:

Code: Alles auswählen

	If oSubFormFlstNeu.isNew and oSubFormFlstNeu.RowCount = 0 then
   			oSubFormFlstNeu.reload()    		   			   			
   			oSubFormFlstNeu.updateString(3,sGemarkung) '3.Spalte in DB-Tabelle   		
   			oSubFormFlstNeu.updateString(4,sFlur)
   			oSubFormFlstNeu.updateString(6,sLage)
   			oSubFormFlstNeu.insertRow()
	End If
Im Grunde genommen ist es aber das Gleiche.
Arbeitest Du auch mit xray?
Ja, wüsste gar nicht mehr wie ich ohne es arbeiten sollte.

Nochmals vielen Dank für Deine Hilfe! :D

Einen schönen Tag noch.
Christiana
OOo 3.1 mit WIN XP SP 3 und PostgreSQL 8.2
Antworten