ActivityManagerレポートジェネレーター。 別の自転車、ただしプロファイル

ActivityManagerは、テンプレート文字列の置換に基づくレポートマネージャーです。

ActivityManagerの主な機能は次のとおりです。





ActivityManagerを使用したレポート構成は、データ選択、処理、レポート生成の3つの部分に直接分割できます。 各段階の詳細については、関連するセクションを参照してください。



用語集





構成ファイルの構造



レポート構成ファイルは、次の形式の通常のxmlファイルです。



<?xml version="1.0" encoding="utf-8"?> <activity> <plugins> <include>ConvertModule.dll</include> ... </plugins> <language>ru</language> <step plugin="SqlDataSource" action="SqlSetConnectionString" repeat="1"> <input> <parameter name="connectionString">dsn=registry</parameter> </input> </step> <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query">SELECT * FROM executors;</parameter> </input> <output> <parameter name="table">new_table</parameter> </output> </step> ... </activity>
      
      







レポート構成ファイルの大部分はステップで占められています。 これらの手順は基本的に、レポートの生成に関連する手順を表しています。データサンプリング、データ処理、レポート構成、データソースなどです。 ステップは、実行するアクション、入力<input />および出力<output />パラメーター、およびこのステップを実行する回数を示すrepeatパラメーターを含むプラグインのプラグイン名で構成されます(デフォルトは1)。 各入力パラメーターには、名前名と値(コンテンツ)があります。 各出力パラメーターには、デフォルトの名前name <および名前の再定義(コンテンツ)があります。 このパラメーター名を使用して、レポートを生成する後続のステップで、グローバルパラメーターコレクションからその値を取得できます。 グローバルパラメータのコレクションの詳細については、「パラメータを渡す」セクションを参照してください。



構成ファイルの上部には、<plugins />ブロックがあります。 このブロックには、実行時にダウンロード可能なプラグインのリストが含まれます。 プラグインはデフォルトでplugins \ディレクトリにあります。 <language />ブロックは、レポート生成中に(ほとんどの場合エラーについて)メッセージが表示される言語を示します。 現在、ロシア語と英語の2つの言語がサポートされています。 言語翻訳はlang \ディレクトリにあります。

構成ファイルの構造は単純ですが、手動で編集するのは面倒です。 そのため、特別な構成ファイルエディタが開発されました。 詳細については、「ビジュアルファイルエディター」セクションをご覧ください。



提供されるプラグイン



ActivityManagerのデフォルトの配信には、6つの基本プラグインと1つのカスタムプラグインが含まれています。





パラメータを渡す



コマンドラインオプション



レポート生成を開始するとき、カーネル(ActivityManager.exe)は次の形式で必要な構成パラメーターを1つ渡す必要があります。



 ActivityManager.exe config="c:\1.xml"
      
      





その結果、ActivityManager.exeはパスc:\ 1.xmlにある構成ファイルを読み取り、レポートを生成します。

必須の構成パラメーターに加えて、ActivityManagerにlangパラメーター、メッセージの実行中に表示されるメッセージの言語(ほとんどの場合、レポート生成中に発生したエラー)を渡すことができます。



基本パラメーターconfigおよびlangに加えて、ActivityManager 、グローバルランタイムパラメーターのコレクションに配置され、レポート生成中に使用できる他のパラメーターいくつでも受け入れることができます。 例:



 ActivityManager.exe config="c:\1.xml" connectionString="dsn=registry" id_process=318
      
      





このコマンドを実行した結果、connectionStringおよびid_processパラメーターはグローバルランタイムパラメーターのコレクションに分類され、データソースとの接続、選択、およびレポートの他のステップで使用できます。 実行時にこれらのパラメーターを使用する方法については、次のセクションを参照してください。



グローバルランタイムパラメータ



グローバルランタイムパラメーターのコレクションは、レポート生成の任意のステップで使用できる名前付き変数のリストです(ただし、このステップでパラメーターが既に使用可能になっている場合)。

パラメーターは、次の2つの場合にこのコレクションに書き込まれます。





グローバルパラメータを使用するには、パラメータ名を角括弧で囲む必要があります。 パラメータの値をプリプロセッサに渡す前に、プリプロセッサは角かっこで囲まれたテンプレートがコレクション内のパラメータと一致するかどうかを確認し、名前で一致するものが見つかった場合、それを置き換えます。

たとえば、次のようにレポート生成を開始したとします



 ActivityManager.exe config="c:\1.xml" connectionString="dsn=registry" id_process=318
      
      





次に、実行時に、渡されたコマンドライン引数を次のように使用できます。



 <step plugin="SqlDataSource" action="SqlSetConnectionString" repeat="1"> <input> <parameter name="connectionString">[connectionString]</parameter> </input> </step> <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query">SELECT * FROM tenancy_processes WHERE id_process = [id_process]</parameter> </input> <output> <parameter name="table">tenancy_processes</parameter> </output> </step> <step plugin="ReportModule" action="ReportSetTableValue" repeat="1"> <input> <parameter name="table">[tenancy_processes]</parameter> <parameter name="xmlContractor">Row</parameter> </input> </step> <step plugin="ReportModule" action="ReportGenerate" repeat="1"> <output> <parameter name="fileName"></parameter> </output> </step>
      
      







