计算机审计方法语言编制规范_第1页
计算机审计方法语言编制规范_第2页
计算机审计方法语言编制规范_第3页
计算机审计方法语言编制规范_第4页
计算机审计方法语言编制规范_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE31计算机审计方法语言编制规范——计算机审计实务公告第13号中华人民共和国审计署二OO八年三月

目录1.前言 52.引言 53.审计脚本语言(ASL) 53.1概述 53.2约束 63.3参数作用域 63.4常量 73.5变量 73.6数组 73.7表达式、运算符与界符 73.7.1算术运算符 73.7.2逻辑运算符 83.7.3关系表达式 83.7.4界符 93.8叙述语法 93.8.1分支语句 93.8.2WHILE循环 103.8.3REPEAT-until循环 113.9过程 123.9.1过程定义 123.9.2过程的调用 123.10系统基本字(保留字) 133.11系统函数 183.12程序举例 244.Sql语句 314.1约束 314.2常用SQL数据库操作 324.3查询表 324.3.1Select语句 324.3.2修改表 354.3.3连接表 374.4常用SQL函数与表达式 394.4.1聚合函数 394.4.2字符串函数 404.4.3时间函数: 434.5常用函数对照表 44

计算机审计方法语言编制规范1.前言本规范由审计署计算机技术中心、信息化建设办公室提出。本规范的起草单位:审计署计算机技术中心、信息化建设办公室。2.引言计算机审计方法语言包括ASL审计脚本语言和SQL语句两部分。ASL审计脚本语言完成审计方法的流程控制。ASL审计脚本语言是由审计署基于PASCAL语言研制的适用于审计人员编制计算机审计方法的语言。SQL语句完成对数据库的操作。本规范的SQL语句采用国家标准GB_12991-91《信息处理系统数据库语言SQL》及国际标准ISO/IEC9075:1992《信息技术数据库语言SQL》中审计所需的部分内容。为使计算机审计方法语言适用于SQLserver、ORACLE、DB2等不同数据库,本规范在4.5节中列示了常用函数在SQLserver、ORACLE、DB2等数据库使用中的对照表。3.审计脚本语言(ASL)3.1概述审计脚本语言是基于PASCAL语言的基础之上开发一门专为审计人员书写审计方法的编程语言。审计脚本语言主体是PASCAL语言的子集,在此基础之上进行了数据库操作、图表输出等一系列功能扩展,其功能简单,结构清晰,可读性强,具备了一般高级语言的必备部分。3.2约束(1)变量、标示符、函数及过程名称一律使用英文字母开头,可以使用英文和数字。(2)变量、标示符、函数及过程名称大小写不敏感。(3)一段程序中变量、过程不能超过100个。(4)数字最大位数为24位。(5)过程嵌套不超过3层。(6)一行程序不超过5000个字符(7)任何一段超过1行以上的程序需要使用begin….end语句进行约束,表明哪里是开始,哪里是结束。(8)每行程序以分号作为结束符。(9)全程序以end.作为结束(10)变量定义要在主程序的begin之前。(11)赋值语句使用:=为运算符3.3参数作用域过程可以引用自己定义的局部参数,也可以引用包围它的外过程定义的局部参数。3.4常量定义常量的格式:CONST<常量标识符>=<常量>说明:常量说明部分以关键字const开头,后面的标识符为常量标识符,其中"="号后的常量为整数、实数、字符、字符串(字符、字符串常量在后面章节中将作介绍)。而且,在常量说明部分可以将几个常量说明成符号常量,共用一个关键字"const"。3.5变量变量说明的格式:VAR<变量标识符>[,<变量标识符>];其中VAR是ASL保留字,表示开始一个变量说明段;3.6数组说明的格式:array<数组标识符>[下标];其中array是ASL保留字,表示开始一个数组说明段。3.7表达式、运算符与界符3.7.1算术运算符算术运算符说明+加号-减号*乘号/除号3.7.2逻辑运算符逻辑运算符说明=等于and与or或not非3.7.3关系表达式关系表达式说明:=等于号(赋值符、算术表达式)<小于>大于<>、#不等于<=小于等于>=大于等于3.7.4界符界符说明,逗号,变量界符。用来分隔函数和过程的参数,以及声明变量时分隔变量;分号,语句界符。用来做为每一行程序段的结束标志.句号,程序界符。用来表示程序全部结束,一般使用在最后一个end后()小括号,函数和过程的参数界符。[]中括号,数组下标的界符,定义数组时使用,一般中括号中间添入该数组的下标‘’单引号,字符串的界符,单引号中间一般为字符串。如果想单独输入一个单引号字符,则需要‘’’’。//注释符,注释符号,//后的本行文字不影响程序执行。3.8叙述语法3.8.1分支语句(1)格式Ⅰ、IF<布尔表达式>THEN语句;Ⅱ、IF<布尔表达式>THEN语句1ELSE语句2;

