当前位置:Gxlcms > 数据库问题 > Caché数据库学习笔记(3)

Caché数据库学习笔记(3)

时间:2021-07-01 10:21:17 帮助过:2人阅读

 

.mac文件部分:

query逻辑:

启动:传入StartDate和Status,PlanNo为空,根据Status和IdxA由后向前找到第一条数据的StartDate进入while循环:目的是在不传出有效数据的情况下不必跳出Fetch

过程:判断StartDate是否符合条件,若不符合跳出并终止Fetch根据IdxA, Status, StartDate找到一条数据并设定PlanNo判断PlanNo不为空的时候,进行查找和传出数据;否则按照之前的方法查找下一条数据并再次进入循环传出AtEnd值(0可以继续进入Fetch,1终止Fetch), Row(返回的列表), PlanNo, Status, StartDate根据这三者查找下一条数据

GetPlan(PlanNo, StartDate, Status) Public
{                 

         If (PlanNo ‘= "")
         {
                   Goto Next
         }

// -1表示从后向前查找,因为该函数的目的是找时间最近的,因此从后向前查找会避免很多问题
         Set StartDate = $Order(@$$$PsPlanI@("IdxA", Status, StartDate), -1)
         
         While (StartDate ‘= "")
         {        
                   
                   If (StartDate < 20150926)
                   {
                            Goto Exit
                   }

Next 
                   Set PlanNo = $Order(@$$$PsPlanI@("IdxA", Status, StartDate, PlanNo), -1)
                   If (PlanNo ‘= "")
                   {
                            Set Data            = $Get(@$$$PsPlanD@(PlanNo)) 
                            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 Row             = $ListBuild(PlanNo, PatientId, StartDate, EndDate, Module, Status, DoctorId)
         
                            Set AtEnd                   = 0
                            Goto Exit
                   }
                   
                   Set StartDate = $Order(@$$$PsPlanI@("IdxA", Status, StartDate), -1)
         }
                                     
Exit  
    Set Ret = $ListBuild(AtEnd, Row, PlanNo, StartDate, Status)
         Quit Ret
}

 

Query 的测试方法写在routine中,

// do TestGetPlan^Ps.Plan()
TestGetPlan() Public
{
         Set rs = ##Class(%ResultSet).%New("Ps.Plan:GetPlan")
         do rs.Execute(4, 20160926)
         While rs.Next()
         {
                   w " PlanNo"_rs.GetData(1)_" StartDate"_rs.GetData(3)_" Status"_rs.GetData(6),!
         }
         do rs.Close()
         Kill rs
         Quit
}

 

需要注意的是,非主键的属性作为索引时,在I表里小写会自动转成大写;非必需的属性作为索引,在I表里会自动在前面加一个空格。这里我自己的推测是在索引时,非必需的属性可能为空,而在routine中,是要根据这个属性进行索引的,为防止可能为空的数据无法被索引到,会自动在前面加一个空格。因此在写query的routine时,要注意在编码时加空格匹配;在test时,要注意大小写和空格的问题。

 

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

重建索引表:

正常输入数据后,数据存放在D表中,而query在查找数据时,会使用索引表(I表)。I表是根据D表和cls文件中的设置建立起来的

Management portal/system explorer/SQL

更改命名空间,打开左侧的Tables下拉栏,找到需要重建的表名

在右侧可以看到基本信息,找到上面的Action/rebuild indices即可建立I表

 技术分享

 

另外open table可以查看当前表的所有内容,在当前页的最下方可以调节显示数据的条数

 

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

Management portal简介:

除了上述的System Explorer/SQL外,常用的还有System Explorer/Globals用于导入导出数据和查看表格;System Operation进行配置;System Administration进行管理等

 

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

远程访问Ensemble:

首先关闭防火墙才能被其他服务器远程访问。

访问其他服务器时,首先进行配置。

左键右下角图标,Prefered Server/AddEdit…

 技术分享

 

Localhost这一行可以看到自己的Port/Web Server Port配置情况,点击Add添加其他服务器IP地址、端口和网络端口保存

 技术分享

 

再查看prefered server即可看到当前的首选服务器,在remote system access里可以打开任意可以远程到的服务器的studio/terminal/management portal/documentation

 

Caché数据库学习笔记(3)

标签:

人气教程排行