ご覧のとおり、SqlSetConnectionStringの最初のステップ(接続文字列の設定)で入力パラメーターに[connectionString]が示されます。これは、グローバルパラメーターのコレクションからこのパラメーターを取得する必要があることをプリプロセッサに伝えます。 角かっこ内のパラメーターがグローバルパラメーターコレクションで見つからない場合、エラーメッセージは生成されません。 ActivityManagerは、この行がパラメーターではないことを理解し、変更しないままにします。



SqlSelectTableステップの出力パラメーターに注意してください



 <output> <parameter name="table">tenancy_processes</parameter> </output>
      
      





このレコードは、要求の実行後、ソースからのデータがtenancy_processesという名前でグローバルパラメーター領域に保存され、[tenancy_processes](ReportSetTableValueの次のステップで実行)からアクセスできることを意味します



 <input> <parameter name="table">[tenancy_processes]</parameter> <parameter name="xmlContractor">Row</parameter> </input>
      
      





単純型のパラメーター(文字列、数値、日付など、つまり、Convert.ChangeTypeを使用して文字列型System.Stringからターゲットに一意に変換できるすべての型)の置換は、置換モードで実行されます。 つまり パラメータを全体ではなく、値の一部として指定することは完全に受け入れられます。 例:



 <input> <parameter name="query">SELECT * FROM tenancy_processes WHERE id_process = [id_process]</parameter> </input>
      
      





文字列表現から明確に変換できないより複雑な型のパラメータは、直接置換されます。 このようなパラメーターでは、定義により部分的な置換はできません。



グローバルコレクションからのパラメーターの置換は、入力アクションパラメーターでのみ実行されます。



データサンプリング



レポートを生成する前に、データを取得する必要があります。 現時点では、.Netプロバイダーが存在するDBMSとCSV形式のテキストファイルは、ActivityManagerのデータソースとして機能します。 残念ながら、XMLのネイティブデータソースはまだありません。



説明されているソースのいずれかからデータをフェッチした結果は、スカラー型またはReportTable型のオブジェクトになります。



SQLデータソース



SQLデータソースを操作するために、SqlDataSource.dllプラグインが設計されています。

このプラグインを使用して、ODBCデータソースからデータを取得する簡単な例:



 <step plugin="SqlDataSource" action="SqlSetConnectionString" repeat="1"> <input> <parameter name="connectionString">dsn=registry</parameter> </input> </step> <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query">SELECT * FROM executors;</parameter> </input> <output> <parameter name="table">new_table</parameter> </output> </step>
      
      







この例の最初のステップでは、接続文字列が設定されます。 2番目は、executorsテーブルからデータがサンプリングされ、new_tableというテーブルにデータが書き込まれます。 その後、ConvertModule.dllプラグインを使用してそれらにさまざまな変更を加えるか、レポートに直接送信できます。

ODBCはSqlDataSourceでデフォルトプロバイダーとして使用されますが、.Netでサポートされるプロバイダーはすべて許可されます。 プロバイダーをインストールするには、SqlSetProvider関数を使用します。 たとえば、OLE DBプロバイダーのインストール方法は次のとおりです。



 <step plugin="SqlDataSource" action="SqlSetProvider" repeat="1"> <input> <parameter name="name">OLE</parameter> </input> </step>
      
      





ここで、nameパラメーターはプロバイダーの完全または短い不変名です。 次のように、完全に不変の名前を指定する必要はありません。 名前の一致は明確ではありません(パターンによる)。 たとえば、MS Sql Server(System.Data.SqlClient)の完全に不変の名前の代わりに、次を指定できます。



 <step plugin="SqlDataSource" action="SqlSetProvider" repeat="1"> <input> <parameter name="name">SQL</parameter> </input> </step>
      
      





または例えば



 <step plugin="SqlDataSource" action="SqlSetProvider" repeat="1"> <input> <parameter name="name">SqlClient</parameter> </input> </step>
      
      





サポートされるプロバイダーの完全なリストは、レポートが生成されるマシンによって異なり、DbProviderFactories.GetFactoryClasses()メソッドを介して取得できます。

SqlSetProviderアクションとSqlSelectTableアクションに加えて、SqlDataSourceプラグインにはさらに8つのアクションがあります。 それらの完全なリストは、 プロジェクトwikiにあります。



CSVデータソース



DBMSとの連携に加えて、ActivityManagerはCSVファイルからのデータの選択と変更をサポートしています。 ODBCを介したMicrosoft Text Driverに加えて、CSVファイルからデータを選択するために、MySQL構文に基づく組み込みテキストドライバーを使用してデータを選択する機能がサポートされています。

たとえば、次の内容の2つのCSVファイルusers.csvとuser_actions.csvがあるとします。

users.csv:



 id|surname|name|patronymic 1||| 2|||
      
      





user_actions.csv:



 id_user|action 1|1 1|2 1|3 2|4
      
      





各ユーザーのアクションの数を選択する必要があります。

