Seite 2 von 2
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mo, 30.07.2012 17:21
von RobertG
Hallo Lain,
Lain hat geschrieben:Ich hatte gedacht, das eine kurze Beschreibung des Auftrages angebracht wäre, ich hatte versucht einen Tabelleneintrag (memo) zu erstellen und die Felder im Formular über den Feld-Navigator einzupflegen, aber das Feld wird garnicht in der Liste angezeigt, muß ich die Tabelle noch mal neu in beziehung setzen?
Zuerst einmal zu der Feldwahl: Der Feldtyp "Memo" ist für sehr große Textmengen gedacht. Der maximal zu erreichende Inhalt wird nicht begrenzt. Da kannst Du also Romane drin abladen (max. 2GB!). Ich habe das jetzt nicht mehr in Erinnerung, ob es bei der internen HSQLDB auch so ist - aber bei anderen Datenbanken wurde früher ein ähnlicher Datentyp von den normalen Sortier- und Suchfunktionen ausgeschlossen.
Text ("VARCHAR") hatte früher einmal eine Begrenzung von 255 Zeichen (was für eine kurze Beschreibung sicher reicht - bei Schreibmaschinen kamen ca. 70 Zeichen in eine Zeile ...), aber auch diese Begrenzung ist wohl mittlerweile aufgehoben. Zumindest kannst Du aber eine Grenze festlegen.
Und jetzt zur Position, an der Du dieses Feld in dem Formular einfügen musst. Ich habe dafür einmal das Formular "Auftragsbearbeitung" zum Bearbeiten geöffnet und dann auf den Formularnavigator geklickt, um den gesamten Formularbaum sichtbar zu machen. Das Formular, in dem die Erinnerung untergebracht werden muss, ist das dritte Unterformular mit dem Namen "Auftrag". Du kannst das Formular markieren und ein Textfeld hinzufügen. Dann wählst Du bei den Eigenschaften → Daten das entsprechende Feld aus. Das Feld muss dort zur Verfügung stehen, wenn es in der Tabelle "Auftrag" enthalten ist. Die Abfrage bezieht sich schließlich mit "Auftrag".* auf den gesamten Inhalt dieser Tabelle, auch neue Felder.
Gruß
Robert
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mi, 01.08.2012 10:55
von Lain
Hallo Robert,
wie immer hattest du vollkommen recht, das textfeld muss nicht so groß sein, die umstellung ist schon gemacht. Und auch das problem mit der unsichtbarkeit des Tabellen-Feldes im Feldhinzufügen-Fenster hatte sich nach einem neustart der DB gelöst ^^
Jetzt habe ich noch Problem. Ich möchte gern Daten aus dem Formuar "Auftragsbearbeitung" in eine Writer-Datei übertragen, natürlich habe ich dafür schon im Forum gesucht und auch einen vielversprechenden eintrag mit einem Makro gefunden. Ich habe alles vorbereitet und einen versuch gestartet, aber leider ist nichts geschehen, eine antwort vom Verfasser habe ich leider nicht erhalten.
Wahrscheinlich habe ich mal wider was wichtiges übersehen ^^
Vielen lieben Dank!!
Gruß Lain
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mi, 01.08.2012 14:41
von RobertG
Hallo Lain,
wenn Du wirklich nur einen Zettel brauchst, der Dir irgendwelche Auflistungen machst: Warum benutzt Du nicht den Report-Builder? Für OpenOffice steht der als Erweiterung zum Download, bei LO ist diese Erweiterung fester Bestandteil.
Das Makro werde ich mir einmal ansehen, obwohl die Alternative direkt in die *.odb-Datei integriert wäre.
Gruß
Robert
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mi, 01.08.2012 16:51
von Lain
Hallo Robert,
die erweiterung habe ich mir besorgt und experimentiere damit jertzt etwas rum. Mal sehen ob es das ist was ich brauche ^^
Kann man über eine schaltfläche im formular auch ein berichtsfenster öffnen, dem man dann den druckbefehl erteilen kann?
Liebe Grüße Lain
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mi, 01.08.2012 17:37
von Lain
Hallo Robert,
leider ist der Report-Builder nicht das was ich suche.
Das ganze soll so ablaufen, ich möchte, das bestimmete felddaten, die ich in dem Formular Auftragsbearbeitung eingegeben habe, per schaltflächenklick in eine vorgefertigte druckvorlage eingespielt werden, ohne es selbst alles tippen zu müssen.
bei dem Report habe ich es hinbekommen, das die ausführliche abfrage wider eine Liste erstellt hat, aber keine Druckvorlage, die nur einen Datensatz enthält.
Der sinn der sache soll sein, das man mit einem Klick eine Vorlage öffnet die sich als "Laufzettel" für den speziellen auftrag eignet und direkt ausgedruckt werden kann. Sas Layout des Laufzettels soll die automatisch eingefügten daten des Bestimmten Angebots enthalten, die gerade im Formular eingetragen sind, und eine Tabelle die per Hand gefüllt werden kann. Dieser Laufzettel soll auf einer auftragstasche befestigt werden und muss daher handschriftlich ergänzt werden können.
Ein nerviges unterfangen nicht wahr ^^ danke für deine hilfe, das ist wirklich toll von dir!
Liebe Grüße Lain
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mi, 01.08.2012 18:17
von RobertG
Hallo Lain,
kannst Du einmal Deinen Entwurf mit dem Report-Builder schicken? Ich mache ganau das, was Du willst, nämlich mit dem Report-Builder. In einer Vereinsdatenbank habe ich ein Schreiben, das an Mitglieder geht, die aus dem Verein austreten. Da klicke ich dann nach Eingabe des Austrittsdatums auf den Button, dann wird ein Brief mit Anschrift, Austrittstermin und gegebenenfalls Rückgabeforderung des Schlüssels für das Vereinshaus erstellt. Ich gebe nur den Primärschlüssel des Datensatzes an eine Abfrage weiter, die dann vom Bericht gelesen wird. Der Bericht erhält also nur über die Abfrage lediglich einen Datensatz.
Noch schneller geht es natürlich mit einem Mailmerge-Makro. Das statet dann gar nicht mehr sichtbar den Serienbrief des Writers, sonder leitet den Druck sofort an den Drucker weiter.
Aber, wie geschrieben, die Sache mit dem Report-Builder ist vom Begreifen her die einfachere Lösung für mich.
Gruß
Robert
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mi, 01.08.2012 21:05
von RobertG
Hallo Lain,
ich habe mir das Makro angesehen. Mir scheint das für Dein Formular nicht so gut geeignet zu sein. Das liegt daran, dass das Makro nur aus einem Formular die ihm zugrundeliegenden Tabelle mit den entsprechenden Spalten aufsucht:
oForm = oDoc.Drawpage.Forms(0)
oColumns = oForm.Columns
In Deinem Formular(0) steht aber lediglich ein Listenfeld. Da kann das Makro also nur das Listenfeld "Firma" aufsuchen und den Inhalt des Fremdschlüssels irgendwo anders ablegen.
Mir scheint aber, dass Du Inhalte aus den unterschiedlichen Subformularen zusammen ausgeben willst.
Ich kenne mich nicht so besonders mit Makros aus und muss auch immer wieder testen. Gegebenenfalls müsstest Du, um den Inhalt übertragen zu bekommen, alle Formulare gleichzeitig ansprechen:
oForm = oDoc.Drawpage.Forms(0)
oColumns = oForm.Columns
oForm1 = oForm.Forms(0)
oColumns1 = oForm1.Columns
oForm2 = oForm1.Forms(0)
oColumns2 = oForm2.Columns
oForm3 = oForm2.Forms(0)
oColumns3 = oForm3.Columns
Und das dann entsprechend auch in der Schleife erledigen:
If oColumns.hasByName(sColumnname) Then
nIndex = oForm.findColumn(sColumnname)
thisTextfield.Anchor.String = oForm.getString(nIndex)
End If
If oColumns1.hasByName(sColumnname) Then
nIndex = oForm1.findColumn(sColumnname)
thisTextfield.Anchor.String = oForm1.getString(nIndex)
End If
usw.
Jetzt tauchen bei Dir zweimal die Platzhalter "eMail" auf. In lediglich einem Formular ist aber eine E-Mail enthalten. Und dort heißt das Feld (noch) "Textfeld 1".
Mir scheint das zu aufwändig, jetzt Dein Formular dem Makro anzupassen, nachdem das Formular läuft. Schließlich liegt das nicht nur an dem einen gerade genannten Feld.
Du kannst es ja einmal mit den vorgeschlagenen Änderungen durchtesten. Auch wenn der Weg, den das Makro geht, erst einmal bestechend erscheint, so muss er für Dein spezielles Formular mit der Konstruktion Formular → Unterformular → UnterUnterformular → UnterUnterUnterformular nicht unbedingt der einfachste sein.
Gruß
Robert
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Di, 14.08.2012 17:39
von Lain
Hallo an alle,
also, ich habe mal geschaut, aber leider funzt das mit dem Makro zwar, aber halt noch nicht so ganz.
ich kann leider nicht erklären warum, ich habe das Formular "Auftragsbearbeitung" und die Writerdatei "Laufzettel.ott" genau aufeinander abgestimmt,
aber leider wird nur die Kundennummer nicht automatisch ausgefüllt.
Woran es Liegt kann ich leider nicht sagen,
aber auf jeden fall bin ich schon wehsentlich weiter, dank der liebe hilfe von Robert und DPunch, leute vielen dank dafür!!
Liebe grüße Lain
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Di, 14.08.2012 19:41
von DPunch
Servus
Dem Code fehlt noch eine Schleifenabbruch, nachdem ein Platzhalter ersetzt wurde.
Zudem weist Dein Formular eine weitere heikle Stelle auf, nämlich die Listbox mit verknüpftem Inhalt ("Sachbearbeiter" und "Firma").
Den dort verknüpften "lesbaren" Inhalt gibt das Formular selber nicht her, sondern nur die interne Repräsentation, nämlich die ID des Sachbearbeiters / der Firma.
Dies kannst Du zwar umgehen, indem Du noch eine Abfrage hinterherschiebst, in der auf ein so benamtes Feld prüfst, aber vermutlich deckt dieser Workaround nicht alle Eventualitäten ab, ich weiss es nicht.
Jedenfalls funktioniert es bei diesem Formular (und auch in anderen gleichartig gelagerten Fällen), wenn Du folgendes tust:
-in der Vorlage den Platzhalter "Abfrage_Sachbearbeiter_ausfuehrlich" ändern in "lboSachbearbeiter" und Platzhalter "Integer" in "lboFirma"
-im Formular das Listenfeld "Sachbearbeiter" umbenennen in "lboSachbearbeiter" und das Listenfeld "Firma" in "lboFirma" ("lboSachbearbeiter" sind nur Vorschläg, wichtig ist: Platzhalter und Listenfeld müssen den gleichen Namen haben)
-den ursprünglichen Code durch folgenden leicht modifizierten Code ersetzen:
Code: Alles auswählen
Private aForms()
Sub Main
oDoc = thisComponent
oForms = oDoc.Drawpage.Forms
For i=0 To oForms.Count-1
collectForms(oForms(i))
Next i
REM Pfad zur Vorlage zusammensetzen
Globalscope.BasicLibraries.loadLibrary("Tools")
sURL = oDoc.Parent.URL
sURL = DirectoryNameoutofPath(sURL,"/") & "/"
sURL = sURL & "Laufzettel.ott"
REM Vorlage öffnen
Dim args(0) as new com.sun.star.beans.PropertyValue
args(0).Name = "AsTemplate"
args(0).Value = True
newDoc = StarDesktop.loadComponentFromURL(sURL,"_blank",0,args)
REM Textfelder holen
enumTextfields = newDoc.Textfields.createEnumeration
Do While enumTextfields.hasMoreElements
thisTextfield = enumTextfields.nextElement
If thisTextfield.supportsService("com.sun.star.text.TextField.JumpEdit") Then
sColumnname = thisTextfield.PlaceHolder
For i=0 To UBound(aForms)
oForm = aForms(i)
oColumns = oForm.Columns
If oColumns.hasByName(sColumnname) Then
nIndex = oForm.findColumn(sColumnname)
thisTextfield.Anchor.String = oForm.getString(nIndex)
Exit For
ElseIf oForm.hasByName(sColumnname) Then
thisTextfield.Anchor.String = oForm.getByName(sColumnname).CurrentValue
Exit For
End If
Next i
End If
Loop
End Sub
Sub collectForms(baseElement)
If NOT baseElement.supportsService("com.sun.star.form.component.Form") Then
Exit Sub
End If
newUpper = UBound(aForms)+1
ReDim Preserve aForms(newUpper)
aForms(newUpper) = baseElement
For i=0 To baseElement.Count-1
collectForms(baseElement(i))
Next i
End Sub
Re: FormularProgrammierung_Anfägerhilfe
Verfasst: Mi, 15.08.2012 09:21
von Lain
Hallo DPunch,
Klasse es funktioniert! Toll damit Sind erstmal alle meine fragen geklärt!
Und falls noch was sein sollte, weiß ich ja wo ich die Antworten finden kann ^^
Vielen dank an euch Robert und DPunch ohne eure Tagkräftige hilfe hätt ich das nicht geschafft!
LG Lain