0

REST API を介してデータベースに接続されている HTML フォームを使用しています。サーバーの作業は Coldfusion で処理され、主に cfscript 構文で処理されます。

フォーム データは、フォームごとに 2 つ以上のセットで送信されます。ほとんどのフォームは長く、パフォーマンスにより、セットごとに最大 70 フィールドを送信する必要があります。作成と更新の間でレコードを分割すると、最初の呼び出しでフォーム応答 ID を渡し、フォームが完成したときに後続の更新でそれをチェックすることで、重複チェックも可能になります。

着信フォームがアプリケーションを初期化すると、フォーム応答 ID が照会されます。一致しない場合は、新しいレコードです。一致する場合は、データベース レコード ID を使用してレコードが更新されます。現在、このロジックを if ステートメントで設定しており、最初の呼び出しで 2 つのレコードが作成されています。これを解決するために、他の変数のチェック、switch ステートメント、do/while ループ、ネストされた if ステートメントなど、いくつかのバリエーションを試しました。いずれの場合も、1 つではなく 2 つのレコードが作成されます。後続の呼び出しでは、2 つのレコードのうち最新のものを更新し、新しいレコードは作成されません。

<cfscript>

    // Setup the qb object to call add and update methods 
qb = new components.qb();

    // Setup query object. In this case we're passing Response ID parameters to compare against. This allows us to check whether the incoming request represents a new record or an update.
qbQuery = new components.qbQue().qFieldValue(#qb_tableID#, #qb_token#, #uField#, #uValue#, #uList# );

    // An array of returned records, empty if new record
qbRecords = qbQuery.getQbRecords();

    // The latest Record ID to edit
qbLatest = qbQuery.getLatestRecord();

writeOutput("qbRecords is #arrayLen(qbRecords)# long! <br>");


if (arrayLen(qbRecords) == 0) {

    add_record = qb.addRecord(qb_tableID, qb_token, form_data);

} else {

    edit_record = qb.editRecord(qb_tableID, qbLatest, qb_token, form_data_edit);

}

</cfscript>

[編集] addRecord() 関数

public any function addRecord(qb_tableID, qb_token, form_data) 
{
    variables.qb_ticket = SESSION.qbTicket
    ;
    http
    method = "POST"
    result = "qbReturn"
    url = "#variables.qbUrl#/#qb_tableID#?act=API_AddRecord&ticket=#variables.qb_ticket#&apptoken=#qb_token#&#form_data#"
    ;
    this.setUuid(CreateUUID());
    this.setQbResult(XmlParse(qbReturn.Filecontent));
    this.setQbAction(Trim(QbResult.xmlRoot.XmlChildren[1].XmlText));
    this.setQbErrCode(Trim(QbResult.xmlRoot.XmlChildren[2].XmlText));
    this.setQbErrText(Trim(QbResult.xmlRoot.XmlChildren[3].XmlText));
    this.setQbRid(Trim(QbResult.xmlRoot.XmlChildren[4].XmlText));
    this.setQbUpdateid(Trim(QbResult.xmlRoot.XmlChildren[5].XmlText))
    ;
    return ( this )
    ;
}

[編集] 上記の関数は、次の createRecord() 関数からリファクタリングされています。変更の中で、現在の addRecord() 関数は、古いコードが XML を送信した URL で API にデータを渡します。それは問題ではないはずですが、私はそれを大きな違いとして指摘しています。

もう 1 つの重要な違いは、createRecord() が 2 つのレコードを作成しないことです。

<cffunction name="createRecord" returntype="any" access="public" output="false" description="Create new record">
    <cfargument name="qbURL" type="string" required="true" />
    <cfargument name="tableID" type="string" required="true" />
    <cfargument name="newRecord" type="xml" required="true" />
    <cfargument name="theTicket" type="string" required="true" />
    <cfargument name="theToken" type="string" required="true" />
    <!--- Add Record --->
        <cfhttp url="#qbURL#/#tableID#?" method="post" charset="utf-8" result="addRecord">                              
            <cfhttpparam type="body" value="#newRecord#" />
            <cfhttpparam type="Header" name="Content-Type" value="application/xml" />
            <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0">
            <cfhttpparam type="Header" name="Content-length" value="#len(newRecord)#"/> 
            <cfhttpparam type="URL" name="act" value="API_AddRecord">
            <cfhttpparam type="URL" name="ticket" value="#theTicket#">
            <cfhttpparam type="URL" name="apptoken" value="#theToken#">
        </cfhttp>
    <cfreturn addRecord.Filecontent />
</cffunction>
4

0 に答える 0