CSVからのデータサンプリングステップの構成は次のようになります。



 <step plugin="TextDataSource" action="TextSelectTable" repeat="1"> <input> <parameter name="query"> SELECT a.surname, a.name, a.patronymic, COUNT(*) AS record_count FROM [csv_path]users.csv a LEFT JOIN [csv_path]user_actions.csv b ON a.id = b.id_user GROUP BY a.id </parameter> <parameter name="columnSeparator">|</parameter> <parameter name="rowSeparator"></parameter> <parameter name="firstRowHeader">true</parameter> <parameter name="ignoreDataTypes">true</parameter> </input> <output> <parameter name="table"></parameter> </output> </step>
      
      







このクエリの結果は、名前テーブルの下のグローバルパラメータコレクションに保存されます。

TextSelectTableアクションに加えて、TextDataSourceプラグインにはさらに2つのアクションがあります:TextSelectScalarとTextModifyQuery、 プロジェクトwikiで見つけることができる詳細情報。



データ変換



多くの場合、ソースからサンプリングした後、最終レポートに書き込む前にデータをフォーマットする必要があります。 これには、DBMSレベルでの複雑な変換のサポートの欠如から、SQLクエリを読みにくいシートに変える多くの不必要な条件で「ダーティ」にしたがらないことから、これには多くの理由があります。

ActivityManagerでのこのようなデータ変換には、ConvertModule.dllプラグインが使用されます。

以下に、このプラグインを使用してデータを使用してできることのリストを示します。





データ形式の変換機能をより詳細に検討してください。 すべてのデータ変換関数を分類できます。



変換するデータのタイプごと:





入力および出力パラメーターのタイプ別:



整数変換



前述のように、ConvertIntToString、ConvertIntCellToString、ConvertIntColToStringの各アクションは、整数の変換に使用されます。 入力パラメータと出力パラメータのタイプが異なるだけであるため、それぞれを詳細に検討することはしません。 数字をテキスト表現に変換する簡単な例を考えてみましょう。 データベーステーブルからいくつかの数値を選択し、次の規則に従ってテキストの外観にする必要があるとします。すべての数値は親の場合、数値のテキスト表現の末尾は女性的、数値は定量的である必要があります。序数、結果の数値のテキスト表現の最初の文字は大きくなければなりません。 まず、変換するデータを取得する必要があります。 これがどのように行われるかは以前に示されました。



 <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query"> SELECT 1 AS int_column UNION SELECT 13013 UNION SELECT 55132111 UNION SELECT 1055132111 </parameter> </input> <output> <parameter name="table"></parameter> </output> </step>
      
      







このアクションの結果として、タイプReportTableのオブジェクトは、値1、13013、55132111、1055132111を持つ行を含む1つのint_column列を含むグローバルオブジェクトのコレクションに格納されます。



上記の要件に従って、変換自体は次のように実行できます。



 <step plugin="ConvertModule" action="ConvertIntColToString" repeat="1"> <input> <parameter name="inTable">[table]</parameter> <parameter name="column">int_column</parameter> <parameter name="textCase">Genitive</parameter> <parameter name="sex">Female</parameter> <parameter name="firstCapital">true</parameter> <parameter name="isOrdinal">false</parameter> </input> <output> <parameter name="outTable">table</parameter> </output> </step>
      
      







その結果、次の意味を持つテーブルと呼ばれるテーブルを取得します:「1」、「13万1万13」、「5千5百13万2千11 11」、「10億5千5百13万2千11 11」。



inTableパラメーターとoutTableパラメーターは同じReportTableタイプであることに注意してください。 この場合、出力パラメーターは入力パラメーターと同じ名前を持つため、グローバルパラメーターコレクション内の入力パラメーターを単純に置き換えます。 これにより、変換チェーンを簡単に作成できます。



実数変換



実数を変換するには、ConvertFloatToString、ConvertFloatCellToString、ConvertFloatColToStringのアクションが使用されます。 実数の変換は、整数の変換とほぼ同様ですが、実数を変換する場合、性別およびそれがどのような種類の数値(序数または定量)であるかを指定することはできません。 番号3.1415926を前置詞の場合に変換する簡単な例を考えてみましょう。



 <step plugin="ConvertModule" action="ConvertFloatToString" repeat="1"> <input> <parameter name="number">3,1415926</parameter> <parameter name="textCase">Prepositional</parameter> <parameter name="firstCapital">false</parameter> </input> <output> <parameter name="words"></parameter> </output> </step>
      
      







結果として、値「スリーポイント100万45万9千2千6千6千万」が単語パラメーターに書き込まれます。 System.Doubleは実数の変換の入力パラメーターとして使用されるという事実にもかかわらず、実数部の最大サイズは数十億(小数点以下9桁)に制限されています。 技術的には、これ以上のことを妨げるものはありませんが、実際には、そのような精度の必要性はまだ生じていません。



日付と時刻の変換



ConvertDateTimeToString、ConvertDateTimeCellToString、ConvertDateTimeColToStringは、日付と時刻の変換に使用されます。 このセクションで説明した以前のアクショングループと同様に、日付と時刻を操作するアクションは互いに非常に似ています。 ただし、整数や実数の変換とは異なり、これらのアクションではcaseおよびgenderパラメーターを使用しません。 代わりに、より柔軟な形式パラメーターが使用されます。 日付変換アクションでサポートされる形式表現をさらに詳しく考えてみましょう。



