Hilfe bei Dialogen

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

Moderator: Moderatoren

kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Hilfe bei Dialogen

Beitrag von kalle05 »

Hallo Speziallisten,
ich benötige eure Hilfe.
In einer Tabelle habe ich Fahrzeugdaten durch einen Dialog gespeichert. Nun möchte ich einige Daten ändern.
Durch eine InputBox komme ich auf die gesuchte Zeile. Mit

Code: Alles auswählen

Dim Dlg_PkwAendern as object
Dim TextField4 as object
 
    DialogLibraries.LoadLibrary( "Standard" )
    Dlg_PkwAendern = CreateUnoDialog( DialogLibraries.Standard.Dlg_PkwAendern)
    oDoc = ThisComponent
    oSheet =  ThisComponent.Sheets().getByName("BestandsListe") 

    oCelle=oDoc.getCurrentSelection().getCellAddress()  
    oRow =oCelle.Row +1                                    
    oCelle=oSheet.getCellByPosition(oColumn,oRow)

    oRow = ltrim(str(oRow))   
    cellname=oColumnName+oRow 
    rowAsInteger = CVar(oRow)  'CInt
    
    oCelle_Baujahr = oSheet.getCellRangeByName("C"&rowAsInteger) 
    Baujahr = oCelle_Baujahr.String()
Dlg_PkwAendern.getControl("TextField4").Text = Baujahr   
lade ich die gesuchte Zelle in das entsprechende TextFeld. Hier kann ich das Feld bearbeiten.
Leider scheitern meine Versuche, die neuen Daten in das Feld zurück zu schreiben. Trotz tagelangem Suchen, hier im Forum, finde ich keine Lösung.
Hinzu kommt, dass ich auch eine Formel für das Alter in die daneben befindliche Zelle schreiben muss. Wie ich dies bewerkstelligen muss, weiß ich auch noch nicht.
Vielleicht könnt ich mir helfen. Anbei eine abgespeckte Version.
Vielen Dank
Kalle
Dateianhänge
Pkw BestandFor.ods
(19.59 KiB) 121-mal heruntergeladen
:lol: Win 10
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Hilfe bei Dialogen

Beitrag von Toxitom »

Hallo Kalle,

also, das zurückschreiben haste doch einigermassen korrekt in Deinem Code;)

Ich empfehle Dir dennoch, Dich mehr mit den Grundlagen der Programmierung zu beschäftigen.

1. Der Dialog muss global definiert werden, wenn Du in Unterroutinen auf Elemente zurückgreifen möchtest.
2. Alle Dialog-Textfelder liefern Dir bestenfalls einen "String" zurück, also einen Text! Du versuchst aber, der Zelle einen "value" (also "Wert" = Zahl) zu übergeben. Das funktioniert natürlich nicht.
3. Auch Deine Dokumentenvariable solltest Du als Global erzeugen

Also: Dein Code müsste wie folgt aussehen:

Code: Alles auswählen

dim Dlg_PkwAendern as variant
dim oDoc as variant
 
REM jetzt dein Makro
Sub aendernMitSuche 
....
end sub

REM nun Dein Makro Ändern button
Sub Aenderung_speichern
' folgende Zeile hier weglassen!!
' oDoc = ThisComponent
   oSheet =  oDoc.Sheets().getByName("BestandsListe") 
  oCell = BestandsListe.getCellRangeByName("C" & "Baujahr")
  oCell.string = Dlg_PkwAendern.getControl("TextField4").Text  
  
  REM alternativ, falls Du ne Wert brauchst...
  '   oCell.Value = cVal(Dlg_PkwAendern.getControl("TextField4").Text)
end sub
Viele Spass
tom

Edit:
Dein "getCellRangeByName("C" & "Baujahr")" wird natürlich nix! Baujahr ist undefiniert und bedarf eines Zahlenwertes!
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
kalle2005
**
Beiträge: 26
Registriert: Do, 29.11.2018 18:52

Re: Hilfe bei Dialogen

Beitrag von kalle2005 »

Hallo Tom,
folgendes habe ich nach deinem Vorschlag durchgeführt:
zunächst als erstes:

Code: Alles auswählen

Global RegSearch as variant
Dim Dlg_PkwAendern as variant
Dim oDoc as variant

Sub aendernMitSuche
Dim oZellBereich as Object 
Dim getRow as integer
in Änderung speichern:

