//--------------------------------- public override CResultAErreur EndInsertData(System.Data.DataSet ds) { CResultAErreur result = base.EndInsertData(ds); if (NePasCalculer) { return(result); } if (!result) { return(result); } try { //Renomme la table de lien //Table qui a été créé et sur laquelle les tables filles ont un lien DataTable tableDeLien = ds.Tables[NomTable]; tableDeLien.TableName = NomTable + "_WK"; if (TablesFilles.Length == 0) { return(result); } //Trouve la table fille DataTable tableSource = ds.Tables[TablesFilles[0].NomTable]; if (tableSource == null) { result.EmpileErreur(I.T("Table @1 doesn't exist|20004", TablesFilles[0].NomTable)); return(result); } CTableauCroise tableau = new CTableauCroise(); tableau.CopieFrom(m_tableau); //Trouve le lien entre la table de lien et la table source DataColumn colDeLienSource = null; if (tableDeLien.Rows.Count != 0) //Sinon, c'est qu'on est //Surement table racine, ou que l'on n'a pas de données { foreach (Constraint contrainte in tableSource.Constraints) { ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint; if (fk != null && fk.RelatedTable == tableDeLien) { colDeLienSource = fk.Columns[0]; break; } } } /*if (colDeLienSource == null) * { * result.EmpileErreur(I.T("Cannot find a link between @1 and @2|20007", * tableDeLien.TableName, tableSource.TableName)); * return result; * }*/ //Ajoute la colonne de lien comme clé if (colDeLienSource != null) { tableau.InsertChampCle(0, new CCleTableauCroise(colDeLienSource.ColumnName, colDeLienSource.DataType)); } result = tableau.CreateTableCroisee(tableSource); if (!result) { return(result); } if (result) { DataTable tableFinale = (DataTable)result.Data; tableFinale.TableName = NomTable; ds.Tables.Add(tableFinale); //Crée le champ de lien avec la table parente //Recherche de la table parente string strFK = ""; DataColumn colLienFinale = null; foreach (Constraint contrainte in tableDeLien.Constraints) { ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint; if (fk != null) { if (fk.Table == tableDeLien) { strFK = fk.Columns[0].ColumnName; colLienFinale = C2iStructureExport.CreateForeignKeyInTable(fk.RelatedColumns[0], tableFinale, 0); break; } } } if (colLienFinale == null && ChampOrigine != null) { result.EmpileErreur(I.T("Cannot establish a link for Union table @1|20008", NomTable)); return(result); } //Met en cache les clés filles vers les clés parentes Dictionary <int, int> dicIdsFillesToParent = new Dictionary <int, int>(); string strPrimKey = tableDeLien.PrimaryKey[0].ColumnName; if (colLienFinale != null) { foreach (DataRow row in tableDeLien.Rows) { dicIdsFillesToParent[(int)row[strPrimKey]] = (int)row[strFK]; } if (colDeLienSource != null) { foreach (DataRow row in tableFinale.Rows) { row[colLienFinale.ColumnName] = dicIdsFillesToParent[(int)row[colDeLienSource.ColumnName]]; } } } } if (SupprimerTablesTravail) { SupprimeTableEtDependances(ds, tableDeLien.TableName); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } return(result); }
//--------------------------------- public override CResultAErreur EndInsertData(System.Data.DataSet ds) { CResultAErreur result = base.EndInsertData(ds); if (NePasCalculer) { return(result); } if (!result) { return(result); } try { //Table qui a été créé et sur laquelle les tables filles ont un lien DataTable tableDeLien = ds.Tables[NomTable]; tableDeLien.TableName = NomTable + "_WK"; //TAble qui va stocker les données finales DataTable tableDest = new DataTable(NomTable); ds.Tables.Add(tableDest); #region Création de la table finale //Crée le champ d'id C2iStructureExport.CreateChampInTableAIdAuto(tableDest, 0); DataColumn colLienFinale = null; //Crée le champ de lien avec la table parente //Recherche de la table parente string strFK = ""; foreach (Constraint contrainte in tableDeLien.Constraints) { ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint; if (fk != null) { if (fk.Table == tableDeLien) { strFK = fk.Columns[0].ColumnName; colLienFinale = C2iStructureExport.CreateForeignKeyInTable(fk.RelatedColumns[0], tableDest, 0); break; } } } if (colLienFinale == null && ChampOrigine != null) { result.EmpileErreur(I.T("Cannot establish a link for Union table @1|20008", NomTable)); return(result); } //Création de l'ancienne colonne Id DataColumn colOldId = null; if (ChampOrigine != null && !(ChampOrigine is CDefinitionProprieteDynamiqueThis)) { string strColOldId = DynamicClassAttribute.GetNomConvivial(ChampOrigine.TypeDonnee.TypeDotNetNatif) + "_Id_0"; colOldId = new DataColumn(strColOldId, typeof(int)); colOldId.AllowDBNull = true; tableDest.Columns.Add(colOldId); } //Création des colonnes pour les valeurs foreach (C2iChampExport champ in Champs) { CreateChampInTable(champ, tableDest); } #endregion //Met en cache les clés filles vers les clés parentes Dictionary <int, int> dicIdsFillesToParent = new Dictionary <int, int>(); string strPrimKey = tableDeLien.PrimaryKey[0].ColumnName; if (colLienFinale != null) { foreach (DataRow row in tableDeLien.Rows) { dicIdsFillesToParent[(int)row[strPrimKey]] = (int)row[strFK]; } } DataColumn colLienDeFille = null; if (TablesFilles.Length == 0) { return(result); } DataTable tableSource = ds.Tables[TablesFilles[0].NomTable]; if (tableSource == null) { } //Trouve la colonne de lien avec la table de lien foreach (Constraint contrainte in tableSource.Constraints) { ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint; if (fk != null && fk.RelatedTable == tableDeLien) { colLienDeFille = fk.Columns[0]; break; } } if (colLienDeFille == null) { result.EmpileErreur(I.T("Cannot find a link between @1 and @2|20007", tableDeLien.TableName, tableSource.TableName)); return(result); } CCacheValeursProprietes cacheValeurs = new CCacheValeursProprietes(); cacheValeurs.CacheEnabled = true; foreach (DataRow rowSource in tableSource.Rows) { bool bIntegrerRow = true; if (m_formuleSelection != null) { CContexteEvaluationExpression ctxEval = new CContexteEvaluationExpression(rowSource); result = m_formuleSelection.Eval(ctxEval); if (!result) { return(result); } if (result.Data is bool) { bIntegrerRow = (bool)result.Data; } if (result.Data is int) { bIntegrerRow = ((int)result.Data) != 0; } } if (bIntegrerRow) { DataRow rowDest = tableDest.NewRow(); foreach (C2iChampExport champ in m_listeChamps) { try { rowDest[champ.NomChamp] = champ.GetValeur(rowSource, cacheValeurs, null); } catch { } } if (colOldId != null) { rowDest[colOldId] = rowSource[colLienDeFille]; } if (colLienFinale != null) { int nIdLink = dicIdsFillesToParent[(int)rowSource[colLienDeFille]]; rowDest[colLienFinale] = nIdLink; } tableDest.Rows.Add(rowDest); } } if (SupprimerTablesTravail) { SupprimeTableEtDependances(ds, tableDeLien.TableName); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } return(result); }
//--------------------------------- public override CResultAErreur EndInsertData(System.Data.DataSet ds) { CResultAErreur result = base.EndInsertData(ds); if (NePasCalculer) { return(result); } if (!result) { return(result); } try { //Renomme la table de travail avec un _ derrière //Table qui a été créé et sur laquelle les tables filles ont un lien DataTable tableDeLien = ds.Tables[NomTable]; tableDeLien.TableName = NomTable + "_WK"; //TAble qui va stocker les données finales DataTable tableDest = new DataTable(NomTable); ds.Tables.Add(tableDest); #region Création de la table finale //Crée le champ d'id C2iStructureExport.CreateChampInTableAIdAuto(tableDest, 0); DataColumn colLienFinale = null; //Crée le champ de lien avec la table parente //Recherche de la table parente string strFK = ""; foreach (Constraint contrainte in tableDeLien.Constraints) { ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint; if (fk != null) { if (fk.Table == tableDeLien) { strFK = fk.Columns[0].ColumnName; colLienFinale = C2iStructureExport.CreateForeignKeyInTable(fk.RelatedColumns[0], tableDest, 0); break; } } } if (colLienFinale == null && ChampOrigine != null) { result.EmpileErreur(I.T("Cannot establish a link for Union table @1|20008", NomTable)); return(result); } //Création de l'ancienne colonne Id DataColumn colOldId = null; if (ChampOrigine != null && !(ChampOrigine is CDefinitionProprieteDynamiqueThis)) { string strColOldId = DynamicClassAttribute.GetNomConvivial(ChampOrigine.TypeDonnee.TypeDotNetNatif) + "_Id_0";; colOldId = new DataColumn(strColOldId, typeof(int)); colOldId.AllowDBNull = true; tableDest.Columns.Add(colOldId); } #endregion //Met en cache les clés filles vers les clés parentes Dictionary <int, int> dicIdsFillesToParent = new Dictionary <int, int>(); string strPrimKey = tableDeLien.PrimaryKey[0].ColumnName; if (colLienFinale != null) { foreach (DataRow row in tableDeLien.Rows) { dicIdsFillesToParent[(int)row[strPrimKey]] = (int)row[strFK]; } } #region Création des champs Dictionary <string, int> dicChampsDesTables = new Dictionary <string, int>(); List <DataColumn> listeColonnesACreer = new List <DataColumn>(); Dictionary <string, Type> typesDesChamps = new Dictionary <string, Type>(); Dictionary <string, DataColumn> colsDeLien = new Dictionary <string, DataColumn>(); Dictionary <string, List <string> > listeColsToCopyParTable = new Dictionary <string, List <string> >(); foreach (ITableExport uneTableSource in TablesFilles) { DataTable tableSource = ds.Tables[uneTableSource.NomTable]; if (tableSource == null) { result.EmpileErreur(I.T("Table @1 doesn't exist|20004", uneTableSource.NomTable)); return(result); } DataColumn colDeLien = null; //Trouve la colonne de lien avec la table de lien foreach (Constraint contrainte in tableSource.Constraints) { ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint; if (fk != null && fk.RelatedTable == tableDeLien) { colDeLien = fk.Columns[0]; break; } } if (colDeLien == null) { result.EmpileErreur(I.T("Cannot find a link between @1 and @2|20007", tableDeLien.TableName, tableSource.TableName)); return(result); } colsDeLien[tableSource.TableName] = colDeLien; List <string> colsToCopy = new List <string>(); listeColsToCopyParTable[tableSource.TableName] = colsToCopy; foreach (DataColumn col in tableSource.Columns) { //Ignore les clés if (tableSource.PrimaryKey.Length > 0 && tableSource.PrimaryKey[0] == col) { continue; } if (col == colDeLien) { continue; } int nNb = 0; colsToCopy.Add(col.ColumnName); if (!dicChampsDesTables.TryGetValue(col.ColumnName.ToUpper(), out nNb)) { dicChampsDesTables[col.ColumnName.ToUpper()] = 1; listeColonnesACreer.Add(col); } else { nNb++; dicChampsDesTables[col.ColumnName.ToUpper()] = nNb; } } } foreach (DataColumn col in listeColonnesACreer) { DataColumn newCol = new DataColumn(col.ColumnName, col.DataType); newCol.AllowDBNull = true; tableDest.Columns.Add(newCol); } #endregion //Trouve les clés : les clés sont les champs communs à toutes les tables //ou les champs explicites List <string> champsCles = new List <string>(); if (m_listeChampsClesExplicites.Count > 0) { foreach (string strChampTmp in m_listeChampsClesExplicites) { if (dicChampsDesTables.ContainsKey(strChampTmp.ToUpper())) { champsCles.Add(strChampTmp); } } if (champsCles.Count != m_listeChampsClesExplicites.Count) { result.EmpileErreur(I.T("Some keys are not in source tables|20012")); return(result); } } else { int nNbTablesSource = TablesFilles.Length; foreach (KeyValuePair <string, int> tableNb in dicChampsDesTables) { if (tableNb.Value == nNbTablesSource) { champsCles.Add(tableNb.Key); } } } string[] strChampsCles = champsCles.ToArray(); //Il faut traiter les tables filles de celle qui a le plus de clés //à celle qui en a le moins List <string> lstNomTablesDansOrdre = new List <string>(); for (int nNbClesTest = strChampsCles.Length; nNbClesTest >= 1; nNbClesTest--) { foreach (ITableExport tableSource in TablesFilles) { int nNbClesDansTable = 0; //Compte les champs clés présents foreach (string strCol in listeColsToCopyParTable[tableSource.NomTable]) { if (champsCles.Contains(strCol)) { nNbClesDansTable++; } } if (nNbClesDansTable == nNbClesTest) { lstNomTablesDansOrdre.Add(tableSource.NomTable); } } } if (strChampsCles.Length == 0) { foreach (ITableExport table in TablesFilles) { lstNomTablesDansOrdre.Add(table.NomTable); } } ///Index : clé (texte)->DataRow Dictionary <string, DataRow> dicIndex = new Dictionary <string, DataRow>(); CFormatteurFiltreDataToStringDataTable formateurFiltre = new CFormatteurFiltreDataToStringDataTable(); //Insere les données table par table foreach (string strNomTableSource in lstNomTablesDansOrdre) { DataTable tableSource = ds.Tables[strNomTableSource]; DataColumn colDeLien = colsDeLien[tableSource.TableName]; bool bHasAllKeys = false; List <string> strClesDansTable = new List <string>(); foreach (string strColKey in champsCles) { if (tableSource.Columns[strColKey] != null) { strClesDansTable.Add(strColKey); } } if (strClesDansTable.Count == champsCles.Count) { bHasAllKeys = true; } /*if (strClesDansTable.Count == 0) * { * //Aucune clé pour cette table, on ne sait pas quoi en faire ! * result.EmpileErreur(I.T("Table @1 doesn't have any key|20013", tableSource.TableName)); * return result; * }*/ CFiltreData filtreDonnees = null; if (!bHasAllKeys) { StringBuilder blFiltre = new StringBuilder(); int nParametre = 2; blFiltre.Append(colDeLien.ColumnName); blFiltre.Append("=@"); blFiltre.Append(1); blFiltre.Append(" and "); foreach (string strCle in strClesDansTable) { blFiltre.Append(strCle); blFiltre.Append("=@"); blFiltre.Append(nParametre); blFiltre.Append(" and "); nParametre++; } blFiltre.Remove(blFiltre.Length - 5, 5); filtreDonnees = new CFiltreData(blFiltre.ToString()); } foreach (DataRow rowSource in tableSource.Rows) { StringBuilder blKey = new StringBuilder(); blKey.Append(rowSource[colDeLien].ToString() + "¤"); if (filtreDonnees != null) { filtreDonnees.Parametres.Clear(); filtreDonnees.Parametres.Add(rowSource[colDeLien]); } for (int nKey = 0; nKey < strClesDansTable.Count; nKey++) { object val = rowSource[strClesDansTable[nKey]]; if (filtreDonnees != null) { filtreDonnees.Parametres.Add(val); } else { if (val == null) { blKey.Append("@NULL@"); } else { blKey.Append(val.ToString()); } blKey.Append("¤"); } } DataRow[] rowsDest = null; bool bIsNew = false; string strKey = ""; if (filtreDonnees == null) { strKey = blKey.ToString(); DataRow rowTmp = null; bIsNew = !dicIndex.TryGetValue(strKey, out rowTmp); if (bIsNew) { rowTmp = tableDest.NewRow(); } rowsDest = new DataRow[] { rowTmp }; } else { string strFiltre = formateurFiltre.GetString(filtreDonnees); rowsDest = tableDest.Select(strFiltre); if (rowsDest.Length == 0) { rowsDest = new DataRow[] { tableDest.NewRow() }; bIsNew = true; } } foreach (DataRow rowDest in rowsDest) { foreach (string strCol in listeColsToCopyParTable[tableSource.TableName]) { rowDest[strCol] = rowSource[strCol]; } if (colOldId != null) { rowDest[colOldId] = rowSource[colDeLien]; } if (colLienFinale != null) { int nIdLink = dicIdsFillesToParent[(int)rowSource[colDeLien]]; rowDest[colLienFinale] = nIdLink; } } if (bIsNew) { tableDest.Rows.Add(rowsDest[0]); if (bHasAllKeys) { dicIndex[strKey] = rowsDest[0]; } } } } if (SupprimerTablesTravail) { SupprimeTableEtDependances(ds, tableDeLien.TableName); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } return(result); }