Bonjour la communauté JMP,
Je recherche votre aide ici car je n'ai pas trouvé de solution suffisante pour moi-même dans d'autres articles. Il s'agit d'écrire le contenu d'une table de données dans une table d'une base de données.
Pour cela j'ai écrit cette petite fonction :
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)
);La fonction fait ce qu'elle devrait, mais il y a des limitations que je ne sais pas comment résoudre. Par exemple, nous utilisons une base de données postgresql dans laquelle les tables ont des colonnes d'horodatage, de date ou d'autres colonnes formatées. Je n'ai aucune idée de comment inclure cela dans ma fonction, car JMP voit tous ces types formatés comme un nombre.
Un autre problème est de gérer les doublons de données. Avec ma fonction, le contenu d'une table de données serait inséré à l'aveugle dans notre base de données. Cela peut conduire à des doublons, car je ne sais pas ce qui s'y trouve déjà. J'ai trouvé dans un autre article cette fonction :
dt << Enregistrer la base de données( dbc,
"dbo.faux",
Remplacer
);
Malheureusement, cela remplacerait toute ma table, que je ne peux pas utiliser.
C'est pourquoi j'aimerais demander de l'aide à la communauté. Quelqu'un connaît-il un module complémentaire ou une solution de script qui résout ces problèmes ?