这是我的提示:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)
我必须放入units.p_code="PCE"
的 newvalue(pk) pk ,首先,我必须从数据库中获取它。这是我的查询它在我的MySQL中是否完美运行:
SELECT `units`.`PK` FROM `my_schema`.`units` WHERE `units`.`p_code`="PCE";
我已经尝试过了:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)
;001:Antiviren-Software (Client-Betriebssystem);
"#%
impex.initDatabase( <myDburl>, <myUser>, <myPassword>, <MyDriver.class>);"
"#%
impex.includeSQLData(
"" SELECT ""+
"" units.PK ""+"" FROM my_schema.units ""+
"" WHERE ""+
"" units.p_code ='PCE'""
);"
这:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)
;001:Antiviren-Software (Client-Betriebssystem);
"#%
import de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
flexibleSearchService = Registry.getApplicationContext().getBean(""flexibleSearchService"");
query = "" SELECT {units.PK} FROM {my_schema.units} WHERE {units.p_code} LIKE '%PCE%' "";
flexibleSearchQuery = new FlexibleSearchQuery(query);
resultIterator = flexibleSearchService.search(flexibleSearchQuery).getResult().iterator();"
但是没有用。有人可以给我提示吗?
重新尝试:
INSERT_UPDATE ReferenceProductAttributeValue;newvalue(pk);leaf(code,name[lang=de])[unique=true]
#% beforeEach:
#% import de.hybris.platform.core.model.product.UnitModel;
#% import de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
#% import de.hybris.platform.jalo.flexiblesearch.* ;
#% import de.hybris.platform.core.Registry;
#% flexibleSearchService = Registry.getApplicationContext().getBean("flexibleSearchService");
#% query = "SELECT {" + UnitModel.PK + "} FROM {" + UnitModel._TYPECODE + "} WHERE {" + UnitModel.CODE + "} = 'PCE' ";
#% flexibleSearchQuery = new FlexibleSearchQuery(query);
#% resultIterator = flexibleSearchService.search(flexibleSearchQuery).getResult().iterator().next();
#% beforeEach: end \
;001:Antiviren-Software (Client-Betriebssystem)
现在我不再有错误,但现在我在newvalue中没有搜索到的pk。有人能帮我吗?谢谢!
答案 0 :(得分:1)
尝试使用代码
newvalue(code)[default='PCE']
答案 1 :(得分:0)
解决方案取决于newValue的类型。
如果其类型为Unit,则可以通过一个或多个Unit类型的属性来引用它,该属性可以唯一标识此项目(例如代码):
newvalue(code)
如果其类型更通用,例如Item,则需要使用该类型的唯一属性。 Item的唯一唯一属性是PK。但您不想引用PK单位。因此,可以通过在属性前面加上要引用的类型的类型代码来定义应使用的类型:
newValue(Unit.code)
在完整的声明中,它看起来像这样:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de][unique=true];newvalue(Unit.code);
;001:AGP-Grafikkarte;PCE;
在使用&运算符之前,您还可以引用在impex语句中使用的其他项目。 &运算符定义引用。您可以在标头中定义它们,如下所示:
INSERT_UPDATE Unit;code[unique=true];$unitRef;
;pieces;PIECES_REF;
;cm;CM_REF;
然后您可以稍后使用引用来引用值:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de][unique=true];newvalue(&unitRef);
;001:AGP-Grafikkarte;PIECES_REF;
答案 2 :(得分:-2)
所以我的解决方案是我制作了一个看起来像这样的翻译器(这仅适用于像我这样的其他初学者,也许也适用于其他解决方案,但是对我来说这已经足够了,它确实可以工作。代码,请...):
public class UnitByCodeTranslator extends AbstractSpecialValueTranslator
{
...
/*
*
* @see de.hybris.platform.impex.jalo.translators.AbstractSpecialValueTranslator#performImport(java.lang.String,
* de.hybris.platform.jalo.Item)
*/
@Override
public void performImport(final String cellValue, final Item item) throws ImpExException
{
if ((item instanceof ReferenceProductAttributeValue))
{
final ReferenceProductAttributeValueModel referenceProdAttVal = (ReferenceProductAttributeValueModel) modelService.get(item.getPK());
final String value = cellValue;
final UnitModel unit = new UnitModel();
try
{
unit.setCode(value);
final UnitModel foundUnit = flexibleSearchService.getModelByExample(unit);
referenceProdAttVal.setNewValue(foundUnit);
modelService.save(referenceProdAttVal);
}
catch (final UnknownIdentifierException e)
{
LOGGER.warn("Could not find a Unit for this " + value);
}
catch (final AmbiguousIdentifierException e)
{
LOGGER.warn(e.toString());
throw new UnresolvedValueException(e.toString());
}
}
}
....
}
那么impex就是这样:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];@newvalue[translator=com.myextension.core.impex.translators.UnitByCodeTranslator]
;001:AGP-Grafikkarte;PCE