Code: Alles auswählen

   oSheet =  ThisComponent.Sheets().getByName("BestandsListe") 
   oCell = BestandsListe.getCellRangeByName("C" & "Baujahr") 
  oCell.string = Dlg_PkwAendern.getControl("TextField4").Text  
  ' oCell.Value = cVal(Dlg_PkwAendern.getControl("TextField4").Text)  
funktioniert leider nicht. Auch die Alternative sagt keinen Mucks.
Deine Bemerkung:
Dein "getCellRangeByName("C" & "Baujahr")" wird natürlich nix! Baujahr ist undefiniert und bedarf eines Zahlenwertes!
bringt mich nicht weiter. Ich habe in:

Code: Alles auswählen

rowAsInteger = CVar(oRow)
das Baujahr definiert als "CVar". Laut Pitonyak kann CVar Zitat: "Kann Daten jedes Typs enthalten. Oder übersehe ich hier etwas ?
Vielleicht kannst du mir auf die Sprünge helfen ?
Ich empfehle Dir dennoch, Dich mehr mit den Grundlagen der Programmierung zu beschäftigen.
Dies versuche ich ja, indem ich mir solche Aufgaben stelle. Nur so kann ich lernen.
Das Lesen allein oder der Nachbau von Andrew Pitonyak, Kochbuch, Calc_Gesamthandbuch_4_1, Dannhöfer(wobei Dannhöfer mit my sheet, usw. arbeitet) bringen mir nicht wirklich etwas.
Lieben Gruß
Kalle
Win 10 Pro, AOO 4.1.9
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Hilfe bei Dialogen

Beitrag von Toxitom »

Hey Kalle,

ich sag doch.... Basics;))

Pitoniak ist geeignet, Dannehöfer auch, das Kochbuch nicht, setzt intensive Vorkenntnisse voraus.

Code: Alles auswählen

Global RegSearch as variant
Bitte nicht.... brr. Nie!!! eine Variable mit "Global" definieren. UNd RegSearch kannst Du beruhigt innerhalb der Funktion definieren.

Mit global meinte ich: Definition der Variablen vor der ersten Funktion - dann stehen sie zur Laufzeit immer zur Verfügung.

Ansonsten: hier sind Fehler im Code (hab schon geändedrt):

Code: Alles auswählen

   oCelle=oDoc.getCurrentSelection().getCellAddress()  
    nRow =oCelle.Row +1                                    
    'oCelle=oSheet.getCellByPosition(oCelle.Column,nRow)

   ' oRow = ltrim(str(oRow))   
   ' cellname=oColumnName+oRow 
   ' rowAsInteger = CVar(oRow)  'CInt
   
oCelle ist das Zell-Objekt, oZelle.row die passende Zeile (index) als integer! ist also schon ne Zahl. Die Zeile darunter liefert Dir die gleiche Zelle erneut?? sinnlos.Den Rest brauchste auch nicht.

Code: Alles auswählen

 oCelle_Baujahr = oSheet.getCellRangeByName("C"&nRow) 
 Baujahr = oCelle_Baujahr.String
   
Statt mit Namen solltest Du eher mit Index-Zahlen arbeiten, aber egal.
Der String ist eine Eigenschaft der Zelle, keine funktion! also Klammern weglassen oder die Funktion getString() verwenden.

Zum Dialog: Wenn Du ne eigene Funktion für den Button schreibst, musst Du die "Button-Art" auf Standard setzen - bei OK der Dialog geschlossen und nix passiert.

In Deiner Eintrage-Funktion musst Du den Dialog wieder schliessen... sonst bleibt der offen.

Code: Alles auswählen

 Dlg_PkwAendern.endExecute() 
  
   oCell = oSheet.getCellRangeByName("C" & nRow)  
   oCell.string = Dlg_PkwAendern.getControl("TextField4").Text 
mehr nicht. Die Datei funktioniert jetzt, aber sie hat jede Menge Mängel immer noch.

Da sind schon Design-Schwächen drin - du arbeitest ja mit Datumswerten - sollte sich dann so auch im Code abbilden.
Und die Eingabe-box ist sicher auch nicht der Weisheit letzter Schluss;)

Aber wie schon erwähnt.... Basics!
Pkw BestandFor_tk.ods
(20.2 KiB) 111-mal heruntergeladen
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Hilfe bei Dialogen

Beitrag von Stephan »

