//------------------------------------------------ private CResultAErreurType <CValeursImportFixe> GetValeursFixesPourFilles(CObjetDonnee parent) { CResultAErreurType <CValeursImportFixe> resVals = new CResultAErreurType <CValeursImportFixe>(); if (Propriete is CDefinitionProprieteDynamiqueDotNet) { Type tp = MappagesEntitesFilles.ElementAt(0).ConfigMappage.TypeEntite; CDefinitionProprieteDynamique pDeFille = Propriete.GetDefinitionInverse(parent.GetType()); PropertyInfo info = tp.GetProperty(pDeFille.NomProprieteSansCleTypeChamp); if (info != null) { RelationAttribute relPar = info.GetCustomAttribute <RelationAttribute>(true); if (relPar != null) { CValeursImportFixe vals = new CValeursImportFixe(); for (int nChamp = 0; nChamp < relPar.ChampsFils.Length; nChamp++) { vals.SetValeur(relPar.ChampsFils[nChamp], parent.Row[relPar.ChampsParent[nChamp]]); } resVals.DataType = vals; return(resVals); } } } if (Propriete is CDefinitionProprieteDynamiqueRelationTypeId && parent is CObjetDonneeAIdNumerique) { RelationTypeIdAttribute att = ((CDefinitionProprieteDynamiqueRelationTypeId)Propriete).Relation; if (att != null) { CValeursImportFixe vals = new CValeursImportFixe(); vals.SetValeur(att.ChampType, parent.GetType().ToString()); vals.SetValeur(att.ChampId, ((CObjetDonneeAIdNumerique)parent).Id); resVals.DataType = vals; return(resVals); } } resVals.EmpileErreur(I.T("Can not define parent filter for property @1|20098", Propriete.Nom)); return(resVals); }
//------------------------------------------------ private CResultAErreur UpdateObjet( DataRow row, CObjetDonnee objet, bool bIsNewObject, CContexteImportDonnee contexteImport, CValeursImportFixe valeursFixes) { CResultAErreur result = CResultAErreur.True; foreach (CMappageChampSimple mappage in MappagesChampsSimples) { if (mappage.Source != null && mappage.Source.ShouldImport(row, contexteImport)) { try { contexteImport.PushChamp(mappage.Propriete); result = mappage.GetValue(row, contexteImport); if (!result) { contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, mappage.Source.LibelleSource, contexteImport, result.Erreur.ToString())); return(result); } try { CInterpreteurProprieteDynamique.SetValue(objet, mappage.Propriete, result.Data); //Stockage valeur témoin CSourceSmartImportField sourceField = mappage.Source as CSourceSmartImportField; if (sourceField != null) { result = CInterpreteurProprieteDynamique.GetValue(objet, mappage.Propriete); if (result) { contexteImport.SetValeurTemoin(sourceField.NomChampSource, result.Data); } result = CResultAErreur.True; } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); result.EmpileErreur(I.T("Error while affecting value @1 to field @2|20097", result.Data == null ? "null" : result.Data.ToString())); contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, mappage.Source.LibelleSource, contexteImport, result.Erreur.ToString())); return(result); } } finally { contexteImport.PopChamp(); } } } foreach (CMappageEntiteParente mapParent in MappagesEntitesParentes) { if (mapParent.Source != null && mapParent.Source.ShouldImport(row, contexteImport)) { try { contexteImport.PushChamp(mapParent.Propriete); CResultAErreurType <CObjetDonnee> resObjet = mapParent.GetObjetAssocie(row, contexteImport, true); if (!resObjet) { contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, mapParent.Source.LibelleSource, contexteImport, resObjet.MessageErreur)); } else { try { if (mapParent.AlternativeSetMethodInfo != null) { mapParent.AlternativeSetMethodInfo.Invoke(objet, new object[] { resObjet.DataType }); } else { result = CInterpreteurProprieteDynamique.SetValue(objet, mapParent.Propriete, resObjet.DataType); if (!result && mapParent.Propriete is CDefinitionProprieteDynamiqueDotNet) { //Tente affectation via fonction spécifique PropertyInfo info = objet.GetType().GetProperty(mapParent.Propriete.NomProprieteSansCleTypeChamp); if (info != null) { SpecificImportSetAttribute spec = info.GetCustomAttribute <SpecificImportSetAttribute>(true); if (spec != null) { MethodInfo method = objet.GetType().GetMethod(spec.NomMethodeSetSpecifique); if (method != null) { method.Invoke(objet, new object[] { resObjet.DataType }); } mapParent.AlternativeSetMethodInfo = method; } } } } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); result.EmpileErreur(I.T("Error while affecting value @1 to field @2|20097", result.Data == null ? "null" : result.Data.ToString())); contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, mapParent.Source.LibelleSource, contexteImport, result.Erreur.ToString())); return(result); } } } finally { contexteImport.PopChamp(); } } } if (valeursFixes != null) { foreach (KeyValuePair <string, object> kv in valeursFixes.ValeursFixes) { objet.Row[kv.Key] = kv.Value == null ? DBNull.Value : kv.Value; } } foreach (CMappageEntitesFilles mapFille in m_listeMappagesFilles) { try { contexteImport.PushChamp(mapFille.Propriete); result = mapFille.ImportRow(row, contexteImport, objet); if (!result) { contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, "", contexteImport, result.Erreur.ToString())); result = CResultAErreur.True; } } finally { contexteImport.PopChamp(); } } 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); }
//------------------------------------------------ public CResultAErreur ImportRow( DataRow row, CContexteImportDonnee contexteImport, CValeursImportFixe valeursFixes, bool bIsRoot) { CResultAErreur result = CResultAErreur.True; contexteImport.PushIdConfigMappage(IdMappage); try { string strFiltre = ""; CResultAErreurType <CObjetDonnee> resObjet = FindObjet(row, contexteImport, valeursFixes, ref strFiltre); if (!resObjet) { contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, "", contexteImport, resObjet.Erreur.ToString())); result.EmpileErreur(resObjet.Erreur); return(result); } if (resObjet.DataType == null && this.OptionCreation == EOptionCreationElementImport.None) { contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Alert, row, "", contexteImport, I.T("Line not imported because creation is forbidden for this element|20095"))); return(result); } CObjetDonnee objet = resObjet.DataType; bool bIsNew = false; if (objet == null) { bIsNew = true; //Création try { objet = Activator.CreateInstance(TypeEntite, new object[] { contexteImport.ContexteDonnee }) as CObjetDonnee; } catch { } if (objet == null) { result.EmpileErreur(I.T("Error while creating object @1|20096", DynamicClassAttribute.GetNomConvivial(TypeEntite))); contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, null, contexteImport, result.Erreur.ToString())); return(result); } if (objet is CObjetDonneeAIdNumeriqueAuto) { ((CObjetDonneeAIdNumeriqueAuto)objet).CreateNewInCurrentContexte(); } else { objet.CreateNewInCurrentContexte(null); } contexteImport.AddElementQuiAEteAjoute(objet); contexteImport.SetEntiteForFiltre(strFiltre, objet); } if (bIsRoot) { contexteImport.SetElementPourLigne(contexteImport.CurrentRowIndex, objet); } contexteImport.SetObjetImporteForIdMappage(IdMappage, objet); result = UpdateObjet(row, objet, bIsNew, contexteImport, valeursFixes); if (!result) { contexteImport.AddLog(new CLigneLogImport( ETypeLigneLogImport.Error, row, "", contexteImport, result.Erreur.ToString())); return(result); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { contexteImport.PopIdConfigMappage(); } return(result); }