Pleasanter Tips：子データの内容を親データのコメントに転記する

Pleasanterはレコードにコメントを書くことができ、商談履歴や対応履歴を記録するには大変便利です。
また一覧には最新の3コメントが表示され可視性も高いと思います。
しかし、データの構造で子データを作成した場合には一覧時にコメントと同じような出力ができないので、今回は子データのタイトルと内容を親データのコメントに転記しました。

# 事前準備（必要なスキル）
今回のテクニックは拡張SQLを実行します。従って、誤って記述する事で他のデータを更新しかねません。コードをコピペなどして実行した後データが破損しても一切の責任は問えませんので予めご了承ください。
データベースはSQL-SERVERになるのでPostgreSQLの場合はそのまま実行できません。

## Pleasanterでデータ格納先の準備
Pleasanterで親・子データのサイトを作成します。また親子関係を定義してください。
下記サンプルは親・子データは記録テーブルで作成し、子テーブルの分類Aを親データのリンクに使用しました。

# 画面サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/10cd090b-7535-8fc4-3bec-2cb70a7c232c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/584f1f19-5a01-df7b-d391-24a7b5ee2b53.png)

# コメントの記述内容
コメントにはタイトルと内容および子データへのリンクを記述しています。
コメントはテキストでタイトルには#を付けています。
マークダウンなどでも記述する方法も有ります。

# 制限事項
子データの内容はテキスト形式のみです。マークダウンで記述した場合は内容をテキストに変換して上で処理するなどが必要です。
子データのタイトルが他の項目と結合している場合は、下記スクリプトでは正しく表示されません。そのような場合はItemsテーブルのTitleを使用するように変更してください。

# スクリプトなど
下記の記述をExtendedSqlsのフォルダに作成してください。Windowsで標準にインストールすると
C:\web\pleasanter\Implem.Pleasanter\App_Data\Parameters\ExtendedSqls
になります。
ファイル名に制限はありませんが今回は
Child2Comment.json
Child2Comment.json.sql
にしました。
このスクリプトの実行は子データ側で行います。

## 拡張SQL（定義部）
Child2Comment.json
```
{
  "Description": "Child2Comment",
  "SiteIdList": [19947],
  "OnCreated": true,
  "OnUpdated": true,
  "OnDeleted": true,
  "OnBulkDeleted": true,
  "OnImported": true,
}
```
## 拡張SQL（SQL部）※SQL-SERVER用です
Child2Comment.json.sql
```
DECLARE @Id INT = {{Id}}   --子データのID
DECLARE @URL NVARCHAR(MAX) = 'http://localhost'
DECLARE @Commets TABLE(
	 CommentId INT
	,CreatedTime NVARCHAR(MAX)
	,Creator INT
	,Body NVARCHAR(MAX)
)
BEGIN
  DECLARE @ResultIdParent INT
  DECLARE @SiteIdParent INT
  DECLARE @SiteIdChild INT
  DECLARE @DataJson NVARCHAR(MAX)
  DECLARE @ResultIdChild INT,@Title VARCHAR(MAX), @Body VARCHAR(MAX), @Owner INT, @UpdatedTime DATETIME, @CommentId INT=0
  DECLARE @CRLF NVARCHAR(MAX)=CHAR(13)+CHAR(10)

  --子データにリンクする親IDと子データサイトIDを取得を取得（ClassA）
  SELECT @ResultIdParent=ClassA, @SiteIdChild=SiteId FROM Results WHERE ResultId=@Id
  --親データのサイトIDを取得
  SELECT @SiteIdParent=SiteId FROM Results WHERE ResultId=@ResultIdParent
  --親データに関連する子データリストを取得
  DECLARE c1 CURSOR FOR SELECT ResultId,Title,Body,Owner,UpdatedTime FROM Results WHERE SiteId=@SiteIdChild AND ClassA=@ResultIdParent ORDER BY UpdatedTime DESC
  OPEN c1
  FETCH NEXT FROM c1 INTO @ResultIdChild,@Title,@Body,@Owner,@UpdatedTime
  WHILE @@FETCH_STATUS = 0
  BEGIN
	SET @CommentId = @CommentId + 1
    --コメントデータ作成
	DECLARE @CommentBody NVARCHAR(MAX)=''
    --SET @CommentBody = '[md]'  --マークダウンを使いたい場合
	SET @CommentBody = @CommentBody + '# ' + @Title + '  '+ @CRLF
	SET @CommentBody = @CommentBody + @Body + '  ' + @CRLF
	SET @CommentBody = @CommentBody + @URL + '/items/'+CAST(@ResultIdChild AS NVARCHAR)
    --コメント日時作成（直接出力しても良いが+09:00が付かない為に作成）
	DECLARE @CommentUpdatedTime NVARCHAR(MAX)=''
	SET @CommentUpdatedTime = @CommentUpdatedTime + FORMAT(@UpdatedTime,'yyyy-MM-dd')
	SET @CommentUpdatedTime = @CommentUpdatedTime + 'T'
	SET @CommentUpdatedTime = @CommentUpdatedTime + FORMAT(@UpdatedTime,'HH:mm:ss.fffffff')
	SET @CommentUpdatedTime = @CommentUpdatedTime + '+09:00'
    --コメントテーブルに追加
	INSERT INTO @Commets VALUES(@CommentId,@CommentUpdatedTime,@Owner,@CommentBody)
    FETCH NEXT FROM c1 INTO @ResultIdChild,@Title,@Body,@Owner,@UpdatedTime
  END
  CLOSE c1
  DECLARE @CommentsJson NVARCHAR(MAX) = (SELECT CommentId,CreatedTime,Creator,Body FROM @Commets ORDER BY CommentId ASC FOR JSON AUTO)
  --SELECT @CommentsJson --内容確認用
  UPDATE Results SET Comments=@CommentsJson WHERE SiteId=@SiteIdParent AND ResultId=@ResultIdParent
END;
DEALLOCATE c1
```

### May The Pleasanter Be With You.