Dies versuche ich ja, indem ich mir solche Aufgaben stelle. Nur so kann ich lernen.
Das Lesen allein oder der Nachbau von Andrew Pitonyak, Kochbuch, Calc_Gesamthandbuch_4_1, Dannhöfer(wobei Dannhöfer mit my sheet, usw. arbeitet) bringen mir nicht wirklich etwas.
Wirf doch, zu dem konkreten Thema (Calc-Tabelle und Eingabedialog), auch einmal einen Blick auf die Beispieldatei (und Doku) hier:
http://de.openoffice.info/viewtopic.php?f=18&t=1553

und dort im Bereich "Beispieldateien" der erste Eintrag "Fahrtenbuch".

Diese Datei ist von Tom und die Doku ist wirklich ausführlich, auch mit Erläuterungen zu den jeweiligen einzelnen Code-Zeilen.


Gruß
Stephan
kalle2005
**
Beiträge: 26
Registriert: Do, 29.11.2018 18:52

Re: Hilfe bei Dialogen

Beitrag von kalle2005 »

Hallo Tom,
vielen Dank, nRow scheint hier das Schlüsselwort zu sein.
"Global RegSearch as variant" habe ich hier im Forum gefunden. Mit
Und die Eingabe-box ist sicher auch nicht der Weisheit letzter Schluss;)
meinst du sicher die Inputbox.Ich hatte auch schon mit dem Gedanken gespielt, ein ListBox zu verwenden. Doch als Anfänger .......
Ich würde dir gern auch meine Origial-Datei schicken. Die Datei beinhaltett einen Dialog mit bisher fünf Seiten. Dort sieht das Design deutlich anders aus.
Vielen Dank nochmals. Ich werde mich weiterbilden und "weitere Mängel" suchen und ausbessern.
Gruß
Kalle
Hallo Stephan,
vor Monaten habe ich mir das Fahrtenbuch heruntergeladen und dann vergessen. Ich kümmer mich drum.
Vieln Dank für den Hinweis
Kalle
Win 10 Pro, AOO 4.1.9
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Hilfe bei Dialogen

Beitrag von Stephan »

Ich hatte auch schon mit dem Gedanken gespielt, ein ListBox zu verwenden.
sinnvoller Gedanke. Schau in die Fahrtenbuch-Beispieldatei dort ist ersichtlich wie sich das lösen lässt, denn auf dem dortigen Dialog gibt es Listenfelder deren List-Einträge aus der Calc-Tabelle eingelesen werden.


Gruß
Stephan
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Hilfe bei Dialogen

Beitrag von F3K Total »

Hallo zusammen,
ich finde ja, das ist mit Kanonen auf Spatzen geschossen.

Wenn Kalle doch eigentlich nur den aktuellen Datensatz in der Calc Tabelle komfortabel finden und dann ändern möchte, geht das Ganze auch komplett ohne Makro, mit Hilfen eines Listenfeldes über Daten/Gültigkeit, in dem man das Kennzeichen wählt, und einem Hyperlink, der dann zu eben der gesuchten Zeile in Calc springt, dann ändert man dort direkt in der Tabelle.
Ich habe jetzt nicht nachgezählt, denke aber, mehr Klicks als mit der Dialog/Makro Variante braucht man hiermit auch nicht.
Beispiel anbei.
Gruß R
Dateianhänge
Pkw BestandF3K.ods
(34.91 KiB) 97-mal heruntergeladen
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Hilfe bei Dialogen

Beitrag von kalle05 »

Hallo F3K Total,
ich habe mir heute deine Datei angsehen. Daten/Gültigkeit kenne ich. Was neu für mich war war der Hyperlink. Doch diese Anwendung kann ich für meine Datei nicht brauchen, denn ich habe in meiner Originaldatei zum Ändern bzw. zum Ansehen 10 Textfelder.
Mit Ändern meine ich z.B. "KW" statt "PS" eintragen zu können (nicht nur Baujahr); mit Ansehen meine ich z.B. Alter des Fahrzeuges heute, wieviel Jahre im Besitz usw. Das Ändern des Baujahres war ja nur dafür gedacht, mich auf den richtigen Weg zu weisen.

Meine Daten in einer Übersicht (Dialog) darzustellen finde ich persönlich elegant.
Den Hyperlink ist eine Anregung, die ich womöglich noch brauchen werde. Vielen Dank
Ich finde es schön. dass auch du dir Gedanken gemacht hast.
Kalle
:lol: Win 10
Antworten