🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Unterschied Korrelierte Unterabfrage - Unterformular

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Unterschied Korrelierte Unterabfrage - Unterformular

Beitrag von RobertG » Di 30. Dez 2014, 11:55

Hallo Freischreiber,

vielleicht so:

Code: Alles auswählen

If sColumnname = "Anrede" Then
thisTextfield.Anchor.String = stAnrede
End If
... wobei Du stAnrede natürlich so ermitteln solltest, wie in dem geänderten Code aufgeführt.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Unterschied Korrelierte Unterabfrage - Unterformular

Beitrag von Freischreiber » Di 30. Dez 2014, 15:31

Hallo Robert,

ja! das wars... und zwar nicht nur für Listenfelder, sondern auch für Tabelleninhalte, hier stAuftrag. Das hab ich nur oben nicht mit selecteditem befüllt, sondern mit

Code: Alles auswählen

stAuftrag = oFormAuftraege.getstring(oFormAuftraege.findcolumn("AuftragID"))
Insgesamt sieht das Makro jetzt so aus und befüllt in einem Writer-Dokument die Platzhalter-Felder
(<Firma><Abteilung>
<Vorname> <Nachname>
<Straße>
<PLZ> <Ort>) also einfach alles, was direkt als Textfeld im Hauptformular steht :roll:
sowie die Inhalte aus den Listenfeldern: in <Anrede> <Titel>
und aus den Tabellenfeldern: in <Kontakt> und <Auftrag>

Vielleicht kann es ja nochmal jemand so brauchen, ich finde das sind Informationen, die man in jedem Brief haben sollte :mrgreen:
Und vielleicht kann es jemand noch ausführlicher kommentieren - richtig verstanden habe ich es leider nicht...

Vielen Dank, auch an DPunch und F3K Total!

Gruß
Freischreiber

Code: Alles auswählen

Sub Textfieldmakro
 DialogLibraries.LoadLibrary( "Standard" )

       oDoc = thisComponent
       oDrawpage = oDoc.drawpage
       oForm = oDrawpage.forms.getbyName("MainForm")
  
       oFormKontakt = oForm.getbyname("FormKontakt")
       oFormAuftraege = oForm.getByName("Unterformular Auftraege")
        oColumns = oForm.Columns
        nKontakt = oFormKontakt.getint(oFormKontakt.findcolumn("KontaktartID"))
        scurrentKontakt = oFormKontakt.getString(oFormKontakt.findcolumn("Nummer"))
    
		' Listenfelder auslesen
        oController = oDoc.getCurrentController()
        ' Listenfeld Anrede:
  	    oListenfeldAnrede = oForm.getByName("fmtAnredenID")
  	    oView = oController.getControl(oListenfeldAnrede)
        stAnrede = oView.SelectedItem
        ' Listenfeld Titel:
        oListenfeldTitel = oForm.getByName("fmtTitelID")
  	    oView = oController.getControl(oListenfeldTitel)
        stTitel = oView.SelectedItem
        
		'Tabellenkontrollfelder auslesen
		'Tabelle Aufträge
'Cursor-Fehlermeldung vermeiden, wenn kein Auftrag vorhanden:
select case Auftrag
case "AuftragID" IS NULL
stAuftrag = ""
case else stAuftrag = oFormAuftraege.getstring(oFormAuftraege.findcolumn("AuftragID")) 'Variablenbelegung, wenn AuftragID vorhanden.
end select
        
        select case nKontakt
        case 3
          scurrentKontakt = "per Fax: " & scurrentKontakt                  
        case 6
           scurrentKontakt = "per Mail: " & scurrentKontakt
       Case else
          scurrentKontakt = ""
       end select
       REM Pfad zur Vorlage zusammensetzen
       Globalscope.BasicLibraries.loadLibrary("Tools")
       sURL = oDoc.Parent.URL
       sURL = DirectoryNameoutofPath(sURL,"/") & "/"
       sURL = sURL & "Briefvorlage.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
             
             if thisTextfield.PlaceHolder = "Kontakt" Then 'Sonderfall vom Unterformular kommt   
                 thisTextfield.Anchor.String = scurrentKontakt
             end if
            
             If oColumns.hasByName(sColumnname) Then
                nIndex = oForm.findColumn(sColumnname)
                thisTextfield.Anchor.String = oForm.getString(nIndex)
             End If              
          End If
		  
		  ' Listenfeldinhalte holen:
          If sColumnname = "Anrede" Then
			thisTextfield.Anchor.String = stAnrede
		  End If          
		  If sColumnname = "Titel" Then
			thisTextfield.Anchor.String = stTitel
		  End If
		  
		  ' Tabellenfeldinhalte holen:
		  If sColumnname = "Auftrag" Then
			thisTextfield.Anchor.String = stAuftrag
		  End If 
       Loop
    End Sub

Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Unterschied Korrelierte Unterabfrage - Unterformular

