Dialog "DateField" -array

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

Moderator: Moderatoren

Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Dialog "DateField" -array

Beitrag von Jörg »

Hallo Fachleute,
sicher könnt Ihr mir dabei helfen.
Mit einem Dialog möchte ich Datumsangaben in Zellen eintragen.
Er enthält 10 DateFields (DateField1 bis DateField10)
Die zu befüllenden Zellen: Spalte Y,letzte Zeile bis Spalte AH,letzte Zeile
Die letzte Zeile wird in Spalte A ermittelt.

Code: Alles auswählen

sub Behandlungsdaten_Speichern '11-20

'oDialog9.endExecute()
osheet = ThisComponent.Sheets.GetByName("Tabelle16")
  oCellCursor = osheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    nRow = oCellCursor.getRangeAddress(0).endRow
'msgbox nRow
Zelle = osheet.getCellRangebyName("Y" & nRow +1)
oZelle = osheet.getCellRangebyName("Z" & nRow +1)
	Zelle.formulalocal = oDialog9.getControl("DateField1").text 
		oZelle.formulalocal = oDialog9.getControl("DateField2").text   
		'usw.
End Sub	
Der Code funktioniert soweit, aber ich kriegs nicht als Array hin, sondern nur für jede Zelle einzeln.
Danke!
Gruß Jörg

Win 10 Pro AOO 4.1.15
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Dialog "DateField" -array

Beitrag von F3K Total »

Hi,
du sprichst nicht von einem Array, sondern von einer Schleife, nehme ich an.
Aus dem Kopf, versuche es mal hiermit:

Code: Alles auswählen

sub Behandlungsdaten_Speichern '11-20

'oDialog9.endExecute()
    osheet = ThisComponent.Sheets.GetByName("Tabelle1")
    oCellCursor = osheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    nRow = oCellCursor.getRangeAddress(0).endRow
    for i = 1 to 10
        Zelle = osheet.getCellbyPosition(23+i, nRow)
	Zelle.formulalocal = oDialog9.getControl("DateField"+i).text 
    next i
End Sub
Gruß R
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Dialog "DateField" -array

Beitrag von Jörg »

Hallo F3K Total,
ich danke Dir. Funktioniert wie gewünscht. Hatte ich in ähnlicherweise auch probiert, aber irgendwo einen Fehler gehabt.
Schönes Wochenende.
Gruß Jörg

Win 10 Pro AOO 4.1.15
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Dialog "DateField" -array

Beitrag von Jörg »

Hallo Fachleute,
würde doch noch einmal gern auf das Thema zurückkommen und beziehe mich auf meine Ausgangsfrage.
Der Code von R funktioniert, aber leider ist die Performance nicht so toll, da ja jede Zelle nacheinander befüllt wird.
Das dumme ist, dass ich bereits ähnliche Macros zu laufen habe, allerdings mit TextFields oder NumericFields.
Es scheint als müßten DateFields anders deklariert werden.
Aus Dannenhöfer (Besonderheiten von...) werd ich nicht schlauer.
Mein Code:

Code: Alles auswählen

sub Letzte_Zeile

Dim array_1 (10) 
oDoc = thisComponent
   osheet = ThisComponent.Sheets.GetByName("Tabelle16")
    oCellCursor = osheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    nRow = oCellCursor.getRangeAddress().endRow   
            
for ta = 1 to 11
  array_1(ta-1) = oDialog9.getControl("DateField" & ta).text
  
next ta

array_1 = Array(array_1())
 osheet.getCellRangeByPosition(24, nRow+1, 33, nRow+1).setDataArray(array_1()) 
   'msgbox ocell
end sub    
Hier krieg ich die Fehlermeldung: Objectvariable nicht belegt.

Code: Alles auswählen

array_1(ta-1) = oDialog9.getControl("DateField" & ta).text
.text kommt mir ja komisch vor, aber value oder Date klappen ebenfalls nicht.

