Castle MonoRail ARDataBind trying to bind to non-existent row - castle-activerecord

I have a shopping cart application running on MonoRail and using Castle ActiveRecord/NHibernate, and there is a ShoppingCart table and a ShoppingCartItems table, which are mapped to entities.
Here's the scenario: a user adds things to the shopping cart, say 5 items, and goes to view the cart. The cart shows all 5 items. the user duplicates the tab/window and gets another tab of the same cart (call it tab B). the user removes an item from the cart, so now there are 4 items in tab B, but in the original tab A, there are still 5 items. the user goes back to tab A, and updates something in the cart and clicks the "update" button which submits the changes. my MonoRail action tries to do an ARDataBind on ShoppingCartItems using the data from the view, which includes all 5 items. when it gets to the item that the user deleted from tab B, it throws a "No row with the given identifier exists" for that item.
I can't figure out if there is a way to have it not bind that row, return null, return new instance, etc.? there is an AutoLoadBehavior parameter on the ARDataBind attribute, but that appears to only affect loading of child entities, and not the root entity. regardless of which option I choose, I get the exception before control even enters the action method (except AutoLoadBehavior.Never, but that doesn't really help me).
instead, I have code that calls Request.ObtainParamsNode() to pull the form nodes and parse them manually into objects, and ignores the ones that no longer exist. is there a better way?
thanks.

Inherit ARDataBinder, override FindByPrimaryKey(Type targetType, object id):
protected override object FindByPrimaryKey(Type targetType, object id) {
return FindByPrimaryKey(targetType, id, false);
}
The key here is the false parameter, which makes it return null instead of throwing.
Then inherit ARDataBindAttribute, override the CreateBinder() method and make it return your new binder instead of the default ARDataBinder.
Then apply your custom binder attribute instead of ARDataBindAttribute.

Related

An Updated Salesforce's Picklist does'nt render a new value just added

I am new in Salesforce and I need to add a new value in a picklist. Once added, I save, but when a I need to create a new record of the object within which there is the picklist, the new value is not rendered. Someone can explain me why?? Thanks
I tried by adding the new value by editing the picklist.
Does your object have "record types"? Like "ok, all accounts go to 1 database table but hospitals/factories/marketing agencies need different fields visible, different rules around what is required and even if they use same picklists - values on the picklists may differ". When you were adding that new picklist value it probably asked you to which (if any) record types you want it added...
Firstly, you should make sure the picklist value is active. Then make sure that the user profile viewing the page has visibility to that record type. this can be checked under Profile > Object settings > Work Order (or object that applies). After checking make sure that picklist field value was added to the appropriate record type.Please give feedback if u managed to get this done.

How to Update RecordTypeId field in Lightning record form in salesforce?

Hi #all I have lightning record edit form which are showing specific value one of them is a recordtype. I want to update the recordtype from the same as other fields are updating but when I click on recordtype field it shows me the below error:-
[LWC component's #wire target property or method threw an error during value provisioning. Original error:
[Field: RecordTypeId is not a valid lookup field.]]
Record Type change is a critical operation that messes everything up. Potentially you're looking at new page layout (incl required/readonly fields), new picklist dependencies... There's reason why you select it first before any layout is displayed. And why record type change is a special button, not a field visible on normal edit action.
If you know what you're doing, are confident the requirements won't change / you'll know how to represent the changed layouts, picklists etc...
Use getObjectInfo to pull (among others) the Map of record types.
Use this data to build lightning-combobox that onchange updates a helper variable (you'd ideally have that variable bound to <lightning-record-edit-form record-id={recordId} record-type-id={recordTypeId}
Have a custom handleSubmit in the record-edit-form in which you'd intercept the save, prepopulate the field and then submit.

How do I create and save a set/array of objects for a given Core Data entity?

I have an app that will ideally compare luxury restaurants and their respective dishes against each other. This means I have a Core Data entity called Restaurant with attributes like restaurantName, location, averagePrice, and foodType. I have a second Core Data entity called MenuItem with attributes like foodName, caloryCount, price, and rating.
Since the goal is to compare, say, two steakhouses and their filet mignons on calories/price/rating, I'd really like to take a preloaded list of MenuItem objects I have (an array called selectedMenuItems) and somehow save that as an attribute of the Restaurant entity so that each individual restaurant will have an instance of those menu item objects attached to it (after which the user could edit the calories/price/rating for each menu item on a restaurant by restaurant basis). In the most ideal scenario, if anything was added or subtracted from the selectedMenuItems array of objects it would be reflected across all individual restaurants.
What I've tried so far:
1.) Many-to-many relationship between Restaurant and MenuItem
As you can probably guess from my above description, this didn't work out how I wanted it to since it only connected each restaurant to the selectedMenuItems array, and any alterations made in a restaurant propagated through the relationship to the array (this was a fundamental misunderstanding of relationships, on my part).
2.) Create an attribute of type Transformable in Restaurant to hold the selectedMenuItems array
This looked like it was going to work for a moment. As I said, I created an attribute called menuItems in my Restaurant entity of type Transformable, and then in the view controller for each restaurant's detail view (the view controller that displays the menuItems is an additional navigation step) I added the following inside of viewDidLoad():
// The selected Restaurant is passed from the prior screen to restaurant
restaurant.menuItems = selectedMenuItems as NSObject?
Which resulted in seemingly what I needed, except for the fact that if I made any changes to the selectedMenuItems array, it would cause the app to crash with the console readout 'NSInvalidArgumentException', reason: '-[Restaurant encodeWithCoder:]: unrecognized selector sent to instance.
3.) Break apart the selectedMenuItems array of objects into matched arrays of properties
After doing some experimenting with 2.), it appeared as though having an array of objects was the issue. Because of this, I iterated through selectedMenuItems and stripped out the properties into their own arrays (foodNameArray, caloryCountArray, priceArray, etc.). After that, I assigned each of those to newly created attributes of my Restaurant entity:
restaurant.foodNames = foodNameArray as NSObject?
restaurant.caloryCounts = caloryCountArray as NSObject?
restaurant.prices = priceArray as NSObject?
Now, this was already looking very dodgy and prone to catastrophic failure. It did, however, work pretty much how I wanted it to. The issue here was that any changes to selectedMenuItems (like adding/removing a new object) didn't pass through to my restaurants after the first load. This is in contrast with 1.) where the changes propagated from the restaurants to selectedMenuItems (bottom to top) compared to 3.), where I want the changes to flow top to bottom.
Given the above descriptions, does anyone have advice on how I can get the functionality I'm looking for?
Rather than a many-many relationship, I would use three entities:
Restaurant, as you currently have;
Dish, which represents the generic menu item, such as "Filet mignon" or "Rib-eye"; and
MenuItem, which is a particular Dish served by a particular Restaurant.
Because Dish is generic, it would have only one attribute foodName (though you might want others). MenuItem would have attributes caloryCount, price, rating.
Since each MenuItem represents a particular dish served by a particular restaurant, it would have "to-one" relationships to Restaurant and Dish. For each relationship, the inverse would be "to-many": a Restaurant will serve many MenuItems, and a Dish could feature in many MenuItems.
You can then preload the list of Dishes, from which users can select those which are served by a particular restaurant. You can then create corresponding MenuItems and can presumably let users record calories/price/rating. If the user deletes a MenuItem, the corresponding Dish is unaffected, so will be available for other existing and/or new Restaurants. If the user wants to add a MenuItem for which there is no existing Dish, you can add a new Dish, which will then be available for any subsequent MenuItems.

