#!/usr/bin/perl
###############################################################################
# zengst 2015-12-01
# 功能描述:将DB2规则检测明细按照二级机构生成明细文件
# 一个机构的下级数据需要通过机构的层级关系来递归获得
###############################################################################
use strict;
use DBI;
use Time::Local;
use File::Copy;
my $appmds="bohz_appmds";
my $TDCon;
my $DB2Con;
my $checkResult = 'EASTDQM.Check_Result';#轻度结果汇总表
my $checkDetail = 'EASTDQM.Check_Result_Detail';
my $ruleInfo='EASTDQM.rule';
my $RUNDATE=GetNowDate();#质量检查日期
#找到当前的日期,月份要加1,年份是从1900开始算的
sub GetNowDate{
my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime();
$mon = sprintf("%02d", $mon+1);
$day = sprintf("%02d", $day);
my $stime = ($year+1900)."-".$mon."-".$day;
return $stime;
}
#得到当前时间
sub GetNowTime{
my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime();
$hour = sprintf("%02d", $hour);
$min = sprintf("%02d", $min);
$sec = sprintf("%02d", $sec);
my $stime = $hour.":".$min.":".$sec;
return $stime;
}
#得到数据库链接
sub GetTDconnect(){
$TDCon = DBI->connect("dbi:ODBC:1.104", "dbc", "dbc") or "Can't connect to sample database: $DBI::errstr";
print "Connection is successful !!\n";
return $TDCon;
}
#得到DB2的连接
sub GetDB2connect(){
$DB2Con = DBI->connect("dbi:ODBC:ahnxods", "odsuser", "ytods") or "Can't connect to sample database: $DBI::errstr";
print "Connection is successful !!\n";
return $DB2Con;
}
#函数:Main
#主函数,用来循环记录集,并计算每一个字段
sub main
{
print (GetNowTime() . "......perl starting......:\n");
#先校验对数据库的联通是否都成功
$TDCon = GetTDconnect();
unless( defined($TDCon) ){
print (GetNowTime() . " Failed to execute GetTDconnect()\n");
return 1;
}
print (GetNowTime() . " GetTDconnect:Succeed\n");
$DB2Con = GetDB2connect();
unless( defined($DB2Con) ){
print (GetNowTime() . " Failed to execute GetDB2connect()\n");
return 1;
}
print (GetNowTime() . " GetDB2connect:Succeed\n");
#获得所有二级机构(农商行级别)的机构代码
my $level2OrgSQL = "select branch_id,branch_name from ${appmds}.tap_c_branch where branch_level=2 "
."and '${RUNDATE}' between start_dt and end_dt order by branch_id ";
my $TDsth = $TDCon->prepare($level2OrgSQL) or return -1;
$TDsth->execute() or return -1;
my ${org_Info} = $TDsth->fetchall_arrayref();
$TDsth->finish();
#每个农商行的机构及其下属机构的问题明细保存为一个文件
for my $i(0..$#${org_Info}){
my @currOrgAndBelow=();
my $currOrg=${org_Info}->[$i]->[0];
#$currOrg=s/^\s+|\s+$//g ;除去首尾空格
print "**************current org: $currOrg*************** \n";
#递归获得每一个二级机构的所有下级
my $belowLevelSQL =
"WITH RECURSIVE cte(id,name,pid) as(".
"select a.branch_id,a.branch_name,a.par_branch_id from ${appmds}.tap_c_branch a where branch_id='${currOrg}' union all ".
"select a.branch_id,a.branch_name,a.par_branch_id from ${appmds}.tap_c_branch a inner join cte c on c.id = a.par_branch_id)".
"select id,name,pid from cte order by pid";
my $belowLevelsth = $TDCon->prepare($belowLevelSQL) or return -1;
$belowLevelsth->execute() or return -1;
my @Fieldrow;
my $branchId;
while ( @Fieldrow = $belowLevelsth->fetchrow() ) {
$branchId = "$Fieldrow[0]";
#$branchName = "$Fieldrow[1]";
print "$branchId,$branchName\n";
#存储当前机构及其下属机构
push(@currOrgAndBelow,$branchId);
}
my $retStr = getInCondition(@currOrgAndBelow);
$belowLevelsth->finish();
#连接到远程DB2的环境,查询问题明细。问题明细表太大,不易导入到本地
#需要根据规则的导出标志设置来关联和校验信息
my $issueDetailSQL = "select * from ${checkDetail} d ".
" left join ${ruleInfo} r on d.check_id=r.check_Id".
"where rundate='${RUNDATE}' and r.isexport='Y' and org_id in $retStr ";
my $issueDetailsth = $DB2Con->prepare($issueDetailSQL) or return -1;
$issueDetailsth->execute() or return -1;
my $fileName = "D:/detail_".${currOrg}.".xls"
my $xls = Spreadsheet::WriteExcel::Big->new( "$fileName" );
$xls->compatibility_mode();
my $xlsSheet= $xls->add_worksheet( "$filename" );
my $titleStyle = $xls->add_format(size => 10,bold => 1,border => 2,align => 'center');
my $rowStyle = $xls->add_format(align => 'left',border => 1);
my $row = 0;
$xlsSheet->write( $row, 0, decode("gbk","检查编号") ,$titleStyle );
$xlsSheet->write( $row, 1, decode("gbk","检查运行日期") ,$titleStyle );
$xlsSheet->write( $row, 2, decode("gbk","系统代码") ,$titleStyle );
$xlsSheet->write( $row, 3, decode("gbk","表名") ,$titleStyle );
$xlsSheet->write( $row, 4, decode("gbk","字段名") ,$titleStyle );
$xlsSheet->write( $row, 5, decode("gbk","主键字段值") ,$titleStyle );
$xlsSheet->write( $row, 6, decode("gbk","字段值") ,$titleStyle );
my @detailRow;
while ( @detailRow = $issueDetailsth->fetchrow() ) {
$row ++;
$xlsSheet->write( $row, 0, decode("gbk",$detailRow[0]) ,$rowStyle );
$xlsSheet->write( $row, 1, decode("gbk",$detailRow[1]) ,$rowStyle );
$xlsSheet->write( $row, 2, decode("gbk",$detailRow[2]) ,$rowStyle );
$xlsSheet->write( $row, 3, decode("gbk",$detailRow[3]) ,$rowStyle );
$xlsSheet->write( $row, 4, decode("gbk",$detailRow[4]) ,$rowStyle );
$xlsSheet->write( $row, 5, decode("gbk",$detailRow[5]) ,$rowStyle );
$xlsSheet->write( $row, 6, decode("gbk",$detailRow[6]) ,$rowStyle );
}
$xls->close();
$issueDetailsth->finish();
print "**********************end******************\n";
}#for org block
return 0 ;
}#main block
my $rc = main();#函数的入口
#接收数组字符串,转换成sql查询的in的字符条件
sub getInCondition{
my @charArr=@_;
#数组的最大下标
my $arrLeng = $#charArr;
my $retStr = "('";
#这里是下标的循环
foreach my $i(0..$arrLeng){
if($i == $arrLeng){
$retStr = $retStr.@charArr->[$i]."')";
}else{
$retStr = $retStr.@charArr->[$i]."','";
}
}
return $retStr;
}
exit($rc);
相关推荐
本文将深入探讨如何利用编程技术进行Word和Excel的读写操作,以及如何通过递归算法生成管段。 首先,读写Word和Excel文件通常是通过API或者第三方库来实现的。对于Python开发者,可以使用`python-docx`库来操作Word...
在Python编程中,递归...综上所述,这个项目涉及了Python中文件系统操作、递归遍历、文本文件读写以及数据转换到Excel格式的相关知识。通过这个过程,我们可以学习到如何在实际项目中有效地管理和处理文件系统数据。
这包括工作簿(Workbook)、工作表(Worksheet)、范围(Range)等对象及其属性和方法,它们被用来操作Excel的内容。 综上所述,这个VBA应用展示了如何将数据库中的BOM数据转换为易于理解和分析的Excel格式,这对于...
在实际操作中,可以使用Python、VBA(Excel的内置宏语言)或者其他编程语言来实现这个过程。例如,使用Python的pandas库读取Excel数据,然后编写递归函数生成SQL语句。VBA则可以直接在Excel环境中运行,可能更便于...
本实例将探讨如何利用TreeView控件来显示Excel数据,并结合递归的思想进行加载。递归是一种强大的编程技巧,尤其适用于处理具有嵌套结构的数据。 首先,我们需要了解如何读取Excel数据。在C#中,可以使用`Microsoft...
本说明分析主要探讨的是如何将Excel公式语言通过递归替换展开回溯的方法自动转换为面向对象语言,从而提升代码的可维护性和复用性。 首先,我们需要理解递归替换的概念。递归是计算机科学中的一个重要概念,指的是...
SHA-1算法接收一个二进制数据块,通过一系列数学运算(包括位操作、异或、加法等)生成一个160位的哈希值,通常表示为40个十六进制字符。由于SHA-1具有单向性,即从哈希值恢复原始数据几乎不可能,所以它是安全的...
1. **文件操作**:易语言需要读取Excel文件,这通常通过操作Excel的二进制格式(如.xls或.xlsx)来完成。程序需要能够打开文件,读取数据,并保存排序后的结果。 2. **数据解析**:易语言程序需要能解析Excel文件中...
3. **Java与Excel交互**:通常使用Apache POI库来在Java中操作Excel文件(XLS和XLSX格式)。POI提供了API来创建、读取和修改Excel工作表,包括单元格数据、公式和样式。 4. **数据序列化和反序列化**:将NURBS数据...
标题 "批量搜索文件夹下的文件名-并导出EXCEL" 涉及到的知识点主要集中在文件系统操作和VBA编程技术上。在IT领域,这种任务通常是为了管理和整理大量分散的文件,提高工作效率。以下是对这个主题的详细解释: 1. ...
3. **文件夹的递归**:在Java中,处理文件系统时经常需要进行递归操作,特别是在遍历整个目录树时。可以使用`java.io.File`类的方法,如`listFiles()`,配合递归函数实现。当处理大量文件或文件夹时,递归可以帮助你...
在C#中,可以使用Microsoft.Office.Interop.Excel库来操作Excel对象,如Workbook、Worksheet和Range,获取需要的列数据。此外,可能还会用到流(Stream)和文本写入器(StreamWriter)等类来创建和写入新的数据文件...
`pandas`库用于创建和操作Excel文件,它是数据分析和处理的强大工具;以及`openpyxl`或`xlsxwriter`库,用于写入数据到Excel文件中。 ```python import os import pandas as pd ``` 项目的核心是遍历指定文件夹,...
3. 数据结构:使用递归关系表示的省市区镇层次结构,便于在数据库中进行查询和操作。 这个资源对研究中国地理分布、社会经济统计,或者开发需要地理位置信息的软件应用都非常有价值。无论是数据分析、数据可视化,...
VBA不仅允许我们直接操作Excel工作簿,还可以扩展到操作系统层面,进行文件和文件夹的管理。以下是一些关键的知识点,涵盖了如何利用VBA来操作文件夹: 1. **VBA的基本语法与环境**: 在Excel中,我们可以通过按下...
本案例主要探讨如何利用Python将文件夹中的文件信息整理到Excel表格中,实现文件管理的自动化。我们将深入讨论以下几个关键知识点: 1. **Python的文件系统操作**:在Python中,我们可以使用内置的`os`模块来与文件...
- **递归查询**:通过递归SQL查询或编程语言中的递归函数来处理树数据,如获取某个节点的所有子节点或祖先节点。 - **性能优化**:为了高效地处理大量数据,可以使用索引、缓存或分页策略。 3. **RzCheckTree与...
Excel 2010 VBA(Visual Basic for Applications)是一种强大的编程工具,它允许用户自定义Excel的功能,创建宏,以及构建复杂的自动化工作流程。VBA是Microsoft Office套件的一部分,使得用户能够通过编写代码来...
EPPlus是一个强大的.NET库,允许我们方便地操作Excel文件,而无需安装Microsoft Office。首先,安装EPPlus库(通过NuGet包管理器或命令行:`Install-Package EPPlus`)。 3. **填充Excel工作表**: - 初始化Excel...
综上所述,C#实现DataGridView转换为Excel涉及了对Office Interop组件的理解,以及对数据处理和文件操作的掌握。在实际开发中,开发者需要根据具体需求,灵活运用这些知识点,以满足用户对数据导出的需求。