您好,欢迎访问三七文档
开发培训文档alertM基础(参考Cache面向对象软件开发教程.pdfP489)1.常用的特殊的变量这些特殊的变量有指定的含义,它们一般以$开头。有个别特殊变量也同时支持缩写1)$HOROLOG($H)$Horolog包含了时间和日期,它们由逗号分开。第一部分是日期的数字,它是从1840年12月31日开始计算日期的数字。第二部分是秒的数字,它是从午夜开始计算的。Global中的日期时间都是以数字的形式存储的。时间日期的函数$ZDate把$Horolog格式的日期值按照指定格式显示。$ZDateH$ZDate的反函数。$ZDateTime把$Horolog格式的日期时间值按照指定格式显示。$ZDateTimeH$ZDateTime的反函数。$ZTime把$Horolog格式的时间值按照指定格式显示。$ZTimeH$ZTime的反函数。2)$JOB($J)$JOB包含一个正整数,表示系统所分配给每一个在执行中的进程独一无二的编号。当进程还在的时候,$JOB的值是不变的2.基本的运算符1)算术运算符+、-、*、/、\、#,**。其中,+、-、*、/是基本的4个算术运算符。\整数的除法2+5*7=49,从左到右依次运算2+(a*b)=372)算术比较运算符、3)字符串比较运算符=、[、]=比较运算符是比较两个字符串的相同与否。如果需要比较两个数字是否一样的话,需要在前面再加一个+号。例如,+number1=+number2。[运算符检查右边的串是不是包含了左边的串]运算符检查左边的串是不是在字典顺序上跟着右边的串;它是严格按照ASCII码来操作的。例如:2]19,返回是1,因为2的ASCII值是50,而1的ASCII值是49。4)连接符_它是用来连接两个字符串的&与!或‘=非3.常见的命令变量操作命令:Set,Merge,Kill,New,Lock1)SET(S)给一个或者多个变量赋值,缩写SSetx=5,n(1)=4,dd=5Set^File=32)MERGE(M)拷贝变量树。Mergea=bMergevar(1)=^G(1,2)3)KILL删除所有变量或一些指定的变量或所有变量除了指定的变量。4)NEW初始化变量。Newa,bNew(x1,x2)初始化除了x1,x2之外的变量4.程序流控制命令If,Else,For,Quit,Do,Goto,BreakIf,(I)条件判断语句。ELSE(e)当判断条件不通过的时候,执行后面的命令行。FOR(f)循环命令QUIT(q)结束执行一个函数并返回一个值。DO(d)执行命令。GOTO(g)跳转命令。BREAK(b)在调试的时候中断一个routine的执行。WRITE(w)输出信息到当前设备上READ(r)从当前的设备读信息OPEN(o)开启一个设备以备使用。5.常用的函数$Piece($P)格式::$Piece(expression,delimiter[,from[,to]])返回一个或者多个被分隔符分开的子串。$Order($O)格式:$Order(variable[,direction])按照指定的方向返回一个变量的上一个或下一个索引$get($g)返回一个变量的值如果变量存在则返回变量本身,不存在则返回空$data($d)判断变量是否存在$Extract($e)格式:$Extract(expression,[,from[,to]])说明:返回字符串的指定部分。Write$Extract(AABB,2,3)AB$Justify($J)格式:$Justify(expression,width[,desimal])说明:返回一个右对齐的值,并可以改变它的格式。$Length($L)格式:$Length(expression[,delimiter])说明:返回一个字符串的长度,或者是被分隔符的子串的个数Write$Length(ABCD)4Write$Length(AB/CD/EF,/)3Tstart开始一个事务Tcommit提交事务Trollback保存失败后回滚三.编写简单的M程序及调试1.Global介绍在Caché中的所有数据都是保存在Global(多维数组)中的。Global以如下形式表示:^名称(下标1,下标2,下标3…)=值l如^AirPlane(“Manufacturer”,“Address”,“Country”)=“US”我们可以自己定制Global,包括添加、删除、修改、遍历其节点。多维数组以树状的形式保存,他的每一个节点直接与磁盘和内存中的数据块相对应,因此可以达到极快的访问速度。2.Routine的使用(.MAC程序)我们可以把Routine理解为“小程序”或程序模块。Routine的基本结构1.Routine的命名Routine的名字可以是任何的字母数字式字符。但是有要求:一般不能以数字或百分号%开头命名,和句号不能在开始或者结束的位置。以%百分号开头命名的Routine是不局限在某一个名字空间(Namespace)应用的,%号它是Caché系统内部保留的,只是系统为我们提供的程序命名所使用。此外,对Routine名字的长度也没有限制,但是只有前31个字符是用来对不同的Routine加以区分的。2.Routine的程序行程序行是routine最基本的单位之一。我们这里说的是一个逻辑上的行,因为有的逻辑上的行在物理上占据了可能超过一行的位置。Routine的行有3种不同的类型,下面作一一的介绍。Routine的标签行一个标签要确定一行,它从当前行的第一个位置开始。它的命名条件和routine的命名条件类似。但是它的长度不能超过31个字符。通常一个标签后面有一些空格,后面可以跟一些Caché的可执行命令。代码行代码行的最前端至少要有一个空格,作为一行的开始部分。注释行有4种形式的注释符号:;符号后面的本行内容将不被执行。;;一些时候,注释的内容在执行的过程中是需要用到的。两个分号的注释内容是被编译进去的,而一个分号的注释在编译的时候就被去掉了。//和一个分号是一样的。/*……*/中间省略号的部分是被注释的内容。创建Routine首先切换namespace到Medsource下File—ChangeNamespace,选择MedsourceFile---New,如下图点ok,然后点编译按钮,界面如下,保存Test.MAC文件点击保存。则保存在Medsource下,这样我们保存了一个空的.mac文件,下面我们将介绍如何写简单的程序.3.没有父子关系的表1)如查询所有押金明细表的收费日期(prt_date),病人姓名(pa_patmas.papmi_name),登记号(pa_patmas.papmi_ipno)金额,支付方式(prt_paymode),收费员姓名(表—dhc_sfprintdetail,对应字段分别为prt_date,prt_adm(病人就诊rowid,指向pa_adm表),prt_payamount,prt_paymode,指向ct_paymode表)我们可以查看表的Global的存储结构为^DHCSFPRINTDETAIL({prt_rowid})Test(我们上面建的mac文件)GetDepositDetail()//标签行,也就是函数的名称sprtrowid=0,num=0//首先要对检索的global的节点付初始值fsprtrowid=$O(^DHCSFPRINTDETAIL(prtrowid))quit:prtrowid=do.sprtdate=$p(^DHCSFPRINTDETAIL(prtrowid),^,2).sprttime=$p(^DHCSFPRINTDETAIL(prtrowid),^,3).sadm=$p(^DHCSFPRINTDETAIL(prtrowid),^,4).q:adm=.spapmi=.i$d(^PAADM(adm))spapmi=$p(^PAADM(adm),^,1).q:papmi=.i$d(^PAPER(papmi,ALL))d..papname=$p(^PAPER(papmi,ALL),^,1)..spapno=$p(^PAPER(papmi,PAT,1),^,1).spayamt=$p(^DHCSFPRINTDETAIL(prtrowid),^,6).snum=num+1.;w!,$zd(prtdate,3)_^_$zt(prttime,1)_^_papname_^_papno_^_payamtqnum在Terminate调试程序(参考Terminate端程序调试)2)查询表病人收费类别表pac_admreason的数据,在rowid之前有一个”ADMREA”的节点,显示代码(rea_code),名称(rea_desc)^PAC(ADMREA,rowid)=记录查询所有的病人收费类别循环如下:Srowid=FsRowId=$o(^PAC(ADMREA,RowId))q:RowId=d.SCode=$p(^PAC(ADMREA,RowId),^,1).SDesc=$p(^PAC(ADMREA,RowId),^,2).SNum=+$g(Num)+1.SPLIST(Num)=Code_^_DescQ3)查询表ct_paymode的数据,显示ctpm_code,ctpm_desc4.有父子关系的表的取值如查询显示某帐单(dhc_patientbill.pb_rowid)的收费项目的名称(表dhc_patbilldetails字段分别为pbd_tari_dr-dhc_taritem(tari_desc),单价(pbd_unitprice),数量(pbd_billqty),金额(pbd_totalamount);,收费日期(pbd_billdate),收费时间(pbd_billtime)信息GetDetailByRowID(pbrowid)Srowid=””fsrowid=$o(^DHCPB(rowid))q:RowId=””d//第一层循环.sOrdSub=””.fsOrdSub=$o(^DHCPB(RowId,O,OrdSub))q:OrdSub=””d//第二层循环..sDetSub=””..fsDetSub=$o(^DHCPB(RowId,O,OrdSub,”D”,DetSub))q:DetSub=””d...//第三层循环5.表的索引的应用取某段时间内押金的明细(dhc_sfprintdetail),显示押金的病人姓名,金额,支付方式,收费员信息索引结构为^DHCSFPRINTDETAIL(0,PrtDate,{prt_printdate},{prt_rowid})FPrtDate=Stdate:1:EndDated.sRowId=$o(^DHCSFPRINTDETAIL(0,PrtDate,PrtDate,RowId)q:RowId=””d.;找到数据的RowId后,到主Global中取相应的数据.SPrtDate=$p(^DHCSFPRINTDETAIL(RowId)),”^”,2).SPrtTime=$p(^DHCSFPRINTDETAIL(RowId)),”^”,3).SAdmId=$p(^DHCSFPRINTDETAIL(RowId)),”^”,4).I$d(^PAADM(AdmId))d..Spaperid=$p(^PAADM(AdmId),”^”,1)..SRegno=$p(^PAPER(paperid,”ALL”),”^”,1)..SPatName=$p(^PAPER(paperid,PAT,1),”^”,1).SPayAmt=$p(^DHCSFPRINTDETAIL(RowId)),”^”,6).SPayMode=$p(^DHCSFPRINTDETAIL(rowid)),”^”,9).SNum=Num+1Q6.Terminate端M程序调试编译m程序d^%urcomp,然后输入要编译的m名称调试程序(包括.mac,.cls,query)Mac文件调试dprocnam
本文标题:M语言
链接地址:https://www.777doc.com/doc-1744058 .html