Мне нужно создать экран обработки для местоположений клиентов, который определяет, а затем обновляет флаг местожительства на местах.
Этот код правильно обрабатывает каждую выбранную запись и, по-видимому, обновляет соответствующие поля.Но проблема, с которой я сталкиваюсь, заключается в том, что мои изменения в Location
не сохраняются обратно в базу данных.
График "Местоположения клиентов" требует, чтобы бизнес-аккаунт был указан, прежде чем вы сможете ввести идентификатор местоположения, и я подозреваю, что из-за этого я не могу просто обновить представление Местоположений на графике.Но я не могу найти никакой документации или примеров кода, указывающих, какой подход я должен использовать здесь.
Вот код на моем графике экрана обработки:
public class ProcessCustomerLocations : PXGraph<ProcessCustomerLocations>
{
public PXCancel<Location> Cancel;
public PXProcessing<Location, Where<Location.isActive, Equal<True>>> Locations;
public static void Process(List<Location> locations)
{
var graph = PXGraph.CreateInstance<CustomerLocationMaint>();
CustomerLocationMaint_Extension graphExt = graph.GetExtension<CustomerLocationMaint_Extension>();
foreach (var location in locations)
{
graphExt.UpdateLocation(location, true);
}
}
public ProcessCustomerLocations()
{
Locations.SetProcessDelegate(Process);
}
}
А вот мой код на графике CustomerLocationMaint_Extension:
public class CustomerLocationMaint_Extension : PXGraphExtension<CustomerLocationMaint>
{
public void UpdateLocation(Location location, bool isMassProcess = false)
{
bool isRes = false;
Base.Location.Current = Base.Location.Search<Location.locationID>(location.LocationID, location.BAccountID);
LocationExt locationExt = location.GetExtension<LocationExt>();
// INSERT CODE TO DETERMINE VALUE OF isRes
locationExt.UsrResidentialValidated = true;
location.CResedential = isRes;
Base.Location.Update(location);
Base.Actions.PressSave();
}
}
Одно из полей, которые яОбновление в Location - это настраиваемое поле с именем UsrResidentialValidated
.Вот код для этого поля.
namespace PX.Objects.CR
{
public class LocationExt : PXCacheExtension<PX.Objects.CR.Location>
{
#region UsrResidentialValidated
[PXDBBool]
[PXUIField(DisplayName="Residential Validated")]
public virtual bool? UsrResidentialValidated { get; set; }
public abstract class usrResidentialValidated : IBqlField { }
#endregion
}
}
Обновление
Благодаря некоторой помощи @Samvel я изменил код UpdateLocation
следующим образом.Следующий код сохраняет изменения в базе данных (как в настраиваемом, так и в нестандартном поле), и это здорово.Однако для этого мне пришлось создать новый объект Location «myLocation», и я больше не использую объект «location», который граф PXProcessing передал UpdateLocation.Это означает, что после обработки, когда на экране обработки отображаются обработанные записи с измененными данными (после завершения обработки и до обновления экрана), на нем не отображаются обновленные значения.Есть ли способ, чтобы на экране обработки отображались обновленные значения и сохранялись изменения в базе данных?
public void UpdateLocation(PX.Objects.CR.Location location, bool isMassProcess = false)
{
bool isRes = true;
Location myLocation = PXSelect<Location,
Where<Location.bAccountID, Equal<Required<Location.bAccountID>>, And<Location.locationID, Equal<Required<Location.locationID>>>>>
.Select(this.Base, location.BAccountID, location.LocationID);
this.Base.Location.Current = myLocation;
LocationExt locationExt = myLocation.GetExtension<LocationExt>();
locationExt.UsrResidentialValidated = true;
myLocation.CResedential = isRes;
Base.Location.Current = Base.Location.Update(myLocation);
this.Base.Save.Press();
}