tmaplatform開発環境プログラミング言語のいくつかの機能





この投稿では、プログラミング言語とtmaplatform会計アプリケーション開発環境のクエリについて説明します。



誰もが異なる味を持っています...


プラットフォームを使用する場合、いくつかのプログラミング言語を使用できます。Pascal(Similar Pascal)、BASIC(Similar Basic)。 Javaに似た言語が近づいています。 すべての投稿例はSimilar Pascalで書かれています。



クエリ言語は「Internal SQL」と呼ばれるプラットフォームに統合されており、ほとんどの投稿はそれについてです。



DBMSからの独立。


各DBMSには長所と短所があり、さまざまなタスクと保存されるデータ量に応じてさまざまなDBMSが設計されています。 また、異なるデータベースサーバーには異なる開発者のみが使用されます。 これは公理です。



tmaplatform開発環境では、MySQL(works)、PgSQL(testing)、MSSQL(testing)、SQLite(testing)の異なるデータベースサーバー間でプログラムを簡単に(簡単に-コードを変更せずに)転送できます。将来、このリストは拡張されます。 また、SQL言語のすべての普遍性により、データベースを操作するためのプログラムをあるサーバーから別のサーバーに転送することはできません。 トリガー、ストアドプロシージャ、および関数の積極的な使用への移行は、移行を複雑にします。



したがって、可能な限りSQL92(SQLの基本標準)に類似した内部クエリ言語をプラットフォームに追加しました。 プログラムを実行すると、プラットフォームはクエリを内部言語から使用されているデータベースの言語に翻訳します。



このクエリ言語では、お気に入りのデータベースサーバーの機能を100%使用することはできません。 そのため、内部クエリ言語とともにデータベースクエリ言語(直接クエリ)を使用する機会を残しました。 直接クエリを使用すると、移植性が失われます。 ただし、プログラムの98%で内部クエリ言語を使用すると、プログラムの転送とデバッグが数桁簡単になります。



直接リクエスト


データベースクエリは、プログラムコードで直接記述できます。 クエリ言語はプログラミング言語の一部です。 したがって、リクエストを入力するとすぐに、プラットフォームはテーブル、フィールド、およびそれらのタイプの存在を確認します。 プログラムを起動する前でも、プラットフォームはすべてのリクエストの正確性をチェックします。



ClientId := 3; D := (Select Sum(Summa) From Documents Where Client = :ClientId);
      
      





たとえば、ClientId変数のタイプがClientフィールドのタイプと異なる場合、プラットフォームはこれについて通知します(エラーの場所に赤い線が引かれます)。



プラットフォームエディタでは、構文、フィールド名、データベース関数、およびオートコンプリートに関するヒントも利用できます。



データベースをリファクタリングするとき、プラットフォームはすべてのクエリを自動的に調整します。 つまり、テーブルを2つの部分に分割すると、クエリ「 Select A、B From Table 」が「 Select A、LinkField.B From Table1 」に置き換えられます。

クエリパラメータは「:」記号の後に指定され、変数だけでなくプログラミング言語の式も指定できます。



AutoJoinテクノロジー


例として、プログラミングで何かを簡潔かつ簡潔に説明するものはありません。



 Select Account.Client.City.Country.Name From Document
      
      





このリクエストでは、クライアントが登録されている都市が所在する国の名前を取得します。このアカウントには、ドキュメントが発行されます。



標準SQLでは、このクエリは次のようになります。



 Select Countries.Name From Document Left Join Accounts On Accounts.Id = Document.Account Left Join Clients On Clients.Id = Accounts.Client Left Join Cities On Cities.Id = Clients.City Left Join Countries On Countries.Id = Cities.Country
      
      





本当ですか? 要求の量は5倍減少しました。 これらの4つのJoinブロックは、1つのフィールドのみに分類されます。 そして、20個のフィールドがある場合は? まあ、一般的に、あなたは理解しています。



単一の新しいSQLコマンド


Select演算子はデータセット(以下、データセットと呼びます)を返します。単一の値を取得する必要がある場合は、プログラムにデータ抽出コマンドを追加する必要があります。



 D := (Select Sum(S) From Documents Where Client=:Client); If D.Count=0 Then S := 0 Else S := D[0].S;
      
      





Single演算子はSelectと同様に機能しますが、単一の値(最初の行の最初のフィールド)を返します。



 S := (Single Sum(S) From Documents Where Client=:Client);
      
      





外部リクエストに対処する


サブクエリを使用する場合、変数名の前に複数のポイントを指定することにより、外部クエリに対処できます(量はサブクエリのネストレベルによって異なります)。



 Select Name, (Select Sum(Summa) From Money Where Client=.Id) From Clients Select Name, (Select (Select Sum(Summa) From Money Where Client=..Id)) From Clients
      
      





クエリの最適化


プログラム内のリクエストは、可能な限りシンプルかつ明確である必要があります(おそらく、あなただけでなく、誰かがこのプログラムを理解する必要があるためです)。 しかし、多くの場合、そのようなリクエストは最速ではありません。 また、内部クエリ言語では、すべてのDBMS機能を使用して最適なクエリを作成することはできません。



