Basis-klasse voor het gebruik van de Kenmerk.Data/Meta-Definities vhLib.Macro 1 %RegisteredObject 0 MetaGroep object van het type Kenm.Basis.MetaGroep of Prod.Kenmerk.MetaGroep of variante Kenm.Basis.MetaGroep %String Set blKenm=##class(BL.Kenm.Main).Create() 1 oMetaGroep:%RegisteredObject Main oMetaGroep:%RegisteredObject,blnPrefetchMDefs:%Boolean=1 %Status Set MetaGroep + related properties oMetaGroep:%RegisteredObject In het geheugen laden van de MetaDefinities / Prefetch MetaDefs: swizzled + kept in memory MetaGroep reeds ingevuld bij Initialize() method) Ophalen van alle bestaande kenmerkwaarden Kenmerk:%String="",blnSorted:%Boolean=1 %List Sorteren van de waarden (in lbValues) volgens de WaardenSortering van Kenmerk Kenmerk:%String="",lbValues:%String %List 0) . Set lbNew=lbNew_$LB($LI(lbBaseValues,i)) . Set:($LL(lbNew)=LenTS) i=$LL(lbBaseValues) ; Quit For-loop, want alle elementen van lbToSort zitten nu ook in lbNew Quit:(+$G(AddUnsorted)=0) lbNew ; Else Vreemde elementen (i.e. komen niet voor in lbBaseValues, maar wel in lbToSort) toevoegen aan lbNew If $LL(lbNew) Toevoegen van een kenmerk aan een product Indien het kenmerk reeds bestaat wordt het oude eerst verwijderd Indien Values piece-delimited, dan Delimiter meegeven Values als $LB() wordt automatisch herkent Opmerking: lege waarden worden niet opgeslagen UnID:%String,Kenmerk:%String,Values:%String,Delimiter:%String,UserID:%String %Status w $$ListToPieces^vhLib(##class(Prod.Kenmerk.DataDefinitie).Get("TB",89973,"BasisType"),";") Returns $LB(), want Waarden is een "List of %String" UnID:%String,Kenmerk:%String 1 %List 1 oDataDef:%RegisteredObject %Library.Status ..ProductGetObjectId() ; DataIndex waarden opnieuw invullen (wordt apart gedaan om SaveStatus straks deftig te kunnen opvangen) Set Key="" For Set Waarde=oDataDef.Waarden.GetNext(.Key) Quit:Key="" Do . Do ..IndexNewWaarde(Kenmerk,oDataDef.UnID,Waarde,Groep) ; ..UnID --> ..ProductGetObjectId() Quit $$$OK //De verschillende waarden in de vertalingstabel aanmaken //Voorwaarden: Geen substitutie /* * / Set SaveOK=$$$OK Set oVTLTransforms=oDataDef.Kenmerk.VertaalTransforms Set (VTAKey,Key)="" For Set VTA=oVTLTransforms.GetNext(.VTAKey) Quit:($$$ISERR(SaveOK)) Quit:(VTAKey="") Do:('VTA.IsSubstitutie()) ; Enkel aanmaken wanneer geen substitutie . For Set Waarde=oDataDef.Waarden.GetNext(.Key) Quit:($$$ISERR(SaveOK)) Quit:(Key="") Do . . Set SaveOK=VTA.FWDCreateLanguageObjsViaVTList(Waarde) //Respectievelijke CreateLangObj's aanroepen Quit SaveOK /* */ ]]> Verwijderen van de DataIndex objecten 1 Oid:%Library.ObjectIdentity %Library.Status Verwijderen van de waarden van een bepaald kenmerk en een bep. product 1 Groep:%String,Kenmerk:%String,UnID:%Integer 1 Groep:%String,Kenmerk:%String,UnID:%String,Waarde:%String GroepID is optioneel 1 UnID:%String,Groep:%String="" %Boolean De waarden voor de MetaDefinitie-objecten zitten in de routine "Kenm.Basis.MetaDefinitie.LoadObjects.MAC"]]> 1 Groep:%Library.String w ##class(BL.Kenm.Main).GetWaardenSort(Groep,Kenmerk) 1 Groep:%String,Kenmerk:%String %List Aan een lijst van kenmerkwaarden een prefix en/of suffix toevoegen en daarvan de "Interne waarde van het kenmerk hernoemen", alsook de vertalingen ervan (blnCopyVertalingen = 1). %Status equals", 1:"") Write msgDBG,! d WL^vhDBG(msgDBG) If (KenmWaardeTo'=KenmWaardeFrom) { Set sc=..RenameKenmWaarde(KenmerkNaam,KenmWaardeFrom,KenmWaardeTo,blnCopyVertalingen) Set lbResult=lbResult_$LB(KenmWaardeTo) } Else { Set lbResult=lbResult_$LB() } Quit:($$$ISERR(sc)) } Quit sc rkwWaardeCheckAddPrefix(Waarde,AddPrefix) ; Waarde als .local doorgeven If $L(AddPrefix)&&($$$Not($$$StartsWithVar(Waarde,AddPrefix))) Set Waarde=AddPrefix_Waarde Quit rkwWaardeCheckAddSuffix(Waarde,AddSuffix) ; Waarde als .local doorgeven If $L(AddSuffix)&&($$$Not($$$EndsWithVar(Waarde,AddSuffix))) Set Waarde=Waarde_AddSuffix Quit ]]> Interne waarde van een kenmerk hernoemen. KenmNaam:%String,FromWaarde:%String,ToWaarde:%String,blnCopyVtl:%Boolean=1 %Status 50 Do . Merge arUnIDs=^Prod.Ken.DataIndexD(Groep,KenmNaam,$E(FromWaarde,1,50)) Quit:('$D(arUnIDs)) $$$OK // Producten doorlopen en telkens de KenmWaarde vervangen // ====================================================== Set UnID="" For Set UnID=$O(arUnIDs(UnID)) Quit:(UnID="") Do . d WL^vhDBG("UnID: "_UnID) . Set lbWdn=##class(Prod.Kenmerk.DataDefinitie).Get(Groep,UnID,KenmNaam) . Set Pos=$LF(lbWdn,FromWaarde) . Quit:(Pos=0) . If $LF(lbWdn,ToWaarde)>0 Do Quit . . Set sc=$$$ERROR($$$GeneralError,"Voor UnID "_UnID_" bestaat de waarde "_ToWaarde_" reeds. Geen wijzigingen voor dit product.") . . d WL^vhDBG("Conflict: "_$$ParseStatus^vhLib(sc)) . ; Else Do . Set $LI(lbWdn,Pos)=ToWaarde . Set sc=##class(Prod.Kenmerk.DataDefinitie).Set(Groep,UnID,KenmNaam,lbWdn) . d WL^vhDBG(" Saved new kmwaarde(n): "_$$$LCVT(lbWdn)) Quit:('blnCopyVtl) sc // Kopieer Vertalingen van dit kenmerk, indien niet reeds ingevuld // =============================================================== Set VtlGroep=..MetaGroep.VertalingsGroep Set lbVtlTypes=##class(Prod.Kenmerk.MetaDefinitie).GetVertalingsTypesViaID(Groep_"||"_KenmNaam) ; Lege vertalingen toch eerst verwijderen For i=1:1:$LL(lbVtlTypes) Do . Set TextType=$LI(lbVtlTypes,i) . Set sc=$$rkwRemoveEmptyVtl() ; Snelle en complete manier om vertaling te kopiƫren Do ##class(Res.VertalingAbstract).CopyIntern(VtlGroep,FromWaarde,ToWaarde) ; Double check that all translations are copied d WL^vhDBG("Add Vertalingen ("_VtlGroep_") types: "_$$$LCVT(lbVtlTypes)) For i=1:1:$LL(lbVtlTypes) Do . Set TextType=$LI(lbVtlTypes,i) . Quit:(##class(Res.Vertaling).GetVertaling(VtlGroep,FromWaarde,TextType,"N")="") ; Vertaling 'From' niet ingevuld. . Quit:(##class(Res.Vertaling).GetVertaling(VtlGroep,ToWaarde, TextType,"N")'="") ; Vertaling 'To' bestaat reeds. NIET overschrijven !!! . Set sc=$$rkwUpdateLanguages() d WL^vhDBG("Finished RenameKenmWaarde() ") Quit sc rkwUpdateLanguages() ; Use Query GetLanguages(paGroep As %Library.String, paIntern As %Library.String, paType As %Library.String) As %Library.SQLQuery(CONTAINID = 0, ROWSPEC = "Taal,Vertaling:%Library.String") d WL^vhDBG("Updating Languages ... ") Set rsVertalingen=##class(%ResultSet).%New("Res.Vertaling:GetAllLanguages") ; --> :GetLanguages = Enkel de niet-lege Do rsVertalingen.Execute(VtlGroep,FromWaarde,TextType) For Quit:('rsVertalingen.Next()) Do . Set Taal=rsVertalingen.Get("Taal") . Set Vtl=rsVertalingen.Get("Vertaling") . d WL^vhDBG("Taal="_Taal_" Vtl="_Vtl) . Set oVtl=##class(Res.Vertaling).%OpenId(VtlGroep_"||"_FromWaarde_"||"_TextType_"||"_Taal) . Set oVtlNew=oVtl.%ConstructClone(0) . Set oVtlNew.Intern=ToWaarde . Set sc=oVtlNew.%Save() . ;Set sc=##class(Res.Vertaling).CreateOrUpdate(VtlGroep,ToWaarde,TextType,Taal,Vtl) . d WL^vhDBG("Updated: "_$$ParseStatus^vhLib(sc)) Do rsVertalingen.%Close() Set rsVertalingen="" Quit $G(sc,$$$OK) rkwRemoveEmptyVtl() d WL^vhDBG("Removing empty values (Vtl) for TextType "_TextType_" ... ") Set rsVertalingen=##class(%ResultSet).%New("Res.VertalingAbstract:GetAllLanguages") ; Alle, dus ook de lege Do rsVertalingen.Execute(VtlGroep,ToWaarde,TextType) For Quit:('rsVertalingen.Next()) Do . Set Taal=rsVertalingen.Get("Taal") . Set Vtl=rsVertalingen.Get("Vertaling") . d WL^vhDBG("Taal="_Taal_" Vtl="_Vtl) . Quit:(Vtl'="") . Set sc=##class(Res.Vertaling).%DeleteId(VtlGroep_"||"_ToWaarde_"||"_TextType_"||"_Taal) . Set:($$$ISERR(sc)) sc=##class(Res.VertalingLink).%DeleteId(VtlGroep_"||"_ToWaarde_"||"_TextType_"||"_Taal) . d WL^vhDBG("Removed empty Vtl: "_$$ParseStatus^vhLib(sc)) Do rsVertalingen.%Close() Set rsVertalingen="" Quit $G(sc,$$$OK) /* * / // Testen via: // ----------- s kmFrom="Dubbelwandige BOXSIDE aan te raden (separaat te be" s km="Dubbelw_Boxside_AanTeRaden_SepBestellen" s kmFrom=km s bl=##class(BL.Kenm.ProdMulti).Create("OL") s kmTo=km_"_1" s sc=bl.RenameKenmWaarde("BOWeten",kmFrom,kmTo,0) s kmFrom=kmTo s kmTo=km_"_2" s sc=bl.RenameKenmWaarde("BOWeten",kmFrom,kmTo,0) s kmFrom=kmTo s kmFrom="Dubbelwandige BOXSIDE aan te raden (separaat te be" s kmTo="Dubbelw_Boxside_AanTeRaden_SepBestellen" s bl=##class(BL.Kenm.ProdMulti).Create("OL") s sc=bl.RenameKenmWaarde("BOWeten",kmFrom,kmTo,1) CacheExplorer: ^Prod.Ken.DataIndexD("OL","BOWeten",Dub:Duz ^Res.VertalingAbstractD("PK",Du:Duz /* */ ]]>