#include vhLib.Macro ; w $$PRGetProductViaKenm^Prod.GAMeta.Item.tmpDev ; (KenmGrp,Kenm,DItem) PRGetProductViaKenm() ; Parameters: KenmGrp,Kenm,DItem ;Quit "" ;Quit 87944 New KLNr,lbPRNr Set:('$D(DItem)) DItem=Self Set:('$D(KenmGrp)) KenmGrp=DItem.Get("KenmGrp") Set:('$D(Kenm)) Kenm=DItem.Get("Kenm") Set KLNr=$S($D(tmpKLNr):tmpKLNr, 1:DItem.Product.KlantGetObjectId()) Set lbPRNr=$$PRGetProductViaKenmerkLijst(KenmGrp,Kenm,KLNr) Quit $S($LL(lbPRNr)>1:"(MP)"_$$ListToDelimited^vhLib(lbPRNr,"\"), 1:$LG(lbPRNr,1)) PRGetProductViaKenmerkLijst(KenmGrp,Kenm,KLNr) #define CompTypeDFL "E" #define KenmCombine "$COMB$" s %blnDEBUG=$G(%blnDEBUG,0) New ArPR,ArKenmAll,ArKenm,i,CompType,lbKenmItem,PRNr,lbPRNr,Step,iKenm,tmpCopyArPR,Val // Opbouwen van de Kenmerk-arrays For i=2:1:$LL(Kenm) Do ; Beginnen bij tweede list-item, want eerste Kenm wordt gebruikt als startwaarde bij het opbouwen van SPAlle() array . Set lbKenmItem=$LI(Kenm,i) . Quit:($LG(lbKenmItem,1)="") . If $LI(lbKenmItem,1)=$$$KenmCombine Do . . Set CompType="-" . . Set Step="Step3" . Else If ($LG(lbKenmItem,3)="")||($LG(lbKenmItem,3)=$$$CompTypeDFL) Do . . Set CompType=$$$CompTypeDFL . . Set Step="Step1" . Else Do . . Set CompType=$LG(lbKenmItem,3) . . Set Step="Step2" . Set ArKenmAll(Step,CompType,$LI(lbKenmItem,1))=$LI(lbKenmItem,2) Set ArKenmAll("Step4a","E","Actief")=$G(KLNr) ; Beperken op het kenmerk "Actief" (is niet altijd nodig) Set ArKenmAll("Step4b","E","Actief")="A" d:(%blnDEBUG) WL^vhDBG($$$CRLF_"KenmGrp:"_KenmGrp_$C(13,10)_"ArKenmAll:"_$$ArrayToText^vhLib("ArKenmAll")) // Lijst beperken via Exacte match (eerste kenmerk gebruiken als startwaarde): Merge ArKenm=ArKenmAll("Step1","E") Do gpnPRLijstViaKenmerk(KenmGrp,"ArPR",.ArKenm,0 ,$LG($LG(Kenm,1),1),$LG($LG(Kenm,1),2)) Kill ArKenm // Lijst verder beperken via multiple: Merge ArKenm=ArKenmAll("Step2") Merge ArKenm=ArKenmAll("Step3") Do:($D(ArKenm)) gpnPRLijstViaKenmerkMulti(KenmGrp,"ArPR",.ArKenm) Kill ArKenm // Als meer dan één product overgehouden, dan verder beperken via het kenmerk "Actief" --> het juiste product zoeken If $L($O(ArPR($O(ArPR(""))))) Do . d:(%blnDEBUG) WL^vhDBG("VOOR:"_$$ArrayToText^vhLib("ArPR")) . Merge tmpCopyArPR=ArPR . // Eerst beperken via "Actief Klant" . Merge ArKenm=ArKenmAll("Step4a","E") . Do gpnPRLijstViaKenmerk(KenmGrp,"ArPR",.ArKenm,0) . Kill ArKenm . d:(%blnDEBUG) WL^vhDBG("NA klant:"_$$ArrayToText^vhLib("ArPR")) . // Indien geen product over na beperking via "Actief Klant", dan beperk via "Actief Alle" . If $O(ArPR(""))="" Do . . Merge ArPR=tmpCopyArPR ; Reset ArPR array from tmpCopy . . Merge ArKenm=ArKenmAll("Step4b","E") . . Do gpnPRLijstViaKenmerk(KenmGrp,"ArPR",.ArKenm,0) . . Kill ArKenm . . d:(%blnDEBUG) WL^vhDBG("NA ALLE:"_$$ArrayToText^vhLib("ArPR")) // Convert Array-index to LB Set (PRNr,lbPRNr)="" For Set PRNr=$O(ArPR(PRNr)) Quit:(PRNr="") Set lbPRNr=lbPRNr_$LB(PRNr) // Controle kenmerkwaarde "Actief" If $LL(lbPRNr)=1 Do . Set PRNr=$LI(lbPRNr,1) . Set Val=##class(Prod.Kenmerk.DataDefinitie).Get(KenmGrp,PRNr,"Actief") . If ($LF(Val,"A")=0)&&($LF(Val,KLNr)=0) Set lbPRNr="" ; Product is not valid for this KLNr --> clear lbPRNr ! Quit lbPRNr gpnPRLijstViaKenmerk(GroepID,Ref,KenmerkArray,IncludeUndefs,StartKenm,StartWaarde) New Kenm,i,objKenm ; Array opbouwen van alle producten, eventueel met startwaarde Do:('$D(@Ref)) ##class(Prod.Kenmerk.DataIndex).SPAlle(GroepID,Ref,$G(StartKenm),$G(StartWaarde)) ; Array beperken voor ieder kenmerk van KenmerkArray Set Kenm="" For Set Kenm=$O(KenmerkArray(Kenm)) Quit:(Kenm="") Do . Set objKenm=##class(Prod.Kenmerk.MetaDefinitie).%OpenId(GroepID_"||"_Kenm) . ; - Beperking op waarde van de subnodes . Set i="" . For Set i=$O(KenmerkArray(Kenm,i)) Quit:(i="") Do gpnBeperk(KenmerkArray(Kenm,i)) . ; - Beperking op waarde van node (Kenm) . If ($$$aHasData(KenmerkArray(Kenm))) Do gpnBeperk(KenmerkArray(Kenm)) . Do:(objKenm) objKenm.%Close() Quit gpnBeperk(KWaarde) Do ##class(Prod.Kenmerk.DataIndex).SPBeperkExcl(GroepID,Kenm,KWaarde,Ref) Quit gpnPRLijstViaKenmerkMulti(GroepID,Ref,KenmerkArray) ; Loop through different types of MultiSelect/Beperk Quit:('$D(@Ref)) New Kenm,i,objKenm,CompType,tmpAr ; CompareType special (GN, KN, BN, L), All Kenm except $COMB$ Set (CompType,Kenm)="" For Set CompType=$O(KenmerkArray(CompType)) Quit:(CompType="") Do . For Set Kenm=$O(KenmerkArray(CompType,Kenm)) Quit:(Kenm="") Do:(Kenm'=$$$KenmCombine) . . Set objKenm=##class(Prod.Kenmerk.MetaDefinitie).%OpenId(GroepID_"||"_Kenm) . . Do:($L($G(KenmerkArray(CompType,Kenm)))) gpnBeperkMulti(Kenm,KenmerkArray(CompType,Kenm),CompType) . . Set objKenm="" ; Kenm=$COMB$ Set Kenm=$$$KenmCombine For Set CompType=$O(KenmerkArray(CompType)) Quit:(CompType="") Do . Do:($L($G(KenmerkArray(CompType,Kenm)))) gpnBeperkMulti(Kenm,KenmerkArray(CompType,Kenm),CompType) Quit gpnBeperkMulti(Kenmerk, WaardeInput, CompType) Do ##class(Prod.Kenmerk.DataIndex).SPBeperkMulti(.GroepID,.Kenmerk,WaardeInput,.Ref,.CompType) Quit ;Oproepen via: Do ##class(Prod.Kenmerk.DataIndex).SPBeperkMulti(Groep,Kenmerk,WaardeInput,Ref,CompareType) xxSPBeperkMulti(Groep,Kenmerk,WaardeInput,Ref,CompareType) xSPBeperkMulti Quit:($G(Kenmerk)="") If $G(WaardeInput)="" Kill @Ref Quit New PRNr,KenmID,indexID,lbWaarden,i,blnCrit,LowestVal Set KenmID="||"_Groep_"||"_Kenmerk If Kenmerk=$$$KenmCombine Do . // Beperk via KenmCombine . New FCombi,j,iKM,lbKenm,arWdn,arFC,arFCX,lbCVal,Kenm,eval,tmpAr,m,k . Set FCombi=WaardeInput . Set lbKenm=$$bpmCombiGetKenm . // Transform FCombi to an Execute-string: replace each {kenm} by $LI(lbCVal,j) which will evaluate to the value of the Kenm in the calculation of $$$COMB$$$ . For j=1:1:$LL(lbKenm) Do . . Set KenmID(j)="||"_Groep_"||"_$LG(lbKenm,j) . . Set FCombi=$$$Replace(FCombi,"{"_$LG(lbKenm,j)_"}","($LI(lbCVal,"_j_"))") . Set FCombi="Set eval="_FCombi ; transform FCombi to an eval-expression . . // Loop through array @Ref@(PRNr) to calculate the FCombi-expression for each PR . Kill arFCX . Set PRNr="" . For Set PRNr=$O(@Ref@(PRNr)) Quit:(PRNr="") Do . . Do bpmCalcCombiValues . Set LowestVal=$O(arFCX("")) . Quit:(LowestVal="") . Set PRNr="" . For Set PRNr=$O(@Ref@(PRNr)) Quit:(PRNr="") Kill:('$D(arFCX(LowestVal,PRNr))) @Ref@(PRNr) Else Do . // Beperking via Kenmerk volgens CompareType . Set PRNr="" . For Set PRNr=$O(@Ref@(PRNr)) Quit:(PRNr="") Kill:('$$bpmMatchCriteria) @Ref@(PRNr) Quit bpmCombiGetKenm() Quit:($F(FCombi,"{")=0) "" New tmpLB,p,q,km Set tmpLB="" Set (p,q)=0 For Set p=$F(FCombi,"{",p) Quit:(p=0) Do . Set q=q+1 . Set km=$P($P(FCombi,"{",q+1),"}") . Set:($L($$$Trim(km))&&('$LF(tmpLB,km))) tmpLB=tmpLB_$LB(km) Quit tmpLB bpmCalcCombiValues ; apply FCombi-function to all values from lbWaarden Kill arWdn,arFC Set arFC(1)="" For j=1:1:$LL(lbKenm) Do . Set arWdn(j)=$$bpmGetKemnWaarden(PRNr,Groep,$P(KenmID(j),"||",3)) ;w "km:"_j_" "_$LG(lbKenm,j)_" --> Wdn="_$$$LCVT(arWdn(j)),! . Kill tmpAr . Merge:($LL(arWdn(j))>1) tmpAr=arFC . ; In de eerste reeks uitbreiden met j-de kenmerk waarden . Set k="" . For Set k=$O(arFC(k)) Quit:(k="") Set $LI(arFC(k),j)=$LG(arWdn(j),1) . If $LL(arWdn(j))>1 Do . . For m=2:1:$LL(arWdn(j)) Do . . . Set k="" . . . For Set k=$O(tmpAr(k)) Quit:(k="") Set arFC($O(arFC(""),-1)+1)=tmpAr(k)_$LB($LG(arWdn(j),m)) ; Set $LI(arFC(k),j)=$LG(arWdn(j),m) ; arFC(j) : elke node bevat een $LB(Kenm1_Waarde, Kenm2_Waarde, ...) Quit:(arFC(1)="") ; Geen kenmerk/waarden aanwezig! Set j="" For Set j=$O(arFC(j)) Quit:(j="") Do . Set lbCVal=$G(arFC(j)) . Set eval="" . Xecute FCombi . Set:($L(eval)) arFCX(eval,PRNr)="" . ;Set:($L(eval)) arFCX(eval,PRNr,"TST")=arFC(j) Quit bpmGetKemnWaarden(UnID,Groep,Kenm) ;Quit $$bpmGetKemnWaardenOLD(UnID_"||"_Groep_"||"_Kenm) Quit:(UnID_Kenm="") "" Quit ##class(Prod.Kenmerk.DataDefinitie).Get(Groep,UnID,Kenm) bpmGetKemnWaardenOLD(iID) Quit:(iID="") "" New lbWaarden ; &SQL(SELECT Waarden INTO :lbWaarden FROM Prod_Kenmerk.DataDefinitie WHERE ID = :iID) Quit $G(lbWaarden) bpmMatchCriteria() Set lbWaarden=$$bpmGetKemnWaarden(PRNr,$P(KenmID,"||",2),$P(KenmID,"||",3)) ; --> iID = 10560||TB||DraagKracht Quit:(lbWaarden="") $G(%OrgaluxIncludeUndefs,0) ; Modified by WimV on 06/09/2010 Set blnCrit=0 Do @("bpmMatchCriteria"_CompareType) Quit blnCrit Quit ; 0 / 1 bpmMatchCriteriaGN ; Groter dan (of gelijk aan) --> Numeriek If $LF(lbWaarden,WaardeInput)>0 Set blnCrit=1 Quit For i=1:1:$LL(lbWaarden) Set:($LG(lbWaarden,i)>WaardeInput) blnCrit=1 Quit bpmMatchCriteriaKN ; Kleiner dan (of gelijk aan) --> Numeriek If $LF(lbWaarden,WaardeInput)>0 Set blnCrit=1 Quit For i=1:1:$LL(lbWaarden) Set:($LG(lbWaarden,i) Numeriek New Min,Max Set Min=$LG(lbWaarden,1) Set Max=$LG(lbWaarden,2) Quit:(Min="")||(Max="") If Min>Max Do . Set Min=$LG(lbWaarden,2) . Set Max=$LG(lbWaarden,1) Set blnCrit=(WaardeInput'Max) Quit bpmMatchCriteriaL ; Lijst bevat waarde For i=1:1:$LL(lbWaarden) Set:($F(WaardeInput,$LG(lbWaarden,i))>0) blnCrit=1 Quit bpmMatchCriteriaE ; Exacte match For i=1:1:$LL(lbWaarden) Set:($LG(lbWaarden,i)=WaardeInput) blnCrit=1 Quit // !!! Test routine to call directly from Terminal !!! // this is not used by the normal flow of the algoritme! bpmCalcCombiValuesX(FCombi,PRNr) ; d bpmCalcCombiValuesX^Prod.GAMeta.Item.tmpDev(fc,PRNr) Do bpmCalcCombiValues Quit // !!! Test routine to call directly from Terminal !!! // this is not used by the normal flow of the algoritme! bpmCombineGetKenmX(FCombi) ; s lb=$$bpmCombineGetKenmX^Prod.GAMeta.Item.tmpDev(fc) w $$LCVT^vhLib(lb) Set lbKenm=$$bpmCombiGetKenm For j=1:1:$LL(lbKenm) Do . Set KenmID(j)="||"_Groep_"||"_$LG(lbKenm,j) . Set FCombi=$$$Replace(FCombi,"{"_$LG(lbKenm,j)_"}","($LI(lbCVal,"_j_"))") Set FCombi="Set eval="_FCombi Quit lbKenm /* // Copy these lines into the Caché Terminal to test the "GetProductViaKenm()" method. s ClientIP="192.168.1.97" s KenmGrp="TB" Set Self="" Set tmpKLNr="" Set Kenm=$LB($LB("BasisType","LA"),$LB("tB",1),$LB("LiRe","LI"),$LB("Design","S"),$LB("Verpakking","I"),$LB("LadeDiepte",500),$LB("Kleur","MG"),$LB("DraagKracht",50),$LB("ZijwandHoogte","M")) For i=1:1:$LL(Kenm) Set arKM($LI($LI(Kenm,i),1))=$LI($LI(Kenm,i),2) zw arKM m arKM2=arKM s (Kenm,KM)="" f s KM=$O(arKM(KM)) q:KM="" s Kenm=Kenm_$LB($LB(KM,arKM(KM))) w $$LCVT^vhLib(Kenm) Set MItem=##class(Prod.GAMeta.ItemPR).%New() s PRNrs=MItem.GetProductViaKenm(KenmGrp,Kenm) w PRNrs s PRNr=$RE($P($RE($P(PRNrs,"\",1)),")PM(",1)) s pl=$P(PRNrs,"(MP)",2) w:($L(PRNr)) $$ArrayToText^vhLib($Na(^Prod.Ken.DataDefinitieD(PRNr))) s pKenm="TB||Kleur" s $LI(Kenm,4,4)="" s $LI(Kenm,3,3)="" s PRNrs=MItem.GetProductViaKenm(KenmGrp,Kenm) w PRNrs s PRNr=$RE($P($RE($P(PRNrs,"\",1)),")PM(",1)) s pl=$P(PRNrs,"(MP)",2) f i=1:1:$L(pl,"\") w:($L($G(pKenm))) $$ArrayToText^vhLib($Na(^Prod.Ken.DataDefinitieD($P(pl,"\",i),pKenm))),! r fc2 ($CASE({Kleur}, "MG":1, "WI":2,"IN":3, :5)*10000)+{DraagKracht} s CombCrit=$LB("$COMB$", fc2) s Kenm=Kenm_$LB(CombCrit) s PRNrs=MItem.GetProductViaKenm(KenmGrp,Kenm) w PRNrs s PRNr=$RE($P($RE($P(PRNrs,"\",1)),")PM(",1)) s pl=$P(PRNrs,"(MP)",2) s $LI(Kenm,7,7)=$LB($LI(Kenm,7),$LB("DraagKracht",28,"GN")) */ /* // Copy these lines into the Caché Terminal to test the "xxSPBeperkMulti()" method with $$$KenmCombine. s Groep="TB" r fc2 ($CASE({Kleur}, "MG":1, "WI":2,"Ix":3, :4)*10000)+{LadeDiepte} s fc=fc2 s lb=$$bpmCombineGetKenmX^Prod.GAMeta.Item.tmpDev(.fc) w $$LCVT^vhLib(lb) k arFCX d bpmCalcCombiValuesX^Prod.GAMeta.Item.tmpDev(fc,30786) zw arFCX */