MS Access keep ID field in subform filled with ID from parent form

Everytime I jump to where I can enter e new record, the ID field from the parent is empty and so the connection is lost. I am looking for a workaround.
My Setup
I have a parent form that deals with two 1:n relationships
(school-class --> pupils, school-class --> tests).
For the first relationship I used the wizard. Everything works find. For the second I show the connected tests in an unbound list. Under the list is a button opening the form for entering a new record (test) for the class I came from (parent form). So I filter the sub-form via VBA so that only the tests of the current class are shown. That works perfectly fine, too.
When moving through the tests already connected with the class the correct ID (of the class filtered) is the value of the corresponding input field. But when I come to the new new record state (all fields empty), then the connection to the parent breaks and the user has to manually enter the ID of the parent (school-class).
My Question
Is my setup correct?
Is there a better way to create a subform that offers to (only) enter a new record connected to the parent data? (Maybe without the ID input field in the subform and passing of forcing the value via VBA?)
Thank you for your time!
You can use Default Value to set the classid of Tests form but be sure the parent form is open in background or behind the pop up.
Under Property Sheet/Data tab of Tests form's classid control, enter in Default Value cell:
=Forms!parentformname!classid
Alternatively, in VBA in the Tests form's OnOpen Event:
Me.classid.DefaultValue = Forms!parentformname!classid
You can then choose to hide (Visible - No) this classid control so users do not modify it. It's always advised to never allow users control of primary and foreign keys.

Delete item within owned collection using GWT RequestFactory

I have a simple 1-n relationship (Product -> Item) mapped with RF EntityProxy. So,
ProductProxy extends EntityProxy {
List <ItemProxy> getItems();
void setItems(List<ItemProxy> items);
}
I have also a Product Editor with a nested ListEditor for Items. Everything is working fine if I Add new a Item to product.items list or edit any of them (save successfully).
However, If I remove one Item from the ProductProxy.getItems().remove(index) and try to save that product as a whole I noticed that when the object arrives on the server side, the item I've just removed is still within the collection.
It seems to me that RF tries a lookup for the objects into the datastore (using the Locator) before injecting the new values into the service object.
I need basically to be able to remove an Item within the collection and save the new (modified) collection into the Product object.
Thanks!!
PS. I'm using Objectify Ref<> to keep that collections.
Payload before sending request:
{"F":"web.app.gwt.shared.AppRequestFactory","O":[{"T":"kKv$zKrUQuvZDqvbc2XdTq6i1qU=","V":"NC4w","P":{"defaultOptions":[]},"S":"IjI5MiI=","O":"UPDATE"},{"T":"_dEu_lZqt6BooJQsjzBeHUf38EY=","V":"NC4w","S":"IjI5MCI=","O":"UPDATE"},{"T":"_dEu_lZqt6BooJQsjzBeHUf38EY=","V":"NC4w","S":"IjI4OSI=","O":"UPDATE"},{"T":"_dEu_lZqt6BooJQsjzBeHUf38EY=","V":"NC4w","S":"IjI5MSI=","O":"UPDATE"}],"I":[{"P":[{"T":"kKv$zKrUQuvZDqvbc2XdTq6i1qU=","S":"IjI5MiI="}],"O":"O4GgjqqjQkeFcxD6lGwHruEwO6U="}]}

Resources