Eine zweite Frage, aus aktuellem Anlass:
Wie können die Inhalte der Datefields gelöscht werden (für neuerliche Eingaben), ohne den Dialog neu zu starten?
Würd mich freuen!!
Gruß Jörg

Win 10 Pro AOO 4.1.15
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Dialog "DateField" -array

Beitrag von F3K Total »

Wie wäre es, wenn du mal eine ggf. verfremdete Datei, die aber Makro und Dialog enthält, hochladen würdest?
Um sicher helfen zu können, müssten wir uns sonst deine Datei nachbauen, das erwartest du nicht wirklich.
Gruß R
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Dialog "DateField" -array

Beitrag von balu »

Hallo Jörg,

Hier krieg ich die Fehlermeldung: Objectvariable nicht belegt.
Im günstigsten Falle ist die Variable oDialog9 nicht Ordnungsgemäß von dir deklariert worden. Das heißt, Du hast wahrscheinlich folgende Deklaration vorgenommen,

Code: Alles auswählen

Dim oDialog9 as Object
aber dies hast Du innerhalb einer Sub gemacht, anstatt am Modulanfang vor einer Sub.

Aber R hat schon Recht, wenn er nach einer Beispieldatei fragt. Denn dann kann man sich das zur Not besser anschauen, für den Fall das mein Hinweis nicht fruchtet.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Dialog "DateField" -array

Beitrag von Jörg »

Hallo,
@Balu ne leider nich so.
Habe:
Public oDialog9 as Object
aber ich pack mal Bsp. ran.
Tabelle1: Schaltfläche.
Tabelle16: Die Spalten A - X werden vorab "befüllt"
erst dann kommt u.U. der Dialog zum Einsatz (in meiner Orginal-Eingabemaske, ist aufgrund vieler anderer Eingaben kein Platz mehr und Tabelle16 hat ca. 4000 Zeilen, so dass die direkte Eingabe nicht so toll ist).
Unbenannt_Datefields.ods
(16.58 KiB) 145-mal heruntergeladen
Gruß Jörg

Win 10 Pro AOO 4.1.15
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Dialog "DateField" -array

Beitrag von Jörg »

Dieser Code gehört natürlich rein.
Der im Modul ist der von R.

Code: Alles auswählen

sub Letzte_Zeile

Dim array_1 (10) 
oDoc = thisComponent
   osheet = ThisComponent.Sheets.GetByName("Tabelle16")
    oCellCursor = osheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    nRow = oCellCursor.getRangeAddress().endRow   
            
for ta = 1 to 11
  array_1(ta-1) = oDialog9.getControl("DateField" & ta).text
  
next ta

array_1 = Array(array_1())
 osheet.getCellRangeByPosition(24, nRow+1, 33, nRow+1).setDataArray(array_1()) 
   'msgbox ocell
end sub    
Gruß Jörg

Win 10 Pro AOO 4.1.15
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Dialog "DateField" -array

Beitrag von F3K Total »

So sollte es klappen,
das Makro Dialog9 habe ich umbenannt.
Das Makro Behandlungsdaten_Loeschen an einen neuen Button zum Löschen der Eingabe hängen.

Code: Alles auswählen

Public oDialog9 as Object

Sub Behandlungsdaten_Eingeben
    odoc = ThisComponent
    DialogLibraries.loadLibrary("Standard")	
    oDialog9 = CreateUnoDialog(DialogLibraries.Standard.Dialog9)
    oForm = DialogLibraries.Standard.Dialog9
    oDialog9 = CreateUnoDialog( oForm )
    oDialog9.execute
end sub

Sub Behandlungsdaten_Speichern
    dim lDate as Long
    osheet = ThisComponent.Sheets.GetByName("Tabelle16")
    oCellCursor = osheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    nRow = oCellCursor.RangeAddress.endRow
    oRange = osheet.getcellrangebyPosition(24,nRow+1,33,nRow+1)
    aData = oRange.getdataArray
    aRow = aData(0)
    for i = 1 to 10
        odatefield = oDialog9.getcontrol("DateField"+i)
        if odatefield.date = 0 then 
            aRow(i-1) = ""
        else
            lDate = cdatefromIso(odatefield.Date)
            aRow(i-1) = lDate        
        endif
    next i
    aData(0) = aRow
    oRange = osheet.getcellrangebyPosition(24,nRow+1,33,nRow+1)
    oRange.SetDataArray(aData)
End Sub

Sub Behandlungsdaten_Loeschen
    for i = 1 to 10
        odatefield = oDialog9.getcontrol("DateField"+i)
        odatefield.Text = ""
    next i
End Sub
Gruß R
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Dialog "DateField" -array

Beitrag von Jörg »

hallo F3K Total,
vielen Dank für Deine Hilfe. habe allerdings das "+1" bei nRow rausgenommen, weil ich in die letzte beschriebene Zeile muß.
Eine Frage hätte ich noch.
Wie Du in der Bsp.-Datei sehen konntest, können event. noch weitere Termine hinzukommen (21. - 30.)
das Makro dementsprechend anzupassen und auf einen weiteren Button zu legen ist kein Problem. Ebenso könnte ich ja in den Dialog weitere DateFields einbauen.
Mir schwebt allerdings eine andere Variante vor:
Ich wollte die Zelle (33,nRow) auslesen ob leer oder nicht.

Code: Alles auswählen

 Sub Behandlungsdaten_Speichern
         dim lDate as Long
  Dim Zelle as Object
   Zelle = osheet.getCellByPosition (33, nRow)
   if Zelle <> "" then
   Mein angepaßter Code
   else
   Dein Code
   end if
   ....................
   end sub
   
Aber so einfach, wie ich mir´s vorstelle, geht es nicht.
Gruß Jörg

Win 10 Pro AOO 4.1.15
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Dialog "DateField" -array

Beitrag von F3K Total »

So langsam kostet das was!

Code: Alles auswählen

Sub Behandlungsdaten_Speichern
    dim lDate as Long
    osheet = ThisComponent.Sheets.GetByName("Tabelle16")
    oCellCursor = osheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    nRow = oCellCursor.RangeAddress.endRow
    oRange = osheet.getcellrangebyPosition(24,nRow+1,33,nRow+1)
    aData = oRange.getdataArray
    aRow = aData(0)
    for i = 1 to 10
        odatefield = oDialog9.getcontrol("DateField"+i)
        if odatefield.date = 0 then 
            aRow(i-1) = ""
        else
            lDate = cdatefromIso(odatefield.Date)
            aRow(i-1) = lDate        
        endif
    next i
    aData(0) = aRow
    a = 24
    Do Until osheet.getcellbyposition(a,nRow).Value = 0
        a = a + 1
    Loop
    oRange = osheet.getcellrangebyPosition(a,nRow,a+9,nRow)
    oRange.SetDataArray(aData)
End Sub
R
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Dialog "DateField" -array

Beitrag von Jörg »

Hallo R,
ich danke Dir sehr. Unbezahlbar !!
Hab ans Ende noch das rangehängt:

Code: Alles auswählen

Sub Behandlungsdaten_speichern
'................
 antwort = msgbox ("Sollen weitere Termine erfasst werden" ,36,"Verordnung abrechnen?")
     if antwort = 7 then
      oDialog9.endexecute
          elseif antwort = 6 then
          Behandlungsdaten_Loeschen ' Dein Makro zum Löschen der Einträge
        end if 
        end sub   
Jörg hat geschrieben: Di, 07.02.2017 12:45 habe allerdings das "+1" bei nRow rausgenommen
Ist wieder drin. Muß sich irgendwas in meine Testtabelle eingeschlichen haben.
Also nochmals vielen Dank und nen schönen Abend.
Gruß Jörg

Win 10 Pro AOO 4.1.15
Thomas Mc Kie
******
Beiträge: 919
Registriert: Mo, 12.04.2010 00:37

Re: Dialog "DateField" -array

Beitrag von Thomas Mc Kie »

F3K Total hat geschrieben: Di, 07.02.2017 17:00 So langsam kostet das was!
Kleine Spende: Bild 8)
Antworten