(注意Ⅱ型IF语句中语句1后无";"号)(2)功能Ⅰ、执行IF语句时,先计算<布尔表达式>的值,若为TRUE则执行语句,否则不执行任何操作。Ⅱ、执行IF语句时,先计算<布尔表达式>的值,若为TRUE则执行语句1,否则执行语3.8.2WHILE循环while语句的形式为:while<布尔表达式>do<语句>;其意义为:当布尔表达式的值为true时,执行do后面的语句。while语句的执行过程为:①判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;②执行循环体语句(do后面的语句);③返回步骤1;④结束循环,执行while的下一个语句。说明:这里while和do为保留字,while语句的特点是先判断,后执行。当布尔表达式成立时,重复执行do后面的语句(循环体)。3.8.3REPEAT-until循环用while语句可以实现"当型循环",用repeat-until语句可以实现"直到型循环"。repeat-until语句的含义是:"重复执行循环,直到指定的条件为真时为止"。直到循环语句的一般形式:Repeat

<语句1>;:<语句n>;until<布尔表达式>;其中Repeat、until是ASL保留字,repeat与until之间的所有语句称为循环体。说明:①repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。②repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句。③repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来,repeat和until已经起了begin和end的作用。while循环和repeat循环是可以相互转化的。3.9过程3.9.1过程定义在pascal中,函数也遵循先说明后使用的规则,在程序中,函数的说明放在调用该函数的程序(主程序或其它子程序)的说明部分。函数的结构主程序的结构很相似。procedure<过程名>;{过程首部}说明:过程首部以关键字procedure开头。过程名是用户自定义的标识符,只用来标识一个过程,不能代表任何数据,因此不能说明"过程的类型"。过程体的说明部分可以定义只在本过程有效的标号、常量、类型、变量、子程序等。3.9.2过程的调用过程调用是通过一条独立的过程调用语句来实现的,调用的一般格式为:call<过程名>3.10系统基本字(保留字)系统基本字(保留字)说明调用举例var变量定义基本字,描述其后面的字符为定义的变量。vara,x,mymun;const常量定义基本字,描述其后面的字符为定义的常量。constpi=3.14159265;array数组定义基本字,描述其后面的字符为定义的数组。arraya[10],b[10];procedure过程定义基本字,描述其后面的字符为定义的程序过程。vara;proceduresum;begina:=a+1;write(a);end;begina:=1;callsum;end.call调用过程基本字,调用定义的一个过程。begin程序开始基本字,一段程序的开始标志。vara,b;begina:=1;b:=2;ifa<>0thenbeginb:=b+a;write(b);end;end.end程序结束基本字,一段程序的结束标志。程序段结束end后面紧跟分号,全程序结束end后面紧跟句号。如过在if语句有else,则在else前的end不用跟随分号。ifif-then-else判断基本字。if条件thenbegin处理语句;处理语句;endelsebegin处理语句;处理语句;end;ifa>0thenwrite(‘a是正数’);ifa>0thenwrite(‘a是正数’)elsewrite(‘a是不是正数’);ifa>=0thenbegina:=a+1;write(‘a是正数’);endelsewrite(‘a是负数’);thenelserepeatrepeat-until循环基本字。repeat-until循环是直到until后的条件满足循环就停止repeat处理语句;处理语句;until条件;i:=0;repeata:=i*i;write(a);i:=i+1;untili>5;untilwhilewhile-do循环基本字while条件dobegin处理语句;处理语句;end;b:=1;whileb<100dobegina:=b*b;ifa>60000thenbreak;b:=b+1;end;write(b);dobreak循环中止基本字read录入基本字。vara;beginread(a);ifa>0thenwrite(‘a是正数’)elsewrite(‘a是不是正数’);end.write输出基本字。3.11系统函数系统标示符说明调用举例LeftStr左截取字符串函数,输入要操作的字符串和截取的个数,返回左截取后的字符串。一个中文文字符占两位。leftstr(‘操作字符’,个数);RightStr右截取字符串函数,输入要操作的字符串和截取的个数,返回右截取后的字符串。一个中文文字符占两位。rightstr(‘操作字符串’,个数);MidStr中部截取字符串函数,输入要操作的字符串,起始位置和截取的个数,返回中部截取后的字符串。一个中文文字符占两位。MidStr(‘操作字符串’,起始位置,个数);Length字符串取长度函数,输入要操作的字符串,返回该字符串的长度,一个中文字符占两位。一个中文文字符占两位。Length(‘操作字符串’);CreateQ执行SQL语句,返回一个SQL语句的执行及结果到查询变两中。第一个参数是查询的SQL语句,第二个参数是使用过已经没有用的查询变量,如果是第一次作查询则填写-1,这样做的好处是,节省查询变量的个数,节约资源。CreateQ(‘SQL语句’,查询变量);a:=createq(‘select*from凭证表’,-1);a:=createq(‘select*from凭证表’,a);QEof查看查询变量当前指向的记录是否为空。返回1则表明为空。QEof(查询变量);a:=createq(‘select*from凭证表’,-1);b:=QEof(a);ifb<>1thenbegin//你的操作//……//你的操作end;QMov查寻变量记录移动函数,返回成功与否。QMov(查询变量,移动方向1向下-1向上);a:=createq(‘select*from凭证表’,-1);b:=QMov(a,1);QFDValue取当前查询变量当前纪录的字段的值。入口参数一个是查询变量,一个是某一个字段的名称,需要用单引号括起来。QFDValue(查询变量,‘字段名称’);a:=createq(‘select*from凭证表’,-1);b:=QFDValue(a,‘摘要’);RecordNum如果参数为一个打开的查询变量,则取出当前查询变量的记录个数。如果参数为数据库中的一个表名,则取出该表的所有记录个数。RecordNum(查询变量或‘表名称’);ExecuteUpdate执行数据库插入、更新、删除(Insert,Update,Delete)的SQL语句的函数。ExecuteUpdate(‘SQL语句’);CreateTempTable把SQL语句取出来的结果以用户输入的表名存储在数据库中。CreateTempTable(‘新表名’,‘SQL语句’);OPutChart将查询变量或SQL语句结果输出到图表。Y轴字段显示颜色参数:clred——红色、clblue——蓝色、clyellow——黄色、clgreen——绿色、clMaroon——栗色、clPurple——紫色、clFuchsia——紫红色、clOlive——橄榄色、clSkyBlue——天蓝色、clMoneyGreen——货币绿色、clLime——亮绿色。或者直接使用颜色数字,格式为$加6位的16进制数字。如:$1f11cOPutChart(查询变量或‘SQL语句’,‘X轴字段’,‘Y轴字段1,显示颜色参数1;Y轴字段2,显示颜色参数2;Y轴字段N,显示颜色参数N’);AddVouDout输出源凭证号到疑点库中,该源凭证号对应的凭证将被定义为已落实疑点。AddVouDout(源凭证号);AddVouRslt输出源凭证号到疑点库中,该源凭证号对应的凭证将被定义为未落实疑点。AddVouRslt(源凭证号);AddTransDout把指定查询变量的当前记录输出到业务疑点的临时库中。AddTransDout(查询变量,‘疑点说明’);AddTransRslt把指定查询变量的当前记录输出到业务结果的临时库中。AddTransRslt(查询变量,‘疑点说明’);TransBatch把指定查询变量的业务疑点或结果临时库中的数据写入业务疑点或结果库中。并清空相应的临时库中的数据TransBatch(查询变量,‘批量疑点说明’);showmsgshowmsg(‘消息内容’);3.12程序举例(1)赋值语句//定义变量并且为变量赋值和输出变量constpi=3.14159265;//常量赋值VarInputNumber,InputString,CurrentQuery;ArrayInputArrary[10];BeginInputNumber:=123;//数值赋值InputString:='ABCDEFG';//字符串赋值InputArrary[1]:='abc';//数组赋值CurrentQuery:=CreateQ('select*from凭证库',-1);ShowMsg(InputNumber);ShowMsg(InputString);ShowMsg(InputArrary[1]);End.(2)判断语句//脚本说明://输入一个数判断输入的数字是否为正数,正数显//示你输入的数为正数负数显示你输入的数为负数VarInputNumber;beginRead(InputNumber);ifInputNumber<>0thenbeginifInputNumber>0thenbeginShowMsg('你输入的是正数');endelsebeginShowMsg('你输入的是负数数');end;endelsebeginShowMsg('你输入的是零');end;end.(3)循环语句//提示用户输入一个数字,如果输入的数是负数停止//循环否则将输入的数字累加并在最后将累加结果显示VarInputNumber,TotalNumber;ProcedureDoCycle;BeginTotalNumber:=0;Read(InputNumber);//输入一个数字whileInputNumber>0do//循环条件输入的数字是正数BeginTotalNumber:=TotalNumber+InputNumber;//累加输入的数字Read(InputNumber);//输入一个数字End;End;//主程序BeginCallDoCycle;//调用过程ShowMsg(TotalNumber);//显示累计结果End.(4)数据库操作//读取凭证库中的一月份凭证,计算一类,五类科//目,2,3,4类科目总数并显示//对于凭证号为1的凭证放在未落实疑点为2的放//到已落实疑点varCurrentQuery,IsEmpty,AccountCode,Total1,Total2,VoucherNum,SourceVoucherNum;beginTotal1:=0;Total2:=0;CurrentQuery:=CreateQ('select*from凭证库where会计月份=1',-1);IsEmpty:=Qeof(CurrentQuery);ifIsEmpty<>1thenbeginrepeatAccountCode:=QFDValue(CurrentQuery,'科目编码');AccountCode:=LeftStr(AccountCode,1);ifAccountCode='1'orAccountCode='5'thenbeginTotal1:=Total1+1;endelsebeginTotal2:=Total2+1end;IsEmpty:=Qmov(CurrentQuery,1);IsEmpty:=Qeof(CurrentQuery);VoucherNum:=QFDValue(CurrentQuery,'凭证号');ifVoucherNum=1thenbeginSourceVoucherNum:=QFDValue(CurrentQuery,'源凭证号');AddVouDout(SourceVoucherNum);end;ifVoucherNum=2thenbeginSourceVoucherNum:=QFDValue(CurrentQuery,'源凭证号');AddVouRslt(SourceVoucherNum);end;untilIsEmpty=1;end;write(Total1);write(Total2);ShowMsg(Total1);end.(5)字符串操作varTestString,ResultStr,LengthStr;beginTestString:='ABCDEFG';ResultStr:=LeftStr(TestString,1);ShowMsg(ResultStr);ResultStr:=RightStr(TestString,1);ShowMsg(ResultStr);ResultStr:=MidStr(TestString,1,4);ShowMsg(ResultStr);ResultStr:=TrimStrEX(TestString,'CD','DC');ShowMsg(ResultStr);LengthStr:=Length(TestString);ShowMsg(LengthStr);end.(6)图形输出//用户输入科目编码对当前输入的科目编码按月份//汇总借贷金额以图表方式输出varCurrentQuery,x;beginRead(x);CurrentQuery:=CreateQ('SELECT会计月份,SUM(借方金额)ASJ,SUM(贷方金额)ASDFROM凭证库WHERELEFT(科目编码,4)='+''''+x+''''+'GROUPBY会计月份',-1);oputchart(CurrentQuery,'会计月份','J,clred;D,clgreen');end.4.Sql语句4.1约束在计算机审计方法语言中的SQL语句只支持数据定义语言(DDL,DataDefinitionLanguage)、数据操纵语言(DML,DataManipularionLanguage)、数据控制语言(DCL,DataControlLanguage)和系统存储过程(SystemStoredProcedure)中的数据定义语言和数据操纵语言。4.2常用SQL数据库操作4.3查询表4.3.1Select语句Select语句从一个或多个表中检索数据(1)语法SELECT[ALL|DISTINCT]{Columnexpression[ASname]}[…]|*FROM

