Import von Datum-Felern mit und ohne Inhalt

Hallo users,

ich hatte schon mal ein ähnliches Problem und stecke jetzt wieder einmal
fest, sodass ich eure Hilfe brauche.

Zur Realisierung eines Makros, das beim Update einer Datenbank die
vorhandenen Daten der alten Version in die Tabelle "Mitglieder" der
neuen Version überträgt habe ich das u.a. Makro erstellt.

Mein Problem:

Alle Daten werden importiert, nur die Spalte 20 (sp20) macht mir Probleme.

Dort steht das Geburtsdatum der Vereinsmitglieder.

Da dies aber nicht bei allen Mitgliedern benötigt wird, sind auch
Datensätze in der Datenbank enthalten, die in diesem Feld keine Einträge
enthalten.

Wenn ich das Makro mit dem INSERT für die Spalte 20 so ausführe, wie es
unten enthalten ist, ('"+sp20+"') importiert es die Daten bis zum ersten
Datensatz, der kein Datum in "Geburtstag" enthält und bleibt dann stehen
mit der Meldung "Wrong data type".

Wenn ich das Makro mit dem INSERT für die Spalte 20 so ausführe (" &
sp20 & ") importiert es Datensätze, die im Feld "Geburtstag" keinen
Eintrag enthalten, bleibt aber beim ersten Datensatz mit Datumseintrag
in diesem Feld stehen.  (Zum Test hatte ich in den ersten Datensätzen
die Datums-Inhalte gelöscht).

Ich hab das schon mal in einer anderen Datenbank mit eurer Hilfe
erfolgreich angewendet. Das o.a. Problem ist dort aber nicht
aufgetaucht, da in dieser Datenbank alle Datensätze im Feld Datum einen
Eintrag hatten.

Vielleicht hat ja jemand einen Tipp, wie ich die Sach noch lösen kann.

Vielen Dank im Voraus

Gruß  L-H

Hier das Makro:

SUB Datenkopie

dim dbname as string
dbname = InputBox("Datenbankname der Quelldatenbank eingeben")
if dbname = "" then
exit sub
end if

DIM oDatabaseContext AS OBJECT
DIM oDatenquelle AS OBJECT
DIM oDatenquelleQuell AS OBJECT
DIM oVerbindung AS OBJECT
DIM oVerbindungQuell AS OBJECT
DIM oDB AS OBJECT
DIM oSQL_Anweisung AS OBJECT
DIM oSQL_AnweisungQuell AS OBJECT
DIM oAbfrageergebnis AS OBJECT
DIM oAbfrageergebnisQuell AS OBJECT
DIM stSql AS String
DIM stSqlZiel AS STRING
DIM inID AS INTEGER
DIM inIDZiel AS INTEGER

oDB = thisDatabaseDocument
oDatenquelle = thisDatabaseDocument.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

stDir = Left(oDB.Location,Len(oDB.Location)-Len(oDB.Title))
stDir = ConvertToUrl(stDir & ""+dbname+"")                   
'Quell-Datenbankpfad erstellen
oDatenquelleQuell = oDatabaseContext.getByName(stDir)       
'Quell-Datenbankpfad einlesen
oVerbindungQuell = oDatenquelleQuell.GetConnection("","")   
'Quell-Datenbankverbindung einlesen
oSQL_AnweisungQuell = oVerbindungQuell.createStatement()   
'SQL-Statement für Quelldatenbank erstellen

stSql = "SELECT * FROM ""Mitglieder"""
oAbfrageergebnisQuell = oSQL_AnweisungQuell.executeQuery(stSql)
WHILE oAbfrageergebnisQuell.next
inID = oAbfrageergebnisQuell.getint(1)         'ID (Integer)
sp2 = oAbfrageergebnisQuell.getString(2)     'Text
sp3 = oAbfrageergebnisQuell.getString(3)     'Text
sp4 = oAbfrageergebnisQuell.getString(4)     'Zahl
IF sp4="" THEN
    sp4="NULL"
END IF
sp5 = oAbfrageergebnisQuell.getString(5)    'Text
sp6 = oAbfrageergebnisQuell.getString(6)    'Zahl
IF sp6="" THEN
    sp6="NULL"
END IF
sp7 = oAbfrageergebnisQuell.getString(7)    'Text
sp8 = oAbfrageergebnisQuell.getString(8)    'Text
sp9 = oAbfrageergebnisQuell.getString(9)    'Text
sp10 = oAbfrageergebnisQuell.getString(10)    'Text
sp11 = oAbfrageergebnisQuell.getString(11)    'Text
sp12 = oAbfrageergebnisQuell.getBoolean(12)    'Ja/Nein
sp13 = oAbfrageergebnisQuell.getString(13)    'Text
sp14 = oAbfrageergebnisQuell.getString(14)    'Text
sp15 = oAbfrageergebnisQuell.getString(15)    'Text
sp16 = oAbfrageergebnisQuell.getString(16)    'Text
sp17 = oAbfrageergebnisQuell.getString(17)    'Text
sp18 = oAbfrageergebnisQuell.getString(18)    'Text
sp19 = oAbfrageergebnisQuell.getString(19)    'Text
sp20 = oAbfrageergebnisQuell.getString(20)    'Datum
IF sp20="" THEN
    sp20="NULL"
END IF

oSQL_AnweisungZiel = oVerbindung.createStatement()
stSql = "SELECT ""ID"" FROM ""Mitglieder"" WHERE ""ID"" = '"+inID+"'"
oAbfrageergebnis = oSQL_AnweisungZiel.executeQuery(stSql)
inIDZiel = - 1
WHILE oAbfrageergebnis.next
inIDZiel = oAbfrageergebnis.getInt(1)
WEND
IF inIDZiel = - 1 THEN
stSqlZiel = "INSERT INTO ""Mitglieder""
(""ID"",""Nachname"",""Vorname"",""Eintritt"",""Ehrennadel"",""Ehrenmitglied"",""Vorstand"",""passiv
seit"",""alte
Passive"",""Aktivzeiten"",""Funktion"",""Marke"",""Bemerkungen"",""telnr"",""email"",""IBAN"",""BIC"",""BName"",""Mand-ID"",""Geburtstag"")
VALUES ('"+inID+"','"+sp2+"','"+sp3+"','"+sp4+"','"+sp5+"'," & sp6 &
",'"+sp7+"','"+sp8+"','"+sp9+"','"+sp10+"','"+sp11+"','"+sp12+"','"+sp13+"','"+sp14+"','"+sp15+"','"+sp16+"','"+sp17+"','"+sp18+"','"+sp19+"','"+sp20+"')"
oSQL_Anweisung.executeUpdate(stSqlZiel)
END IF
WEND

MsgBox("Daten wurden übernommen")
end sub

Hallo Leo-Hubert,

das Feld wird in der DB ja wohl vom Typ Datum sein. Da solltest du mal versuchen, es im Makro in ein Date-Feld zu übertragen.

Gruß
Gerhard

Hallo Leo-Hubert,

Ich kopiere einmal die wesentlichen Stellen zusammen.

Wenn ich das Makro mit dem INSERT für die Spalte 20 so ausführe, wie es
unten enthalten ist, ('"+sp20+"') importiert es die Daten bis zum ersten
Datensatz, der kein Datum in "Geburtstag" enthält und bleibt dann stehen
mit der Meldung "Wrong data type".

sp4 weist Du hier z.B. alternativ NULL zu.

sp6 = oAbfrageergebnisQuell.getString(6)     'Zahl
IF sp6="" THEN
    sp6="NULL"
END IF

Auch dem Datum weist Du alternativ NULL zu.

sp20 = oAbfrageergebnisQuell.getString(20)    'Datum
IF sp20="" THEN
    sp20="NULL"
END IF

Und hier kannst Du sp6 korrekt NULL zuweisen, weil Du nicht einfache
Anführungszeichen setzt. 'NULL' würde als Text verstanden werden.

VALUES ('"+inID+"','"+sp2+"','"+sp3+"','"+sp4+"','"+sp5+"'," & sp6 &

... und bei sp20 wird aus NULL zwangsläufig Text.

...'"+sp16+"','"+sp17+"','"+sp18+"','"+sp19+"','"+sp20+"')"

Da es sich um ein Datum handelt:

sp20 = oAbfrageergebnisQuell.getString(20) 'Datum
IF sp20="" THEN
    sp20="NULL"
ELSE
    sp20 = "'" & sp20 & "'"
END IF

Die Variable hat jetzt die einfachen Anführungszeichen, wenn sie ein
Datum enthält. Und bei dem Insert wird dann daraus:

...'"+sp16+"','"+sp17+"','"+sp18+"','"+sp19+"', "+sp20+")"

Das gleiche Problem gibt es vom Code her bei sp4, kann dort dann aber
identisch zu sp6 gehandhabt werden.

Gruß

Robert

Leider bleibt das Makro dann an der in der Anlage abgebildeten Stelle
mit der dort gezeigten Meldung hängen.

MfG   L-H

Hallo Robert,

vielen Dank für die Hilfe. Mit deinem u.a. Änderungsvorschlag
funktioniert jetzt auch das Imporieren der Datums-Spalten.

Es ist wirklich ein Segen, wenn man solch kompetente Ratgeber in einem
Forum hat.

Vielen Dank   L-H

PS: Die Spalten 4 und 6 sind in der Tabelle beide Zahlen-Felder, wobei
Spalte 4 immer Einträge enthlaten muß, spalte 6 dagegen nicht.

Mit dem Code, so wie er jetzt ist, funktioniert jedenfalls der
Import dieser Spalten ohne Probleme.