Armin Barth wrote:
On Sun, Sep 03, 2006 at 11:39:29PM +0200, Andreas Saeger wrote:
Danke Andreas für die Schnelle Antwort.
Ein paar Fragen habe ich jedoch noch.
[...]
Wo muss ich diese SELECT-Anweiseung eintragen?
Im Kontextmenü der Datenquelle:"Bearbeiten ..."
odb-Dokument wird geöffnet.
Abfrage erstellen.
Dann probier mal folgendes:
Daten>Bereich festlegen...
Name: Lieferanten
Bereich: Eine einzelne Zelle als Startpunkt
Zusätze>"Zellen einfügen/löschen" (passt die Größe des Bereiches an die
Abfragegröße an, inklusive angrenzender Formeln)
Hinzufügen
OK
Ziehe die Abfrage auf den einzelligen Datenbankbereich.
Meldung: "Inhalte von 'lieferanten' überschreiben?" Ja!
Aktualisierung des Bereichs:
Den Bereich oder eine einzelne Zelle darin markieren und
Menu:Daten>"Bereich aktualisieren".
Validierung für Deine Zelle C2:
Typ: Zellbereich
Quelle: Lieferanten
O.k. habe ich verstanden.
Ich erhalte aber nur eine Zelle aus dem ausgewählten Bereich der
Datenbank (und zwar die erste).
Selektiere nochmal den Datenbankbereich und prüfe, ob die Option "Zellen
einfügen/löschen" gesetzt ist. Dann evtl. nochmal die Tabelle/Abfrage
drüberziehen. Teste es einfach mal mit irgendeiner Tabelle/Abfrage.
Ooops: Wo ich das schreibe fällt mir ein, dass die Kopfzeile in
importierten Bereichen immer mit eingeschlossen ist. Vielleicht ist das
tolerierbar?
Das wäre nicht so trageisch, wenn alle anderen Werte der
DB-Tabellen-Spalte auch sichtbar wären.
Schön. Dann wäre ja eigentlich das Thema gegessen ;)
Hiermit (=VERSCHIEBUNG) bin ich noch am testen. Ich melde mich dazu noch
einmal.
Sorry, mein Fehler.Es sollte heißen
=VERSCHIEBUNG(Lieferanten;1;0;ZEILEN(Lieferanten)-1;1)
Die Formel gibt Lieferanten ohne Kopfzeile als Matrix (mehr als ein
Wert) zurück. Extras>Zellinhalte>"Automatische Berechnung" eingeschalten
und die Formel mit Strg+Shift+Enter eingegeben.
Ein Makro wäre nicht schlecht.
Schön, vergiss das mit der VERSCHIEBUNG und kopiere dieses Makro in das
Dokument, wobei die Helferlein "getRangeFromAddress" und "getRangeName"
evtl. in die globale Standard-Bibliothek gehören, weil sie zu vielen
anderen denkbaren Calc-Makros eine sinnvolle Ergänzung sein können.
"CopyDBRg2valList" ist wohl eher spezifisch für das Dokument.
Es aktualisiert den Datenbankbereich, kopiert den neuen Datenbankbereich
(ohne die Kopfzeile) zu einem benannten Bereich(löscht vorher dessen
Inhalte) und ändert den Bezug des benannten Bereichs.
Eigentlich müssen nur die beiden Konstanten am Anfang angepasst werden.
Vorsicht mit den Zeilenumbrüchen, wenn dies aus einem Mailprogramm
kopiert wird.
REM ***** BASIC *****
Option Explicit
Sub CopyDBRg2valList
REM Diese zwei Konstanten anpassen:
'Name des importierten Datenbankbereichs
Const dbRange = "Lieferanten"
'Validierungsliste ohne Kopfzeile (benannter Bereich Strg+F3)
Const Validation = "valList"
Dim oDB,oNamed,lFlags&,oSrc,oTgt,oAdr,sNewAdr$,oNewRg
REM Neuen Datenbankbereich holen ("Zellen einfügen/löschen" sollte
gesetzt sein)
oDB = thisComponent.DatabaseRanges.getByName(dbRange)
oDB.refresh
oSrc = oDB.getDataArea
REM ohne Kopfzeile:
oSrc.StartRow = oSrc.StartRow +1
REM Zielbereich vorbereiten
oNamed = thisComponent.NamedRanges.getByName(Validation)
With com.sun.star.sheet.CellFlags
lFlags = .VALUE + .STRING + .FORMULA
End With
With oNamed.getReferredCells
.clearContents(lFLags)
oAdr = .getRangeAddress
oTgt = .getCellByPosition(0,0).getCellAddress
End With
REM kopiere Datenbankbereich ohne Kopfzeile zur ersten Zelle der
Validierungsliste
thisComponent.getSheets.getByIndex(oSrc.Sheet).copyRange(oTgt,oSrc)
REM Ändere die Adress-Struktur der Validierungsliste:
oAdr.EndColumn = oAdr.StartColumn + oSrc.EndColumn - oSrc.StartColumn
oAdr.EndRow = oAdr.StartRow + oSrc.EndRow - oSrc.StartRow
REM ... und hier beginnt der API-Stress, wenn man nicht geeignete
Funktionen in Petto hat:
REM Hole den Bereich zur Adress-Struktur:
oNewRg = getRangeFromAddress(thisComponent,oAdr)
REM Hole die String-Adresse des Bereichs:
sNewAdr = getRangeName(oNewRg,63)
REM setzte die String-Adresse als Inhalt des benannten Bereichs:
oNamed.setContent(sNewAdr)
End Sub
REM ------------Kopiert aus meiner Standard-Bibliothek----------------
'pass a spreadsheet-document or sheet. the latter ignores the sheet-part
of the address
'return empty if oAddr out of bounds
Function getRangeFromAddress(oObj,oAddr as
com.sun.star.table.CellRangeAddress)
Dim oSheet
If oObj.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
oSheet = oObj.getSheets.getByIndex(oAddr.Sheet)
else
oSheet = oObj
endif
on error resume next
getRangeFromAddress =
oSheet.getCellRangeByPosition(oAddr.StartColumn,oAddr.StartRow,oAddr.EndColumn,oAddr.EndRow)
End Function
'returns: any variant of string-address (eg.
A1:B5,sheet.A1:B5,$sheet.A1:B5,sheet.$A1:$B5,...,$sheet.$A$1:$B$5)
'takes a spreasheet-doc, a range and optional flags(default returns
relative A1:B5 without sheet name)
Function getRangeName(oRg,Optional iFlag%)as string
on error goto exitErr
const iSh% = 1
const iShAbs% = 2
const iC1% = 4
const iR1% = 8
const iC2% = 16
const iR2% = 32
Dim oAddr, oSh
dim s$,sSh$,sC1$,sC2$,sR1$,sR2$,bR1 as boolean,bC2 as boolean,bR2 as
boolean
oAddr = oRg.getRangeAddress
oSh = oRg.getSpreadSheet
sSh = oSh.getName
sC1 = oSh.Columns.getByIndex(oAddr.StartColumn).getName
sC2 = oSh.Columns.getByIndex(oAddr.EndColumn).getName
sR1 = cStr(oAddr.StartRow +1)
sR2 = cStr(oAddr.EndRow +1)
if not isMissing(iFlag) then
if iFlag AND iSh then
if (iFlag AND iShAbs)=iShAbs then s = "$"
s = s & sSh &"."
end if
if iFlag AND iC1 then s = s &"$"
bR1 = iFlag AND iR1
bC2 = iFlag AND iC2
bR2 = iFlag AND iR2
end if
s = s & sC1
If bR1 then s = s & "$"
s = s & sR1
If NOT(oRg.supportsService("com.sun.star.sheet.SheetCell")) then
s = s &":"
if bC2 then s = s & "$"
s = s & sC2
if bR2 then s = s &"$"
s = s & sR2
endif
getRangeName = s
exitErr:
end function
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]