zoukankan      html  css  js  c++  java
  • Caché数据库学习笔记(2)

    目录:

    创建新类(表)(class文件)与创建routine(.mac  .inc)

    在类里面添加函数(classmethod)

    Terminal的使用

    =============================================== 

    =============================================== 

    创建新类(表)(class文件)与创建routine(.mac  .inc)

    一个.cls文件对应一个.mac文件和.inc文件,属性(property)与函数(method/query)定义放在.cls文件中,具体的处理函数写入.mac文件中,常量在.inc文件中定义,将用于函数调用数组时使用的(1,2,3)定义为具体的变量名,使.mac与文件易读

    File/New.../General

    cache class definition(.cls)

    cache objectScript routine(.mac/.int)

     

     

    输入适当的包名(Package Name)和新建的类名(Class Name)如图,就能得到一个名为Package.Class.cls的类文件了,可以在workspace/project中找到该文件

     

    新建类时,一个类对应一张表,对于该表的所有操作方法组成一个类;放在同一个包下的各个类是相关联的,在实际意义中,一个包下的类对同一个大问题的不同方面进行描述。具体的建立和分类方式通过数据库设计方式来指导,在此处不多说。

     

    新建的文件如上图所示,代码写在大括号内

    一个类(表)里的要素:

    属性、主键、索引、方法。

    新建属性:

    直接写语句:

    Property ID As %String [ Required ];

    就可以新建一个名为ID的属性,该属性为字符串类型(注意区分大小写),且在表中是必需属性不能为空

    也可以找到一个new property的按钮,按照新建向导新建一个属性

    若表与表之间是父子表的关系,比如父表是基本信息,子表是详细信息,要在属性中建立两个表之间的联系:(下例中父表是Class1,子表是Class2,共同放在P包下)

    在P.Class1.cls中的属性中需要写:

    Relationship Class2 As P.Class2 [ Cardinality = children, Inverse = Class1 ];

    在P.Class1.cls中的属性中需要写:

    Relationship Class1 As P.Class1 [ Cardinality = parent, Inverse = Class2 ];

    设置主键:

    Index PK On (Pr1, Pr2) [ IdKey, PrimaryKey, Unique ];

    设置索引:Query中的查找依据

    Index IdxA On (Pr1, Pr2);

    这里Pr1和Pr2可以是主键,也可以不是主键

    与其他表连接时,即具体的属性名在另一张表里,在这张表也同时有体现:

    Property RevisionInfo As Cm.RevisionInfo;

    这样的意思是本张表有一组属性RevisionInfo在表Cm.RevisionInfo里,同时在本张表里也能看到这一组属性。

     =======================================================

    添加方法(SetData):

    写方法时需要同时对(.cls.mac.inc)三个文件进行操作:

    .cls文件:

    ClassMethod SetData(PlanNo As %String, PatientId As %String, StartDate As %Integer, EndDate As %Integer, Module As %String, Status As %Integer, DoctorId As %String, UserId As %String, TerminalName As %String, TerminalIP As %String, DeviceType As %Integer) As %Integer
    {
        Set Ret = 0
        Set Ret = $$SetData^Ps.Plan( PlanNo, PatientId, StartDate, EndDate, Module, Status, DoctorId, UserId, TerminalName, TerminalIP, DeviceType)
        Quit Ret
    }

    定义classmethod名字是setdata,括号内为传入参数及类型,设置return初始值为0,然后调用routine里的SetData函数(规定调用成功返回1,在routine中设置),退出函数并返回Ret

    .mac文件

    #Include %occStatus
    #Include Ps.Plan.Storage
    #Include ChroDiseaConst
    #Include Cm.RevisionInfo.Storage
    
    SetData(PlanNo, PatientId, StartDate, EndDate, Module, Status, DoctorId, UserId, TerminalName, TerminalIP, DeviceType) Public
    {
        Set Ret = $$$SetDataFailed
        Set key = PlanNo
        Set oref = ##Class("Ps.Plan").%OpenId(key)
        If ($IsObject(oref) = 0)
        {
           Set oref = ##Class("Ps.Plan").%New()
        }
        If ($IsObject(oref) = 1)
        {
           Set oref.PlanNo            = PlanNo
           Set oref.PatientId            = PatientId
           Set oref.StartDate            = StartDate
           Set oref.EndDate        = EndDate
           Set oref.Module           = Module
           Set oref.Status           = Status
           Set oref.DoctorId         = DoctorId
           
           Set RevisionInfo = $$GetNewRevisionInfo^Cm.RevisionInfo(UserId, TerminalName, TerminalIP, DeviceType)
           Set oref.RevisionInfo.DateTime        = $ListGet(RevisionInfo, $$$CmRevisionInfoDateTime) 
           Set oref.RevisionInfo.UserId          = $ListGet(RevisionInfo, $$$CmRevisionInfoUserId)
           Set oref.RevisionInfo.UserName        = $ListGet(RevisionInfo, $$$CmRevisionInfoUserName) 
           Set oref.RevisionInfo.TerminalName    = $ListGet(RevisionInfo, $$$CmRevisionInfoTerminalName)
           Set oref.RevisionInfo.TerminalIP      = $ListGet(RevisionInfo, $$$CmRevisionInfoTerminalIP)
           Set oref.RevisionInfo.DeviceType       = $ListGet(RevisionInfo, $$$CmRevisionInfoDeviceType) 
           
           Set sc = oref.%Save()
           If $$$ISOK(sc) 
           {
               Set Ret = $$$SetDataSuccess  
           }
           else
           {
               Set ErrMsg = $System.Status.GetErrorText(sc,"")
               Do WriteServerLog^Cm.CommonLibrary("","",ErrMsg)
           }
           Kill oref
        }
        Quit Ret
    }

    这里,ChroDiseaConst设置了工程中用到的所有状态变量,如代码中的ISOK等;Ps.Plan.Storage.inc文件设置了对应这张表的各个属性的宏文件,将调用数组元素时使用的数字设置为对应变量名,使代码易读;Cm.RevisionInfo.Storage也是相同的作用

    首先设置返回初始值,设置主键,若已存在则打开这个主键对应的值,否则新建;设置各个属性的值为传入的参数;判断是否成功,否则报错;最后释放缓存并返回Ret退出。

    .inc文件

    #Define    PsPlanD "^Ps.PlanD"
    
    #Define    PsPlanI "^Ps.PlanI"
    
    #Define PsPlanPatientId 2
    #Define PsPlanStartDate 3
    #Define PsPlanEndDate 4
    #Define PsPlanModule 5
    #Define PsPlanStatus 6
    #Define PsPlanDoctorId 7
    #Define PsPlanRevisionInfo 8

    定义宏

    ==================================================

    添加方法(简单查表):

    .cls:

    ClassMethod GetPatientPlan(PlanNo As %String) As %List
    {
        Set Ret = ""
        Set Ret = $$GetPatientPlan^Ps.Plan(PlanNo)
        Quit Ret
    }

    输入一个参数(PlanNo)返回符合查找条件的一个列表。首先置初值为空,然后调用routine,最后返回退出。

    .mac:

    GetPatientPlan(PlanNo) Public
    {
        Set Ret  = ""
        Set Data = $Get(@$$$PsPlanD@(PlanNo))
        If (Data '= "")
        {
           Set PatientId                      = $ListGet(Data,$$$PsPlanPatientId)
           Set StartDate                      = $ListGet(Data,$$$PsPlanStartDate)
           Set EndDate                        = $ListGet(Data,$$$PsPlanEndDate)
            Set Module                         = $ListGet(Data,$$$PsPlanModule)
            Set Status                         = $ListGet(Data,$$$PsPlanStatus)
            Set DoctorId                       = $ListGet(Data,$$$PsPlanDoctorId)
            Set RevisionInfo                = $ListGet(Data,$$$PsPlanRevisionInfo)
            
           Set DateTime                     = $ListGet(RevisionInfo, $$$CmRevisionInfoDateTime) 
           Set UserId                     = $ListGet(RevisionInfo, $$$CmRevisionInfoUserId)
           Set UserName                     = $ListGet(RevisionInfo, $$$CmRevisionInfoUserName) 
           Set TerminalName                  = $ListGet(RevisionInfo, $$$CmRevisionInfoTerminalName)
           Set TerminalIP                  = $ListGet(RevisionInfo, $$$CmRevisionInfoTerminalIP)
           Set DeviceType                     = $ListGet(RevisionInfo, $$$CmRevisionInfoDeviceType) 
           
           Set RevisionInfoRet = $ListBuild(DateTime, UserId, UserName, TerminalName, TerminalIP, DeviceType)
           
           Set Ret = $ListBuild(PatientId, StartDate, EndDate, Module, Status, DoctorId, RevisionInfoRet)
        }
        Quit Ret
    }

    同样的,先置初值,然后从D表中查找搜索条件(本例中因为用主键查找,因此不需要索引),然后设置返回的列表内容,最后build列表并返回。

     =================================================

    Terminal的使用:

    命令行操作,用于对数据库进行指令操作或测试写过的方法。

    如测试classmethod可以输入命令

    w ##class(Ps.Plan).SetData(“xx”, “yy”, …)

    测试query

    do TestGetPlan^Ps.Plan()

    (在routine中应有对应的测试方法TestGetPlan() )

    注意,首次打开需要输入用户名密码,每次打开都要更改到对应命名空间:

    zn “namespace”
  • 相关阅读:
    【Spring】构建Spring Web应用
    【记录】Spring项目转化为Spring Web项目
    【生活工具】你能带我回家么,可能明天要下雨了。
    【Spring】面向切面之AOP
    【Spring】高级装配
    【Linux】Linux学习笔记(完结)
    【Spring】Spring的bean装配
    【Netty】源码分析目录
    【项目实战】多线程环境下正确创建单例
    【环境搭建】使用Jekyll搭建Github博客
  • 原文地址:https://www.cnblogs.com/gyjerry/p/5950562.html
Copyright © 2011-2022 走看看