<tablereference>[{,<tablereference>}…][WHERE<searchcondition>][GROUPBYColumns[Havingcondition]]Select语句查询sql数据,返回一个由在From子句中所指的表导出的结果表。结果表的导出可以描述为一个操作的序列,每一个操作的结果被输入到下一个操作。这个操作序列是From子句,然后是WHERE、GROUPBY、HAVING和选择清单(即列表达式的清单),而对这些子句的描述也以这个顺序出现。From子句Form子句为查询提供一个<表引用>语法FROM<tablereference>[{,<tablereference>}…]WHERE子句可选项WHERE子句用于设置对于行的检索条件。不在规定范围内的任何行都从结果表中去除。规定的搜索条件必须含有算术和布尔运算符、sql判断和Sql标量函数,以及设置运算顺序的括弧。语法[WHERE<searchcondition>]GROUPBY子句GROUPBY子句逻辑上将由WHERE子句返回的结果集重新编组。语法[GROUPBY[ALL]group_by_expression[,...n][WITH{CUBE|ROLLUP}]]HAVING子句可选行HAVING子句用于为组设置检索条件。不在规定范围内的任何组都从结果集中去除。规定的搜索条件必须含有算术运算符、布尔运算符、SQL判断和SQL标量函数,以及设置运算顺序的括弧。语法[HAVING<search_condition>]Case子句:计算条件列表并返回多个可能结果表达式之一<caseexpression>FunctionSpecifyaconditionalvalue.Format<caseexpression>::=<caseabbreviation>|<casespecification><caseabbreviation>::=NULLIF<leftparen><valueexpression><comma><valueexpression><rightparen>|COALESCE<leftparen><valueexpression>{<comma><valueexpression>}...<rightparen><casespecification>::=<simplecase>|<searchedcase><simplecase>::=CASE<caseoperand><simplewhenclause>...[<elseclause>]END<searchedcase>::=CASE<searchedwhenclause>...[<elseclause>]END<simplewhenclause>::=WHEN<whenoperand>THEN<result><searchedwhenclause>::=WHEN<searchcondition>THEN<result><elseclause>::=ELSE<result><caseoperand>::=<valueexpression><whenoperand>::=<valueexpression><result>::=<resultexpression>|NULL<resultexpression>::=<valueexpression>4.3.2修改表(1)ALTER语句ALTERTABLE更改一个基本表的定义。语法ALTERTABLE<tablename><altertableaction><altertableaction>::=ADD[COLUMN]<Columndefinition>|ALTER[COLUMN]<Columnname>SETDEFAULTdefaultvalue|ALTER[COLUMN]<Columnname>DROPdefault|ALTER[COLUMN]<Columnname>ADDSCOPE<tablename>|ALTER[COLUMN]<Columnname>ADDSCOPE{RESTRICT|CASCADE}|ALTER[COLUMN]<Columnname>{RESTRICT|CASCADE}|ADD<TableConstraint>|DROPCONSTRAINT<Constraintname>{RESTRICT|CASCADE}(2)INSERT语句将新行添加到表。语法INSERT[INTO]<Tablename>

