如何通过CLI自动化生成Progress OpenEdge数据字典详细表报告?
自动化生成OpenEdge Data Dictionary详细表报告方案
需求背景
我开发了一个查询工具网站,可将Data Dictionary生成的详细表报告通过PHP解析为可用的JSON数据,再用JS/HTML/CSS以美观表格形式展示。原本希望通过cron调度自动化生成详细表定义文件,复制到网站目录后处理为便于查询的数据文件,但找不到Data Dictionary的CLI调用方式,又不想从头编写代码生成报告,最终实现了基于bash脚本和OpenEdge过程的多数据库自动化生成方案。
实现方案
1. Cron调用的Bash脚本
该脚本负责遍历目标数据库列表,调用OpenEdge的mbpro执行对应的过程文件,批量生成每个数据库的详细表报告:
#!/bin/bash progress_mbpro=/usr/128dlc/bin/mbpro projectDir=/a/b/c procFilePath=$projectDir/getDetailedTableReportForDb.p outputLog=$projectDir/stdout.log errorLog=$projectDir/errout.log envPath=/x/y/z databases=( 'db1' 'db2' ... ) for db_name in "${databases[@]}"; do paramFile=$envPath/$db_name.pf dbPath=$envPath/db/$db_name $progress_mbpro $dbPath -pf $paramFile -p $procFilePath -param $db_name >> $outputLog 2>> $errorLog # 等待10秒避免输出缓冲区重叠 sleep 10 done
2. OpenEdge过程文件 getDetailedTableReportForDb.p
该过程通过调用OpenEdge内置的adecomm/_dtbldat.p(Data Dictionary的内置过程),生成指定数据库的全量详细表报告并写入文件:
var input-db-name as char. input-db-name = SESSION:PARAMETER. def var v-reportFilePath as char. v-reportFilePath = '/x/y/z/' + input-db-name + '.detailed.all-tables.def'. define new shared stream rpt. find first _Db no-lock. if available _Db then do: output stream rpt to value(v-reportFilePath) page-size 0. // 生成详细表数据报告 run adecomm/_dtbldat.p( input recid(_Db), input 'ALL', // 生成所有表的报告 input 'o' // 将输出导向指定流 ). output stream rpt close. end.
后续处理
由于Data Dictionary生成的报告格式一致、标注清晰且具有规律性,编写PHP代码对报告进行解析并转换为JSON数据的工作并不复杂。
内容的提问来源于stack exchange,提问作者Troy Niemeier
相关产品推荐
相关产品推荐

