//-------------------------------------------------------------------------------------------------------------------- public override CResultAErreur ExecuterOperation(IDatabaseConnexion connection, IIndicateurProgression indicateur) { CResultAErreur result = CResultAErreur.True; if (!typeof(IObjetDonneeAIdNumerique).IsAssignableFrom(m_type) || !CObjetDonnee.TypeManageIdUniversel(m_type)) { result.EmpileErreur(m_type.ToString() + " can not have Universal Id"); } string strNomTable = CContexteDonnee.GetNomTableForType(m_type); CStructureTable structure = CStructureTable.GetStructure(m_type); string strChampId = structure.ChampsId[0].NomChamp; C2iRequeteAvancee requete = new C2iRequeteAvancee(); requete.FiltreAAppliquer = new CFiltreData(CObjetDonnee.c_champIdUniversel + "=@1", ""); requete.TableInterrogee = CContexteDonnee.GetNomTableForType(m_type); requete.ListeChamps.Add(new C2iChampDeRequete(strChampId, new CSourceDeChampDeRequete(strChampId), typeof(int), OperationsAgregation.None, true)); Console.WriteLine("Update Universal id on " + strNomTable); result = requete.ExecuteRequete(connection.IdSession); if (!result) { return(result); } string strNomTableInDb = CContexteDonnee.GetNomTableInDbForNomTable(strNomTable); DataTable table = result.Data as DataTable; int nNb = 0; bool bWasInTrans = connection.IsInTrans(); if (bWasInTrans) { connection.CommitTrans(); } DateTime dt = DateTime.Now; if (table.Rows.Count > 0) { if (table.Rows.Count > 10000 && connection is COracleDatabaseConnexion) { string strQuery = "Update " + strNomTableInDb + " set " + CObjetDonnee.c_champIdUniversel + "=CONCAT('" + strNomTableInDb + "'," + strChampId + ")"; result = connection.RunStatement(strQuery); } else { foreach (DataRow row in table.Rows) { string strQuery = "Update " + strNomTableInDb + " set " + CObjetDonnee.c_champIdUniversel + "='" + CUniqueIdentifier.GetNew() + "' where " + strChampId + "=" + row[0].ToString(); result = connection.ExecuteScalar(strQuery); if (!result) { break; } nNb++; if (nNb % 100 == 0) { TimeSpan sp = DateTime.Now - dt; double fVal = (double)sp.TotalSeconds / (double)nNb * (double)(table.Rows.Count - nNb); Console.WriteLine(strNomTableInDb + " " + nNb + "/" + table.Rows.Count + " reste " + fVal.ToString("0s")); } } } } if (bWasInTrans) { connection.BeginTrans(); } return(result); /* * * //Trouve tous les éléments du type qui n'ont pas d'id universel * using (CContexteDonnee ctx = new CContexteDonnee(connection.IdSession, true, false)) * { * CListeObjetsDonnees lst = new CListeObjetsDonnees(ctx, m_type, false); * lst.Filtre = new CFiltreData(CObjetDonnee.c_champIdUniversel + "=@1", ""); * lst.Filtre.IgnorerVersionDeContexte = true; * lst.AppliquerFiltreAffichage = false; * * foreach (IObjetDonnee objet in lst.ToArrayList()) * { * objet.Row[CObjetDonnee.c_champIdUniversel] = CUniqueIdentifier.GetNew(); * } * string strNomTable = CContexteDonnee.GetNomTableForType(m_type); * CObjetServeur objetServeur = CContexteDonnee.GetTableLoader(strNomTable, null, connection.IdSession) as CObjetServeur; * int nCount = ctx.Tables[strNomTable].Rows.Count; * DataTable tableSource = ctx.Tables[strNomTable]; * * List<string> lstChampsExclus = new List<string>(); * HashSet<string> lstIDs = new HashSet<string>(); * CStructureTable structure = CStructureTable.GetStructure(m_type); * foreach (CInfoChampTable info in structure.ChampsId) * lstIDs.Add(info.NomChamp); * * foreach (CInfoChampTable champ in structure.Champs) * if (champ.NomChamp != CObjetDonnee.c_champIdUniversel && !lstIDs.Contains(champ.NomChamp)) * lstChampsExclus.Add(champ.NomChamp); * * IDataAdapter adapter = objetServeur.GetDataAdapter(DataRowState.Modified, lstChampsExclus.ToArray()); * * for (int nRow = 0; nRow < nCount; nRow += 5000) * { * * using (DataSet dsCopie = new DataSet()) * { * dsCopie.EnforceConstraints = false; * DataTable tableCopie = ctx.Tables[strNomTable].Clone(); * tableCopie.BeginLoadData(); * dsCopie.Tables.Add(tableCopie); * int nMax = Math.Min(nRow + 5000, nCount); * DateTime dt = DateTime.Now; * for (int n = nRow; n < nMax; n++) * { * tableCopie.ImportRow(tableSource.Rows[n]); * } * TimeSpan sp = DateTime.Now - dt; * Console.WriteLine("Write 1" + strNomTable + " " + nRow + "/" + nCount+" "+sp.TotalSeconds.ToString()); * adapter.Update(dsCopie); * sp = DateTime.Now - dt; * Console.WriteLine("Write 2" + strNomTable + " " + nRow + "/" + nCount + " " + sp.TotalSeconds.ToString()); * } * } * } * return result;*/ }
//------------------------------------------------ public CResultAErreurType <CObjetDonnee> FindObjet( DataRow rowSource, CContexteImportDonnee contexteImport, CValeursImportFixe valeursFixes, ref string strFiltre) { CResultAErreurType <CObjetDonnee> resObjet = new CResultAErreurType <CObjetDonnee>(); CResultAErreur res = CResultAErreur.True; StringBuilder blFiltre = new StringBuilder(); if (valeursFixes != null) { foreach (KeyValuePair <string, object> kv in valeursFixes.ValeursFixes) { blFiltre.Append(kv.Key); blFiltre.Append("="); blFiltre.Append(kv.Value == null ? "null" : kv.Value.ToString()); blFiltre.Append(";"); } } //Création du filtre CComposantFiltreDynamiqueEt compoPrincipal = new CComposantFiltreDynamiqueEt(); //Recherche à partir des champs simples foreach (CMappageChampSimple mapSimple in MappagesChampsSimples) { if (mapSimple.UseAsKey) { res = mapSimple.GetValue(rowSource, contexteImport); if (!res) { res.EmpileErreur(I.T("Erreur while searching object|20093")); resObjet.EmpileErreur(res.Erreur); return(resObjet); } //Stockage valeur témoin CSourceSmartImportField sourceField = mapSimple.Source as CSourceSmartImportField; if (sourceField != null) { contexteImport.SetValeurTemoin(sourceField.NomChampSource, res.Data); } blFiltre.Append(mapSimple.Propriete.NomPropriete); if (res.Data == null) { CComposantFiltreDynamiqueTestNull testNull = new CComposantFiltreDynamiqueTestNull(); testNull.Champ = mapSimple.Propriete; testNull.TestNull = true; compoPrincipal.AddComposantFils(testNull); blFiltre.Append("=null;"); } else { CComposantFiltreDynamiqueValeurChamp testValeur = new CComposantFiltreDynamiqueValeurChamp(); testValeur.Champ = mapSimple.Propriete; testValeur.IdOperateur = CComposantFiltreOperateur.c_IdOperateurEgal; testValeur.ExpressionValeur = new C2iExpressionConstante(res.Data); compoPrincipal.AddComposantFils(testValeur); blFiltre.Append("="); blFiltre.Append(res.Data.ToString()); blFiltre.Append(";"); } } } //Recherche à partir des objets parents foreach (CMappageEntiteParente mapParent in m_listeMappagesParents) { if (mapParent.UseAsKey) { CResultAErreurType <CObjetDonnee> resParent = mapParent.GetObjetAssocie(rowSource, contexteImport, false); if (!resParent) { resObjet.EmpileErreur(resParent.Erreur); return(resObjet); } CObjetDonneeAIdNumerique objetId = resParent.DataType as CObjetDonneeAIdNumerique; CDefinitionProprieteDynamique defId = null; object valeurTest = null; if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(mapParent.Propriete.TypeDonnee.TypeDotNetNatif)) { defId = new CDefinitionProprieteDynamiqueDotNet( "Id", "Id", new CTypeResultatExpression(typeof(int), false), false, true, ""); defId.InsereParent(mapParent.Propriete); valeurTest = objetId != null?objetId.Id:-1; } else if (CObjetDonnee.TypeManageIdUniversel(mapParent.Propriete.TypeDonnee.TypeDotNetNatif)) { defId = new CDefinitionProprieteDynamiqueDotNet("Universal id", "IdUniversel", new CTypeResultatExpression(typeof(string), false), false, true, ""); defId.InsereParent(mapParent.Propriete); valeurTest = resParent.DataType != null ? resParent.DataType.IdUniversel : null; } else { resObjet.EmpileErreur(I.T("Can not search objet of type @1|20094", DynamicClassAttribute.GetNomConvivial(mapParent.Propriete.TypeDonnee.TypeDotNetNatif))); return(resObjet); } blFiltre.Append(defId.NomPropriete); if (resParent.DataType == null) { CComposantFiltreDynamiqueTestNull testNull = new CComposantFiltreDynamiqueTestNull(); testNull.Champ = defId; testNull.TestNull = true; compoPrincipal.AddComposantFils(testNull); blFiltre.Append("=null;"); } else { CComposantFiltreDynamiqueValeurChamp testValeur = new CComposantFiltreDynamiqueValeurChamp(); testValeur.Champ = defId; testValeur.IdOperateur = CComposantFiltreOperateur.c_IdOperateurEgal; testValeur.ExpressionValeur = new C2iExpressionConstante(valeurTest); compoPrincipal.AddComposantFils(testValeur); blFiltre.Append("="); blFiltre.Append(valeurTest.ToString()); blFiltre.Append(";"); } } } if (blFiltre.Length == 0)//Pas de filtre { return(resObjet); } strFiltre = blFiltre.ToString(); CObjetDonnee objet = contexteImport.GetEntiteForFiltre(TypeEntite, strFiltre); if (objet != null) { resObjet.DataType = objet; return(resObjet); } CFiltreDynamique filtre = new CFiltreDynamique(contexteImport.ContexteDonnee); filtre.TypeElements = TypeEntite; filtre.ComposantPrincipal = compoPrincipal; res = filtre.GetFiltreData(); if (res && res.Data is CFiltreDataAvance) { if (valeursFixes != null) { CFiltreDataAvance filtreData = res.Data as CFiltreDataAvance; StringBuilder blAdd = new StringBuilder(); int nParam = filtreData.Parametres.Count + 1; foreach (KeyValuePair <string, object> kv in valeursFixes.ValeursFixes) { if (kv.Value == null) { blAdd.Append("HasNo("); blAdd.Append(kv.Key); blAdd.Append(") and "); } else { blAdd.Append(kv.Key); blAdd.Append("=@"); blAdd.Append((nParam++)); blAdd.Append(" and "); filtreData.Parametres.Add(kv.Value); } } blAdd.Remove(blAdd.Length - 5, 5); if (filtreData.Filtre.Length > 0) { blAdd.Insert(0, " and "); } filtreData.Filtre += blAdd; } objet = Activator.CreateInstance(TypeEntite, new object[] { contexteImport.ContexteDonnee }) as CObjetDonnee; if (objet.ReadIfExists(((CFiltreData)res.Data))) { contexteImport.SetEntiteForFiltre(strFiltre, objet); resObjet.DataType = objet; return(resObjet); } } else { res.EmpileErreur(I.T("Erreur while searching object|20093")); resObjet.EmpileErreur(res.Erreur); return(resObjet); } return(resObjet); }