書式
  • dd-数字としての日
  • ddx-テキストとしての日付
  • MM-数字としての月
  • MMx-月をテキストとして
  • yy-2桁形式の年
  • yyx-テキストとしての2桁形式の年
  • yyyy-4桁形式の年
  • yyyyx-テキストとしての4桁の数値形式の年
  • hh-数値としての1から12までの時間
  • hhx-テキストとして1から12までの時間
  • HH-数値としての0から23までの時間
  • HHx-テキストとして0〜23の時間
  • mm-数値としての分
  • mmx-テキストとしての分
  • ss-数値としての秒
  • ssx-テキストとしての秒




上記のすべての形式で、文字「x」は、ケースn(主格)、g(ジェネティック)、d(ネイティブ)、a(対格)、i(インストゥルメンタル)、p(前置詞)の最初の文字を意味します。



ご覧のとおり、日付形式を設定する可能性は膨大です。 . «1988-06-26 13:47:56» ( , «26.06.1988 13:47:56», ):



: dd MMg yyyy HHn mmn ssn

: 26 1988

: ddn MMg yyyyg

:

: dd.MM.yy (MMn yyyyg)

: 26.06.88 ( )



xml :



 <step plugin="ConvertModule" action="ConvertDateTimeToString" repeat="1"> <input> <parameter name="dateTime">26.06.1988 13:47:56</parameter> <parameter name="format">dd.MM.yy (MMn yyyyg)</parameter> <parameter name="firstCapital">false</parameter> </input> <output> <parameter name="words"></parameter> </output> </step>
      
      









ActivityManager CurrencyToString, CurrencyCellToString CurrencyColToString. , : , . . , decimal, dept, , , . , « ». :



 <step plugin="ConvertModule" action="ConvertCurrencyColToString" repeat="1"> <input> <parameter name="inTable">[table]</parameter> <parameter name="column">dept</parameter> <parameter name="currencyType">Ruble</parameter> <parameter name="format">nii,ff (nniin rn ffn kn)</parameter> <parameter name="thousandSeparator"> </parameter> <parameter name="firstCapital">false</parameter> <parameter name="isOrdinal">false</parameter> </input> <output> <parameter name="outTable">table</parameter> </output> </step>
      
      







, dept . «3 101 203,03 ( )».

:



  • ii — (, )
  • ff — ()
  • iix — (, )
  • ffx — ()
  • rx — «» («», «») — currencyType
  • kx — «» («») — currencyType
  • nn — « », . , . .
  • n — "-", . , . "-" .


«» n (Nominative), g (Genetive), d (Dative), a (Accusative), i (Instrumental), p (Prepositional).



.





, , . ActivityManager Padeg.dll. ConvertModule.dll ConvertNameToCase, ConvertNameCellToCase ConvertNameColToCase. , . , « » :



 <step plugin="ConvertModule" action="ConvertNameToCase" repeat="1"> <input> <parameter name="nameIn">  </parameter> <parameter name="format">ss nn pp</parameter> <parameter name="textCase">Genitive</parameter> </input> <output> <parameter name="nameOut">words</parameter> </output> </step>
      
      







« ».

format :



  • ss —
  • s —
  • nn —
  • n —
  • pp —
  • p —


たとえば、ドキュメントに署名するために「Sukhov Zygmund Eduardovich」を変換する必要がある場合は、np ssテンプレートを使用して(textCaseパラメーターで主格を示しながら)、文字列「Z.E. スホフ。」



データ結合アクション



ConvertModule.dll , ReportTable ReportRow . RowConcat, ColumnConcat TableConcat. RowConcat ReportRow . ColumnConcat ReportTable. TableConcat ReportTable . 使用例



 <step plugin="ConvertModule" action="TableConcat" repeat="1"> <input> <parameter name="inTable">[myTable]</parameter> <parameter name="rowSeparator">;</parameter> <parameter name="cellSeparator">,</parameter> </input> <output> <parameter name="outValue">myConcatedStr</parameter> </output> </step>
      
      







myConcatedStr , myTable, (rowSeparator — , cellSeparator — ).





メンバー選択アクションには、GetRowおよびGetCellが含まれます。



GetRowアクションを使用すると、指定した行番号(ゼロから始まる番号)でReportTableクラスのオブジェクトからReportRowクラスのオブジェクトを取得できます。ReportRowクラスのオブジェクトは、テンプレート文字列と値のグループマッチングを設定するために必要です(詳細については、「レポート生成」セクションを参照してください)。ReportTableオブジェクトに指定した番号の行がない場合、インデックスが可能な値の範囲を超えるために例外がスローされることに注意してください。GetRowアクションの使用例:



 <step plugin="ConvertModule" action="GetRow" repeat="1"> <input> <parameter name="table">[table]</parameter> <parameter name="rowNumber">0</parameter> </input> <output> <parameter name="row"></parameter> </output> </step>
      
      







GetCellアクションは、ReportTableオブジェクトの単一セルのスカラー値を取得することを目的としています。



 <step plugin="ConvertModule" action="GetCell" repeat="1"> <input> <parameter name="table">[table]</parameter> <parameter name="rowNumber">0</parameter> <parameter name="columnName">myColumn</parameter> </input> <output> <parameter name="value"></parameter> </output> </step>
      
      







GetRowのように、GetCellアクションの行番号は最初から始まります。