Beitrag von Freischreiber » Mi 31. Dez 2014, 10:21

:oops:

Es geht so nicht.

Ohne das "select case Auftrag"... kommt, sobald zu einer Adresse gar kein Auftrag vorhanden ist in dem Tabellenkontrollfeld, beim Ausfüllen:
"BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Der Cursor zeigt vor die erste bzw. hinter die letzte Zeile.."

Und mit dem select case (oder auch mit if...then) wird das Feld, auch wenn eine AuftragID drin steht, gar nicht mehr ausgefüllt. Irgendwas muß an der Bedingung falsch sein, die ist wohl immer wahr:
case "AuftragID" IS NULL

Kann jemand sehen, wie die Bedingung richtig lauten müßte?

Danke
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Unterschied Korrelierte Unterabfrage - Unterformular

Beitrag von RobertG » Mi 31. Dez 2014, 11:16

Hallo Freischreiber,

wo holst Du denn "AuftragID" her?

Das Formulierungen von Bedingungen bei Feldern, die keinen Wert haben sollten, ist für mich manchmal auch ein Testspiel. Häufig behelfe ich mir damit, eine Varibale grundsätzlich zuerst als Text zu definieren und später umzuformen:

Code: Alles auswählen

IF stAuftragID <> "" THEN
würde dann funktionieren.

Code: Alles auswählen

CASE "AuftragID" IS NULL 
klingt mehr danach, als hättest Du einen Teil aus einer Abfrage in Deinen Makrocode kopiert.
Es gibt:

Code: Alles auswählen

IsEmpty(Variable) ' leer
IsNull(Variable) ' noch nichts zugewiesen
Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Unterschied Korrelierte Unterabfrage - Unterformular

Beitrag von Freischreiber » Mi 31. Dez 2014, 12:42

Hallo Robert,

das hier verstehe ich nicht:
Häufig behelfe ich mir damit, eine Varibale grundsätzlich zuerst als Text zu definieren und später umzuformen:

Ich versuche jetzt:

Code: Alles auswählen

'Cursor-Fehlermeldung vermeiden, wenn kein Auftrag vorhanden:
if IsNull( oFormAuftraege.getstring(oFormAuftraege.findcolumn("AuftragID"))) then
stAuftrag = ""
else stAuftrag = oFormAuftraege.getstring(oFormAuftraege.findcolumn("AuftragID")) 'Variablenbelegung
endif
und bekomme die Fehlermeldung mit dem Cursor jetzt schon in der if-Zeile...

Irgendwie mag er wohl dieses findcolumn schon gar nicht, wenn es keine Spalten gibt, weil es in der Zwischentabelle gar keinen Eintrag zu der Adresse hat.

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Unterschied Korrelierte Unterabfrage - Unterformular

Beitrag von RobertG » Mi 31. Dez 2014, 17:44

Hallo Freischreiber,

oFormAuftraege.findcolumn("AuftragID") - findet die entsprechende Spaltenzahl, die den Namen "AuftragID" hat. Wenn die Spalte gar nicht existiert, dann kann da gar kein Wert heraus geholt werden. Absichern kannst Du das, indem Du

Code: Alles auswählen

inColumn = oFormAuftraege.findcolumn("AuftragID")
setzt, wobei dann inColumn INTEGER ist. Ist inColumn > 0, dann gibt es die Spalte.
Mit

Code: Alles auswählen

stText = oFormAuftraege.getstring(oFormAuftraege.findcolumn("AuftragID"))

oder

Code: Alles auswählen

stText = oFormAuftraege.getstring(inColumn)
kannst Du dann aus der Spalte den Wert heraus ziehen.
Mit

Code: Alles auswählen

IF stText <> "" THEN
kannst Du dann weiter arbeiten, wenn in der vorhandenen Spalte auch ein Eintrag vorhanden ist.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Unterschied Korrelierte Unterabfrage - Unterformular

Beitrag von Freischreiber » Mi 31. Dez 2014, 18:14

Hallo Robert,

das klingt gut, und sobald ich etwas mehr Ruhe habe, werde ich versuchen, das ins Makro zu bringen.

Was ich nur nicht verstehe: daß es bei der Abfrage der Kontakte-Tabelle ja offenbar ohne so eine Sicherung geht:

Code: Alles auswählen

nKontakt = oFormKontakt.getint(oFormKontakt.findcolumn("KontaktartID"))
        scurrentKontakt = oFormKontakt.getString(oFormKontakt.findcolumn("Nummer"))
nKontakt wird zwar gespeichert und unten wird der String ergänzt, falls es Fax oder Mail ist, aber scurrentKontakt wird gleich belegt, und das gibt keine Fehlermeldung, auch wenn gar keine Kontakteinträge da sind zu der Adresse.

Gruß und guten Rutsch
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten