von gschuckar » Mo, 06.08.2007 19:24
Hallo liebe OO programmierer,
in OCalc habe ich ein Sheet, welches als Datenbank funktioniert. In diesem Sheet werden mi Hilfe eines Dialoges Daten eingetragen. Unmittelbar im Anschluß werden in diesem Sheet dann Berechnungen durchgeführt. Mit jedem Eintrag wächst diese Tabelle um eine weitere Zeile. Mit dem jetzt folgendem Code bename ich die Spalten. Dabei reicht die die Benamung immer von der ersten Zeile der Einträge bis zur aktuellen. Der Datenbankbereich beginnt bei Zeile 3. Hier nun der Code:
' ---------------------------------------------
' set new NamedRanges in table Ablesungen
private sub setNamedRange() on Error goto ErrorHandler
Dim thisDocument as Object
Dim oProperties as Object
dim iActRow as Integer
thisDocument = ThisComponent
oProperties = thisDocument.getSheets().getByName("properties")
iActRow = 3 + oProperties.getCellRangeByName("countDbAblesungen").getValue
Dim oCellAdress as new com.sun.star.table.CellAddress
' first delete old names
with thisDocument.NamedRanges
if .hasByName("ablese_datum") then
.removeByName("ablese_datum")
end if
if .hasByName("ablese_jahr") then
.removeByName("ablese_jahr")
end if
if .hasByName("ablese_monat") then
.removeByName("ablese_monat")
end if
if .hasByName("ablesung_gas") then
.removeByName("ablesung_gas")
end if
if .hasByName("ablesung_wasser") then
.removeByName("ablesung_wasser")
end if
if .hasByName("ablesung_strom") then
.removeByName("ablesung_strom")
end if
if .hasByName("ablesung_extern") then
.removeByName("ablesung_extern")
end if
if .hasByName("verbrauch_gas") then
.removeByName("verbrauch_gas")'h
end if
if .hasByName("verbrauch_wasser") then
.removeByName("verbrauch_wasser")'i
end if
if .hasByName("verbrauch_strom") then
.removeByName("verbrauch_strom")'j
end if
if .hasByName("verbrauch_extern") then
.removeByName("verbrauch_extern")'k
end if
end with 'thisDocument.NamedRanges
' removebyname setzt iActRow um 1 zurueck. Warum?
' for debug reasons a MsgBox:
' msgBox iActRow
' second set new namedRanges
with thisDocument.NamedRanges
.addNewByName("ablese_datum","$Ablesungen.$A3:$A" & iActRow,oCellAdress,0)
.addNewByName("ablese_jahr","$Ablesungen.$B3:$B" & iActRow,oCellAdress,0)
.addNewByName("ablese_monat","$Ablesungen.$C3:$C" & iActRow,oCellAdress,0)
.addNewByName("ablesung_gas","$Ablesungen.$D3:$D" & iActRow,oCellAdress,0)
.addNewByName("ablesung_wasser","$Ablesungen.$E3:$E" & iActRow,oCellAdress,0)
.addNewByName("ablesung_strom","$Ablesungen.$F3:$F" & iActRow,oCellAdress,0)
.addNewByName("ablesung_extern","$Ablesungen.$G3:$G" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_gas","$Ablesungen.$H3:$H" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_wasser","$Ablesungen.$I3:$I" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_strom","$Ablesungen.$J3:$J" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_extern","$Ablesungen.$K3:$K" & iActRow,oCellAdress,0)
end with
exit sub
ErrorHandler:
MsgBox "Error " & Err & ": " & Error$ & " (line : " & Erl & ")\n" & "in mdlConnection.setNamedRange"
end sub ' setNamedRange
' -----------------------------------------------------------------------------------------------------------------------------------------------
Das funktioniert soweit recht gut. Jetzt habe ich aus dem Dokument eine Vorlage gemacht und im Template verzeichnuns als eine solche abgespeichert.
Wenn ich jetzt auf Basis dieser Vorlage ein neues Dokument erstelle und Daten eingebe - eintrage, dann werden die Bereiche richtig benamst. Aber: Wenn mit diesen Bereichen gerechnet wird, dann gibt es als Ergebniss immer 0.
Wenn ich die namen jetzt manuell lösche und hernach manuell wieder festlege, dann funktioniert alles wie gehabt.
Was verändert sich am Code, wenn man aus einem Dokument eine Vorlage macht?
Ich weis nicht weiter.
Gruß
Gerd
Hallo liebe OO programmierer,
in OCalc habe ich ein Sheet, welches als Datenbank funktioniert. In diesem Sheet werden mi Hilfe eines Dialoges Daten eingetragen. Unmittelbar im Anschluß werden in diesem Sheet dann Berechnungen durchgeführt. Mit jedem Eintrag wächst diese Tabelle um eine weitere Zeile. Mit dem jetzt folgendem Code bename ich die Spalten. Dabei reicht die die Benamung immer von der ersten Zeile der Einträge bis zur aktuellen. Der Datenbankbereich beginnt bei Zeile 3. Hier nun der Code:
' ---------------------------------------------
' set new NamedRanges in table Ablesungen
private sub setNamedRange() on Error goto ErrorHandler
Dim thisDocument as Object
Dim oProperties as Object
dim iActRow as Integer
thisDocument = ThisComponent
oProperties = thisDocument.getSheets().getByName("properties")
iActRow = 3 + oProperties.getCellRangeByName("countDbAblesungen").getValue
Dim oCellAdress as new com.sun.star.table.CellAddress
' first delete old names
with thisDocument.NamedRanges
if .hasByName("ablese_datum") then
.removeByName("ablese_datum")
end if
if .hasByName("ablese_jahr") then
.removeByName("ablese_jahr")
end if
if .hasByName("ablese_monat") then
.removeByName("ablese_monat")
end if
if .hasByName("ablesung_gas") then
.removeByName("ablesung_gas")
end if
if .hasByName("ablesung_wasser") then
.removeByName("ablesung_wasser")
end if
if .hasByName("ablesung_strom") then
.removeByName("ablesung_strom")
end if
if .hasByName("ablesung_extern") then
.removeByName("ablesung_extern")
end if
if .hasByName("verbrauch_gas") then
.removeByName("verbrauch_gas")'h
end if
if .hasByName("verbrauch_wasser") then
.removeByName("verbrauch_wasser")'i
end if
if .hasByName("verbrauch_strom") then
.removeByName("verbrauch_strom")'j
end if
if .hasByName("verbrauch_extern") then
.removeByName("verbrauch_extern")'k
end if
end with 'thisDocument.NamedRanges
' removebyname setzt iActRow um 1 zurueck. Warum?
' for debug reasons a MsgBox:
' msgBox iActRow
' second set new namedRanges
with thisDocument.NamedRanges
.addNewByName("ablese_datum","$Ablesungen.$A3:$A" & iActRow,oCellAdress,0)
.addNewByName("ablese_jahr","$Ablesungen.$B3:$B" & iActRow,oCellAdress,0)
.addNewByName("ablese_monat","$Ablesungen.$C3:$C" & iActRow,oCellAdress,0)
.addNewByName("ablesung_gas","$Ablesungen.$D3:$D" & iActRow,oCellAdress,0)
.addNewByName("ablesung_wasser","$Ablesungen.$E3:$E" & iActRow,oCellAdress,0)
.addNewByName("ablesung_strom","$Ablesungen.$F3:$F" & iActRow,oCellAdress,0)
.addNewByName("ablesung_extern","$Ablesungen.$G3:$G" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_gas","$Ablesungen.$H3:$H" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_wasser","$Ablesungen.$I3:$I" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_strom","$Ablesungen.$J3:$J" & iActRow,oCellAdress,0)
.addNewByName("verbrauch_extern","$Ablesungen.$K3:$K" & iActRow,oCellAdress,0)
end with
exit sub
ErrorHandler:
MsgBox "Error " & Err & ": " & Error$ & " (line : " & Erl & ")\n" & "in mdlConnection.setNamedRange"
end sub ' setNamedRange
' -----------------------------------------------------------------------------------------------------------------------------------------------
Das funktioniert soweit recht gut. Jetzt habe ich aus dem Dokument eine Vorlage gemacht und im Template verzeichnuns als eine solche abgespeichert.
Wenn ich jetzt auf Basis dieser Vorlage ein neues Dokument erstelle und Daten eingebe - eintrage, dann werden die Bereiche richtig benamst. Aber: Wenn mit diesen Bereichen gerechnet wird, dann gibt es als Ergebniss immer 0.
Wenn ich die namen jetzt manuell lösche und hernach manuell wieder festlege, dann funktioniert alles wie gehabt.
Was verändert sich am Code, wenn man aus einem Dokument eine Vorlage macht?
Ich weis nicht weiter.
Gruß
Gerd