/// ///////////////////////////////////////////////////////// public DataSet GetAddAndUpdateInTableMain( string strNomTable, int nSessionSyncDebut, int nSessionSyncFin, string strCodeGroupeSynchronisation) { Type tp = CContexteDonnee.GetTypeForTable(strNomTable); DataSet dsDest = null; if (tp == null) { return(null); } //Récupère les filtres CFiltresSynchronisation filtres = GetFiltres(strCodeGroupeSynchronisation); using (CContexteDonnee contexte = new CContexteDonnee(IdSession, true, false)) { CFiltreData filtreSynchro = null; if (filtres != null) { filtreSynchro = filtres.GetFiltreForTable(m_nIdSession, strNomTable); } if (filtreSynchro == null) { filtreSynchro = new CFiltreData(); } int nNumParametreIdSync = filtreSynchro.Parametres.Count + 1; string strFiltre = filtreSynchro.Filtre; filtreSynchro.Filtre = "(" + CSc2iDataConst.c_champIdSynchro + ">=@" + nNumParametreIdSync.ToString() + " and " + CSc2iDataConst.c_champIdSynchro + "<=@" + (nNumParametreIdSync + 1).ToString(); if (nSessionSyncDebut == -1) //C'est la première synchro, intègre les éléments modifiés avant prise en charge //des synchros { if (filtreSynchro is CFiltreDataAvance) { filtreSynchro.Filtre += " or hasno(" + CSc2iDataConst.c_champIdSynchro + ")"; } else { filtreSynchro.Filtre += " or " + CSc2iDataConst.c_champIdSynchro + " is null"; } } filtreSynchro.Filtre += ")"; if (strFiltre != "") { filtreSynchro.Filtre += " and (" + strFiltre + ")"; } filtreSynchro.Parametres.Add(nSessionSyncDebut); filtreSynchro.Parametres.Add(nSessionSyncFin); CListeObjetsDonnees liste = new CListeObjetsDonnees(contexte, tp, false); liste.Filtre = filtreSynchro; liste.AssureLectureFaite(); //Charge les données de synchronisation CFiltreData filtreDataSync = new CFiltreData(CEntreeLogSynchronisation.c_champTable + "=@1 and " + CSc2iDataConst.c_champIdSynchro + ">=@2 and " + CSc2iDataConst.c_champIdSynchro + "<=@3", strNomTable, nSessionSyncDebut, nSessionSyncFin); liste = new CListeObjetsDonnees(contexte, typeof(CEntreeLogSynchronisation), false); liste.Filtre = filtreDataSync; liste.AssureLectureFaite(); //Transforme le contexte en dataset (pour sérialisation web !! ) dsDest = new DataSet(); foreach (DataTable table in contexte.Tables) { DataTable tableDest = CUtilDataSet.AddTableCopie(table, dsDest); foreach (DataRow row in table.Rows) { tableDest.ImportRow(row); } //Supprime les colonnes blob for (int nCol = tableDest.Columns.Count - 1; nCol >= 0; nCol--) { if (tableDest.Columns[nCol].DataType == typeof(CDonneeBinaireInRow)) { tableDest.Columns.RemoveAt(nCol); } } } } return(dsDest); }
//-------------------------------------------------------- public CFiltreData GetFiltreData(int nIdSession, CFiltresSynchronisation filtresSynchro) { if (m_filtreDejaCalcule != null) { return(m_filtreDejaCalcule); } Type tp = CContexteDonnee.GetTypeForTable(m_strNomTableFille); if (tp == null) { return(null); } CStructureTable structure = CStructureTable.GetStructure(tp); if (structure == null) { return(null); } CFiltreData filtre = null; foreach (CInfoRelation relationParente in structure.RelationsParentes) { if (relationParente.Composition && (relationParente.TableParente == m_strNomTableParenteDeComposition || m_strNomTableParenteDeComposition.Length == 0)) { Type tpParent = CContexteDonnee.GetTypeForTable(relationParente.TableParente); CStructureTable structParente = CStructureTable.GetStructure(tpParent); if (structParente != null && structParente.NomTable != m_strNomTableFille) { HashSet <int> lstIdsALire = new HashSet <int>(); C2iRequeteAvancee requete = new C2iRequeteAvancee(); requete.TableInterrogee = relationParente.TableParente; requete.FiltreAAppliquer = filtresSynchro.GetFiltreForTable(nIdSession, relationParente.TableParente); requete.ListeChamps.Add( new C2iChampDeRequete(structParente.ChampsId[0].NomChamp, new CSourceDeChampDeRequete(structParente.ChampsId[0].NomChamp), typeof(int), OperationsAgregation.None, true)); CResultAErreur result = requete.ExecuteRequete(nIdSession); if (result) { DataTable table = result.Data as DataTable; if (table != null) { foreach (DataRow row in table.Rows) { int?nVal = row[0] as int?; if (nVal != null) { lstIdsALire.Add(nVal.Value); } } } } if (lstIdsALire.Count > 0) { StringBuilder bl = new StringBuilder(); foreach (int nId in lstIdsALire) { bl.Append(nId.ToString()); bl.Append(','); } bl.Remove(bl.Length - 1, 1); filtre = CFiltreData.GetOrFiltre(filtre, new CFiltreData(relationParente.ChampsFille[0] + " in (" + bl.ToString() + ")")); } } } } if (filtre == null) { filtre = new CFiltreDataImpossible(); } m_filtreDejaCalcule = filtre; return(m_filtreDejaCalcule); }
//----------------------------------------------------------------- public CFiltreData GetFiltreData(int nIdSession, CFiltresSynchronisation filtresSynchro) { if (m_filtreDejaCalcule != null) { return(m_filtreDejaCalcule); } Type tp = CContexteDonnee.GetTypeForTable(m_strNomTable); if (tp == null) { return(null); } CStructureTable structure = CStructureTable.GetStructure(tp); if (structure == null) { return(null); } HashSet <int> lstIdsALire = new HashSet <int>(); List <CInfoRelation> relationsFilles = new List <CInfoRelation>(); foreach (Type tpTest in CContexteDonnee.GetAllTypes()) { CStructureTable s = CStructureTable.GetStructure(tpTest); if (s != null) { foreach (CInfoRelation relation in s.RelationsParentes) { if (relation.TableParente == m_strNomTable) { relationsFilles.Add(relation); } } } } //va chercher les dépendances filles qui auront besoin d'éléments de ce type foreach (CInfoRelation relation in relationsFilles) { Type tpFils = CContexteDonnee.GetTypeForTable(relation.TableFille); //Vérifie qu'il n'y a pas de filtre FilsDe ou FilsComposition sur la table bool bPrendreCetteTable = true; foreach (IFiltreSynchronisation filtre in filtresSynchro.GetFiltresSynchroPourTable(relation.TableFille)) { if (relation.Composition && filtre is CFiltreSynchronisationFilsCompositions) { bPrendreCetteTable = false; break; } CFiltreSynchronisationFilsDe filsDe = filtre as CFiltreSynchronisationFilsDe; if (filsDe != null) { if (filsDe.TablesParentes.Contains(m_strNomTable)) { bPrendreCetteTable = false; break; } } } if (bPrendreCetteTable) { C2iRequeteAvancee requete = new C2iRequeteAvancee(); requete.TableInterrogee = relation.TableFille; if (relation.TableFille != m_strNomTable) { requete.FiltreAAppliquer = filtresSynchro.GetFiltreForTable(nIdSession, relation.TableFille); } requete.ListeChamps.Add( new C2iChampDeRequete(relation.ChampsFille[0], new CSourceDeChampDeRequete(relation.ChampsFille[0]), typeof(int), OperationsAgregation.None, true)); CResultAErreur result = requete.ExecuteRequete(nIdSession); if (result) { DataTable table = result.Data as DataTable; if (table != null) { foreach (DataRow row in table.Rows) { int?nVal = row[0] as int?; if (nVal != null) { lstIdsALire.Add(nVal.Value); } } } } } } if (lstIdsALire.Count == 0) { m_filtreDejaCalcule = new CFiltreDataImpossible(); return(m_filtreDejaCalcule); } StringBuilder bl = new StringBuilder(); foreach (int nId in lstIdsALire) { bl.Append(nId); bl.Append(','); } bl.Remove(bl.Length - 1, 1); m_filtreDejaCalcule = new CFiltreData(structure.ChampsId[0].NomChamp + " in (" + bl.ToString() + ")"); return(m_filtreDejaCalcule); }