[(<Columnname>[{,<Columnname>}…])][OVERRIDESYSTEMGENERATEDVALUES]<queryexpression>INSERTINTO[ONLY]<Tablename>DEFAULTVALUES(3)UPDATE语句更改表中的现有数据。语法UPDATE[ONLY]<Tablename>SET<Columnname>=scalar_expression[{,<Columnname>=scalar_expression}…]|ROW=row_expression[WHERE<search_condition>](3)DELETE语句从表中删除行。语法DELETEFROM[ONLY]<Tablename>[WHERE<search_condition>]4.3.3连接表连接表是指由笛卡尔积(交叉连接)、自然连接、内连接、外连接和联合连接得到的表语法:<joinedTable>::=<tablereference>CROSSJOIN<tablereference>|<tablereference>[NATURAL][<jointype>]JOIN<tablereference>[<joinspecification>]|(<joinedTable>)<jointype>::=INNER|{LEFT|RIGHT|FULL}[OUTER]|

UNION<joinspecification>=::ON<searchcondition>|USING(join<Columnname>[{,join<Columnname>}…])笛卡尔积(交叉连接)分为显式和隐式两种,不带ON子句,返回的是两表的乘积。隐式的交叉连接,使用“,”连接表。显式的交叉连接,使用”CROSSJOIN”连接表。内连接内连接(INNERJOIN)形成的中间表为两个表经过ON条件过滤后的笛卡尔积。自然连接(NATURALINNERJOIN)自然连接无需指定连接列,SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示对于每种连接类型(除了交叉连接外),均可指定NATURAL。外连接(OUTERJOIN)外连接分三类:左外连接(LEFTOUTERJOIN)、右外连接(RIGHTOUTERJOIN)和全外连接(FULLOUTERJOIN)。三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:左外连接还返回左表中不符合连接条件单符合查询条件的数据行。右外连接还返回右表中不符合连接条件单符合查询条件的数据行。全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外UNION右外”。联合连接(UNIONJOIN)找出全外连接和内连接之间差异的所有行。4.4常用SQL函数与表达式4.4.1聚合函数AVG返回组中值的平均值。空值将被忽略。语法AVG([ALL|DISTINCT]expression)COUNT返回组中项目的数量。语法COUNT({[ALL|DISTINCT]expression]|*})MAX返回表达式的最大值。语法MAX([ALL|DISTINCT]expression)MIN返回表达式的最小值。语法MIN([ALL|DISTINCT]expression)SUM返回表达式中所有值的和,或只返回DISTINCT值。SUM只能用于数字列。空值将被忽略。语法SUM([ALL|DISTINCT]expression)4.4.2字符串函数(1)字符子串函数返回字符串的一部分语法:<charactersubstringfunction>::=SUBSTRING(<charactervalueexpression>FROM<startposition>[FOR<stringlength>])(2)字符整理函数去除尾端或首端的或是首端和尾端的整理字符。语法:trimfunction>::=TRIM(<trimoperands>)<trimoperands>::=[[<trimspecification>][<trimcharacter>]FROM]<trimsource><trimsource>::=<charactervalueexpression><trimspecification>::=LEADING|TRAILING|BOTH<trimcharacter>::=<charactervalueexpression>(3)对换函数将字母在大小写之间进行转换fold>::={UPPER|LOWER}(<charactervalueexpression>)(4)字符翻译函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论