レポート作成



データを選択して変換した後、次のステップは結果をレポートテンプレートファイルに直接挿入することです。

ActivityManager odt, ods, docx xlsx. . -, . COM- - , . XML. , COM , . , , , WordPad , .



テンプレートファイルを作成する



レポートを生成するための構成ファイルを設定する前に、レポートテンプレートファイルを作成する必要があります。レポートテンプレートファイルは、odt、ods、docx、またはxlsx形式の通常のファイルで、定義済みの構造と形式、および指定されたテンプレート行が含まれます。テンプレートファイルの置換値は、ドル記号でエスケープされます。例:$ variable $、ここでvariableはパターン文字列の名前です。より明確にするために、下の画像を見てください。







このテンプレートファイルには、$ title $、$ date $、$ n $、$ snp $、$ money $、$ date $という6つのパターン文字列が定義されています。テンプレートファイルでこれらのテンプレート文字列を正確に置き換える方法は、構成によって異なります。



構成設定



レポートテンプレートファイル自体を直接操作するために、ActivityManagerはReportModule.dllプラグインを提供します。このプラグインは非常に使いやすく、5つのアクションのみを定義しています。



これらのアクションの最初はReportSetTemplateFileになります。このアクションは、レポートの生成に基づいてテンプレートファイルへのパスを設定することを目的としています。このファイルは既に存在している必要があります。このアクションの構成例を考えてみましょう。



 <step plugin="ReportModule" action="ReportSetTemplateFile" repeat="1"> <input> <parameter name="fileName">[reportPath]example.odt</parameter> </input> </step>
      
      







[reportPath] , example.odt ActivityManager.exe . : .



, . ReportModule.dll ReportSetStringValue, ReportSetStringValues, ReportSetTableValue. パターン文字列。それらを順番に考えてみましょう。



ReportSetStringValueアクションは、テンプレート文字列と置換される値の一致を明示的に設定します。レポート生成が開始されると、この値はテンプレートファイル全体で指定されたテンプレート文字列に置き換えられます。このアクションを使用する場合、テンプレート文字列の名前に文字「$」を指定する必要はありません。このアクションを使用する簡単な例を次に示します。



 <step plugin="ReportModule" action="ReportSetStringValue" repeat="1"> <input> <parameter name="name">title</parameter> <parameter name="value"> 123</parameter> </input> </step>
      
      







その結果、前の画像からテンプレートファイルに関するレポートを生成すると、次の結果が得られます。







各テンプレート文字列をデータソースの対応する値に個別にマッピングするのは面倒です。はい。インストールする前に、GetCellアクションを使用してReportTable結果セットから値を選択する必要があります。理論的には可能ですが、推奨されていません。このアクションの大部分は、複雑な計算値またはコマンドラインで渡される値を設定することを目的としています。データソース(RDBMSなど)からスカラー値を設定する必要がある場合、より便利なReportSetStringValuesアクションが使用されます。このアクションに渡されるReportRow型のパラメーターは1つだけです。このアクションは、列(セル)の名前をテンプレート文字列の名前にマップします。明確にするために、次の例を取り上げます。



 <step plugin="SqlDataSource" action="SqlSetConnectionString" repeat="1"> <input> <parameter name="connectionString">dsn=registry</parameter> </input> </step> <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query">SELECT ' 321' AS title, NOW() AS date</parameter> </input> <output> <parameter name="table"></parameter> </output> </step> <step plugin="ConvertModule" action="GetRow" repeat="1"> <input> <parameter name="table">[table]</parameter> <parameter name="rowNumber">0</parameter> </input> <output> <parameter name="row"></parameter> </output> </step> <step plugin="ReportModule" action="ReportSetStringValues" repeat="1"> <input> <parameter name="values">[row]</parameter> </input> </step> <step plugin="ReportModule" action="ReportSetTemplateFile" repeat="1"> <input> <parameter name="fileName">C:\example.odt</parameter> </input> </step> <step plugin="ReportModule" action="ReportGenerate" repeat="1"> <output> <parameter name="fileName"></parameter> </output> </step> <step plugin="IOModule" action="IOOpenFile" repeat="1"> <input> <parameter name="fileName">[fileName]</parameter> <parameter name="arguments"></parameter> </input> </step>
      
      







ReportTable . table title date. GetRow ReportTable ReportRow, 0 ( ) ReportTable. ReportRow ReportSetStringValues. , «», $title$ $date$ () ReportRow. example.odt ,







テーブルの4番目の列にスカラー値を挿入するときに、同じ名前$ date $のテンプレート文字列が置き換えられたことに注意してください。事実は、テンプレート文字列をReportSetStringValueおよびReportSetStringValuesの値に一致させるアクションは、データがどこにあるかについての仮定を行わないということです。この問題の解決策の1つは、テンプレート文字列の1つを名前変更することです。別の方法については、「パターン文字列マッピングの設定手順」セクションで後述します。



ReportSetStringValuesアクションによってパターン文字列マッピングを一括設定する場合、ReportRow行のすべての列(セル)がファイル内のパターン文字列と一致する必要はまったくありません。生成中にファイル内で見つからなかったテンプレート文字列は、単に破棄されます。また、テンプレートファイル内に値が関連付けられていないテンプレート文字列がある場合、それらは単に置換されません。エラーはありません。



