Hallo JMP-Community,
Ich suche hier eure Hilfe, da ich in anderen Beiträgen keine für mich ausreichende Lösung gefunden habe. Es geht darum, den Inhalt einer Datentabelle in eine Tabelle einer Datenbank zu schreiben.
Dafür habe ich diese kleine Funktion geschrieben:
myInsertInto = function({dt, dbConnection, destinationName},
cols = dt << GetColumnNames(String);
rows = dt << Select All Rows << GetSelectedRows;
show(cols, rows);
//prepare sql head
sqlHead = "Insert Into " || destinationName || " (";
for each({col, index}, cols,
if(index == Length(cols),
sqlHead = sqlHead || col ||")",
sqlHead = sqlHead || col ||",";
)
);
//prepare sql body
sqlBody = "Values\!n";
ForEach({row, index}, rows,
sqlBody = sqlBody || "(";
show(row);
values = dt[row,0];
show(values);
for each({val, index}, values,
if(type(val) == "String",
if(IsMissing(val),
tmpVal = "null",
tmpVal = "'"||val||"'"
)
,
if(IsMissing(val),
tmpVal = "null",
tmpVal = char(val)
)
);
if(index == Length(values),
sqlBody = sqlBody || tmpVal ||")",
sqlBody = sqlBody || tmpVal ||",";
)
);
if(index == Length(rows),
sqlBody = sqlBody || ";",
sqlBody = sqlBody || ",\!n"
);
);
sqlQurey = sqlHead || "\!n" || sqlBody;
New SQL Query(
Version( 130 ),
Connection( myDbHandle ),
QueryName( "messwert.test_struktur_dennis" ),
Custom SQL(
Substitute(sqlQurey,"\!n", "", "\!t", "")
)
)<< run;
return(sqlQurey)
);Die Funktion tut, was sie soll, aber es gibt Einschränkungen, bei denen ich nicht weiß, wie ich sie lösen soll. Wir verwenden beispielsweise eine PostgreSQL-Datenbank, in der Tabellen Zeitstempel, Datum oder andere formatierte Spalten haben. Ich habe keine Ahnung, wie ich das in meine Funktion einbinden kann, da JMP alle diese formatierten Typen als Zahlen betrachtet.
Ein weiteres Problem ist der Umgang mit Datenduplikaten. Mit meiner Funktion würde der Inhalt einer Datentabelle blind in unsere Datenbank eingefügt. Das kann zu Duplikaten führen, da ich nicht weiß, was bereits da ist. In einem anderen Beitrag habe ich diese Funktion gefunden:
dt << Datenbank speichern( dbc,
"dbo.fake",
Ersetzen
);
Leider würde dadurch mein ganzer Tisch ersetzt werden, den ich nicht verwenden kann.
Daher möchte ich die Community um Hilfe bitten. Kennt jemand ein Add-In oder eine Skriptlösung, die diese Probleme löst?