Vaste leggen van de kenmerken per product. Er wordt bewust geen link gelegd naar MetaGroep of MetaDefinitie omdat anders bij gebruik van de waarden swivel inwerking zou treden, dit mag niet om dat bv voor één kenmerk meerdere waarden kunnen ingegeven worden. Dus bij wijzigen van een kenmerk moeten voor een bepaald product alle waarden verzameld worden. persistent vhLib.Macro 1 TECH.Concurrency.VhPersistent 0 Prod.Kenmerk.MetaDefinitie %String Prod.Product 1 Meerdere waarde mogelijk %Library.String list Berekeningsformule voor de waarde van het kenmerk te berekenen. Is o.a. van toepassing bij OL.ProductBreedte en OL.ProductDiepte. %String insert:%Boolean 1 %Status %Library.String Sys.cTimeStamp Indien geen event voor creatie/wijziging/verwijderen gewenst is kan deze vlag worden afgezet. Het is dan de verantwoordelijkheid van de applicatie om zelf events te voorzien. Een betere implementatie zou zijn om een extra scope te initialiseren. De kenmerk definitie zou dan moeten controleren of deze scope is ingeschakeld. Zoja dan moeten wijzigingen aan deze scope meegedeeld worden. De code die de scope heeft geïnitialiseerd moet dan ook zelf zorgen dat de scope wordt afgesloten zodat de bulk event kan geraised worden. %Boolean 1 1 1 1 UnID,Kenmerk KenmerkGroep KenmerkNaam KenmerkGroep,KenmerkNaam,UnID,Waarden,InstanceVersion PRNr UnID KenmerkNaam,UnID,Waarden,InstanceVersion PRNr,KenmerkGroep:EXACT ************** !!!! **************** !!! *************************************** KenmerkGroep en KenmerkNaam dienen ENKEL voor indexen te kunnen maken. Deze mogen NOOIT door programma code gebruikt worden of aangeroepen worden !!! ************** !!!! **************** !!! *************************************** %String ************** !!!! **************** !!! *************************************** KenmerkGroep en KenmerkNaam dienen ENKEL voor indexen te kunnen maken. Deze mogen NOOIT door programma code gebruikt worden of aangeroepen worden !!! %String ************** !!!! **************** !!! *************************************** PRNr dient voor indexen te kunnen maken. Deze mag NOOIT door programma code gebruikt worden of aangeroepen worden !!! ************** !!!! **************** !!! *************************************** %Integer ************** !!!! **************** !!! *************************************** IsNew:%Library.Boolean=1 0 %Library.Status Prod.Kenmerk.MetaDefinitie Verwijderen van de DataIndex objecten 1 Oid:%Library.ObjectIdentity 0 %Library.Status // get row id of inserted row #define UnID $P(ID,"||",1) #define Groep $P(ID,"||",2) #define Kenm $P(ID,"||",3) set ID = {ID} // Een "delete" is ook een modify. De waardenlijst wordt van "gevuld" naar "leeg" gewijzigd. Set EventData = ##class(TECH.Events.KenmerkModifiedEventData).%New($$$UnID,$$$Groep,$$$Kenm,##class(%ListOfDataTypes).%New()) Set Event = ##class(TECH.Events.KenmerkModifiedEvent).%New(EventData) Do ##class(TECH.PubSub.OrchestrationContext).GetEventRaiser().RaiseEventAsync(Event) Do ##class(Prod.Kenmerk.DataIndex).DeleteWaarden($$$Groep,$$$Kenm,$$$UnID) DELETE Zie classmethod WijzigOfMaak() Doorverwijzing : aangepast door WimV op 20/05/2011 1 GroepID:%String,UnID:%String,KenmerkNaam:%String,Waarden,Delimiter:%String,UserID:%String,Formule:%String="" 1 %Status Toevoegen van een kenmerk aan een product Indien Waarden als Piece delimited, dan Delimiter meegeven Waarden als $LB wordt automatisch herkent Formule wordt enkel als property ingevuld, maar waarde wordt niet berekend want steunt meestal nog op waarden van andere kenmerken. Opmerking: lege waarden worden wel opgeslagen. Het is echter beter in dit geval om de method DeleteKM() op te roepen. Oproepen via : Set sc=##class(Prod.Kenmerk.DataDefinitie).WijzigOfMaak("OL",89973,"Diepte","45",";",17) 1 GroepID:%String,UnID:%String,KenmerkNaam:%String,Waarden,Delimiter:%String,UserID:%String,Formule:%String="",RaiseEvent:%Boolean=1 1 %Status 1 GroepID,UnID,Kenmerk 1 w $$ListToPieces^vhLib(##class(Prod.Kenmerk.DataDefinitie).Get("TB",89973,"BasisType"),";") Returns $LB(), want Waarden is een "List of %String" 1 GroepID,UnID,Kenmerk 1 %List 1 GroepID,UnID,Kenmerk 1 %String Indien het kenmerk bestaat, wordt het verwijderd. 1 GroepID,UnID,Kenmerk 1 %Status Berekent de volledige URL voor de gegeven parameters. De parameters bepalen de vertaling: - GroepID, UnID, Kenmerk definiëren de waarde voor het kenmerk (DataDefinitie) - Taal, TextType, ToepasType zijn de vertalingsparameters, samen met de DirCode (berekende waarde) Oproepen via (test) : w ##class(Prod.Kenmerk.DataDefinitie).GetFullURL("OL",107785,"InfoSleutel","N","LB","WWW") 1 GroepID,UnID,Kenmerk,Taal,TextType,ToepasType 1 %List GroepID is optioneel 1 UnID,GroepID 0 %Boolean Op te roepen vanuit VBA Zie method DeleteViaUnID() 1 PRNr:%String,GroepIDs:%String 1 %String Zie method DeleteViaUnID() 1 PRNr:%Library.String,lbGroepIDs:%Library.List 1 %Library.Status lbGroepIDs is optioneel; indien leeg, dan worden ALLE groepen voor het product verwijderd. lbGroepIDs mag ook als piece-delimited-list gegeven worden (";" als delim) ]]> 1 UnID:%Library.String,lbGroepIDs:%Library.List 1 %Library.Status 1 UnID:%String,GroepID:%String 1 Groep = :GroepID) OR (:GroepID=$$$CodeAllGroups)) ) &sql(OPEN crsDP) For &sql(FETCH crsDP) Quit:SQLCODE Set HasDeleteKenmerk = 1 Set Status = ##class(Prod.Kenmerk.DataDefinitie).%DeleteId(DDefID) Quit:$$$ISERR(Status) &sql(CLOSE crsDP) If $$$ISERR(Status) Quit Status Quit HasDeleteKenmerk ]]> Zie method CopyViaUnID() 1 FromPRNr:%Library.String,ToPRNr:%Library.String,lbGroepIDs:%Library.List,blnOverwrite:%Boolean=0,UserID:%String,lbExcludeGroepIDs:%List 1 %Library.Status - lbGroepIDs is optioneel; indien leeg, dan worden ALLE groepen van het product gekopieerd.
- blnOverwrite is optioneel; default=false; indien true, dan worden de kenmerken van ToUnID eerst verwijderd.
- UserID is optioneel; voor de property WijzigGebruiker.
- lbExcludeGroepIDs is optioneel; alleen gebruikt in lbGroepIDs leeg is (maw alle groepen), dan kunnen bepaalde groepen niet gekopieerd worden.
]]>
1 FromUnID:%String,ToUnID:%String,lbGroepIDs:%List,blnOverwrite:%Boolean=0,UserID:%String="",lbExcludeGroepIDs:%List 1 %Status Groep INTO :DDefID,:KenmerkGroep FROM Prod_Kenmerk.DataDefinitie WHERE (UnID=:FromUnID) AND ((Kenmerk->Groep = :GroepID) OR (:GroepID="*")) ) &sql(OPEN crsCP) Set sc=$$$OK For &sql(FETCH crsCP) Quit:SQLCODE Do Quit:($$$ISERR(sc)) . If $LL($G(lbExcludeGroepIDs)) Quit:$LF(lbExcludeGroepIDs,KenmerkGroep) . Set objFrom=##class(Prod.Kenmerk.DataDefinitie).OpenId(DDefID) . Set objNew=objFrom.%ConstructClone(0) . ;Set DDefIDNew = "381469.1||"_$Piece(DDefID,"||",2,99) . ;w DDefIDNew,! . ;Set objNew = ##class(Prod.Kenmerk.DataDefinitie).OpenId(DDefIDNew) . Set objNew.UnID=ToUnID . ;Do objNew.ProductSetObjectId(ToPRNr) . Set objNew.WijzigTijdstip="" ; $zdt($H,4) . Set:UserID="" UserID = ##class(TECH.Context.RuntimeContext).Instance().GeefGebruikerInitialen() . Set:($L($G(UserID))) objNew.WijzigGebruiker=UserID . Do objNew.Save() . Lock -(^Prod.Ken.DataDefinitieD(ToUnID,"")) . Set objFrom="" . Set objNew="" . k objFrom,objNew Set sc=$G(sc,$$$ERROR($$$GeneralError,$$$msgNoKenmToCopy(FromUnID,GroepID))) &sql(CLOSE crsCP) Quit sc ]]>
Intern:%Library.String,Type:%Library.String 0 %Library.String SUBSTITUTIE vereist opstellen van taaldoorsnede ... New Sleutels,AantalSleutels,SubLang,SleutelLoop,tmpSleutel ... Set Sleutels=VTA.GetVertalingsSleutels(Type) ... Set AantalSleutels=$LL(Sleutels) //Aantal te vertalen sleutels ... Set SubLang="" ... For SleutelLoop=1:1:AantalSleutels Do .... Set tmpSleutel=$LI($LI(Sleutels,SleutelLoop),2) //Het eerste element bevat het type .... If ##class(Res.VertalingAbstract).IsInternUniversal(tmpSleutel) Do //Wanneer sleutel vh type {%...} is dan is het een universele vertaling (groep %) ..... Set SubLang=SubLang _ ##class(Res.VertalingAbstract).AvailableLanguages("%",tmpSleutel,Type) .... Else Do ..... Set SubLang=SubLang _ ##class(Res.VertalingAbstract).AvailableLanguages(VertalingsGroep,tmpSleutel,Type) ... Set LanguagesOK=##class(Res.VertalingAbstract).GetLanguagesWithCountOK(SubLang,AantalSleutels) .. Else Do //-> GEEN SUBSTITUTIE, gewoon languages opvragen ... Set:(Intern'="") LanguagesOK=##class(Res.VertalingAbstract).AvailableLanguages(VertalingsGroep,Intern,Type) Quit LanguagesOK // ---< Pseudo-code >--- // Loop doorheen vertalingstypes van MetaDef (array) // . Loop doorheen elke VertalingsType (';' pieces) // .. Als VertalingsType=Type Doe // ... Als het om substitutie gaat // .... Sleutels uitlezen // .... Vertalingen van sleutels verkrijgen & samenvoegen // .... Talen extraheren met correcte count // ... Geen Substitutie // .... Vertalingen van interne waarde verkrijgen ]]> Method om de cache v DataDefs vanuit Excel (TBX Product Kenmerken.xls) te resetten. 1 GroepID:%String 1 Method om de DataDefs vanuit Excel (TBX Product Kenmerken.xls) op te kuisen. 1 GroepID:%String,blnForceDelete:%Integer=0 1 %String 10) . If $G(%arProductAdded("-"_GroepID_"-ERR",UnID))=1 Do . . Set msg=msg_"UnID="_UnID_" > " . . Set iDD="" . . For Set iDD=$O(%arProductAdded("-"_GroepID,UnID,iDD)) Quit:(iDD="") Do . . . Set Status=$G(%arProductAdded("-"_GroepID,UnID,iDD)) . . . Set msg=msg_iDD_$S($L(Status):": "_Status, 1:"")_" - " . . Set msg=msg_" < "_$$$CRLF . Else Do . . Set msg=msg_"UnID="_UnID_$$$CRLF Set:(CntPR>10) msg=msg_"..."_$$$CRLF Set msg="Aantal PR niet ge-update : "_CntPR_" "_$$$CRLF_msg Set msg=msg_$$$CRLF Set:(CntPR>0) msg=msg_"De log van deze CleanUp is bewaard in de global "_($Name(^HULP("WV-TBX",PctJ)))_$$$CRLF Set ^HULP("WV-TBX",PctJ,"B")=msg Quit msg ]]> Method om de DataDefs vanuit Excel (TBX Product Kenmerken.xls) in te vullen. 1 Params:%String 1 %String 1 Params:%Library.String 0 %Library.String Interne volgorde van de list Waarden wordt gewijzigd (dus in de storage), voor het gekozen kenmerk, voor alle producten. 1 GroepID:%Library.String,Kenmerk:%Library.String 0 %Status Mogelijke waarden voor ListItems: bvb.: "*" , "1" , "1;2" , "1;2;5;7"
Als ListSep niet leeg is, worden de vertaalde items geconcateneerd (met ListSep as separator) tot één element van de $LB().]]>
LBX:%Library.String,ListSep:%Library.String,Taal:%Library.String="N",TextType:%Library.String="L",DoNotConvert2Html:%Boolean 0 %Library.String
X:%Library.String,Taal:%Library.String="N",TextType:%Library.String="L",ClearCharEmpty:%Library.Boolean=0,DoNotConvert2Html:%Boolean 0 %Library.String %Library.SQLQuery paPRNr:%Library.String,paGroep:%Library.String SELECT Count(ID) AS Aantal FROM Prod_Kenmerk.DataDefinitie WHERE ID Like :paPRNr || "||" || :paGroep || "||%" ]]> %Library.SQLQuery GroepID:%Library.String,Kenmerk:%Library.String,SuperKenmerk:%Library.String,SuperKMWaarde:%Library.String SELECT DISTINCT(Waarden) FROM Prod_Kenmerk.DataDefinitie WHERE Kenmerk=(:GroepID || '||' || :Kenmerk) AND UnID IN (SELECT UnID FROM Prod_Kenmerk.DataDefinitie WHERE Kenmerk=(:GroepID || '||' || :SuperKenmerk) AND Waarden LIKE ("%" || :SuperKMWaarde) ) %Library.SQLQuery paPRNr:%Library.String Groep) AS Groep FROM Prod_Kenmerk.DataDefinitie WHERE UnID=:paPRNr]]> Geeft een lijst van alle kenmerken met resp. waarden voor een gegeven ProductNummer. Het "Kenmerk" field is nodig voor de sortering van producten volgens hun kenmerk/waarden (added by WimV on 17/09/2008) "KenmerkNaam" geeft de omschrijving indien aanwezig, anders gewoon de KMNaam. %Library.SQLQuery PRNr:%Library.String Kenmerk, isnull( Kenmerk->Omschrijving,Kenmerk->Kenmerk), Waarden, Kenmerk->Groep->Code, Kenmerk->SubGroep FROM Prod_Kenmerk.DataDefinitie WHERE (UnID = :PRNr) ORDER BY Kenmerk->VolgNr]]> Geeft een lijst van alle kenmerken toegelaten voor E-commeerce met de resp. waarden voor een gegeven ProductNummer. Indien een OL-product multiple kenmerken-sets heeft, dan wordt de de multiple met UnID "xxx.1" getoond. Dit is een quick-and-dirty oplossing. (Added by WimV on 23/09/2010) %Library.SQLQuery PRNr:%Library.String Omschrijving,Kenmerk->Kenmerk), Waarden, Kenmerk->Groep->Code,Kenmerk->SubGroep FROM Prod_Kenmerk.DataDefinitie WHERE ( UnID = :PRNr or UnID=(:PRNr || '.1') ) and (Kenmerk->ToelatenEC=1) ORDER BY Kenmerk->VolgNr]]> 1 JBL + 2011-04-07 Method om alle ingevulde waarden van een Definitie op te halen %Library.SQLQuery Groep:%String,Kenmerk:%String SELECT DISTINCT Waarde FROM Prod_Kenmerk.DataIndex where Kenmerk = :Kenmerk AND Groep = :Groep ORDER BY Waarde 1 KenmerkUnID %String 1 KenmerkUnID %String locktype 1 1 %Status %Library.CacheStorage ^Prod.Ken.DataDefinitieD DataDefinitieDefaultData ^Prod.Ken.DataDefinitieD ^Prod.Ken.DataDefinitieI ^Prod.Ken.DataDefinitieS %%CLASSNAME node 0 Waarden WijzigGebruiker WijzigTijdstip Formule InstanceVersion PrivateKenmerk KenmerkGroep KenmerkNaam PRNr 99.9992% 25.0000% 0.6711% 11.1111% 0.7353% 0.0007% 0.0007% 0.1927% 33.3332% 0.0012%