パターン文字列と値の比較を設定する上記の両方の手順は、スカラー値を挿入するのに役立ちます。これらの手順を使用して、表形式のデータをレポートに挿入することはできません。



表形式のデータを挿入するには、ReportSetTableValueアクションを使用します。このアクションのシグネチャは次のとおりです。



 <step plugin="ReportModule" action="ReportSetTableValue" repeat="1"> <input> <parameter name="table">[table]</parameter> <parameter name="xmlContractor">Row</parameter> </input> </step>
      
      







table ReportTable, . ReportTable. , . , . , XML- , xmlContractor ( xmlContractor ) 50 ReportTable , . , , , ( ). $n$, $snp$, $money$, $date$. ReportSetTableValue ReportTable, n, snp, money, date, time, action, pay. , .. ReportTable ( 50% ), .



, ReportTable, . .., ReportTable







xmlContractor ReportSetTableValue. ReportTable. . 4 xmlContractor: Paragraph, Table, Row, Cell. . ,







. . xmlContractor Row ReportTable. , ReportTable ReportTable.







, , .. .

xmlContractor Table, ,







一見、正確に何が起こったのか明確ではないかもしれませんが、原理は弦の場合と同じです。今回のみ、テーブル要素がReportTableオブジェクトに準拠しているかどうかが検索され、そのようなテーブルが見つかると、ReportTableオブジェクトの各行にテンプレート行が置換されてコピーされます。上の図には、3つのテーブルがあります。 ReportTableの各行に1つ。 xmlContractorテーブルを使用すると、署名ブロック、垂直データカードなど、データが行ごとに配置されていないより複雑なレポートを生成できます。 xmlContractorテーブルの実証された動作は、odtおよびdocxのレポートでのみ典型的なものであることに注意してください。 xmlContractor Tableがインストールされたodsでレポートを生成すると、ReportTableオブジェクトの各行のシートがコピーされます(一致する場合)。現時点では、xlsxでレポートを生成するときにサポートされていない唯一のxmlContractorであることに注意することも重要です。

以下の画像は、xmlContractor Paragraphのインストール結果を示しています。







予想どおり、この場合、ReportTableの各行に段落がコピーされました。このxmlContractorを使用すると、リストを作成するのに便利です。

xmlContractor Cellは、xlsxおよびodsテーブルプロセッサフ​​ァイルにとって特に重要です。ワープロファイルの場合、意味がありません。たとえば、ods形式の次のテンプレートファイル







を使用します。その後、ReportSetTableValueアクションを使用して、1つの値列を持つテーブルをセットアップします。

xmlContractor Rowを使用すると、期待される結果が得られます。







ods, ReportTable ( , ), ReportTable.



, xmlContractor Cell:







, . , , . .



, , ReportModule.dll — ReportGenerate.



 <step plugin="ReportModule" action="ReportGenerate" repeat="1"> <output> <parameter name="fileName"></parameter> </output> </step>
      
      







このアクションは、レポートを生成することを目的としています。実際、以前に検討されたReportModule.dllプラグインのアクションはすべてレポートジェネレーターを構成しますが、直接生成するわけではありません。 ReportGenerateアクションが呼び出されると、レポート生成が発生します。そのため、すべての設定後にこのアクションを呼び出す必要があります。。 ReportGenerateアクションの出力パラメーターは、生成されたレポートファイルへのパスです。 ReportGenerateは、生成後にレポートファイルを開きません。これは覚えておく必要があります。この動作の理由はモジュール性です。レポート生成プログラムは、生成されたレポートをどうするつもりなのかを知ることができません。生成後にレポートを電子メールで送信するプラグインを作成したり、FTPサーバーなどにレポートを作成したりできます。生成されたレポートで最も期待されるアクションを実行する(開く)ために、ActivityManagerでアクティビティが提供されます。これはIOOpenFileと呼ばれ、名前から推測できるように、IOModuleプラグインにあります。その使用例を以下に示します。



 <step plugin="IOModule" action="IOOpenFile" repeat="1"> <input> <parameter name="fileName">[fileName]</parameter> <parameter name="arguments"></parameter> </input> </step>
      
      







, . .., , OpenOffice, LibreOffice, MS Word, WordPad, .





ReportSetStringValue, ReportSetStringValues, ReportSetTableValue , . , . 例を考えてみましょう。



 <step plugin="ReportModule" action="ReportSetStringValue" repeat="1"> <input> <parameter name="name">content</parameter> <parameter name="value">My name is $name$. My surname is $surname$.</parameter> </input> </step> <step plugin="ReportModule" action="ReportSetStringValue" repeat="1"> <input> <parameter name="name">name</parameter> <parameter name="value">Vasily</parameter> </input> </step> <step plugin="ReportModule" action="ReportSetStringValue" repeat="1"> <input> <parameter name="name">surname</parameter> <parameter name="value">Ignatov</parameter> </input> </step>
      
      







$content$ «My name is $name$. My surname is $surname$.». $name$ $surname$ «Vasily» «Ignatov». «My name is Vasily. My surname is Ignatov.». , , $content$ , $name$ $surname$ ( ). «My name is $name$. My surname is $surname$.». .



