Excel中访问DB2 for z/OS
2013年9月27日 09:27 | Comments(0) | Category:Other | Tags:
安装一个DB2客户端,比如Data Server或者Toad for DB2
这样就可以创建ODBC数据源
通过ODBC访问并插入工作表:
Sub GetData() 'Define SQL query string to get the CategoryName field from 'the Category table. sqlstring = "SELECT * From ..." 'Define connection string and reference File DSN. connstring = "ODBC;DSN=DSNName" 'Create QueryTable in worksheet beginning with cell A1. With ActiveSheet.QueryTables.Add(Connection:=connstring, _ Destination:=Range("A1"), Sql:=sqlstring) .Refresh BackgroundQuery := False End With End Sub
.Refresh BackgroundQuery := False将会等待查询完成再继续操作,否则在后台完成查询
另一种方式:
执行查询并将结果返回到数组,要用到RecordSet对象:
'define connection and reference file DSN. strCon = "Driver={IBM DB2 ODBC DRIVER};Database=DBName;Hostname=" & serverAddress & ";Port=1234;Protocol=TCPIP;Uid=xxx;Pwd=xxx;" Set dbCon = CreateObject("ADODB.Connection") dbCon.Open strCon 'define sql stmt strSql = "SELECT NAME From SYSIBM.SYSCOLUMNS WHERE TBNAME = '" & tabName & "' AND TBCREATOR = '" & schemaName & "' ORDER BY COLNO;" Set rstRecordset = CreateObject("ADODB.Recordset") rstRecordset.Open strSql, dbCon, 0, 1, 1 ' Get records into array vArray = rstRecordset.GetRows Set rstRecordset = Nothing For i = LBound(vArray, 2) To UBound(vArray, 2) Msbbox vArray(0,i) Next i ' Clean up Erase vArray
z/OS的ftp命令控制文件格式为Unix
2013年9月23日 12:22 | Comments(0) | Category:Other | Tags:
如果需要ftp下载的文件为LF结尾,而不是CRLF则用这个命令
单字节编码:
quote site SBSENDEOL=X
多字节编码:
quote site MBSENDEOL=X
X可是是LF,CRLF,NONE等
不过GNU ftp不能正确使用这个subcommand,反而Windows上的ftp可以正确执行,很奇怪的问题
z/OS中REXX调用USS
2013年9月11日 16:12 | Comments(1) | Category:Other | Tags:
配合syscalls,可以很灵活的调用USS(Unix System Services)命令:
比如打开一个文件并获取文件描述符,写入关闭文件:
tabval="/path/to/file" /*open tabval file*/ call syscalls 'ON' address syscall 'open' tabval, O_rdwr+O_creat+O_trunc, 660 if retval=-1 then do say 'E03: Validation file not opened, err code ' errno errnojr return end /*get fd*/ fd=retval rec="Hello World!" 'write' fd 'rec' length(rec) 'close' fd call syscalls "OFF"
调用Unix命令:
cmd = "ls -l"
call bpxwunix cmd,,,cperr.
say cperr.1
bpxwunix有四个参数,分别是执行的命令,标准输入 ,标准输出,标准出错
EBCDIC含有双字节字符转换编码的问题
2013年9月11日 15:40 | Comments(0) | Category:Other | Tags:
主机上的EBCDIC编码还有双字节字符(DBCS)时,比如IBM-1388中文扩展码,通过iconv或者ftp的quote type b 9转换成cp936编码
由于输入中文时,默认会在中文字符开始前加上x'0E',结尾加上x'0F',如果0E和0F不匹配则会转换出错,
比如缺少0F,则转换程序认为从0E开始,直到下一个0F之间的所有内容都是中文
可以用REXX脚本查找不匹配的0E或者0F,并纠正问题即可正常转换了:
pos('0E'x,in.recid,startcol)
Vim中匹配中文
2013年8月30日 17:56 | Comments(0) | Category:Other | Tags:
先记录下来,简单的匹配: [^\x00-\xff],也就是除ASCII字符外的字符
当然不够精确,以后找到更好的办法再更新.
配置Cygwin的cron
2013年8月01日 13:11 | Comments(0) | Category:Other | Tags:
Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec
Reenter:再次键入密码
配置完成后
安装Cron服务
cygrunsrv -I Cron -p /usr/sbin/cron -a -n
cygrunsrv -I Cygserver -p /usr/sbin/cygserver -e "CYGWIN=server"
安装cygwserver使不运行Cygwin也能在后台定时执行cron中定义的脚本或者命令
启动cron:
cygrunsrv -S Cron
cygrunsrv -S Cygserver
卸载服务
cygrunsrv -R Cron
脚本中涉及文件路径时写全局路径
脚本执行要用到java或其他环境变量时,通过source命令引入环境变量
主机模拟终端中粘贴后自动移动光标到粘贴内容结尾
2013年8月01日 11:03 | Comments(2) | Category:Other | Tags:
Aviva:
Sub Main() Dim RowColObj as RowCol Set RoWColObj = PS.GetCursorLocation Row% = RoWColObj.Row Column% = RoWColObj.Column ClipText$ = Clipboard.GetText(1) TextLen$ = Len(ClipText$) Mod 80 Column% = Column% + TextLen$ Column% = Column% Mod 80 rc% = PS.SetCursorLocation(Row%,Column%) End Sub
Personal Communicaton:
[PCOMM SCRIPT HEADER] LANGUAGE=VBSCRIPT DESCRIPTION= [PCOMM SCRIPT SOURCE] OPTION EXPLICIT autECLSession.SetConnectionByName(ThisSessionName) REM This line calls the macro subroutine subSub1_ sub subSub1_() autECLSession.autECLOIA.WaitForAppAvailable autECLMacro "[edit-paste]" autECLMacro "[end field]" end sub
Personal Communicaton版本可以参考Avivia做一些调整,达到更好的效果, 上面这段代码移动光标会移动到一个字段结尾: end filed.
下面这个版本则计算需要移动长度,调用setpos移动光标:
[PCOMM SCRIPT HEADER] LANGUAGE=VBSCRIPT DESCRIPTION=This macro call edit-paste and move cursor to end of paste context 'Author: Ricky Ng 'Version: 0.1 [PCOMM SCRIPT SOURCE] OPTION EXPLICIT autECLSession.SetConnectionByName(ThisSessionName) Main Sub Main() Dim strLen, i Dim objHTML, strCopy 'get clipboard context length autECLSession.autECLOIA.WaitForAppAvailable Set objHTML = CreateObject("htmlfile") strCopy = objHTML.ParentWindow.ClipboardData.GetData("text") strLen = Len(strCopy) 'paste and move cursor autECLMacro "[edit-paste]" 'cal move count and set cursor postion like this: autECLSession.autECLPS.SetCursorPos x,x autECLSession.autECLPS.WaitForCursor x,x,10000 End Sub
Tag: Move cursor after paste automatically for TN 3270, mainframe terminal, ISPF, TSO
Vim中搜索各种资源的强大插件
2013年6月25日 11:09 | Comments(5) | Category:Vim | Tags:
https://github.com/Shougo/unite.vim
Unite基本可以替换fuzzyfinder和 lookupfile
Unite中的file, buffer, *mru, register等等,Vim中的各种资源都可以即时搜索并调用,更重要的是Unite提供了集成接口,可以直接添加你需要的各种资源,这样就可以替换掉fuzzyfinder了
加上unite-tag就可以实现lookupfile的功能
https://github.com/tsukkee/unite-tag
甚至可以调用find/grep并将结果集传递回Vim,方便各种操作.
更多强大的功能参考http://bling.github.io/blog/2013/06/02/unite-dot-vim-the-plugin-you-didnt-know-you-need/
Vim中实时检查COBOL语法错误
2013年6月24日 10:20 | Comments(0) | Category:COBOL | Tags:
需要安装https://github.com/scrooloose/syntastic/ 目前只有gcc-refactor这个分支支持COBOL语法检查
OpenCobol: http://www.opencobol.org
安装后将OpenCobol编译器路径加入PATH系统环境变量即可
:SyntasticCheck命令即可检查语法错误
移动光标到左边>>符号那一栏,状态栏即会显示编译错误
每次保存后Syntastic会自动调用编译器检查
Http proxy设置时遇到密码中的特殊符号
2013年6月19日 15:42 | Comments(1) | Category:Other | Tags:
export http_proxy='http://<Americas\Username>:<Password>@proxy.foo.com'
当密码中有@符号时,需要用URL-encoding代替,比如@替换成%40,折腾了好久
设置Everything用TC或者FC打开文件夹
2013年6月17日 16:27 | Comments(0) | Category:Other | Tags:
Everything用来搜索文件或者文件夹比起资源管理器实在方便太多,如果能配合Total Commander或者Free Commander那就更强大了
修改everything.ini,加入两行:
TC:
open_folder_path_command=$exec("D:\Program Files\Total Commander\TOTALCMD.exe" "/O" "/T" "$parent(%1)")
open_folder_command=$exec("D:\Program Files\Total Commander\TOTALCMD.exe" "/O" "/T" "%1")
"/O" "/T"表示在新标签中打开,并且需要设置TC只运行一个实例.
FC:
open_folder_path_command=$exec("D:\Program Files\FreeCommander\FreeCommander.exe" "/C" "$parent(%1)")
open_folder_command=$exec("D:\Program Files\FreeCommander\FreeCommander.exe" "/C" "%1")
具体可以参看FC命令行帮助
另外还可以设置快捷键在TC中调用Everything来搜索文件: http://searun.iteye.com/blog/363722
Windows上编译运行COBOL:Open COBOL
2013年6月05日 16:09 | Comments(4) | Category:COBOL | Tags:
http://www.opencobol.org/ 基于C语言的开源COBOL编译器,当然不只是编译,还可以运行,支持部分COBOL 85/2002标准.
我是在Cygwin编译安装的,Windows应该可以用MingW.
./configure
make
make install
即可.
Hello World:
---- hello.cob ------------------------- *Sample COBOL program IDENTIFICATION DIVISION. PROGRAM-ID. hello. PROCEDURE DIVISION. DISPLAY "Hello World!". STOP RUN. ----------------------------------------
cobc.exe -x hello.cob
./hello.exe
cobc.exe --help可以查看更多帮助信息.
将所有字符加密成URLEnCode
2013年5月24日 17:13 | Comments(0) | Category:Other | Tags:
SSIS中生成日期
2013年5月17日 14:22 | Comments(0) | Category:Other | Tags:
GetDate()返回带时间的日期格式,如果只需要日期部分则需要转换,这时候cast/convert则无法使用了,
可用如下办法生成系统时间前一天日期的整数形式:
DATEPART("yyyy",(DT_DBDATE)DATEADD("day",-1,GETDATE())) * 10000 +
DATEPART("mm",(DT_DBDATE)DATEADD("day",-1,GETDATE())) * 100 +
DATEPART("dd",(DT_DBDATE)DATEADD("day",-1,GETDATE()))
当然需要字符串格式则很简单了:
(DT_WSTR,30)(DT_DBDATE)(dateadd("d",-1,getdate()))
如果需要不同的形势,拼接就可以了:
(DT_STR,4,65001)DATEPART("yyyy", GetDate() ) +
RIGHT("0" + (DT_STR,4,65001)DATEPART("mm", GetDate() ), 2) +
RIGHT("0" + (DT_STR,4,65001)DATEPART("dd", GetDate() ), 2)
参考
http://www.w3school.com.cn/sql/func_convert.asp
SSIS导入平面文件到数据库的UTF-8编码问题
2013年5月16日 16:29 | Comments(0) | Category:Other | Tags:
平面文件是UTF-8编码,导入的时候遇到cannot convert between unicode and non-unicode问题
1. 目标表是VARCHAR, 则平面文件列类型为String [DT_STR], 并且设置AlwasyUseDefaultCodePage True, 默认编码用65001(UTF-8)
2. 目标表是NVARCHAR, 则平面文件列类型设置为Unicode_String [DT_WSTR]即可
Vim中带有中文字符的指定列自动换行
2013年4月10日 10:22 | Comments(3) | Category:Vim | Tags:
设置textwidth为指定列宽: set tw=72
设置中文formatoptions: set fo+=Mm
替换命令:
:%s/\(\%73c.\)/\r\1/g
这样就会自动在72列后换行了
全英文的就很简单了,进入visual模式后gq就可以了
DB2 load命令导致的表空间暂挂状态
2013年3月27日 11:40 | Comments(2) | Category:DB | Tags:
db2 load不加nonrecoverable可能导致table space变为backup pending状态,联机或者脱机备份表空间即可
db2 "backup db bcudb tablespace (USERSPACE1) [online] to /dev/null without prompting"
lftp上传、下载整个目录
2013年3月19日 12:04 | Comments(0) | Category:Other | Tags:
lftp连接成功后:
mirror -R <local dir>
上传本地目录
mirror -R <remote dir><local dir>
下载整个远程目录
数据库使用技巧
2013年2月28日 15:51 | Comments(0) | Category:DB | Tags:
命令行中调用DB2执行语句并返回结果
$var=$(db2 -x "select statement")
Orcle调用sqlplus并执行带有参数的SQL文件
sqlplus $userName/$password@$tnsName @$sqlFolder/$ex.sql $parms
当然需要设置环境变量
export ORACLE_HOME=/u01/app/oracle/product/oraprod
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$ORACLE_HOME/bin:$PATH
Oracle执行SQL文件并导出数据的设置:
set echo off ;
set feedback off;
set heading off ;
set verify off ;
set trimspool off ;
set pages 0;
set newpage 0;
set linesize 300;
set arraysize 1000;
set termout off;
whenever sqlerror exit SQL.SQLCODE;
whenever oserror exit 1;
arraysize控制每次从服务器返回结果大小,可以加快获取结果的速度,termout关闭屏幕输出。
whenever用于控制命令中断,可以是sqlerror或者oserror,并返回SQLCODE给命令行。
DB2诊断存储过程错误:
SELECT * FROM SYSCAT.TABLES WHERE TBSPACEID = 2 AND TABLEID = 50
SELECT * FROM SYSCAT.COLUMNS WHERE TABNAME= '*******' AND COLNO = 8
select PROCNAME from SYSCAT.PROCEDURES where PROCSCHEMA='SCHEMA'
Oracle查看当前schema并设置
select sys_context('userenv', 'current_schema') from dual;
alter session set current_schema = sys;
Cognos中的日期提示自动设置默认值
2013年2月26日 15:07 | Comments(2) | Category:BI | Tags:
极品客户当然有极品的要求:
1. 不能有弹出页面
2. 不能自动提交
3. 日期提示默认为系统日期前一天
弄了一下午终于找到解决办法:
日期提示添加HTML项目,并加入如下javascript:
<script> function init() { var dtToday = new Date(); var dtYesterday = new Date( dtToday - 86400000 ); var strYesterday = [dtYesterday.getUTCFullYear(), dtYesterday.getMonth()+1, dtYesterday.getDate()].join("-"); pickerControlvarDate.setValue(strYesterday); } </script> <body onload = init() >
当然Cognos报表页面的日提提示需要命名为varDate, onload = init()是在页面初始化的时候运行一次,之后用户可以自行选择日期。
为了实现不能自动提交还得设置一个默认值,比如选择一个历史时间,比如2011-10-16,然后查询中加入过滤器:
[DATE]=to_number(to_char(trunc(if(cast(?varDate?,varchar(10)) ='2011-10-16' )then(_add_days(current_date, -1)) else(?varDate?),'dd'),'yyyymmdd'))
基本原理就是和默认值比较,如果相同就设置为前一天,否则用日期提示参数的日期。
这样就大功告成了。
有时候有的报表onload=init()不起作用,所以一打开报表就是设置的默认时间,即使在javascript加上window.onload=init()也有问题,
每次运行完报表,用户选的时间是起作用了,可是日期提示显示的时间还是设置的默认时间,造成混乱。
没办法,搜索了很久找到了这个,都是没有javascript基础害的:
var curDate = pickerControlpDate.m_oForm.value;
然后和默认值比较就可以判断什么时候该设置为前一天,什么时候该保留用户选择的时间了:
<script> var dtToday = new Date(); var dtYesterday = new Date( dtToday - 86400000 ); var strYesterday = [dtYesterday.getUTCFullYear(), dtYesterday.getMonth()+1, dtYesterday.getDate()].join("-"); var curDate; var curDate = pickerControlpDate.m_oForm.value; if (curDate == '2011-10-16') { pickerControlpDate.setValue(strYesterday); } </script>
当然这样什么onload,init都是浮云了。
下拉框值提示更改默认值
<script language="JavaScript">
function setDefaultymthValue()
{
try
{
var fW = (typeof getFormWarpRequest == "function" ? getFormWarpRequest() : document.forms["formWarpRequest"]);
var calendar = new Date();
var year = calendar.getYear();
var month = calendar.getMonth();
if ( !fW || fW == undefined)
{ fW = ( formWarpRequest_THIS_ ? formWarpRequest_THIS_ : formWarpRequest_NS_ );}
if (fW)
{
fW._oLstChoicesymth[2].text = year;
}
}
catch(e)
{
return;
}
}
setTimeout("setDefaultymthValue()", 1);
</script>