プラットフォームには、クエリオプティマイザーツールが含まれています。 これにより、内部言語と外部言語でクエリのペアを指定できます。 つまり、最速のリクエストを指定します。



で置き換える



 Select Name, (Select Sum(Summa) From Documents Where Client=.Id) From Clients
      
      





で置き換える



 Select Client.Name, Sum(Document.Summa) From Clients, Documents Where Clients.Id=Documents.Client
      
      





このツールを使用すると、クエリの結果のIDを実験的に検証し、実行時間を比較することもできます。 複雑にすることなくプログラムを最適化してください!



型付きデータセット。


選択クエリは、データセット(Dataset型のオブジェクト)を返します。 配列と同じように作業しました。



 Dataset := DirectQuery('Select * From mysql.user'); For y:=0 To Dataset.Count-1 Do For x:=0 To Dataset.Columns.Count-1 Do Warning(Dataset[x,y]);
      
      





より興味深い機能は、型指定されたデータセットです。 前の例では、Dataset [x、y]はVariantデータ型を返し、型制御はプログラムテキスト入力の段階で実行されませんでした。 型付きデータセットを使用すると、特定のデータ型の特定のフィールド-Dataset [x]。FieldNameにアクセスできます。 つまり、型制御は入力中、オートコンプリート中などに機能します。



 Procedure OnCreate; Var D : Dataset Of Record Id : Integer; CreateDate : DateTime; ClientId : Integer; CountryName : String; End; Begin D := (Select Id, CreateDate, Client, Client.City.Country.Name From Document); Warning(D[2].Name); //     Foreach E in D Do //    Begin Warning(E.Id); //    Warning(E.CountryName); //    End; End;
      
      





結果がデータセットに割り当てられるSelectクエリによって返されるフィールドタイプは、データセット自体のフィールドと同じタイプである必要があることに注意してください。



取引


プログラミング言語は、トランザクションブロックをサポートしています。 それらなしでどこに? アカウントからアカウントへの送金に関する教科書の最初の例を覚えていますか? :)



 Transaction Begin (Insert Table1 ...) (Insert Table2 ...) End;
      
      





このブロックは、トランザクションブロックが完了するまで、他のクライアントがデータベースの変更を確認できないことを意味します。 逆に、他の顧客が行った変更を確認することはできません。 このブロックで例外が発生すると、データベースに加えられたすべての変更がロールバックされます。



トランザクションはネストできます。



トランザクション分離レベルを指定できます。



 Transaction Continous Read Begin End;
      
      





自動更新


データベースが変更されると、プラットフォームはリクエストを分析し、インターフェイスを自動的に更新します。 さらに、ビュー(ビュー)および計算フィールドで使用されるテーブルが考慮されます。 そして、変更されたレコードのみが更新されます。



DBMSがサポートしていない場合にプラットフォームが実装するSelectトリガーとマテリアライズドビュー(ビュー)で同じメカニズムが使用されます。 (例:MySQL)。



SQLからローカルデータ


SQLクエリは、データベーステーブルだけでなく、ローカルデータにも書き込むことができます。



 Procedure OnCreate; Var Data : Dataset Of Record ... End; Data1 : Dataset Of Record ... End; Begin ... Data1 := (Select FirstName+' '+LastName, Age From :Data Where Age>20 Order By -Age, Name); ... End;
      
      





この場合、クエリで任意のプログラム関数を使用できます。



ストアドプロシージャ。


ストアドプロシージャ、関数、およびトリガーは、データベースサーバーで格納および実行されるDBMS手続き言語(T-SQL、PL / SQLなど)のプログラムです。 プラットフォームは、特定のDBMSから独立するために、これらのプログラムを独自の言語で作成する機能を提供します(手順/トリガーのテキストはブロードキャストされます)。



プログラム全体で同じ言語とAPIを使用することは間違いなくプラスです。 さらに、クエリ言語が統合されたSimilar Pascalは、ストアドプロシージャ言語(MySQLなど)よりも便利で、予測可能で、視覚的です。



コードをプログラムからストアドプロシージャに、またはその逆に単純に転送できます。



そして主な利点は、一度書かれたストアドプロシージャが、サポートされているすべてのデータベースサーバーで動作することです。



ストアドプロシージャの例:



 Procedure Recalc(Curr, Contragent : Integer); Var S, CurrRate, NewCurrRate : Currency; begin Foreach C In (Select Id, DocDate, Sum, Curr, NewSum, NewCurr From Documents Where Curr=:Curr And Contragent=:Contragent) Do Begin CurrRate := GetCurrRate(C.DocDate, C.Curr); NewCurrRate := GetCurrRate(C.DocDate, C.NewCurr); S := RoundDiv(RoundMul(C.Sum, CurrRate, 4), NewCurrRate, 2); If C.Summa <> S Then (Update Documents Set Summa = :S Where Id = :C.Id); End; End;
      
      





おわりに


上記のすべてにより、プログラムの開発、理解、デバッグの速度が向上します。 もちろん、これらの要因は、開発環境を選択する際の基本です。 tmaplatformを試してみたい-ベータテストにサインアップ(PMでメールを私( smirnovss )に投げてください)

ヘルプ付きのプラットフォームの完全な説明については、 tmaplatform.ruを参照してください



All Articles