-



- . , , , . . , ( ), , , . , ReportSetTableValue xmlContractor = Paragraph . -. GROUP_CONCAT MySQL, FOR XML MSSQL, TableConcat ConvertModule.dll, - .



$b$value$/b$. つまり : "$b$ $/b$, 29.06.1988 .., № 0123456 4321 ..., $b$ $/b$, 01.15.1976 .., № 654321 1234, ...". - . . $b$ $/b$ , .. :



- OpenOffice.

-:





.



JS



条件



ActivityManager . IOModule.dll. IOIfConditionToStep IOIfConditionExit. IOIfConditionToStep , true, IOIfConditionExit , true. 特定の例を考えてみましょう。 , , . ( , ) , . . , : — , , — , ..



 <!-- step 5 --> <step plugin="JSModule" action="JSRun" repeat="1"> <input> <parameter name="script">return [id_rent_type] != 1</parameter> </input> <output> <parameter name="result">condition</parameter> </output> </step> <!-- step 6 --> <step plugin="IOModule" action="IOIfCondititonToStep" repeat="1"> <input> <parameter name="condition">[condition]</parameter> <parameter name="step">8</parameter> </input> </step> <!-- step 7 --> <step plugin="ReportModule" action="ReportSetTemplateFile" repeat="1"> <input> <parameter name="fileName">\\nas\media$\ActivityManager\templates\registry\tenancy\agreement_commercial.odt</parameter> </input> </step> <!-- step 8 --> <step plugin="JSModule" action="JSRun" repeat="1"> <input> <parameter name="script">return [id_rent_type] != 2</parameter> </input> <output> <parameter name="result">condition</parameter> </output> </step> <!-- step 9 --> <step plugin="IOModule" action="IOIfCondititonToStep" repeat="1"> <input> <parameter name="condition">[condition]</parameter> <parameter name="step">11</parameter> </input> </step> <!-- step 10 --> <step plugin="ReportModule" action="ReportSetTemplateFile" repeat="1"> <input> <parameter name="fileName">\\nas\media$\ActivityManager\templates\registry\tenancy\agreement_special.odt</parameter> </input> </step> <!-- step 11 --> <step plugin="JSModule" action="JSRun" repeat="1"> <input> <parameter name="script">return [id_rent_type] != 3</parameter> </input> <output> <parameter name="result">condition</parameter> </output> </step> <!-- step 12 --> <step plugin="IOModule" action="IOIfCondititonToStep" repeat="1"> <input> <parameter name="condition">[condition]</parameter> <parameter name="step">14</parameter> </input> </step> <!-- step 13 --> <step plugin="ReportModule" action="ReportSetTemplateFile" repeat="1"> <input> <parameter name="fileName">\\nas\media$\ActivityManager\templates\registry\tenancy\agreement_social.odt</parameter> </input> </step> <!-- step 14 --> <step plugin="JSModule" action="JSRun" repeat="1"> <input> <parameter name="script">return ([id_rent_type] == 1) || ([id_rent_type] == 2) || ([id_rent_type] == 3)</parameter> </input> <output> <parameter name="result">condition</parameter> </output> </step> <!-- step 15 --> <step plugin="IOModule" action="IOIfCondititonToStep" repeat="1"> <input> <parameter name="condition">[condition]</parameter> <parameter name="step">18</parameter> </input> </step> <!-- step 16 --> <step plugin="IOModule" action="IODebugMessage" repeat="1"> <input> <parameter name="message">       </parameter> </input> </step> <!-- step 17 --> <step plugin="IOModule" action="IOIfCondititonExit" repeat="1"> <input> <parameter name="condition">true</parameter> </input> </step>
      
      







:







IOIfConditionToStep IOIfConditionExit , . JSRun JSModule.dll. (, ) JavaScript-. JSRun JavaScript. ActivityManger, []. JSRun Noesis.Javascript , . return result.



サイクル



IOIfConditionToStep JSRun . ,















, . . 始めましょう。











, . .



. ReportTable ( yearsTable):







ReportSetTableValue xmlClouser = Table . , ( )







, yearsTable, GetCell ( currentYear) yearsTable , ( MySQL)



リクエスト
 SELECT @n := @n + 1 AS n[currentYear], snp AS snp[currentYear], money AS money[currentYear], DATE_FORMAT(date,'%d.%m.%Y') AS date[currentYear] FROM test, (SELECT @n := 0) v WHERE YEAR(date) = '[currentYear]'
      
      







( ) ReportSetTableValue xmlClouser = Row .

:



