/// ///////////////////////////////////////// public CResultAErreur Serialize(C2iSerializer serializer) { int nVersion = GetNumVersion(); CResultAErreur result = serializer.TraiteVersion(ref nVersion); if (!result) { return(result); } I2iSerializable objet = m_structure; result = serializer.TraiteObject(ref objet); m_structure = (C2iStructureExport)objet; objet = m_filtre; result = serializer.TraiteObject(ref objet); m_filtre = (CFiltreDynamique)objet; 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 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 static CResultAErreur GetTableSource(IElementAVariablesDynamiquesAvecContexteDonnee elt, IDefinitionJeuDonnees defDonnees, IIndicateurProgression indicateur) { CResultAErreur result = CResultAErreur.True; if (!(defDonnees is CStructureExportAvecFiltre)) { /* * if (defDonnees is C2iRequete) * return defDonnees.GetDonnees(elt, null, indicateur); * if (defDonnees is CDefinitionJeuDonneesEasyQuery) * { * defDonnees.GetDonnees(elt, null, indicateur); * * }*/ result = defDonnees.GetDonnees(elt, null, indicateur); if (result) { DataSet ds = result.Data as DataSet; if (ds != null && ds.Tables.Count > 0) { DataTable tableOrg = ds.Tables[0]; DataTable tableRetour = tableOrg.Clone(); tableRetour.BeginLoadData(); foreach (DataRow row in tableOrg.Rows) { tableRetour.ImportRow(row); } tableRetour.EndLoadData(); result.Data = tableRetour; } return(result); } } if (defDonnees is CStructureExportAvecFiltre) { C2iStructureExport structure = ((CStructureExportAvecFiltre)defDonnees).Structure; ITableExport table = structure.Table; List <C2iChampDeRequete> lstGroupBy = new List <C2iChampDeRequete>(); if (table is C2iTableExport) { bool bFirst = true; if (table is C2iTableExport) { //Vérifie que toutes les tables filles sont similaires foreach (ITableExport tableFilleTmp in table.TablesFilles) { if (!(tableFilleTmp is C2iTableExportCumulee)) { result.EmpileErreur(I.T("Child tables must all be Cumulated tables|186")); return(result); } C2iRequeteAvancee requete = ((C2iTableExportCumulee)tableFilleTmp).Requete; if (bFirst) { foreach (C2iChampDeRequete champ in requete.Champs) { if (champ.GroupBy) { lstGroupBy.Add(champ); } } } else { List <C2iChampDeRequete> lst = new List <C2iChampDeRequete>(); foreach (C2iChampDeRequete champ in requete.Champs) { if (champ.GroupBy) { lst.Add(champ); } } bool bErreur = false; if (lst.Count == lstGroupBy.Count) { foreach (C2iChampDeRequete champ in lst) { if (!lstGroupBy.Contains(champ)) { bErreur = true; break; } } } else { bErreur = true; } if (bErreur) { result.EmpileErreur(I.T("All child tables must have the same 'group by' clause|286")); return(result); } } bFirst = false; } } } result = defDonnees.GetDonnees(elt, null, indicateur); if (!result) { return(result); } DataSet ds = (DataSet)result.Data; if (table is C2iTableExport && table.TablesFilles.Length != 0) { //Met à plat la table ds.EnforceConstraints = false; DataTable tableParent = ds.Tables[structure.Table.NomTable]; DataTable tableFille = ds.Tables[structure.Table.TablesFilles[0].NomTable]; DataRelation relation = null; //Cherche la relation entre la table Fille et la table parente if (tableFille != null && tableParent != null) { foreach (DataRelation rel in tableParent.ChildRelations) { if (rel.ChildTable.TableName == tableFille.TableName) { relation = rel; break; } } } if (tableParent == null || tableFille == null || relation == null) { result.EmpileErreur(I.T("Inexpected error on exported data|187")); return(result); } //Ajoute les colonnes de la table parente List <string> strCols = new List <String>(); foreach (DataColumn col in tableParent.Columns) { string strNewCol = tableParent.TableName + "_" + col.ColumnName; DataColumn newCol = tableFille.Columns.Add(strNewCol, col.DataType); newCol.AllowDBNull = col.AllowDBNull; strCols.Add(strNewCol); } //Rempli les données dans la table filles foreach (DataRow row in tableParent.Rows) { object[] datas = row.ItemArray; foreach (DataRow rowFille in row.GetChildRows(relation)) { for (int i = 0; i < datas.Length; i++) { rowFille[strCols[i]] = datas[i]; } } } if (table.TablesFilles.Length > 1) { //Plus d'1 table, ajoute les colonnes des autres tables //Repère les lignes par group by Hashtable tableGrpByToRow = new Hashtable(); List <string> lstNomsGroupBy = new List <string>(); foreach (DataColumn col in relation.ChildColumns) { lstNomsGroupBy.Add(col.ColumnName); } foreach (C2iChampDeRequete champ in lstGroupBy) { lstNomsGroupBy.Add(champ.NomChamp); } foreach (DataRow row in tableFille.Rows) { tableGrpByToRow[GetCleLigne(row, lstNomsGroupBy)] = row; } //Ajoute les données des tables filles for (int nTableFille = 1; nTableFille < table.TablesFilles.Length; nTableFille++) { //Crée la liste des champs groupBy DataTable tableTmp = ds.Tables[structure.Table.TablesFilles[nTableFille].NomTable]; lstNomsGroupBy.Clear(); foreach (DataColumn col in tableTmp.ParentRelations[0].ChildColumns) { lstNomsGroupBy.Add(col.ColumnName); } foreach (C2iChampDeRequete champ in lstGroupBy) { lstNomsGroupBy.Add(champ.NomChamp); } //AJoute les colonnes foreach (DataColumn col in tableTmp.Columns) { if (!col.AutoIncrement && !tableFille.Columns.Contains(col.ColumnName)) { tableFille.Columns.Add(col.ColumnName, col.DataType); } } foreach (DataRow row in tableTmp.Rows) { DataRow rowDest = (DataRow)tableGrpByToRow[GetCleLigne(row, lstNomsGroupBy)]; if (rowDest == null) { rowDest = tableFille.NewRow(); //copie les valeurs parentes sur la nouvelle row DataRow rowParente = row.GetParentRow(tableTmp.ParentRelations[0]); foreach (DataColumn col in rowParente.Table.Columns) { string strCol = tableParent.TableName + "_" + col.ColumnName; if (tableFille.Columns[strCol] != null) { rowDest[strCol] = rowParente[col.ColumnName]; } } tableGrpByToRow[GetCleLigne(row, lstNomsGroupBy)] = rowDest; } foreach (DataColumn col in tableTmp.Columns) { if (tableFille.Columns.Contains(col.ColumnName)) { rowDest[col.ColumnName] = row[col]; } } if (rowDest.RowState == DataRowState.Detached) { tableFille.Rows.Add(rowDest); } } } } result.Data = tableFille; } else { result.Data = ds.Tables[table.NomTable]; } return(result); } 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); }