datastage学习文档.doc_第1页
datastage学习文档.doc_第2页
datastage学习文档.doc_第3页
datastage学习文档.doc_第4页
datastage学习文档.doc_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

工作总结 目录1 如何重新启动DataStage服务器, 步骤如下:52 DataStage开发经验积累:52.1 模板开发52.2 通过Server Shared Container在Parallel Job中添加Server Job Stage52.3 去除不需要的字段52.4 Transformer Stage的使用52.5 Look up/join 空值处理62.6 DataStage中默认和隐式类型转换时注意的问题62.7 配置一个input或output,就view data一下,不要等到run时再回头找error72.8 Data型数据是比较麻烦的72.9 行列互换之Horizontal Pivot(Pivot Stage)72.10 行列互换之Vertical Pivot72.11 Oracle EE Stage在VIEW数据时出现的错误及解决方法92.12 DataStage SAP Stage的使用102.13 Colum Import Stage的使用102.14 Colum Export Stage的使用122.15 Got ERROR: Cannot find any process number for stages in Job Jobname解决132.16 Unable to create RT_CONFIGnnn142.17查看job和client的对应的后台进程142.18强制杀死DS进程142.19查看Server Engine的进程152.20查看Server Locks152.21关于UNIX系统下无法启动服务的解决办法162.22Locked by other user172.23dataStage Job Log的处理172.24一些BASIC语言中处理字符串的函数172.25BASIC程序中使用到的一些语法知识183DS中常见问题记录223.1 权限管理问题223.2 job may be being monitored或者是cleanup问题223.3 删除文件的问题223.4 sequence调度出现的错误问题233.17字符集问题233.18VersionControl的问题233.19sequence调不起JOB的问题243.20sequence调度失败的问题243.21DS发送邮件的配置问题243.22随机错误问题243.23DS中的日期问题253.24DS连接oracle问题253.25在Sequence File Stage中的空值处理问题253.26在DS中使用Oracle Enterprise Stage必须的权限263.27DS中去除回车符的问题以及从char类型转变成整型的方法263.28从后台看JOB列表的方法263.29Datastage和数据库的连接方法273.30在datastage中使用环境变量的问题273.31IConv 和 OConv273.32在Merge中使用特殊字符284部分常用Stage 的使用说明285dsjob 语法说明:296如何从DataStage服务器导出所开发的JOBS列表317查看当前服务器状态信息的方法:348如何在两台机器之间进行FTP文件359如何获得Jobstatus ,步骤如下:3610dsjob run 的用法3811如何在后台运行和停止一个JOB3912DS Oracle EE Stage 配置4111.1 安装Oracle客户端4111.2 添加Oracle用户到dsadm group组选项4111.3 配置DataStage服务器dsenv文件4111.4 配置tnsnames.ora4211.5 重起DataStage服务4211.6 配置Oacle Stage抽取的Select权限4211.7 Oacle EE STAGE配置结束4313DS ODBC 的配置4312.1 修改$DSHOME /dsenv4312.2 修改$DSHOME/.odbc.ini, 来提供数据库连接信息;4312.3 修改$DSHOME/uvodbc.config, 来指定DSN(data source name).4414ETL系统扩展4515Remote Shell (rsh)的配置4514.1 创建并配置 .rhosts文件4514.2 修改/etc/hosts.equiv文件4616dsadmin命令的使用4615.1 dsadmin命令的使用4617如何启动JobMonApp4818DS.TOOLS4819uvsh常用命令5118.1 LOGTO ProjectName -登录一个工程5118.2 DS.TOOLS -进入DS工具5118.3 LIST DS_JOBS -显示所有的Job及Job的分类Category5118.4 LIST DS_JOBS WITH NAME=JobName -显示某个特定Job的信息5118.5 LIST.READU EVERY -列出所有的锁及锁的拥有用户UserName5118.6 UNLOCK USER userno ALL -解锁用户锁住的Jobs5118.7 LIST.INDEX - 列出资料库的索引5220Usage Analysis来进行影响分析5219.1 如何启动Usage Analysis5219.2 Usage Analysis中Select Columns的使用5319.3 Usage Analysis中View HTML的使用5419.4 Usage Analysis中Locate in Manager的使用5519.5 Usage Analysis可使用的Source类型5621DS Message Handlers5720.1 Message Handlers的两种级别5720.2 Message Handlers的三种动作种类5820.3 Message Handlers的文件格式5822DS Parallel Routine5921.1 Parallel Routine注意事项5921.2 Parallel Routine创建流程5921.3 Parallel Routine示例6023uvconfig文件中参数修改方法6222.1修改文件uvconfig中的参数6222.2运行uvregen6222.3重启DS服务6222.4校验6224&PH&6223.1cd &PH& 或 cd &PH&6225DB2支持的数据格式6326DB2中Load语法和基本使用641 如何重新启动DataStage服务器, 步骤如下: 1.01启动DataStage Server 的命令要在$DSHOME/bin 目录下进行. 启动之前要切断所有与服务器端的连接:1. 登陆DataStage 服务器,输入: $DSHOME/bin 2. 关闭DataStage 服务器 ./uv admin stop 3. 检查服务器上是否还有进程没关掉,否则服务器无法启动起来,netstat -a | grep ds4. 重起服务器 ./uv admin start. Note: 关闭DataStage 服务器后,建议过30 sec 再重起服务器.2 DataStage开发经验积累: 2.1 模板开发并行JOB中模板的开发可以最大程度的重用并行JOB的构件,节省时间 1. 使用JOB参数(PARAMETER)可以在运行时提供参数的值,增加灵活性,可以在不同的环境处理不同的数据;使用JOB PARAMETER 可以在同一时间使用不同参数运行同一个JOB 2. Shared Container 共享容器可以在多个JOB中共享相同的逻辑,当一个JOB编译时共享容器被嵌入. 2.2 通过Server Shared Container在Parallel Job中添加Server Job Stage 在Designer中创建一个server shared container,添加需要的Server job stage,再把server shared container添加到parallel job并连接到其他parallel stage. 2.3 去除不需要的字段 当从数据库中读取数据时,要尽可能早的去除不需要的字段,只读取需要的字段,而不是整个表,这样可以提高数据读取效率. 2.4 Transformer Stage的使用1. 慎用Transformer Stage,因为它可能降低JOB的运行效率,有些功能能合并成一个单独的STAGE的不要用多个STAGE,要用其他的STAGE来代替Transformer Stage 能完成的任务. 2. Transformer Stage 的数据流程是先经过constraint的过滤,然后再经过Derivation处理3. 对于确定类型的操作,使用其他STAGE 比使用TRANSFORMER 会更好: (1) 对如下情况,使用Copy Stage 将比Transformer Stage 更好 在界面上提供一个JOB 设计占位符 重新命名字段 删除字段 Implicit类型变换 (2) 使用Filter Stage 或者 Switch Stage 来把输入记录按照限制表式分成多个输出分支. (3) 使用Modify Stage 来explicit 类型变换和Null处理 Modify Stage 也可重新命名字段保持(keep)或删除(drop)字段也可增加新字段,并为新增字段赋值,但赋值方式要以字段=字段 形式,例如: new_columnname = old_columnname; 但new_columnname =”hf”这样赋值是错误的Null的处理destinationColum=handle_null(sourceColum,Value)destinationColum=make_null(sourceColum,Value),这个使用中有问题,不处理空值2.5 Look up/join 空值处理1. 当使用Lookup Failure = Contunue 时,要把 reference link 的非主键设置成Nullable,即使reference data 是非空的,也要设置成Nullable,这样能够确保Lookup 把空值分配给没有匹配的参考非主键 2. 如果参考非主键没有设置成Nullable ,将会发生什么:Lookup 将会分配一个默认值给没有匹配的的行:Integer 默认值为0Varchar/char默认值为空字符串(0长度的)2.6 DataStage中默认和隐式类型转换时注意的问题当从源向目标映射数据时,如果类型不一致,对于有些类型我们需要在modify或transfomer stage中通过函数进行转换,对于有些系统会自动完成类型转换,在类型转换过程中,注意以下几点:1 在变长到固定长度字符串的默认转换中,parallel jobs用空格(ASCII 20)字 符来填充剩余长度(环境变量APT_STRING_PADCHAR的默认值也是空格(ASCII 20),具体在哪个stage填充的不知.2 通过环境变量APT_STRING_PADCHAR可以改变默认的填充字符null(ASCII 0)。3 有个PadString 函数可以用来用指定的字符来填充一个变长的字符串到指定的长度。这个函数的参数不能使固定长度字符串,如果是固定长度的先转化为变长。2.7 配置一个input或output,就view data一下,不要等到run时再回头找error2.8 Data型数据是比较麻烦的因为Datastage中的日期格式为timestamp,当然你也可以把它的日期格式更改为date型,但经常会出现错误。对于oracle数据库源表和目标表,不需要对date型数据做任何转换,直接使用默认即可,但对于informix等一些数据库,则需要使用oconv,iconv函数进行转换,并在output中相应的修改output sql中的日期格式2.9 行列互换之Horizontal Pivot(Pivot Stage)列变行,即宽表变窄表,字段变少了,记录数变多了,牵涉到Column数量的变化;注意要在Pivot-Output的Derivation中写上转换字段的来源字段,字段之间用逗号隔开例子:PIVOT Input记录如下:Id col1 col2 col32 Rootpath Workdate EdsDbname3 Rootpath Workdate AsdmDbnamePIVOT Output记录如下:Id colum2 Rootpath2 Workdate2 EdsDbname3 Rootpath3 Workdate3 AsdmDbname2.10 行列互换之Vertical PivotPivot Stage是宽表变窄表,也即:Horizontal Pivot;实际应用中还会牵涉到窄表宽表,即Vertical Pivot的应用。例如:输入Input记录如下:IdColumn2Rootpath 2Workdate 2EdsDbname 3Rootpath 3Workdate 3AsdmDbname我们想要的输出Output记录是这样的:IdNewCol2Rootpath,Workdate,EdsDbname3Rootpath,Workdate,AsdmDbname解决方法如下:Server Job的做法:Sequence File- Transform- Hash File源表结构: Id varchar 10 Column varchar 10Define Transform as follows Stage Variables:currentKey Initial value = Derivation = L1.Id newRecord Initial value = Derivation = if currentKey=lastKey Then newRecord:,:L1.Column else L1. ColumnlastKey Initial value = Derivation = currentKeyL2 Deriviations L2.key = L1.IdL2.line = newRecord目标表结构:Id varchar 10 (marked as the key) Newcol varchar 200(注意:Stage Variable的有先后顺序的,它是按照先后顺序来赋值的,所以lastKey要在newRecord后面)如果把Newcol的值放在不同的字段中,格式如下:IdCol1Col2Col32RootpathWorkdateEdsDbname3RootpathWorkdateAsdmDbname解决方法是:把NewColm的值读出来赋给一个Stage Variable,然后使用Field(NewCord, ,1),Field(NewCord, ,2).等等,把值赋给每个Colm。Parallel Job的做法:(按照SERVER JOB的做法,然后改成串行方式也能实现)1.使用Sort Stage对Key Column: Id 进行分区和排序;并设置Create Key Change Column=True(作用是第一条记录会标识为1,其它0),产生KeyChange Column; 运行出来的结果如下:IdColumn KeyChange- - -2Rootpath 12Workdate 02EdsDbname 03Rootpath 13Workdate 03AsdmDbname 0 2.在Transform Stage里创建Stage Variable;创建变量后,根据KeyChange的值来设置变量的值;如:创建变量svBuildColum,赋值:if DSLink12.keyChange=1 then DSLink12.Column else svBuildColumn : $ : DSLink12.Column运行出来的结果如下:IdColumn KeyChange svBuildColum- - - -2Rootpath 1Rootpath 2Workdate 0Rootpath $Workdate 2EdsDbname 0Rootpath $Workdate $EdsDbname 3Rootpath 1Rootpath 3Workdate 0Rootpath $Workdate 3AsdmDbname 0 Rootpath $Workdate $AsdmDbname 3.使用Remove_Duplicates Stage,根据Key Colum:Id去除重复行,并Retain Last;运行的结果如下:Id svBuildColum- -2 Rootpath $Workdate $EdsDbname 3 Rootpath $Workdate $AsdmDbname4.如果把svBuildColum的值放在不同的字段中,使用Field(NewCord, $,1),Field(NewCord, $,2).等等,把值赋给每个Colm.最后结果如下:IdCol1Col2Col32RootpathWorkdateEdsDbname3RootpathWorkdateAsdmDbname2.11 Oracle EE Stage在VIEW数据时出现的错误及解决方法错误信息如下:#I TOSH 000002 04:05:22(001) orchgeneral: loaded #I TOSH 000002 04:05:22(002) orchsort: loaded #I TOSH 000002 04:05:22(003) orchstats: loaded #E TOSH 000205 04:05:22(004) PATH search failure: #E TOSH 000000 04:05:22(005) Error loading orchoracle: Could not load orchoracle: The specified module could not be found. #E TOSH 000000 04:05:22(006) Could not locate operator definition, wrapper, or Unix command for oraread; please check that all needed libraries are preloaded, and check the PATH for the wrappers #E TCOS 000029 04:05:22(007) Creation of step finished with status = FAILED解决方法:running 7.5x2 EE on the Windows platform1. cd to your C:AscentialDataStagePXEngineinstall 2. type sh 3. ORACLE_HOME=C:/Your_Oracle_Client 4. export ORACLE_HOME 5. APT_ORCHHOME=C:/Ascential/DataStage/PXEngine 6. export APT_ORCHHOME 7. sh install.liborchoracle then you will see the message on the screen; Installing Oracle Drvie Using C:/Your_Oracle_Client as ORACLE_HOME Installing drive for Oracle version 9i or 10g Oracel installation is complete. Reboot the machine after above is done2.12 DataStage SAP Stage的使用见附件: 2.13 Colum Import Stage的使用 将一个字段中的数据输出到多个字段中, 完成分割单个字段数据到多个字段的目的;输入数据应为定长或者有可以被识别的可分割的界限,必须是String或者Binary类型的,输出数据可以是任何数据类型;字段分割后:2.14 Colum Export Stage的使用与Column Import Stage相反,将多个类型不同的字段合并成一个string或者binary类型的字段合并字段后:2.15 Got ERROR: Cannot find any process number for stages in Job Jobname解决当我们用Director来ClearUp Resources 或 Clear Status File 时候,会出现上面的错误提示;原因是:incorrect permissions settings. Following correct settings were done to solve the problem: -rwsr-x-x 1 root dstage 1519616 Nov 13 2003 dsdlockd -rwsr-x-x 1 root dstage 1499136 Nov 13 2003 dslictool -rwsr-x-x 1 root dstage 3678208 Nov 13 2003 dstskup -rwsr-x-x 1 root dstage 1519616 Nov 13 2003 list_readu -rwsr-x-x 1 root dstage 1486848 Nov 13 2003 upduvtrans -rwsr-x-x 1 root dstage 53248 Nov 13 2003 uv -rwsr-x-x 2 root dstage 3796992 Nov 13 2003 uvbackup -rwsr-x-x 1 root dstage 49152 Nov 13 2003 uvdls -rwsr-x-x 2 root dstage 3796992 Nov 13 2003 uvrestore -rwsr-x-x 1 root dstage 16384 Nov 13 2003 uvsetacc Settings for all the above was found to be incorrect. dsadm was the owner instead of root and also permissions were incorrect.2.16 Unable to create RT_CONFIGnnn造成这种问题的最普遍的两个原因是:Is the file system on which your project directory exists full;Do you have write permission to your project directory2.17 查看job和client的对应的后台进程$ps -fu dsadmUID PID PPID C STIME TTY TIME CMD dsadm 11779 11776 0 09:02:02 ? 0:14 phantom DSD.StageRun loadDataDayAg. loadupdIRCashIVDayAg.xfm 3 0/0dsadm 1761 1760 2 08:56:27 ? 23:16 phantom DSD.RUN Batch:MasterControlOrderDetail. 0 ParameterFile=/var/opt/dat前者是Job stage thread,后者是Job main threaddsadm 29865 29863 0 Oct 25 ? 2:57 dsapi_slave 8 7 0 (User client database slave)2.18 强制杀死DS进程Cd $DSHOME/binlist_readups ef | grep username2.19 查看Server Engine的进程$netstat -a|grep uv or $netstat -a|grep dsrpc*.uvrpc *.* 0 0 24576 0 LISTEN-Daemon listener. .ESTABLISHED-Clients attached$ ipcs -Shared memory usage$ ps -ef |grep uni-Engine daemonroot 12970 1 0 Oct 09 ? 0:11 /opt/Ascential/DataStage/unishared/unirpc/unirpcd-Engine daemon2.20 查看Server Locks$ cd cat /.dshome $ . ./dsenv $ bin/uvsh-DSEngine command prompt上面的操作等同于DataStage Adminitratot-Projects(tab)-Command(button)DS.TOOLSVerb DS.TOOLS is not in your VOC. DS.TOOLS utility LOGTO yourprojectnameDS.TOOLS Which would you like? ( 1 - 6 ) ?5 Which would you like? ( 1 - 11 ) ?4LISTU-Users in DataStageLIST.READU-List lock table command上面操作等同于$DSHOME/bin/list_readuQUIT同样,在查看job pid及locks也可以通过datastage director-Jobs-Clearup Resources4,DataStage Filesystem Mount Points$ cd cat /.dshome $ df -k . 5,DataStage Engine Daemon $ cd /etc/rc2.d $ more S999ds.rc2.21 关于UNIX系统下无法启动服务的解决办法在诊断启动失败的原因之前,先说说如何停止服务。 启停服务的命令大家都知道,要注意的是停止服务之前应先确保无client连接、无端口连接:1. 使用ps -ef|grep ds 查看client连接情况,如果还有client连接,你又无法查找是谁,急需重启,可以通过director将所有的连接log off2. 使用netstat -a|grep dsrpc 查看网路连接状况,确保只有listen状态 这样,将服务停止,会很顺利的重启服务。 当执行完重启命令后,使用ps -ef|grep dsrpcd 查看服务是否启动,如果此服务没有启动,查看:1. ps查看有无client连接,杀掉进程。2. netstat查看网络情况,有无FIN_WAIT_2 or CLOSE_WAIT等的tcp状态,如果有,则使用ndd 命令调整datastage的端口连接,方法如下(如hp-unix):查找进程号:ndd -get /dev/tcp tcp_status |grep -e state -e FIN_WAIT_2 断开连接,释放端口:ndd -set /dev/tcp tcp_discon 0x+进程号 如果上述情况都核实后,仍启动失败 请使用 ./bin dsrpcd -d9 /tmp/dsrpcd.log 2&1 & 来启动服务,在 dsrpcd.log 文件中看到启动日志信息,根据实际情况解决。2.22 Locked by other user启动DataStag Director ,Job-Clearup Resources,在这个操作窗口中,首先选择窗口下部 Locks中的Show All,你可以看到窗口显示了所有lock的信息:PIDLock TypeItem Id。在Item Id的列表里找到你需要重新打开的job/routine和其对应的PID值。然后选择上半部分Processes中的Show All,鼠标选中刚才查到的PID,然后LogOut。 如果不使用Diretor,你可以在DS administrator中使用list.readu 或者DS.TOOLS command,同样会列出所有的lock信息。Thats Ok!2.23 dataStage Job Log的处理如何在操作系统层面上,使用command的到job log?在操作系统中我们可以使用engine(UNIX DSEngine)/bin 下的命令:dsjob -log -info | -warn dsjob -logsum -type -max -userid dsjob -lognewest -userid event type = INFO|WARNING|FATAL|REJECT|STARTED|RESET|BATCHdsjob -logdetail useid 可以编辑shell或者bat文件,将所有的job log输出。在datastage内部有其相应的function:DSGetLogEntryDSGetLogSummaryDSGetNewestLogId2.24 一些BASIC语言中处理字符串的函数a使用冒号:作为字符串连接的符号。例如:5A : _ : 2N 等价于字符串 5A_2N b使用中括号 来取出某个字符串的子串,其语法如下:expression start, length 例如:strA=abcdef , 那么strA1,3的意思就是从序号为1的字符开始,一共取出三个字符,其结果就是abc。BASIC语言中数组或者字符串的第一个元素的序号是1。 cCount (string, substring)用来计算字符串中的某个子串出现的次数。例如:计算字符串abacab中的子串ab出现的次数,arrCnt = Count(abacab, ab),那么arrCnt就等于2。 dLen (string) 用来计算字符串中包含的字符的个数。例如:Len(abc)的值就是3。 eTRIMF (string) 用来删掉字符串首部的空格。TRIMB (string) 用来删掉字符串尾部的空格。例如,字符串strA= abc ,其首尾各有多个空格。经过strA= TRIMF (strA)和strA= TRIMB (strA)这样的处理就可以除掉字符串首尾的所有空格了,其结果是abc。 fIndex (string, substring, instance) 用来得到字符串中的某个子串的位置。其中instance表示这个子串是在整个字符串中是第几次出现。例如:字符串为abacab,要计算子串ab第二次出现在字符串中的位置。Index (abacab, ab, 2 )的结果就是5。2.25 BASIC程序中使用到的一些语法知识(1). BASIC语言有四种符号用来标记注释,分别是REM,*,! ,$*。例如,*Initial. Validate the input parameters.这一行以*星号开头,就表示这一行内容是程序的注释。(2). 条件判断语句,其语法结构如下:If conditionThen statementsEndElse statementsEnd其中condition可以是一个数字,也可以是一个比较关系式。当条件为真时,程序执行Then后面的表达式;当条件为假时,则会执行Else后面的表达式。在Basic语言中,逻辑关系运算符是这样的: AND (或者符号 &),表示逻辑与的关系。 OR (或者 !),表示逻辑或的关系。 NOT,表示逻辑非的关系。例如:If bitCount arrCnt Then Ans=error bitValue: : bitCount :.Its value is too large. Call DSLogWarn(Ans,TransBitMask) GoTo ExitFuncEnd由BitValue转化而来的二进制数的位数大于子串的个数时,就在日志信息中告诉用户BitValue的值和OriStr的值是不可能一一对应的,输入的数据有错误。If BitValue = 0 AND Count(BitValue, .)=0 Then mask=Oconv(BitValue, MB)End Else Ans=error bitValue: : BitValue Call DSLogWarn(Ans,TransBitMask) GoTo ExitFuncEnd当输入变量BitValue的值大于零且不是小数的时候,就把它转化为二进制的数;否则为用户提出警告信息并且离开这个函数。(3). 使用BASIC自带的一些功能函数。Oconv(expression, conversion)其中expression表示一个字符串,conversion则表示这个字符串的输出格式。 Oconv(10, MB)的功能是把十进制数10,转化为二进制数1010;而 Oconv(10, MD1)的功能是把十进制数10的小数点左移一位,转化为1.0。 DSLogInfo (Message, CallingProgName)和DSLogWarn (Message, CallingProgName) 的功能十分相似,都是在执行Server Job的时候,输入一些必要的日志信息,帮助用户了解程序的执行情况。其中Message为输出的日志信息的内容,CallingProgName就是调用这个函数的程序名。区别在于DSLogInfo输出的仅仅是普通的日志信息,而DSLogWarn则是输出一些警告的信息给用户。例如:Ans=OriStr is blank, maybe there is no lights in this roomCall DSLogWarn(Ans,TransBitMask)Call DSLogInfo(OriStr: : OriStr : is valid,TransBitMask)(4). 两种循环条件语句a). ForNext语句,其基本语法如下:For variable = start To end Step incrementloop.statements Next variable其中start To end定义了变量变化的区间;而increment定义了每次变量增加的值,当start的值大于end的值,increment的值可以是负数。For num = 1 To arrCnt - bitCount mask = 0 : maskNext num如果二进制数的位数小于子串的个数,则在二进制数mask的前面补上0。比如,OriStr中有三个子串light_01,light_02,light_03,BitValue的值为2,把十进制的数2转化为二进制的数10。这时,二进制数的位数小于子串的个数,就需要在二进制数前面补上0,使其变成010才能和三个子串一一对应起来。b). LoopRepeat语句,其基本语法如下:LoopstatementsWhile | Until condition DostatementsRepeat其中,Loop定义了循环的开始,Repeat定义了循环的结束。While condition Do 的含义是,当条件为真的时候执行循环体中的代码。当条件为假的时候,退出循环。 Until condition Do 的含义正好相反,当条件为假的时候执行循环体中的代码。当条件为真的时候则退出循环。例如:pos = 1 start = 1 Ans= Loop While pos = arrCnt Do idx = Index(proStr,separator,pos) If maskpos,1 = 1 Then subStr = proStrstart,idx - start subStr=trim(subStr) *make sure every substring matches the specified pattern If subStr match 5A : _ : 2N Then Ans=Ans:,:subStr End Else Ans=error substri

温馨提示

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

评论

0/150

提交评论