2

나는Intersystems 캐시 : <Framestack> 및 <Command> 클래스의 오류 : 해결 방법 및 피하기?

  1. string
  2. 에에게 globals과 장소 결과에
  3. 반복 해 전화 사용자에 따라 globals에 기록을 기록 상기 결과를 기록하는 Intersystems에서 캐시 단일 class이 메모장 파일로 : FILE

그러나 코드의 일부는 항상 ret입니다. urns <FRAMESTACK> 오류. , Xecute, 새로운, 또는 사용자 작성 기능을
루틴이 수행 할 너무 많은 중첩 된 전화를 가지고 들어 :

는 문서를 검색하면 알 수있다. 내가하는 방법에 ##class() 통해 다른 메소드를 호출하려고 할 때 오류 <COMMAND> 만났다이기 때문에

내가 SOLID 위반하는 하나의 클래스를 사용하는 이유 당신이 궁금해하는 경우, 그것은이다. 그래서 나는 필요한 메소드 내에서 코드를 가져 와서 단일 메소드로 혼합했다.

CLASS 내에서 클래스 METHOD를 제대로 호출 할 수있는 방법이 있습니까?

FrameStack 오류에 대해 정확히 얼마나 많은 수가 너무 많습니까? 어떻게 이것을 피할 수 있습니까?

편집 다음 전역이 이루어지는 부분 후, 여기에

