`
zengshaotao
  • 浏览: 777420 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

递归查询-操作excel

 
阅读更多

#!/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的读写操作,以及如何通过递归算法生成管段。 首先,读写Word和Excel文件通常是通过API或者第三方库来实现的。对于Python开发者,可以使用`python-docx`库来操作Word...

    Python 递归遍历目录 生成excel

    在Python编程中,递归...综上所述,这个项目涉及了Python中文件系统操作、递归遍历、文本文件读写以及数据转换到Excel格式的相关知识。通过这个过程,我们可以学习到如何在实际项目中有效地管理和处理文件系统数据。

    所有BOM列表_VBA连接BOM表的递归展开至最后一阶_

    这包括工作簿(Workbook)、工作表(Worksheet)、范围(Range)等对象及其属性和方法,它们被用来操作Excel的内容。 综上所述,这个VBA应用展示了如何将数据库中的BOM数据转换为易于理解和分析的Excel格式,这对于...

    excel 递归导出 sql语句

    在实际操作中,可以使用Python、VBA(Excel的内置宏语言)或者其他编程语言来实现这个过程。例如,使用Python的pandas库读取Excel数据,然后编写递归函数生成SQL语句。VBA则可以直接在Excel环境中运行,可能更便于...

    TreeView控件绑定Excel数据实例(递归思想加载)

    本实例将探讨如何利用TreeView控件来显示Excel数据,并结合递归的思想进行加载。递归是一种强大的编程技巧,尤其适用于处理具有嵌套结构的数据。 首先,我们需要了解如何读取Excel数据。在C#中,可以使用`Microsoft...

    行业分类-外包设计-基于递归替换展开回溯的excel公式面向对象语言的自动转换方法的说明分析.rar

    本说明分析主要探讨的是如何将Excel公式语言通过递归替换展开回溯的方法自动转换为面向对象语言,从而提升代码的可维护性和复用性。 首先,我们需要理解递归替换的概念。递归是计算机科学中的一个重要概念,指的是...

    递归目录下文件生成SHA-1加密码,生成Excel文件

    SHA-1算法接收一个二进制数据块,通过一系列数学运算(包括位操作、异或、加法等)生成一个160位的哈希值,通常表示为40个十六进制字符。由于SHA-1具有单向性,即从哈希值恢复原始数据几乎不可能,所以它是安全的...

    易语言excel多列排序

    1. **文件操作**:易语言需要读取Excel文件,这通常通过操作Excel的二进制格式(如.xls或.xlsx)来完成。程序需要能够打开文件,读取数据,并保存排序后的结果。 2. **数据解析**:易语言程序需要能解析Excel文件中...

    Excel-nurbs-java_java_excel_

    3. **Java与Excel交互**:通常使用Apache POI库来在Java中操作Excel文件(XLS和XLSX格式)。POI提供了API来创建、读取和修改Excel工作表,包括单元格数据、公式和样式。 4. **数据序列化和反序列化**:将NURBS数据...

    操作xml和excel文件

    3. **文件夹的递归**:在Java中,处理文件系统时经常需要进行递归操作,特别是在遍历整个目录树时。可以使用`java.io.File`类的方法,如`listFiles()`,配合递归函数实现。当处理大量文件或文件夹时,递归可以帮助你...

    EXCEL小工具

    在C#中,可以使用Microsoft.Office.Interop.Excel库来操作Excel对象,如Workbook、Worksheet和Range,获取需要的列数据。此外,可能还会用到流(Stream)和文本写入器(StreamWriter)等类来创建和写入新的数据文件...

    python项目实例代码源码- Excel把文件夹整理到Excel中.zip

    `pandas`库用于创建和操作Excel文件,它是数据分析和处理的强大工具;以及`openpyxl`或`xlsxwriter`库,用于写入数据到Excel文件中。 ```python import os import pandas as pd ``` 项目的核心是遍历指定文件夹,...

    多种格式源2016全国省市区镇数据(excel表格,少部分递归,完整sql数据库备份)

    3. 数据结构:使用递归关系表示的省市区镇层次结构,便于在数据库中进行查询和操作。 这个资源对研究中国地理分布、社会经济统计,或者开发需要地理位置信息的软件应用都非常有价值。无论是数据分析、数据可视化,...

    Excel-VBA实用技巧范例-利用VBA标准功能操作文件夹.zip

    VBA不仅允许我们直接操作Excel工作簿,还可以扩展到操作系统层面,进行文件和文件夹的管理。以下是一些关键的知识点,涵盖了如何利用VBA来操作文件夹: 1. **VBA的基本语法与环境**: 在Excel中,我们可以通过按下...

    python 自动办公- Excel_案例_把文件夹整理到Excel中.zip

    本案例主要探讨如何利用Python将文件夹中的文件信息整理到Excel表格中,实现文件管理的自动化。我们将深入讨论以下几个关键知识点: 1. **Python的文件系统操作**:在Python中,我们可以使用内置的`os`模块来与文件...

    树的基本操作及递归树存取数据库及RzCheckTree转换为RzTreeView及cxgridband

    - **递归查询**:通过递归SQL查询或编程语言中的递归函数来处理树数据,如获取某个节点的所有子节点或祖先节点。 - **性能优化**:为了高效地处理大量数据,可以使用索引、缓存或分页策略。 3. **RzCheckTree与...

    批量搜索文件夹下的文件名-并导出EXCEL

    标题 "批量搜索文件夹下的文件名-并导出EXCEL" 涉及到的知识点主要集中在文件系统操作和VBA编程技术上。在IT领域,这种任务通常是为了管理和整理大量分散的文件,提高工作效率。以下是对这个主题的详细解释: 1. ...

    Excel2010 VBA教程素材

    Excel 2010 VBA(Visual Basic for Applications)是一种强大的编程工具,它允许用户自定义Excel的功能,创建宏,以及构建复杂的自动化工作流程。VBA是Microsoft Office套件的一部分,使得用户能够通过编写代码来...

    C# Treeview 导出Excel

    EPPlus是一个强大的.NET库,允许我们方便地操作Excel文件,而无需安装Microsoft Office。首先,安装EPPlus库(通过NuGet包管理器或命令行:`Install-Package EPPlus`)。 3. **填充Excel工作表**: - 初始化Excel...

    C#实现DataGridView转换为Excel(包括图片和文本).rar

    综上所述,C#实现DataGridView转换为Excel涉及了对Office Interop组件的理解,以及对数据处理和文件操作的掌握。在实际开发中,开发者需要根据具体需求,灵活运用这些知识点,以满足用户对数据导出的需求。

Global site tag (gtag.js) - Google Analytics