リスティング
 <?xml version="1.0" encoding="utf-8"?> <activity> <plugins> <include>ConvertModule.dll</include> <include>IOModule.dll</include> <include>JSModule.dll</include> <include>ReportModule.dll</include> <include>SqlDataSource.dll</include> </plugins> <language>ru</language> <step plugin="SqlDataSource" action="SqlSetConnectionString" repeat="1"> <input> <parameter name="connectionString">dsn=registry</parameter> </input> </step> <step plugin="SqlDataSource" action="SqlOpenConnection" repeat="1" /> <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query"> SELECT DISTINCT YEAR(date) AS year, CONCAT('$n',YEAR(date),'$') AS n, CONCAT('$snp',YEAR(date),'$') AS snp, CONCAT('$money',YEAR(date),'$') AS money, CONCAT('$date',YEAR(date),'$') AS date FROM test ORDER BY year; </parameter> </input> <output> <parameter name="table">yearsTable</parameter> </output> </step> <step plugin="ReportModule" action="ReportSetTemplateFile" repeat="1"> <input> <parameter name="fileName">C:\Users\IgnVV\Desktop\1.odt</parameter> </input> </step> <step plugin="ReportModule" action="ReportSetTableValue" repeat="1"> <input> <parameter name="table">[yearsTable]</parameter> <parameter name="xmlContractor">Table</parameter> </input> </step> <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query"> SELECT COUNT(*) AS count FROM ( SELECT DISTINCT YEAR(date) AS year FROM test ORDER BY year) v; </parameter> </input> <output> <parameter name="table">countYearsTable</parameter> </output> </step> <step plugin="ConvertModule" action="GetCell" repeat="1"> <input> <parameter name="table">[countYearsTable]</parameter> <parameter name="rowNumber">0</parameter> <parameter name="columnName">count</parameter> </input> <output> <parameter name="value">countYears</parameter> </output> </step> <step plugin="JSModule" action="JSRun" repeat="1"> <input> <parameter name="script">return [countYears] == 0</parameter> </input> <output> <parameter name="result">condition</parameter> </output> </step> <step plugin="IOModule" action="IOIfCondititonToStep" repeat="1"> <input> <parameter name="condition">[condition]</parameter> <parameter name="step">15</parameter> </input> </step> <step plugin="JSModule" action="JSRun" repeat="1"> <input> <parameter name="script">return [countYears]-1;</parameter> </input> <output> <parameter name="result">countYears</parameter> </output> </step> <step plugin="ConvertModule" action="GetCell" repeat="1"> <input> <parameter name="table">[yearsTable]</parameter> <parameter name="rowNumber">[countYears]</parameter> <parameter name="columnName">year</parameter> </input> <output> <parameter name="value">currentYear</parameter> </output> </step> <step plugin="SqlDataSource" action="SqlSelectTable" repeat="1"> <input> <parameter name="query"> SELECT @n := @n + 1 AS n[currentYear], snp AS snp[currentYear], money AS money[currentYear], DATE_FORMAT(date,'%d.%m.%Y') AS date[currentYear] FROM test, (SELECT @n := 0) v WHERE YEAR(date) = '[currentYear]';</parameter> </input> <output> <parameter name="table"></parameter> </output> </step> <step plugin="ReportModule" action="ReportSetTableValue" repeat="1"> <input> <parameter name="table">[table]</parameter> <parameter name="xmlContractor">Row</parameter> </input> </step> <step plugin="IOModule" action="IOIfCondititonToStep" repeat="1"> <input> <parameter name="condition">true</parameter> <parameter name="step">8</parameter> </input> </step> <step plugin="SqlDataSource" action="SqlCloseConnection" repeat="1" /> <step plugin="ReportModule" action="ReportGenerate" repeat="1"> <output> <parameter name="fileName"></parameter> </output> </step> <step plugin="IOModule" action="IOOpenFile" repeat="1"> <input> <parameter name="fileName">[fileName]</parameter> <parameter name="arguments"></parameter> </input> </step> </activity>
      
      









, « JS », xml- , . : , , , , . . ,







( ). xml-. 4 , ( ): , , , . , drag'n'drop.



: «» ( ) «» ( ). . , , ( ) . , . . , , . xml- , plugins/. , , , .



はじめに



新しい構成ファイルを作成するとき、最初にすることは、使用する予定のプラグインを接続することです。それ以外の場合は、ドロップダウンリストで使用できません。これは単純に行われます:メインメニュー->設定->プラグイン。結果として、使用するプラグインを選択する必要があるウィンドウが画面に表示されます。







この初期セットアップは終了します。その後、構成ファイルのステップの作成を開始できます。新しいステップを追加した後、このステップで実行するプラグインとこ​​のプラグインのアクションを選択する必要があります。その後、このアクションのパラメーターのリストがパラメーターの表に表示されます。アクションパラメータの値を設定するには、それをダブルクリックします。

. .

(, ) ,







. ( ), , .

Sytem.String ScintillaNET JavaScript SQL.







. «» .





, ActivityManager.exe .



, ActivityManager.exe . -> -> . ,







, config, ActivityManager.exe . , , .

. F5 -> -> . , , .







, , , , , . IODebugMessage IOModule. — , . ToString() , .

, , , ActivityManager . -> -> .



, xml- .





.Net , plugins\ :





MyModule.dll:



 namespace MyModule { public interface IPlug { void MyAction(string input, out string output); } public class MenaPlug: IPlug { public void MyAction(string input, out string output) { output = input+input; } } }
      
      







以上です。 plugins\ ActivityManager AMEditor . MyAction :



  <step plugin="MyModule" action="MyAction" repeat="1"> <input> <parameter name="input">test</parameter> </input> <output> <parameter name="output"></parameter> </output> </step>
      
      







custom- MenaModule.cs



: ReportTable ReportRow ExtendedTypes.dll.



おわりに



. ActivityManager . , :





, , , . - , - . , , . =)



参照資料






All Articles