<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>子表單操作 &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/%e5%ad%90%e8%a1%a8%e5%96%ae%e6%93%8d%e4%bd%9c/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Fri, 12 Dec 2025 14:49:18 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://piglife.tw/wp-content/uploads/2017/10/cropped-logo-1-32x32.png</url>
	<title>子表單操作 &#8211; 小豬日常</title>
	<link>https://piglife.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>使用 Ragic API 自動生成庫存扣減子表單實作筆記</title>
		<link>https://piglife.tw/technical-notes/ragic-api-inventory-subtable/</link>
					<comments>https://piglife.tw/technical-notes/ragic-api-inventory-subtable/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Tue, 07 Jan 2025 03:11:19 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[FIFO]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ragic API]]></category>
		<category><![CDATA[子表單操作]]></category>
		<category><![CDATA[庫存管理]]></category>
		<category><![CDATA[自動化扣減]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=465</guid>

					<description><![CDATA[介紹如何利用 Ragic API 自動清空子表單、遍歷需求商品並依 FIFO 原則扣減庫存，最後將扣...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在庫存管理系統中，經常需要根據商品需求自動計算庫存扣減清單，並將結果保存於子表單中以便追蹤。本文針對使用 Ragic API 的場景，說明如何透過程式碼自動清空舊數據、遍歷需求商品、依序扣減庫存批次，並將扣減結果記錄到子表單，適合有程式基礎且想優化庫存流程的工程師或自學者。</p>
<h2 class="wp-block-heading">功能概述</h2>
<p>此程式碼主要包含以下功能：</p>
<ol>
<li>清空目標子表單的舊有數據，避免重複記錄。</li>
<li>讀取需求子表單資料，判斷是否有待處理的需求。</li>
<li>依據 FIFO 原則，遍歷庫存批次並計算扣減數量。</li>
<li>將扣減結果逐筆寫入另一個子表單，完成自動化記錄。</li>
</ol>
<h2 class="wp-block-heading">代碼邏輯詳解</h2>
<h3 class="wp-block-heading">1. 初始化與清空子表單</h3>
<p>首先，設定目標子表單 ID，並使用 <code>deleteSubtableRowAll</code> 方法清空該子表單的所有資料，確保後續寫入的是最新扣減結果。</p>
<pre><code class="lang-javascript language-javascript javascript">var subtable_id = &quot;1003384&quot;; // 扣減結果子表單ID
entry.deleteSubtableRowAll(subtable_id);
entry.save();</code></pre>
<h3 class="wp-block-heading">2. 讀取需求子表單並檢查資料</h3>
<p>接著，取得需求子表單的行數，若無資料則直接結束程序，避免不必要的運算。</p>
<pre><code class="lang-javascript language-javascript javascript">var subtableSize = entry.getSubtableSize(1003391); // 需求子表單行數
if (subtableSize === 0) {
  log.println(&quot;子表單 1003391 沒有資料&quot;);
  return;
}</code></pre>
<h3 class="wp-block-heading">3. 遍歷需求商品並查詢庫存批次</h3>
<p>對每筆需求商品，使用 Ragic API 的 <code>getAPIQuery</code> 方法查詢對應商品的庫存批次，並依創建時間排序以符合 FIFO 原則。</p>
<pre><code class="lang-javascript language-javascript javascript">for (var i = 0; i &lt; subtableSize; i++) {
  var productId = entry.getSubtableFieldValue(1003391, i, &quot;1003389&quot;); // 商品ID
  var productNumber = entry.getSubtableFieldValue(1003391, i, &quot;1003390&quot;); // 領用數量

  var batchQuery = db.getAPIQuery(&quot;/forms27/8&quot;);
  batchQuery.addFilter(1003353, &#039;=&#039;, productId); // 篩選商品ID
  batchQuery.setOrder(1003372, 1); // 按創建時間排序
  var stockResults = batchQuery.getAPIResultList();

  // 後續扣減邏輯
}</code></pre>
<h3 class="wp-block-heading">4. 計算扣減並寫入扣減子表單</h3>
<p>根據需求數量，逐批扣減庫存，並使用 <code>setSubtableFieldValue</code> 方法將扣減明細寫入目標子表單，確保每筆扣減數量與批次資訊完整記錄。</p>
<pre><code class="lang-javascript language-javascript javascript">var accumulatedQuantity = 0;
var currentSubtableSize = entry.getSubtableSize(&#039;1003384&#039;);

for (var j = 0; j &lt; stockResults.length; j++) {
  var stockEntry = stockResults[j];
  var batchQuantity = Number(stockEntry.getFieldValue(&quot;1003374&quot;)); // 庫存數量
  var remainingRequired = productNumber - accumulatedQuantity; // 尚需扣減數量
  var usedQuantity = Math.min(batchQuantity, remainingRequired); // 本批次扣減數量

  if (usedQuantity &lt;= 0) break;

  entry.setSubtableFieldValue(&#039;1003384&#039;, currentSubtableSize, &#039;1003392&#039;, stockEntry.getFieldValue(&#039;1003354&#039;)); // 商品名稱
  entry.setSubtableFieldValue(&#039;1003384&#039;, currentSubtableSize, &#039;1003380&#039;, stockEntry.getFieldValue(&#039;1003355&#039;)); // 批次號
  entry.setSubtableFieldValue(&#039;1003384&#039;, currentSubtableSize, &#039;1003381&#039;, usedQuantity); // 扣減數量
  entry.setSubtableFieldValue(&#039;1003384&#039;, currentSubtableSize, &#039;1003382&#039;, stockEntry.getFieldValue(&#039;1003356&#039;)); // 成本

  accumulatedQuantity += usedQuantity;
  currentSubtableSize++;

  if (accumulatedQuantity &gt;= productNumber) break;
}</code></pre>
<h2 class="wp-block-heading">小結</h2>
<p>透過 Ragic API 的子表單操作與資料查詢功能，這段程式碼實現了從需求子表單到庫存扣減子表單的自動化流程，提升庫存管理效率與數據準確性。當庫存不足時，程式可擴充加入錯誤提示機制，避免錯誤記錄產生。此範例也可作為與其他系統整合的基礎，方便後續功能擴展。</p>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">var subtable_id = &quot;1003384&quot;; // 扣減結果子表單ID
entry.deleteSubtableRowAll(subtable_id);
entry.save();

var subtableSize = entry.getSubtableSize(1003391); // 需求子表單行數
if (subtableSize === 0) {
  log.println(&quot;子表單 1003391 沒有資料&quot;);
  return;
}

for (var i = 0; i &lt; subtableSize; i++) {
  var productId = entry.getSubtableFieldValue(1003391, i, &quot;1003389&quot;); // 商品ID
  var productNumber = entry.getSubtableFieldValue(1003391, i, &quot;1003390&quot;); // 領用數量

  var batchQuery = db.getAPIQuery(&quot;/forms27/8&quot;);
  batchQuery.addFilter(1003353, &#039;=&#039;, productId); // 篩選商品ID
  batchQuery.setOrder(1003372, 1); // 按創建時間排序
  var stockResults = batchQuery.getAPIResultList();

  var accumulatedQuantity = 0;
  var currentSubtableSize = entry.getSubtableSize(subtable_id);

  for (var j = 0; j &lt; stockResults.length; j++) {
    var stockEntry = stockResults[j];
    var batchQuantity = Number(stockEntry.getFieldValue(&quot;1003374&quot;)); // 庫存數量
    var remainingRequired = productNumber - accumulatedQuantity; // 尚需扣減數量
    var usedQuantity = Math.min(batchQuantity, remainingRequired); // 本批次扣減數量

    if (usedQuantity &lt;= 0) break;

    entry.setSubtableFieldValue(subtable_id, currentSubtableSize, &#039;1003392&#039;, stockEntry.getFieldValue(&#039;1003354&#039;)); // 商品名稱
    entry.setSubtableFieldValue(subtable_id, currentSubtableSize, &#039;1003380&#039;, stockEntry.getFieldValue(&#039;1003355&#039;)); // 批次號
    entry.setSubtableFieldValue(subtable_id, currentSubtableSize, &#039;1003381&#039;, usedQuantity); // 扣減數量
    entry.setSubtableFieldValue(subtable_id, currentSubtableSize, &#039;1003382&#039;, stockEntry.getFieldValue(&#039;1003356&#039;)); // 成本

    accumulatedQuantity += usedQuantity;
    currentSubtableSize++;

    if (accumulatedQuantity &gt;= productNumber) break;
  }
}
entry.save();</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/ragic-api-inventory-subtable/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
