GMPLCOPY ;ISP/TC - Copy Problem Selection Lists/Categories ;09/21/16 09:03
;;2.0;Problem List;**49**;Aug 25, 1994;Build 43
;
;=====================================================
SETCLDLM(GMPFLNM,GMPIEN,GMPCLASS) ;Set the class field to GMPCLASS and update Date Last Modified
N GMPIENS,GMPFDA,GMPMSG,GMPFLD
S GMPIENS=GMPIEN_","
S GMPFLD=$S(GMPFLNM="125":".04",GMPFLNM="125.11":".03")
S GMPFDA(GMPFLNM,GMPIENS,GMPFLD)=GMPCLASS
S GMPFDA(GMPFLNM,GMPIENS,.02)=$$DT^XLFDT
D FILE^DIE("K","GMPFDA","GMPMSG")
I $D(GMPMSG) D AWRITE("GMPMSG")
Q
;
;=====================================================
COPY(GMPPRMPT,GMPROOT,GMPWHAT,GMPVAL) ;Copy an entry of GMPROOT into a new entry.
N DIROUT,DTOUT,DUOUT
F D GETORIG Q:$D(DIROUT) Q:$D(DTOUT)
Q
;
;=====================================================
COPYCAT(GMPVAL) ;Copy a selection list category.
N GMPPRMPT,GMPROOT,GMPWHAT
S GMPWHAT="category"
S GMPROOT="^GMPL(125.11,"
S GMPPRMPT="Select the category to copy: "
D COPY(GMPPRMPT,GMPROOT,GMPWHAT,.GMPVAL)
Q
;
;=====================================================
COPYLIST ;Copy a selection list.
N GMPPRMPT,GMPROOT,GMPWHAT
S GMPWHAT="selection list"
S GMPROOT="^GMPL(125,"
S GMPPRMPT="Select the list to copy: "
D COPY(GMPPRMPT,GMPROOT,GMPWHAT)
Q
;
;=====================================================
DELETE(DIK,DA) ;Delete the entry just added.
D ^DIK
W !!,"New entry not created due to invalid name!",!
Q
;
;=====================================================
GETFOIEN(GMPROOT) ;Return the first open IEN in GMPROOT. This should be called
;after a call to SETSTART.
N GMPENTRY,GMPNIEN,GMPOIEN
S GMPENTRY=GMPROOT_0_")"
S GMPOIEN=+$P(@GMPENTRY,U,3)
S GMPENTRY=GMPROOT_GMPOIEN_")"
F S GMPNIEN=$O(@GMPENTRY) Q:+(GMPNIEN-GMPOIEN)>1 Q:+GMPNIEN'>0 S GMPOIEN=GMPNIEN,GMPENTRY=GMPROOT_GMPNIEN_")"
Q GMPOIEN+1
;
;=====================================================
GETORIG ;Look-up logic to get and copy source entry to destination.
N DIC,GMPIENN,GMPIENO,Y
S DIC=GMPROOT,DIC(0)="AEMQ",DIC("A")=GMPPRMPT
W !
D ^DIC
I $D(DUOUT)!$D(DTOUT) S DIROUT="" Q
S GMPIENO=$P(Y,U,1)
I GMPIENO=-1 S DIROUT="" Q
D GETORIGC(GMPIENO,.GMPIENN,GMPROOT,GMPWHAT,.GMPVAL)
Q
;
GETORIGC(GMPIENO,GMPIENN,GMPROOT,GMPWHAT,GMPVAL) ;
N DA,DIC,DIE,DIK,DIR,DIRUT,GMPFDA,GMPFLDLN,GMPFILE
N GMPIENS,GMPMSG,GMPNAME,GMPORGNM,X,Y,GMPL0
S DIC=GMPROOT
;Set the starting place for additions.
D SETSTART(DIC)
S GMPIENN=$$GETFOIEN(GMPROOT)
D MERGE(GMPIENN,GMPIENO,GMPROOT)
;
;Get the new name.
S GMPORGNM=$P(@(GMPROOT_GMPIENO_",0)"),U,1)
S GMPFILE=+$P(@(GMPROOT_"0)"),U,2)
S GMPFLDLN=$$GET1^DID(GMPFILE,.01,"","FIELD LENGTH")
S DIR(0)="F"_U_"3:"_GMPFLDLN_U_"K:(X?.N)!'(X'?1P.E) X"
S DIR("A")="PLEASE ENTER A UNIQUE NAME"
GETNAM D ^DIR
I $D(DIRUT) D DELETE(GMPROOT,GMPIENN) Q
S GMPNAME=Y
;
;Make sure the new name is valid.
I '$$VNAME^GMPLINTR(GMPNAME) G GETNAM
;
;Change to the new name.
S GMPIENS=GMPIENN_","
S GMPFDA(GMPFILE,GMPIENS,.01)=GMPNAME
K GMPMSG
D FILE^DIE("","GMPFDA","GMPMSG")
;Check to make sure the name was not a duplicate.
I $G(GMPMSG("DIERR",1))=740 D G GETNAM
. W !,GMPNAME," is not a unique name!"
;Change the class to local and update Date Last Modified.
D SETCLDLM(GMPFILE,GMPIENN,"L")
;
;Reindex the cross-references.
S DIK=GMPROOT,DA=GMPIENN
D IX^DIK
;
S GMPL0=$G(@(GMPROOT_GMPIENN_",0)"))
S GMPVAL=GMPIENN_U_GMPL0
W !!,"The original "_GMPWHAT_" "_GMPORGNM_" has been copied into "_GMPNAME_"." H 1
Q
;
;=====================================================
MERGE(GMPIENN,GMPIENO,GMPROOT) ;Use MERGE to copy GMPROOT(GMPIENO into GMPROOT(GMPIENN.
N GMPDEST,GMPSRCE
S GMPDEST=GMPROOT_GMPIENN_")"
;Lock the file before merging.
L +@GMPDEST:DILOCKTM
S GMPSRCE=GMPROOT_GMPIENO_")"
M @GMPDEST=@GMPSRCE
;Unlock the file
L -@GMPDEST
Q
;
;=====================================================
SETSTART(GMPROOT) ;Set the starting value to add new entries. Start
;at the begining so empty spaces are filled in.
N GMPCUR,GMPENTRY
S GMPENTRY=GMPROOT_"0)"
S $P(@GMPENTRY,U,3)=1
Q
;
;=================================
AWRITE(GMPREF) ;Write all the descendants of the array reference, including the
;array. REF is the starting array reference, for example A or
;^TMP("PXRM",$J).
N GMPDONE,GMPIND,GMPLEN,GMPLN,GMPPRT,GMPROOT,GMPSTRT,GMPTMP,GMPTXT
I GMPREF="" Q
S GMPLN=0
S GMPPRT=$P(GMPREF,")",1)
;Build the root so we can tell when we are done.
S GMPTMP=$NA(@GMPREF)
S GMPROOT=$P(GMPTMP,")",1)
S GMPREF=$Q(@GMPREF)
I GMPREF'[GMPROOT Q
S GMPDONE=0
F Q:(GMPREF="")!(GMPDONE) D
. S GMPSTRT=$F(GMPREF,GMPROOT)
. S GMPLEN=$L(GMPREF)
. S GMPIND=$E(GMPREF,GMPSTRT,GMPLEN)
. S GMPLN=GMPLN+1,GMPTXT(GMPLN)=GMPPRT_GMPIND_"="_@GMPREF
. S GMPREF=$Q(@GMPREF)
. I GMPREF'[GMPROOT S GMPDONE=1
D MES^XPDUTL(.GMPTXT)
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HGMPLCOPY 4965 printed Oct 16, 2024@18:30:33 Page 2
GMPLCOPY ;ISP/TC - Copy Problem Selection Lists/Categories ;09/21/16 09:03
+1 ;;2.0;Problem List;**49**;Aug 25, 1994;Build 43
+2 ;
+3 ;=====================================================
SETCLDLM(GMPFLNM,GMPIEN,GMPCLASS) ;Set the class field to GMPCLASS and update Date Last Modified
+1 NEW GMPIENS,GMPFDA,GMPMSG,GMPFLD
+2 SET GMPIENS=GMPIEN_","
+3 SET GMPFLD=$SELECT(GMPFLNM="125":".04",GMPFLNM="125.11":".03")
+4 SET GMPFDA(GMPFLNM,GMPIENS,GMPFLD)=GMPCLASS
+5 SET GMPFDA(GMPFLNM,GMPIENS,.02)=$$DT^XLFDT
+6 DO FILE^DIE("K","GMPFDA","GMPMSG")
+7 IF $DATA(GMPMSG)
DO AWRITE("GMPMSG")
+8 QUIT
+9 ;
+10 ;=====================================================
COPY(GMPPRMPT,GMPROOT,GMPWHAT,GMPVAL) ;Copy an entry of GMPROOT into a new entry.
+1 NEW DIROUT,DTOUT,DUOUT
+2 FOR
DO GETORIG
if $DATA(DIROUT)
QUIT
if $DATA(DTOUT)
QUIT
+3 QUIT
+4 ;
+5 ;=====================================================
COPYCAT(GMPVAL) ;Copy a selection list category.
+1 NEW GMPPRMPT,GMPROOT,GMPWHAT
+2 SET GMPWHAT="category"
+3 SET GMPROOT="^GMPL(125.11,"
+4 SET GMPPRMPT="Select the category to copy: "
+5 DO COPY(GMPPRMPT,GMPROOT,GMPWHAT,.GMPVAL)
+6 QUIT
+7 ;
+8 ;=====================================================
COPYLIST ;Copy a selection list.
+1 NEW GMPPRMPT,GMPROOT,GMPWHAT
+2 SET GMPWHAT="selection list"
+3 SET GMPROOT="^GMPL(125,"
+4 SET GMPPRMPT="Select the list to copy: "
+5 DO COPY(GMPPRMPT,GMPROOT,GMPWHAT)
+6 QUIT
+7 ;
+8 ;=====================================================
DELETE(DIK,DA) ;Delete the entry just added.
+1 DO ^DIK
+2 WRITE !!,"New entry not created due to invalid name!",!
+3 QUIT
+4 ;
+5 ;=====================================================
GETFOIEN(GMPROOT) ;Return the first open IEN in GMPROOT. This should be called
+1 ;after a call to SETSTART.
+2 NEW GMPENTRY,GMPNIEN,GMPOIEN
+3 SET GMPENTRY=GMPROOT_0_")"
+4 SET GMPOIEN=+$PIECE(@GMPENTRY,U,3)
+5 SET GMPENTRY=GMPROOT_GMPOIEN_")"
+6 FOR
SET GMPNIEN=$ORDER(@GMPENTRY)
if +(GMPNIEN-GMPOIEN)>1
QUIT
if +GMPNIEN'>0
QUIT
SET GMPOIEN=GMPNIEN
SET GMPENTRY=GMPROOT_GMPNIEN_")"
+7 QUIT GMPOIEN+1
+8 ;
+9 ;=====================================================
GETORIG ;Look-up logic to get and copy source entry to destination.
+1 NEW DIC,GMPIENN,GMPIENO,Y
+2 SET DIC=GMPROOT
SET DIC(0)="AEMQ"
SET DIC("A")=GMPPRMPT
+3 WRITE !
+4 DO ^DIC
+5 IF $DATA(DUOUT)!$DATA(DTOUT)
SET DIROUT=""
QUIT
+6 SET GMPIENO=$PIECE(Y,U,1)
+7 IF GMPIENO=-1
SET DIROUT=""
QUIT
+8 DO GETORIGC(GMPIENO,.GMPIENN,GMPROOT,GMPWHAT,.GMPVAL)
+9 QUIT
+10 ;
GETORIGC(GMPIENO,GMPIENN,GMPROOT,GMPWHAT,GMPVAL) ;
+1 NEW DA,DIC,DIE,DIK,DIR,DIRUT,GMPFDA,GMPFLDLN,GMPFILE
+2 NEW GMPIENS,GMPMSG,GMPNAME,GMPORGNM,X,Y,GMPL0
+3 SET DIC=GMPROOT
+4 ;Set the starting place for additions.
+5 DO SETSTART(DIC)
+6 SET GMPIENN=$$GETFOIEN(GMPROOT)
+7 DO MERGE(GMPIENN,GMPIENO,GMPROOT)
+8 ;
+9 ;Get the new name.
+10 SET GMPORGNM=$PIECE(@(GMPROOT_GMPIENO_",0)"),U,1)
+11 SET GMPFILE=+$PIECE(@(GMPROOT_"0)"),U,2)
+12 SET GMPFLDLN=$$GET1^DID(GMPFILE,.01,"","FIELD LENGTH")
+13 SET DIR(0)="F"_U_"3:"_GMPFLDLN_U_"K:(X?.N)!'(X'?1P.E) X"
+14 SET DIR("A")="PLEASE ENTER A UNIQUE NAME"
GETNAM DO ^DIR
+1 IF $DATA(DIRUT)
DO DELETE(GMPROOT,GMPIENN)
QUIT
+2 SET GMPNAME=Y
+3 ;
+4 ;Make sure the new name is valid.
+5 IF '$$VNAME^GMPLINTR(GMPNAME)
GOTO GETNAM
+6 ;
+7 ;Change to the new name.
+8 SET GMPIENS=GMPIENN_","
+9 SET GMPFDA(GMPFILE,GMPIENS,.01)=GMPNAME
+10 KILL GMPMSG
+11 DO FILE^DIE("","GMPFDA","GMPMSG")
+12 ;Check to make sure the name was not a duplicate.
+13 IF $GET(GMPMSG("DIERR",1))=740
Begin DoDot:1
+14 WRITE !,GMPNAME," is not a unique name!"
End DoDot:1
GOTO GETNAM
+15 ;Change the class to local and update Date Last Modified.
+16 DO SETCLDLM(GMPFILE,GMPIENN,"L")
+17 ;
+18 ;Reindex the cross-references.
+19 SET DIK=GMPROOT
SET DA=GMPIENN
+20 DO IX^DIK
+21 ;
+22 SET GMPL0=$GET(@(GMPROOT_GMPIENN_",0)"))
+23 SET GMPVAL=GMPIENN_U_GMPL0
+24 WRITE !!,"The original "_GMPWHAT_" "_GMPORGNM_" has been copied into "_GMPNAME_"."
HANG 1
+25 QUIT
+26 ;
+27 ;=====================================================
MERGE(GMPIENN,GMPIENO,GMPROOT) ;Use MERGE to copy GMPROOT(GMPIENO into GMPROOT(GMPIENN.
+1 NEW GMPDEST,GMPSRCE
+2 SET GMPDEST=GMPROOT_GMPIENN_")"
+3 ;Lock the file before merging.
+4 LOCK +@GMPDEST:DILOCKTM
+5 SET GMPSRCE=GMPROOT_GMPIENO_")"
+6 MERGE @GMPDEST=@GMPSRCE
+7 ;Unlock the file
+8 LOCK -@GMPDEST
+9 QUIT
+10 ;
+11 ;=====================================================
SETSTART(GMPROOT) ;Set the starting value to add new entries. Start
+1 ;at the begining so empty spaces are filled in.
+2 NEW GMPCUR,GMPENTRY
+3 SET GMPENTRY=GMPROOT_"0)"
+4 SET $PIECE(@GMPENTRY,U,3)=1
+5 QUIT
+6 ;
+7 ;=================================
AWRITE(GMPREF) ;Write all the descendants of the array reference, including the
+1 ;array. REF is the starting array reference, for example A or
+2 ;^TMP("PXRM",$J).
+3 NEW GMPDONE,GMPIND,GMPLEN,GMPLN,GMPPRT,GMPROOT,GMPSTRT,GMPTMP,GMPTXT
+4 IF GMPREF=""
QUIT
+5 SET GMPLN=0
+6 SET GMPPRT=$PIECE(GMPREF,")",1)
+7 ;Build the root so we can tell when we are done.
+8 SET GMPTMP=$NAME(@GMPREF)
+9 SET GMPROOT=$PIECE(GMPTMP,")",1)
+10 SET GMPREF=$QUERY(@GMPREF)
+11 IF GMPREF'[GMPROOT
QUIT
+12 SET GMPDONE=0
+13 FOR
if (GMPREF="")!(GMPDONE)
QUIT
Begin DoDot:1
+14 SET GMPSTRT=$FIND(GMPREF,GMPROOT)
+15 SET GMPLEN=$LENGTH(GMPREF)
+16 SET GMPIND=$EXTRACT(GMPREF,GMPSTRT,GMPLEN)
+17 SET GMPLN=GMPLN+1
SET GMPTXT(GMPLN)=GMPPRT_GMPIND_"="_@GMPREF
+18 SET GMPREF=$QUERY(@GMPREF)
+19 IF GMPREF'[GMPROOT
SET GMPDONE=1
End DoDot:1
+20 DO MES^XPDUTL(.GMPTXT)
+21 QUIT
+22 ;