ClassMethod GetRRCDelToNP(DateFrom As %String, TimeFrom As %String, DateTo As %String, TimeTo As %String, Startparam As %String, Type As %String, Operator As %String, User As %String) As %String [ SqlProc ] 
      { 
      k ^IDXCMAWEB("ROADRECEIVAL",User) 
      S RRCTR=0 
      n conwt 
      Q:$G(DateFrom)="" "E:Please enter date time entry." 
      Q:$G(TimeFrom)="" "E:Please enter date time entry." 
      Q:$G(DateTo)="" "E:Please enter date time entry." 
      Q:$G(TimeTo)="" "E:Please enter date entry." 
      Q:$G(Type)="" "E:Please enter type entry." 
      Q:$G(Operator)="" "E:Please enter operator entry." 
      Q:$G(User)="" "E:Cannot process query. I dont know who you are." 
      s (I,J,K,CN,CN1)="" 
      s I=$ZDH(DateFrom,9) 
      s J=$ZTH(TimeFrom) 
      s TDT3=$ZDH(DateTo,9) 
      s TTM3=$ZTH(TimeTo) 
      Q:(TDT3<I) "E:Date time to cannot be greater than date time from." 
      Q:(TDT3=I)&(TTM3<J) "E:Date time to cannot be greater than date time from." 
      s MTY=$s(Type="optall":"",Type="optrec":"R",Type="optdel":"D") 
      s OPR=$s(Operator="A":"",Operator="a":"",1:Operator) 
      i OPR'="" 
S 
OPR=$tr(OPR,"abcdefghijklmnopqrstuvwxyz,","ABCDEFGHIJKLMNOPQRSTUVWXYZ|")_"|" 

s %id=User 
i K="" S CN="" 

loopi2 ;loopi 
if J="" s I=$O(^IDXLGE(I)) Q:(I="")!(+I>TDT3) 

loopj2 ;loopj 
if K="" s J=$O(^IDXLGE(I,J)) g loopi2:J="" 
if (I'="")&((I=TDT3)&(J>TTM3)) s J="",K="",CN="" g loopi2 

loopk2 ;loopk 
if CN="" S K=$O(^IDXLGE(I,J,K)) g loopj2:K="" 
if "RD"'[K g loopk2 
I $G(MTY)'="",MTY'[K g loopk2 
if (I="")!(+I>TDT3) quit ;$G(I)_"/"_$G(J)_"/"_$G(K)_"/"_"0"_"/"_$G(^WK($J)) 
loopcn2 ;loopcn 
S CN=$O(^IDXLGE(I,J,K,CN)) g loopk2:CN="" 
S D=$G(^IDXLGE(I,J,K,CN)) 
S HIS=$P(D,"|"),MOV=$P(D,"|",2),GEN=$P(D,"|",3) 
g loopcn2:HIS=""!(MOV="")!(GEN="") 
S N=$G(^CNREC(CN,HIS,"MOVE",MOV)) 
S NB=$G(^CNREC(CN,HIS,"MOVEB",MOV)) 
I $P(N,"|",3)="CANCL" g loopcn2 
S Z=$G(^CNREC(CN,HIS,"GEN",GEN)) 
I $P($G(^CNREC(CN,HIS,"GENB",GEN)),"|",3)["CSW" g loopcn2 
g loopcn2:$P(Z,"|",9)="" 
I OPR'="",OPR'[($P(Z,"|",9)_"|") g loopcn2 
I "56"[$E($P(Z,"|",2)) g loopcn2 

S Q=$P(Z,"|"),VSC=$P(Z,"|",3) 
s VOY=$P(Z,"|",4) 
I $L($$^CMAUTH(%id,CN,VSC,VOY,$P(Z,"|",9))) s Error="" g loopcn2 
S YEAR="" 
I VSC'="" D 
    .S VCN=$P($G(^CDTAB("SEQN",VSC,VOY)),"|") 
    .g loopcn2:VCN="" 
    .S VN1=$G(^CDTAB("VOY",VSC,VCN,"1")) 
    .S VN2=$G(^CDTAB("VOY",VSC,VCN,"2")) 
    .S V=$S(Q="E":$P(VN1,"|"),Q="I":$P(VN1,"|",2),1:"UNK") 
    .S YEAR=$p($zd($P($P(^CDTAB("VOY",VSC,VCN,1),"|",5),",",1)),"/",3) 
    .S R=$P(VN2,"|",9) 
    E S (VSC,V,R)="" 
    g loopcn2:$E(R,1,3)="ATI"!($E(R,1,3)="BOC") 
    S DATE=$zd(I,9) 
    S ARR=$G(DATE)_" "_$zt(J,4) 
    S Q=$S(Q="E":"Export",Q="I":"Import",Q="S":"Recirculation",1:"Unknown") 
    S M=$P(Z,"|",17) 
    s conwt=$p(Z,"|",18) 
    i conwt'="" s conwt=conwt_" Tons" 
    s othersealno=$P(Z,"|",15) 
    s bookingseal=$P(Z,"|",5) 
    s seal=$P(Z,"|",16) 
    s plate=$P(N,"|",11) 
    s trucker="" 
    i plate'="" D 
    .S truckercode=$P($G(^CDTAB("PLATE",plate)),"|",1) 
    .i truckercode'="" S 
trucker=$TR($P($G(^CDTAB("CART",truckercode)),"|",1),"/","") 
S shipper="" 
I YEAR'="" D 
.S ivn=$G(^IXVH("R",YEAR,R)) 
.I ivn="" S ivn=$G(^IXVH("R",YEAR-1,R)) 
.I ivn'="" D 
..S BLN=$O(^IXIFM(ivn,CN,"")) 
..I BLN'="" S shipper=$TR($P(^BSIFM(ivn,BLN),"|",3),"/","") 
s dmg=$P(NB,"|",3) 
S CN1=CN1+1 
S M=$S(M="F":"Full Container Load",M="L":"Less Container Load",M="E":"Empty",M="T":"Transhipment",1:"unknown") 
S K1=CN_"|"_$E($P(N,"|",22),2)_"|"_Q_"|"_M_"|"_$P(Z,"|",2) 
S K1=K1_"|"_$P(Z,"|",10)_"|"_$P(Z,"|",9)_"|"_VSC_"|"_V_"|"_R_"|"_ARR 
S K1=K1_"|"_conwt_"|"_$P(Z,"|",2)_"|"_HIS_"|"_GEN_"|"_CN1_"|"_othersealno_"|"_bookingseal_"|"_dmg_"|"_seal_"|"_plate_"|"_trucker_"|"_shipper 
i $P(K1,"|",2)'="" s $P(K1,"|",2)=$s($P(K1,"|",2)="R":"Received",$P(K1,"|",2)="D":"Delivered",1:$P(K1,"|",2)) 
S sz=$P(K1,"|",5) 
i sz'="" s sz=$e(sz,1,1) 
s $P(K1,"|",5)=$s(sz="0":"20'",sz="2":"20'",sz="4":"40'",sz="9":"45'",sz="L":"45'",sz="1":"10'") 
i $P(K1,"|",6)'="" s $P(K1,"|",6)=$p(^CDTAB("COMM",$P(K1,"|",6)),"|") 
i $P(K1,"|",7)'="" s $P(K1,"|",7)=$tr($p(^CDTAB("OPER",$P(K1,"|",7)),"|"),"/","") 
i $P(K1,"|",8)'="" s $P(K1,"|",8)=$tr($p(^CDTAB("VESS",$P(K1,"|",8)),"|"),"/","") 

S ^IDXCMAWEB("ROADRECEIVAL",User,RRCTR)=K1 
S RRCTR=RRCTR+1 ;now holds the total number of GLOBALS 
s recctr=CN1 
set getrows="" 

s NewI=I 
g loopcn2 ;THIS POINT WORKS AND CREATES THE GLOBALS 




;####201694:2017-05-18 = GET THE DATA FROM THE GLOBALS JUST MADE ABOVE WITH THE loopcn2 
S totrec="" 
S totrec=RRCTR-1 ;-1 so that the loop clearly shows all records 

;totrec will now contain the total number of records. iterate on totrec 
S ctr=0 ;will contain the current record count 
S rsult="" ;will contain the total string result, to be written on the notepad 



Do 
{ 
S data="" 
I $D(^IDXCMAWEB("ROADRECEIVAL",User,ctr)) D 
.S data=$G(^IDXCMAWEB("ROADRECEIVAL",User,ctr)) 
E D 
.S data="" 

S rsult=rsult_"|"_ctr_$P(data,"|",1) ;modify further. this will be the returned string 

S ctr=ctr+1 
} WHILE ctr<=totrec 
;Q rsult ;return the results... 

;now, we write the results in a notepad file. 
;writes the text file. OLD: S FILE="\\SOMELOC\PubShare\theFileToJSON.TXT" 
S FILE="\\SOMELOC\PubShare\theFileToJSON.TXT" 
O FILE:"WNS" U FILE 
S WriteToFile=rsult 
W rsult ;...we actually write the file? 
C FILE 

Q FILE ;display the file? 

}

을 요청한 코드, 나는 말했다 전역의 일부를 얻을 수있는 총 레코드 수 RRCTR에 반복 단일 문자열로.

지구본이 성공적으로 작성되었지만 파일이 작성되지 않았습니다. 왜 이런거야? 실행하면 <COMMAND>은 오류로 표시됩니다.

답변

4

<FRAMESTACK> 일반적으로 코드를 재귀 적으로 호출 할 때 발생합니다. 이것은 좋은 프로그래밍 실습이 아니며 특히 스택 오버 플로우 오류가 발생하는 경우 더 큰 스택을 구성 할 수 있지만 재귀를 사용하지 않도록 코드를 다시 작성하는 것이 좋습니다.

<COMMAND> "do with a dot"문법으로 끝에서 do..while 루프에 "curly brackets"을 혼합했기 때문에 오류가 발생했습니다. 이 사방 중괄호를 사용하는 코드의 일부를 재 작성, 지원되지 않습니다

Do 
{ 
S data="" 
I $D(^IDXCMAWEB("ROADRECEIVAL",User,ctr)) { 
    S data=$G(^IDXCMAWEB("ROADRECEIVAL",User,ctr)) 
} else { 
    S data="" 
} 

S rsult=rsult_"|"_ctr_$P(data,"|",1) ;modify further. this will be the returned string 

S ctr=ctr+1 
} WHILE ctr<=totrec 
+0

이 문제를 조사해 주셔서 감사합니다. 기본적으로 저는 GLOBALS로부터 데이터를 얻는 거대한 클래스를 받았습니다. 이 클래스는 매우 길며 재귀가 많이 있습니다 (while 루프 대신 GOTO를 사용할 때입니까?). '## class()'를 통해이 클래스를 호출하려고 시도했지만 ''오류가 발생했습니다. * 클래스 내에서 클래스를 올바르게 호출하는 방법 * –

+0

선생님, 요청에 따라 코드를 추가했습니다. 그것은 그것의 거대한 큰 덩어리 다. 그리고 관련 부분 만 게시했습니다. –

+0

부품을 다시 추가했습니다. 오류. – SSH

2

가 가지는 클래스를 호출 시도 (클래스) 대신에 "## 클래스를 작성의"## 클래스 (클래스) .method 할 " "캐시 코드, 유행성 이하선염 코드 및 (IMHO) 옛 유산이 잘못 쓰여진 것도 아닙니다. 개인적으로 다시 써야합니다 (또는 컨설턴트에게 지불해야합니다)

1

나는 Paul에 동의합니다. 예를 들어, '인수없는 For'대신 'Go'명령을 사용하여 반복을 수행하면 프로그래밍 실습이 극히 열악합니다. Go ("g") 명령없이 전체 내용을 다시 작성해야합니다.