SVRサーバJS:確定処理後 機能レベル JAVA_SCRIPT_ENGINE/UPDATE_AFTER 2593字
コード概要 (抽出)
DB 書: ET100ET110
参照項目 (当機能): NRTOKUURI (特殊売上№)IDHINMOKU (品目ID)IDTOKUISAKI (取引先ID)CDSOUKO (取引倉庫C)DTTORIHIKI (取引日)KBTOKUURI (取引区分)QTTORIHIKI (取引数)PRTORIHIKI (取引単価)AMTAX (消費税額)AMTORIHIKI (税抜取引額)PRZAIKO (在庫単価)QTZAIKO (在庫取引数)TXTEKIYO (摘要)
//-------------------------------------------
//XDMF_LF021_0:特殊売上データの保守
//-------------------------------------------
function execXDMF_LF021_0() {
//機能IDセット(Ver3.1用)
_FUNC_ID = 'XDMF_LF021_0';
//入力情報(特殊売上№)取得
var itemBlockList = TALON.getBlockData_List(1);
var lineDataMap = itemBlockList[0]
_NRTOKUURI = lineDataMap['NRTOKUURI'];
//対象情報(特殊売上)取得
var itemSelectListLT020 = selectLT020(_NRTOKUURI);
var lineDataMapLT020 = itemSelectListLT020[0];
var _NRSOURCE = lineDataMapLT020['NRSOURCE'];
//特殊売上登録処理
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 取引区分
// 6 : 数量
// 7 : 単価
// 8 : 消費税
// 9 税抜取引額
// 10 : 在庫単価
// 11 : 在庫取引数
// 12 : ソース番号
// 13 : 参照番号
exec_tokuuri_ins(
lineDataMapLT020['IDHINMOKU']
, lineDataMapLT020['IDTOKUISAKI']
, lineDataMapLT020['CDSOUKO']
, lineDataMapLT020['DTTORIHIKI']
, lineDataMapLT020['KBTOKUURI']
, lineDataMapLT020['QTTORIHIKI']
, lineDataMapLT020['PRTORIHIKI']
, lineDataMapLT020['AMTAX']
, lineDataMapLT020['AMTORIHIKI']
, lineDataMapLT020['PRZAIKO']
, lineDataMapLT020['QTZAIKO']
, lineDataMapLT020['NRSOURCE']
, lineDataMapLT020['NRTOKUURI']
);
var _KBTOKUURI = lineDataMapLT020['KBTOKUURI'];
//得意先の請求方式区分を取得
var itemSelectListET010 = selectET010(lineDataMapLT020['IDTOKUISAKI']);
var lineDataMapET020 = itemSelectListET010[0];
var _KBSEIKYUHOUSHIKI = lineDataMapET020['KBSEIKYUHOUSHIKI'];
if (_KBSEIKYUHOUSHIKI == '20') {
//請求見出し[ET110]
if (_KBTOKUURI == '10') {
var itemSelectListET100 = selectET100_NRSOURCE('02',_NRSOURCE);
} else {
var itemSelectListET100 = selectET100_NRSOURCE('01',_NRSOURCE);
}
//有効な売掛が作成された場合のみ実施
if (itemSelectListET100.length > 0) {
var lineDataMapET100 = itemSelectListET100[0];
var itemDataList = new Array();
//請求№
//itemDataList['NRSEIKYU'] = lineDataMapET100['NRURIKAKE'];
var numList = TALON.getNumberingData('XDMF_EF_SEIKYU', 1)
itemDataList['NRSEIKYU'] = numList[0];
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMapET100['IDTOKUISAKI'];
//請求日(システム日時)
itemDataList['DTSEIKYU'] = tln_com_nowdate();
//摘要(null)
itemDataList['TXTEKIYO'] = "";
//請求額
itemDataList['AMSEIKYU'] = lineDataMapET100['AMZOUGEN'];
//前回以降入金額
itemDataList['AMNYUKIN'] = 0;
insertET110(itemDataList);
//更新した請求番号を現時点有効な売掛増減履歴に書き込む
TALON.update(
"UPDATE ET100 SET NRSEIKYU = '" + itemDataList['NRSEIKYU'] + "' " +
"WHERE NRURIKAKE = '" + lineDataMapET100['NRURIKAKE'] + "'"
);
}
}
}
execXDMF_LF021_0();
CLI項目 FOCUS OUT JS: PRTORIHIKI BLOCK 1 FOCUS_OUT_JAVASCRIPT/PRTORIHIKI 626字
var objSU = %1_QTTORIHIKI%;
var objTANKA = %1_PRTORIHIKI%;
var objKINGAKU = %1_AMTORIHIKI%;
var objTAX = %1_AMTAX%;
if (objSU.value=='') { objSU.value = '0'; }
if (objTANKA.value=='') { objTANKA.value = '0'; }
/* カンマを除去して計算して、カンマ編集して金額項目にセット */
objKINGAKU.value = parseInt(objSU.value.replace(',','')) * parseInt(objTANKA.value.replace(',',''));
objKINGAKU.value = objKINGAKU.value.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
objTAX.value = Math.floor(parseInt(objSU.value.replace(',','')) * parseInt(objTANKA.value.replace(',','')) * 0.08);
objTAX.value = objTAX.value.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
CLI項目 FOCUS OUT JS: QTTORIHIKI BLOCK 1 FOCUS_OUT_JAVASCRIPT/QTTORIHIKI 626字
var objSU = %1_QTTORIHIKI%;
var objTANKA = %1_PRTORIHIKI%;
var objKINGAKU = %1_AMTORIHIKI%;
var objTAX = %1_AMTAX%;
if (objSU.value=='') { objSU.value = '0'; }
if (objTANKA.value=='') { objTANKA.value = '0'; }
/* カンマを除去して計算して、カンマ編集して金額項目にセット */
objKINGAKU.value = parseInt(objSU.value.replace(',','')) * parseInt(objTANKA.value.replace(',',''));
objKINGAKU.value = objKINGAKU.value.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
objTAX.value = Math.floor(parseInt(objSU.value.replace(',','')) * parseInt(objTANKA.value.replace(',','')) * 0.08);
objTAX.value = objTAX.value.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
SVRサーバJS:確定処理後 BLOCK 1 JAVA_SCRIPT_ENGINE/UPDATE_AFTER 2087字
コード概要 (抽出)
DB 読: FT010
DB 書: LT020
メッセージ: ERROR×4
参照項目 (当機能): NRTOKUURI (特殊売上№)IDHINMOKU (品目ID)CDSOUKO (取引倉庫C)KBTOKUURI (取引区分)AMTORIHIKI (税抜取引額)QTTORIHIKI (取引数)PRZAIKO (在庫単価)QTZAIKO (在庫取引数)
//入力値取得
var itemBlockListHed = TALON.getBlockData_List(1);
var lineDataMap = itemBlockListHed[0];
var _NRTOKUURI = lineDataMap['NRTOKUURI'];
var _IDHINMOKU = lineDataMap['IDHINMOKU'];
var _CDSOUKO = lineDataMap['CDSOUKO'];
var _KBTOKUURI = lineDataMap['KBTOKUURI'];
var _AMTORIHIKI = lineDataMap['AMTORIHIKI'];
var _QTTORIHIKI = lineDataMap['QTTORIHIKI'];
var _PRZAIKO = lineDataMap['PRZAIKO'];
var _QTZAIKO = lineDataMap['QTZAIKO'];
//更新フィールドの設定
var itemColNameTbl = [
'NRTOKUURI' ,
'PRZAIKO' ,
'QTZAIKO'
];
if ( _KBTOKUURI == '20') {
//直接出荷のときは倉庫在庫の出庫単価を取得して在庫単価にセットする。在庫取引数には画面の取引数をセットする。
var sql =
"SELECT " +
" IDHINMOKU " +
",CDSOUKO " +
",QTGENZAIKO " +
",PRGENZAIKO " +
"FROM FT010 " +
"WHERE IDHINMOKU = '" + _IDHINMOKU + "'" +
" AND CDSOUKO = '" + _CDSOUKO + "'"
;
var itemSelectList = TALON.select(sql);
if (itemSelectList.length == 0) {
TALON.addErrorMsg( "在庫が存在しないため、出庫単価を設定できません。" );
TALON.setIsSuccess(false);
} else {
var lineDataMapS = itemSelectList[0];
var _QTGENZAIKO = lineDataMapS['QTGENZAIKO'];
var _PRGENZAIKO = lineDataMapS['PRGENZAIKO'];
//現在庫数 <= 0 はエラー
if ( _PRGENZAIKO <= 0 ) {
TALON.addErrorMsg( "在庫が存在しないため、出庫単価を設定できません。" );
TALON.setIsSuccess(false);
} else {
//データの設定
var itemDataList = new Array();
itemDataList['NRTOKUURI'] = _NRTOKUURI;
itemDataList['PRZAIKO'] = _PRGENZAIKO;
itemDataList['QTZAIKO'] = _QTTORIHIKI;
var whereList = new Array();
var whereTbl1 = [ null, '=' , 'NRTOKUURI' ];
whereList.push(whereTbl1);
TALON.updateByMap( 'LT020', itemDataList , itemColNameTbl , whereList );
}
}
} else {
//売上返品のとき
//在庫取引数が0かつ在庫単価>0 はエラー → 在庫取引数を入力して下さい
if ( _QTZAIKO == 0 && _PRZAIKO > 0 ) {
TALON.addErrorMsg( "売上返品時は在庫取引数を入力して下さい。" );
TALON.setIsSuccess(false);
}
//在庫取引数>0かつ在庫単価が0 はエラー → 在庫単価を入力して下さい
if ( _QTZAIKO > 0 && _PRZAIKO == 0 ) {
TALON.addErrorMsg( "売上返品時は在庫単価を入力して下さい。" );
TALON.setIsSuccess(false);
}
}
BODY_SQLBLOCK 1 [CARD] 1146字
SELECT
LT020.NRTOKUURI as NRTOKUURI
,LT020.DTTORIHIKI as DTTORIHIKI
,LT020.IDTOKUISAKI as IDTOKUISAKI
,AT030.TXKANJI as TXKANJI
,LT020.IDHINMOKU as IDHINMOKU
,BT010.TXHINBAN as TXHINBAN
,BT010.TXHINMEI as TXHINMEI
,LT020.KBTOKUURI as KBTOKUURI
,LT020.CDSOUKO as CDSOUKO
,AT040.TXSOUKO as TXSOUKO
,LT020.SQSYUKKASAKI as SQSYUKKASAKI
,ET011.TXKANJI as TXSYUKKASAKI
,LT020.PRTORIHIKI as PRTORIHIKI
,LT020.QTTORIHIKI as QTTORIHIKI
,BT010.KBUNIT as KBUNIT
,LT020.AMTORIHIKI as AMTORIHIKI
,LT020.AMTAX as AMTAX
,LT020.PRZAIKO as PRZAIKO
,LT020.QTZAIKO as QTZAIKO
,LT020.TXTEKIYO as TXTEKIYO
,LT020.MODIFY_COUNT as MODIFY_COUNT
,LT020.NRSOURCE as NRSOURCE
FROM
LT020 INNER JOIN BT010
ON LT020.IDHINMOKU = BT010.IDHINMOKU
INNER JOIN AT030
ON LT020.IDTOKUISAKI = AT030.IDTORIHIKISAKI
INNER JOIN AT040
ON LT020.CDSOUKO = AT040.CDSOUKO
LEFT OUTER JOIN ET011
ON LT020.IDTOKUISAKI = ET011.IDTOKUISAKI AND LT020.SQSYUKKASAKI= ET011.SQSYUKKASAKI
≣ サーバJS ライブラリASP_COMMON JavaScriptエンジン共通コード(ASP_COMMON) 3732字
/**
* 共通
*
* @version 2022/06/29
*/
//-------------------------------------------
//[共通]処理0
//-------------------------------------------
function tln_com_escape(val) {
if (val == null) return val;
var s = String(val);
return s
.replace(/\\/g, '\\\\')
.replace(/'/g, "''")
.replace(/\x00/g, '')
}
function getMapVal(map , id) {
var _rec = null;
_rec = map[id];
if (_rec == null) {
_rec = map[id.toLowerCase()];
}
return _rec;
}
function setMapVal(map , id , val) {
if ( TALON.getDbConfig().isPostgres() ) {
map[ id.toLowerCase() ] = val;
} else {
map[ id ] = val;
}
}
function chkLowercase() {
if ( TALON.getDbConfig().isPostgres() ) {
return true;
} else if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE BINARY TABLE_NAME = BINARY 'ASP_M_BOM' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal( lineDataMap , 'CNT' );
if (_CNT == 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
function editLowList(obj) {
if ( TALON.getDbConfig().isPostgres() ) {
for(var lop = 0; lop < obj.length; lop++) {
obj[lop] = obj[lop].toLowerCase();
}
}
return obj;
}
function getLanguageType() {
var sql = "" +
"SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN " +
"WHERE SIKIBETU_CODE = 'ASP_LANGUAGE' " +
" AND KEY_CODE = 'LANG' ";
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
var lineDataMap = itemSelectList[0];
var now_lang = getMapVal( lineDataMap , 'DSP1' );
return now_lang;
}
function getMessage(msgid, to_lang) {
//メッセージデータベース
var map = {
'MSG001' : ['処理が正常終了しました。','Process completed successfully.',' '],
'MSG002' : ['処理が異常終了しました。','Process terminated abnormally.',' '],
'MSG003' : ['他ユーザによってデータが更新されました。','Data has been updated by another user.',' '],
'MSG101' : ['不良数は0以上、製造数より小さい値で入力してください。','Please enter a value of 0 or more and less than the number of productions for "Scrap quantity".',' '],
'MSG102' : ['すでにステータスが完了の為、実績情報の変更は実施できません。','Status can not be changed because the status is already completed',' '],
'MSG103' : ['作業ステータスが「完了」もしくは「着手中」の場合、イベントは変更できません','Event can not be changed if the status is "Completed" or "Started"',' '],
'MSG501' : ['処理前チェックでエラーになりました。プロジェクトが設定されていません。データまたは設定画面の項目名がPROJECTIDになっているか確認して下さい。','An error occurred in the pre-processing check. Project has not been set. ',' '],
'MSG502' : ['処理前チェックでエラーになりました。計画月度(指定月以降を更新)を入力して下さい。または設定画面の項目名がYMPLN_YYYYMMになっているか確認して下さい。','An error occurred in the pre-processing check. Please enter the "Plan YM". ',' '],
'MSG901' : ['セットアップ・初期化処理が終了しました','Setup and initialization processes have been completed',' '],
'MSG902' : ['セットアップ・パッチ処理が終了しました','Setup and patch processes have been completed',' '],
'MSG904' : ['言語変更が終了しました','Language change processing has been completed',' ']
}
return map[msgid][to_lang];
}
function setRelationData() {
//動的表示の場合、非同期にて実施。最後にCOMMITがされるので、最初にDELETEを実施する
var deleteCount = TalonDbUtil.insert( TALON.getDbConfig() , "DELETE FROM ASP_WK_SAGYO_INFO_MAE " );
var deleteCount = TalonDbUtil.insert( TALON.getDbConfig() , "DELETE FROM ASP_WK_SAGYO_INFO_ATO " );
var insertCount = TalonDbUtil.insert( TALON.getDbConfig() , "INSERT INTO ASP_WK_SAGYO_INFO_MAE SELECT * FROM ASP_V_SAGYO_INFO_MAE" );
var insertCount = TalonDbUtil.insert( TALON.getDbConfig() , "INSERT INTO ASP_WK_SAGYO_INFO_ATO SELECT * FROM ASP_V_SAGYO_INFO_ATO" );
}
≣ サーバJS ライブラリASP_MASTER JavaScriptエンジン共通コード(ASP_MASTER) 8958字
/***************************************************************************************************
識別コード:TLN_GENERAL_JAVASCRIPT_ENGINE
検索キー :ASP_MASTER
***************************************************************************************************/
/* 製造BOMの重複チェック ------------------------------------------------------------------------ */
function fncMstBomChkExist(mapBlock){
strStepMsg = '(製造BOMの重複チェック[fncMstBomChkExist])';
var strMsg1 = '';
var strMsg2 = '';
var strMsg3 = '';
var strMsg4 = '';
var strMsg5 = '';
var strMsg6 = '';
var strSQL =
"SELECT * " +
"FROM ASP_M_BOM " +
"WHERE PROJECTID = '"+getMapVal( mapBlock , 'PROJECTID' )+"' " +
"AND ITEM_CODE = '"+getMapVal( mapBlock , 'ITEM_CODE' )+"' " +
"AND KOUTEI_NO = '"+getMapVal( mapBlock , 'KOUTEI_NO' )+"' " +
"AND SASIZU_SYUBETU = '"+getMapVal( mapBlock , 'SASIZU_SYUBETU')+"' " +
"AND SASIZU_CODE = '"+getMapVal( mapBlock , 'SASIZU_CODE' )+"' " +
"AND SIGEN_CODE = '"+getMapVal( mapBlock , 'SIGEN_CODE' )+"' ";
if( getMapVal( mapBlock , 'KOUTEI_SELECTOR' ) == null || getMapVal( mapBlock , 'KOUTEI_SELECTOR' ) == ''){
strSQL += "AND KOUTEI_SELECTOR IS NULL ";
}else{
strSQL += "AND KOUTEI_SELECTOR = '"+ getMapVal( mapBlock , 'KOUTEI_SELECTOR' )+"' ";
strMsg1 = "工程セレクタ["+ getMapVal( mapBlock , 'KOUTEI_SELECTOR' ) +"]、";
}
if( getMapVal( mapBlock , 'KOUTEI_SELECTOR_JKN' ) == null || getMapVal( mapBlock , 'KOUTEI_SELECTOR_JKN' ) == ''){
strSQL += "AND KOUTEI_SELECTOR_JKN IS NULL ";
}else{
strSQL += "AND KOUTEI_SELECTOR_JKN = '"+ getMapVal( mapBlock , 'KOUTEI_SELECTOR_JKN' ).replace(/\'/g,"''")+"' ";
strMsg2 = "工程セレクタ有効条件["+ getMapVal( mapBlock , 'KOUTEI_SELECTOR_JKN' )+"]、";
}
if( getMapVal( mapBlock , 'KOUTEI_CODE' ) == null || getMapVal( mapBlock , 'KOUTEI_CODE' ) == ''){
strSQL += "AND KOUTEI_CODE IS NULL ";
}else{
strSQL += "AND KOUTEI_CODE = '"+ getMapVal( mapBlock , 'KOUTEI_CODE' ) +"' ";
strMsg3 = "工程コード["+ getMapVal( mapBlock , 'KOUTEI_CODE' ) +"]、";
}
if( getMapVal( mapBlock , 'TASK_SELECTOR' ) == null || getMapVal( mapBlock , 'TASK_SELECTOR' ) == ''){
strSQL += "AND TASK_SELECTOR IS NULL ";
}else{
strSQL += "AND TASK_SELECTOR = '"+ getMapVal( mapBlock , 'TASK_SELECTOR' )+"' ";
strMsg4 = "タスクセレクダ["+ getMapVal( mapBlock , 'TASK_SELECTOR' ) +"]、";
}
if( getMapVal( mapBlock , 'TASK_SELECTOR_JKN' ) == null || getMapVal( mapBlock , 'TASK_SELECTOR_JKN' ) == ''){
strSQL += "AND TASK_SELECTOR_JKN IS NULL ";
}else{
strSQL += "AND TASK_SELECTOR_JKN = '"+ getMapVal( mapBlock , 'TASK_SELECTOR_JKN' ).replace(/\'/g,"''")+"' ";
strMsg5 = "タスクセレクタ有効条件["+ getMapVal( mapBlock , 'TASK_SELECTOR_JKN' )+"]、";
}
if( getMapVal( mapBlock , 'OBJECTID' ) != null && getMapVal( mapBlock , 'OBJECTID' ) != ''){
strMsg6 = "、OBJECTID["+ getMapVal( mapBlock , 'OBJECTID' )+"]";
}
TALON.getLogger().writeInfo(strFuncNm+strStepMsg+" SQL:"+strSQL);
var lstSelect = TALON.select(strSQL);
if(lstSelect.size() == 0){
TALON.setIsSuccess(true);
}else if(lstSelect.size() == 1){
if( getMapVal( mapBlock , 'OBJECTID' ) == getMapVal( lstSelect[0] , 'OBJECTID' ) ){
TALON.setIsSuccess(true);
}else{
TALON.addErrorMsg("重複しています。(PJ["+ getMapVal( mapBlock , 'PROJECTID' ) +"]、品目["+ getMapVal( mapBlock , 'ITEM_CODE' ) +"]、"+ strMsg1 + strMsg2 + "工程番号["+ getMapVal( mapBlock , 'KOUTEI_NO' ) +"]"
+ strMsg3 + strMsg4 + strMsg5 + "指図種別["+ getMapVal( mapBlock , 'SASIZU_SYUBETU' ) +"]、指図コード["+ getMapVal( mapBlock , 'SASIZU_CODE' ) +"]、品目/資源コード["+ getMapVal( mapBlock , 'SIGEN_CODE' ) +"]"+ strMsg6 +")");
TALON.setIsSuccess(false);
}
}else{
TALON.addErrorMsg("重複しています。(PJ["+ getMapVal( mapBlock , 'PROJECTID' ) +"]、品目["+ getMapVal( mapBlock , 'ITEM_CODE' ) +"]、"+ strMsg1 + strMsg2 +"工程番号["+ getMapVal( mapBlock , 'KOUTEI_NO' ) +"]"
+ strMsg3 + strMsg4 + strMsg5 + "指図種別["+ getMapVal( mapBlock , 'SASIZU_SYUBETU' ) +"]、指図コード["+ getMapVal( mapBlock , 'SASIZU_CODE' ) +"]、品目/資源コード["+ getMapVal( mapBlock , 'SIGEN_CODE' ) +"]"+ strMsg6 +")");
TALON.setIsSuccess(false);
}
}
/* 製造BOMの品目/資源チェック ------------------------------------------------------------------------ */
function fncMstBomChkSigen(mapBlock){
strStepMsg = '(製造BOMの品目/資源チェック[fncMstBomChkSigen])';
var strMsg6 = '';
if( getMapVal( mapBlock , 'SASIZU_SYUBETU' ) == 'U'){
var strSigen = getMapVal( mapBlock , 'SIGEN_CODE' ).split(";");
for (var i in strSigen) {
var strSQL =
"SELECT * " +
"FROM ( " +
" SELECT " +
" SIGEN1.PROJECTID " +
" ,'U' AS SASIZU_SYUBETU " +
" ,SIGEN1.SIGEN_CODE AS CODE " +
" ,SIGEN1.SIGEN_NM AS NM " +
" ,SIGEN1.SIGEN_GROUP AS GRP " +
" ,SIGEN2.SIGEN_NM AS GRP_NM " +
" ,CASE WHEN SIGENG.SIGEN_GROUP IS NOT NULL THEN 'グループ設定あり' END AS MST_UMU " +
" FROM ASP_M_SIGEN SIGEN1 " +
" LEFT OUTER JOIN ASP_M_SIGEN SIGEN2 ON SIGEN1.PROJECTID = SIGEN2.PROJECTID AND SIGEN1.SIGEN_GROUP = SIGEN2.SIGEN_CODE " +
" LEFT OUTER JOIN ( " +
" SELECT PROJECTID,SIGEN_GROUP FROM ASP_M_SIGEN GROUP BY PROJECTID,SIGEN_GROUP " +
" ) SIGENG ON SIGEN1.PROJECTID = SIGENG.PROJECTID AND SIGEN1.SIGEN_CODE = SIGENG.SIGEN_GROUP " +
" UNION " +
" /** 資源グループに設定されていて、資源の登録がないデータを補完 **/ " +
" SELECT " +
" SIGEN1.PROJECTID " +
" ,'U' AS SASIZU_SYUBETU " +
" ,SIGEN1.SIGEN_GROUP AS CODE " +
" ,NULL AS NM " +
" ,NULL AS GRP " +
" ,NULL AS GRP_NM " +
" ,'グループ設定ありマスタなし' AS MST_UMU " +
" FROM ASP_M_SIGEN SIGEN1 " +
" WHERE SIGEN1.SIGEN_GROUP IS NOT NULL " +
" AND NOT EXISTS (SELECT 1 FROM ASP_M_SIGEN SIGENG WHERE SIGEN1.PROJECTID = SIGENG.PROJECTID AND SIGEN1.SIGEN_GROUP = SIGENG.SIGEN_CODE) " +
" GROUP BY SIGEN1.PROJECTID,SIGEN1.SIGEN_GROUP " +
") SIGEN " +
"WHERE PROJECTID = '"+ getMapVal( mapBlock , 'PROJECTID' ) +"' " +
"AND CODE = '"+ strSigen[i] +"' ";
TALON.getLogger().writeInfo(strFuncNm+strStepMsg+" SQL:"+strSQL);
var lstSelect = TALON.select(strSQL);
if(lstSelect.size() == 0){
if( getMapVal( mapBlock , 'OBJECTID' ) != null && getMapVal( mapBlock , 'OBJECTID' ) != ''){
strMsg6 = "、OBJECTID["+ getMapVal( mapBlock , 'OBJECTID' ) +"]";
}
TALON.addErrorMsg("資源["+ strSigen[i] +"]が存在しません。(PJ["+ getMapVal( mapBlock , 'PROJECTID' ) +"]、品目["+ getMapVal( mapBlock , 'ITEM_CODE' ) +"]、"+"工程番号["+ getMapVal( mapBlock , 'KOUTEI_NO' ) +"]"
+"指図種別["+ getMapVal( mapBlock , 'SASIZU_SYUBETU' ) +"]、指図コード["+ getMapVal( mapBlock , 'SASIZU_CODE' ) +"]、品目/資源コード["+ getMapVal( mapBlock , 'SIGEN_CODE' ) +"]"+ strMsg6 +")");
TALON.setIsSuccess(false);
break;
}
}
}else{
var strSQL =
"SELECT * " +
"FROM ( " +
" SELECT " +
" ITEM1.PROJECTID " +
" ,ITEM1.ITEM_CODE AS CODE " +
" ,ITEM1.ITEM_NM AS NM " +
" ,ITEM1.ITEM_GROUP AS GRP " +
" ,ITEM2.ITEM_NM AS GRP_NM " +
" ,NULL AS MST_UMU " +
" FROM ASP_M_ITEM ITEM1 " +
" LEFT OUTER JOIN ASP_M_ITEM ITEM2 ON ITEM1.PROJECTID = ITEM2.PROJECTID AND ITEM1.ITEM_GROUP = ITEM2.ITEM_CODE " +
" /** 製造BOMの入力指図の品目に品目グループは設定不可のため除外 **/ " +
" WHERE NOT EXISTS (SELECT 1 FROM ASP_M_ITEM ITEMG WHERE ITEM1.PROJECTID = ITEMG.PROJECTID AND ITEM1.ITEM_CODE = ITEMG.ITEM_GROUP) " +
" UNION " +
" /** 製造BOMの工程NOから、品目の登録がない中間品データを補完 **/ " +
" SELECT " +
" MST.PROJECTID " +
" ,MST.CODE " +
" ,NULL AS NM " +
" ,NULL AS GRP " +
" ,NULL AS GRP_NM " +
" ,'マスタなし' AS MST_UMU " +
" FROM ( " +
" SELECT " +
" PROJECTID " +
" ,CONCAT(CONCAT(ITEM_CODE,'-'),KOUTEI_NO) AS CODE " +
" FROM ASP_M_BOM BOM " +
" WHERE NOT EXISTS ( " +
" SELECT 1 FROM (SELECT PROJECTID,ITEM_CODE,MAX(KOUTEI_NO) AS KOUTEI_NO FROM ASP_M_BOM GROUP BY PROJECTID,ITEM_CODE) MAXNO " +
" WHERE BOM.PROJECTID = MAXNO.PROJECTID AND BOM.ITEM_CODE = MAXNO.ITEM_CODE AND BOM.KOUTEI_NO = MAXNO.KOUTEI_NO " +
" ) " +
" GROUP BY PROJECTID,ITEM_CODE,KOUTEI_NO " +
" ) MST " +
" WHERE NOT EXISTS (SELECT 1 FROM ASP_M_ITEM ITM WHERE MST.PROJECTID = ITM.PROJECTID AND MST.CODE = ITM.ITEM_CODE) " +
") ITEM " +
"WHERE PROJECTID = '"+ getMapVal( mapBlock , 'PROJECTID' ) +"' " +
"AND CODE = '"+ getMapVal( mapBlock , 'SIGEN_CODE' ) +"' ";
TALON.getLogger().writeInfo(strFuncNm+strStepMsg+" SQL:"+strSQL);
var lstSelect = TALON.select(strSQL);
if(lstSelect.size() == 0){
if( getMapVal( mapBlock , 'OBJECTID' ) != null && getMapVal( mapBlock , 'OBJECTID' ) != ''){
strMsg6 = "、OBJECTID["+ getMapVal( mapBlock , 'OBJECTID' ) +"]";
}
TALON.addErrorMsg("品目["+ getMapVal( mapBlock , 'SIGEN_CODE' ) +"]が存在しません。(PJ["+ getMapVal( mapBlock , 'PROJECTID' ) +"]、品目["+ getMapVal( mapBlock , 'ITEM_CODE' ) +"]、"+"工程番号["+ getMapVal( mapBlock , 'KOUTEI_NO' ) +"]"
+"指図種別["+ getMapVal( mapBlock , 'SASIZU_SYUBETU' ) +"]、指図コード["+ getMapVal( mapBlock , 'SASIZU_CODE' ) +"]、品目/資源コード["+ getMapVal( mapBlock , 'SIGEN_CODE' ) +"]"+ strMsg6 +")");
TALON.setIsSuccess(false);
}
}
}
≣ サーバJS ライブラリASP_SETUP JavaScriptエンジン共通コード(ASP_SETUP) 129652字
/**
* セットアップ共通(環境構築)
*
* @version 2019/10/09
*/
//--------------------------------------------
// セットアップ関連共通
//--------------------------------------------
function table_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_TABLES WHERE TABLE_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM information_schema.tables WHERE table_name = '" + nm + "' AND table_schema = '" + _DSP1 + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'U' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(DISTINCT table_name) AS CNT FROM information_schema.columns WHERE LOWER(table_name) = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function function_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION' AND OBJECT_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_SCHEMA = '" + _DSP1 + "' AND SPECIFIC_NAME = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'FN' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM pg_proc WHERE proname = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function view_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_OBJECTS WHERE OBJECT_TYPE = 'VIEW' AND OBJECT_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '" + nm + "' AND TABLE_SCHEMA = '" + _DSP1 + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'V' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM pg_class WHERE relkind = 'v' and relname = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function field_exists(nm,fl) {
if ( !TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE TABLE_NAME = '" + nm + "' AND COLUMN_NAME = '" + fl + "' " );
} else {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE TABLE_NAME = LOWER('" + nm + "') AND COLUMN_NAME = LOWER('" + fl + "') " );
}
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function executeSQL(sql) {
if ( TALON.getDbConfig().isOra() ) {
//Oracleの場合true
TALON.executeSQL(sql);
};
if ( TALON.getDbConfig().isMy() ) {
//MySQLの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
if ( TALON.getDbConfig().isMssql() ) {
//MsSqlServerの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
if ( TALON.getDbConfig().isPostgres() ) {
//Postgresの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
}
function table_exists_drop(nm) {
if (table_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP TABLE " + nm ) ;
} else {
executeSQL( "DROP TABLE " + nm.toLowerCase() ) ;
}
}
}
function function_exists_drop(nm) {
if (function_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP FUNCTION " + nm ) ;
} else {
executeSQL( "DROP FUNCTION " + nm.toLowerCase() ) ;
}
}
}
function view_exists_drop(nm) {
if (view_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP VIEW " + nm ) ;
} else {
executeSQL( "DROP VIEW " + nm.toLowerCase() ) ;
}
}
}
//--------------------------------------------
// セットアップ後環境別データ修正
//--------------------------------------------
function exec_custom() {
if ( TALON.getDbConfig().isMy() ) {
//MySQLの場合true
if ( chkLowercase() ) {
//lowercaseとして判断
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_APP SET VALUE = LOWER(VALUE) WHERE FUNC_KBN = 'UPDATE_TABLE' AND FUNC_ID LIKE 'ASP_%' ");
}
}
if ( TALON.getDbConfig().isMssql() ) {
//MsSqlServerの場合true
var array = ["TLN_CHAR_TO_DATE", "TLN_CHAR_TO_NUMBER", "TLN_CHARINDEX", "TLN_CONCAT", "TLN_DATE_TIME_TO_CHAR", "TLN_DATE_TIME_TO_DATETIME", "TLN_DATE_TO_CHAR", "TLN_DATE_TO_WEEKDAY", "TLN_DATEADD", "TLN_DATEDIFF", "TLN_FIRSTDAY", "TLN_LEN", "TLN_LF", "TLN_MID", "TLN_ROUND", "TLN_ROUND_INT", "TLN_SYSDATE"]
var i;
var num = array.length;
for(i=0;i < num;i++){
//--------------
//TLN_M_GENERAL_FUNC_SQL
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_GENERAL_FUNC_SQL " +
" SET " +
" BODY_SQL = REPLACE(REPLACE(BODY_SQL ,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" ,TITLE_SQL = REPLACE(REPLACE(TITLE_SQL,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE FUNC_ID LIKE 'ASP_%' "
);
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_GENERAL_ITEM_OPTN " +
" SET " +
" CHR_TEXT = REPLACE(REPLACE(CHR_TEXT,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_ID <> 'ASP_SYS0010' " +
" AND (FUNC_KBN = 'JAVA_SCRIPT_ENGINE' OR (FUNC_KBN = 'BUTTON_BAT' AND FLAG = 2)) "
);
//--------------
//TLN_M_HANYO_CODE_MAIN
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_HANYO_CODE_MAIN " +
" SET " +
" NOTE = REPLACE(REPLACE(NOTE,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE SIKIBETU_CODE = 'TLN_GENERAL_JAVASCRIPT_ENGINE' " +
" AND KEY_CODE <> 'ASP_SETUP' "
);
}
}
if ( TALON.getDbConfig().isPostgres() ) {
//PostgreSQLの場合true
//lower
//--------------
//TLN_M_GENERAL_ITEM
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM SET COL_NAME = LOWER(COL_NAME) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_ID <> 'ASP_SYS0010' ");
//--------------
//TLN_M_GENERAL_FUNC_SQL
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%ITEM_CODE%' , LOWER('%ITEM_CODE%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%PROJECTID%' , LOWER('%PROJECTID%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%YM%' , LOWER('%YM%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%SIGEN_CODE%' , LOWER('%SIGEN_CODE%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%ITEM_SYUBETU_I%' , LOWER('%ITEM_SYUBETU_I%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%TENKAI_HOUKOU%' , LOWER('%TENKAI_HOUKOU%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%USER_ID%' , LOWER('%USER_ID%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%OPERATION_KBN%' , LOWER('%OPERATION_KBN%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%YMPLN_YYYYMM_SEARCH%' , LOWER('%YMPLN_YYYYMM_SEARCH%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%DEL_FLG_SEARCH%' , LOWER('%DEL_FLG_SEARCH%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%ALL_SEARCH%' , LOWER('%ALL_SEARCH%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%PLN_YM%' , LOWER('%PLN_YM%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%SEL_END_DATA_INCLUDE%' , LOWER('%SEL_END_DATA_INCLUDE%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%SIGEN_SEIYAKU_KBN%' , LOWER('%SIGEN_SEIYAKU_KBN%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%BACK_COLOR_FUNC%' , LOWER('%BACK_COLOR_FUNC%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%PROJECTID_1%' , LOWER('%PROJECTID_1%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%PROJECTID_2%' , LOWER('%PROJECTID_2%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%AVGKIKAN%' , LOWER('%AVGKIKAN%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = replace( BODY_SQL , '%STDEV%' , LOWER('%STDEV%') ) WHERE FUNC_ID LIKE 'ASP_%' ");
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET COL_NAME = LOWER(COL_NAME) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_SEQ > -1 AND ( FUNC_KBN IN ('BACK_COLOR' , 'CSV_LOAD_BUTTON_COL' , 'CSV_OUT_BUTTON_COL' , 'DISP_POS' , 'DRILL_DOWN' , 'FIX_FORMULA' , 'FOCUS_OUT_JAVASCRIPT' , 'FORE_COLOR' , 'INIT_VALUE_TEXT' , 'INPUT_CONDITION' , 'JAVASCRIPT' , 'JAVASCRIPT_ENGINE' , 'XX_JAVA_SCRIPT_ENGINE' , 'JOIN' , 'LOOK_UP' , 'LOOK_UP_FUNC_ID' , 'MASTER_CHECK' , 'MATCH_PATTERN' , 'REGIST_VALUE' , 'REQUIRED_SEARCH' , 'SAIBAN_SIKIBETU_CODE' , 'SEARCH_FUNC_ID' , 'SEARCH_METHOD' , 'SUB_SEARCH' , 'IS_DB_NOT_REGIST' , 'SUGGEST_FUNC_ID' , 'SUGGEST' , 'BARCODE_FORMAT' , 'THUMBNAIL_SIZE' , '' ) OR FUNC_KBN LIKE 'BUTTON_NEXT_%' ) ");
// -- BACK_COLOR
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%ITEM_CODE%' , LOWER('%ITEM_CODE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%DUP_FLG%' , LOWER('%DUP_FLG%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%OPE_FLG%' , LOWER('%OPE_FLG%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%HENKO_NG_FLG%' , LOWER('%HENKO_NG_FLG%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%SAGYO_STATUS%' , LOWER('%SAGYO_STATUS%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%KOUTEI_CODE%' , LOWER('%KOUTEI_CODE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%PROJECTID_KBN%', LOWER('%PROJECTID_KBN%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%DATA_KBN%' , LOWER('%DATA_KBN%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BACK_COLOR' ");
// -- BUTTON_NEXT
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = replace( CHR4 , '%1_ORDER_SYUBETU%', LOWER('%1_ORDER_SYUBETU%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = replace( CHR4 , '%1_DATA_KBN%' , LOWER('%1_DATA_KBN%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = replace( CHR4 , '%1_ORDER_STATUS%' , LOWER('%1_ORDER_STATUS%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = replace( CHR4 , '%1_SAGYO_STATUS%' , LOWER('%1_SAGYO_STATUS%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
// -- BUTTON_NEXT_x
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN LIKE 'BUTTON_NEXT_%' ");
// -- CHART
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) , CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'CHART' AND COL_NAME IN ('CHART_SERIES_BASE' , 'CHART_AXIS_X_BASE') ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND) , CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN='CHART' AND COL_NAME LIKE 'CHART_SERIES_ONCLICK_%' AND COL_NAME <> 'CHART_SERIES_ONCLICK_WINSIZE' ");
// -- FORE_COLOR
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%SAGYO_STATUS%', LOWER('%SAGYO_STATUS%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'FORE_COLOR' ");
// -- INIT_VALUE_TEXT
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = replace( CHR1 , '%PROJECTID%', LOWER('%PROJECTID%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'INIT_VALUE_TEXT' ");
// -- INPUT_CONDITION
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_DEL_FLG%' , LOWER('%1_DEL_FLG%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'INPUT_CONDITION' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_ORDER_SYUBETU%' , LOWER('%1_ORDER_SYUBETU%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'INPUT_CONDITION' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_SASIZU_SYUBETU%', LOWER('%1_SASIZU_SYUBETU%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'INPUT_CONDITION' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_SAGYO_STATUS%' , LOWER('%1_SAGYO_STATUS%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'INPUT_CONDITION' ");
// -- LOOK_UP
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1),CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'LOOK_UP' ");
// -- MATCH_PATTERN
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_ORDER_SU%' , LOWER('%1_ORDER_SU%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_ORDER_SYUBETU%' , LOWER('%1_ORDER_SYUBETU%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_SAGYO_STATUS%' , LOWER('%1_SAGYO_STATUS%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_END_DATE%' , LOWER('%1_END_DATE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_SEIZO_SU%' , LOWER('%1_SEIZO_SU%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_SIGEN_CODE%' , LOWER('%1_SIGEN_CODE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_START_DATE%' , LOWER('%1_START_DATE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_SEIZO_START_DATE%' , LOWER('%1_SEIZO_START_DATE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_SEIZO_END_DATE%' , LOWER('%1_SEIZO_END_DATE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_MAE_DANDORI_END_DATE%' , LOWER('%1_MAE_DANDORI_END_DATE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = replace( KIND , '%1_MAE_DANDORI_START_DATE%' , LOWER('%1_MAE_DANDORI_START_DATE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
// -- REGIST_VALUE
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'REGIST_VALUE' AND CHR1 NOT IN ('\"B\"','\"T\"') ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%2_SAGYO_STATUS%' , LOWER('%2_SAGYO_STATUS%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'REGIST_VALUE' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = replace( CHR2 , '%1_SEIZO_END_DATE%' , LOWER('%1_SEIZO_END_DATE%') ) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'REGIST_VALUE' ");
// -- SUB_SEARCH
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1),CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'SUB_SEARCH' ");
// -- SUGGEST
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1),CHR2 = LOWER(CHR2),CHR3 = LOWER(CHR3) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN = 'SUGGEST' ");
//TLN_M_GENERAL_APP
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_APP SET VALUE = LOWER(VALUE) WHERE FUNC_ID LIKE 'ASP_%' AND FUNC_KBN IN ('UPDATE_TABLE' , 'SCHEDULE_EVENT_TEXT_COL','SCHEDULE_EVENT_TOOLTIP_COL','SCHEDULE_FROM_DATE_COL','SCHEDULE_TITLE_COL','SCHEDULE_TO_DATE_COL','SCHEDULE_UNIQUE_COL','SCHEDULE_CONNECT_TO_COL' ) ");
//TLN_M_GENERAL_USES
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_USES SET KEY_CODE = LOWER(KEY_CODE) WHERE FUNC_ID LIKE 'ASP_%' AND USER_CODE = 'TLN_GEN_ALL' AND OPTN IN ( 'ITEM', 'ASC', 'DESC', 'DRILL_LEVEL') ");
}
}
function exec_object( _func_chk ){
//画面でファンクションの再構築が設定された場合(初回インストールは固定1で呼び出される)
if ( _func_chk == '1' ) {
//ファンクションの再構築 →ファンクション・Viewはパッチ毎に最新を作成
exec_create_Function();
//Viewの再構築 →ファンクション・Viewはパッチ毎に最新を作成
exec_create_View();
}
}
function exec_create_Function() {
//≪FUNCTION DROP≫
//--------------------
//
// function_exists_drop('XXXXXXXXXX');
// *
// * if ( TALON.getDbConfig().isOra() ) {
// * //
// * executeSQL(
// * "CREATE FUNCTION XXXXXX ( " + "\n" +
// * ""
// * );
// *
// * };
// * if ( TALON.getDbConfig().isMy() ) {
// * //
// * //SQLファイルで作成
// *
// * };
// * if ( TALON.getDbConfig().isMssql() ) {
// * //
// * executeSQL(
// * "CREATE FUNCTION XXXXXX ( " + "\n" +
// * ""
// * );
// *
// * };
// * if ( TALON.getDbConfig().isPostgres() ) {
// * //
// * //SQLファイルで作成
// *
// * };
}
function exec_create_View() {
//≪VIEW DROP≫
//--------------------
//
view_exists_drop('ASP_V_SAGYO_JSK_TO_ASPROVA');
//
view_exists_drop('ASP_V_SAGYO_OPE_TO_ASPROVA');
//
view_exists_drop('ASP_V_ORDER_TO_ASPROVA');
//
view_exists_drop('ASP_V_SAGYO_INFO_ATO');
//
view_exists_drop('ASP_V_SAGYO_INFO_MAE');
//
view_exists_drop('ASP_V_SAGYO_INFO');
//
view_exists_drop('ASP_V_SAGYO_JSK');
//
view_exists_drop('ASP_V_SAGYO_OPE');
//--------------------
executeSQL(
"CREATE VIEW ASP_V_SAGYO_JSK_TO_ASPROVA AS " + "\n" +
"SELECT " + "\n" +
" ASP_SAGYO_JSK.PROJECTID " + "\n" +
" ,ASP_SAGYO_JSK.SAGYO_CODE " + "\n" +
" ,ASP_SAGYO_SYS.ORDER_CODE " + "\n" +
" ,ASP_SAGYO_SYS.KOUTEI_NO " + "\n" +
" " + "\n" +
" ,CASE WHEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL THEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE ELSE ASP_SAGYO_JSK.SEIZO_START_DATE END AS START_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_END_DATE AS END_DATE " + "\n" +
" " + "\n" +
" ,ASP_SAGYO_JSK.SIGEN_CODE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_SU " + "\n" +
" ,ASP_SAGYO_JSK.SAGYO_STATUS " + "\n" +
" ,ASP_SAGYO_JSK.FURYO_SU " + "\n" +
" ,ASP_SAGYO_JSK.SAIKI_FLG " + "\n" +
" " + "\n" +
"FROM ASP_SAGYO_JSK " + "\n" +
"INNER JOIN ASP_SAGYO_SYS " + "\n" +
" ON ASP_SAGYO_JSK.PROJECTID = ASP_SAGYO_SYS.PROJECTID " + "\n" +
" AND ASP_SAGYO_JSK.SAGYO_CODE = ASP_SAGYO_SYS.SAGYO_CODE " + "\n" +
"INNER JOIN ASP_ORDER_SYS " + "\n" +
" ON ASP_SAGYO_SYS.ORDER_CODE = ASP_ORDER_SYS.ORDER_CODE " + "\n" +
" AND ASP_ORDER_SYS.DEL_FLG IS NULL " + "\n" +
"-- 実績入力 オーダ未完了分がインポート対象 " + "\n" +
"WHERE ASP_ORDER_SYS.ORDER_STATUS <> 'B' " + "\n" +
""
);
//--------------------
executeSQL(
"CREATE VIEW ASP_V_SAGYO_OPE_TO_ASPROVA AS " + "\n" +
"SELECT " + "\n" +
" ASP_SAGYO_OPE.PROJECTID " + "\n" +
" ,ASP_SAGYO_OPE.SAGYO_CODE " + "\n" +
" ,ASP_SAGYO_SYS.ORDER_CODE " + "\n" +
" ,ASP_SAGYO_SYS.KOUTEI_NO " + "\n" +
" ,ASP_SAGYO_OPE.START_DATE " + "\n" +
" ,ASP_SAGYO_OPE.END_DATE " + "\n" +
" ,ASP_SAGYO_SYS.SIGEN_CODE " + "\n" +
" ,ASP_SAGYO_OPE.SEND_KBN " + "\n" +
" ,'D' AS STATUS " + "\n" +
" ,'1' AS IMP_TIME_ALLOCATE_FLG " + "\n" +
" ,'1' AS TLN_IMP_FLG " + "\n" +
"FROM ASP_SAGYO_OPE " + "\n" +
"INNER JOIN ASP_SAGYO_SYS " + "\n" +
" ON ASP_SAGYO_OPE.PROJECTID = ASP_SAGYO_SYS.PROJECTID " + "\n" +
" AND ASP_SAGYO_OPE.SAGYO_CODE = ASP_SAGYO_SYS.SAGYO_CODE " + "\n" +
"INNER JOIN ASP_ORDER_SYS " + "\n" +
" ON ASP_SAGYO_SYS.ORDER_CODE = ASP_ORDER_SYS.ORDER_CODE " + "\n" +
" AND ASP_ORDER_SYS.DEL_FLG IS NULL " + "\n" +
"-- 計画調整 未送信分 オーダ未完了分がインポート対象 " + "\n" +
"WHERE ASP_SAGYO_OPE.SEND_KBN = '0' -- 0:未送信/1:送信済み計画中/2:送信済み計画終了/9:取消 " + "\n" +
" AND ASP_ORDER_SYS.ORDER_STATUS <> 'B' " + "\n" +
""
);
//--------------------
if ( TALON.getDbConfig().isMssql() ) {
executeSQL(
"CREATE VIEW ASP_V_ORDER_TO_ASPROVA AS " + "\n" +
"SELECT " + "\n" +
" ASP_ORDER_SYS.PROJECTID AS PROJECTID " + "\n" +
" ,ASP_ORDER_SYS.ORDER_CODE AS ORDER_CODE " + "\n" +
" ,ASP_ORDER_SYS.ORDER_SYUBETU AS ORDER_SYUBETU " + "\n" +
" ,ASP_ORDER_SYS.ITEM_CODE AS ITEM_CODE " + "\n" +
" ,dbo.TLN_DATE_TO_CHAR('YMDHMS', ASP_ORDER_SYS.NOKI_DATE) AS NOKI_DATE " + "\n" +
" ,ASP_ORDER_SYS.ORDER_SU AS ORDER_SU " + "\n" +
" ,ASP_ORDER_SYS.YUSENDO AS YUSENDO " + "\n" +
" ,ASP_ORDER_SYS.NOTE AS NOTE " + "\n" +
" ,ASP_ORDER_SYS.SIYO1 AS SIYO1 " + "\n" +
" ,ASP_ORDER_SYS.SIYO2 AS SIYO2 " + "\n" +
" ,ASP_ORDER_SYS.SIYO3 AS SIYO3 " + "\n" +
" ,ASP_ORDER_SYS.SIYO4 AS SIYO4 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM1 AS SIYO_NUM1 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM2 AS SIYO_NUM2 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM3 AS SIYO_NUM3 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM4 AS SIYO_NUM4 " + "\n" +
" ,ASP_ORDER_SYS.ORDER_KBN AS ORDER_KBN " + "\n" +
" ,ASP_ORDER_SYS.ORDER_STATUS AS ORDER_STATUS " + "\n" +
" ,dbo.TLN_DATE_TO_CHAR('YMDHMS', ASP_ORDER_SYS.JSK_START_DATE) AS JSK_START_DATE " + "\n" +
" ,dbo.TLN_DATE_TO_CHAR('YMDHMS', ASP_ORDER_SYS.JSK_END_DATE) AS JSK_END_DATE " + "\n" +
" ,ASP_ORDER_SYS.JSK_ORDER_SU AS JSK_ORDER_SU " + "\n" +
"FROM ASP_ORDER_SYS " + "\n" +
"-- オーダーは削除されたもの、完了ステータスのもの以外はインポート対象とする(洗い替え) " + "\n" +
"WHERE ASP_ORDER_SYS.DEL_FLG IS NULL " + "\n" +
" AND ASP_ORDER_SYS.ORDER_STATUS <> 'B' " + "\n" +
""
);
} else {
executeSQL(
"CREATE VIEW ASP_V_ORDER_TO_ASPROVA AS " + "\n" +
"SELECT " + "\n" +
" ASP_ORDER_SYS.PROJECTID AS PROJECTID " + "\n" +
" ,ASP_ORDER_SYS.ORDER_CODE AS ORDER_CODE " + "\n" +
" ,ASP_ORDER_SYS.ORDER_SYUBETU AS ORDER_SYUBETU " + "\n" +
" ,ASP_ORDER_SYS.ITEM_CODE AS ITEM_CODE " + "\n" +
" ,TLN_DATE_TO_CHAR('YMDHMS', ASP_ORDER_SYS.NOKI_DATE) AS NOKI_DATE " + "\n" +
" ,ASP_ORDER_SYS.ORDER_SU AS ORDER_SU " + "\n" +
" ,ASP_ORDER_SYS.YUSENDO AS YUSENDO " + "\n" +
" ,ASP_ORDER_SYS.NOTE AS NOTE " + "\n" +
" ,ASP_ORDER_SYS.SIYO1 AS SIYO1 " + "\n" +
" ,ASP_ORDER_SYS.SIYO2 AS SIYO2 " + "\n" +
" ,ASP_ORDER_SYS.SIYO3 AS SIYO3 " + "\n" +
" ,ASP_ORDER_SYS.SIYO4 AS SIYO4 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM1 AS SIYO_NUM1 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM2 AS SIYO_NUM2 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM3 AS SIYO_NUM3 " + "\n" +
" ,ASP_ORDER_SYS.SIYO_NUM4 AS SIYO_NUM4 " + "\n" +
" ,ASP_ORDER_SYS.ORDER_KBN AS ORDER_KBN " + "\n" +
" ,ASP_ORDER_SYS.ORDER_STATUS AS ORDER_STATUS " + "\n" +
" ,TLN_DATE_TO_CHAR('YMDHMS', ASP_ORDER_SYS.JSK_START_DATE) AS JSK_START_DATE " + "\n" +
" ,TLN_DATE_TO_CHAR('YMDHMS', ASP_ORDER_SYS.JSK_END_DATE) AS JSK_END_DATE " + "\n" +
" ,ASP_ORDER_SYS.JSK_ORDER_SU AS JSK_ORDER_SU " + "\n" +
"FROM ASP_ORDER_SYS " + "\n" +
"-- オーダーは削除されたもの、完了ステータスのもの以外はインポート対象とする(洗い替え) " + "\n" +
"WHERE ASP_ORDER_SYS.DEL_FLG IS NULL " + "\n" +
" AND ASP_ORDER_SYS.ORDER_STATUS <> 'B' " + "\n" +
""
);
}
//--------------------
if ( TALON.getDbConfig().isMssql() ) {
executeSQL(
"CREATE VIEW ASP_V_SAGYO_JSK AS " + "\n" +
"SELECT " + "\n" +
" ASP_SAGYO_JSK.PROJECTID " + "\n" +
" ,ASP_SAGYO_JSK.SAGYO_CODE " + "\n" +
" ,ASP_SAGYO_JSK.ORDER_CODE " + "\n" +
" ,CASE WHEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL THEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE ELSE ASP_SAGYO_JSK.SEIZO_START_DATE END AS START_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_END_DATE AS END_DATE " + "\n" +
" ,ASP_SAGYO_JSK.KOUTEI_CODE " + "\n" +
" ,ASP_SAGYO_JSK.KOUTEI_NO " + "\n" +
" -- ASPROVAで実績入力時、資源コードが省略されるパターンあり(その場合は計画のもとを使用) " + "\n" +
" ,CASE WHEN ASP_SAGYO_JSK.SIGEN_CODE IS NULL THEN ASP_SAGYO_SYS.SIGEN_CODE ELSE ASP_SAGYO_JSK.SIGEN_CODE END SIGEN_CODE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_SU " + "\n" +
" ,ASP_SAGYO_JSK.SAGYO_STATUS " + "\n" +
" ,ASP_SAGYO_JSK.MAE_DANDORI_START_DATE " + "\n" +
" ,ASP_SAGYO_JSK.MAE_DANDORI_END_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_START_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_END_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_TEISI_TIME " + "\n" +
" ,ASP_SAGYO_JSK.SAIKI_FLG " + "\n" +
" ,ASP_SAGYO_JSK.FURYO_SU " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_SAGYO_JSK.FURYO_SU IS NULL THEN ASP_SAGYO_JSK.SEIZO_SU " + "\n" +
" ELSE ASP_SAGYO_JSK.SEIZO_SU - ASP_SAGYO_JSK.FURYO_SU " + "\n" +
" END AS NORMAL_SU " + "\n" +
" -- BOM段取実績 : 開始、終了が登録されている場合出力、計算対象 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL AND ASP_SAGYO_JSK.MAE_DANDORI_END_DATE IS NOT NULL THEN dbo.TLN_DATEDIFF('S', ASP_SAGYO_JSK.MAE_DANDORI_END_DATE, ASP_SAGYO_JSK.MAE_DANDORI_START_DATE) / 60 " + "\n" +
" ELSE 0 " + "\n" +
" END AS MAE_DANDORI_TIME " + "\n" +
" -- 製造時間には停止時間(分)を考慮(実績時間_秒 / 60 - 実績時間_分) " + "\n" +
" ,CASE WHEN ASP_SAGYO_JSK.SEIZO_START_DATE IS NOT NULL AND ASP_SAGYO_JSK.SEIZO_END_DATE IS NOT NULL THEN " + "\n" +
" ( dbo.TLN_DATEDIFF('S', ASP_SAGYO_JSK.SEIZO_END_DATE, ASP_SAGYO_JSK.SEIZO_START_DATE) / 60 ) " + "\n" +
" - " + "\n" +
" CASE WHEN ASP_SAGYO_JSK.SEIZO_TEISI_TIME IS NULL THEN 0 ELSE ASP_SAGYO_JSK.SEIZO_TEISI_TIME END " + "\n" +
" ELSE 0 END AS SEIZO_TIME " + "\n" +
" ,ASP_SAGYO_JSK.CREATED_DATE " + "\n" +
" ,ASP_SAGYO_JSK.CREATED_BY " + "\n" +
" ,ASP_SAGYO_JSK.CREATED_PRG_NM " + "\n" +
" ,ASP_SAGYO_JSK.UPDATED_DATE " + "\n" +
" ,ASP_SAGYO_JSK.UPDATED_BY " + "\n" +
" ,ASP_SAGYO_JSK.UPDATED_PRG_NM " + "\n" +
" ,ASP_SAGYO_JSK.MODIFY_COUNT " + "\n" +
"FROM ASP_SAGYO_JSK " + "\n" +
"LEFT OUTER JOIN ASP_SAGYO_SYS " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_SAGYO_JSK.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.SAGYO_CODE = ASP_SAGYO_JSK.SAGYO_CODE " + "\n" +
""
);
} else {
executeSQL(
"CREATE VIEW ASP_V_SAGYO_JSK AS " + "\n" +
"SELECT " + "\n" +
" ASP_SAGYO_JSK.PROJECTID " + "\n" +
" ,ASP_SAGYO_JSK.SAGYO_CODE " + "\n" +
" ,ASP_SAGYO_JSK.ORDER_CODE " + "\n" +
" ,CASE WHEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL THEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE ELSE ASP_SAGYO_JSK.SEIZO_START_DATE END AS START_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_END_DATE AS END_DATE " + "\n" +
" ,ASP_SAGYO_JSK.KOUTEI_CODE " + "\n" +
" ,ASP_SAGYO_JSK.KOUTEI_NO " + "\n" +
" -- ASPROVAで実績入力時、資源コードが省略されるパターンあり(その場合は計画のもとを使用) " + "\n" +
" ,CASE WHEN ASP_SAGYO_JSK.SIGEN_CODE IS NULL THEN ASP_SAGYO_SYS.SIGEN_CODE ELSE ASP_SAGYO_JSK.SIGEN_CODE END SIGEN_CODE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_SU " + "\n" +
" ,ASP_SAGYO_JSK.SAGYO_STATUS " + "\n" +
" ,ASP_SAGYO_JSK.MAE_DANDORI_START_DATE " + "\n" +
" ,ASP_SAGYO_JSK.MAE_DANDORI_END_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_START_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_END_DATE " + "\n" +
" ,ASP_SAGYO_JSK.SEIZO_TEISI_TIME " + "\n" +
" ,ASP_SAGYO_JSK.SAIKI_FLG " + "\n" +
" ,ASP_SAGYO_JSK.FURYO_SU " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_SAGYO_JSK.FURYO_SU IS NULL THEN ASP_SAGYO_JSK.SEIZO_SU " + "\n" +
" ELSE ASP_SAGYO_JSK.SEIZO_SU - ASP_SAGYO_JSK.FURYO_SU " + "\n" +
" END AS NORMAL_SU " + "\n" +
" -- BOM段取実績 : 開始、終了が登録されている場合出力、計算対象 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL AND ASP_SAGYO_JSK.MAE_DANDORI_END_DATE IS NOT NULL THEN TLN_DATEDIFF('S', ASP_SAGYO_JSK.MAE_DANDORI_END_DATE, ASP_SAGYO_JSK.MAE_DANDORI_START_DATE) / 60 " + "\n" +
" ELSE 0 " + "\n" +
" END AS MAE_DANDORI_TIME " + "\n" +
" -- 製造時間には停止時間(分)を考慮(実績時間_秒 / 60 - 実績時間_分) " + "\n" +
" ,CASE WHEN ASP_SAGYO_JSK.SEIZO_START_DATE IS NOT NULL AND ASP_SAGYO_JSK.SEIZO_END_DATE IS NOT NULL THEN " + "\n" +
" ( TLN_DATEDIFF('S', ASP_SAGYO_JSK.SEIZO_END_DATE, ASP_SAGYO_JSK.SEIZO_START_DATE) / 60 ) " + "\n" +
" - " + "\n" +
" CASE WHEN ASP_SAGYO_JSK.SEIZO_TEISI_TIME IS NULL THEN 0 ELSE ASP_SAGYO_JSK.SEIZO_TEISI_TIME END " + "\n" +
" ELSE 0 END AS SEIZO_TIME " + "\n" +
" ,ASP_SAGYO_JSK.CREATED_DATE " + "\n" +
" ,ASP_SAGYO_JSK.CREATED_BY " + "\n" +
" ,ASP_SAGYO_JSK.CREATED_PRG_NM " + "\n" +
" ,ASP_SAGYO_JSK.UPDATED_DATE " + "\n" +
" ,ASP_SAGYO_JSK.UPDATED_BY " + "\n" +
" ,ASP_SAGYO_JSK.UPDATED_PRG_NM " + "\n" +
" ,ASP_SAGYO_JSK.MODIFY_COUNT " + "\n" +
"FROM ASP_SAGYO_JSK " + "\n" +
"LEFT OUTER JOIN ASP_SAGYO_SYS " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_SAGYO_JSK.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.SAGYO_CODE = ASP_SAGYO_JSK.SAGYO_CODE " + "\n" +
""
);
}
//--------------------
executeSQL(
"CREATE VIEW ASP_V_SAGYO_OPE AS " + "\n" +
"SELECT " + "\n" +
" ASP_SAGYO_OPE.PROJECTID " + "\n" +
" ,ASP_SAGYO_OPE.SAGYO_CODE " + "\n" +
" ,ASP_SAGYO_OPE.START_DATE " + "\n" +
" ,ASP_SAGYO_OPE.END_DATE " + "\n" +
" ,ASP_SAGYO_OPE.SIGEN_CODE " + "\n" +
" ,ASP_SAGYO_OPE.SEND_KBN " + "\n" +
" ,ASP_SAGYO_OPE.CREATED_DATE " + "\n" +
" ,ASP_SAGYO_OPE.CREATED_BY " + "\n" +
" ,ASP_SAGYO_OPE.CREATED_PRG_NM " + "\n" +
" ,ASP_SAGYO_OPE.UPDATED_DATE " + "\n" +
" ,ASP_SAGYO_OPE.UPDATED_BY " + "\n" +
" ,ASP_SAGYO_OPE.UPDATED_PRG_NM " + "\n" +
" ,ASP_SAGYO_OPE.MODIFY_COUNT " + "\n" +
"FROM ASP_SAGYO_OPE " + "\n" +
"-- 実績データは1:未送信/2:送信済み計画中が対象(計画完了後はSYSが正となる) " + "\n" +
"WHERE ASP_SAGYO_OPE.SEND_KBN IN ( '0' , '1' ) " + "\n" +
""
);
//--------------------
if ( TALON.getDbConfig().isMssql() ) {
executeSQL(
"CREATE VIEW ASP_V_SAGYO_INFO AS " + "\n" +
"SELECT " + "\n" +
" ASP_SAGYO_SYS.PROJECTID " + "\n" +
" ,ASP_SAGYO_SYS.SAGYO_CODE " + "\n" +
" ,ASP_SAGYO_SYS.ORDER_CODE " + "\n" +
" ,ASP_ORDER_SYS.ITEM_CODE " + "\n" +
" " + "\n" +
" -- 実績入力が実施されていればその内容を表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SAGYO_STATUS ELSE ASP_SAGYO_SYS.SAGYO_STATUS END SAGYO_STATUS " + "\n" +
" " + "\n" +
" ,ASP_SAGYO_SYS.KOUTEI_CODE " + "\n" +
" ,ASP_SAGYO_SYS.KOUTEI_NO " + "\n" +
" ,ASP_SAGYO_SYS.LT " + "\n" +
" " + "\n" +
" -- ガント操作が実施されていればその内容を表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.SIGEN_CODE ELSE ASP_SAGYO_SYS.SIGEN_CODE END AS SIGEN_CODE " + "\n" +
" ,ASP_SAGYO_SYS.SEIZO_SU " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE ELSE ASP_SAGYO_SYS.START_DATE END AS START_DATE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE ELSE ASP_SAGYO_SYS.END_DATE END AS END_DATE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN '1' ELSE '0' END OPE_UMU_KBN " + "\n" +
" " + "\n" +
" -- 実績入力が実施されていればその内容を表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SIGEN_CODE ELSE ASP_SAGYO_SYS.JSK_SIGEN_CODE END AS JSK_SIGEN_CODE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SEIZO_SU ELSE ASP_SAGYO_SYS.JSK_SEIZO_SU END AS JSK_SEIZO_SU " + "\n" +
" " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.START_DATE ELSE ASP_SAGYO_SYS.JSK_START_DATE END AS JSK_START_DATE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.END_DATE ELSE ASP_SAGYO_SYS.JSK_END_DATE END AS JSK_END_DATE " + "\n" +
" " + "\n" +
" ,ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE AS JSK_MAE_DANDORI_START_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE AS JSK_MAE_DANDORI_END_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.SEIZO_START_DATE AS JSK_SEIZO_START_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.SEIZO_END_DATE AS JSK_SEIZO_END_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME AS SEIZO_TEISI_TIME " + "\n" +
" ,ASP_V_SAGYO_JSK.SAIKI_FLG AS SAIKI_FLG " + "\n" +
" " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.FURYO_SU ELSE ASP_SAGYO_SYS.JSK_FURYO_SU END AS JSK_FURYO_SU " + "\n" +
" -- 不良数がnullの場合場合、製造数を表示する(算出で正常数がNULLになってしまうので) " + "\n" +
" ,CASE WHEN ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.FURYO_SU ELSE ASP_SAGYO_SYS.JSK_FURYO_SU END ) IS NULL THEN " + "\n" +
" ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SEIZO_SU ELSE ASP_SAGYO_SYS.JSK_SEIZO_SU END ) " + "\n" +
" ELSE " + "\n" +
" ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SEIZO_SU ELSE ASP_SAGYO_SYS.JSK_SEIZO_SU END ) " + "\n" +
" - " + "\n" +
" ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.FURYO_SU ELSE ASP_SAGYO_SYS.JSK_FURYO_SU END ) " + "\n" +
" END AS JSK_NORMAL_SU " + "\n" +
" " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN '1' ELSE '0' END JSK_UMU_KBN " + "\n" +
" " + "\n" +
" -- ガント表示用(ステータス、入力値を考慮し、TALON上の状態を取得) " + "\n" +
" -- ステータス:実績入力がある場合は実績入力でのステータス。以外の場合はSYSのステータスを表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SAGYO_STATUS ELSE ASP_SAGYO_SYS.SAGYO_STATUS END AS GANTT_SAGYO_STATUS " + "\n" +
" " + "\n" +
" -- 資源コード:実績入力がある場合は実績入力での資源コード。ガント変更がある場合はガント変更での資源コード。以外の場合はSYSの資源コード " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS IN ('B','T') THEN ASP_V_SAGYO_JSK.SIGEN_CODE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.SIGEN_CODE " + "\n" +
" ELSE ASP_SAGYO_SYS.SIGEN_CODE " + "\n" +
" END " + "\n" +
" END AS GANTT_SIGEN_CODE " + "\n" +
" " + "\n" +
" -- 実績入力の数量、開始日、終了日は「完了ステータス」で無いと反映させない(着手中は反映しない) " + "\n" +
" -- 製造数:実績入力がありステータスが完了の場合は実績入力の製造数。以外の場合はSYSの製造数 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.SEIZO_SU " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN JSK_SEIZO_SU ELSE ASP_SAGYO_SYS.SEIZO_SU END " + "\n" +
" END AS GANTT_SEIZO_SU " + "\n" +
" " + "\n" +
" -- 開始日:実績入力がありステータスが完了の場合は実績入力の開始日、ガント変更がある場合はガント変更での開始日、 " + "\n" +
" -- 以外の場合、SYSのステータスが完了の場合は実績開始日、以外の場合は開始日を表示 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.START_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE " + "\n" +
" -- ASP_SAGYO_SYSのステータスが完了の状態でOPEは操作できない前提 " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_START_DATE ELSE ASP_SAGYO_SYS.START_DATE END " + "\n" +
" END " + "\n" +
" END AS GANTT_START_DATE " + "\n" +
" " + "\n" +
" -- 終了日:実績入力がありステータスが完了の場合は実績入力の終了日、ガント変更がある場合はガント変更での終了日、 " + "\n" +
" -- 以外の場合、SYSのステータスが完了の場合は実績終了日、以外の場合は終了日を表示 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.END_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE " + "\n" +
" -- ASP_SAGYO_SYSのステータスが完了の状態でOPEは操作できない前提 " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_END_DATE ELSE ASP_SAGYO_SYS.END_DATE END " + "\n" +
" END " + "\n" +
" END AS GANTT_END_DATE " + "\n" +
" " + "\n" +
" -- ガントチャートツールチップ(オーダガント、資源ガント) " + "\n" +
" , dbo.TLN_CONCAT( " + "\n" +
" dbo.TLN_CONCAT( " + "\n" +
" dbo.TLN_CONCAT( " + "\n" +
" CONCAT( TOOLTIP_1.DSP1 , ASP_SAGYO_SYS.ORDER_CODE ) " + "\n" +
" ,CONCAT( TOOLTIP_2.DSP1 , dbo.TLN_DATE_TO_CHAR( 'YMD' , ASP_ORDER_SYS.NOKI_DATE ) ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_CONCAT( " + "\n" +
" dbo.TLN_CONCAT( " + "\n" +
" CONCAT( TOOLTIP_3.DSP1 , ASP_SAGYO_SYS.SAGYO_CODE ) " + "\n" +
" ,dbo.TLN_CONCAT( '( ' , ' )' , ASP_SAGYO_SYS.KOUTEI_CODE ) " + "\n" +
" ,'' " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_CONCAT( " + "\n" +
" CONCAT( TOOLTIP_4.DSP1 , ASP_ORDER_SYS.ITEM_CODE ) " + "\n" +
" ,CONCAT( TOOLTIP_5.DSP1 , " + "\n" +
" -- GANTT_SEIZO_SU " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.SEIZO_SU " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN JSK_SEIZO_SU ELSE ASP_SAGYO_SYS.SEIZO_SU END " + "\n" +
" END " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_CONCAT( " + "\n" +
" dbo.TLN_CONCAT( " + "\n" +
" dbo.TLN_CONCAT( TOOLTIP_6.DSP1 , dbo.TLN_DATE_TO_CHAR( 'YMDHMS' , " + "\n" +
" -- GANTT_START_DATE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.START_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_START_DATE ELSE ASP_SAGYO_SYS.START_DATE END " + "\n" +
" END " + "\n" +
" END " + "\n" +
" ) , '' ) " + "\n" +
" ,dbo.TLN_CONCAT( TOOLTIP_7.DSP1 , dbo.TLN_DATE_TO_CHAR( 'YMDHMS' , " + "\n" +
" -- GANTT_END_DATE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.END_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_END_DATE ELSE ASP_SAGYO_SYS.END_DATE END " + "\n" +
" END " + "\n" +
" END " + "\n" +
" ) , '' ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_CONCAT( " + "\n" +
" dbo.TLN_CONCAT( TOOLTIP_8.DSP1 , CONCAT( dbo.TLN_ROUND('1' , 2 , " + "\n" +
" -- JSK_MAE_DANDORI_TIME " + "\n" +
" -- 段取り時間は実績より計算 " + "\n" +
" CASE WHEN ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL AND ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE IS NOT NULL THEN " + "\n" +
" dbo.TLN_DATEDIFF('S',ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE,ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE) / 60 " + "\n" +
" ELSE 0 END " + "\n" +
" ),'') , '' ) " + "\n" +
" ,dbo.TLN_CONCAT( TOOLTIP_9.DSP1 , CONCAT( dbo.TLN_ROUND('1' , 2 , " + "\n" +
" -- JSK_SEIZO_TIME " + "\n" +
" -- 製造時間は完了の実績がある場合は実績(JSK)より、無い場合は計画調整(OPE)、もしくは作業情報(SYS)より計算(上記ガントの表示内容と同じ) " + "\n" +
" ( " + "\n" +
" dbo.TLN_DATEDIFF( " + "\n" +
" 'S', " + "\n" +
" -- 終了日時 " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.END_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_END_DATE ELSE ASP_SAGYO_SYS.END_DATE END " + "\n" +
" END " + "\n" +
" END, " + "\n" +
" -- 終了日時 " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.START_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_START_DATE ELSE ASP_SAGYO_SYS.START_DATE END " + "\n" +
" END " + "\n" +
" END " + "\n" +
" ) " + "\n" +
" / 60 ) " + "\n" +
" - " + "\n" +
" CASE WHEN ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME IS NULL THEN 0 ELSE ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME END " + "\n" +
" ),'') , '' ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) " + "\n" +
" ,dbo.TLN_LF() " + "\n" +
" ) as TOOLTIP " + "\n" +
" " + "\n" +
" -- BOM段取実績 : 開始、終了が登録されている場合出力、計算対象 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL AND ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE IS NOT NULL THEN " + "\n" +
" dbo.TLN_DATEDIFF('S',ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE,ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE) / 60 " + "\n" +
" ELSE 0 END AS JSK_MAE_DANDORI_TIME " + "\n" +
" -- 製造時間には停止時間(分)を考慮(実績時間_秒 / 60 - 実績時間_分) " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SEIZO_START_DATE IS NOT NULL AND ASP_V_SAGYO_JSK.SEIZO_END_DATE IS NOT NULL THEN " + "\n" +
" ( dbo.TLN_DATEDIFF('S',ASP_V_SAGYO_JSK.SEIZO_END_DATE,ASP_V_SAGYO_JSK.SEIZO_START_DATE) / 60 ) " + "\n" +
" - " + "\n" +
" CASE WHEN ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME IS NULL THEN 0 ELSE ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME END " + "\n" +
" ELSE 0 END AS JSK_SEIZO_TIME " + "\n" +
" " + "\n" +
"FROM ASP_SAGYO_SYS " + "\n" +
" " + "\n" +
"LEFT OUTER JOIN ASP_ORDER_SYS " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_ORDER_SYS.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.ORDER_CODE = ASP_ORDER_SYS.ORDER_CODE " + "\n" +
" " + "\n" +
"LEFT OUTER JOIN ASP_V_SAGYO_JSK " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_V_SAGYO_JSK.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.SAGYO_CODE = ASP_V_SAGYO_JSK.SAGYO_CODE " + "\n" +
" " + "\n" +
"LEFT OUTER JOIN ASP_V_SAGYO_OPE " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_V_SAGYO_OPE.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.SAGYO_CODE = ASP_V_SAGYO_OPE.SAGYO_CODE " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_1 " + "\n" +
" ON TOOLTIP_1.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_1.KEY_CODE = '1' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_2 " + "\n" +
" ON TOOLTIP_2.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_2.KEY_CODE = '2' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_3 " + "\n" +
" ON TOOLTIP_3.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_3.KEY_CODE = '3' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_4 " + "\n" +
" ON TOOLTIP_4.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_4.KEY_CODE = '4' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_5 " + "\n" +
" ON TOOLTIP_5.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_5.KEY_CODE = '5' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_6 " + "\n" +
" ON TOOLTIP_6.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_6.KEY_CODE = '6' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_7 " + "\n" +
" ON TOOLTIP_7.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_7.KEY_CODE = '7' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_8 " + "\n" +
" ON TOOLTIP_8.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_8.KEY_CODE = '8' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_9 " + "\n" +
" ON TOOLTIP_9.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_9.KEY_CODE = '9' " + "\n" +
" " + "\n" +
""
);
} else {
executeSQL(
"CREATE VIEW ASP_V_SAGYO_INFO AS " + "\n" +
"SELECT " + "\n" +
" ASP_SAGYO_SYS.PROJECTID " + "\n" +
" ,ASP_SAGYO_SYS.SAGYO_CODE " + "\n" +
" ,ASP_SAGYO_SYS.ORDER_CODE " + "\n" +
" ,ASP_ORDER_SYS.ITEM_CODE " + "\n" +
" " + "\n" +
" -- 実績入力が実施されていればその内容を表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SAGYO_STATUS ELSE ASP_SAGYO_SYS.SAGYO_STATUS END SAGYO_STATUS " + "\n" +
" " + "\n" +
" ,ASP_SAGYO_SYS.KOUTEI_CODE " + "\n" +
" ,ASP_SAGYO_SYS.KOUTEI_NO " + "\n" +
" ,ASP_SAGYO_SYS.LT " + "\n" +
" " + "\n" +
" -- ガント操作が実施されていればその内容を表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.SIGEN_CODE ELSE ASP_SAGYO_SYS.SIGEN_CODE END AS SIGEN_CODE " + "\n" +
" ,ASP_SAGYO_SYS.SEIZO_SU " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE ELSE ASP_SAGYO_SYS.START_DATE END AS START_DATE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE ELSE ASP_SAGYO_SYS.END_DATE END AS END_DATE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN '1' ELSE '0' END OPE_UMU_KBN " + "\n" +
" " + "\n" +
" -- 実績入力が実施されていればその内容を表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SIGEN_CODE ELSE ASP_SAGYO_SYS.JSK_SIGEN_CODE END AS JSK_SIGEN_CODE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SEIZO_SU ELSE ASP_SAGYO_SYS.JSK_SEIZO_SU END AS JSK_SEIZO_SU " + "\n" +
" " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.START_DATE ELSE ASP_SAGYO_SYS.JSK_START_DATE END AS JSK_START_DATE " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.END_DATE ELSE ASP_SAGYO_SYS.JSK_END_DATE END AS JSK_END_DATE " + "\n" +
" " + "\n" +
" ,ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE AS JSK_MAE_DANDORI_START_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE AS JSK_MAE_DANDORI_END_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.SEIZO_START_DATE AS JSK_SEIZO_START_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.SEIZO_END_DATE AS JSK_SEIZO_END_DATE " + "\n" +
" ,ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME AS SEIZO_TEISI_TIME " + "\n" +
" ,ASP_V_SAGYO_JSK.SAIKI_FLG AS SAIKI_FLG " + "\n" +
" " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.FURYO_SU ELSE ASP_SAGYO_SYS.JSK_FURYO_SU END AS JSK_FURYO_SU " + "\n" +
" -- 不良数がnullの場合場合、製造数を表示する(算出で正常数がNULLになってしまうので) " + "\n" +
" ,CASE WHEN ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.FURYO_SU ELSE ASP_SAGYO_SYS.JSK_FURYO_SU END ) IS NULL THEN " + "\n" +
" ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SEIZO_SU ELSE ASP_SAGYO_SYS.JSK_SEIZO_SU END ) " + "\n" +
" ELSE " + "\n" +
" ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SEIZO_SU ELSE ASP_SAGYO_SYS.JSK_SEIZO_SU END ) " + "\n" +
" - " + "\n" +
" ( CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.FURYO_SU ELSE ASP_SAGYO_SYS.JSK_FURYO_SU END ) " + "\n" +
" END AS JSK_NORMAL_SU " + "\n" +
" " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN '1' ELSE '0' END JSK_UMU_KBN " + "\n" +
" " + "\n" +
" -- ガント表示用(ステータス、入力値を考慮し、TALON上の状態を取得) " + "\n" +
" -- ステータス:実績入力がある場合は実績入力でのステータス。以外の場合はSYSのステータスを表示 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_JSK.SAGYO_STATUS ELSE ASP_SAGYO_SYS.SAGYO_STATUS END AS GANTT_SAGYO_STATUS " + "\n" +
" " + "\n" +
" -- 資源コード:実績入力がある場合は実績入力での資源コード。ガント変更がある場合はガント変更での資源コード。以外の場合はSYSの資源コード " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS IN ('B','T') THEN ASP_V_SAGYO_JSK.SIGEN_CODE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.SIGEN_CODE " + "\n" +
" ELSE ASP_SAGYO_SYS.SIGEN_CODE " + "\n" +
" END " + "\n" +
" END AS GANTT_SIGEN_CODE " + "\n" +
" " + "\n" +
" -- 実績入力の数量、開始日、終了日は「完了ステータス」で無いと反映させない(着手中は反映しない) " + "\n" +
" -- 製造数:実績入力がありステータスが完了の場合は実績入力の製造数。以外の場合はSYSの製造数 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.SEIZO_SU " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN JSK_SEIZO_SU ELSE ASP_SAGYO_SYS.SEIZO_SU END " + "\n" +
" END AS GANTT_SEIZO_SU " + "\n" +
" " + "\n" +
" -- 開始日:実績入力がありステータスが完了の場合は実績入力の開始日、ガント変更がある場合はガント変更での開始日、 " + "\n" +
" -- 以外の場合、SYSのステータスが完了の場合は実績開始日、以外の場合は開始日を表示 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.START_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE " + "\n" +
" -- ASP_SAGYO_SYSのステータスが完了の状態でOPEは操作できない前提 " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_START_DATE ELSE ASP_SAGYO_SYS.START_DATE END " + "\n" +
" END " + "\n" +
" END AS GANTT_START_DATE " + "\n" +
" " + "\n" +
" -- 終了日:実績入力がありステータスが完了の場合は実績入力の終了日、ガント変更がある場合はガント変更での終了日、 " + "\n" +
" -- 以外の場合、SYSのステータスが完了の場合は実績終了日、以外の場合は終了日を表示 " + "\n" +
" ,CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.END_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE " + "\n" +
" -- ASP_SAGYO_SYSのステータスが完了の状態でOPEは操作できない前提 " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_END_DATE ELSE ASP_SAGYO_SYS.END_DATE END " + "\n" +
" END " + "\n" +
" END AS GANTT_END_DATE " + "\n" +
" " + "\n" +
" -- ガントチャートツールチップ(オーダガント、資源ガント) " + "\n" +
" , TLN_CONCAT( " + "\n" +
" TLN_CONCAT( " + "\n" +
" TLN_CONCAT( " + "\n" +
" CONCAT( TOOLTIP_1.DSP1 , ASP_SAGYO_SYS.ORDER_CODE ) " + "\n" +
" ,CONCAT( TOOLTIP_2.DSP1 , TLN_DATE_TO_CHAR( 'YMD' , ASP_ORDER_SYS.NOKI_DATE ) ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) " + "\n" +
" ,TLN_CONCAT( " + "\n" +
" TLN_CONCAT( " + "\n" +
" CONCAT( TOOLTIP_3.DSP1 , ASP_SAGYO_SYS.SAGYO_CODE ) " + "\n" +
" ,TLN_CONCAT( '( ' , ' )' , ASP_SAGYO_SYS.KOUTEI_CODE ) " + "\n" +
" ,'' " + "\n" +
" ) " + "\n" +
" ,TLN_CONCAT( " + "\n" +
" CONCAT( TOOLTIP_4.DSP1 , ASP_ORDER_SYS.ITEM_CODE ) " + "\n" +
" ,CONCAT( TOOLTIP_5.DSP1 , " + "\n" +
" -- GANTT_SEIZO_SU " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.SEIZO_SU " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN JSK_SEIZO_SU ELSE ASP_SAGYO_SYS.SEIZO_SU END " + "\n" +
" END " + "\n" +
" ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) " + "\n" +
" ,TLN_CONCAT( " + "\n" +
" TLN_CONCAT( " + "\n" +
" TLN_CONCAT( TOOLTIP_6.DSP1 , TLN_DATE_TO_CHAR( 'YMDHMS' , " + "\n" +
" -- GANTT_START_DATE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.START_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_START_DATE ELSE ASP_SAGYO_SYS.START_DATE END " + "\n" +
" END " + "\n" +
" END " + "\n" +
" ) , '' ) " + "\n" +
" ,TLN_CONCAT( TOOLTIP_7.DSP1 , TLN_DATE_TO_CHAR( 'YMDHMS' , " + "\n" +
" -- GANTT_END_DATE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.END_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_END_DATE ELSE ASP_SAGYO_SYS.END_DATE END " + "\n" +
" END " + "\n" +
" END " + "\n" +
" ) , '' ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) " + "\n" +
" ,TLN_CONCAT( " + "\n" +
" TLN_CONCAT( TOOLTIP_8.DSP1 , CONCAT( TLN_ROUND('1' , 2 , " + "\n" +
" -- JSK_MAE_DANDORI_TIME " + "\n" +
" -- 段取り時間は実績より計算 " + "\n" +
" CASE WHEN ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL AND ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE IS NOT NULL THEN " + "\n" +
" TLN_DATEDIFF('S',ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE,ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE) / 60 " + "\n" +
" ELSE 0 END " + "\n" +
" ),'') , '' ) " + "\n" +
" ,TLN_CONCAT( TOOLTIP_9.DSP1 , CONCAT( TLN_ROUND('1' , 2 , " + "\n" +
" -- JSK_SEIZO_TIME " + "\n" +
" -- 製造時間は完了の実績がある場合は実績(JSK)より、無い場合は計画調整(OPE)、もしくは作業情報(SYS)より計算(上記ガントの表示内容と同じ) " + "\n" +
" ( " + "\n" +
" TLN_DATEDIFF( " + "\n" +
" 'S', " + "\n" +
" -- 終了日時 " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.END_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.END_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_END_DATE ELSE ASP_SAGYO_SYS.END_DATE END " + "\n" +
" END " + "\n" +
" END, " + "\n" +
" -- 終了日時 " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_JSK.SAGYO_CODE IS NOT NULL and ASP_V_SAGYO_JSK.SAGYO_STATUS = 'B' THEN ASP_V_SAGYO_JSK.START_DATE " + "\n" +
" ELSE " + "\n" +
" CASE " + "\n" +
" WHEN ASP_V_SAGYO_OPE.SAGYO_CODE IS NOT NULL THEN ASP_V_SAGYO_OPE.START_DATE " + "\n" +
" ELSE CASE WHEN ASP_SAGYO_SYS.SAGYO_STATUS = 'B' THEN ASP_SAGYO_SYS.JSK_START_DATE ELSE ASP_SAGYO_SYS.START_DATE END " + "\n" +
" END " + "\n" +
" END " + "\n" +
" ) " + "\n" +
" / 60 ) " + "\n" +
" - " + "\n" +
" CASE WHEN ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME IS NULL THEN 0 ELSE ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME END " + "\n" +
" ),'') , '' ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) " + "\n" +
" ,TLN_LF() " + "\n" +
" ) as TOOLTIP " + "\n" +
" " + "\n" +
" -- BOM段取実績 : 開始、終了が登録されている場合出力、計算対象 " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE IS NOT NULL AND ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE IS NOT NULL THEN " + "\n" +
" TLN_DATEDIFF('S',ASP_V_SAGYO_JSK.MAE_DANDORI_END_DATE,ASP_V_SAGYO_JSK.MAE_DANDORI_START_DATE) / 60 " + "\n" +
" ELSE 0 END AS JSK_MAE_DANDORI_TIME " + "\n" +
" -- 製造時間には停止時間(分)を考慮(実績時間_秒 / 60 - 実績時間_分) " + "\n" +
" ,CASE WHEN ASP_V_SAGYO_JSK.SEIZO_START_DATE IS NOT NULL AND ASP_V_SAGYO_JSK.SEIZO_END_DATE IS NOT NULL THEN " + "\n" +
" ( TLN_DATEDIFF('S',ASP_V_SAGYO_JSK.SEIZO_END_DATE,ASP_V_SAGYO_JSK.SEIZO_START_DATE) / 60 ) " + "\n" +
" - " + "\n" +
" CASE WHEN ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME IS NULL THEN 0 ELSE ASP_V_SAGYO_JSK.SEIZO_TEISI_TIME END " + "\n" +
" ELSE 0 END AS JSK_SEIZO_TIME " + "\n" +
" " + "\n" +
"FROM ASP_SAGYO_SYS " + "\n" +
" " + "\n" +
"LEFT OUTER JOIN ASP_ORDER_SYS " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_ORDER_SYS.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.ORDER_CODE = ASP_ORDER_SYS.ORDER_CODE " + "\n" +
" " + "\n" +
"LEFT OUTER JOIN ASP_V_SAGYO_JSK " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_V_SAGYO_JSK.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.SAGYO_CODE = ASP_V_SAGYO_JSK.SAGYO_CODE " + "\n" +
" " + "\n" +
"LEFT OUTER JOIN ASP_V_SAGYO_OPE " + "\n" +
" ON ASP_SAGYO_SYS.PROJECTID = ASP_V_SAGYO_OPE.PROJECTID " + "\n" +
" AND ASP_SAGYO_SYS.SAGYO_CODE = ASP_V_SAGYO_OPE.SAGYO_CODE " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_1 " + "\n" +
" ON TOOLTIP_1.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_1.KEY_CODE = '1' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_2 " + "\n" +
" ON TOOLTIP_2.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_2.KEY_CODE = '2' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_3 " + "\n" +
" ON TOOLTIP_3.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_3.KEY_CODE = '3' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_4 " + "\n" +
" ON TOOLTIP_4.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_4.KEY_CODE = '4' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_5 " + "\n" +
" ON TOOLTIP_5.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_5.KEY_CODE = '5' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_6 " + "\n" +
" ON TOOLTIP_6.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_6.KEY_CODE = '6' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_7 " + "\n" +
" ON TOOLTIP_7.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_7.KEY_CODE = '7' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_8 " + "\n" +
" ON TOOLTIP_8.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_8.KEY_CODE = '8' " + "\n" +
" " + "\n" +
" LEFT OUTER JOIN TLN_M_HANYO_CODE_MAIN TOOLTIP_9 " + "\n" +
" ON TOOLTIP_9.SIKIBETU_CODE = 'ASP_TOOLTIP_TITLE' " + "\n" +
" AND TOOLTIP_9.KEY_CODE = '9' " + "\n" +
" " + "\n" +
""
);
}
//--------------------
executeSQL(
"CREATE VIEW ASP_V_SAGYO_INFO_MAE AS " + "\n" +
"SELECT " + "\n" +
" ASP_HIMO.PROJECTID " + "\n" +
" , ASP_HIMO.ORDER_CODE_RIGHT AS ORDER_CODE_MY " + "\n" +
" , ASP_HIMO.SAGYO_CODE_RIGHT AS SAGYO_CODE_MY " + "\n" +
" , MAX( ASP_V_SAGYO_INFO.GANTT_END_DATE ) AS MAX_END_DATE " + "\n" +
"FROM ASP_HIMO " + "\n" +
"INNER JOIN ASP_V_SAGYO_INFO " + "\n" +
" ON ASP_HIMO.PROJECTID = ASP_V_SAGYO_INFO.PROJECTID " + "\n" +
" AND ASP_HIMO.SAGYO_CODE_LEFT = ASP_V_SAGYO_INFO.SAGYO_CODE " + "\n" +
"WHERE ASP_HIMO.ORDER_CODE_RIGHT = ASP_HIMO.ORDER_CODE_LEFT " + "\n" +
"GROUP BY " + "\n" +
" ASP_HIMO.PROJECTID " + "\n" +
" , ORDER_CODE_RIGHT " + "\n" +
" , SAGYO_CODE_RIGHT " + "\n" +
""
);
//--------------------
executeSQL(
"CREATE VIEW ASP_V_SAGYO_INFO_ATO AS " + "\n" +
"SELECT " + "\n" +
" ASP_HIMO.PROJECTID " + "\n" +
" , ASP_HIMO.ORDER_CODE_LEFT AS ORDER_CODE_MY " + "\n" +
" , ASP_HIMO.SAGYO_CODE_LEFT AS SAGYO_CODE_MY " + "\n" +
" , MIN( ASP_V_SAGYO_INFO.GANTT_START_DATE ) AS MIN_START_DATE " + "\n" +
"FROM ASP_HIMO " + "\n" +
"INNER JOIN ASP_V_SAGYO_INFO " + "\n" +
" ON ASP_HIMO.PROJECTID = ASP_V_SAGYO_INFO.PROJECTID " + "\n" +
" AND ASP_HIMO.SAGYO_CODE_RIGHT = ASP_V_SAGYO_INFO.SAGYO_CODE " + "\n" +
"WHERE ASP_HIMO.ORDER_CODE_RIGHT = ASP_HIMO.ORDER_CODE_LEFT " + "\n" +
"GROUP BY " + "\n" +
" ASP_HIMO.PROJECTID " + "\n" +
" , ORDER_CODE_LEFT " + "\n" +
" , SAGYO_CODE_LEFT " + "\n" +
""
);
}
//--------------------------------------------
// 言語設定変更
//--------------------------------------------
function change_language(to_lang) {
//現時点の言語を取得
var now_lang = getLanguageType();
if ( now_lang != '0' && now_lang != '1' && now_lang != '2' ) {
//パラメータ不正
TALON.addErrorMsg( "Error : Invalid parameter (now_language) " );
TALON.setIsSuccess(false);
return false;
}
if ( to_lang != '0' && to_lang != '1' && to_lang != '2' ) {
//パラメータ不正
TALON.addErrorMsg( "Error : Invalid parameter (to_language)" );
TALON.setIsSuccess(false);
return false;
}
//機能IDの更新(TLN_M_GENERAL_FUNC)
var map = {
'ASP_BGT1110' : ['資源別予実照会(日別)[ASP_BGT1110]','Budget and Results by Resource [ASP_BGT1110]',''],
'ASP_BGT1120' : ['資源別予実照会(日別)[ASP_BGT1120]','Budget and Results by Resource [ASP_BGT1120]',''],
'ASP_BGT1210' : ['資源・品目別予実照会(日別)[ASP_BGT1210]','Budget and Results by Item [ASP_BGT1210]',''],
'ASP_BGT1220' : ['資源・品目別予実照会(日別)[ASP_BGT1220]','Budget and Results by Item [ASP_BGT1220]',''],
'ASP_BGT1400' : ['予実オーダガントチャート[ASP_BGT1400]','Budget and Results by Order Gantt [ASP_BGT1400]',''],
'ASP_COP2200' : ['月間計画作成[ASP_COP2200]','Monthly Planning [ASP_COP2200]',''],
'ASP_MST0020' : ['資源マスタ検索子画面[ASP_MST0020]','Search Resource Master [ASP_MST0020]',''],
'ASP_MST0021' : ['資源マスタ検索子画面[ASP_MST0021]','Search Resource Master [ASP_MST0021]',''],
'ASP_MST0022' : ['資源マスタ(グループ)検索子画面[ASP_MST0022]','Search Resource Master (Groups) [ASP_MST0020]',''],
'ASP_MST0030' : ['工程マスタ検索子画面[ASP_MST0030]','Search Process Master [ASP_MST0030]',''],
'ASP_MST0040' : ['品目マスタ検索子画面[ASP_MST0040]','Search Item Master [ASP_MST0040]',''],
'ASP_MST0041' : ['品目マスタ検索子画面[ASP_MST0041]','Search Item Master [ASP_MST0041]',''],
'ASP_MST0042' : ['品目マスタ検索子画面[ASP_MST0042]','Search Item Master [ASP_MST0042]',''],
'ASP_MST0043' : ['品目マスタ(グループ)検索子画面[ASP_MST0043]','Search Item Master (Groups) [ASP_MST0043]',''],
'ASP_MST0050' : ['品目/資源マスタ検索子画面[ASP_MST0050]','Search Item / Resource Master [ASP_MST0050]',''],
'ASP_MST0060' : ['オーダ情報検索子画面[ASP_MST0060]','Search Order Information [ASP_MST0060]',''],
'ASP_MST0100' : ['製造BOMマスタメンテナンス[ASP_MST0100]','Maintenance Integrated Master [ASP_MST0100]',''],
'ASP_MST0400' : ['製造BOM段取り製造時間メンテナンス[ASP_MST0400]','Maintenance SetupTime Master [ASP_MST0400]',''],
'ASP_MST0600' : ['品目マスタメンテナンス[ASP_MST0600]','Maintenance Item Master [ASP_MST0600]',''],
'ASP_MST0700' : ['工程マスタメンテナンス[ASP_MST0700]','Maintenance Process Master [ASP_MST0700]',''],
'ASP_MST0800' : ['資源マスタメンテナンス[ASP_MST0800]','Maintenance Reource Master [ASP_MST0800]',''],
'ASP_MST0900' : ['構成照会[ASP_MST0900]','Inquiry Configuration [ASP_MST0900]',''],
'ASP_ORD0100' : ['オーダ一覧照会/メンテナンス[ASP_ORD0100]','Maintenance Order List [ASP_ORD0100]',''],
'ASP_ORD0300' : ['オーダ・作業/メンテナンス[ASP_ORD0300]','Maintenance Order / Operation List [ASP_ORD0300]',''],
'ASP_ORD0400' : ['作業一覧・指示書発行[ASP_ORD0400]','Operation List / Instruction [ASP_ORD0400]',''],
'ASP_ORD0410' : ['作業情報詳細[ASP_ORD0410]','Operation Information Details [ASP_ORD0410]',''],
'ASP_ORD0500' : ['作業実績入力[ASP_ORD0500]','Entry Operation Result [ASP_ORD0500]',''],
'ASP_ORD0600' : ['作業照会[ASP_ORD0600](スマートフォン)','Operation List (Smartphone) [ASP_ORD0600]',''],
'ASP_ORD0610' : ['作業実績入力[ASP_ORD0610](スマートフォン)','Entry Operation Result (Smartphone) [ASP_ORD0610]',''],
'ASP_ORD0700' : ['作業実績一括入力[ASP_ORD0700]','Entry Operation Result (Bulkupdate) [ASP_ORD0700]',''],
'ASP_PLN0110' : ['オーダガントチャート(動的表示)[ASP_PLN0110]','Order Ganttchart (Display) [ASP_PLN0110]',''],
'ASP_PLN0120' : ['オーダガントチャート(編集有)[ASP_PLN0120]','Order Ganttchart (Entry) [ASP_PLN0120]',''],
'ASP_PLN0210' : ['資源ガントチャート(動的表示)[ASP_PLN0210]','Resource Ganttchart (Display) [ASP_PLN0210]',''],
'ASP_PLN0220' : ['資源ガントチャート(編集有)[ASP_PLN0220]','Resource Ganttchart (Entry) [ASP_PLN0220]',''],
'ASP_PLN0310' : ['作業スケジュールカレンダ(動的表示)[ASP_PLN0310]','Operation Schedule (Display) [ASP_PLN0310]',''],
'ASP_PLN0320' : ['作業スケジュールカレンダー(編集有)[ASP_PLN0320]','Operation Schedule (Entry) [ASP_PLN0320]',''],
'ASP_PLN0400' : ['計画調整データ取消[ASP_PLN0400]','Cancel Operation Change Data [ASP_PLN0400]',''],
'ASP_PLN0500' : ['複数計画比較オーダガントチャート[ASP_PLN0500]','Multiple Plan Order Ganttchart [ASP_PLN0500]',''],
'ASP_PLN0600' : ['複数計画比較資源ガントチャート[ASP_PLN0600]','Multiple Plan Resource Ganttchart [ASP_PLN0600]',''],
'ASP_PLN0700' : ['ガントチャート・カレンダーカラー変更[ASP_PLN0700]','Ganttchart / Schedule Color Ghange [ASP_PLN0700]',''],
'ASP_PLN1110' : ['負荷グラフ照会[ASP_PLN1110]','Inquiry Load Graph [ASP_PLN1110]',''],
'ASP_SYS0010' : ['セットアップ・初期化[ASP_SYS0010]','System Setup / Initialization [ASP_SYS0010]',''],
'ASP_SYS0011' : ['メニュー構成データ登録[ASP_SYS0011]','System Setup Menu-Data Registration [ASP_SYS0011]',''],
'ASP_SYS0020' : ['サンプルデータ登録[ASP_SYS0020]','System Setup Sample-Date Entry [ASP_SYS0020]','']
}
for (key in map) {
var sql = "" +
"UPDATE TLN_M_GENERAL_FUNC SET FUNC_NM = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + key + "' ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//ブロック名の更新(TLN_M_GENERAL_FUNC_SQL)
var map = {
'ASP_MST0100#0' : ['BOM','BOM',''],
'ASP_ORD0100#0' : ['オーダ','Order',''],
'ASP_ORD0300#0' : ['オーダ','Order',''],
'ASP_MST0060#0' : ['オーダ','Order',''],
'ASP_BGT1400#0' : ['ガントチャート','Ganttchart',''],
'ASP_PLN0110#0' : ['ガントチャート','Ganttchart',''],
'ASP_PLN0120#0' : ['ガントチャート','Ganttchart',''],
'ASP_PLN0210#0' : ['ガントチャート','Ganttchart',''],
'ASP_PLN0220#0' : ['ガントチャート','Ganttchart',''],
'ASP_PLN0500#0' : ['ガントチャート','Ganttchart',''],
'ASP_PLN0600#0' : ['ガントチャート','Ganttchart',''],
'ASP_BGT1120#2' : ['グラフ','Graph',''],
'ASP_BGT1220#1' : ['グラフ','Graph',''],
'ASP_PLN0310#0' : ['スケジュール','Schedule',''],
'ASP_PLN0320#0' : ['スケジュール','Schedule',''],
'ASP_BGT1210#0' : ['予実','Budget and Results',''],
'ASP_COP2200#0' : ['作成','Create',''],
'ASP_ORD0300#1' : ['作業','Operation',''],
'ASP_ORD0400#0' : ['作業','Operation',''],
'ASP_ORD0600#0' : ['作業','Operation',''],
'ASP_ORD0610#0' : ['作業','Operation',''],
'ASP_MST0040#0' : ['品目','Item',''],
'ASP_MST0041#0' : ['品目','Item',''],
'ASP_MST0042#0' : ['品目','Item',''],
'ASP_MST0043#0' : ['品目','Item',''],
'ASP_MST0600#0' : ['品目','Item',''],
'ASP_MST0050#0' : ['品目/資源','Item / Resource',''],
'ASP_BGT1110#1' : ['対象','Target',''],
'ASP_MST0030#0' : ['工程','Process',''],
'ASP_MST0700#0' : ['工程','Process',''],
'ASP_MST0900#0' : ['構成照会','Inquiry Configuration',''],
'ASP_MST0400#0' : ['製造BOM','Integrated',''],
'ASP_PLN0400#0' : ['計画調整一覧','Operation Change Data',''],
'ASP_ORD0410#0' : ['詳細','Detail',''],
'ASP_ORD0500#0' : ['詳細','Detail',''],
'ASP_ORD0700#0' : ['詳細','Detail',''],
'ASP_PLN1110#1' : ['負荷グラフ','Load Graph',''],
'ASP_MST0020#0' : ['資源','Resource',''],
'ASP_MST0021#0' : ['資源','Resource',''],
'ASP_MST0022#0' : ['資源','Resource',''],
'ASP_MST0800#0' : ['資源','Resource',''],
'ASP_PLN1110#0' : ['資源','Resource',''],
'ASP_SYS0020#4' : ['オーダ情報ASP_ORDER_SYS','Order ASP_ORDER_SYS',''],
'ASP_SYS0020#5' : ['作業情報ASP_SAGYO_SYS','Operation ASP_SAGYO_SYS',''],
'ASP_SYS0020#1' : ['品目マスタASP_M_ITEM','Item ASP_M_ITEM',''],
'ASP_SYS0020#2' : ['工程マスタASP_M_KOUTEI','Process ASP_M_KOUTEI',''],
'ASP_SYS0020#0' : ['製造BOMマスタASP_M_BOM','Integrated ASP_M_BOM',''],
'ASP_SYS0020#6' : ['紐付けASP_HIMO','Peg ASP_HIMO',''],
'ASP_SYS0020#3' : ['資源マスタASP_M_SIGEN','Resource ASP_M_SIGEN',''],
'ASP_SYS0011#1' : ['グループ構成','Group Constitution',''],
'ASP_SYS0011#0' : ['機能グループ','Function Group',''],
'ASP_SYS0011#2' : ['機能グループ構成','Function Group Constitution','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_FUNC_SQL SET TITLE = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " ";
//TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//画面項目の更新(TLN_M_GENERAL_ITEM)
//画面項目はCOL_NAMEで変換を実施、ただし同じCOL_NAMEでも異なる名称もあるため、COL_NAMEと変換前文字列を条件に変換を実施
var map = {
'APP_URL#1' : ['機能毎APP_URL','Application url',''],
'ATO_DANDORI_END_DATE#2' : ['後段取り終了日時','Teardown end time',''],
'ATO_DANDORI_START_DATE#3' : ['後段取り開始日時','Teardown start time',''],
'ATO_DANDORI_TIME#4' : ['後段取り','Teardown',''],
'ATO_DANDORI_TIME#5' : ['後段取り時間','Teardown time',''],
'AUTH_KBN#6' : ['権限区分 0:参照 1:更新','Authorization classification',''],
'AVGKIKAN#7' : ['過去平均','Past average',''],
'AVG_MAE_DANDORI_TIME#8' : ['前段取り(過去平均)','Setup (Past average)',''],
'AVG_SAGYO_TIME#9' : ['製造(過去平均)','Production (Past average)',''],
'BACK_COLOR_FUNC#10' : ['対象機能','Target ',''],
'BOM_VERSION#11' : ['バージョン','Version',''],
'BUDOMARI#12' : ['歩留まり率(1は100%)','Yield rate (1=100%)',''],
'CHR2#13' : ['条件式','Conditional expression',''],
'CODE#14' : ['品目/資源コード','Item / Resource code',''],
'CREATED_BY#15' : ['作成者','Created auther',''],
'CREATED_DATE#16' : ['作成日','Created date',''],
'CREATED_PRG_NM#17' : ['作成プログラム名','Created program',''],
'DEL_FLG#18' : ['削除','Delete',''],
'DEL_FLG#19' : ['削除フラグ','Delete flag',''],
'DEL_FLG_SEARCH#20' : ['削除を検索','Search delete',''],
'EARLIEST_START_DATE#21' : ['最早開始日時','EST',''],
'END_DATE#22' : ['終了日時','End date',''],
'END_DATE_YMD#23' : ['終了日 ','End date',''],
'EVENT_NAIYO#24' : ['イベント内容','Event contents',''],
'FUKA_1#25' : ['負荷(PJ1)','Load (PJ1)',''],
'FUKA_2#26' : ['負荷(PJ2)','Load (PJ2)',''],
'FUNC_ATH_ID#27' : ['グループID','Group id',''],
'FUNC_ATH_ID#28' : ['機能グループID','Function group id',''],
'FUNC_CHK#29' : ['ファンクションチェック','Function check',''],
'FUNC_GRP_ID#30' : ['グループID','Function group id',''],
'FUNC_ID#31' : ['機能ID','Function id',''],
'FUNC_NM#32' : ['機能名','Function name',''],
'FURYO_SU#33' : ['不良数','Scrap quantity',''],
'GRP#34' : ['品目/資源グループ','Item / Resource groups',''],
'GRP#35' : ['レベル1品目コード','Item code (Lv.1)',''],
'GRP_FLG#36' : ['レベル1品目','Item (Lv.1)',''],
'GRP_NM#37' : ['品目/資源グループ名','Item / Resource groups name',''],
'GRP_NM#38' : ['レベル1品目名','Item name (Lv.1)',''],
'HELP_URL#39' : ['機能毎HELP_URL','Function help url',''],
'HITUYO_SIGENRYO#40' : ['必要資源量','Required resource quantity',''],
'HIZUKE#41' : ['工程納期','Process due date',''],
'ITEM_AUTO_HOJU_FLG#42' : ['自動補充フラグ','Auto-replenish flag',''],
'ITEM_CODE#43' : ['品目コード','Item code',''],
'ITEM_GROUP#44' : ['品目グループ','Item groups',''],
'ITEM_GROUP_NM#45' : ['品目グループ名','Item groups name',''],
'ITEM_NM#46' : ['品目名','Item nm',''],
'ITEM_NM_DSP#47' : ['品目名','Item nm (display)',''],
'ITEM_SYUBETU#48' : ['品目種別','Item type',''],
'ITEM_SYUBETU_I#49' : ['中間品','Intermediate item',''],
'ITEM_TANKA#50' : ['品目単価','Item unit price',''],
'JSK_END_DATE#51' : ['実績終了日時','Reported end time',''],
'JSK_END_DATE_YMD#52' : ['実績終了日','Reported end date',''],
'JSK_ORDER_SU#53' : ['実績数量','Reported qty',''],
'JSK_SEIZO_SU#54' : ['実績数量','Reported qty',''],
'JSK_SEIZO_TIME#55' : ['実績製造時間:分','Reported time',''],
'JSK_SIGEN_CODE#56' : ['実績資源コード','Reported resource',''],
'JSK_SIGEN_GROUP#57' : ['実績資源グループ','Reported resource groups',''],
'JSK_SIGEN_GROUP_NM#58' : ['実績資源グループ名','Reported resource groups name',''],
'JSK_SIGEN_NM#59' : ['実績資源名','Reported resource name',''],
'JSK_START_DATE#60' : ['実績開始日時','Reported start time',''],
'JSK_START_DATE_YMD#61' : ['実績開始日','Reported start date',''],
'JSK_SU#62' : ['実績数','Reported qty',''],
'JSK_SU_KEI#63' : ['実績数計','Reported qty (total)',''],
'KASANARI_HOUHOU#64' : ['重なり方法','Time constraint method',''],
'KASANARI_MAX#65' : ['重なりMAX','Time constraint MAX',''],
'KASANARI_MIN#66' : ['重なりMIN','Time constraint MIN',''],
'KIND#67' : ['バーカラー','Color',''],
'KIND_DSP#68' : ['color','Color Image',''],
'KIND_SEL#69' : ['バーカラー(選択)','Color (select)',''],
'KOBAI_LOT_MAX#70' : ['購買ロットサイズMAX','Purchase lot size MAX',''],
'KOBAI_LOT_MIN#71' : ['購買ロットサイズMIN','Purchase lot size MIN',''],
'KOBAI_LOT_UNIT#72' : ['購買ロットサイズUNIT','Purchase lot size UNIT',''],
'KOUTEI_CODE#73' : ['工程コード','Process code',''],
'KOUTEI_NM#74' : ['工程名','Process name',''],
'KOUTEI_NO#75' : ['工順','Process number',''],
'KOUTEI_SELECTOR#76' : ['工程セレクタ','Process selector',''],
'KOUTEI_SELECTOR_JKN#77' : ['工程セレクタ有効条件','Process selector valid condition',''],
'KOUTEI_SORT#78' : ['ソード','Sort',''],
'LAST_MAE_DANDORI_TIME#79' : ['前段取り(直近)','Setup (recent)',''],
'LAST_SAGYO_TIME#80' : ['製造(直近)','Production (recent)',''],
'LOAD_INFO_KBN#81' : ['負荷グラフ対象','Load graph target',''],
'LT#82' : ['リードタイム','Lead time',''],
'LVL#83' : ['レベル','Level',''],
'MAE_DANDORI_END_DATE#84' : ['前段取り終了日時','Setup end time',''],
'MAE_DANDORI_START_DATE#85' : ['前段取り開始日時','Setup start time',''],
'MAE_DANDORI_TIME#86' : ['前段取り','Setup',''],
'MAE_DANDORI_TIME#87' : ['前段取り時間','Setup time',''],
'MODIFY_COUNT#88' : ['更新数','Updated number',''],
'MST_UMU#89' : ['登録状況','Registration status',''],
'NM#90' : ['品目/資源名','Item / Resource',''],
'NOKI_DATE#91' : ['納 期','Due date',''],
'NOKI_OKURE#92' : ['納期遅れを検索','Due date delay',''],
'NORMAL_SU#93' : ['正常数','Normal quantity',''],
'NOTE#94' : ['コメント','Comment',''],
'OBJECTID#95' : ['オブジェクトID','Object id',''],
'OPT_SORT#96' : ['№','No.',''],
'ORDER_CODE#97' : ['オーダコード','Order code',''],
'ORDER_CODE#98' : ['オーダコード(表示)','Order code (display)',''],
'ORDER_CODE_DISP#99' : ['オーダコード(表示)','Order code (display)',''],
'ORDER_CODE_KEY#100' : ['オーダコード','Order code',''],
'ORDER_CODE_KEY#101' : ['オーダコード(遷移)','Order code (transition)',''],
'ORDER_CODE_LEFT#102' : ['オーダコードLEFT','Order code (left)',''],
'ORDER_CODE_RIGHT#103' : ['オーダコードRIGHT','Order code (right)',''],
'ORDER_CODE_SORT#104' : ['オーダコード(順番)','Order code (sort)',''],
'ORDER_KBN#105' : ['オーダ区分','Order class',''],
'ORDER_STATUS#106' : ['ステータス','Order status',''],
'ORDER_SU#107' : ['オーダ数量','Order quantity',''],
'ORDER_SYUBETU#108' : ['オーダ種別','Order type',''],
'PLN_END_DATE#109' : ['終了日時','Plan end time',''],
'PLN_SEIZO_SU#110' : ['製造数量','Plan production quantity',''],
'PLN_SIGEN_CODE#111' : ['資源コード','Plan resource code',''],
'PLN_SIGEN_GROUP#112' : ['資源グループ','Plan resource groups',''],
'PLN_SIGEN_NM#113' : ['資源名','Plan resource name',''],
'PLN_START_DATE#114' : ['開始日時','Plan start time',''],
'PLN_SU#115' : ['計画数','Plan quantity',''],
'PLN_SU_KEI#116' : ['計画数計','Plan quantity (total)',''],
'PLN_YM#117' : ['計画月度','Plan monthly',''],
'PREV_KOUTEI_NO#118' : ['先行工順','Previous process number',''],
'PRINT_SORT#119' : ['出力ソート順','Sort',''],
'PROJECTID#120' : ['PJ','PJ',''],
'PROJECTID_1#121' : ['PJ1','PJ1',''],
'PROJECTID_2#122' : ['PJ2','PJ2',''],
'PROJECTNM_1#123' : ['PJNM1','PJNM1',''],
'PROJECTNM_2#124' : ['PJNM2','PJNM2',''],
'SAGYO_CODE#125' : ['作業コード','Code',''],
'SAGYO_CODE_LEFT#126' : ['作業コードLEFT','Code (left)',''],
'SAGYO_CODE_RIGHT#127' : ['作業コードRIGHT','Code (right)',''],
'SAGYO_LOT_MAX#128' : ['作業LOT MAX','Operation split size MAX',''],
'SAGYO_LOT_MIN#129' : ['作業LOT MIN','Operation split size MIN',''],
'SAGYO_LOT_UNIT#130' : ['作業LOT UNIT','Operation split size UNIT',''],
'SAGYO_STATUS#131' : ['ステータス','Status',''],
'SAGYO_STATUS#132' : ['更新後ステータス','Status (after)',''],
'SAGYO_STATUS_NOW#133' : ['ステータス','Status',''],
'SAGYO_STATUS_PRE#134' : ['ステータス(変更前)','Status (before)',''],
'SAIKI_FLG#135' : ['再帰実績フラグ','Result recursive flag',''],
'SASIZU_CODE#136' : ['指図コード','Instruction code',''],
'SASIZU_SYUBETU#137' : ['指図種別','Instruction type',''],
'SCRAP_SU#138' : ['スクラップ数','Scrap quantity',''],
'SEARCH_KBN_ITEM#139' : ['検索品目区分','Item class (search)',''],
'SEARCH_KBN_SIGEN#140' : ['検索資源区分','Resource class (search)',''],
'SEIZO#141' : ['数量','Quantity',''],
'SEIZO#142' : ['製造','Production',''],
'SEIZO_END_DATE#143' : ['実績終了日時','Reported end time',''],
'SEIZO_END_DATE#144' : ['製造終了日時','Produciton end time',''],
'SEIZO_KORITU#145' : ['製造効率','Production factor',''],
'SEIZO_LOT_MAX#146' : ['製造ロットサイズMAX','Production lot size MAX',''],
'SEIZO_LOT_MIN#147' : ['製造ロットサイズMIN','Production lot size MIN',''],
'SEIZO_LOT_UNIT#148' : ['製造ロットサイズUNIT','Production lot size UNIT',''],
'SEIZO_START_DATE#149' : ['実績開始日時','Reported start time',''],
'SEIZO_START_DATE#150' : ['製造開始日時','Production start time',''],
'SEIZO_SU#151' : ['実績数量','Reported quantity',''],
'SEIZO_SU#152' : ['製造数','Production quantity',''],
'SEIZO_TEISI_TIME#153' : ['実績停止時間:分','Reported stop time (min)',''],
'SEIZO_TIME#154' : ['製造数量','Produciton time',''],
'SEL_END_DATA_INCLUDE#155' : ['完了含む','Including complete',''],
'SIGEN_CODE#156' : ['品目/資源コード','Item / Resource ',''],
'SIGEN_CODE#157' : ['実績資源コード','Reported Resource',''],
'SIGEN_CODE#158' : ['資源コード','Resource code',''],
'SIGEN_CODE#159' : ['資源コード(表示)','Resource code (display)',''],
'SIGEN_CODE#160' : ['集計資源','Resource code (total)',''],
'SIGEN_CODE_KEY#161' : ['資源コード','Resource code',''],
'SIGEN_CODE_SORT#162' : ['資源コード(順番)','Resource code (sort)',''],
'SIGEN_COMMENT#163' : ['コメント','Comment',''],
'SIGEN_GROUP#164' : ['資源グループ','Resource groups',''],
'SIGEN_GROUP_NM#165' : ['資源グループ名','Resource groups name',''],
'SIGEN_KBN#166' : ['資源区分','Resource class',''],
'SIGEN_NM#167' : ['実績資源名','Reported resource name',''],
'SIGEN_NM#168' : ['資源名','Resource name',''],
'SIGEN_NM_DISP#169' : ['資源','Resource name',''],
'SIGEN_NM_DSP#170' : ['資源名','Resource name',''],
'SIGEN_SEIYAKU#171' : ['資源制約','Resource quantity constraints',''],
'SIGEN_SEIYAKU_KBN#172' : ['資源無制限を含める','Include resource quantity not constraints',''],
'SIGEN_SYUBETU#173' : ['資源種別','Resource type',''],
'SIGEN_YUSENDO#174' : ['資源優先度','Resource priority',''],
'SIYO1#175' : ['仕様1','Specification 1',''],
'SIYO2#176' : ['仕様2','Specification 2',''],
'SIYO3#177' : ['仕様3','Specification 3',''],
'SIYO4#178' : ['仕様4','Specification 4',''],
'SIYO_NUM1#179' : ['数値仕様1','Specification (numeric) 1',''],
'SIYO_NUM2#180' : ['数値仕様2','Specification (numeric) 2',''],
'SIYO_NUM3#181' : ['数値仕様3','Specification (numeric) 3',''],
'SIYO_NUM4#182' : ['数値仕様4','Specification (numeric) 4',''],
'START_DATE#183' : ['開始日時','Start date',''],
'START_DATE_TO_GANTTO#184' : ['開始日時(ガント遷移用)','Start date (gantto)',''],
'START_DATE_YMD#185' : ['開始日 ','Start date',''],
'STDEV#186' : ['実績除外','Resource exclusion',''],
'SUM_MAE_DANDORI_TIME#187' : ['前段取り(合計)','Setup (total)',''],
'SUM_SAGYO_TIME#188' : ['製造(合計)','Produciton time (total)',''],
'SURYO#189' : ['個数','Quantity',''],
'TASK_SELECTOR#190' : ['タスクセレクタ','Task selector',''],
'TASK_SELECTOR_JKN#191' : ['タスクセレクタ有効条件','Task selector valid conditon',''],
'TENKAI_HOUKOU#192' : ['展開方向','Deployment direction',''],
'TOOLTIP#193' : ['ツールチップ','Tooltip',''],
'TRG#194' : ['対象','Target ',''],
'TRG_DATE#195' : ['対象日','Target date',''],
'TYOTATU_HOUHOU#196' : ['調達方法','Obtain method',''],
'UPDATED_BY#197' : ['更新者','Updated auther',''],
'UPDATED_DATE#198' : ['更新日','Updated date',''],
'UPDATED_PRG_NM#199' : ['更新プログラム名','Updated program',''],
'WARITUKE_HOUKOU#200' : ['割付方向','Assignment direction',''],
'WARITUKE_SIGEN_FLG#201' : ['割付資源フラグ','Assignment flag',''],
'YM#202' : ['年月','YM',''],
'YMPLN_YYYYMM#203' : ['計画月度(指定月以降を更新)','Plan YM (Update after a designated month)',''],
'YMPLN_YYYYMM_SEARCH#204' : ['計画月度','Plan YM',''],
'YUKO_JOKEN_SIKI#205' : ['有効条件式','Vaid condition',''],
'YUSENDO#206' : ['優先度','Priority',''],
'ZAIKO_MAX#207' : ['在庫MAX','Stock MAX',''],
'ZAIKO_MIN#208' : ['在庫MIN','Stock MIN','']
}
for (key in map) {
var keys = key.split('#');
if ( !TALON.getDbConfig().isPostgres() ) {
//PostgreSQL以外
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM SET DISP_NAME = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID LIKE 'ASP_%' " +
" AND COL_NAME = '" + keys[0] + "' " +
" AND DISP_NAME = '" + map[key][now_lang] + "'";
} else {
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM SET DISP_NAME = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID LIKE 'ASP_%' " +
" AND UPPER(COL_NAME) = '" + keys[0] + "' " +
" AND DISP_NAME = '" + map[key][now_lang] + "'";
}
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//グループ名(TLN_M_GENERAL_ITEM)
var map = {
'ASP_ORD0300#0#15' : ['仕様関連','Specification',''],
'ASP_ORD0300#0#23' : ['コメント','Comment',''],
'ASP_ORD0410#0#5' : ['作業情報','Operation Information',''],
'ASP_ORD0410#0#14' : ['計画情報','Plan Information',''],
'ASP_ORD0410#0#21' : ['実績情報','Reported Infomation',''],
'ASP_ORD0410#0#29' : ['追加情報','Other Information',''],
'ASP_ORD0500#0#4' : ['作業情報','Operation Information',''],
'ASP_ORD0500#0#11' : ['計画情報','Plan Information',''],
'ASP_ORD0500#0#16' : ['実績情報','Reported Infomation',''],
'ASP_ORD0500#0#26' : ['追加情報','Other Information','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM SET GROUP_NAME = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND SORT = " + keys[2] + " ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//帳票ファイル名①(TLN_M_GENERAL_ITEM_OPTN)出力ファイル名
var map = {
'ASP_ORD0400#-1#ALL#BUTTON_REPORT#0' : ['作業指示書%SYSDATETIME%','Instruction_%SYSDATETIME%',''],
'ASP_ORD0400#-1#ALL#BUTTON_REPORT#1' : ['作業指示書%SYSDATETIME%.pdf','Instruction_%SYSDATETIME%.pdf','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND COL_NAME = '" + keys[2] + "' " +
" AND FUNC_KBN = '" + keys[3] + "' " +
" AND OPT_SORT = " + keys[4] + " ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//帳票ファイル名②(TLN_M_GENERAL_ITEM_OPTN)レイアウトファイル名
var map = {
'ASP_ORD0400#-1#ALL#BUTTON_REPORT#0' : ['ASP_ORD0400.xlsx','ASP_ORD0400_EN.xlsx',''],
'ASP_ORD0400#-1#ALL#BUTTON_REPORT#1' : ['ASP_ORD0400.jasper','ASP_ORD0400_EN.jasper','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND COL_NAME = '" + keys[2] + "' " +
" AND FUNC_KBN = '" + keys[3] + "' " +
" AND OPT_SORT = " + keys[4] + " ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//グラフ系列タイトル(TLN_M_GENERAL_ITEM_OPTN)
var map = {
'ASP_PLN1110#1#CHART_AXIS_Y_LABEL_BASE#CHART#0' : ['負荷(%)','Load (%)',''],
'ASP_BGT1120#2#CHART_AXIS_X_LABEL_BASE#CHART#0' : ['工程納期','Process due date',''],
'ASP_BGT1220#1#CHART_AXIS_X_LABEL_BASE#CHART#0' : ['工程納期','Process due date','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND COL_NAME = '" + keys[2] + "' " +
" AND FUNC_KBN = '" + keys[3] + "' " +
" AND OPT_SORT = " + keys[4] + " ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//ボタン名①(TLN_M_GENERAL_ITEM_OPTN)+TLN_M_GENERAL_USES
var map = {
'ASP_COP2200#0#ALL#BUTTON_BAT#0' : [' 実 行 ',' E x e c u t e ',''],
'ASP_MST0900#0#ALL#BUTTON_NEXT#0' : ['BOMメンテ','Maintenance Integrated',''],
'ASP_BGT1400#0#ALL#BUTTON_NEXT#1' : ['オーダ・作業','Order / Operration',''],
'ASP_PLN0110#0#ALL#BUTTON_NEXT#1' : ['オーダ・作業','Order / Operration',''],
'ASP_PLN0120#0#ALL#BUTTON_NEXT#1' : ['オーダ・作業','Order / Operration',''],
'ASP_PLN0500#0#ALL#BUTTON_NEXT#1' : ['オーダ・作業','Order / Operration',''],
'ASP_PLN0210#0#ALL#BUTTON_NEXT#2' : ['オーダガント','Order Gantt',''],
'ASP_PLN0220#0#ALL#BUTTON_NEXT#2' : ['オーダガント','Order Gantt',''],
'ASP_PLN0600#0#ALL#BUTTON_NEXT#2' : ['オーダガント','Order Gantt',''],
'ASP_ORD0100#0#ALL#BUTTON_NEXT#0' : ['オーダメンテ','Maintenance Order',''],
'ASP_ORD0400#0#ALL#BUTTON_NEXT#0' : ['オーダメンテ','Maintenance Order',''],
'ASP_BGT1400#0#ALL#BUTTON_NEXT#0' : ['オーダ一覧','Order List',''],
'ASP_PLN0110#0#ALL#BUTTON_NEXT#0' : ['オーダ一覧','Order List',''],
'ASP_PLN0120#0#ALL#BUTTON_NEXT#0' : ['オーダ一覧','Order List',''],
'ASP_PLN0500#0#ALL#BUTTON_NEXT#0' : ['オーダ一覧','Order List',''],
'ASP_ORD0100#0#ALL#BUTTON_NEXT#2' : ['ガントチャート','Ganttchart',''],
'ASP_BGT1110#1#ALL#BUTTON_NEXT#1' : [' グ ラ フ 出 力 ','Graph Output',''],
'ASP_BGT1210#0#ALL#BUTTON_NEXT#0' : [' グ ラ フ 出 力 ','Graph Output',''],
// 'ASP_BGT1210#0#ALL#BUTTON_REPORT#0' : ['グラフ','Graph',''],
'ASP_ORD0100#0#ALL#BUTTON_NEXT#1' : ['作業一覧','Operation List',''],
'ASP_ORD0400#-1#ALL#BUTTON_REPORT#0' : ['作業指示書出力(EXCEL)','Instruction Output (Excel)',''],
'ASP_ORD0400#-1#ALL#BUTTON_REPORT#1' : ['作業指示書出力(PDF)','Instruction Output (PDF)',''],
'ASP_BGT1400#0#ALL#BUTTON_NEXT#2' : ['資源ガント','Resource Gantt',''],
'ASP_PLN0110#0#ALL#BUTTON_NEXT#2' : ['資源ガント','Resource Gantt',''],
'ASP_PLN0120#0#ALL#BUTTON_NEXT#2' : ['資源ガント','Resource Gantt',''],
'ASP_PLN0500#0#ALL#BUTTON_NEXT#2' : ['資源ガント','Resource Gantt',''],
'ASP_ORD0300#1#ALL#BUTTON_NEXT#0' : ['実績入力','Entry Result',''],
'ASP_ORD0400#0#ALL#BUTTON_NEXT#1' : ['実績入力','Entry Result',''],
'ASP_PLN0110#0#ALL#BUTTON_NEXT#3' : ['実績入力','Entry Result',''],
'ASP_PLN0120#0#ALL#BUTTON_NEXT#3' : ['実績入力','Entry Result',''],
'ASP_PLN0210#0#ALL#BUTTON_NEXT#1' : ['実績入力','Entry Result',''],
'ASP_PLN0220#0#ALL#BUTTON_NEXT#1' : ['実績入力','Entry Result',''],
'ASP_PLN0310#0#ALL#BUTTON_NEXT#1' : ['実績入力','Entry Result',''],
'ASP_PLN0320#0#ALL#BUTTON_NEXT#1' : ['実績入力','Entry Result',''],
'ASP_PLN0500#0#ALL#BUTTON_NEXT#3' : ['実績入力','Entry Result',''],
'ASP_PLN0600#0#ALL#BUTTON_NEXT#1' : ['実績入力','Entry Result',''],
'ASP_PLN0210#0#ALL#BUTTON_NEXT#0' : ['詳 細',' D e t a i l s ',''],
'ASP_PLN0220#0#ALL#BUTTON_NEXT#0' : ['詳 細',' D e t a i l s ',''],
'ASP_PLN0310#0#ALL#BUTTON_NEXT#0' : ['詳 細',' D e t a i l s ',''],
'ASP_PLN0320#0#ALL#BUTTON_NEXT#0' : ['詳 細',' D e t a i l s ',''],
'ASP_PLN0600#0#ALL#BUTTON_NEXT#0' : ['詳 細',' D e t a i l s ',''],
'ASP_ORD0600#0#ALL#BUTTON_NEXT#0' : ['入力','Entry',''],
'ASP_PLN0110#-1#ALL#BUTTON_AJAX#0' : ['非同期','Asynchronous',''],
'ASP_PLN0110#-1#ALL#BUTTON_AJAX_CLIANT_JAVASCRIPT#0' : ['非同期','Asynchronous',''],
'ASP_PLN0210#-1#ALL#BUTTON_AJAX#0' : ['非同期','Asynchronous',''],
'ASP_PLN0210#-1#ALL#BUTTON_AJAX_CLIANT_JAVASCRIPT#0' : ['非同期','Asynchronous',''],
'ASP_PLN0310#-1#ALL#BUTTON_AJAX#0' : ['非同期','Asynchronous',''],
'ASP_PLN0310#-1#ALL#BUTTON_AJAX_CLIANT_JAVASCRIPT#0' : ['非同期','Asynchronous',''],
'ASP_BGT1110#1#ALL#BUTTON_NEXT#0' : [' 品 目 別 ',' By Item ',''],
'ASP_PLN1110#0#ALL#BUTTON_NEXT#0' : [' 負 荷 を 見 る ',' See the load ','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND COL_NAME = '" + keys[2] + "' " +
" AND FUNC_KBN = '" + keys[3] + "' " +
" AND OPT_SORT = " + keys[4] + " ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
//ボタンの初期表示設定の更新
var sql = "" +
"UPDATE TLN_M_GENERAL_USES SET KEY_CODE = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND OPTN = 'BUTTON' " +
" AND KEY_CODE = '" + map[key][now_lang] + "' ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//ボタン名②(TLN_M_GENERAL_ITEM_OPTN)+TLN_M_GENERAL_POSITION
var map = {
'ASP_SYS0010#0#ALL#BUTTON_BAT#3' : ['サンプルデータ削除','Sample Data Delete',''],
'ASP_SYS0010#0#ALL#BUTTON_BAT#2' : ['サンプルデータ登録','Sample Data Entry',''],
'ASP_SYS0010#0#ALL#BUTTON_BAT#1' : ['セットアップ・パッチ','Setup patch processing ',''],
'ASP_SYS0010#0#ALL#BUTTON_BAT#0' : ['セットアップ・初期化','Setup / initialization processing ',''],
'ASP_SYS0010#0#ALL#BUTTON_BAT#4' : ['メニュー構成データ登録','Menu Data Entry',''],
'ASP_SYS0010#0#ALL#BUTTON_BAT#5' : ['日本語に変換','Language change (Japanese)',''],
'ASP_SYS0010#0#ALL#BUTTON_BAT#6' : ['英語に変換','Language change (English)',''],
'ASP_SYS0010#0#ALL#BUTTON_BAT#7' : ['中国語に変換','Language change (Chinese)','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND COL_NAME = '" + keys[2] + "' " +
" AND FUNC_KBN = '" + keys[3] + "' " +
" AND OPT_SORT = " + keys[4] + " ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
//ボタンのフリーレイアウト定義の更新
var sql = "" +
"UPDATE TLN_M_GENERAL_POSITION SET NAME = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND CHR1 = 'BUTTON' " +
" AND NAME = '" + map[key][now_lang] + "' ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//フリーレイアウト(TLN_M_GENERAL_POSITION)
var map = {
'ASP_SYS0010#BLOCK#BASE_INFO#0_0_0#5' : ['初期化、もしくは初回のインストール','Initialization or initial install',''],
'ASP_SYS0010#BLOCK#BASE_INFO#0_0_0#6' : ['メニュー構成','Menu structure',''],
'ASP_SYS0010#BLOCK#BASE_INFO#0_0_0#18' : ['2回目以降のインストール','Second or later install',''],
'ASP_SYS0010#BLOCK#BASE_INFO#0_0_0#19' : ['言語変更','Language change',''],
'ASP_SYS0010#BLOCK#BASE_INFO#0_0_0_34#0' : ['FUNC_CHK','FUNC_CHK',''],
'ASP_SYS0010#BLOCK#BASE_INFO#0_0_0_34#1' : [' Viewを再構築する',' Rebuild View','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_GENERAL_POSITION SET NAME = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND SCOPE = '" + keys[1] + "' " +
" AND ATTR_KBN = '" + keys[2] + "' " +
" AND POS = '" + keys[3] + "' " +
" AND SORT = " + keys[4] + " ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//汎用マスタ:識別コード名
var map = {
'ASP_ALL_SEARCH' : ['全てを検索する','Search all',''],
'ASP_BACK_COLOR' : ['背景色設定','Background color',''],
'ASP_BACK_COLOR_FUNC' : ['背景色設定機能','Background color setting function',''],
'ASP_BASE_DATE' : ['基準日付データ','Date data',''],
'ASP_BOMMNT_AVGKIKAN' : ['製造BOM時間メンテ過去平均期間','Integrated, average time ',''],
'ASP_BOMMNT_STDEV' : ['製造BOM時間メンテ実績除外','Integrated, exclusion from reported',''],
'ASP_CHECKBOX_ONE' : ['対象チェックボックス','Target check box',''],
'ASP_DEL_FLG' : ['論理削除フラグ','Delete flag',''],
'ASP_DEL_FLG_NONE' : ['論理削除フラグ','Delete flag (checkbox)',''],
'ASP_ITEM_AUTO_HOJU_FLG' : ['ASPROVA品目自動補充フラグ','Auto-replenish flag',''],
'ASP_ITEM_SYUBETU' : ['ASPROVA品目種別','Item type',''],
'ASP_ITEM_SYUBETU_ALL' : ['ASPROVA品目種別','Item type (all)',''],
'ASP_ITEM_SYUBETU_I' : ['品目種別中間品','Intermediate item',''],
'ASP_KASANARI_HOUHOU' : ['ASPROVA重なり方法','Time constraint method',''],
'ASP_LOAD_INFO_KBN' : ['負荷グラフ対象資源区分','Load graph target',''],
'ASP_NOKI_OKURE_NONE' : ['納期遅れフラグ','Due date delay flag',''],
'ASP_ORDER_KBN' : ['ASPROVAオーダ区分','Order class',''],
'ASP_ORDER_STATUS' : ['ASPROVAオーダステータス','Order status',''],
'ASP_ORDER_SYUBETU' : ['ASPROVAオーダ種別','Order type',''],
'ASP_PROJECTID' : ['プロジェクトID','Project id',''],
'ASP_SAGYO_STATUS' : ['ASPROVA作業ステータス','Operation status',''],
'ASP_SASIZU_SYUBETU' : ['ASPROVA指図種別','Instruction type',''],
'ASP_SEARCH_KBN_ITEM' : ['検索品目区分','Item class (search)',''],
'ASP_SEARCH_KBN_SIGEN' : ['検索資源区分','Resource class (search)',''],
'ASP_SIGEN_KBN' : ['ASPROVA資源区分','Resource class',''],
'ASP_SIGEN_SEIYAKU' : ['ASPROVA資源量制約','Resource quantity constraints',''],
'ASP_SIGEN_SYUBETU' : ['ASPROVA資源種別','Resource type',''],
'ASP_TENKAI_END' : ['展開末端','Deployment end',''],
'ASP_TENKAI_HOUKOU' : ['展開方向','Deployment direction',''],
'ASP_TYOTATU_HOUHOU' : ['ASPROVA品目調達方法','Obtain method',''],
'ASP_WARITUKE_SIGEN_FLG' : ['ASPROVA割付け資源量フラグ','Assignment flag',''],
'ASP_YUSENDO_NVL' : ['優先度未設定時','When no priority is set',''],
'ASP_TOOLTIP_TITLE' : ['ツールチップタイトル','Tooltip title','']
}
for (key in map) {
var sql = "" +
"UPDATE TLN_M_HANYO_CODE_MAIN SET SIKIBETU_NM = '" + map[key][to_lang] + "' " +
"WHERE SIKIBETU_CODE = '" + key + "' ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//汎用マスタ:DSP1
var map = {
'ASP_ALL_SEARCH#1' : ['全てを検索','Search all',''],
'ASP_BACK_COLOR#009487' : ['標準表示色16(#009487)','Background color16 (#009487)',''],
'ASP_BACK_COLOR#00B04E' : ['標準表示色17(#00B04E)','Background color17 (#00B04E)',''],
'ASP_BACK_COLOR#2DDD7B' : ['標準表示色26(#2DDD7B)','Background color26 (#2DDD7B)',''],
'ASP_BACK_COLOR#32C6B9' : ['標準表示色19(#32C6B9)','Background color19 (#32C6B9)',''],
'ASP_BACK_COLOR#5AAE72' : ['標準表示色14(#5AAE72)','Background color14 (#5AAE72)',''],
'ASP_BACK_COLOR#64F8EB' : ['標準表示色5(#64F8EB)','Background color5 (#64F8EB)',''],
'ASP_BACK_COLOR#64FFB2' : ['標準表示色2(#64FFB2)','Background color2 (#64FFB2)',''],
'ASP_BACK_COLOR#8080FF' : ['標準表示色3(#8080FF)','Background color3 (#8080FF)',''],
'ASP_BACK_COLOR#8585DC' : ['標準表示色27(#8585DC)','Background color27 (#8585DC)',''],
'ASP_BACK_COLOR#8F69D0' : ['標準表示色15(#8F69D0)','Background color15 (#8F69D0)',''],
'ASP_BACK_COLOR#8F83A8' : ['標準表示色12(#8F83A8)','Background color12 (#8F83A8)',''],
'ASP_BACK_COLOR#9B9490' : ['標準表示色20(#9B9490)','Background color20 (#9B9490)',''],
'ASP_BACK_COLOR#A8C0C1' : ['標準表示色11(#A8C0C1)','Background color11 (#A8C0C1)',''],
'ASP_BACK_COLOR#ADADFF' : ['標準表示色9(#ADADFF)','Background color9 (#ADADFF)',''],
'ASP_BACK_COLOR#B7ABD0' : ['標準表示色31(#B7ABD0)','Background color31 (#B7ABD0)',''],
'ASP_BACK_COLOR#BA9BA7' : ['標準表示色30(#BA9BA7)','Background color30 (#BA9BA7)',''],
'ASP_BACK_COLOR#BFB939' : ['標準表示色22(#BFB939)','Background color22 (#BFB939)',''],
'ASP_BACK_COLOR#C59777' : ['標準表示色7(#C59777)','Background color7 (#C59777)',''],
'ASP_BACK_COLOR#C5A0FF' : ['標準表示色23(#C5A0FF)','Background color23 (#C5A0FF)',''],
'ASP_BACK_COLOR#C6D2AF' : ['標準表示色29(#C6D2AF)','Background color29 (#C6D2AF)',''],
'ASP_BACK_COLOR#C8C1BD' : ['標準表示色32(#C8C1BD)','Background color32 (#C8C1BD)',''],
'ASP_BACK_COLOR#CAAF66' : ['標準表示色24(#CAAF66)','Background color24 (#CAAF66)',''],
'ASP_BACK_COLOR#CBFB47' : ['標準表示色8(#CBFB47)','Background color8 (#CBFB47)',''],
'ASP_BACK_COLOR#CEA8B6' : ['標準表示色13(#CEA8B6)','Background color13 (#CEA8B6)',''],
'ASP_BACK_COLOR#CFB17D' : ['標準表示色28(#CFB17D)','Background color28 (#CFB17D)',''],
'ASP_BACK_COLOR#E8BA9A' : ['標準表示色21(#E8BA9A)','Background color21 (#E8BA9A)',''],
'ASP_BACK_COLOR#ECE666' : ['標準表示色4(#ECE666)','Background color4 (#ECE666)',''],
'ASP_BACK_COLOR#F05728' : ['標準表示色25(#F05728)','Background color25 (#F05728)',''],
'ASP_BACK_COLOR#F280FF' : ['標準表示色6(#F280FF)','Background color6 (#F280FF)',''],
'ASP_BACK_COLOR#FD96BA' : ['標準表示色18(#FD96BA)','Background color18 (#FD96BA)',''],
'ASP_BACK_COLOR#FF895A' : ['標準表示色1(#FF895A)','Background color1 (#FF895A)',''],
'ASP_BACK_COLOR#FFBB8C' : ['標準表示色10(#FFBB8C)','Background color10 (#FFBB8C)',''],
'ASP_BACK_COLOR_FUNC#1' : ['オーダガントチャート','Order Ganttchart',''],
'ASP_BACK_COLOR_FUNC#2' : ['資源ガントチャート','Resource Ganttchart',''],
'ASP_BACK_COLOR_FUNC#3' : ['作業スケジュール','Operation Schedule',''],
'ASP_BASE_DATE#1' : ['01','01',''],
'ASP_BASE_DATE#10' : ['10','10',''],
'ASP_BASE_DATE#11' : ['11','11',''],
'ASP_BASE_DATE#12' : ['12','12',''],
'ASP_BASE_DATE#13' : ['13','13',''],
'ASP_BASE_DATE#14' : ['14','14',''],
'ASP_BASE_DATE#15' : ['15','15',''],
'ASP_BASE_DATE#16' : ['16','16',''],
'ASP_BASE_DATE#17' : ['17','17',''],
'ASP_BASE_DATE#18' : ['18','18',''],
'ASP_BASE_DATE#19' : ['19','19',''],
'ASP_BASE_DATE#2' : ['02','02',''],
'ASP_BASE_DATE#20' : ['20','20',''],
'ASP_BASE_DATE#21' : ['21','21',''],
'ASP_BASE_DATE#22' : ['22','22',''],
'ASP_BASE_DATE#23' : ['23','23',''],
'ASP_BASE_DATE#24' : ['24','24',''],
'ASP_BASE_DATE#25' : ['25','25',''],
'ASP_BASE_DATE#26' : ['26','26',''],
'ASP_BASE_DATE#27' : ['27','27',''],
'ASP_BASE_DATE#28' : ['28','28',''],
'ASP_BASE_DATE#29' : ['29','29',''],
'ASP_BASE_DATE#3' : ['03','03',''],
'ASP_BASE_DATE#30' : ['30','30',''],
'ASP_BASE_DATE#31' : ['31','31',''],
'ASP_BASE_DATE#4' : ['04','04',''],
'ASP_BASE_DATE#5' : ['05','05',''],
'ASP_BASE_DATE#6' : ['06','06',''],
'ASP_BASE_DATE#7' : ['07','07',''],
'ASP_BASE_DATE#8' : ['08','08',''],
'ASP_BASE_DATE#9' : ['09','09',''],
'ASP_BOMMNT_AVGKIKAN#-1' : ['1か月','1 month',''],
'ASP_BOMMNT_AVGKIKAN#-3' : ['3か月','3 months',''],
'ASP_BOMMNT_AVGKIKAN#-6' : ['6か月','6 months',''],
'ASP_BOMMNT_STDEV#1' : ['68.26%','68.26%',''],
'ASP_BOMMNT_STDEV#2' : ['95.44%','95.44%',''],
'ASP_BOMMNT_STDEV#3' : ['99.73%','99.73%',''],
'ASP_CHECKBOX_ONE#1' : [' ',' ',''],
'ASP_DEL_FLG#1' : ['削除','Delete',''],
'ASP_DEL_FLG_NONE#1' : [' ',' ',''],
'ASP_ITEM_AUTO_HOJU_FLG#0' : ['いいえ','No',''],
'ASP_ITEM_AUTO_HOJU_FLG#1' : ['はい','Yes',''],
'ASP_ITEM_AUTO_HOJU_FLG#2' : ['はい(1対1生産)','Yes (1 to 1 production)',''],
'ASP_ITEM_AUTO_HOJU_FLG#3' : ['はい(在庫+1対1生産)','Yes (stock + 1 to 1 production)',''],
'ASP_ITEM_AUTO_HOJU_FLG#4' : ['はい(需給調整1対1生産)','Yes (1 supply and demand adjustment to 1 production)',''],
'ASP_ITEM_SYUBETU#H' : ['半製品','Manufactured part',''],
'ASP_ITEM_SYUBETU#M' : ['原材料','Raw material',''],
'ASP_ITEM_SYUBETU#P' : ['製品','Finished item',''],
'ASP_ITEM_SYUBETU#U' : ['購買品','Purchased part',''],
'ASP_ITEM_SYUBETU_ALL#H' : ['半製品','Manufactured part',''],
'ASP_ITEM_SYUBETU_ALL#I' : ['中間品','Intermediate item',''],
'ASP_ITEM_SYUBETU_ALL#M' : ['原材料','Raw material',''],
'ASP_ITEM_SYUBETU_ALL#P' : ['製品','Finished item',''],
'ASP_ITEM_SYUBETU_ALL#U' : ['購買品','Purchased part',''],
'ASP_ITEM_SYUBETU_I#1' : ['含む','Include',''],
'ASP_KASANARI_HOUHOU#EES' : ['EES','EES',''],
'ASP_KASANARI_HOUHOU#ES' : ['ES','ES',''],
'ASP_KASANARI_HOUHOU#ESE' : ['ESE','ESE',''],
'ASP_KASANARI_HOUHOU#ESSEE' : ['ESSEE','ESSEE',''],
'ASP_KASANARI_HOUHOU#SS' : ['SS','SS',''],
'ASP_KASANARI_HOUHOU#SSEE' : ['SSEE','SSEE',''],
'ASP_KASANARI_HOUHOU#SSEEE' : ['SSEEE','SSEEE',''],
'ASP_LOAD_INFO_KBN#0' : ['非対象','Target',''],
'ASP_LOAD_INFO_KBN#1' : ['対象','Not targeted',''],
'ASP_NOKI_OKURE_NONE#1' : [' ',' ',''],
'ASP_ORDER_KBN#0' : ['登録','Registered order',''],
'ASP_ORDER_KBN#1' : ['補充','Replenishment order',''],
'ASP_ORDER_STATUS#B' : ['完了','Completed',''],
'ASP_ORDER_STATUS#T' : ['着手済','Started',''],
'ASP_ORDER_STATUS#X' : ['未着手','Not started',''],
'ASP_ORDER_SYUBETU#I' : ['在庫(絶対量)','Inventory (absolute)',''],
'ASP_ORDER_SYUBETU#J' : ['在庫(増減量)','Inventory (fluctuation)',''],
'ASP_ORDER_SYUBETU#M' : ['製造','Manufacturing order',''],
'ASP_ORDER_SYUBETU#P' : ['購買','Purchase order',''],
'ASP_ORDER_SYUBETU#S' : ['受注','Sales order',''],
'ASP_PROJECTID#TFA5' : ['TFA5','TFA5',''],
'ASP_SAGYO_STATUS#A' : ['計画済み','Scheduled',''],
'ASP_SAGYO_STATUS#B' : ['完了','Completed',''],
'ASP_SAGYO_STATUS#D' : ['確定','Frozen',''],
'ASP_SAGYO_STATUS#I' : ['指示済み','Released',''],
'ASP_SAGYO_STATUS#T' : ['着手済み','Started',''],
'ASP_SASIZU_SYUBETU#I' : ['I:入力指図','Input instruction',''],
'ASP_SASIZU_SYUBETU#O' : ['O:出力指図','Use instruction',''],
'ASP_SASIZU_SYUBETU#U' : ['U:使用指図','Output instruction',''],
'ASP_SEARCH_KBN_ITEM#0' : ['品目番号','item code',''],
'ASP_SEARCH_KBN_ITEM#1' : ['品目グループ','item groups',''],
'ASP_SEARCH_KBN_SIGEN#0' : ['資源コード','Resource code',''],
'ASP_SEARCH_KBN_SIGEN#1' : ['資源グループ','Resource groups',''],
'ASP_SIGEN_KBN#F' : ['炉資源(任意仕様)','Furnace resource (Any spec)',''],
'ASP_SIGEN_KBN#F1' : ['炉資源(仕様1)','Furnace resource (Spec 1)',''],
'ASP_SIGEN_KBN#F2' : ['炉資源(仕様2)','Furnace resource (Spec 2)',''],
'ASP_SIGEN_KBN#F3' : ['炉資源(仕様3)','Furnace resource (Spec 3)',''],
'ASP_SIGEN_KBN#F4' : ['炉資源(仕様4)','Furnace resource (Spec 4)',''],
'ASP_SIGEN_KBN#M' : ['多重資源','Multiplex resource',''],
'ASP_SIGEN_KBN#S' : ['単純資源','Simple resource',''],
'ASP_SIGEN_SEIYAKU#N' : ['制約なし','Not constrained',''],
'ASP_SIGEN_SEIYAKU#R' : ['制約あり','Constrained',''],
'ASP_SIGEN_SEIYAKU#V' : ['資源量に応じて','According to resource quantity',''],
'ASP_SIGEN_SYUBETU#II' : ['在庫(デフォルト)','Inventory(default)',''],
'ASP_SIGEN_SYUBETU#M' : ['主資源','Main resource',''],
'ASP_SIGEN_SYUBETU#PI' : ['購買(デフォルト)','Purchase(default)',''],
'ASP_SIGEN_SYUBETU#S' : ['副資源','Sub resource',''],
'ASP_SIGEN_SYUBETU#SI' : ['受注(デフォルト)','Sales(default)',''],
'ASP_TENKAI_END#0' : ['末端以外','Not end',''],
'ASP_TENKAI_END#1' : ['末端','End',''],
'ASP_TENKAI_HOUKOU#0' : ['正展開','Positive development',''],
'ASP_TENKAI_HOUKOU#1' : ['逆展開','Reverse development',''],
'ASP_TYOTATU_HOUHOU#IM' : ['内製優先','Prefer to produce',''],
'ASP_TYOTATU_HOUHOU#IP' : ['購買優先','Prefer to purchase',''],
'ASP_TYOTATU_HOUHOU#M' : ['内製','Produce',''],
'ASP_TYOTATU_HOUHOU#P' : ['購買','Purchase',''],
'ASP_WARITUKE_SIGEN_FLG#0' : ['通常','Normal',''],
'ASP_WARITUKE_SIGEN_FLG#1' : ['製造数量に比例させる','Proportionate to production quantity',''],
'ASP_YUSENDO_NVL#SORT_VALUE' : ['ソート用代替値','Alternative value',''],
'ASP_TOOLTIP_TITLE#1' : ['<オーダ>','[ Order ]',''],
'ASP_TOOLTIP_TITLE#2' : ['<納 期>','[ Due date ]',''],
'ASP_TOOLTIP_TITLE#3' : ['<作 業>','[ Operation ]',''],
'ASP_TOOLTIP_TITLE#4' : ['<品 目>','[ Item ]',''],
'ASP_TOOLTIP_TITLE#5' : ['<製造数量>','[ Production quantity ]',''],
'ASP_TOOLTIP_TITLE#6' : ['<開始日時>','[ Start time ]',''],
'ASP_TOOLTIP_TITLE#7' : ['<終了日時>','[ End time ]',''],
'ASP_TOOLTIP_TITLE#8' : ['<段取り時間:分>','[ Processing time ]',''],
'ASP_TOOLTIP_TITLE#9' : ['<製造時間:分>','[ Production time ]','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_HANYO_CODE_MAIN SET DSP1 = '" + map[key][to_lang] + "' " +
"WHERE SIKIBETU_CODE = '" + keys[0] + "' " +
" AND KEY_CODE = '" + keys[1] + "' ";
//TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//汎用マスタ:DSP2
var map = {
'ASP_ORDER_SYUBETU#I' : ['在庫','Inventory',''],
'ASP_ORDER_SYUBETU#J' : ['在庫','Inventory',''],
'ASP_ORDER_SYUBETU#M' : ['製造','Manufacturing order',''],
'ASP_ORDER_SYUBETU#P' : ['購買','Purchase order',''],
'ASP_ORDER_SYUBETU#S' : ['受注','Sales order',''],
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_HANYO_CODE_MAIN SET DSP2 = '" + map[key][to_lang] + "' " +
"WHERE SIKIBETU_CODE = '" + keys[0] + "' " +
" AND KEY_CODE = '" + keys[1] + "' ";
//TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//メニュー:メニューグループ
var map = {
'systemASP_BGT' : ['予実分析','Budget and Results Analysis',''],
'systemASP_MBL' : ['スマートフォン実績入力','Entry Operation Result (Smartphone)',''],
'systemASP_MST' : ['マスタ関連','Master Maintenance',''],
'systemASP_ORD' : ['オーダ・作業','Order / Operation',''],
'systemASP_PLN' : ['計画分析','Plan Analysis',''],
'systemASP_SYS' : ['システム管理','System Management','']
}
for (key in map) {
var sql = "" +
"UPDATE TLN_M_AUTHORITY SET FUNC_NM = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ATH_ID = '" + key + "' ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//メニュー:メニューグループ
var map = {
'systemTLN_TFA//systemASP_ORD#ASP_ORD0100R' : ['オーダ一覧照会','Inquiry Order List ',''],
'systemTLN_TFA//systemASP_ORD#ASP_ORD0100U' : ['オーダ一覧メンテナンス','Maintenance Order List ',''],
'systemTLN_TFA//systemASP_ORD#ASP_ORD0400U' : ['作業一覧・指示書発行','Operation List / Instruction ',''],
'systemTLN_TFA//systemASP_ORD#ASP_ORD0300U' : ['オーダ・作業メンテナンス','Maintenance Order / Operation List',''],
'systemTLN_TFA//systemASP_ORD#ASP_ORD0700U' : ['作業実績一括入力','Entry Operation Result (Bulkupdate)',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0110U' : ['オーダガントチャート','Order Ganttchart',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0120U' : ['オーダガントチャート(更新)','Order Ganttchart (Entry)',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0210U' : ['資源ガントチャート','Resource Ganttchart',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0220U' : ['資源ガントチャート(更新)','Resource Ganttchart (Entry)',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0310U' : ['作業スケジュールカレンダー','Operation Schedule',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0320U' : ['作業スケジュールカレンダー(更新)','Operation Schedule (Entry)',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0400U' : ['作業調整一括取消','Cancel Operation Change Data',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0700U' : ['ガントチャート・カレンダーカラー変更','Ganttchart / Schedule Color Ghange',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0500U' : ['複数計画比較 オーダガントチャート','Multiple Plan Order Ganttchart',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN0600U' : ['複数計画比較 資源ガントチャート','Multiple Plan Resource Ganttchart',''],
'systemTLN_TFA//systemASP_PLN#ASP_PLN1110U' : ['負荷グラフ照会','Inquiry Load Graph',''],
'systemTLN_TFA//systemASP_BGT#ASP_BGT1110U' : ['資源別予実照会','Budget and Results by Resource',''],
'systemTLN_TFA//systemASP_BGT#ASP_BGT1210U' : ['資源・品目別予実照会','Budget and Results by Item',''],
'systemTLN_TFA//systemASP_BGT#ASP_BGT1400U' : ['予実オーダガントチャート','Budget and Results by Order Gantt',''],
'systemTLN_TFA//systemASP_BGT#ASP_COP2200U' : ['月間計画作成','Monthly Planning',''],
'systemTLN_TFA//systemASP_MST#ASP_MST0800U' : ['資源マスタメンテナンス','Maintenance Reource Master',''],
'systemTLN_TFA//systemASP_MST#ASP_MST0700U' : ['工程マスタメンテナンス','Maintenance Process Master',''],
'systemTLN_TFA//systemASP_MST#ASP_MST0600U' : ['品目マスタメンテナンス','Maintenance Item Master',''],
'systemTLN_TFA//systemASP_MST#ASP_MST0100U' : ['製造BOMマスタメンテナンス','Maintenance Integrated Master',''],
'systemTLN_TFA//systemASP_MST#ASP_MST0400U' : ['製造BOM段取り製造時間メンテナンス','Maintenance SetupTime Master',''],
'systemTLN_TFA//systemASP_MST#ASP_MST0900U' : ['構成照会','Inquiry Configuration',''],
'systemTLN_TFA//systemASP_MBL#ASP_ORD0600U' : ['作業照会(スマートフォン)','Operation List (Smartphone)',''],
'systemTLN_TFA//systemASP_MBL#ASP_ORD0610U' : ['実績入力(スマートフォン)','Entry Operation Result (Smartphone)',''],
'systemTLN_TFA//systemASP_SYS#ASP_SYS0010U' : ['セットアップ・初期化','System Setup / Initialization','']
}
for (key in map) {
var keys = key.split('#');
var sql = "" +
"UPDATE TLN_M_FUNCTION SET FUNC_NM = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ATH_ID = '" + keys[0] + "' " +
" AND FUNC_ID = '" + keys[1] + "' ";
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
//機能設定:入力許可メッセージ(TLN_M_GENERAL_ITEM_OPTN)
//※PostgreSQL注意(COL_NAME)
var map = {
'ASP_ORD0100#0#ORDER_SU#MATCH_PATTERN#0' : ['受注オーダ、製造オーダ、購買オーダには 0より大きい数値を入力して下さい。','Please enter values greater than 0 for "Sales order", "Purchase order" and "Manufacturing order".',' '],
'ASP_ORD0500#0#END_DATE#MATCH_PATTERN#0' : ['完了の場合、実績終了日時を入力して下さい。','Please enter "Reported end time" in case of "Completed".',' '],
'ASP_ORD0500#0#MAE_DANDORI_END_DATE#MATCH_PATTERN#0' : ['前段取り終了日時の入力時、前段取り開始日時を入力してください。','When entering "Setup end time", please enter the "Setup start time".',' '],
'ASP_ORD0500#0#MAE_DANDORI_START_DATE#MATCH_PATTERN#0' : ['着手済みの場合、前段取り開始日時もしくは実績開始日時を入力して下さい。(必須)','Please enter "Setup start time" or "Reported start time" in case of "Started". (required)',' '],
'ASP_ORD0500#0#SEIZO_END_DATE#MATCH_PATTERN#0' : ['完了の場合、実績終了日時を入力して下さい。(必須)','Please enter "Reported end time" in case of "Completed". (required)',' '],
'ASP_ORD0500#0#SEIZO_START_DATE#MATCH_PATTERN#0' : ['着手済みの場合、前段取り開始日時もしくは実績開始日時を入力して下さい。(必須)','Please enter "Setup start time" or "Reported start time" in case of "Started". (required)',' '],
'ASP_ORD0500#0#SEIZO_SU#MATCH_PATTERN#0' : ['着手済み、完了の場合、実績数量を入力して下さい。','Please enter "Reported qty" in case of "Started" or "Completed".',' '],
'ASP_ORD0500#0#SIGEN_CODE#MATCH_PATTERN#0' : ['着手済み、完了の場合、実績資源コードを入力して下さい。','Please enter "Reported Resource" in case of "Started" or "Completed".',' '],
'ASP_ORD0500#0#START_DATE#MATCH_PATTERN#0' : ['着手済み、完了の場合、実績開始日時を入力して下さい。','Please enter "Reported start time" in case of "Started" or "Completed".',' '],
'ASP_ORD0700#0#END_DATE#MATCH_PATTERN#0' : ['完了の場合、実績終了日時を入力して下さい。','Please enter "Reported end time" in case of "Completed". ',' '],
'ASP_ORD0700#0#MAE_DANDORI_END_DATE#MATCH_PATTERN#0' : ['前段取り終了日時入力時は、前段取り開始日時を入力してください。','When entering "Setup end time", please enter the "Setup start time".',' '],
'ASP_ORD0700#0#MAE_DANDORI_START_DATE#MATCH_PATTERN#0' : ['着手済みの場合、前段取り開始日時もしくは実績開始日時を入力して下さい。(必須)','Please enter "Setup start time" or "Reported start time" in case of "Started". (required)',' '],
'ASP_ORD0700#0#SEIZO_END_DATE#MATCH_PATTERN#0' : ['完了の場合、実績終了日時を入力して下さい。(必須)','Please enter "Reported end time" in case of "Completed". (required)',' '],
'ASP_ORD0700#0#SEIZO_START_DATE#MATCH_PATTERN#0' : ['着手済みの場合、前段取り開始日時もしくは実績開始日時を入力して下さい。(必須)','Please enter "Setup start time" or "Reported start time" in case of "Started". (required)',' '],
'ASP_ORD0700#0#SEIZO_SU#MATCH_PATTERN#0' : ['着手済み、完了の場合、実績数量を入力して下さい。','Please enter "Reported qty" in case of "Started" or "Completed".',' '],
'ASP_ORD0700#0#SIGEN_CODE#MATCH_PATTERN#0' : ['着手済み、完了の場合、実績資源コードを入力して下さい。','Please enter "Reported Resource" in case of "Started" or "Completed".',' '],
'ASP_ORD0700#0#START_DATE#MATCH_PATTERN#0' : ['着手済み、完了の場合、実績開始日時を入力して下さい。','Please enter "Reported start time" in case of "Started" or "Completed".',' ']
}
for (key in map) {
var keys = key.split('#');
if ( !TALON.getDbConfig().isPostgres() ) {
//PostgreSQL以外
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND COL_NAME = '" + keys[2] + "' " +
" AND FUNC_KBN = '" + keys[3] + "' " +
" AND OPT_SORT = " + keys[4] + " ";
} else {
var sql = "" +
"UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = '" + map[key][to_lang] + "' " +
"WHERE FUNC_ID = '" + keys[0] + "' " +
" AND FUNC_SEQ = " + keys[1] + " " +
" AND UPPER(COL_NAME) = '" + keys[2] + "' " +
" AND FUNC_KBN = '" + keys[3] + "' " +
" AND OPT_SORT = " + keys[4] + " ";
}
// * TALON.addMsg( "★" + sql );
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
// ----------------------------------------
//汎用マスタの言語を更新
var sql = "" +
"UPDATE TLN_M_HANYO_CODE_MAIN SET DSP1 = '" + to_lang + "' " +
"WHERE SIKIBETU_CODE = 'ASP_LANGUAGE' " +
" AND KEY_CODE = 'LANG' ";
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
function create_himo_data_relation() {
//
table_exists_drop('ASP_WK_SAGYO_INFO_MAE');
//
table_exists_drop('ASP_WK_SAGYO_INFO_ATO');
//Oracle
//--------------------------------------------------------------------------------
if ( TALON.getDbConfig().isOra() ) {
// if ( !table_exists("ASP_WK_SAGYO_INFO_MAE") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_MAE( PROJECTID VARCHAR2(200) , ORDER_CODE_MY VARCHAR2(200) , SAGYO_CODE_MY VARCHAR2(200) , MAX_END_DATE DATE ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_MAE ADD ( CONSTRAINT PK_ASP_WK_SAGYO_INFO_MAE PRIMARY KEY ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") USING INDEX ) " +
"");
// }
// if ( !table_exists("ASP_WK_SAGYO_INFO_ATO") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_ATO( PROJECTID VARCHAR2(200) , ORDER_CODE_MY VARCHAR2(200) , SAGYO_CODE_MY VARCHAR2(200) , MIN_START_DATE DATE ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_ATO ADD ( CONSTRAINT PK_ASP_WK_SAGYO_INFO_ATO PRIMARY KEY ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") USING INDEX ) " +
"");
// }
};
//MySQL
//--------------------------------------------------------------------------------
if ( TALON.getDbConfig().isMy() ) {
// if ( !table_exists("ASP_WK_SAGYO_INFO_MAE") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_MAE( PROJECTID varchar(200) , ORDER_CODE_MY varchar(200) , SAGYO_CODE_MY varchar(200) , MAX_END_DATE datetime ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_MAE ADD CONSTRAINT PRIMARY KEY ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") " +
"");
// }
// if ( !table_exists("ASP_WK_SAGYO_INFO_ATO") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_ATO( PROJECTID varchar(200) , ORDER_CODE_MY varchar(200) , SAGYO_CODE_MY varchar(200) , MIN_START_DATE datetime ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_ATO ADD CONSTRAINT PRIMARY KEY ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") " +
"");
// }
};
//SQLServer
//--------------------------------------------------------------------------------
if ( TALON.getDbConfig().isMssql() ) {
// if ( !table_exists("ASP_WK_SAGYO_INFO_MAE") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_MAE( PROJECTID NVARCHAR(200) NOT NULL , ORDER_CODE_MY NVARCHAR(200) NOT NULL , SAGYO_CODE_MY NVARCHAR(200) NOT NULL , MAX_END_DATE DATETIME ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_MAE ADD CONSTRAINT PK_ASP_WK_SAGYO_INFO_MAE PRIMARY KEY NONCLUSTERED ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") " +
"");
// }
// if ( !table_exists("ASP_WK_SAGYO_INFO_ATO") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_ATO( PROJECTID NVARCHAR(200) NOT NULL , ORDER_CODE_MY NVARCHAR(200) NOT NULL , SAGYO_CODE_MY NVARCHAR(200) NOT NULL , MIN_START_DATE DATETIME ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_ATO ADD CONSTRAINT PK_ASP_WK_SAGYO_INFO_ATO PRIMARY KEY NONCLUSTERED ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") " +
"");
// }
};
//PostgreSQL
//--------------------------------------------------------------------------------
if ( TALON.getDbConfig().isPostgres() ) {
// if ( !table_exists("ASP_WK_SAGYO_INFO_MAE") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_MAE( PROJECTID character varying(200) , ORDER_CODE_MY character varying(200) , SAGYO_CODE_MY character varying(200) , MAX_END_DATE timestamp(6) ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_MAE ADD CONSTRAINT PK_ASP_WK_SAGYO_INFO_MAE PRIMARY KEY ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") " +
"");
// }
// if ( !table_exists("ASP_WK_SAGYO_INFO_ATO") ) {
executeSQL( "CREATE TABLE ASP_WK_SAGYO_INFO_ATO( PROJECTID character varying(200) , ORDER_CODE_MY character varying(200) , SAGYO_CODE_MY character varying(200) , MIN_START_DATE timestamp(6) ) ");
executeSQL(
"ALTER TABLE ASP_WK_SAGYO_INFO_ATO ADD CONSTRAINT PK_ASP_WK_SAGYO_INFO_ATO PRIMARY KEY ( " +
"PROJECTID, " +
"ORDER_CODE_MY, " +
"SAGYO_CODE_MY " +
") " +
"");
// }
};
}
≣ サーバJS ライブラリST_COMMON 要員シフト管理共通JavaScript 364字
/**********************************
*
* 要員シフト管理用共通JavaSctipt
*
**********************************/
//文字列の日付情報(YYYY/MM/DD)をJavaのDate型に変換して戻す。
function tln_string_to_date(val) {
y = parseInt(val.split("/")[0]) - 1900;
m = parseInt(val.split("/")[1]) - 1;
d = parseInt(val.split("/")[2]);
var date = new java.util.Date(y,m,d);
return date;
}≣ サーバJS ライブラリTALON_FUNCTION_COMMON_BK TALON機能設計書出力 共通ライブラリ 39964字
// TALON_FUNCTION_COMMON: TALON機能設計書出力 共通サーバ側JS
// LIBRARY_CODE: 0JSENGINE / TYPE: server-side common library
//
// 提供API:
// TFC.getLabelBundle(lang) Java ResourceBundle 取得 (ja/en/zh_CN/...)
// TFC.lbl(bundle, key, fallback) キー→翻訳テキスト
// TFC.escapeHtml(s) HTML エスケープ
// TFC.escapeMd(s) Markdown エスケープ
// TFC.escapeAttr(s) HTML 属性値エスケープ (& < " ' のみ)
// TFC.formatSql(s) SQL 整形 (将来用、現状は trim のみ)
// TFC.appKbnLabel(appKbn, lang) APP_KBN → "固定検索条件"等
// TFC.funcKbnInfo(funcKbn) FUNC_KBN → {section, labelKey, table} (辞書)
// TFC.toLocale(lang) lang 文字列を java.util.Locale へ変換
// TFC.HTML_HEAD / TFC.HTML_TAIL 自己完結HTMLの head/tail 生成
// TFC.htmlSection(title, body, opts) <details>セクション生成
// TFC.tabBadge(isOn, count, lang) タブ on/off バッジ HTML
// TFC.zip(entries) {name: bytes/string} → ZIP バイト列 (java.util.zip)
(function (global) {
'use strict';
var ResourceBundle = Java.type('java.util.ResourceBundle');
var Locale = Java.type('java.util.Locale');
var ByteArrayOutputStream = Java.type('java.io.ByteArrayOutputStream');
var ZipOutputStream = Java.type('java.util.zip.ZipOutputStream');
var ZipEntry = Java.type('java.util.zip.ZipEntry');
var JString = Java.type('java.lang.String');
var Charset = Java.type('java.nio.charset.Charset');
var TFC = {};
// ============================================================
// 言語・ラベル
// ============================================================
TFC.toLocale = function (lang) {
if (!lang) return Locale.JAPANESE;
var s = String(lang);
if (s.indexOf('_') > 0) {
var p = s.split('_');
return new Locale(p[0], p[1]);
}
if (s === 'ja') return Locale.JAPANESE;
if (s === 'en') return Locale.ENGLISH;
return new Locale(s);
};
var _bundleCache = {};
TFC.getLabelBundle = function (lang) {
var key = lang || 'ja';
if (!_bundleCache[key]) {
_bundleCache[key] = ResourceBundle.getBundle('general', TFC.toLocale(key));
}
return _bundleCache[key];
};
TFC.lbl = function (bundle, key, fallback) {
try {
return String(bundle.getString(key));
} catch (e) {
return fallback != null ? fallback : key;
}
};
// ============================================================
// エスケープ
// ============================================================
TFC.escapeHtml = function (s) {
if (s == null) return '';
return String(s)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
TFC.escapeAttr = function (s) {
if (s == null) return '';
return String(s)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
TFC.escapeMd = function (s) {
if (s == null) return '';
// Markdown で意味を持つ文字のうち、テキスト中で誤動作しやすいものをエスケープ
return String(s).replace(/([\\`*_{}\[\]()#+\-!|>])/g, '\\$1');
};
TFC.formatSql = function (s) {
if (s == null) return '';
return String(s).replace(/\r\n/g, '\n').replace(/\t/g, ' ').replace(/\n+$/, '');
};
// ============================================================
// APP_KBN ラベル ([TALON-DB設定マスタ.md] 出典)
// ============================================================
var APP_KBN_MAP = {
ja: { STD: '固定検索条件', FREE: 'フリー検索条件', SUB: '検索子画面', BAT: '検索ボタン無し' },
en: { STD: 'Fixed search condition', FREE: 'Free search condition', SUB: 'Sub search screen', BAT: 'No search button' }
};
TFC.appKbnLabel = function (appKbn, lang) {
var l = (lang && APP_KBN_MAP[lang]) ? lang : 'ja';
var m = APP_KBN_MAP[l];
return (m && m[appKbn]) || appKbn || '';
};
// ============================================================
// 項目情報の値マッピング
// ============================================================
var COMPONENT_MAP = {
'0': 'TEXT (テキスト)', '1': 'COMBO (ドロップダウン)', '2': 'CHECKBOX',
'3': 'RADIO', '4': 'TEXTAREA', '5': 'CHECK_FLG (フラグチェック)',
'6': 'PASSWORD', '7': 'HIDDEN', '8': 'LABEL (固定表示)',
'9': 'SUGGEST', '10': 'BARCODE', '11': 'IMAGE', '12': 'FILE',
'13': 'CLOB_TEXT', '14': 'TOGGLE', '15': 'COLOR_PICKER',
'16': 'DATE_PICKER', '17': 'TIME_PICKER', '18': 'DATETIME_PICKER'
};
TFC.componentLabel = function (val) {
var v = val == null ? '' : String(val);
return COMPONENT_MAP[v] || v;
};
var DATA_TYPE_MAP = {
'VARCHAR2': '文字列 (VARCHAR2)', 'CHAR': '文字列固定 (CHAR)',
'NUMBER': '数値 (NUMBER)', 'INTEGER': '整数 (INTEGER)',
'DATE': '日付 (DATE)', 'TIMESTAMP': '日時 (TIMESTAMP)',
'CLOB': 'CLOB (大量文字)', 'BLOB': 'BLOB (バイナリ)',
'BOOLEAN': '真偽 (BOOLEAN)'
};
TFC.dataTypeLabel = function (val) {
var v = val == null ? '' : String(val).toUpperCase();
return DATA_TYPE_MAP[v] || v;
};
TFC.flgLabel = function (val) {
var v = val == null ? '' : String(val);
if (v === '1') return '○';
if (v === '0' || v === '') return '';
return v;
};
// ============================================================
// FUNC_KBN 辞書 (Phase 3: 全208項目, TALON-DB設定マスタ.md から自動生成)
// 生成スクリプト: AI開発/scripts/build_func_kbn_dict.py
//
// section: 'app-application' | 'app-report' | 'app-othernext' | 'app-ajax'
// | 'block-item' | 'block-detail' | 'block-detail-cal'
// | 'block-report' | 'block-proc' | 'block-othernext'
// | 'block-fileio' | 'block-otherfunc' | 'block-other'
// | 'block-chart-general' | 'block-chart-x' | 'block-chart-y'
// | 'block-chart-y2' | 'block-chart-series'
// | 'free-layout' | 'auth-menu' | 'other'
// ============================================================
var FUNC_KBN_DICT = {
'KEY_COL_BLOCK': { section: 'app-application', labelJa: '機能タイプ', table: 'TLN_M_GENERAL_APP' },
'OPEN_WINDOW_MODE': { section: 'app-application', labelJa: '起動Window状態', table: 'TLN_M_GENERAL_APP' },
'WIN_H': { section: 'app-application', labelJa: 'Window高さ', table: 'TLN_M_GENERAL_APP' },
'WIN_W': { section: 'app-application', labelJa: 'Window幅', table: 'TLN_M_GENERAL_APP' },
'WIN_POS_X': { section: 'app-application', labelJa: '表示位置 横', table: 'TLN_M_GENERAL_APP' },
'WIN_POS_Y': { section: 'app-application', labelJa: '表示位置 縦', table: 'TLN_M_GENERAL_APP' },
'WIN_POS': { section: 'app-application', labelJa: '表示位置', table: 'TLN_M_GENERAL_APP' },
'IS_NOT_WIN_RESIZE': { section: 'app-application', labelJa: 'Windowサイズ変更不可', table: 'TLN_M_GENERAL_APP' },
'IS_ON_RELOAD_ORIGIN_WIN_SIZE': { section: 'app-application', labelJa: '再描画時、設定したWindow位置サイズに戻す', table: 'TLN_M_GENERAL_APP' },
'IS_WIN_OPENER_CLOSED': { section: 'app-application', labelJa: 'Window終了オプション', table: 'TLN_M_GENERAL_APP' },
'TAB_MENU_NAME': { section: 'app-application', labelJa: 'ブロック', table: 'TLN_M_GENERAL_APP' },
'CHART': { section: 'app-application', labelJa: 'ブロック', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CONDTN_CNT': { section: 'app-application', labelJa: '検索条件項目数', table: 'TLN_M_GENERAL_APP' },
'COND_SAVE_HDN_FLG': { section: 'app-application', labelJa: '検索条件保存', table: 'TLN_M_GENERAL_APP' },
'IS_CONDITION_TITLE_OFF': { section: 'app-application', labelJa: '検索条件タイトル', table: 'TLN_M_GENERAL_APP' },
'BACK_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'CLEAR_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'PDF_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'EXCEL_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'SEARCH_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_BTN_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_BTN_CND': { section: 'app-application', labelJa: '確定ボタン', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_BTN_NAME_DISP_FORMULA': { section: 'app-application', labelJa: '確定ボタン', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_MESSAGE': { section: 'app-application', labelJa: '確定終了メッセージ', table: 'TLN_M_GENERAL_APP' },
'IS_EXECUTE_MESSAGE_HIDDEN': { section: 'app-application', labelJa: '確定終了メッセージ', table: 'TLN_M_GENERAL_APP' },
'IS_EXECUTE_CONFIRM': { section: 'app-application', labelJa: '確定ボタン確認ダイアログ', table: 'TLN_M_GENERAL_APP' },
'EXE_DISP_INIT_FLG': { section: 'app-application', labelJa: '確定後再表示オプション', table: 'TLN_M_GENERAL_APP' },
'EXE_TARGET_ONLY_FLG_NO_SEARCH': { section: 'app-application', labelJa: '確定後再表示オプション', table: 'TLN_M_GENERAL_APP' },
'EXE_DISP_TARGET_ONLY_FLG': { section: 'app-application', labelJa: '確定後再表示オプション', table: 'TLN_M_GENERAL_APP' },
'IS_EXE_AUTH': { section: 'app-application', labelJa: '確定時認証', table: 'TLN_M_GENERAL_APP' },
'SEND_MAIL': { section: 'app-application', labelJa: '確定後のメール送信', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SEND_MAIL_': { section: 'app-application', labelJa: '確定後のメール送信', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JAVA_SCRIPT_ENGINE': { section: 'app-application', labelJa: 'DB検索JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PL_SQL_NAME_SEARCH': { section: 'app-application', labelJa: 'DB検索プロシージャ名', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME_SEARCH_AFTER': { section: 'app-application', labelJa: 'DB検索プロシージャ名', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME': { section: 'app-application', labelJa: 'プロシージャ名', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME_AFTER': { section: 'app-application', labelJa: 'プロシージャ名', table: 'TLN_M_GENERAL_APP' },
'ACCESS_DB': { section: 'app-application', labelJa: 'DB接続先', table: 'TLN_M_GENERAL_APP' },
'JAVA_SCRIPT': { section: 'app-application', labelJa: 'Client-side JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSS': { section: 'app-application', labelJa: 'CSS', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JOIN': { section: 'app-application', labelJa: '結合項目', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_DSP_POS': { section: 'app-application', labelJa: 'ボタン位置移動', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_REPORT': { section: 'app-report', labelJa: 'EXCEL', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'ALL_OPT': { section: 'app-report', labelJa: 'EXCEL', table: 'BUTTON_REPORT' },
'BUTTON_NEXT': { section: 'app-othernext', labelJa: '機能画面設定', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_AJAX': { section: 'app-ajax', labelJa: 'ボタン名', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_AJAX_CLIENT_JAVASCRIPT': { section: 'app-ajax', labelJa: '再表示ブロック', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_AJAX_': { section: 'app-ajax', labelJa: 'DB検索前JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CR_FLG_SEARCH': { section: 'block-item', labelJa: '検索改行', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'REQUIRED_SEARCH': { section: 'block-item', labelJa: '検索必須', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'IS_DB_NOT_REGIST': { section: 'block-item', labelJa: 'DB更新無し', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TABLE_LAYOUT': { section: 'block-item', labelJa: 'ROW SPAN', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TABLE_TITLE_LAYOUT': { section: 'block-item', labelJa: 'タイトルROW SPAN', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SEARCH_METHOD': { section: 'block-item', labelJa: '検索方式', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'DISP_POS': { section: 'block-item', labelJa: '表示位置', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TAB_INDEX_SEARCH': { section: 'block-item', labelJa: 'Tab index(検索)', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TAB_INDEX': { section: 'block-item', labelJa: 'Tab index', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CAMMA_OFF': { section: 'block-item', labelJa: 'カンマ編集無し', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'ZERO_SPLIT': { section: 'block-item', labelJa: '小数点ゼロ埋め', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'ALL_SELECT_CHECK': { section: 'block-item', labelJa: 'コンポーネント', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TATE_CHECK': { section: 'block-item', labelJa: 'コンポーネント', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OPTION_LIST_FUNC_ID': { section: 'block-item', labelJa: 'オプションリスト機能ID', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OPTION_LIST_SEARCH': { section: 'block-item', labelJa: 'オプションリスト機能ID', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CLASS_CODE': { section: 'block-item', labelJa: '階層コード/レベル', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'NEST': { section: 'block-item', labelJa: '階層コード/レベル', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'INPUT_CONDITION': { section: 'block-item', labelJa: '入力許可パターン', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'MATCH_PATTERN': { section: 'block-item', labelJa: '入力チェックパターン', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SEARCH_FUNC_ID': { section: 'block-item', labelJa: '検索子画面', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUB_SEARCH': { section: 'block-item', labelJa: '検索子画面', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUB_BTN_HDN': { section: 'block-item', labelJa: '子画面非表示', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'MASTER_CHECK': { section: 'block-item', labelJa: 'マスタチェック', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'LOOK_UP_FUNC_ID': { section: 'block-item', labelJa: 'LOOKUP', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'LOOK_UP': { section: 'block-item', labelJa: 'LOOKUP', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FOCUS_OUT_JAVASCRIPT': { section: 'block-item', labelJa: 'FOCUS OUT', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FLAT_TEXT': { section: 'block-item', labelJa: '値保持', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUGGEST_FUNC_ID': { section: 'block-item', labelJa: 'SUGGEST', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUGGEST': { section: 'block-item', labelJa: 'SUGGEST', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PRINTING_UPDATE': { section: 'block-item', labelJa: '印刷時更新項目', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FORE_COLOR': { section: 'block-item', labelJa: '文字色', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BACK_COLOR': { section: 'block-item', labelJa: '背景色', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'INIT_VALUE_TEXT': { section: 'block-item', labelJa: '検索条件初期値', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'INIT_VALUE': { section: 'block-item', labelJa: '検索条件初期値', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'REGIST_VALUE': { section: 'block-item', labelJa: 'DB設定式', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FIX_FORMULA': { section: 'block-item', labelJa: '固定条件式', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SAIBAN_SIKIBETU_CODE': { section: 'block-item', labelJa: '採番名', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SERIAL_NUMBER_VAL': { section: 'block-item', labelJa: 'シリアル番号加算値', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JAVASCRIPT': { section: 'block-item', labelJa: 'JavaScript呼出ボタン', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JAVASCRIPT_ENGINE': { section: 'block-item', labelJa: 'JavaScript呼出ボタン', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BARCODE_FORMAT': { section: 'block-item', labelJa: 'EXCEL帳票', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'THUMBNAIL_SIZE': { section: 'block-item', labelJa: 'サムネイル・バーコードサイズ', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'IMG_UPLOAD_SIZE': { section: 'block-item', labelJa: 'アップロードファイルサイズ', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'DRILL_DOWN': { section: 'block-item', labelJa: 'ドリルダウンレベル項目', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'HDN_LIST_SORT': { section: 'block-item', labelJa: '明細ソート無し', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TITLE_NOTE': { section: 'block-item', labelJa: 'タイトルツールチップ', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'MAX_LINE_COUNT': { section: 'block-detail', labelJa: '画面最大行数', table: 'TLN_M_GENERAL_APP' },
'MAX_LINE_COUNT_EXCEL': { section: 'block-detail', labelJa: '標準Excel出力最大行数', table: 'TLN_M_GENERAL_APP' },
'MAX_LINE_CNT_EXCEL_UPDATE': { section: 'block-detail', labelJa: '更新Excel出力最大行数', table: 'TLN_M_GENERAL_APP' },
'ADD_LINE_VAL_INIT': { section: 'block-detail', labelJa: '追加行の初期値', table: 'TLN_M_GENERAL_APP' },
'STD_EXCEL_EXT': { section: 'block-detail', labelJa: '標準Excel拡張子', table: 'TLN_M_GENERAL_APP' },
'LIST_PAGE_ROWS': { section: 'block-detail', labelJa: '初期ページ内行数', table: 'TLN_M_GENERAL_APP' },
'LIST_PAGE_DROPDOWN': { section: 'block-detail', labelJa: '改頁行数選択リスト', table: 'TLN_M_GENERAL_APP' },
'SPACE_HEIGHT': { section: 'block-detail', labelJa: '表示高さ', table: 'TLN_M_GENERAL_APP' },
'IS_VERTICAL_LAYOUT': { section: 'block-detail', labelJa: '行見出しレイアウト', table: 'TLN_M_GENERAL_APP' },
'HDN_PAGER_FLG': { section: 'block-detail', labelJa: '改ページしない', table: 'TLN_M_GENERAL_APP' },
'BLOCK_NAME_HDN_FLG': { section: 'block-detail', labelJa: 'ブロック名フィールドを非表示', table: 'TLN_M_GENERAL_APP' },
'IS_SEARCH_NOTFOUND_MSG_HDN': { section: 'block-detail', labelJa: '検索結果0件メッセージを非表示', table: 'TLN_M_GENERAL_APP' },
'IS_CLOSE_SWITCH': { section: 'block-detail', labelJa: '開閉表示状態', table: 'TLN_M_GENERAL_APP' },
'IS_LIST_ROW_SELECT': { section: 'block-detail', labelJa: '明細行の編集方式', table: 'TLN_M_GENERAL_APP' },
'IS_LIST_FIXED': { section: 'block-detail', labelJa: '明細列の固定', table: 'TLN_M_GENERAL_APP' },
'EXCELUPDATE_BUTTON_HDN_FLG': { section: 'block-detail', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'VIEW_BUTTON_HDN_FLG': { section: 'block-detail', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'COL_BUTTON_HDN_FLG': { section: 'block-detail', labelJa: 'ボタンの非表示', table: 'TLN_M_GENERAL_APP' },
'EXCELUPDATE_BTN_DISABLED_FLG': { section: 'block-detail', labelJa: '検索前ボタンの非活性', table: 'TLN_M_GENERAL_APP' },
'INSERT_FLG': { section: 'block-detail', labelJa: '処理権限', table: 'TLN_M_GENERAL_APP' },
'UPDATE_FLG': { section: 'block-detail', labelJa: '処理権限', table: 'TLN_M_GENERAL_APP' },
'DELETE_FLG': { section: 'block-detail', labelJa: '処理権限', table: 'TLN_M_GENERAL_APP' },
'EXCLUSIVE_CONTROL_FLG': { section: 'block-detail', labelJa: '確定時オプション', table: 'TLN_M_GENERAL_APP' },
'ALL_REG_FLG': { section: 'block-detail', labelJa: '確定時オプション', table: 'TLN_M_GENERAL_APP' },
'IS_USE_SEARCH_RESULT_REPORT': { section: 'block-detail', labelJa: '確定時オプション', table: 'TLN_M_GENERAL_APP' },
'IS_USE_SEARCH_RESULT_MAIL': { section: 'block-detail', labelJa: '確定時オプション', table: 'TLN_M_GENERAL_APP' },
'PLSQL_PARAM_COL': { section: 'block-detail', labelJa: 'プロシージャ名', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'LISTSELECT_BTN_CND': { section: 'block-detail', labelJa: '参照ボタン', table: 'TLN_M_GENERAL_APP' },
'LISTSEL_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '参照ボタン', table: 'TLN_M_GENERAL_APP' },
'COPY_DL_BTN_CND': { section: 'block-detail', labelJa: '複写ボタン', table: 'TLN_M_GENERAL_APP' },
'COPY_DL_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '複写ボタン', table: 'TLN_M_GENERAL_APP' },
'ADDLINE_DL_BTN_CND': { section: 'block-detail', labelJa: '行追加ボタン', table: 'TLN_M_GENERAL_APP' },
'ADDLINE_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '行追加ボタン', table: 'TLN_M_GENERAL_APP' },
'DELETE_BTN_CND': { section: 'block-detail', labelJa: '削除ボタン', table: 'TLN_M_GENERAL_APP' },
'DELETE_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '削除ボタン', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_CODE_': { section: 'block-detail', labelJa: '行文字色', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_KBN_': { section: 'block-detail', labelJa: '行文字色', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_CND_': { section: 'block-detail', labelJa: '行文字色', table: 'TLN_M_GENERAL_APP' },
'BACK_COLOR_TR_CODE_': { section: 'block-detail', labelJa: '行背景色', table: 'TLN_M_GENERAL_APP' },
'BACK_COLOR_TR_KBN_': { section: 'block-detail', labelJa: '行背景色', table: 'TLN_M_GENERAL_APP' },
'BACK_COLOR_TR_CND_': { section: 'block-detail', labelJa: '行背景色', table: 'TLN_M_GENERAL_APP' },
'SAVE_BTN_CND': { section: 'block-detail', labelJa: '保存ボタン', table: 'TLN_M_GENERAL_APP' },
'SAVE_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '保存ボタン', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_TITLE_COL': { section: 'block-detail', labelJa: 'タスクコード', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_GRID_TOP': { section: 'block-detail', labelJa: '時間グリッドのスクロールTOP', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_FROM_DATE_COL': { section: 'block-detail', labelJa: '開始日時', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_TO_DATE_COL': { section: 'block-detail', labelJa: '終了日時', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_START_WEEK': { section: 'block-detail', labelJa: '開始曜日', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_INIT_SCALE': { section: 'block-detail', labelJa: '描画期間初期値', table: 'TLN_M_GENERAL_APP' },
'IS_SCALE_HIDDEN_MONTH': { section: 'block-detail', labelJa: '描画期間スケールボタン表示', table: 'TLN_M_GENERAL_APP' },
'IS_SCALE_HIDDEN_WEEK': { section: 'block-detail', labelJa: '描画期間スケールボタン表示', table: 'TLN_M_GENERAL_APP' },
'IS_SCALE_HIDDEN_DAY': { section: 'block-detail', labelJa: '描画期間スケールボタン表示', table: 'TLN_M_GENERAL_APP' },
'IS_ALL_DAY_CHECK_ON': { section: 'block-detail', labelJa: 'All Day チェックボックス状態', table: 'TLN_M_GENERAL_APP' },
'CALENDAR_SIKIBETU_CODE': { section: 'block-detail', labelJa: 'カレンダー識別コード', table: 'TLN_M_GENERAL_APP' },
'IS_BAR_UPDATE_CONFIRM': { section: 'block-detail', labelJa: 'イベントバーの変更時確認', table: 'TLN_M_GENERAL_APP' },
'IS_SCHEDULE_UIWAIT_LOCK': { section: 'block-detail', labelJa: '処理中ロック', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_TITLE_DISP_COL': { section: 'block-detail', labelJa: 'タスク表示名', table: 'TLN_M_GENERAL_APP' },
'IS_TASK_GROUING_DISP': { section: 'block-detail', labelJa: 'タスク名の全種表示', table: 'TLN_M_GENERAL_APP' },
'TASK_AREA_WIDTH': { section: 'block-detail', labelJa: 'タスク領域幅', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_EVENT_TEXT_COL': { section: 'block-detail', labelJa: 'イベント内容項目', table: 'TLN_M_GENERAL_APP' },
'IS_FIT_EVENT_BAR_MAX_WIDTH': { section: 'block-detail', labelJa: 'イベント内容項目', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_EVENT_TOOLTIP_COL': { section: 'block-detail', labelJa: 'ツールチップ項目', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_UNIQUE_COL': { section: 'block-detail', labelJa: '関係線KEY項目', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_CONNECT_FROM_COL': { section: 'block-detail', labelJa: '関係線FROM', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_CONNECT_TO_COL': { section: 'block-detail', labelJa: '関係線TO', table: 'TLN_M_GENERAL_APP' },
'LABEL_DSP_CNT': { section: 'block-detail', labelJa: '日時ラベル最大表示数', table: 'TLN_M_GENERAL_APP' },
'IS_GRID_SNAP_OFF': { section: 'block-detail', labelJa: 'イベントバーのグリッドスナップ', table: 'TLN_M_GENERAL_APP' },
'IS_ST_ED_TOOLTIP_HIDDEN': { section: 'block-detail', labelJa: '開始-終了日時ツールチップ', table: 'TLN_M_GENERAL_APP' },
'IS_BAR_MOUSE_ALLOW_RESIZING': { section: 'block-detail', labelJa: 'イベントバーのマウス操作', table: 'TLN_M_GENERAL_APP' },
'IS_BAR_MOUSE_ALLOW_MOVING': { section: 'block-detail', labelJa: 'イベントバーのマウス操作', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_HOUR_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_HOUR_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_HOUR_FROM_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_HOUR_LIMIT_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_DAY_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_DAY_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_WEEK_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_WEEK_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_MONTH_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_MONTH_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_QUARTERLY_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_QTR_YEAR_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_HALF_YEAR_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_HALF_YEAR_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_YEAR_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_ONE_YEAR_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_YEARS_BTN': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_YEARS_GRID_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'GANTT_YEARS_INIT_VAL': { section: 'block-detail', labelJa: '描画期間の制御エリア', table: 'TLN_M_GENERAL_APP' },
'BUTTON_BAT': { section: 'block-proc', labelJa: 'JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_BAT_CLIENT_JAVASCRIPT': { section: 'block-proc', labelJa: 'JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_BAT_': { section: 'block-proc', labelJa: 'プロシージャ', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_NEXT_': { section: 'block-othernext', labelJa: '設定(機能ID指定あり)', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON': { section: 'block-fileio', labelJa: 'ファイル出力', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON_OPTION': { section: 'block-fileio', labelJa: 'ファイル出力', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON_FILE': { section: 'block-fileio', labelJa: 'ファイル出力', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON_COL': { section: 'block-fileio', labelJa: 'ファイル出力', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON': { section: 'block-fileio', labelJa: 'DB登録', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON_OPTION': { section: 'block-fileio', labelJa: 'DB登録', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON_FILE': { section: 'block-fileio', labelJa: 'DB登録', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON_COL': { section: 'block-fileio', labelJa: 'DB登録', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OTHER_FUNC': { section: 'block-otherfunc', labelJa: '式', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OTHER_FUNC_': { section: 'block-otherfunc', labelJa: '項目設定', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'UPDATE_TABLE': { section: 'block-other', labelJa: 'SELECT式', table: 'TLN_M_GENERAL_APP' },
'OTHER_BLOCK_FUNC': { section: 'block-other', labelJa: '他ブロック', table: 'TLN_M_GENERAL_APP' },
'CHART_MARK': { section: 'block-chart-series', labelJa: 'マーカー', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FUNC_TOP_AREA': { section: 'free-layout', labelJa: '機能実行画面デザイン', table: 'TLN_M_GENERAL_POSITION' },
'FUNC_BUTTON_AREA_HEAD': { section: 'free-layout', labelJa: '機能実行画面デザイン', table: 'TLN_M_GENERAL_POSITION' },
'CONDITION_AREA': { section: 'free-layout', labelJa: '機能実行画面デザイン', table: 'TLN_M_GENERAL_POSITION' },
'FUNC_BUTTON_AREA_TOP': { section: 'free-layout', labelJa: '機能実行画面デザイン', table: 'TLN_M_GENERAL_POSITION' },
'RESULT_AREA': { section: 'free-layout', labelJa: '機能実行画面デザイン', table: 'TLN_M_GENERAL_POSITION' },
'FUNC_BUTTON_AREA_BTM': { section: 'free-layout', labelJa: '機能実行画面デザイン', table: 'TLN_M_GENERAL_POSITION' },
'BLOCK': { section: 'free-layout', labelJa: 'ブロックデザイン(明細)', table: 'TLN_M_GENERAL_POSITION' },
'CONDITION': { section: 'free-layout', labelJa: 'ブロックデザイン(検索条件)', table: 'TLN_M_GENERAL_POSITION' },
// === DB スキャンで未対応だった追加分 (TLN_M_GENERAL_APP) ===
'EXECUTE_BTN_DISP_NAME': { section: 'app-application', labelJa: '確定ボタン表示名', table: 'TLN_M_GENERAL_APP' },
'HELP_LINK_NM': { section: 'app-application', labelJa: 'ヘルプリンク表示名', table: 'TLN_M_GENERAL_APP' },
'HELP_URL': { section: 'app-application', labelJa: 'ヘルプURL', table: 'TLN_M_GENERAL_APP' },
'PLOT_BTN_CND': { section: 'app-application', labelJa: 'プロットボタン表示条件式', table: 'TLN_M_GENERAL_APP' },
// === DB スキャンで未対応だった追加分 (TLN_M_GENERAL_ITEM_OPTN) ===
// ※ BUTTON_AJAX_<N>, BUTTON_BAT_<N>, BUTTON_NEXT_<N>, OTHER_FUNC_<N>, SEND_MAIL_<N> 系は
// _<digits> サフィックスのフォールバック解決でカバーされる (TFC.funcKbnInfo 参照)
'BUTTON_AJAX_CLIANT_JAVASCRIPT': { section: 'app-ajax', labelJa: '非同期通信ボタン Client-side JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_LIST_OPT': { section: 'block-otherfunc', labelJa: 'LIST明細選択ボタンオプション', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PLOT': { section: 'block-detail', labelJa: 'グラフ プロット設定', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PLOT_COL': { section: 'block-detail', labelJa: 'グラフ プロット項目設定', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PLOT_COL_MARKER_STYLE': { section: 'block-detail', labelJa: 'グラフ プロット項目 マーカースタイル', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PLOT_COL_PIE_OPTION': { section: 'block-detail', labelJa: 'グラフ プロット項目 円グラフオプション', table: 'TLN_M_GENERAL_ITEM_OPTN' },
// === DB設定マスタ.csv (talon-docs) との突合で判明した追加分 ===
// 機能タブ アプリケーション (FUNC_SEQ=-1)
'SEARCH_FLG': { section: 'app-application', labelJa: '検索ボタン表示', table: 'TLN_M_GENERAL_APP' },
'CLEAR_FLG': { section: 'app-application', labelJa: 'クリアボタン表示', table: 'TLN_M_GENERAL_APP' },
'EXCEL_OUT_FLG': { section: 'app-application', labelJa: 'Excel出力ボタン表示', table: 'TLN_M_GENERAL_APP' },
'PDF_OUT_FLG': { section: 'app-application', labelJa: 'PDF出力ボタン表示', table: 'TLN_M_GENERAL_APP' },
// ブロック設定 詳細 (FUNC_SEQ != -1) — _<N> サフィックス連番系の基底キーとして登録
'BACK_COLOR_TR_CODE': { section: 'block-detail', labelJa: '行背景色 動的キー', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_CODE': { section: 'block-detail', labelJa: '行文字色 動的キー', table: 'TLN_M_GENERAL_APP' },
'GANTT_REF_UPDATE_TABLE': { section: 'block-detail', labelJa: 'GANTT 参照更新テーブル', table: 'TLN_M_GENERAL_APP' },
// ブロック 検索呼出 (DLプロシージャ)
'PL_SQL_NAME_DL': { section: 'block-proc', labelJa: '検索前プロシージャ (引出)', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME_AFTER_DL': { section: 'block-proc', labelJa: '検索後プロシージャ (引出)', table: 'TLN_M_GENERAL_APP' },
// 項目情報 (TLN_M_GENERAL_ITEM_OPTN)
'ZERO_INT': { section: 'block-item', labelJa: 'ゼロ値ハイフン表示', table: 'TLN_M_GENERAL_ITEM_OPTN' },
};
// FUNC_KBN は同種設定が複数登録されると `_<N>` 連番サフィックスが付くことがある
// 例: BUTTON_NEXT, BUTTON_NEXT_0, BUTTON_NEXT_1, ... (同じ FUNC_KBN 系列を別レコードとして保持)
// この場合、辞書に基底キーがあればフォールバックで該当エントリを返す
function _resolveBaseKbn(funcKbn) {
if (!funcKbn) return null;
if (FUNC_KBN_DICT[funcKbn]) return FUNC_KBN_DICT[funcKbn];
// _<digits> 末尾を削って再検索
var m = funcKbn.match(/^(.+?)_(\d+)$/);
if (m && FUNC_KBN_DICT[m[1]]) return FUNC_KBN_DICT[m[1]];
return null;
}
TFC.funcKbnInfo = function (funcKbn) {
return _resolveBaseKbn(funcKbn);
};
TFC.isKnownFuncKbn = function (funcKbn) {
return _resolveBaseKbn(funcKbn) != null;
};
// ============================================================
// HTML テンプレート部品
// ============================================================
TFC.htmlHead = function (titleText, lang) {
var l = lang || 'ja';
var t = TFC.escapeHtml(titleText);
return '<!DOCTYPE html>\n' +
'<html lang="' + l + '">\n' +
'<head>\n' +
'<meta charset="UTF-8">\n' +
'<meta name="viewport" content="width=device-width,initial-scale=1.0">\n' +
'<title>' + t + '</title>\n' +
'<style>' + TFC.CSS + '</style>\n' +
'</head>\n<body>\n';
};
TFC.htmlTail = function () {
return '\n<script>' + TFC.JS_TAIL + '</script>\n</body>\n</html>\n';
};
TFC.tabBadge = function (isOn, count, lang) {
if (isOn) {
var on = (lang === 'en') ? '● set (' + count + ')' : '● 設定あり (' + count + '件)';
return '<span class="tab-status tab-status-on">' + on + '</span>';
}
var off = (lang === 'en') ? '○ none' : '○ 設定なし';
return '<span class="tab-status tab-status-off">' + off + '</span>';
};
TFC.htmlSection = function (titleHtml, bodyHtml, classes) {
var c = classes ? ' ' + classes : '';
return '<details class="screen-section' + c + '">\n' +
'<summary>' + titleHtml + '</summary>\n' +
'<div class="section-body">\n' + (bodyHtml || '') + '\n</div>\n' +
'</details>\n';
};
// 仕様書 §6.1: DOMContentLoaded で全 details を強制 close
TFC.JS_TAIL =
"document.addEventListener('DOMContentLoaded',function(){" +
"document.querySelectorAll('details').forEach(function(d){d.open=false;});" +
"});" +
"function tfcAll(open){document.querySelectorAll('details').forEach(function(d){d.open=open;});}" +
"function tfcCardOnly(){document.querySelectorAll('details.func-card,details.shared-card').forEach(function(d){d.open=true;});" +
"document.querySelectorAll('details.func-card details, details.shared-card details').forEach(function(d){d.open=false;});}" +
"function tfcOnOnly(){document.querySelectorAll('details').forEach(function(d){d.open=true;});" +
"document.querySelectorAll('details.tab-off').forEach(function(d){d.open=false;});}";
// 仕様書 §8 の色パレットを採用
TFC.CSS = "body{font-family:'Segoe UI',Meiryo,sans-serif;background:#f1f5f9;color:#1e293b;margin:0;padding:0 12px 32px;line-height:1.55}" +
"h1{font-size:1.5em;margin:18px 0 8px}" +
".meta{font-size:.9em;color:#475569;margin-bottom:6px}" +
".legend{font-size:.85em;color:#475569;margin:6px 0}" +
".controls{position:sticky;top:0;background:#fff;padding:8px;border-bottom:1px solid #cbd5e1;z-index:10;margin-bottom:12px}" +
".controls button{margin-right:6px;padding:4px 10px;font-size:.9em;cursor:pointer;border:1px solid #94a3b8;background:#f8fafc;border-radius:3px}" +
".controls button:hover{background:#e2e8f0}" +
"details.func-card{border:2px solid #cbd5e1;border-radius:6px;background:#fff;margin:14px 0;padding:6px 10px}" +
"details.func-card[open]{border-color:#7dd3fc}" +
"details.func-card>summary{font-weight:bold;font-size:1.1em;cursor:pointer;padding:4px 0}" +
"details.shared-card{border:2px solid #f59e0b;border-radius:6px;background:#fef3c7;margin:14px 0;padding:6px 10px}" +
"details.block-card{border:1px solid #7dd3fc;border-radius:4px;margin:8px 0;padding:4px 8px;background:#f0f9ff}" +
"details.screen-section{border:1px solid #e2e8f0;border-radius:3px;margin:6px 0;padding:4px 8px;background:#f8fafc}" +
"details.screen-section.tab-on{border-color:#86efac;background:#f0fdf4}" +
"details.screen-section.tab-off{border-color:#e2e8f0;background:#f8fafc;opacity:.85}" +
"details>summary{cursor:pointer;outline:none}" +
".tab-status{font-size:.85em;margin-left:8px}" +
".tab-status-on{color:#15803d}" +
".tab-status-off{color:#94a3b8}" +
".section-body{padding:6px 0 6px 12px}" +
"table.kv{border-collapse:collapse;margin:4px 0;width:auto}" +
"table.kv th,table.kv td{border:1px solid #cbd5e1;padding:3px 8px;font-size:.92em;text-align:left;vertical-align:top}" +
"table.kv th{background:#f1f5f9;color:#475569;white-space:nowrap;min-width:160px}" +
"table.kv td.val{background:#fff}" +
"table.kv-compact{table-layout:auto;width:auto}" +
"table.kv-compact th{min-width:0;padding:2px 6px;white-space:nowrap;font-size:.85em}" +
"table.kv-compact td{padding:2px 6px;font-size:.88em;white-space:nowrap;max-width:280px;overflow:hidden;text-overflow:ellipsis}" +
"table.kv-compact td:hover{overflow:visible;white-space:normal;background:#fef3c7}" +
"code,pre{font-family:Consolas,'Courier New',monospace}" +
"pre.sql-code,pre.js-code{background:#0f172a;color:#a5f3fc;padding:8px 10px;border-radius:4px;overflow:auto;font-size:.85em;margin:4px 0}" +
".kbn{display:inline-block;background:#fef3c7;color:#b45309;padding:1px 6px;border-radius:3px;font-size:.82em;font-family:Consolas,monospace}" +
".unclassified{border:2px dashed #f87171;background:#fef2f2;padding:8px 12px;border-radius:4px;margin:10px 0}" +
".unclassified summary{color:#b91c1c;font-weight:bold}";
// ============================================================
// ZIP 出力 (Java util.zip)
// ============================================================
// entries: [{name: 'a.html', content: 'string'}, {name: 'b.md', content: 'string'}]
// 戻り値: byte[] (Java)
TFC.zip = function (entries) {
var baos = new ByteArrayOutputStream();
var zos = new ZipOutputStream(baos, Charset.forName('UTF-8'));
try {
for (var i = 0; i < entries.length; i++) {
var e = entries[i];
zos.putNextEntry(new ZipEntry(e.name));
var bytes = new JString(e.content).getBytes(Charset.forName('UTF-8'));
zos.write(bytes, 0, bytes.length);
zos.closeEntry();
}
} finally {
zos.close();
}
return baos.toByteArray();
};
// ============================================================
// Markdown テンプレート部品
// ============================================================
TFC.mdHeader = function (title) {
return '# ' + (title || '') + '\n\n';
};
TFC.mdSection = function (level, heading, body) {
var hashes = '';
for (var i = 0; i < (level || 2); i++) hashes += '#';
return hashes + ' ' + (heading || '') + '\n\n' + (body || '') + '\n';
};
TFC.mdKvTable = function (rows) {
// rows: [[key, val], ...]
if (!rows || rows.length === 0) return '';
var s = '| 項目 | 値 |\n|------|----|\n';
for (var i = 0; i < rows.length; i++) {
var k = TFC.escapeMd(rows[i][0]);
var v = TFC.escapeMd(rows[i][1] != null ? String(rows[i][1]) : '');
s += '| ' + k + ' | ' + v + ' |\n';
}
return s + '\n';
};
TFC.mdCodeBlock = function (lang, code) {
return '```' + (lang || '') + '\n' + (code || '') + '\n```\n\n';
};
// ============================================================
// ユーティリティ
// ============================================================
TFC.s = function (v) { return v == null ? '' : String(v); };
TFC.isEmpty = function (v) { return v == null || String(v).length === 0; };
TFC.coalesce = function () {
for (var i = 0; i < arguments.length; i++) {
if (!TFC.isEmpty(arguments[i])) return arguments[i];
}
return '';
};
// export
global.TFC = TFC;
return TFC;
})(this);
≣ サーバJS ライブラリTLN_AI_DEV_DEMO_DATE_UTIL TLN_AI_DEV_DEMO_DATE_UTIL 3906字
/**
* TLN_AI_DEV_DEMO_DATE_UTIL
*
* TALON画面の入力値をSQL実行用の日付型へ変換する共通関数です。
* JavaScriptエンジン APIマニュアル 11.2 JavaScript日付変換ユーティリティ の内容に沿っています。
*/
/**
* ロケールごとの日付フォーマット定義です。
*/
var DATE_PATTERN_BY_LOCALE = {
'en_us': 'MM/dd/yyyy',
'en-us': 'MM/dd/yyyy',
'en_gb': 'dd/MM/yyyy',
'en-gb': 'dd/MM/yyyy'
};
/**
* 標準の日付フォーマットです。
*/
var DEFAULT_DATE_PATTERN = 'yyyy/MM/dd';
/**
* 画面入力値を java.sql.Date に変換します。
*
* ・java.util.Date の場合:そのまま java.sql.Date 化
* ・文字列の場合:ユーザーロケールに応じた形式で parse
*
* 対応例:
* ・ja / ja_JP:yyyy/MM/dd
* ・en_US :MM/dd/yyyy
* ・en_GB :dd/MM/yyyy
*
* @param {*} value 画面入力値
* @returns {java.sql.Date|null} SQL日付
* @throws {java.text.ParseException} 文字列 value がユーザーロケールの日付形式に一致しない場合、または不正な日付の場合
*/
function toSqlDate(value) {
if (value == null || value === '') {
return null;
}
var SqlDate = Java.type('java.sql.Date');
if (value.getTime) {
return new SqlDate(value.getTime());
}
var utilDate = parseDate(
value,
getDatePatternByLocale()
);
return new SqlDate(utilDate.getTime());
}
/**
* 画面入力値を java.sql.Timestamp に変換します。
*
* ・java.util.Date の場合:そのまま Timestamp 化
* ・文字列の場合:ロケールに応じた形式で parse
*
* 対応例:
* ・ja / ja_JP:yyyy/MM/dd HH:mm:ss
* ・en_US :MM/dd/yyyy HH:mm:ss
* ・en_GB :dd/MM/yyyy HH:mm:ss
*
* @param {*} value 画面入力値
* @returns {java.sql.Timestamp|null} SQL日時
* @throws {java.text.ParseException} 文字列 value がユーザーロケールの日時形式に一致しない場合、または不正な日時の場合
*/
function toSqlDateTime(value) {
if (value == null || value === '') {
return null;
}
var Timestamp = Java.type('java.sql.Timestamp');
if (value.getTime) {
return new Timestamp(value.getTime());
}
var pattern =
getDatePatternByLocale()
+ ' HH:mm:ss';
var utilDate = parseDate(value, pattern);
return new Timestamp(utilDate.getTime());
}
/**
* 値を java.util.Date に変換します。
*
* 対応型:
* ・String
* ・java.sql.Timestamp
* ・oracle.sql.TIMESTAMP
*
* @param {*} value
* @returns {*}
* @throws {java.text.ParseException} 文字型の value が判定された日付/日時形式に一致しない場合、または不正な日付の場合
*/
function toUtilDate(value) {
if (value == null || value === '') {
return value;
}
var type = Object.prototype.toString
.call(value)
.slice(8, -1)
.toUpperCase();
switch (type) {
case 'STRING':
return parseDate(
value,
getDatePatternByValue(value)
);
case 'JAVA.SQL.TIMESTAMP':
return new java.util.Date(
value.getTime()
);
case 'ORACLE.SQL.TIMESTAMP':
return new java.util.Date(
value.timestampValue().getTime()
);
default:
return value;
}
}
/**
* 文字列を指定フォーマットで
* java.util.Date に変換します。
*
* @param {*} value 画面入力値
* @param {string} pattern 日付フォーマット
* @returns {java.util.Date}
* @throws {java.text.ParseException} value が pattern に一致しない場合、または不正な日付の場合
*/
function parseDate(value, pattern) {
var SimpleDateFormat = Java.type(
'java.text.SimpleDateFormat'
);
var sdf = new SimpleDateFormat(pattern);
sdf.setLenient(false);
return sdf.parse(String(value));
}
/**
* 入力値に応じた
* 日付フォーマットを返します。
*
* @param {string} value
* @returns {string} 日付フォーマット
*/
function getDatePatternByValue(value) {
var pattern = getDatePatternByLocale();
if (String(value).indexOf(' ') >= 0) {
pattern += ' HH:mm:ss';
}
return pattern;
}
/**
* ログインユーザーの locale に応じた
* 日付フォーマットを返します。
*
* @returns {string} 日付フォーマット
*/
function getDatePatternByLocale() {
var userData = TALON.getUserInfoMap();
var locale = userData['LOCALE'];
if (!locale) {
return DEFAULT_DATE_PATTERN;
}
locale = String(locale).toLowerCase();
return DATE_PATTERN_BY_LOCALE[locale]
|| DEFAULT_DATE_PATTERN;
}
≣ サーバJS ライブラリTLN_AI_DEV_DEMO_INPUT_UTIL TLN_AI_DEV_DEMO_INPUT_UTIL 1137字
/**
* TLN_AI_DEV_DEMO_INPUT_UTIL
*
* 画面入力値の空判定・数値変換・チェックボックス値の配列変換を行うための共通関数です。
* JavaScriptエンジン APIマニュアル 11.3 入力値操作ユーティリティ の内容に沿っています。
*/
/**
* チェックボックス値の区切り文字です。
*
* TALON標準のチェックボックス区切り値(システム設定情報 CHECKBOX_SEP)に合わせて設定します。
*/
var CHECKBOX_VALUE_SEPARATOR = ';';
/**
* 空入力か判定します。
*
* @param {*} value 入力値
* @returns {boolean} 判定結果
*/
function isEmptyValue(value) {
return value === null
|| value === undefined
|| value === '';
}
/**
* 画面入力値を数値へ変換します。
* カンマ区切りが含まれる場合は、除去したうえで数値化します。
* ※ 数値変換できない場合は null 扱い(例: "abc", "12a")
*
* @param {*} value 画面入力値
* @returns {number|null} 数値。空入力の場合は null
*/
function toNumber(value) {
if (isEmptyValue(value)) {
return null;
}
var num = Number(
String(value).replace(/,/g, '')
);
if (isNaN(num)) {
return null;
}
return num;
}
/**
* チェックボックス値を配列へ変換します。
*
* @param {*} value チェックボックス値(区切り文字つきの文字列)
* @returns {Array<string>} チェック済み値配列
*/
function toCheckboxArray(value) {
if (isEmptyValue(value)) {
return [];
}
return String(value)
.split(CHECKBOX_VALUE_SEPARATOR);
}
≣ サーバJS ライブラリTLN_AI_DEV_DEMO_SQL_SET TLN_AI_DEV_DEMO_SQL_SET 2272字
/**
* TLN_AI_DEV_DEMO_SQL_SET
*
* UPDATE文のSET句を安全に組み立てるための共通関数です。
* JavaScriptエンジン APIマニュアル 11.5 SQLビルダ:SET句の組み立て(更新処理/NULL/SQL式対応) の内容に沿っています。
*/
/**
* SET句のコンテナを生成します。
*
* @returns {SetBuilder}
*
* @typedef {Object} SetBuilder
* @property {Array<Object>} items SET項目一覧
*/
function createSetBuilder() {
return {
items: []
};
}
/**
* SET(col = ?)を追加します。
*
* ・value が存在する場合:プレースホルダ「?」を使用して値を設定
* ・value が null / undefined の場合:
* - forceNull = true -> NULLを設定
* - forceNull = false -> 追加しない
* ・空文字や 0 は有効値として扱います
*
* @param {SetBuilder} setBuilder
* @param {string} column カラム名
* @param {*} value 設定値(null / undefined の場合は追加しない)
* @param {boolean} [forceNull=false] trueの場合、NULLを強制設定
* @returns {void}
*/
function addSet(setBuilder, column, value, forceNull) {
if (value === null || value === undefined) {
if (forceNull === true) {
setBuilder.items.push({
clause: column + ' = NULL',
values: []
});
}
return;
}
setBuilder.items.push({
clause: column + ' = ?',
values: [value]
});
}
/**
* 任意の式でSETを追加します(例:col = sysdate)
*
* @param {SetBuilder} setBuilder
* @param {*} condition 条件
* @param {string} expression SQL式
* @returns {void}
*/
function addSetRaw(setBuilder, condition, expression) {
if (!condition) {
return;
}
setBuilder.items.push({
clause: expression,
values: []
});
}
/**
* SET句を生成し、paramsに値を追加します。
*
* @param {SetBuilder} setBuilder
* @param {Array<*>} params バインドパラメータ
* @returns {string} SET句
* @throws {java.lang.IllegalArgumentException} UPDATE項目が指定されていない場合
*/
function buildSetSql(setBuilder, params) {
if (!setBuilder.items || setBuilder.items.length === 0) {
var IllegalArgumentException = Java.type('java.lang.IllegalArgumentException');
throw new IllegalArgumentException('No UPDATE items specified');
}
var parts = [];
for (var i = 0; i < setBuilder.items.length; i++) {
var item = setBuilder.items[i];
parts.push(item.clause);
for (var j = 0; j < item.values.length; j++) {
params.push(item.values[j]);
}
}
return ' SET ' + parts.join(', ');
}
≣ サーバJS ライブラリTLN_AI_DEV_DEMO_SQL_VALUES TLN_AI_DEV_DEMO_SQL_VALUES 2842字
/**
* TLN_AI_DEV_DEMO_SQL_VALUES
*
* INSERT文のカラム一覧とVALUES句を安全に組み立てるための共通関数です。
* JavaScriptエンジン APIマニュアル 11.6 SQLビルダ:VALUES句の組み立て(VALUES/NULL/SQL式対応) の内容に沿っています。
*/
/**
* INSERT文の組み立て用オブジェクトを作成します。
*
* @returns {InsertBuilder}
*
* @typedef {Object} InsertBuilder
* @property {Array<Object>} items INSERT項目一覧
*/
function createInsertBuilder() {
return {
items: []
};
}
/**
* INSERT項目を追加します。
*
* ・value が存在する場合:プレースホルダ「?」を使用して値を設定
* ・value が null / undefined の場合:
* - forceNull = true -> NULLを設定
* - forceNull = false -> 追加しない(カラムを除外)
* ・空文字や 0 は有効値として扱います
*
* @param {InsertBuilder} insertBuilder INSERTビルダ
* @param {string} column カラム名
* @param {*} value 登録値
* @param {boolean} [forceNull=false] trueの場合、NULLを強制設定
* @returns {void}
*/
function addInsertValue(insertBuilder, column, value, forceNull) {
if (value === null || value === undefined) {
if (forceNull === true) {
insertBuilder.items.push({
column: column,
placeholder: 'NULL',
values: []
});
}
return;
}
insertBuilder.items.push({
column: column,
placeholder: '?',
values: [value]
});
}
/**
* SQL式をINSERTします。
*
* 例:
* ・CURRENT_TIMESTAMP
* ・SYSDATE
* ・CURRENT_DATE
*
* @param {InsertBuilder} insertBuilder INSERTビルダ
* @param {*} condition 条件がtrueの場合に追加
* @param {string} column カラム名
* @param {string} expression SQL式
* @returns {void}
*/
function addInsertRaw(insertBuilder, condition, column, expression) {
if (!condition) {
return;
}
insertBuilder.items.push({
column: column,
placeholder: expression,
values: []
});
}
/**
* INSERT文を生成し、paramsに値を追加します。
*
* @param {string} tableName テーブル名
* @param {InsertBuilder} insertBuilder INSERTビルダ
* @param {Array<*>} params バインドパラメータ格納配列
* @returns {string} INSERT文
* @throws {java.lang.IllegalArgumentException} INSERT項目が指定されていない場合
*/
function buildInsertSql(tableName, insertBuilder, params) {
if (!insertBuilder.items || insertBuilder.items.length === 0) {
var IllegalArgumentException = Java.type('java.lang.IllegalArgumentException');
throw new IllegalArgumentException('No INSERT items specified');
}
var columns = [];
var placeholders = [];
for (var i = 0; i < insertBuilder.items.length; i++) {
var item = insertBuilder.items[i];
columns.push(item.column);
placeholders.push(item.placeholder);
for (var j = 0; j < item.values.length; j++) {
params.push(item.values[j]);
}
}
return ''
+ 'INSERT INTO ' + tableName + ' (\n'
+ ' ' + columns.join(',\n ') + '\n'
+ ') VALUES (\n'
+ ' ' + placeholders.join(',\n ') + '\n'
+ ')';
}
≣ サーバJS ライブラリTLN_AI_DEV_DEMO_SQL_WHERE TLN_AI_DEV_DEMO_SQL_WHERE 7362字
/**
* TLN_AI_DEV_DEMO_SQL_WHERE
*
* WHERE句を安全に組み立てるための共通関数です。
* JavaScriptエンジン APIマニュアル 11.4 SQLビルダ:WHERE条件の組み立て(AND / OR / LIKE / IN など) の内容に沿っています。
*
* 依存:
* - TLN_AI_DEV_DEMO_INPUT_UTIL(CHECKBOX_VALUE_SEPARATOR を参照)
* CHECKBOX_VALUE_SEPARATOR を参照するため、本JSを利用する機能は
* INPUT_UTIL も合わせて参照してください。
*/
/**
* WHERE句のグループ(論理ブロック)を生成します。
*
* @param {string} [operator='AND'] グループ内の論理演算子('AND' または 'OR')
* @returns {WhereGroup} WHEREグループオブジェクト
*
* @typedef {Object} WhereGroup
* @property {'group'} type ノード種別
* @property {string} operator 子要素を結合する論理演算子
* @property {Array<WhereNode>} children 子ノード一覧
*/
function createWhereGroup(operator) {
return {
type: 'group',
operator: operator || 'AND',
children: []
};
}
/**
* 通常の比較条件(=など)を追加します。
*
* @param {WhereGroup} group 追加先のWHEREグループ
* @param {string} clause SQL条件句(例: 'col = ?')
* @param {*} value バインド値(null / undefined の場合は追加しない)
* @returns {void}
*/
function addCondition(group, clause, value) {
if (value === null || value === undefined) {
return;
}
group.children.push({
type: 'condition',
clause: clause,
values: [value]
});
}
/**
* 通常の比較条件(=など)を追加します。
* condition が true の場合のみ条件を追加します。
*
* @param {WhereGroup} group 追加先のWHEREグループ
* @param {boolean} condition 条件追加判定(false の場合は追加しない)
* @param {string} clause SQL条件句(例: 'col = ?')
* @param {*} value バインド値
* @returns {void}
*/
function addConditionIf(group, condition, clause, value) {
if (condition !== true) {
return;
}
addCondition(group, clause, value);
}
/**
* LIKE条件を追加します。
*
* @param {WhereGroup} group WHEREグループ
* @param {*} value 検索値(null / undefined / 空文字は無視)
* @param {string} column カラム名
* @param {'contains'|'prefix'|'suffix'|'exact'} [matchType='contains'] 一致方式
* @returns {void}
*/
function addLikeCondition(group, value, column, matchType) {
if (value === null || value === undefined || value === '') {
return;
}
var likeValue;
switch (matchType || 'contains') {
case 'prefix':
likeValue = value + '%';
break;
case 'suffix':
likeValue = '%' + value;
break;
case 'exact':
likeValue = value;
break;
case 'contains':
default:
likeValue = '%' + value + '%';
break;
}
group.children.push({
type: 'condition',
clause: column + ' LIKE ?',
values: [likeValue]
});
}
/**
* IN条件を追加します。
*
* @param {WhereGroup} group WHEREグループ
* @param {Array<*>} values 検索値配列(空配列の場合は追加しない)
* @param {string} column カラム名
* @returns {void}
*/
function addInCondition(group, values, column) {
if (!values || values.length === 0) {
return;
}
var placeholders = [];
for (var i = 0; i < values.length; i++) {
placeholders.push('?');
}
group.children.push({
type: 'condition',
clause: column + ' IN (' + placeholders.join(', ') + ')',
values: values
});
}
/**
* BETWEEN条件を追加します。
*
* @param {WhereGroup} group WHEREグループ
* @param {*} from 開始値
* @param {*} to 終了値
* @param {string} column カラム名
* @returns {void}
*/
function addBetweenCondition(group, from, to, column) {
if (from === null || from === undefined ||
to === null || to === undefined) {
return;
}
group.children.push({
type: 'condition',
clause: column + ' BETWEEN ? AND ?',
values: [from, to]
});
}
/**
* IS NULL 条件を追加します。
*
* @param {WhereGroup} group WHEREグループ
* @param {*} condition 条件追加判定(true の場合に追加)
* @param {string} column カラム名
* @returns {void}
*/
function addIsNullCondition(group, condition, column) {
if (!condition) {
return;
}
group.children.push({
type: 'condition',
clause: column + ' IS NULL',
values: []
});
}
/**
* IS NOT NULL 条件を追加します。
*
* @param {WhereGroup} group WHEREグループ
* @param {*} condition 条件追加判定(true の場合に追加)
* @param {string} column カラム名
* @returns {void}
*/
function addIsNotNullCondition(group, condition, column) {
if (!condition) {
return;
}
group.children.push({
type: 'condition',
clause: column + ' IS NOT NULL',
values: []
});
}
/**
* チェックボックス値検索用のLIKEパターンを生成します。
*
* @param {*} value チェックボックス値
* @returns {string} LIKE検索用パターン
*/
function toCheckboxLikePattern(value) {
return '%'
+ CHECKBOX_VALUE_SEPARATOR
+ String(value)
+ CHECKBOX_VALUE_SEPARATOR
+ '%';
}
/**
* DBカラムの区切り文字で保持されたチェックボックス値に対して、
* 「いずれかを含む」検索条件(OR条件)を追加します。
*
* @param {WhereGroup} group WHEREグループ
* @param {Array<*>} values 検索値配列
* @param {string} column カラム名
* @returns {void}
*/
function addCheckboxCondition(group, values, column) {
if (!values || values.length === 0) {
return;
}
var orGroup = addGroup(group, 'OR');
for (var i = 0; i < values.length; i++) {
addCondition(
orGroup,
"CONCAT('"
+ CHECKBOX_VALUE_SEPARATOR
+ "', CONCAT("
+ column
+ ", '"
+ CHECKBOX_VALUE_SEPARATOR
+ "')) LIKE ? escape '$'",
toCheckboxLikePattern(values[i])
);
}
}
/**
* DBカラムの区切り文字で保持されたチェックボックス値に対して、
* 「すべて含まない」検索条件(AND条件)を追加します。
*
* @param {WhereGroup} group WHEREグループ
* @param {Array<*>} values 検索値配列
* @param {string} column カラム名
* @returns {void}
*/
function addNotCheckboxCondition(group, values, column) {
if (!values || values.length === 0) {
return;
}
var andGroup = addGroup(group, 'AND');
for (var i = 0; i < values.length; i++) {
addCondition(
andGroup,
"CONCAT('"
+ CHECKBOX_VALUE_SEPARATOR
+ "', CONCAT("
+ column
+ ", '"
+ CHECKBOX_VALUE_SEPARATOR
+ "')) NOT LIKE ? escape '$'",
toCheckboxLikePattern(values[i])
);
}
}
/**
* 子グループ(括弧)を追加します。
*
* @param {WhereGroup} parentGroup 親グループ
* @param {string} [operator='AND'] 子グループ内の論理演算子
* @returns {WhereGroup} 生成された子グループ
*/
function addGroup(parentGroup, operator) {
var group = createWhereGroup(operator);
parentGroup.children.push(group);
return group;
}
/**
* WHERE句のSQL文字列を生成し、params配列にバインド値を追加します。
*
* ・再帰的にグループを展開
* ・condition はそのままSQLに追加
* ・group は括弧で囲む
* ・values は params に順序通り追加
*
* @param {WhereGroup} group WHEREグループ
* @param {Array<*>} params バインドパラメータ格納配列(副作用で追加される)
* @returns {string} WHERE句(条件部分のみ)
*/
function buildWhereSql(group, params) {
if (!group.children || group.children.length === 0) {
return '';
}
var parts = [];
for (var i = 0; i < group.children.length; i++) {
var child = group.children[i];
if (child.type === 'condition') {
parts.push(child.clause);
for (var j = 0; j < child.values.length; j++) {
params.push(child.values[j]);
}
} else if (child.type === 'group') {
var groupSql = buildWhereSql(child, params);
if (groupSql) {
parts.push('(' + groupSql + ')');
}
}
}
return parts.join(' ' + group.operator + ' ');
}
≣ サーバJS ライブラリTLN_ANALYZE_COMMON 共通JavaScript_リポジトリ分析共通部品 42080字
/**
* TLN_ANALYZE_COMMON : 共通JavaScript_リポジトリ分析共通部品
*
* 最終更新: TALON_ANALYZE_V2_0_1
* @version 2024/03/25
*/
//----------------------------------------------
function tln_com_datetime2string(obj) {
return (obj.getYear()+1900) + "-" + tln_com_zpad2(obj.getMonth()+1) + "-" + tln_com_zpad2(obj.getDate()) + " " + tln_com_zpad2(obj.getHours()) + ":" + tln_com_zpad2(obj.getMinutes()) + ":" + tln_com_zpad2(obj.getSeconds());
}
function tln_com_zpad2(str) {
return ( '0' + str ).slice( -2 );
}
function tln_com_nowdate() {
var sysDate = new java.util.Date();
return sysDate;
}
function tln_com_escape(val) {
var toStr = Object.prototype.toString;
var tType = toStr.call( val ).slice(8, -1).toUpperCase();
if (tType == 'STRING' ) {
return val.replace( /'/g , "''" );
} else {
return val;
}
}
function tln_com_func_id() {
var lineDataMap = TALON.getUserInfoMap();
var _FUNC_ID = getMapVal( lineDataMap , 'FUNC_ID' );
return _FUNC_ID;
}
function tln_com_user_id() {
var lineDataMap = TALON.getUserInfoMap();
var _USER_ID = getMapVal( lineDataMap , 'USER_ID' );
return _USER_ID;
}
//-------------------------------------------
function tln_insertByMap(tbl, lst ,name) {
if ( chkLowercase() ) {
TalonDbUtil.insertByMap( TALON.getDbConfig(), tbl.toLowerCase(), lst , name );
} else {
TalonDbUtil.insertByMap( TALON.getDbConfig(), tbl , lst , name );
}
}
function tln_updateByMap(tbl, lst ,name ,where) {
if ( chkLowercase() ) {
TalonDbUtil.updateByMap( TALON.getDbConfig(), tbl.toLowerCase(), lst , name , where);
} else {
TalonDbUtil.updateByMap( TALON.getDbConfig(), tbl , lst , name , where);
}
}
function tln_deleteByMap(tbl, lst ,name) {
if ( chkLowercase() ) {
TalonDbUtil.deleteByMap( TALON.getDbConfig(), tbl.toLowerCase(), lst , name );
} else {
TalonDbUtil.deleteByMap( TALON.getDbConfig(), tbl , lst , name );
}
}
//-------------------------------------------
function getMapVal(map , id) {
var _rec = null;
_rec = map[id];
if (_rec == null) {
_rec = map[id.toLowerCase()];
}
return _rec;
}
function setMapVal(map , id , val) {
if ( TALON.getDbConfig().isPostgres() ) {
map[ id.toLowerCase() ] = val;
} else {
map[ id ] = val;
}
}
function getBindVal(key) {
var _rec = null;
if ( TALON.getDbConfig().isPostgres() ) {
_rec = TALON.getBindValue( key.toLowerCase() );
} else {
_rec = TALON.getBindValue( key );
}
return _rec;
}
function removeBindVal(key) {
if ( TALON.getDbConfig().isPostgres() ) {
TALON.removeBindValue( key.toLowerCase() );
} else {
TALON.removeBindValue( key );
}
}
function putBindVal(key , val) {
if ( TALON.getDbConfig().isPostgres() ) {
TALON.putBindValue( key.toLowerCase() , val );
} else {
TALON.putBindValue( key , val );
}
}
function chkLowercase() {
if ( TALON.getDbConfig().isPostgres() ) {
return true;
} else if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE BINARY TABLE_NAME = BINARY 'TLN_ANALYZE_INFO' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal( lineDataMap , 'CNT' );
if (_CNT == 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
function editLowList(obj) {
if ( TALON.getDbConfig().isPostgres() ) {
for(var lop = 0; lop < obj.length; lop++) {
obj[lop] = obj[lop].toLowerCase();
}
}
return obj;
}
// * function tln_getSysdate() {
// * var sql = "SELECT TLN_SYSDATE() AS NOWDATE FROM TLN_M_HANYO_CODE_MAIN " +
// * "WHERE SIKIBETU_CODE LIKE 'TLN_ANALYZE_ONE' ";
// * var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
// * var lineDataMap = itemSelectList[0];
// * var _NOWDATE = getMapVal( lineDataMap , 'NOWDATE' );
// * return _NOWDATE;
// * }
function tln_get_sysdate_created_date() {
var obj = tln_com_nowdate();
// * if ( TALON.getDbConfig().isPostgres() ) {
// * return (obj.getYear()+1900) + "-" + tln_com_zpad2(obj.getMonth()+1) + "-" + tln_com_zpad2(obj.getDate()) + "T" + tln_com_zpad2(obj.getHours()) + ":" + tln_com_zpad2(obj.getMinutes()) + ":" + tln_com_zpad2(obj.getSeconds());
// * } else {
// * return (obj.getYear()+1900) + "-" + tln_com_zpad2(obj.getMonth()+1) + "-" + tln_com_zpad2(obj.getDate()) + " " + tln_com_zpad2(obj.getHours()) + ":" + tln_com_zpad2(obj.getMinutes()) + ":" + tln_com_zpad2(obj.getSeconds());
// * }
// * return (obj.getYear()+1900) + "/" + tln_com_zpad2(obj.getMonth()+1) + "/" + tln_com_zpad2(obj.getDate()) + " " + tln_com_zpad2(obj.getHours()) + ":" + tln_com_zpad2(obj.getMinutes()) + ":" + tln_com_zpad2(obj.getSeconds());
return new java.util.Date();
}
//----------------------------------------------
var itemColNameTbl_TLN_ANALYZE_INFO = [
'FUNC_ID'
, 'FUNC_SEQ'
, 'FUNC_KBN'
, 'COL_NAME'
, 'OPT_SORT'
, 'EVENT_TYPE'
, 'DATA_TYPE'
, 'MOCK_SEQ'
, 'SEQ'
, 'CHR_TEXT1'
, 'CHR_TEXT2'
, 'CREATED_DATE'
, 'CREATED_BY'
, 'CREATED_PRG_NM'
, 'UPDATED_DATE'
, 'UPDATED_BY'
, 'UPDATED_PRG_NM'
];
itemColNameTbl_TLN_ANALYZE_INFO = editLowList(itemColNameTbl_TLN_ANALYZE_INFO);
//----------------------------------------------
var tableName_TLN_ANALYZE_INFO = 'TLN_ANALYZE_INFO';
if ( chkLowercase() ) {
tableName_TLN_ANALYZE_INFO = tableName_TLN_ANALYZE_INFO.toLowerCase()
}
//----------------------------------------------
var tableName_TLN_ANALYZE_INFO_LOG = 'TLN_ANALYZE_INFO_LOG';
if ( chkLowercase() ) {
tableName_TLN_ANALYZE_INFO_LOG = tableName_TLN_ANALYZE_INFO_LOG.toLowerCase()
}
//----------------------------------------------
function _tln_create_analyze_info( itemDataList ) {
TalonDbUtil.insertByMap( TALON.getDbConfig() , tableName_TLN_ANALYZE_INFO, itemDataList , itemColNameTbl_TLN_ANALYZE_INFO );
}
function _tln_update_analyze_info( itemDataList , whereList ) {
var iCount = TalonDbUtil.updateByMap( TALON.getDbConfig() , tableName_TLN_ANALYZE_INFO, itemDataList, itemColNameTbl_TLN_ANALYZE_INFO, whereList );
}
function _tln_delete_analyze_info( itemDataList , whereList) {
var iCount = TalonDbUtil.deleteByMap( TALON.getDbConfig(), tableName_TLN_ANALYZE_INFO, itemDataList, whereList );
}
//----------------------------------------------
function _tln_create_analyze_info_autocommit( itemDataList ) {
TalonDbUtil.insertByMap( TALON.getSubDBConn() , tableName_TLN_ANALYZE_INFO_LOG, itemDataList , itemColNameTbl_TLN_ANALYZE_INFO );
TalonDbUtil.commit( TALON.getSubDBConn() );
}
function _tln_update_analyze_info_autocommit( itemDataList , whereList ) {
var iCount = TalonDbUtil.updateByMap( TALON.getSubDBConn() , tableName_TLN_ANALYZE_INFO_LOG, itemDataList, itemColNameTbl_TLN_ANALYZE_INFO, whereList );
TalonDbUtil.commit( TALON.getSubDBConn() );
}
function _tln_delete_analyze_info_autocommit( itemDataList , whereList) {
var iCount = TalonDbUtil.deleteByMap( TALON.getSubDBConn(), tableName_TLN_ANALYZE_INFO_LOG, itemDataList, whereList );
TalonDbUtil.commit( TALON.getSubDBConn() );
}
//----------------------------------------------
var _tln_analyze_mock_no = 0;
function _tln_analyze_set_mock_no(val) {
_tln_analyze_mock_no = val;
}
//----------------------------------------------
var _g_FUNC_ID = '';
var _g_FUNC_SEQ = '';
var _g_FUNC_KBN = '';
var _g_COL_NAME = '';
var _g_OPT_SORT = '';
var _tln_analyze_log = '';
function _tln_analyze_exec_mode() {
var _FUNC_ID = tln_com_func_id();
if ( _FUNC_ID == 'TLN_ANALYZE_TEST01' || _FUNC_ID == 'TLN_ANALYZE_TEST02' || _FUNC_ID == 'TLN_ANALYZE_TEST15' ) {
return 'DEBUG';
} else {
return '';
}
}
function _tln_analyze_js_init(_FUNC_ID, _FUNC_SEQ, _COL_NAME, _FUNC_KBN, _OPT_SORT) {
var _my_USER_ID = tln_com_user_id();
var _my_FUNC_ID = tln_com_func_id();
var _SYSDATE = tln_get_sysdate_created_date(); //tln_com_datetime2string( tln_com_nowdate() );
_g_FUNC_ID = _FUNC_ID;
_g_FUNC_SEQ = _FUNC_SEQ;
_g_FUNC_KBN = _FUNC_KBN;
_g_COL_NAME = _COL_NAME;
_g_OPT_SORT = _OPT_SORT;
//変数の初期化
_tln_analyze_log = '';
//EXECUTE用のコネクションを作成(autocommit)
TALON.createSubDBConfig();
var itemDataList_EXECUTE = new Array();
setMapVal( itemDataList_EXECUTE , 'FUNC_ID' , _g_FUNC_ID );
setMapVal( itemDataList_EXECUTE , 'FUNC_SEQ' , _g_FUNC_SEQ );
setMapVal( itemDataList_EXECUTE , 'FUNC_KBN' , _g_FUNC_KBN );
setMapVal( itemDataList_EXECUTE , 'COL_NAME' , _g_COL_NAME );
setMapVal( itemDataList_EXECUTE , 'OPT_SORT' , _g_OPT_SORT );
setMapVal( itemDataList_EXECUTE , 'EVENT_TYPE' , 'EXECUTE' );
setMapVal( itemDataList_EXECUTE , 'DATA_TYPE' , 'ENGINE' );
setMapVal( itemDataList_EXECUTE , 'SEQ' , 0 );
var whereList_EXECUTE = new Array();
if ( TALON.getDbConfig().isPostgres() ) {
whereList_EXECUTE.push( [ null, '=' , 'func_id' ] );
whereList_EXECUTE.push( [ null, '=' , 'func_seq' ] );
whereList_EXECUTE.push( [ null, '=' , 'func_kbn' ] );
whereList_EXECUTE.push( [ null, '=' , 'col_name' ] );
whereList_EXECUTE.push( [ null, '=' , 'opt_sort' ] );
whereList_EXECUTE.push( [ null, '=' , 'event_type' ] );
whereList_EXECUTE.push( [ null, '=' , 'data_type' ] );
whereList_EXECUTE.push( [ null, '=' , 'mock_seq' ] );
whereList_EXECUTE.push( [ null, '=' , 'seq' ] );
} else {
whereList_EXECUTE.push( [ null, '=' , 'FUNC_ID' ] );
whereList_EXECUTE.push( [ null, '=' , 'FUNC_SEQ' ] );
whereList_EXECUTE.push( [ null, '=' , 'FUNC_KBN' ] );
whereList_EXECUTE.push( [ null, '=' , 'COL_NAME' ] );
whereList_EXECUTE.push( [ null, '=' , 'OPT_SORT' ] );
whereList_EXECUTE.push( [ null, '=' , 'EVENT_TYPE' ] );
whereList_EXECUTE.push( [ null, '=' , 'DATA_TYPE' ] );
whereList_EXECUTE.push( [ null, '=' , 'MOCK_SEQ' ] );
whereList_EXECUTE.push( [ null, '=' , 'SEQ' ] );
}
//モック番号が0以外の場合、既に登録されているモック番号0のデータ(モックが作られていなかった時のログ)は削除する
setMapVal( itemDataList_EXECUTE, 'MOCK_SEQ' , 0 );
_tln_delete_analyze_info_autocommit( itemDataList_EXECUTE , whereList_EXECUTE );
//EXECUTEデータの削除
setMapVal( itemDataList_EXECUTE, 'MOCK_SEQ' , _tln_analyze_mock_no );
_tln_delete_analyze_info_autocommit( itemDataList_EXECUTE , whereList_EXECUTE );
setMapVal( itemDataList_EXECUTE , 'CHR_TEXT1' , '※ERROR※' ); //初期時にERRORとして更新し、正常終了時にクリアを行う
setMapVal( itemDataList_EXECUTE , 'CREATED_DATE' , _SYSDATE );
setMapVal( itemDataList_EXECUTE , 'CREATED_BY' , _my_USER_ID );
setMapVal( itemDataList_EXECUTE , 'CREATED_PRG_NM' , _my_FUNC_ID );
setMapVal( itemDataList_EXECUTE , 'UPDATED_DATE' , _SYSDATE );
setMapVal( itemDataList_EXECUTE , 'UPDATED_BY' , _my_USER_ID );
setMapVal( itemDataList_EXECUTE , 'UPDATED_PRG_NM' , _my_FUNC_ID );
//EXECUTEデータの作成
_tln_create_analyze_info_autocommit(itemDataList_EXECUTE);
var itemDataList = new Array();
setMapVal( itemDataList , 'FUNC_ID' , _g_FUNC_ID );
setMapVal( itemDataList , 'FUNC_SEQ' , _g_FUNC_SEQ );
setMapVal( itemDataList , 'FUNC_KBN' , _g_FUNC_KBN );
setMapVal( itemDataList , 'COL_NAME' , _g_COL_NAME );
setMapVal( itemDataList , 'OPT_SORT' , _g_OPT_SORT );
setMapVal( itemDataList , 'DATA_TYPE' , 'ENGINE' );
setMapVal( itemDataList , 'MOCK_SEQ' , _tln_analyze_mock_no );
var whereList = new Array();
if ( TALON.getDbConfig().isPostgres() ) {
whereList.push( [ null, '=' , 'func_id' ] );
whereList.push( [ null, '=' , 'func_seq' ] );
whereList.push( [ null, '=' , 'func_kbn' ] );
whereList.push( [ null, '=' , 'col_name' ] );
whereList.push( [ null, '=' , 'opt_sort' ] );
whereList.push( [ null, '=' , 'data_type' ] );
whereList.push( [ null, '=' , 'mock_seq' ] );
} else {
whereList.push( [ null, '=' , 'FUNC_ID' ] );
whereList.push( [ null, '=' , 'FUNC_SEQ' ] );
whereList.push( [ null, '=' , 'FUNC_KBN' ] );
whereList.push( [ null, '=' , 'COL_NAME' ] );
whereList.push( [ null, '=' , 'OPT_SORT' ] );
whereList.push( [ null, '=' , 'DATA_TYPE' ] );
whereList.push( [ null, '=' , 'MOCK_SEQ' ] );
}
//データの初期化
_tln_delete_analyze_info( itemDataList , whereList )
/*
var sql = "DELETE FROM TLN_ANALYZE_INFO " +
"WHERE FUNC_ID = '" + tln_com_escape(_g_FUNC_ID) + "' " +
" AND FUNC_SEQ = " + _g_FUNC_SEQ + " " +
" AND FUNC_KBN = '" + tln_com_escape(_g_FUNC_KBN) + "' " +
" AND COL_NAME = '" + tln_com_escape(_g_COL_NAME) + "' " +
" AND OPT_SORT = " + _g_OPT_SORT + " " +
" AND DATA_TYPE = '" + 'ENGINE' + "' " +
" AND MOCK_SEQ = " + _tln_analyze_mock_no + " " +
" AND EVENT_TYPE <> '" + 'EXECUTE' + "' " +
"";
var iCount = TalonDbUtil.delete( TALON.getDbConfig() , sql );
*/
}
function _tln_analyze_js_end() {
var _my_USER_ID = tln_com_user_id();
var _my_FUNC_ID = tln_com_func_id();
var _SYSDATE = tln_get_sysdate_created_date(); //tln_com_datetime2string( tln_com_nowdate() );
var itemDataList_EXECUTE = new Array();
setMapVal( itemDataList_EXECUTE , 'FUNC_ID' , _g_FUNC_ID );
setMapVal( itemDataList_EXECUTE , 'FUNC_SEQ' , _g_FUNC_SEQ );
setMapVal( itemDataList_EXECUTE , 'FUNC_KBN' , _g_FUNC_KBN );
setMapVal( itemDataList_EXECUTE , 'COL_NAME' , _g_COL_NAME );
setMapVal( itemDataList_EXECUTE , 'OPT_SORT' , _g_OPT_SORT );
setMapVal( itemDataList_EXECUTE , 'EVENT_TYPE' , 'EXECUTE' );
setMapVal( itemDataList_EXECUTE , 'DATA_TYPE' , 'ENGINE' );
setMapVal( itemDataList_EXECUTE , 'MOCK_SEQ' , _tln_analyze_mock_no );
setMapVal( itemDataList_EXECUTE , 'SEQ' , 0 );
setMapVal( itemDataList_EXECUTE , 'CHR_TEXT1' , '' );
var whereList_EXECUTE = new Array();
if ( TALON.getDbConfig().isPostgres() ) {
whereList_EXECUTE.push( [ null, '=' , 'func_id' ] );
whereList_EXECUTE.push( [ null, '=' , 'func_seq' ] );
whereList_EXECUTE.push( [ null, '=' , 'func_kbn' ] );
whereList_EXECUTE.push( [ null, '=' , 'col_name' ] );
whereList_EXECUTE.push( [ null, '=' , 'opt_sort' ] );
whereList_EXECUTE.push( [ null, '=' , 'event_type' ] );
whereList_EXECUTE.push( [ null, '=' , 'data_type' ] );
whereList_EXECUTE.push( [ null, '=' , 'mock_seq' ] );
whereList_EXECUTE.push( [ null, '=' , 'seq' ] );
} else {
whereList_EXECUTE.push( [ null, '=' , 'FUNC_ID' ] );
whereList_EXECUTE.push( [ null, '=' , 'FUNC_SEQ' ] );
whereList_EXECUTE.push( [ null, '=' , 'FUNC_KBN' ] );
whereList_EXECUTE.push( [ null, '=' , 'COL_NAME' ] );
whereList_EXECUTE.push( [ null, '=' , 'OPT_SORT' ] );
whereList_EXECUTE.push( [ null, '=' , 'EVENT_TYPE' ] );
whereList_EXECUTE.push( [ null, '=' , 'DATA_TYPE' ] );
whereList_EXECUTE.push( [ null, '=' , 'MOCK_SEQ' ] );
whereList_EXECUTE.push( [ null, '=' , 'SEQ' ] );
}
//EXECUTEデータの初期化
_tln_update_analyze_info_autocommit( itemDataList_EXECUTE , whereList_EXECUTE )
}
function _tln_analyze_set_data(_DATA_TYPE , _NAME , _EVENT_TYPE) {
_tln_analyze_set_data_main(_DATA_TYPE , _NAME , '' , _EVENT_TYPE)
}
function _tln_analyze_set_data_item(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE) {
_tln_analyze_set_data_main(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE)
}
function _tln_analyze_set_data_main(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE) {
if (_NAME != '' ) {
//TABLE名を分割して登録する(_NAME)
var _NAME_ARRAY = _NAME.split(';');
for (var iTable = 0; iTable < _NAME_ARRAY.length; iTable++) {
_NAME = _NAME_ARRAY[iTable];
var _ITEM_ARRAY = _ITEM.split(';');
if (_ITEM_ARRAY.length > 0) {
for (var iItem = 0; iItem < _ITEM_ARRAY.length; iItem++) {
_ITEM = _ITEM_ARRAY[iItem];
_tln_analyze_set_data_exec(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE);
}
} else {
_tln_analyze_set_data_exec(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE);
}
}
} else {
var _ITEM_ARRAY = _ITEM.split(';');
if (_ITEM_ARRAY.length > 0) {
for (var iItem = 0; iItem < _ITEM_ARRAY.length; iItem++) {
_ITEM = _ITEM_ARRAY[iItem];
_tln_analyze_set_data_exec(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE);
}
} else {
//TABLE も ITEM も空の場合
//_tln_analyze_set_data_exec(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE);
}
}
}
function _tln_analyze_set_data_exec(_DATA_TYPE , _NAME , _ITEM , _EVENT_TYPE) {
var _my_USER_ID = tln_com_user_id();
var _my_FUNC_ID = tln_com_func_id();
var _SYSDATE = tln_get_sysdate_created_date(); //tln_com_datetime2string( tln_com_nowdate() );
//DB毎にCREATE文作成時に付与される囲い文字列を置換
var _NAME = _NAME.replace( /`/g , '' );
//同じテーブル名と項目名が有る場合は更新しない
var sql = "SELECT COUNT(*) AS CNT FROM TLN_ANALYZE_INFO " +
"WHERE FUNC_ID = '" + tln_com_escape(_g_FUNC_ID ) + "' " +
" AND FUNC_SEQ = " + tln_com_escape(_g_FUNC_SEQ) + " " +
" AND FUNC_KBN = '" + tln_com_escape(_g_FUNC_KBN) + "' " +
" AND COL_NAME = '" + tln_com_escape(_g_COL_NAME) + "' " +
" AND OPT_SORT = " + tln_com_escape(_g_OPT_SORT) + " " +
" AND EVENT_TYPE = '" + tln_com_escape(_EVENT_TYPE) + "' " +
" AND DATA_TYPE = '" + tln_com_escape(_DATA_TYPE ) + "' " +
" AND MOCK_SEQ = " + _tln_analyze_mock_no + " ";
if ( TALON.getDbConfig().isOra() ) {
if ( (_NAME == '') || (_NAME == null) ) {
sql = sql + " AND TLN_ANALYZE_CONV_CHAR( CHR_TEXT1 ) is null ";
} else {
sql = sql + " AND TLN_ANALYZE_CONV_CHAR( CHR_TEXT1 ) = '" + tln_com_escape(_NAME) + "' ";
}
if ( (_ITEM == '') || (_ITEM == null) ) {
sql = sql + " AND TLN_ANALYZE_CONV_CHAR( CHR_TEXT2 ) is null ";
} else {
sql = sql + " AND TLN_ANALYZE_CONV_CHAR( CHR_TEXT2 ) = '" + tln_com_escape(_ITEM) + "' ";
}
} else {
sql = sql + " AND CHR_TEXT1 = '" + tln_com_escape(_NAME) + "' ";
sql = sql + " AND CHR_TEXT2 = '" + tln_com_escape(_ITEM) + "' ";
}
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal( lineDataMap , 'CNT' );
if ( _CNT == 0 ) {
var _MODE = 'I';
} else {
//既に存在するので何もしない
var _MODE = 'X';
}
//-------------------
var sql = "SELECT CASE WHEN MAX(SEQ) IS NULL THEN 0 ELSE MAX(SEQ) END + 1 AS MAX_SEQ , COUNT(*) AS CNT FROM TLN_ANALYZE_INFO " +
"WHERE FUNC_ID = '" + tln_com_escape(_g_FUNC_ID ) + "' " +
" AND FUNC_SEQ = " + tln_com_escape(_g_FUNC_SEQ) + " " +
" AND COL_NAME = '" + tln_com_escape(_g_COL_NAME) + "' " +
" AND FUNC_KBN = '" + tln_com_escape(_g_FUNC_KBN) + "' " +
" AND OPT_SORT = " + tln_com_escape(_g_OPT_SORT) + " " +
" AND EVENT_TYPE = '" + tln_com_escape(_EVENT_TYPE) + "' " +
" AND DATA_TYPE = '" + tln_com_escape(_DATA_TYPE ) + "' " +
" AND MOCK_SEQ = '" + _tln_analyze_mock_no + "' ";
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
var lineDataMap = itemSelectList[0];
var _SEQ = getMapVal( lineDataMap , 'MAX_SEQ' );
//-------------------
var itemDataList = new Array();
setMapVal( itemDataList , 'FUNC_ID' , _g_FUNC_ID );
setMapVal( itemDataList , 'FUNC_SEQ' , _g_FUNC_SEQ );
setMapVal( itemDataList , 'FUNC_KBN' , _g_FUNC_KBN );
setMapVal( itemDataList , 'COL_NAME' , _g_COL_NAME );
setMapVal( itemDataList , 'OPT_SORT' , _g_OPT_SORT );
setMapVal( itemDataList , 'EVENT_TYPE' , _EVENT_TYPE );
setMapVal( itemDataList , 'DATA_TYPE' , _DATA_TYPE );
setMapVal( itemDataList , 'MOCK_SEQ' , _tln_analyze_mock_no );
setMapVal( itemDataList , 'SEQ' , _SEQ );
setMapVal( itemDataList , 'CHR_TEXT1' , _NAME );
setMapVal( itemDataList , 'CHR_TEXT2' , _ITEM );
setMapVal( itemDataList , 'UPDATED_DATE' , _SYSDATE );
setMapVal( itemDataList , 'UPDATED_BY' , _my_USER_ID );
setMapVal( itemDataList , 'UPDATED_PRG_NM' , _my_FUNC_ID );
if (_MODE == 'I' ) {
setMapVal( itemDataList , 'CREATED_DATE' , _SYSDATE );
setMapVal( itemDataList , 'CREATED_BY' , _my_USER_ID );
setMapVal( itemDataList , 'CREATED_PRG_NM' , _my_FUNC_ID );
_tln_create_analyze_info(itemDataList);
}
if (_MODE == 'U' ) {
var whereList = new Array();
if ( TALON.getDbConfig().isPostgres() ) {
whereList.push( [ null, '=' , 'func_id' ] );
whereList.push( [ null, '=' , 'func_seq' ] );
whereList.push( [ null, '=' , 'func_kbn' ] );
whereList.push( [ null, '=' , 'col_name' ] );
whereList.push( [ null, '=' , 'opt_sort' ] );
whereList.push( [ null, '=' , 'event_type' ] );
whereList.push( [ null, '=' , 'data_type' ] );
whereList.push( [ null, '=' , 'mock_seq' ] );
whereList.push( [ null, '=' , 'seq' ] );
} else {
whereList.push( [ null, '=' , 'FUNC_ID' ] );
whereList.push( [ null, '=' , 'FUNC_SEQ' ] );
whereList.push( [ null, '=' , 'FUNC_KBN' ] );
whereList.push( [ null, '=' , 'COL_NAME' ] );
whereList.push( [ null, '=' , 'OPT_SORT' ] );
whereList.push( [ null, '=' , 'EVENT_TYPE' ] );
whereList.push( [ null, '=' , 'DATA_TYPE' ] );
whereList.push( [ null, '=' , 'MOCK_SEQ' ] );
whereList.push( [ null, '=' , 'SEQ' ] );
}
_tln_update_analyze_info( itemDataList , whereList )
}
}
//----------------------------------------------
var _tln_analyze_mock = null;
function _tln_analyze_mock_data( mock ) {
eval( "_tln_analyze_mock = " + mock ) ;
}
//----------------------------------------------
function _tln_analyze_select_table_name(_SQL) {
if (_SQL.length > 0) {
var _CHECK = 0;
var _IDX = 0;
var _SQL_TABLE = new Array();
var _SQL_ARRAY = _SQL.replace( /\t/g , ' ' ).replace( /\r?\n/g , ' ' ).split(' ');
for (var iName = 0; iName < _SQL_ARRAY.length; iName++) {
if (_SQL_ARRAY[iName] != '' ) {
if (_CHECK == 1) {
if (_SQL_ARRAY[iName].substring(0, 1) != '(') {
_SQL_TABLE[_IDX] = _SQL_ARRAY[iName];
_IDX++
}
_CHECK = 0;
}
if (_SQL_ARRAY[iName].toUpperCase() == 'FROM' ) {
_CHECK = 1;
}
if (_SQL_ARRAY[iName].toUpperCase() == 'JOIN' ) {
_CHECK = 1;
}
}
}
return _SQL_TABLE.join(";");
} else {
return "";
}
}
function _tln_analyze_insert_table_name(_SQL) {
if (_SQL.length > 0) {
var _CHECK = 0;
var _IDX = 0;
var _SQL_TABLE = new Array();
var _SQL_ARRAY = _SQL.replace( /\t/g , ' ' ).replace( /\r?\n/g , ' ' ).split(' ');
for (var iName = 0; iName < _SQL_ARRAY.length; iName++) {
if (_SQL_ARRAY[iName] != '' ) {
if (_CHECK == 2) {
_SQL_TABLE[_IDX] = _SQL_ARRAY[iName];
_IDX++
_CHECK = 0;
}
if (_CHECK == 1 ) {
if (_SQL_ARRAY[iName].toUpperCase() == 'INTO' ) {
_CHECK = 2;
} else {
//INSERT の次が INTOでない場合はリセット
_CHECK = 0;
}
}
if (_SQL_ARRAY[iName].toUpperCase() == 'INSERT' ) {
_CHECK = 1;
}
}
}
return _SQL_TABLE.join(";");
} else {
return "";
}
}
function _tln_analyze_update_table_name(_SQL) {
if (_SQL.length > 0) {
var _CHECK = 0;
var _IDX = 0;
var _SQL_TABLE = new Array();
var _SQL_ARRAY = _SQL.replace( /\t/g , ' ' ).replace( /\r?\n/g , ' ' ).split(' ');
for (var iName = 0; iName < _SQL_ARRAY.length; iName++) {
if (_SQL_ARRAY[iName] != '' ) {
if (_CHECK == 1) {
_SQL_TABLE[_IDX] = _SQL_ARRAY[iName];
_IDX++
_CHECK = 0;
}
if (_SQL_ARRAY[iName].toUpperCase() == 'UPDATE' ) {
_CHECK = 1;
}
}
}
return _SQL_TABLE.join(";");
} else {
return "";
}
}
function _tln_analyze_delete_table_name(_SQL) {
if (_SQL.length > 0) {
var _CHECK = 0;
var _IDX = 0;
var _SQL_TABLE = new Array();
var _SQL_ARRAY = _SQL.replace( /\t/g , ' ' ).replace( /\r?\n/g , ' ' ).split(' ');
for (var iName = 0; iName < _SQL_ARRAY.length; iName++) {
if (_SQL_ARRAY[iName] != '' ) {
if (_CHECK == 1) {
_SQL_TABLE[_IDX] = _SQL_ARRAY[iName];
_IDX++
_CHECK = 0;
}
if (_SQL_ARRAY[iName].toUpperCase() == 'FROM' ) {
_CHECK = 1;
}
}
}
return _SQL_TABLE.join(";");
} else {
return "";
}
}
function _tln_analyze_dataMap_item_name(lineDataMap) {
var rec = '';
for (var k in lineDataMap) {
if (rec != '') {
rec = rec + ';';
}
rec = rec + k;
}
return rec;
}
//----------------------------------------------
//----------------------------------------------
function _tln_analyze_js_create_analyze_data( _FUNC_ID, _FUNC_SEQ, _COL_NAME, _FUNC_KBN, _OPT_SORT, _JS_COMMON , _JS_TEXT , _MOC_NO , _MOC_TEXT , _MOC_SCRIPT) {
putBindVal( 'TLN_ANALYZE_LOG' , '' );
putBindVal( 'TLN_ANALYZE_MOCK_N0', 0 );
if ( ( _MOC_TEXT != '' ) && ( _MOC_TEXT != null ) ) {
tln_write_log("【モックデータ】");
_tln_analyze_mock_data(_MOC_TEXT);
}
if ( ( _MOC_SCRIPT != '' ) && ( _MOC_SCRIPT != null ) ) {
tln_write_log("【モックスクリプト】");
var conv_MOC_SCRIPT = _tln_analyze_js_script_convert( _MOC_SCRIPT );
eval( conv_MOC_SCRIPT ) ;
}
//モック番号の確定(TLN_ANALYZE_INFOにはモック番号毎に分けてデータを格納する)
//チェックがついていない場合はモック番号は0でセット
_tln_analyze_set_mock_no(_MOC_NO);
putBindVal( 'TLN_ANALYZE_MOCK_N0', _tln_analyze_mock_no );
//関連データの初期化(モック番号確定後)
_tln_analyze_js_init(_FUNC_ID, _FUNC_SEQ, _COL_NAME, _FUNC_KBN, _OPT_SORT);
//共通ファンクション読込
var _JS_COMMON_TEXT = '';
//共通JavaScriptを全てで読み込んだときに共通JavaScriptが読みこまれない現象を修正
if (_JS_COMMON == '(全て)') {
if( TALON.getDbConfig().isOra() ) {
//OracleだとそのままSelectするとCLOB型項目を正常に取得できないのでTO_CHARで文字型として取得する
var sql = "" +
"SELECT KEY_CODE,TO_CHAR(NOTE) AS NOTE " +
"FROM TLN_M_HANYO_CODE_MAIN " +
"WHERE SIKIBETU_CODE = 'TLN_GENERAL_JAVASCRIPT_ENGINE' " +
"AND KEY_CODE != 'TLN_ANALYZE_COMMON'" + //TLN_ANALYZE_COMMONまで読みこむとeval実行時に循環参照でのStackOverflowにより正常に実行されなくなる
"ORDER BY DSP_SORT1, KEY_CODE" //念のためソート順をログと合わせておく
"";
} else {
var sql = "" +
"SELECT KEY_CODE,NOTE " +
"FROM TLN_M_HANYO_CODE_MAIN " +
"WHERE SIKIBETU_CODE = 'TLN_GENERAL_JAVASCRIPT_ENGINE' " +
"AND KEY_CODE != 'TLN_ANALYZE_COMMON'" + //TLN_ANALYZE_COMMONまで読みこむとeval実行時に循環参照でのStackOverflowにより正常に実行されなくなる
"ORDER BY DSP_SORT1, KEY_CODE" //念のためソート順をログと合わせておく
"";
}
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
for (iJSCommonAll = 0; iJSCommonAll < itemSelectList.length; iJSCommonAll++){
var lineDataMap = itemSelectList[iJSCommonAll];
//共通JavaScriptを複数設定したときに最後の共通JavaScriptしか読みこまれない現象を修正
_JS_COMMON_TEXT += "\n" + getMapVal( lineDataMap , 'NOTE' );
}
tln_write_log("【共通ファンクション読込All】" +getMapVal( lineDataMap , 'KEY_CODE' ));
} else {
var _JS_COMMONS = _JS_COMMON.split('\t');
for (var iJSCommon = 0; iJSCommon < _JS_COMMONS.length; iJSCommon++) {
//TLN_ANALYZE_COMMONまで読みこむとeval実行時に循環参照でのStackOverflowにより正常に実行されなくなる
if (_JS_COMMONS[iJSCommon] != '' && _JS_COMMONS[iJSCommon] != 'TLN_ANALYZE_COMMON') {
//OracleだとそのままSelectするとCLOB型項目を正常に取得できないのでTO_CHARで文字型として取得する
if(TALON.getDbConfig().isOra()) {
var sql = "" +
"SELECT TO_CHAR(NOTE) AS NOTE " +
"FROM TLN_M_HANYO_CODE_MAIN " +
"WHERE SIKIBETU_CODE = 'TLN_GENERAL_JAVASCRIPT_ENGINE' " +
" AND KEY_CODE = '" + tln_com_escape(_JS_COMMONS[iJSCommon]) + "' " +
"";
} else {
var sql = "" +
"SELECT NOTE " +
"FROM TLN_M_HANYO_CODE_MAIN " +
"WHERE SIKIBETU_CODE = 'TLN_GENERAL_JAVASCRIPT_ENGINE' " +
" AND KEY_CODE = '" + tln_com_escape(_JS_COMMONS[iJSCommon]) + "' " +
"";
}
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
if (itemSelectList.length > 0) {
var lineDataMap = itemSelectList[0];
//共通JavaScriptを複数設定したときに最後の共通JavaScriptしか読みこまれない現象を修正
_JS_COMMON_TEXT += "\n" + getMapVal( lineDataMap , 'NOTE' );
}
tln_write_log("【共通ファンクション読込】" + _JS_COMMONS[iJSCommon]);
}
}
}
if ( ( _JS_COMMON_TEXT != '' ) && ( _JS_COMMON_TEXT != null ) ) {
if ( ( _JS_COMMON_TEXT != '' ) && ( _JS_COMMON_TEXT != null ) ) {
tln_write_log("【共通ファンクション】");
var conv_JS_TEXT = _tln_analyze_js_script_convert( _JS_COMMON_TEXT );
eval( conv_JS_TEXT ) ;
}
}
//実行ファンクション読込
if ( ( _JS_TEXT != '' ) && ( _JS_TEXT != null ) ) {
var conv_JS_TEXT = _tln_analyze_js_script_convert( _JS_TEXT );
eval( conv_JS_TEXT ) ;
}
//実行結果ログを出力
putBindVal( 'TLN_ANALYZE_LOG' , _tln_analyze_log );
//EXECUTEのデータの状態を初期化する
_tln_analyze_js_end();
}
function _tln_analyze_js_script_convert(_script) {
var cov_list =[
{moto:'TALON.getConditionData' ,saki:'tln_getConditionData'} ,
{moto:'TALON.getBlockData_Card' ,saki:'tln_getBlockData_Card'} ,
{moto:'TALON.getBlockData_List' ,saki:'tln_getBlockData_List'} ,
{moto:'TALON.getTargetDataIndex' ,saki:'tln_getTargetDataIndex'} ,
{moto:'TALON.getTargetData' ,saki:'tln_getTargetData'} ,
{moto:'TalonDbUtil.select' ,saki:'tln_db_select'} ,
{moto:'TalonDbUtil.insertByMap' ,saki:'tln_db_insertByMap'} ,
{moto:'TalonDbUtil.insertByArray' ,saki:'tln_db_insertByArray'} ,
{moto:'TalonDbUtil.insert' ,saki:'tln_db_insert'} ,
{moto:'TalonDbUtil.updateByMap' ,saki:'tln_db_updateByMap'} ,
{moto:'TalonDbUtil.updateByArray' ,saki:'tln_db_updateByArray'} ,
{moto:'TalonDbUtil.update' ,saki:'tln_db_update'} ,
{moto:'TalonDbUtil.deleteByMap' ,saki:'tln_db_deleteByMap'} ,
{moto:'TalonDbUtil.deleteByArray' ,saki:'tln_db_deleteByArray'} ,
{moto:'TalonDbUtil.delete' ,saki:'tln_db_delete'} ,
]
var tmp_script = _script;
for (var iConvScript = 0; iConvScript < cov_list.length; iConvScript++) {
var cov = cov_list[iConvScript];
var tmp = "tmp_script = tmp_script.replace(/" + cov.moto + "/g, '" + cov.saki + "');";
eval(tmp);
}
TALON.getLogger().writeDebug('★↓↓↓↓変換後スクリプト↓↓↓↓★');
TALON.getLogger().writeDebug(tmp_script);
TALON.getLogger().writeDebug('★↑↑↑↑変換後スクリプト↑↑↑↑★');
return tmp_script;
}
//----------------------------------------------
//----------------------------------------------
//----------------------------------------------
//----------------------------------------------
function tln_getBlockData_Card(block) {
if (_tln_analyze_exec_mode() == '' ) {
var lineDataMap = TALON.getBlockData_Card(block);
} else {
if (_tln_analyze_mock) {
var lineDataMap = _tln_analyze_mock['blocks'][block-1]['blockdata'][0];
} else {
var lineDataMap = null;
}
}
return lineDataMap;
}
function tln_getBlockData_List(block) {
if (_tln_analyze_exec_mode() == '' ) {
var itemBlockList = TALON.getBlockData_List(block);
} else {
if (_tln_analyze_mock) {
var itemBlockList = _tln_analyze_mock['blocks'][block-1]['blockdata'];
} else {
var itemBlockList = null;
}
}
return itemBlockList;
}
function tln_getConditionData() {
if (_tln_analyze_exec_mode() == '' ) {
var lineDataMap = TALON.getConditionData();
} else {
if (_tln_analyze_mock) {
var lineDataMap = _tln_analyze_mock['conditions'];
} else {
var lineDataMap = null;
}
}
return lineDataMap;
}
function tln_getTargetData() {
if (_tln_analyze_exec_mode() == '' ) {
var lineDataMap = TALON.getTargetData();
} else {
if (_tln_analyze_mock) {
var lineDataMap = _tln_analyze_mock['targets']['targetdata'];
} else {
var lineDataMap = null;
}
}
return lineDataMap;
}
function tln_getTargetDataIndex() {
if (_tln_analyze_exec_mode() == '' ) {
var irec = TALON.getTargetDataIndex();
} else {
if (_tln_analyze_mock) {
var irec = _tln_analyze_mock['targets']['targetindex'];
} else {
var irec = null;
}
}
return irec;
}
//----------------------------------------------
function tln_db_select(config, sql) {
var _USER_ID = tln_com_user_id();
var _FUNC_ID = tln_com_func_id();
var _SYSDATE = tln_get_sysdate_created_date(); //tln_com_datetime2string( tln_com_nowdate() );
var itemSelectList = TalonDbUtil.select( config , sql );
if (_tln_analyze_exec_mode() != '' ) {
var tmp = _tln_analyze_select_table_name(sql);
if (itemSelectList.length == 0) {
//データが取得できなかった時はテーブル名だけでセット
_tln_analyze_set_data('ENGINE', tmp , 'SELECT');
} else {
//データが取得できた場合は、その取得情報より項目情報を取得する
var isqTable = 0;
var lineDataMap = itemSelectList[0];
for (var k in lineDataMap) {
var insCount = 0;
var _COL_NAME = k;
var _NAME_ARRAY = tmp.split(';');
for (var iTable = 0; iTable < _NAME_ARRAY.length; iTable++) {
var _TABLE_NAME = _NAME_ARRAY[iTable];
TALON.getLogger().writeDebug('★★★★★' + _TABLE_NAME + ' : ' + _COL_NAME );
//TABLE-COLの組み合わせが有れば、そのテーブル名をセット
var sql = "" +
"SELECT " +
" TABLE_NAME " +
",COLUMN_NAME " +
"FROM TLN_M_NAME_MANAGER " +
"WHERE TABLE_NAME = '" + tln_com_escape(_TABLE_NAME) + "'" +
" AND COLUMN_NAME = '" + tln_com_escape(_COL_NAME ) + "'" +
"";
var itemSelectListTABLECHK = TalonDbUtil.select( TALON.getDbConfig() , sql );
if ( itemSelectListTABLECHK.length == 0 ) {
_TABLE_NAME = '' ;
TALON.getLogger().writeDebug('★★★★★→組み合わせ無し');
} else {
TALON.getLogger().writeDebug('★★★★★→組み合わせ有り');
}
TALON.getLogger().writeDebug('★★★★★⇒' + _TABLE_NAME + ' / ' + iTable + ' / ' + _NAME_ARRAY.length + ' / ' + insCount );
//_TABLE_NAMEがNULLの時はINSERTしない。ただしTABLEの最後のLOOPの時insCountが0の時はNULLに関係なくINSERTする
if ( ( _TABLE_NAME != '' ) || ( ( (iTable + 1) == _NAME_ARRAY.length ) && ( insCount == 0 ) ) ) {
_tln_analyze_set_data_item('ENGINE' , _TABLE_NAME , _COL_NAME , 'SELECT');
insCount = insCount + 1;
}
}
}
}
if (tmp == '') {
tmp = '**解析できませんでした**';
}
tln_write_log("【SELECT】" + tmp);
}
return itemSelectList;
}
function tln_db_insert(config, sql) {
var icount = TalonDbUtil.insert( config , sql );
if (_tln_analyze_exec_mode() != '' ) {
var tmp = _tln_analyze_insert_table_name(sql);
_tln_analyze_set_data('ENGINE', tmp , 'INSERT');
if (tmp == '') {
tmp = '**解析できませんでした**';
}
tln_write_log("【INSERT】" + tmp);
}
return icount;
}
function tln_db_insertByMap(config, table_nm , datalist, coltbl) {
var icount = TalonDbUtil.insertByMap( config , table_nm , datalist , coltbl );
if (_tln_analyze_exec_mode() != '' ) {
var item_nm = _tln_analyze_dataMap_item_name(datalist);
_tln_analyze_set_data_item('ENGINE', table_nm , item_nm , 'INSERT');
tln_write_log("【INSERT】" + table_nm + ' / ' + item_nm);
}
return icount;
}
function tln_db_insertByArray(config, table_nm , datalist_array, coltbl) {
var icount = TalonDbUtil.insertByArray( config , table_nm, datalist_array ,coltbl );
if (_tln_analyze_exec_mode() != '' ) {
var item_nm = _tln_analyze_dataMap_item_name(datalist_array[0]);
_tln_analyze_set_data_item('ENGINE', table_nm , item_nm , 'INSERT');
tln_write_log("【INSERT】" + table_nm + ' / ' + item_nm);
}
return icount;
}
function tln_db_update(config, sql) {
var icount = TalonDbUtil.update( config , sql );
if (_tln_analyze_exec_mode() != '' ) {
var tmp = _tln_analyze_update_table_name(sql);
_tln_analyze_set_data('ENGINE', tmp , 'UPDATE');
if (tmp == '') {
tmp = '**解析できませんでした**';
}
tln_write_log("【UPDATE】" + tmp);
}
return icount;
}
function tln_db_updateByMap(config, table_nm , datalist, coltbl, wherelist) {
var icount = TalonDbUtil.updateByMap( config , table_nm , datalist ,coltbl , wherelist);
if (_tln_analyze_exec_mode() != '' ) {
var item_nm = _tln_analyze_dataMap_item_name(datalist);
_tln_analyze_set_data_item('ENGINE', table_nm , item_nm , 'UPDATE');
tln_write_log("【UPDATE】" + table_nm + ' / ' + item_nm);
}
return icount;
}
function tln_db_updateByArray(config, table_nm , datalist_array, coltbl, wherelist) {
var icount = TalonDbUtil.updateByArray( config , table_nm, datalist_array ,coltbl , wherelist);
if (_tln_analyze_exec_mode() != '' ) {
var item_nm = _tln_analyze_dataMap_item_name(datalist_array[0]);
_tln_analyze_set_data_item('ENGINE', table_nm , item_nm , 'UPDATE');
tln_write_log("【UPDATE】" + table_nm + ' / ' + item_nm);
}
return icount;
}
function tln_db_delete(config, sql) {
var icount = TalonDbUtil.delete( config , sql );
if (_tln_analyze_exec_mode() != '' ) {
var tmp = _tln_analyze_delete_table_name(sql);
_tln_analyze_set_data('ENGINE', tmp , 'DELETE');
if (tmp == '') {
tmp = '**解析できませんでした**';
}
tln_write_log("【DELETE】" + tmp);
}
return icount;
}
function tln_db_deleteByMap(config, table_nm , datalist, wherelist) {
var icount = TalonDbUtil.deleteByMap( config , table_nm, datalist , wherelist);
if (_tln_analyze_exec_mode() != '' ) {
//DELETEは項目情報無し
_tln_analyze_set_data('ENGINE', table_nm , 'DELETE');
tln_write_log("【DELETE】" + table_nm);
}
return icount;
}
function tln_db_deleteByArray(config, table_nm , datalist_array, wherelist) {
var icount = TalonDbUtil.deleteByArray( config , table_nm, datalist_array , wherelist);
if (_tln_analyze_exec_mode() != '' ) {
//DELETEは項目情報無し
_tln_analyze_set_data('ENGINE', table_nm , 'DELETE');
tln_write_log("【DELETE】" + table_nm);
}
return icount;
}
//----------------------------------------------
function tln_write_log(msg) {
TALON.getLogger().writeDebug( msg );
if (_tln_analyze_exec_mode() != '' ) {
if ( _tln_analyze_log != "" ) {
_tln_analyze_log = _tln_analyze_log + '\n';
}
_tln_analyze_log = _tln_analyze_log + msg;
}
}
≣ サーバJS ライブラリTLN_ANALYZE_SETUP 共通JavaScript_リポジトリ分析セットアップ 16376字
/**
* TLN_ANALYZE_COMMON : 共通JavaScript_リポジトリ分析共通部品
*
* 最終更新: TALON_ANALYZE_V1_0_3
* @version 2021/04/09
*/
//--------------------------------------------
// セットアップ関連共通
//--------------------------------------------
function table_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_TABLES WHERE TABLE_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM information_schema.tables WHERE table_name = '" + nm + "' AND table_schema = '" + _DSP1 + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'U' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(DISTINCT table_name) AS CNT FROM information_schema.columns WHERE LOWER(table_name) = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function function_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION' AND OBJECT_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_SCHEMA = '" + _DSP1 + "' AND SPECIFIC_NAME = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'FN' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM pg_proc WHERE proname = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function view_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_OBJECTS WHERE OBJECT_TYPE = 'VIEW' AND OBJECT_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '" + nm + "' AND TABLE_SCHEMA = '" + _DSP1 + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'V' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM pg_class WHERE relkind = 'v' and relname = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function field_exists(nm,fl) {
if ( !TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE TABLE_NAME = '" + nm + "' AND COLUMN_NAME = '" + fl + "' " );
} else {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE TABLE_NAME = LOWER('" + nm + "') AND COLUMN_NAME = LOWER('" + fl + "') " );
}
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function executeSQL(sql) {
if ( TALON.getDbConfig().isOra() ) {
//Oracleの場合true
TALON.executeSQL(sql);
};
if ( TALON.getDbConfig().isMy() ) {
//MySQLの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
if ( TALON.getDbConfig().isMssql() ) {
//MsSqlServerの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
if ( TALON.getDbConfig().isPostgres() ) {
//Postgresの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
}
function table_exists_drop(nm) {
if (table_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP TABLE " + nm ) ;
} else {
executeSQL( "DROP TABLE " + nm.toLowerCase() ) ;
}
}
}
function function_exists_drop(nm) {
if (function_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP FUNCTION " + nm ) ;
} else {
executeSQL( "DROP FUNCTION " + nm.toLowerCase() ) ;
}
}
}
function view_exists_drop(nm) {
if (view_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP VIEW " + nm ) ;
} else {
executeSQL( "DROP VIEW " + nm.toLowerCase() ) ;
}
}
}
function exec_create_Function() {
//≪FUNCTION DROP≫
//--------------------
//[FUNCTION]
function_exists_drop('XXXXX');
if ( TALON.getDbConfig().isOra() ) {
};
if ( TALON.getDbConfig().isMy() ) {
//SQLファイルで作成
};
if ( TALON.getDbConfig().isMssql() ) {
};
if ( TALON.getDbConfig().isPostgres() ) {
//SQLファイルで作成
};
}
function exec_create_View() {
//≪VIEW DROP≫
//--------------------
//[VIEW]
view_exists_drop('XXXXX');
if ( TALON.getDbConfig().isOra() ) {
};
if ( TALON.getDbConfig().isMy() ) {
//SQLファイルで作成
};
if ( TALON.getDbConfig().isMssql() ) {
};
if ( TALON.getDbConfig().isPostgres() ) {
//SQLファイルで作成
};
}
//--------------------------------------------
// セットアップ後環境別データ修正
//--------------------------------------------
function exec_custom() {
if ( TALON.getDbConfig().isMy() ) {
//MySQLの場合true
if ( chkLowercase() ) {
//lowercaseとして判断
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_APP SET VALUE = LOWER(VALUE) WHERE FUNC_KBN = 'UPDATE_TABLE' AND FUNC_ID LIKE 'TLN_ANALYZE_%' ");
}
}
if ( TALON.getDbConfig().isMssql() ) {
//MsSqlServerの場合true
var array = ["TLN_CHAR_TO_DATE", "TLN_CHAR_TO_NUMBER", "TLN_CHARINDEX", "TLN_CONCAT", "TLN_DATE_TIME_TO_CHAR", "TLN_DATE_TIME_TO_DATETIME", "TLN_DATE_TO_CHAR", "TLN_DATEADD", "TLN_DATEDIFF", "TLN_FIRSTDAY", "TLN_LEN", "TLN_LF", "TLN_MID", "TLN_ROUND", "TLN_SYSDATE", "TLN_ANALYZE_CONV_CHAR", "TLN_ANALYZE_CONV_TEXT"];
var i;
var num = array.length;
for(i=0;i < num;i++){
//--------------
//TLN_M_GENERAL_FUNC_SQL
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_GENERAL_FUNC_SQL " +
" SET " +
" BODY_SQL = REPLACE(REPLACE(BODY_SQL ,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" ,TITLE_SQL = REPLACE(REPLACE(TITLE_SQL,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' "
);
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_GENERAL_ITEM_OPTN " +
" SET " +
" CHR_TEXT = REPLACE(REPLACE(CHR_TEXT,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_ID <> 'TLN_ANALYZE_SYS01' " +
" AND (FUNC_KBN = 'JAVA_SCRIPT_ENGINE' OR (FUNC_KBN = 'BUTTON_BAT' AND FLAG = 2)) "
);
//--------------
//TLN_M_HANYO_CODE_MAIN
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_HANYO_CODE_MAIN " +
" SET " +
" NOTE = REPLACE(REPLACE(NOTE,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE SIKIBETU_CODE = 'TLN_GENERAL_JAVASCRIPT_ENGINE' " +
" AND KEY_CODE <> 'TLN_ANALYZE_SETUP' "
);
}
}
if ( TALON.getDbConfig().isPostgres() ) {
//PostgreSQLの場合true
//lower
//--------------
//TLN_M_GENERAL_ITEM
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM SET COL_NAME = LOWER(COL_NAME) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_ID <> 'TLN_ANALYZE_SYS01' AND COL_NAME <> 'PARAM_FUNC_ID' AND COL_NAME <> 'BLOCK_NO' ");
//--------------
//TLN_M_GENERAL_FUNC_SQL
//機能内で使用しているバインド変数を小文字に変換
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%FUNC_ID%**/' ,'/**%func_id%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%FUNC_SEQ%**/' ,'/**%func_seq%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%FUNC_KBN%**/' ,'/**%func_kbn%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%COL_NAME%**/' ,'/**%col_name%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%OPT_SORT%**/' ,'/**%opt_sort%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%TRG_ID%**/' ,'/**%trg_id%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%TENKAI_HOUKOU%**/' ,'/**%tenkai_houkou%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%SEL_FUNC_ID%**/' ,'/**%sel_func_id%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET TITLE_SQL = REPLACE(TITLE_SQL,'/**%FUNC_KBN%**/' ,'/**%func_kbn%**/' ) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' ");
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = LOWER(CHR4) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = replace(CHR4,'''jse''','''JSE''') WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND), CHR1 = LOWER(CHR1), CHR_TEXT = LOWER(CHR_TEXT), CHR4 = LOWER(CHR4) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'SEND_MAIL' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND COL_NAME <> 'BLOCK_NO' AND ( FUNC_KBN LIKE 'BUTTON_NEXT_%' or FUNC_KBN = 'INPUT_CONDITION' ) ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1), CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND ( FUNC_KBN = 'SUB_SEARCH' OR FUNC_KBN = 'LOOK_UP' ) ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'REGIST_VALUE' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) , CHR2 = LOWER(CHR2) , CHR3 = LOWER(CHR3) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'SUGGEST' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'FORE_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'INIT_VALUE_TEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'OTHER_FUNC' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1), CHR3 = LOWER(CHR3) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN like 'OTHER_FUNC_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'BACK_COLOR' ");
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET COL_NAME = LOWER(COL_NAME) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND COL_NAME <> 'PARAM_FUNC_ID' AND COL_NAME <> 'BLOCK_NO' AND FUNC_KBN NOT IN ('SEND_MAIL' , 'OTHER_FUNC' , 'JAVA_SCRIPT_ENGINE' , 'JAVA_SCRIPT' , 'BUTTON_NEXT' , 'BUTTON_BAT' , 'BUTTON_AJAX' ) ");
//TLN_M_GENERAL_APP
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_APP SET VALUE = LOWER(VALUE) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_KBN = 'UPDATE_TABLE' ");
//TLN_M_GENERAL_USES
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_USES SET KEY_CODE = LOWER(KEY_CODE) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND USER_CODE = 'TLN_GEN_ALL' AND KEY_CODE NOT IN (' PREVIEW ' , 'JS分析データ収集' ) ");
//--------------
//TLN_M_GENERAL_POSITION
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_POSITION SET NAME = LOWER(NAME) WHERE FUNC_ID LIKE 'TLN_ANALYZE_%' AND FUNC_ID <> 'WFS_M000' AND CHR1='ITEM' ");
}
}
≣ サーバJS ライブラリTLN_ANALYZE_TEST13 共通JavaScript共通ClientsideJavaScriptCSSメンテナンス部品 6293字
function colNameMultiDB(str) {
return TALON.getDbConfig().isPostgres() ? str.toLowerCase() : str;
}
//strを半角スペース、全角スペース、Tabキー入力を区切り文字として分割してセットとして取得する
function splitToSet(str) {
if (!str) return {};
var list = String(str)
.trim()
.split(/[ \u3000\t]+/);
var set = {}; // 疑似Set
for (var i = 0; i < list.length; i++) {
var parts = list[i].split(",");
for (var j = 0; j < parts.length; j++) {
var v = parts[j];
if (v.length > 0) {
set[v] = true;
}
}
}
return set;
}
function listToSet(list) {
var set = {};
for (var i = 0; i < list.length; i++) {
var v = list[i];
set[v] = true;
}
return set;
}
function setToTabString(set) {
// 1. キー一覧取得
var list = Object.keys(set);
// 2. 昇順ソート
list.sort();
// 3. タブ区切りで結合
return list.join("\t");
}
//共通JavaScriptライブラリ入力値、入力項目、行番号、主キー、サーバーサイドクライアントサイドCSSの分類、設定種別コードを取得する
//getLibrarySelectValueAndcolNameAndrowNo()["value"]:入力値
//getLibrarySelectValueAndcolNameAndrowNo()["colName"]:入力項目
//getLibrarySelectValueAndcolNameAndrowNo()["rowNo"]:行番号
function getLibrarySelectValueAndcolNameAndrowNo() {
var lineDataMap = TALON.getTargetData(); //入力値を得たい
var iREC = TALON.getTargetDataIndex(); //更新行番号
var _TYPE_CODE = lineDataMap[colNameMultiDB("TYPE_CODE")];
var librarySelectValue = "";
var updateColName = "";
var updateColNameAll = "";
var resultMap = {};
if(_TYPE_CODE == '0S0' || _TYPE_CODE == '0S1' || _TYPE_CODE == '0S3' || _TYPE_CODE == '1C0' || _TYPE_CODE == '2CS0') { //検索、確定、非同期検索前、Client-side JavaScript、CSS
librarySelectValue = lineDataMap[colNameMultiDB("CHR1")];
updateColName = colNameMultiDB("CHR1");
updateColNameAll = colNameMultiDB("FLAG");
}
if(_TYPE_CODE == '0S2' || _TYPE_CODE == '0S6' ) { //帳票出力、処理呼出
librarySelectValue = lineDataMap[colNameMultiDB("CHR2")];
updateColName = colNameMultiDB("CHR2");
updateColNameAll = colNameMultiDB("CHR1");
}
if(_TYPE_CODE == '0S5') { //JavaScript呼出
librarySelectValue = lineDataMap[colNameMultiDB("CHR2")];
updateColName = colNameMultiDB("CHR2");
updateColNameAll = colNameMultiDB("FLAG");
}
if(_TYPE_CODE == '0S4') { //非同期検索後
librarySelectValue = lineDataMap[colNameMultiDB("CHR5")];
updateColName = colNameMultiDB("CHR5");
updateColNameAll = colNameMultiDB("CHR4");
}
//主キー値も取得する
resultMap["FUNC_ID"] = lineDataMap[colNameMultiDB("FUNC_ID")];
resultMap["FUNC_SEQ"] = lineDataMap[colNameMultiDB("FUNC_SEQ")];
resultMap["COL_NAME"] = lineDataMap[colNameMultiDB("COL_NAME")];
resultMap["FUNC_KBN"] = lineDataMap[colNameMultiDB("FUNC_KBN")];
resultMap["OPT_SORT"] = lineDataMap[colNameMultiDB("OPT_SORT")];
resultMap["value"] = librarySelectValue;
resultMap["colName"] = updateColName;
resultMap["colNameALL"] = updateColNameAll;
resultMap["rowNo"] = iREC;
//共通JavaScriptがサーバーサイドかclient-sideかの場合分けが必要
if( _TYPE_CODE == '1C0' ) {
resultMap['COMMON_TYPE'] = 'CSJS';
} else if ( _TYPE_CODE == '2CS0' ) {
resultMap['COMMON_TYPE'] = 'CSS';
} else {
resultMap['COMMON_TYPE'] = 'SSJS';
}
//設定種別コード
resultMap["TYPE_CODE"] = _TYPE_CODE;
//ライブラリ設定対象外の設定種別(1C1〜1C6等)かどうか
resultMap["hasLibrary"] = (updateColName !== "");
return resultMap;
}
//入力値inputvalueをsplitToSetで分割して全てselectlistに含まれているか確認する
function inputValidator(selectlist,inputvalue) {
var inputvalueset = splitToSet(inputvalue);
var selectset = listToSet(selectlist);
for(key in inputvalueset) {
if (!(key in selectset)) {
return false;
}
}
return true;
}
//JavaScript呼出のサーバーサイドのライブラリ設定がOn click時のレコードにも保存されているため本機能による更新時も同様の処理としておく
function updateCallJavaScriptOnClick() {
var submitRecord = getLibrarySelectValueAndcolNameAndrowNo();
var updatesql = "UPDATE TLN_M_GENERAL_ITEM_OPTN OPTN0 "
+ " SET "
+ colNameMultiDB("CHR4") + " = ( "
+ " SELECT SRC." + colNameMultiDB("CHR2")
+ " FROM ("
+ " SELECT "
+ " OPTN1." + colNameMultiDB("CHR2")
+ " FROM TLN_M_GENERAL_ITEM_OPTN OPTN1"
+ " WHERE "
+ " OPTN1." + colNameMultiDB("FUNC_ID") + " = " + "'" + submitRecord["FUNC_ID"] + "'"
+ " AND OPTN1." + colNameMultiDB("FUNC_SEQ") + " = " + submitRecord["FUNC_SEQ"]
+ " AND OPTN1." + colNameMultiDB("COL_NAME") + " = " + "'" + submitRecord["COL_NAME"] + "'"
+ " AND OPTN1." + colNameMultiDB("FUNC_KBN") + " = " + "'JAVASCRIPT_ENGINE'"
+ " AND OPTN1." + colNameMultiDB("OPT_SORT") + " = " + submitRecord["OPT_SORT"]
+ " ) SRC ) "
+ " , " + colNameMultiDB("FLAG") + " = ( "
+ " SELECT SRC." + colNameMultiDB("FLAG")
+ " FROM ("
+ " SELECT "
+ " OPTN1." + colNameMultiDB("FLAG")
+ " FROM TLN_M_GENERAL_ITEM_OPTN OPTN1"
+ " WHERE "
+ " OPTN1." + colNameMultiDB("FUNC_ID") + " = " + "'" + submitRecord["FUNC_ID"] + "'"
+ " AND OPTN1." + colNameMultiDB("FUNC_SEQ") + " = " + submitRecord["FUNC_SEQ"]
+ " AND OPTN1." + colNameMultiDB("COL_NAME") + " = " + "'" + submitRecord["COL_NAME"] + "'"
+ " AND OPTN1." + colNameMultiDB("FUNC_KBN") + " = " + "'JAVASCRIPT_ENGINE'"
+ " AND OPTN1." + colNameMultiDB("OPT_SORT") + " = " + submitRecord["OPT_SORT"]
+ " ) SRC ) "
+ " WHERE "
+ " OPTN0." + colNameMultiDB("FUNC_ID") + " = " + "'" + submitRecord["FUNC_ID"] + "'"
+ " AND OPTN0." + colNameMultiDB("FUNC_SEQ") + " = " + submitRecord["FUNC_SEQ"]
+ " AND OPTN0." + colNameMultiDB("COL_NAME") + " = " + "'" + submitRecord["COL_NAME"] + "'"
+ " AND OPTN0." + colNameMultiDB("FUNC_KBN") + " = " + "'JAVASCRIPT'"
+ " AND OPTN0." + colNameMultiDB("OPT_SORT") + " = " + submitRecord["OPT_SORT"]
TalonDbUtil.update(TALON.getDbConfig(), updatesql);
}≣ サーバJS ライブラリTLN_FUNC_DOC_COMMON TALON機能設計書出力 共通ライブラリ 385031字
// TLN_FUNC_DOC_COMMON: TALON機能設計書出力 共通サーバ側JS
// LIBRARY_CODE: 0JSENGINE / TYPE: server-side common library
//
// 提供API:
// TFC.getLabelBundle(lang) Java ResourceBundle 取得 (ja/en/zh_CN/...)
// TFC.lbl(bundle, key, fallback) キー→翻訳テキスト
// TFC.escapeHtml(s) HTML エスケープ
// TFC.escapeMd(s) Markdown エスケープ
// TFC.escapeAttr(s) HTML 属性値エスケープ (& < " ' のみ)
// TFC.formatSql(s) SQL 整形 (将来用、現状は trim のみ)
// TFC.appKbnLabel(appKbn, lang) APP_KBN → "固定検索条件"等
// TFC.funcKbnInfo(funcKbn) FUNC_KBN → {section, labelKey, table} (辞書)
// TFC.toLocale(lang) lang 文字列を java.util.Locale へ変換
// TFC.HTML_HEAD / TFC.HTML_TAIL 自己完結HTMLの head/tail 生成
// TFC.htmlSection(title, body, opts) <details>セクション生成
// TFC.tabBadge(isOn, count, lang) タブ on/off バッジ HTML
// TFC.zip(entries) {name: bytes/string} → ZIP バイト列 (java.util.zip)
(function (global) {
'use strict';
var ResourceBundle = Java.type('java.util.ResourceBundle');
var Locale = Java.type('java.util.Locale');
var ByteArrayOutputStream = Java.type('java.io.ByteArrayOutputStream');
var ZipOutputStream = Java.type('java.util.zip.ZipOutputStream');
var ZipEntry = Java.type('java.util.zip.ZipEntry');
var JString = Java.type('java.lang.String');
var Charset = Java.type('java.nio.charset.Charset');
var TFC = {};
// ============================================================
// 言語検出 (V6 のブラウザ言語に応じて出力を切り替える)
// ============================================================
// 出力言語を 'ja' / 'en' で返す。
// V6 (TALON Ver.6.0.2+): ブラウザの Accept-Language が FacesContext.viewRoot.locale に反映される
// → ブラウザ=英語の利用者には英語版を、その他は日本語版を返す
// V5 (TALON Ver < 6.0.2 / Payara 5): FacesContext.viewRoot に locale は載らないため
// 常に 'ja' を返す (V5 で英語対応はしない方針)
TFC.detectLang = function () {
// 検出戦略 (上から優先順):
// (1) TALON.getUserInfoMap().LOCALE — V6.2.7+ で追加されたブラウザ言語 (利用者個別)
// (2) java.util.Locale.getDefault() — JVM デフォルトロケール (Payara JVM オプション
// -Duser.language=en 等で英語化されている環境向け)
// (3) 上記いずれも該当しなければ 'ja'
//
// バージョン別動作:
// - V5 / V6.0.0〜V6.2.6 + JVM=ja: 'ja'
// - V5 / V6.0.0〜V6.2.6 + JVM=en: 'en' (JVM Locale フォールバック)
// ※ V6.0.2〜V6.2.6 でブラウザ言語=en/JVM=ja の組み合わせは英語化できない (TALON 仕様)
// - V6.2.7+ + ブラウザ言語=en: 'en' (利用者ごとに切替)
// - V6.2.7+ + ブラウザ言語=ja: 'ja'
//
// 0S100 は別ワーカースレッドで動くため FacesContext / HttpSession にアクセスできず、
// ブラウザ言語を取得する公式 API は userInfoMap.LOCALE 経由のみ (V6.2.7+)。
// 実機調査 (2026-05-12): V5/V6.2.15 双方で TALON.getUserSessions() / JsfUtil.getUserID()
// 等は worker thread からは "Non-login" を返すため利用できない。
try {
if (typeof TALON !== 'undefined' && typeof TALON.getUserInfoMap === 'function') {
var ui = TALON.getUserInfoMap();
if (ui) {
for (var k in ui) {
if (/^(locale|lang|language)$/i.test(k)) {
var v = String(ui[k] || '');
if (v) {
var nor = _normalizeLang(v);
try { TALON.getLogger().writeInfo('[TFC] detectLang via userInfo[' + k + ']=' + v + ' → ' + nor); } catch (ignore) {}
return nor;
}
}
}
}
}
} catch (e) {}
try {
var dl = Locale.getDefault();
if (dl) {
var lng = String(dl.getLanguage() || '');
if (lng) {
var nor2 = _normalizeLang(lng);
if (nor2 === 'en') {
// ja は既定値と区別がつかないのでログを出すのは en 検出時のみ
try { TALON.getLogger().writeInfo('[TFC] detectLang via Locale.getDefault=' + lng + ' → ' + nor2); } catch (ignore) {}
}
return nor2;
}
}
} catch (e) {}
return 'ja';
};
function _normalizeLang(lng) {
// 'en', 'en-US', 'en_US' → 'en' ; 'ja', 'ja-JP' → 'ja' ; その他は ja にフォールバック
var s = String(lng).toLowerCase().replace('_', '-').split('-')[0];
if (s === 'en' || s === 'ja') return s;
return 'ja';
}
// ============================================================
// ライセンス / エディション (販売プラン ①無償 / ②物理DB+マトリクス / ③全機能)
// ============================================================
// 方式: オフライン署名検証 (RSA-2048 / SHA256withRSA)。
// ・製品には公開鍵のみ埋込 (下記 _LICENSE_PUBKEY_B64)。 署名は弊社の秘密鍵のみで作成可
// (改竄・偽造不可)。 顧客は署名済みライセンスキー (1 行) をファイルに置くだけ:
// {Payara}/glassfish/domains/{domain}/lib/classes/commonweal_license.key
// ★Ver0.63 で製品名に合わせて改名。 旧名 tln_func_doc_license.key も
// フォールバックで読む (既存顧客は置き換え不要 — 公開文書は新名のみ記載)
// ・ライセンスキー形式: base64(payloadJSON) + "." + base64(署名)
// payload = {cid:顧客ID, ed:1|2|3, exp:"YYYY-MM-DD"(当日まで有効), v:版}
// ・未配置 / 無効 / 期限切れ → edition 1 (無償) にフォールバック
// 発行ツール: tools/license_keygen.py (鍵生成・1回) / tools/license_issue.py (顧客ごと)
TFC._LICENSE_PUBKEY_B64 =
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApv8ZGJNXvF6WRq+nHKU3gmjTElQ/Z3+' +
'vSI7z6VGZ8WjL2Zm4UjOS3lrpxc+LtlsfobWuhUwILujjHqoTz3x4zEf5Dx0S+0o/9t0UleI1Uk' +
'485kM2Eg7zfLJDMblyb6WoVC/Cge5mnSWxjWl9gPsZhgRyL0SPUTdFISsOfFSidDK24zSjmdm/6' +
'Neu88Iqaly5QO9N9oWhTml1g+3rNPIzIIvhlvjy4ItVc4OMk/rgRAuxC9EJmXqi6Va3YmXVMHjw' +
'Mxn4E3xN1eBJL9OyDMmSQPKOOvIvWfE8Yzfkfd7W+5PZU+QQQcwMo43HIeUk8ZJf1GNCd7ScQrz' +
'VLXD42l/31wIDAQAB';
TFC.LICENSE_FILE_NAME = 'commonweal_license.key';
// ★Ver0.63 改名前の名前。 既存環境を壊さないため読取のみフォールバックする
TFC.LICENSE_FILE_NAME_LEGACY = 'tln_func_doc_license.key';
// ライセンスキー文字列を検証。 返り値: {valid:bool, edition:1|2|3, cid, exp, reason}
// reason: '' | 'empty' | 'format' | 'badsig' | 'expired' | 'error'
TFC.verifyLicense = function (keyString, todayStr) {
var res = { valid: false, edition: 1, cid: '', exp: '', reason: 'empty' };
if (!keyString) return res;
var ks = String(keyString).replace(/[\r\n\s]/g, '');
if (!ks) return res;
try {
var dot = ks.indexOf('.');
if (dot <= 0) { res.reason = 'format'; return res; }
var msg = ks.substring(0, dot);
var sigB64 = ks.substring(dot + 1);
var Base64 = Java.type('java.util.Base64');
var KeyFactory = Java.type('java.security.KeyFactory');
var X509 = Java.type('java.security.spec.X509EncodedKeySpec');
var Signature = Java.type('java.security.Signature');
var pubDer = Base64.getDecoder().decode(TFC._LICENSE_PUBKEY_B64);
var pub = KeyFactory.getInstance('RSA').generatePublic(new X509(pubDer));
var sig = Signature.getInstance('SHA256withRSA');
sig.initVerify(pub);
sig.update(new JString(msg).getBytes('US-ASCII'));
var sigBytes = Base64.getDecoder().decode(sigB64);
if (!sig.verify(sigBytes)) { res.reason = 'badsig'; return res; }
// 署名 OK → ペイロード復号
var payloadJson = new JString(Base64.getDecoder().decode(msg), 'UTF-8');
var pl = JSON.parse(String(payloadJson));
res.cid = String(pl.cid || '');
res.exp = String(pl.exp || '');
var ed = parseInt(pl.ed, 10);
// 期限判定 (YYYY-MM-DD 文字列比較。 exp >= today で有効)
var today = todayStr || _todayYmd();
if (res.exp && today && res.exp < today) { res.reason = 'expired'; res.edition = 1; return res; }
res.valid = true;
res.edition = (ed === 2 || ed === 3) ? ed : 1;
res.reason = '';
return res;
} catch (e) {
try { TALON.getLogger().writeWarn('[TFC] ライセンス検証エラー: ' + e); } catch (ig) {}
res.reason = 'error';
return res;
}
};
function _todayYmd() {
try {
var LD = Java.type('java.time.LocalDate');
return String(LD.now().toString()); // 'YYYY-MM-DD'
} catch (e) {
var d = new Date();
var mm = ('0' + (d.getMonth() + 1)).slice(-2), dd = ('0' + d.getDate()).slice(-2);
return d.getFullYear() + '-' + mm + '-' + dd;
}
}
// ライセンスファイルを lib/classes (talonJdbc.properties と同じ場所) から読む。
// 絶対パスをハードコードせず、 classloader で talonJdbc.properties の位置を解決 →
// 同ディレクトリの commonweal_license.key を毎回フレッシュ読み (差し替え即反映)。
// ★Ver0.63: 新名 commonweal_license.key を優先し、 無ければ旧名
// tln_func_doc_license.key を読む (既存顧客の環境を壊さないための無言フォールバック)。
// 返り値: ライセンスキー文字列 (無ければ '')。
TFC.readLicenseFile = function () {
try {
var File = Java.type('java.io.File');
var Files = Java.type('java.nio.file.Files');
var cl = Java.type('java.lang.Thread').currentThread().getContextClassLoader();
var candidates = [];
var names = [TFC.LICENSE_FILE_NAME, TFC.LICENSE_FILE_NAME_LEGACY];
// 1. talonJdbc.properties と同じ lib/classes を第一候補にする (新名 → 旧名)
try {
var url = cl.getResource('talonJdbc.properties');
if (url) {
var dir = new File(url.toURI()).getParentFile();
for (var n1 = 0; n1 < names.length; n1++) {
candidates.push(new File(dir, names[n1]));
}
}
} catch (e1) {}
// 2. classpath ルート直下 (getResource(license) 直接ヒット。 新名 → 旧名)
try {
for (var n2 = 0; n2 < names.length; n2++) {
var lurl = cl.getResource(names[n2]);
if (lurl) candidates.push(new File(lurl.toURI()));
}
} catch (e2) {}
for (var i = 0; i < candidates.length; i++) {
var f = candidates[i];
if (f && f.exists() && f.isFile()) {
var bytes = Files.readAllBytes(f.toPath());
var text = String(new JString(bytes, 'UTF-8'));
// 自己記述ヘッダ (# 始まりの説明行) と空行を無視して キー本体を取り出す。
// キー本体は '#' で始まらない 1 行 (base64.base64)。 空白は除去。
var flines = text.split(/\r\n|\r|\n/);
var body = '';
for (var fl = 0; fl < flines.length; fl++) {
var ln = flines[fl].replace(/^\s+|\s+$/g, '');
if (ln === '' || ln.charAt(0) === '#') continue;
body += ln;
}
return body;
}
}
} catch (e) {
try { TALON.getLogger().writeWarn('[TFC] ライセンスファイル読取エラー: ' + e); } catch (ig) {}
}
return '';
};
// エディションを解決 (1|2|3)。 ファイル読取 → 検証 → 期限判定。 未配置/無効=1 (無償)。
// ログに検出結果を残す (顧客サポート・監査用)。
TFC.resolveEdition = function () {
var keyString = TFC.readLicenseFile();
if (!keyString) {
try { TALON.getLogger().writeInfo('[TFC] ライセンス未配置 → edition 1 (無償)'); } catch (ig) {}
return { edition: 1, license: { valid: false, edition: 1, reason: 'empty' } };
}
var v = TFC.verifyLicense(keyString);
try {
TALON.getLogger().writeInfo('[TFC] ライセンス: valid=' + v.valid + ' edition=' + v.edition +
' cid=' + v.cid + ' exp=' + v.exp + ' reason=' + v.reason);
} catch (ig) {}
return { edition: v.edition, license: v };
};
// ============================================================
// ラベル辞書 (UI 文言)
// ============================================================
// FUNC_KBN_DICT とは別に、HTML/Markdown 出力の見出し・ヘッダ・固定文言を集中管理する。
// key は安定した英数字キー (例: 'sec.funcDesc')、値は言語別の表示文字列。
// 使い方: TFC.t('sec.funcDesc', lang) // → '機能説明' / 'Function Description'
var _labels = {
// セクション見出し / タブ名
'sec.funcDesc': { ja: '機能説明', en: 'Function description' },
'sec.application': { ja: 'アプリケーション', en: 'Application' },
'sec.userGroup': { ja: 'ユーザグループ', en: 'User group' },
'sec.freeLayout': { ja: 'フリーレイアウト', en: 'Free layout' },
'sec.selectExpr': { ja: 'SELECT式', en: 'SELECT formula' },
'sec.titleSelectExpr': { ja: 'タイトルSELECT式', en: 'Title SELECT formula' },
'sec.itemInfo': { ja: '項目情報', en: 'Item information' },
'sec.detailSetting': { ja: '詳細設定', en: 'Detail settings' },
'sec.menuPos': { ja: 'メニュー位置', en: 'Menu position' },
'sec.referenced': { ja: '被参照', en: 'Referenced from' },
'sec.referencedDetail': { ja: '被参照 (他機能から呼ばれている箇所)', en: 'Referenced from (called by other functions)' },
'sec.refGenCd': { ja: '参照汎用CD', en: 'Referenced general code' },
'sec.refSeqNum': { ja: '参照採番', en: 'Referenced numbering' },
'sec.refCalendar': { ja: '参照カレンダー', en: 'Referenced calendar' },
'sec.refClass': { ja: '参照汎用階層', en: 'Referenced general hierarchy' },
'sec.codebook': { ja: 'コードブック', en: 'Code book' },
'sec.deps': { ja: '依存関係', en: 'Dependencies' },
'sec.fixupNotes': { ja: '改修時の注意', en: 'Notes for modification' },
// インデックス / トップレベル
'idx.title': { ja: 'TALON 機能設計書 インデックス', en: 'TALON Function Documents Index' },
'idx.meta.generated': { ja: '生成日時', en: 'Generated' },
'idx.meta.funcCount': { ja: '機能件数', en: 'Function count' },
'idx.col.funcId': { ja: '機能ID', en: 'Function ID' },
'idx.col.funcNm': { ja: '機能名', en: 'Function name' },
'idx.col.outline': { ja: '機能概要', en: 'Outline' },
'idx.col.links': { ja: 'リンク', en: 'Links' },
'idx.uncategorized': { ja: '(未分類)', en: '(Uncategorized)' },
'idx.empty': { ja: '対象機能がありません。', en: 'No target functions.' },
'idx.htmlLink': { ja: 'HTML', en: 'HTML' },
'idx.mdLink': { ja: 'Markdown', en: 'Markdown' },
// 共通テーブルヘッダ
'th.item': { ja: '項目', en: 'Item' },
'th.value': { ja: '値', en: 'Value' },
'th.no': { ja: '#', en: '#' },
'th.type': { ja: 'TYPE', en: 'Type' },
'th.title': { ja: 'TITLE', en: 'Title' },
'th.colName': { ja: 'COL_NAME', en: 'COL_NAME' },
'th.dispName': { ja: 'DISP_NAME', en: 'DISP_NAME' },
'th.tableName': { ja: 'テーブル名', en: 'Table' },
'th.source': { ja: '出典', en: 'Source' },
'th.btnName': { ja: 'ボタン名', en: 'Button name' },
'th.btnLabel': { ja: 'ボタン', en: 'Button' },
'th.kind': { ja: '種別', en: 'Kind' },
'th.state': { ja: '状態', en: 'State' },
'th.group': { ja: 'グループ名', en: 'Group name' },
'th.authKbn': { ja: 'AUTH_KBN', en: 'AUTH_KBN' },
'th.sikibetuCd': { ja: '識別コード', en: 'Identifier code' },
'th.keyCode': { ja: 'KEY', en: 'KEY' },
'th.name': { ja: '名称', en: 'Name' },
// 集約 (検索条件 / 項目情報) のテーブルヘッダ
'th.dispNameTypical': { ja: '表示名 (代表)', en: 'Display name (typical)' },
'th.typicalColName': { ja: '代表 COL_NAME', en: 'Typical COL_NAME' },
'th.typicalBlock': { ja: '代表ブロック', en: 'Typical block' },
'th.aggregatedFrom': { ja: '集約元', en: 'Aggregated from' },
'th.dispName2': { ja: '表示名', en: 'Display name' },
'th.physColName': { ja: '物理項目名', en: 'Physical column' },
'th.component': { ja: 'コンポーネント', en: 'Component' },
'th.dataType': { ja: 'データ型', en: 'Data type' },
'th.dispWidth': { ja: '表示桁', en: 'Display width' },
'th.dispHeight': { ja: '表示高さ', en: 'Display height' },
'th.inputFormat': { ja: '表示・入力形式', en: 'Input format' },
'th.dispOrder': { ja: '表示順', en: 'Display order' },
'th.dispOrderShort': { ja: '並び順', en: 'Order' },
'th.key': { ja: 'キー', en: 'Key' },
'th.update': { ja: '更新', en: 'Update' },
'th.search': { ja: '検索', en: 'Search' },
'th.required': { ja: '必須', en: 'Required' },
'th.digits': { ja: '桁数', en: 'Digits' },
'th.typical': { ja: '代表', en: 'Typical' },
'th.helpUrl': { ja: 'ヘルプURL', en: 'Help URL' },
'th.authGroupId': { ja: '権限グループID', en: 'Auth group ID' },
'th.authKbnLabel': { ja: '権限区分', en: 'Auth kind' },
'th.ref': { ja: '参照', en: 'Ref' },
'th.del': { ja: '削除', en: 'Del' },
'th.funcType': { ja: '機能タイプ', en: 'Function type' },
// 画面ビジュアル内の固定文言
'visual.ref': { ja: '参照', en: 'Ref' },
'visual.del': { ja: '削除', en: 'Del' },
// SUB (検索子画面) モードの専用 UI ラベル (TALON 実画面で観察)
'visual.subSelect': { ja: '選択', en: 'Select' },
'visual.subRowNo': { ja: '行番号', en: 'No.' },
'visual.subRowNoSubMode': { ja: '行番号 (SUB モード)', en: 'Row number (SUB mode)' },
// フォールバック / プレースホルダ
'visual.itemFallback': { ja: '(項目)', en: '(item)' },
'visual.thFallback': { ja: '(TH)', en: '(TH)' },
'visual.tdInputFallback': { ja: '(TD: 入力)', en: '(TD: input)' },
// ボタンエリア (renderFuncAreaFromPos) の標準/カスタムボタン フォールバックチップ
'visual.stdBtnPrefix': { ja: '標準ボタン: ', en: 'Standard button: ' },
'visual.customBtnPrefix': { ja: 'ボタン: ', en: 'Button: ' },
// CSV_LOAD_BUTTON の付随ドロップゾーン widget (TALON 実画面でファイル UI を案内するテキスト)
'visual.csvLoadDropzone': { ja: 'クリックまたはファイルをドロップ', en: 'Click or drop file' },
// 確定ボタン (機能下部) ラベル / 処理実行
'btn.confirm': { ja: '確定', en: 'Confirm' },
'btn.run': { ja: '処理実行', en: 'Run' },
// メタ / 機能カード
'meta.bgCategory': { ja: '業務分類', en: 'Business category' },
'meta.admin': { ja: '管理者', en: 'Administrator' },
'meta.lastUpdate': { ja: '最終更新', en: 'Last update' },
'meta.appKbn': { ja: '機能タイプ', en: 'Function type' },
'meta.notSet': { ja: '(未設定)', en: '(Not set)' },
// タブバッジ
'badge.set': { ja: '設定あり', en: 'set' },
'badge.none': { ja: '設定なし', en: 'none' },
'badge.unit': { ja: '件', en: '' }, // 「2 件」 vs 「2」
// コントロール (HTML 上部のボタン)
'ctrl.allOpen': { ja: '全展開', en: 'Expand all' },
'ctrl.allClose': { ja: '全閉じ', en: 'Collapse all' },
'ctrl.cardOnly': { ja: 'カードのみ', en: 'Cards only' },
'ctrl.onOnly': { ja: '設定ありのみ', en: 'Set only' },
// エラー / 情報メッセージ
'msg.err.noTarget': { ja: '出力対象が選択されていません。明細の「出力対象」にチェックを入れてから押してください。',
en: 'No output target selected. Check "Output target" in the row before pressing.' },
'msg.err.noData': { ja: '対象機能のデータが取得できませんでした。',
en: 'Could not retrieve data for the selected functions.' },
// 出力ファイルのカバーシート/警告
'cov.warnHeader': { ja: '⚠ 注意事項', en: '⚠ Notes' },
// 詳細セクション (Stats / Detail view / Data flow / Reference analysis)
'detail.statsTitle': { ja: '▤ 統計', en: '▤ Statistics' },
'detail.viewTitle': { ja: '⌕ 詳細ビュー (用途で切り替え)', en: '⌕ Detail view (switch by use)' },
'detail.dataFlow': { ja: 'データフロー', en: 'Data flow' },
'detail.refAnalysisTitle':{ ja: '✎ テーブル参照解析について:', en: '✎ About table reference analysis:' },
'detail.refAnalysisMethod':{ ja: 'テーブル参照は <code>UPDATE_TABLE</code> 設定 + ブロック SELECT 式 (BODY_SQL/TITLE_SQL) + 各種 JavaScript コード (CHR_TEXT) + 呼び出すストアドプロシージャの本体 (Oracle / PostgreSQL / MySQL / SQL Server) を <code>FROM</code> / <code>JOIN</code> / <code>INSERT INTO</code> / <code>UPDATE ... SET</code> / <code>DELETE FROM</code> / <code>MERGE INTO</code> / <code>REPLACE INTO</code> / <code>MERGE ... USING</code> のキーワードで正規表現解析した結果です。 動的SQL (EXECUTE IMMEDIATE / PREPARE / sp_executesql 等) は、文字列リテラルが DML 文で始まる場合のみ抽出します。',
en: 'Table references come from regex analysis of <code>UPDATE_TABLE</code> settings, block SELECT formulas (BODY_SQL/TITLE_SQL), JavaScript code (CHR_TEXT) and the body of called stored procedures (Oracle / PostgreSQL / MySQL / SQL Server), looking for <code>FROM</code> / <code>JOIN</code> / <code>INSERT INTO</code> / <code>UPDATE ... SET</code> / <code>DELETE FROM</code> / <code>MERGE INTO</code> / <code>REPLACE INTO</code> / <code>MERGE ... USING</code> keywords. Dynamic SQL (EXECUTE IMMEDIATE / PREPARE / sp_executesql etc.) is extracted only when a string literal starts with a DML statement.' },
'detail.writeLabel': { ja: '書き込み', en: 'Write' },
'detail.readLabel': { ja: '読み取り', en: 'Read' },
'detail.refMissing': { ja: '⚠ 抜け・漏れの可能性', en: '⚠ Possible omissions' },
'detail.refOutOfScope': { ja: '⚠ 対象外', en: '⚠ Out of scope' },
'detail.refWriteDef': { ja: 'INSERT/UPDATE/DELETE/MERGE/REPLACE のいずれかが検出されたテーブル',
en: 'Tables detected by INSERT/UPDATE/DELETE/MERGE/REPLACE' },
'detail.refReadDef': { ja: 'FROM/JOIN のみで参照されているテーブル',
en: 'Tables referenced only by FROM/JOIN' },
'detail.refMissingDesc': { ja: '変数連結でテーブル名を組み立てた SQL は検出できません (リテラルとして完結した動的SQLは抽出します)。JavaScript の if 分岐内の SQL は検出できない場合があります。',
en: 'SQL whose table names are built by variable concatenation cannot be detected (dynamic SQL written as a complete literal is extracted). SQL inside JavaScript if-branches may not be detected.' },
'detail.refScopeDesc': { ja: 'ストアドプロシージャ本体は Oracle / PostgreSQL / MySQL / SQL Server に対応 (DB2 等は今後対応)。 プロシージャから更に呼び出す別プロシージャ、 BODY_SQL/JS に直接書いた CALL/EXEC 呼び出し、 外部 API 経由のアクセス、 トリガで連動するテーブルは含まれません。 動的SQLは文字列リテラルが DML 文で始まる場合のみ抽出し、 変数で組み立てるテーブル名は対象外です。',
en: 'Stored procedure bodies are analyzed for Oracle / PostgreSQL / MySQL / SQL Server (DB2 etc. planned). Procedures called from within a procedure, CALL/EXEC written directly in BODY_SQL/JS, access via external APIs, and tables linked by triggers are not included. Dynamic SQL is extracted only when a string literal starts with a DML statement; table names built from variables are out of scope.' },
'detail.refNoteTag': { ja: '✎ 補完 (備考タグ)', en: '✎ Supplement (Note tags)' },
'detail.refNoteTagDesc': { ja: '解析で捕捉できない依存は、 機能説明タブの備考に [R:テーブル名] (読み) / [W:テーブル名] (書き) / [WR:テーブル名] (読み書き) と記入すると本設計書の依存として取り込まれます (1タグ1テーブル、 文章中に埋め込み可)。 @番号 で複数DB接続の接続先を明示できます (例 [W:LOG_TBL@2]。 省略時は機能の DB 接続先)。',
en: 'Dependencies the analysis cannot capture can be declared in the Note field of the function description tab as [R:TABLE] (read) / [W:TABLE] (write) / [WR:TABLE] (read+write) — one table per tag, embeddable in plain text. Append @N to specify a multi-DB connection target (e.g. [W:LOG_TBL@2]; defaults to the DB connection of the function).' },
'detail.block': { ja: 'ブロック', en: 'Block' },
'detail.wholeFunc': { ja: '機能全体', en: 'Whole function' },
// タブラベル
'tab.deps': { ja: '◈️ 依存関係', en: '◈️ Dependencies' },
'tab.code': { ja: '≣ コードブック', en: '≣ Code book' },
'tab.legacy': { ja: '※ 全設定', en: '※ All settings' },
'tab.domains': { ja: '◇ データドメイン', en: '◇ Data domains' },
// 統計カード
'stats.blocks': { ja: 'ブロック数', en: 'Blocks' },
'stats.code': { ja: 'JS / SQL コード', en: 'JS / SQL code' },
'stats.refFuncs': { ja: '参照先機能', en: 'Referenced functions' },
'stats.refFuncsSub': { ja: 'LOOK_UP/SUB_SEARCH/OTHER_FUNC 等', en: 'LOOK_UP/SUB_SEARCH/OTHER_FUNC etc.' },
'stats.referenced': { ja: '被参照', en: 'Referenced from' },
'stats.referencedSub': { ja: '他機能から呼び出し', en: 'Called from other functions' },
'stats.none': { ja: '(なし)', en: '(none)' },
// 集約 (検索条件 / 項目情報)
'agg.condTitle': { ja: '検索条件集約', en: 'Search condition aggregation' },
'agg.condDesc': { ja: '同一 COL_NAME は自動集約。物理項目名が異なる検索項目は <code>TLN_M_GENERAL_ITEM_OPTN.FUNC_KBN='JOIN'</code> (機能設定画面 アプリケーションタブ「結合項目」) で集約されます。表示名は最初に出現したブロック (SORT 最小) のものを採用。',
en: 'Same COL_NAME values are auto-aggregated. Conditions with different physical column names are aggregated via <code>TLN_M_GENERAL_ITEM_OPTN.FUNC_KBN='JOIN'</code> (Application tab "Join items" in the function setup screen). Display name is taken from the first occurring block (smallest SORT).' },
'agg.countSuffix': { ja: '{0}件 (うち集約あり {1}件)', en: '{0} (with {1} aggregated)' },
'agg.noAggregation': { ja: '(集約なし)', en: '(no aggregation)' },
// ヒーロー (機能カードのタイトル + 機能概要 / 備考)
'hero.outline': { ja: '◆ 機能概要', en: '◆ Outline' },
'hero.note': { ja: '✎ 備考', en: '✎ Note' },
'hero.dataVer': { ja: 'データ版数 (設定の最終更新)', en: 'Data version (last setting update)' },
// 画面ビジュアル (静的画面プレビュー)
'visual.title': { ja: '画面ビジュアル', en: 'Screen visual' },
'visual.hint': { ja: '(各UI要素にマウスオーバーで設定詳細)', en: '(Hover any element to see setting details)' },
'visual.noteTitle': { ja: '✎ 画面イメージの注意事項:', en: '✎ About this visual:' },
'visual.noteBody': { ja: 'この画面イメージは<strong>機能設定 (静的データ) のみ</strong>から組み立てたスケルトンです。実際の動作と異なる場合があります。',
en: 'This visual is a skeleton built from <strong>static settings only</strong>; runtime behavior may differ.' },
'visual.noteDivergeTitle':{ ja: '主な乖離ポイント:', en: 'Main divergences:' },
'visual.noteDiverge1': { ja: '①動的式 (ボタン名表示式 / 条件式 / TITLE_SQL 等) は固定値で表示 — 実行時に評価される。',
en: '① Dynamic expressions (button labels / conditions / TITLE_SQL, etc.) shown with literal text — they are evaluated at runtime.' },
'visual.noteDiverge2': { ja: '②条件付き色付け (FORE_COLOR / BACK_COLOR) は kind 値を直接適用 — 条件式は評価しない。',
en: '② Conditional coloring (FORE_COLOR / BACK_COLOR) applies kind values directly — conditions are not evaluated.' },
'visual.noteDiverge3': { ja: '③カレンダー / ガント / グラフは固定値スケルトン — 実データを反映しない (冪等性担保のため)。',
en: '③ Calendar / Gantt / charts are fixed skeletons — actual data not reflected (for idempotency).' },
'visual.noteDiverge4': { ja: '④ユーザー個別設定 (PDF用紙サイズ等) は固定値表示。',
en: '④ User-individual settings (PDF paper size etc.) shown as fixed values.' },
'visual.noteDiverge5': { ja: '⑤検索 / 確定ボタン押下後の動作は対象外。',
en: '⑤ Post-search / post-confirm behavior is out of scope.' },
// ストーリー (利用シナリオ)
'story.actorUser': { ja: 'ユーザ', en: 'User' },
'story.actorScreen': { ja: '画面', en: 'Screen' },
'story.actorParent': { ja: '親画面', en: 'Parent' },
'story.openFunc': { ja: '機能を開く', en: 'Open the function' },
'story.openFuncTech': { ja: '1C0 LOAD で初期化処理が走ります', en: '1C0 LOAD runs the initialization handler' },
'story.searchInput': { ja: '検索条件を入力 → [検索]ボタン押下', en: 'Enter search conditions → press [Search]' },
'story.searchInputTech': { ja: '0S00 SEARCH_BEFORE → SELECT文発行 → 0S01 SEARCH_AFTER の順で実行',
en: '0S00 SEARCH_BEFORE → issue SELECT → 0S01 SEARCH_AFTER, in order' },
'story.showResults': { ja: '検索結果を明細に表示', en: 'Display search results in the list' },
'story.showResultsTech': { ja: 'ページャあり / 各 LIST ブロックに行を展開',
en: 'With pager; each LIST block is populated with rows' },
'story.editRows': { ja: '明細を編集 (登録/更新/削除)', en: 'Edit rows (insert/update/delete)' },
'story.editRowsTech': { ja: 'FOCUS OUT JavaScript (1C4) でリアルタイム検証',
en: 'FOCUS OUT JavaScript (1C4) provides real-time validation' },
'story.confirm': { ja: '[確定]ボタン押下', en: 'Press [Confirm] button' },
'story.confirmTech': { ja: '0S100 UPDATE_BEFORE → INSERT/UPDATE/DELETE → 0S101 UPDATE_AFTER / 失敗時はロールバック',
en: '0S100 UPDATE_BEFORE → INSERT/UPDATE/DELETE → 0S101 UPDATE_AFTER / rollback on failure' },
'story.batExec': { ja: '[処理実行]ボタン押下 (検索なし)', en: 'Press [Run] button (no search)' },
'story.batExecTech': { ja: 'BUTTON_BAT 系のサーバJSが直接走ります', en: 'BUTTON_BAT server JS runs directly' },
'story.subLaunch': { ja: '当機能を子画面として呼出', en: 'Launch this function as a sub-screen' },
'story.subLaunchTech': { ja: 'SUB_SEARCH/LOOK_UP 経由で起動 → 親画面に値を返却',
en: 'Launched via SUB_SEARCH/LOOK_UP → returns value to the parent' },
'story.flowMain': { ja: 'ユーザ [入力] ──▶ JS処理前 ──▶ SQL発行 ──▶ JS処理後 ──▶ 結果表示',
en: 'User [input] ──▶ Pre-JS ──▶ SQL ──▶ Post-JS ──▶ Render result' },
'story.flowConfirm': { ja: ' └ [確定] ──▶ JS処理前(全体) ──▶ INSERT/UPDATE/DELETE ──▶ JS処理後(全体)',
en: ' └ [Confirm] ──▶ Pre-JS(global) ──▶ INSERT/UPDATE/DELETE ──▶ Post-JS(global)' },
// インデックス: 業務分類未設定
'idx.bgL.unset': { ja: '(業務分類大: 未設定)', en: '(Large category: not set)' },
'idx.bgM.unset': { ja: '(中: 未設定)', en: '(Medium: not set)' },
'idx.bgS.unset': { ja: '(小: 未設定)', en: '(Small: not set)' },
'idx.funcCount': { ja: '出力件数: {0} 機能', en: '{0} functions' },
'idx.summary': { ja: '業務分類 (大 / 中 / 小) ごとにグルーピングし、各グループ内は機能ID 昇順で表示。リンクをクリックすると個別の機能設計書 (HTML / Markdown) が開きます。',
en: 'Grouped by business category (Large / Medium / Small); within each group sorted by Function ID. Click a link to open the function document (HTML / Markdown).' },
'idx.groupCount': { ja: '{0} 機能', en: '{0} functions' },
'idx.writer.title': { ja: 'DB 更新あり', en: 'has DB write' },
// Markdown セクション見出し / TH ラベル群
'md.langCaption': { ja: '言語', en: 'Language' },
'md.dataVer': { ja: 'データ版数 (設定の最終更新)', en: 'Data version (last setting update)' },
'md.funcId': { ja: '機能ID', en: 'Function ID' },
'md.funcNm': { ja: '機能名', en: 'Function name' },
'md.funcType': { ja: '機能タイプ', en: 'Function type' },
'md.adminId': { ja: 'ADMIN_ID', en: 'ADMIN_ID' },
'md.bgL': { ja: '業務分類 大', en: 'Business category (large)' },
'md.bgM': { ja: '業務分類 中', en: 'Business category (medium)' },
'md.bgS': { ja: '業務分類 小', en: 'Business category (small)' },
'md.created': { ja: '作成', en: 'Created' },
'md.lastUpdate': { ja: '最終更新', en: 'Last update' },
'md.outline': { ja: '機能概要', en: 'Outline' },
'md.note': { ja: '備考', en: 'Note' },
'md.none': { ja: '(なし)', en: '(none)' },
'md.noCondItems': { ja: '(条件項目なし)', en: '(no condition items)' },
'md.funcDesc': { ja: '機能説明', en: 'Function description' },
'md.fixupNotes': { ja: '改修時の注意', en: 'Notes for modification' },
'md.menuPos': { ja: 'メニュー位置', en: 'Menu position' },
'md.appSettings': { ja: 'アプリケーション設定', en: 'Application settings' },
'md.appBaseSetting': { ja: '機能レベル設定一覧', en: 'Function-level settings' },
'md.appBaseHint': { ja: 'TLN_M_GENERAL_APP (FUNC_SEQ=-1) に登録されている全ての設定値。非表示フラグや個別セクションで重複して表示される設定も含む。', en: 'All settings stored in TLN_M_GENERAL_APP (FUNC_SEQ=-1). Includes settings also shown in hide-flag table or other sections.' },
'md.btnPosition': { ja: 'ボタン位置移動', en: 'Button positioning' },
'md.btnPositionHint': { ja: 'BUTTON_DSP_POS で設定されたボタンの配置位置とマージン。', en: 'Button placement positions and margins via BUTTON_DSP_POS.' },
'md.btnPositionPos': { ja: '配置位置', en: 'Position' },
'md.btnPositionMargin': { ja: 'マージン (上/下/左/右)', en: 'Margin (T/B/L/R)' },
'md.condAggr': { ja: '検索条件 (集約)', en: 'Search conditions (aggregated)' },
'md.blockSettings': { ja: 'ブロック設定', en: 'Block settings' },
'md.deps': { ja: '依存関係', en: 'Dependencies' },
'md.flPosition': { ja: 'フリーレイアウト POSITION', en: 'Free layout POSITION' },
'md.masters': { ja: 'マスタ参照', en: 'Master references' },
'md.codebook': { ja: 'コードブック', en: 'Code book' },
'md.userGroup': { ja: 'ユーザグループ', en: 'User group' },
'md.hideButtonSetting': { ja: '標準ボタン非表示設定', en: 'Standard button visibility' },
'md.tabHidden': { ja: '非表示', en: 'Hidden' },
'md.tabShown': { ja: '表示', en: 'Shown' },
'md.tabBtn': { ja: 'ボタン', en: 'Button' },
'md.tabState': { ja: '状態', en: 'State' },
'md.btnPdf': { ja: 'PDF出力', en: 'PDF output' },
'md.btnExcel': { ja: 'Excel出力', en: 'Excel output' },
'md.btnExcelUpd': { ja: 'Excel更新', en: 'Excel update' },
'md.btnClear': { ja: 'クリア', en: 'Clear' },
'md.btnSearch': { ja: '検索', en: 'Search' },
'md.btnBack': { ja: '戻る', en: 'Back' },
'md.btnExecute': { ja: '確定', en: 'Confirm' },
'md.btnView': { ja: '参照', en: 'View' },
'md.btnScreenSetting': { ja: '画面設定', en: 'Screen settings' },
'md.btnCondSave': { ja: '検索条件保存', en: 'Save conditions' },
'md.btnCondTitle': { ja: '検索条件タイトル', en: 'Condition title' },
'md.btnBlockName': { ja: 'ブロック名', en: 'Block name' },
'md.refWriteTable': { ja: '参照先テーブル (書き込み)', en: 'Referenced tables (write)' },
'md.refReadTable': { ja: '参照先テーブル (読み取りのみ)', en: 'Referenced tables (read only)' },
'md.refFuncs': { ja: '参照先機能', en: 'Referenced functions' },
'md.refLibs': { ja: '参照先共通ライブラリ', en: 'Referenced shared libraries' },
'md.calledFrom': { ja: '被参照 (呼出元機能)', en: 'Referenced from (caller functions)' },
'md.codeJs': { ja: 'JavaScript / 各種コード', en: 'JavaScript / code' },
'md.codeLibs': { ja: '共通ライブラリ', en: 'Shared libraries' },
'md.cdHanyo': { ja: '汎用CD (TLN_M_HANYO_CODE_MAIN)', en: 'General code (TLN_M_HANYO_CODE_MAIN)' },
'md.cdHanyoClass': { ja: '汎用階層 (TLN_M_HANYO_CLASS)', en: 'General hierarchy (TLN_M_HANYO_CLASS)' },
'md.cdSaiban': { ja: '採番 (TLN_M_SEQ_PARAMETER)', en: 'Numbering (TLN_M_SEQ_PARAMETER)' },
'md.cdCalendar': { ja: 'カレンダー (TLN_M_CALENDAR)', en: 'Calendar (TLN_M_CALENDAR)' },
'md.cdDetail': { ja: '詳細設定', en: 'Detail settings' },
'md.cdItem': { ja: '項目情報', en: 'Item information' },
'md.cdSelectExpr': { ja: 'SELECT 式', en: 'SELECT formula' },
'md.cdBlockComposition': { ja: 'ブロック構成', en: 'Block composition' },
'md.cdCsvOut': { ja: 'CSV出力', en: 'CSV output' },
'md.cdCsvLoad': { ja: 'CSV登録 (▶ クリックまたはファイルをドロップ)',
en: 'CSV upload (▶ Click or drop file)' },
'md.refWarnTitle': { ja: '> **✎ テーブル参照解析の注意事項**\n>\n',
en: '> **✎ Notes on table reference analysis**\n>\n' },
'md.refWarnMethod': { ja: '> - テーブル参照は `UPDATE_TABLE` 設定 + ブロック SELECT 式 (BODY_SQL/TITLE_SQL) + JavaScript コード (CHR_TEXT) + 呼び出すストアドプロシージャ本体 (Oracle / PostgreSQL / MySQL / SQL Server) を `FROM` / `JOIN` / `INSERT INTO` / `UPDATE ... SET` / `DELETE FROM` / `MERGE INTO` / `REPLACE INTO` / `MERGE ... USING` の正規表現で抽出した結果です。 動的SQLは文字列リテラルが DML 文で始まる場合のみ抽出します。\n',
en: '> - Table references come from regex analysis of `UPDATE_TABLE` settings, block SELECT formulas (BODY_SQL/TITLE_SQL), JavaScript (CHR_TEXT) and called stored procedure bodies (Oracle / PostgreSQL / MySQL / SQL Server) for `FROM` / `JOIN` / `INSERT INTO` / `UPDATE ... SET` / `DELETE FROM` / `MERGE INTO` / `REPLACE INTO` / `MERGE ... USING` keywords. Dynamic SQL is extracted only when a string literal starts with a DML statement.\n' },
'md.refWarnDefs': { ja: '> - **書き込み** = INSERT/UPDATE/DELETE/MERGE が検出されたテーブル / **読み取り** = FROM/JOIN のみのテーブル\n',
en: '> - **Write** = tables detected by INSERT/UPDATE/DELETE/MERGE / **Read** = tables referenced only by FROM/JOIN\n' },
'md.refWarnMissing': { ja: '> - **⚠ 抜け・漏れの可能性**: コード内で動的に組み立てられた SQL、変数連結、条件分岐内の SQL は検出できない場合があります。\n',
en: '> - **⚠ Possible omissions**: SQL strings built dynamically by concatenation or in conditional branches may not be detected.\n' },
'md.refWarnScope': { ja: '> - **⚠ 対象外**: ストアドプロシージャ本体は Oracle / PostgreSQL / MySQL / SQL Server に対応 (DB2 等は今後)。 プロシージャから更に呼ぶ別プロシージャ、 BODY_SQL/JS 直書きの CALL/EXEC、 外部 API 経由、 トリガ連動は含まれません。 動的SQLの変数組み立てテーブル名も対象外 (リテラル完結分は抽出)。\n',
en: '> - **⚠ Out of scope**: stored procedure bodies are analyzed for Oracle / PostgreSQL / MySQL / SQL Server (DB2 etc. later). Nested procedure calls, CALL/EXEC written directly in BODY_SQL/JS, external APIs, and triggers are not included. Table names built from variables in dynamic SQL are also out of scope (complete literals are extracted).\n' },
'md.refWarnNoteTag': { ja: '> - **✎ 補完 (備考タグ)**: 解析で捕捉できない依存は 機能説明タブの備考に `[R:テーブル名]` (読み) / `[W:テーブル名]` (書き) / `[WR:テーブル名]` (読み書き) と記入すると依存として取り込まれます (1タグ1テーブル、 文章中に埋め込み可)。 `@番号` で複数DB接続の接続先を明示できます (例 `[W:LOG_TBL@2]`。 省略時は機能の DB 接続先)。\n\n',
en: '> - **✎ Supplement (Note tags)**: dependencies the analysis cannot capture can be declared in the Note field of the function description tab as `[R:TABLE]` (read) / `[W:TABLE]` (write) / `[WR:TABLE]` (read+write) — one table per tag, embeddable in plain text. Append `@N` to specify a multi-DB connection target (e.g. `[W:LOG_TBL@2]`; defaults to the DB connection of the function).\n\n' },
'md.warnRefMsg': { ja: '> ⚠ この機能は **{0}** 件の参照を他機能から受けています。改修時は呼出元の動作確認が必要です。\n\n',
en: '> ⚠ This function is referenced by **{0}** other functions. Verify the callers when modifying.\n\n' },
'md.libNote': { ja: '_TLN_M_HANYO_CODE_MAIN.SIKIBETU_CODE in (TLN_GENERAL_JAVASCRIPT_ENGINE / TLN_GENERAL_JAVASCRIPT / TLN_GENERAL_CLIENT_JAVASCRIPT / TLN_GENERAL_CSS / TLN_GENERAL_CSS_STR) からマップ。「全て」モード時は該当種別の全ライブラリ、「個別」モード時は CHR1 で指定されたものだけ。_\n\n',
en: '_Mapped from TLN_M_HANYO_CODE_MAIN.SIKIBETU_CODE in (TLN_GENERAL_JAVASCRIPT_ENGINE / TLN_GENERAL_JAVASCRIPT / TLN_GENERAL_CLIENT_JAVASCRIPT / TLN_GENERAL_CSS / TLN_GENERAL_CSS_STR). "All" mode = all libraries of that kind; "Individual" mode = only the one specified by CHR1._\n\n' },
'md.libModeAll': { ja: '[全て]', en: '[All]' },
'md.libModeIndividual': { ja: '[個別]', en: '[Individual]' },
'md.serverJs': { ja: 'サーバ JS', en: 'Server JS' },
'md.clientJs': { ja: 'クライアント JS', en: 'Client JS' },
'md.cssLib': { ja: 'CSS ライブラリ', en: 'CSS library' },
'md.serverJsLib': { ja: 'サーバJS ライブラリ', en: 'Server JS library' },
'md.storedProc': { ja: 'ストアドプロシージャ', en: 'Stored procedure' },
'cb.procPlace': { ja: '設定箇所: ', en: 'Configured at: ' },
'cb.procPlaceConfirmBefore': { ja: '確定処理前プロシージャ', en: 'Pre-confirm procedure' },
'cb.procPlaceConfirmAfter': { ja: '確定処理後プロシージャ', en: 'Post-confirm procedure' },
'cb.procPlaceDlBefore': { ja: '検索前プロシージャ (引出)', en: 'Pre-search procedure (DL)' },
'cb.procPlaceDlAfter': { ja: '検索後プロシージャ (引出)', en: 'Post-search procedure (DL)' },
'cb.procPlaceSearchBefore': { ja: 'DB検索前プロシージャ', en: 'Pre-search procedure' },
'cb.procPlaceSearchAfter': { ja: 'DB検索後プロシージャ', en: 'Post-search procedure' },
'cb.procPlaceBatButton': { ja: '処理呼出ボタン', en: 'Procedure call button' },
'cb.funcLevel': { ja: '機能レベル', en: 'Function level' },
'ofc.resolvedHead': { ja: '呼出先ブロックの解決', en: 'Resolved callee block' },
'ofc.calleeFunc': { ja: '呼出先機能', en: 'Callee function' },
'ofc.calleeBlock': { ja: '呼出先ブロック', en: 'Callee block' },
'ofc.updateTable': { ja: '更新テーブル', en: 'Update table' },
'md.clientJsLib': { ja: 'クライアントJS ライブラリ', en: 'Client JS library' },
'md.fromJoinExtracted': { ja: '_FROM / JOIN 句から抽出_\n\n', en: '_Extracted from FROM / JOIN clauses_\n\n' },
'md.iudExtracted': { ja: '_INSERT/UPDATE/DELETE/MERGE/UPDATE_TABLE 設定_\n\n',
en: '_INSERT/UPDATE/DELETE/MERGE/UPDATE_TABLE settings_\n\n' },
'md.wholeFunc': { ja: '(機能全体)\n\n', en: '(Whole function)\n\n' },
'md.blockNoCol': { ja: 'ブロックNo', en: 'Block#' },
'md.callerFuncId': { ja: '呼出元機能ID', en: 'Caller function ID' },
'md.itemNameCol': { ja: '項目名', en: 'Column name' },
'md.kindCol': { ja: '種別', en: 'Kind' },
'md.settingKindCol': { ja: '設定種別', en: 'Setting kind' },
'md.aggrTitle': { ja: '集約元 ({0}件)', en: 'Aggregated from ({0})' },
'md.notRegistered': { ja: '(マスタ未登録)', en: '(Not in master)' },
'md.sortCol': { ja: '並び', en: 'Sort' },
'md.valueCol': { ja: '値', en: 'Value' },
'md.dispName': { ja: '表示名', en: 'Display name' },
'md.dataType': { ja: 'データ型', en: 'Data type' },
'md.digits': { ja: '桁', en: 'Digits' },
'md.dispFormat': { ja: '表示形式', en: 'Display format' },
'md.crFlg': { ja: '改行', en: 'Line break' },
'md.aggrCount': { ja: '集約数', en: 'Count' },
'md.aggrSrc': { ja: '集約元', en: 'Sources' },
'th.bunrui': { ja: '分類', en: 'Category' },
// === チャート系 (ガント / カレンダー / グラフ) ===
'chart.kind.bar': { ja: '棒', en: 'Bar' },
'chart.kind.line': { ja: '折れ線', en: 'Line' },
'chart.kind.area': { ja: '折れ線エリア', en: 'Line area' },
'chart.kind.spline': { ja: '曲線', en: 'Spline' },
'chart.kind.area_spline': { ja: '曲線エリア', en: 'Spline area' },
'chart.kind.step': { ja: '階段', en: 'Step' },
'chart.kind.area_step': { ja: '階段エリア', en: 'Step area' },
'chart.kind.pie': { ja: '円', en: 'Pie' },
'chart.kind.donut': { ja: 'ドーナツ', en: 'Donut' },
'chart.kind.scatter': { ja: '散布図', en: 'Scatter' },
'chart.bySeries': { ja: ' + 系列別: ', en: ' + by series: ' },
'chart.seriesFields': { ja: '系列項目: ', en: 'Series fields: ' },
'chart.taskCodeLabel': { ja: 'タスクコード=', en: 'Task code=' },
'chart.taskNameLabel': { ja: ' / タスク表示名=', en: ' / Task name=' },
'chart.startLabel': { ja: ' / 開始=', en: ' / Start=' },
'chart.endLabel': { ja: ' / 終了=', en: ' / End=' },
'chart.eventLabel': { ja: ' / イベント: ', en: ' / Event: ' },
'chart.tooltipLabel': { ja: ' ツールチップ=', en: ' Tooltip=' },
'chart.relationLabel': { ja: ' / 関係線: ', en: ' / Relations: ' },
'chart.dispFormulaLabel': { ja: ' / 表示式: ', en: ' / Display formula: ' },
'chart.eventContent': { ja: '内容=', en: 'Content=' },
'chart.calendarCodeLabel': { ja: 'カレンダー識別=', en: 'Calendar code=' },
'th.classCode': { ja: '階層', en: 'Hierarchy' },
'th.taskCode': { ja: 'タスク', en: 'Task' },
'th.saibanKind': { ja: '種別', en: 'Kind' },
'th.saibanKindFix': { ja: '固定値', en: 'Fixed' },
'th.saibanKindAgg': { ja: '集計キー', en: 'Aggregate key' },
'th.saibanKindSeq': { ja: '連番桁数', en: 'Sequence digits' },
// === HTML 細部のラベル / アイコン付き文言 ===
'btn.pdf': { ja: '▦ PDF出力', en: '▦ PDF out' },
'btn.excel': { ja: '▦ Excel出力', en: '▦ Excel out' },
'btn.excelUpdate': { ja: '▦ 更新Excel出力', en: '▦ Update Excel out' },
// V3-5 round7 2026-05-28: 「Excel更新」 (= Excel ファイルを取込みレコード更新) は
// 「更新Excel出力」 (= Excel ファイルを書き出し編集後 取込み) とは別ボタン。
// マスタ #00530: EXCELUPDATE_BUTTON_HDN_FLG は「Excel更新」 側の非表示制御。
'btn.excelImport': { ja: '▦ Excel更新', en: '▦ Excel update' },
'btn.excelMaintain': { ja: 'Excel更新', en: 'Excel update' },
'btn.screenSetting': { ja: '⚙ 画面設定', en: '⚙ Screen settings' },
'btn.clear': { ja: 'クリア', en: 'Clear' },
'btn.search': { ja: '検索', en: 'Search' },
'btn.back': { ja: '戻る', en: 'Back' },
'btn.save': { ja: '保存', en: 'Save' },
'btn.delete': { ja: '削除', en: 'Delete' },
'btn.addRow': { ja: '行追加', en: 'Add row' },
'btn.close': { ja: '✕ 閉じる', en: '✕ Close' },
'visual.hidden': { ja: '✕ 非表示', en: '✕ Hidden' },
'visual.hiddenItem': { ja: '非表示項目 (COMPONENT=HIDDEN または DISP_NAME 空欄)',
en: 'Hidden item (COMPONENT=HIDDEN or DISP_NAME empty)' },
'visual.hiddenItemShort': { ja: '非表示項目', en: 'Hidden item' },
'visual.hiddenByUses': { ja: '表示項目設定で非表示 (TLN_M_GENERAL_USES.LIST 未登録 または FLAG=1)',
en: 'Hidden by display item config (not in TLN_M_GENERAL_USES.LIST or FLAG=1)' },
'visual.toLastRow': { ja: '最終行へ', en: 'Last row' },
'visual.toRowN': { ja: '行目へ', en: 'Go to row' },
'visual.addRow': { ja: '行追加', en: 'Add row' },
'visual.savedCondPh': { ja: '(保存条件名)', en: '(saved name)' },
'visual.initialCond': { ja: '起動時の初期条件にする', en: 'Use as initial conditions' },
'visual.condFreeNote': { ja: '(フリー検索条件)', en: '(free conditions)' },
'visual.condStdNote': { ja: '(検索単票配置)', en: '(single search layout)' },
'visual.condEmpty': { ja: '(条件項目なし)', en: '(no condition items)' },
'visual.condError': { ja: '(検索単票配置データを取得できませんでした)',
en: '(failed to retrieve single search layout)' },
'visual.blockEmpty': { ja: '(項目情報なし)', en: '(no item information)' },
'visual.itemSelect': { ja: '(項目選択)', en: '(select item)' },
'visual.chooseSelect': { ja: '(選択)', en: '(select)' },
'visual.unsetSpan': { ja: '(未設定)', en: '(not set)' },
'visual.searchResultsZero':{ ja: '▼ 検索結果: 0件', en: '▼ Search results: 0' },
'visual.searchCondHead': { ja: '▼ 検索条件', en: '▼ Search conditions' },
'visual.sampleNote': { ja: '※ サンプル描画。実データではありません',
en: '※ Sample render. Not actual data.' },
'visual.sampleNoteGantt': { ja: '※ サンプル描画 (バー描画は固定14日)。',
en: '※ Sample render (bars are fixed 14 days).' },
'visual.sampleRender': { ja: 'サンプル描画', en: 'Sample render' },
'visual.chartType': { ja: 'グラフ種類:', en: 'Chart type:' },
'visual.gantt': { ja: 'ガントチャート', en: 'Gantt chart' },
'visual.calendar': { ja: 'カレンダー', en: 'Calendar' },
'visual.allRowSelect': { ja: '=1: 全選択チェック', en: '=1: Select-all check' },
'visual.delPermission': { ja: '=1: 行削除権限あり', en: '=1: Has delete permission' },
'visual.canHideEq1': { ja: '=1 で非表示可能', en: '=1 to hide' },
'visual.canHideEq1List': { ja: '=1 で非表示可能。明細(LIST)ブロックがある機能のみ表示',
en: '=1 to hide. Shown only for functions with LIST blocks.' },
'visual.subSearch': { ja: '(検索子画面)', en: '(sub-search screen)' },
'visual.libUsageScope': { ja: '使用:', en: 'Used by:' },
'visual.posOrphan': { ja: '(orphan)', en: '(orphan)' },
'visual.emptyCell': { ja: '空きセル', en: 'Empty cell' },
'sec.rawData': { ja: '□ 生データ (DBレコード)', en: '□ Raw data (DB records)' },
'sec.rawPosition': { ja: '□ POSITION テーブル生データ ({0}件)', en: '□ POSITION raw data ({0})' },
'sec.commonLib': { ja: '≣ 共通ライブラリ ({0})', en: '≣ Common libraries ({0})' },
'sec.storedProcCount': { ja: '⛁ ストアドプロシージャ ({0})', en: '⛁ Stored procedures ({0})' },
'sec.serverJsCount': { ja: '■ サーバー側 JS ({0})', en: '■ Server-side JS ({0})' },
'sec.clientJsCount': { ja: '● クライアント JS ({0})', en: '● Client JS ({0})' },
'sec.sqlCount': { ja: '◐ SQL ({0})', en: '◐ SQL ({0})' },
'sec.otherCount': { ja: '⚪ その他 ({0})', en: '⚪ Other ({0})' },
'sec.cellPlacement': { ja: '≡ ブロック内のセル配置 (SCOPE=BLOCK)',
en: '≡ Cell placement inside block (SCOPE=BLOCK)' },
'sec.resultAreaPlacement': { ja: '∠ 結果エリアのブロック配置 (RESULT_AREA)',
en: '∠ Result area block placement (RESULT_AREA)' },
'sec.callerHead': { ja: '⬅ 呼出元', en: '⬅ Called by' },
'sec.refHead': { ja: '参照先 ➡', en: 'References ➡' },
'sec.menuNode': { ja: 'メニュー', en: 'Menu' },
'sec.writeNode': { ja: '書き込み ({0})', en: 'Write ({0})' },
'sec.readNode': { ja: '読み取り ({0})', en: 'Read ({0})' },
'sec.readWriteNode': { ja: '読み書き ({0})', en: 'Read+Write ({0})' },
'sec.tblNotInDb': { ja: 'DB未検出', en: 'Not in DB' },
'sec.tblNotInDbTip': { ja: 'コードからは参照されているが物理 DB に存在しないため ER 図には出力されません', en: 'Referenced by code but not present in the physical DB, so it is not shown in the ER diagram' },
'sec.libsHead': { ja: '≣ 参照先共通ライブラリ', en: '≣ Referenced libraries' },
'sec.itemsAddtl': { ja: '▼ 追加設定 (代表項目)', en: '▼ Additional (typical item)' },
'sec.aggrSrc': { ja: '▼ 集約元 ({0}件)', en: '▼ Aggregated from ({0})' },
'sec.codeNone': { ja: 'JS/SQL コードはありません', en: 'No JS/SQL code.' },
'note.starKey': { ja: '★キー項目', en: '★ Key' },
'note.starUpdate': { ja: '★更新', en: '★ Update' },
'note.starSearch': { ja: '★検索項目', en: '★ Search' },
'note.starUpdateRequired': { ja: '★更新必須', en: '★ Required' },
'note.starCrFlg': { ja: '★改行', en: '★ Line break' },
'note.divider': { ja: '────────', en: '────────' },
'note.additional': { ja: '▼ 追加設定', en: '▼ Additional' },
'note.kbnFlag0': { ja: '0:参照', en: '0: View' },
'note.kbnFlag1': { ja: '1:更新', en: '1: Update' },
'note.unsetMaster': { ja: '<em>未設定</em>', en: '<em>(not set)</em>' },
'pos.fl.helpHint': { ja: '画面の結果エリアを CSS Grid 状に区切り、各セルにブロックを配置する設定です。FUNC_SEQ が指定された行はそのブロックを配置、空欄行はレイアウト用の空セルです。',
en: 'Divides the result area as a CSS Grid; FUNC_SEQ rows place that block, empty rows are layout-only empty cells.' },
'pos.block.cellPlacement': { ja: '各ブロック内部の項目配置 (TH/TDセル) です。POS は階層キー、ROW_NUM/COL_NUM = 配置、ROW_SPAN/COL_SPAN = 結合。TH=ヘッダ・TD=データ。',
en: 'Per-block item placement (TH/TD cells). POS = hierarchy key, ROW_NUM/COL_NUM = position, ROW_SPAN/COL_SPAN = span. TH=header, TD=data.' },
// 機能レベルオプション (renderFuncLevelOptn)
'optn.appReport': { ja: '帳票出力', en: 'Report output' },
'optn.appOtherNext': { ja: '他画面呼出', en: 'Other screen call' },
'optn.appAjax': { ja: '非同期通信', en: 'Async (AJAX)' },
'optn.appSendMail': { ja: '確定後のメール送信', en: 'Send mail after confirm' },
'optn.blockProc': { ja: '処理呼出', en: 'Procedure call' },
'optn.blockReport': { ja: '帳票出力', en: 'Report output' },
'optn.blockOtherNext': { ja: '他画面呼出', en: 'Other screen call' },
'optn.blockFileIo': { ja: 'ファイル入出力', en: 'File I/O' },
'optn.blockOtherFunc': { ja: '他機能呼出', en: 'Other function call' },
// EDM ガバナンス警告 (Ver0.55: EDM 属性の宣言先が別のデータドメイン)
'edmw.declMismatch.title': { ja: '宣言先が別のデータドメイン (EDM属性の宣言)',
en: 'Declaration points to a different data domain (EDM attribute)' },
'edmw.declMismatch.note': { ja: '業務データ辞書の物理属性から宣言した EDM 属性が、EDM 上では別のデータドメインに割り当てられています。宣言による繋がりはそのまま作られますが、辞書と EDM のどちらかが古い可能性があります。宣言先のドメイン欄を宣言元と同じデータドメインに揃えるか、宣言を見直してください。',
en: 'An EDM attribute declared from a physical attribute of the business data dictionary is assigned to a different data domain in the EDM. The link is still created, but either the dictionary or the EDM may be out of date. Align the domain column of the target attribute with the declaring data domain, or revise the declaration.' },
'edmw.declMismatch.resolvedTo': { ja: '解決先', en: 'resolves to' },
// 辞書メンテ (TLN_FUNC_DOC_DOMAIN_MAINTE) 確定時の警告
// {0}=物理属性 {1}=宣言先 (エンティティ.属性) {2}=解決先データドメイン名
'edmw.declMismatch.msg': { ja: '物理属性「{0}」の宣言先 EDM属性「{1}」は別のデータドメイン「{2}」に解決されます。繋がりは作られますが、EDM のドメイン欄をこのデータドメインに揃えるか、宣言を見直してください。',
en: 'EDM attribute "{1}" declared on physical attribute "{0}" resolves to a different data domain "{2}". The link is still created, but align the EDM domain column with this data domain, or revise the declaration.' },
// ★テスター指摘 No.131 (Ver0.56): データドメイン名称の同名重複は確定をブロックする
// (未登録のドメインを 2 人が同時に「書く」と同名が 2 件できてしまうため)
// ★Ver0.57: プロジェクト集合が重なる相手のときだけブロックする (重ならなければ警告)
// {0}=入力したデータドメイン名称 {1}=既存側 (名称 [DOMAIN_CD] (プロジェクト) の一覧)
'dom.dupMainNm.err': { ja: 'データドメイン名称「{0}」は既に登録されているため確定できません: {1} — 既存のデータドメインを検索して編集してください (プロジェクトが重ならない場合のみ同名を登録できます)',
en: 'Cannot save: the data domain name "{0}" is already registered: {1} — search for the existing data domain and edit it instead (the same name is allowed only when the projects do not overlap).' },
// ★Ver0.57: 同名だが プロジェクトが重ならない = 別コンテキストの別概念として登録を許す
// {0}=相手のプロジェクト名 {1}=データドメイン名称 {2}=相手の DOMAIN_CD
'dom.dupMainNm.warn': { ja: '他のプロジェクト({0})には同名のデータドメイン「{1}」({2})が存在しますが、プロジェクトが重ならないため登録します',
en: 'Another project ({0}) has a data domain with the same name "{1}" ({2}), but the projects do not overlap, so this one is registered.' },
// 同名判定の相手側ラベルで使う「プロジェクト未設定」(= 全プロジェクトと重なる) の表記
'dom.dupMainNm.noProj': { ja: 'プロジェクト未設定', en: 'no project' },
// ★テスター指摘 No.135 (Ver0.60): データドメイン名称が「他ドメインの物理属性」と衝突する。
// 名前解決は ①データドメイン名称 → ②物理属性 の 2 段 (_resolveEdmDomainCd) なので、
// ① が先に当たり、 これまで ② で相手ドメインに解決されていた名前を横取りする。
// 確定は止めない (同名異義の正当な登録もあるため) が、 何が起きるかを具体的に伝える。
// {0}=入力したデータドメイン名称 {1}=相手側 (名称 [コード](プロジェクト)/ 一致した物理属性)
'dom.dupAttrNm.warn': { ja: 'データドメイン名称「{0}」は既に別のデータドメインの物理属性として登録されています: {1} — 名前解決は「データドメイン名称 → 物理属性」の順に見るため、このまま登録すると「{0}」で引かれていた項目が相手のデータドメインからこちらへ移ります (名前解決の横取り)。相手のデータドメインを開いて書き足すか、名称をより具体的にすることを検討してください。別の概念であればこのまま登録して構いません',
en: 'The data domain name "{0}" is already registered as a physical attribute of another data domain: {1} — name resolution looks at data domain names before physical attributes, so registering it will take over the items that used to resolve to that domain. Open that data domain and add to it, or make this name more specific. If it is genuinely a different concept, you can keep it as is.' },
// 相手のプロジェクトが重ならない = 同じ出力に同居しない → 名前解決に影響しないので参考情報
'dom.dupAttrNm.info': { ja: '(参考) データドメイン名称「{0}」は別プロジェクトのデータドメインの物理属性として登録されています: {1} — プロジェクトが重ならず出力時に同居しないため、名前解決には影響しません',
en: '(FYI) The data domain name "{0}" is registered as a physical attribute of a data domain in a different project: {1} — they never appear in the same output, so name resolution is not affected.' },
// 相手側ラベルに併記する「一致した物理属性名」 {0}=物理属性名 (複数は区切り連結)
'dom.dupAttrNm.attr': { ja: '一致した物理属性: {0}',
en: 'matched physical attribute: {0}' },
// クライアントサイド (app.client.js 用)
'cli.dlReady': { ja: '機能設計書 ZIP の準備ができました',
en: 'Function Documents ZIP is ready' },
'cli.dlButton': { ja: '▼ {0} をダウンロード',
en: '▼ Download {0}' },
'cli.dlStarted': { ja: '✓ ダウンロードを開始しました',
en: '✓ Download started' },
'cli.dlMarkerCleaned': { ja: '機能設計書ZIPの準備が完了しました: {0}',
en: 'Function Documents ZIP prepared: {0}' },
// サーバ側出力 (Ver1.0.1): 出力履歴の一覧 index.html / 確定時メッセージ
'sv.title': { ja: 'Commonweal 設計書出力の履歴', en: 'Commonweal design document outputs' },
'sv.intro': { ja: '設計書出力をサーバに保存した履歴です(新しい順)。各行の「開く」で成果物のホームを開きます。',
en: 'Design document outputs saved on this server, newest first. Click "Open" to view the output home page.' },
'sv.count': { ja: '{0}件', en: '{0} runs' },
'sv.col.datetime': { ja: '出力日時', en: 'Output time' },
'sv.col.user': { ja: '利用者', en: 'User' },
'sv.col.funcs': { ja: '出力した機能', en: 'Functions' },
'sv.col.conditions': { ja: '検索条件', en: 'Search conditions' },
'sv.col.lang': { ja: '言語', en: 'Language' },
'sv.col.edition': { ja: 'プラン', en: 'Plan' },
'sv.col.open': { ja: '成果物', en: 'Output' },
'sv.open': { ja: '開く', en: 'Open' },
'sv.funcCount': { ja: '{0}機能', en: '{0} functions' },
'sv.funcMore': { ja: '他{0}件を表示', en: 'Show {0} more' },
'sv.noCondition': { ja: '(条件指定なし)', en: '(no conditions)' },
'sv.project': { ja: 'プロジェクト', en: 'Project' },
'sv.files': { ja: '{0}ファイル', en: '{0} files' },
'sv.zip': { ja: 'ZIPをダウンロード', en: 'Download ZIP' },
'sv.mdZip': { ja: 'AI向けMarkdown (ZIP)', en: 'Markdown for AI (ZIP)' },
'sv.empty': { ja: 'まだ出力はありません。', en: 'No outputs yet.' },
'sv.edition1': { ja: '① 無償', en: 'Free' },
'sv.edition2': { ja: '② 物理DB', en: 'Physical DB' },
'sv.edition3': { ja: '③ 全機能', en: 'Full' },
'sv.lang.ja': { ja: '日本語', en: 'Japanese' },
'sv.lang.en': { ja: '英語', en: 'English' },
// 検索条件キー → 表示名 (一覧の「検索条件」列。 未知のキーは物理名のまま。 動的参照 'cond.' + キー)
'cond.FUNC_ID': { ja: '機能ID', en: 'Function ID' },
'cond.FUNC_ID_IN': { ja: '機能ID(IN)', en: 'Function ID (IN)' },
'cond.FUNC_ID_LIKE': { ja: '機能ID(LIKE)', en: 'Function ID (LIKE)' },
'cond.FUNC_NM': { ja: '機能名', en: 'Function name' },
'cond.APP_KBN': { ja: 'アプリケーション区分', en: 'Application type' },
'cond.BG_L': { ja: '業務分類(大)', en: 'Business category (L)' },
'cond.BG_M': { ja: '業務分類(中)', en: 'Business category (M)' },
'cond.BG_S': { ja: '業務分類(小)', en: 'Business category (S)' },
'cond.FUNC_OUTLINE': { ja: '機能概要', en: 'Function outline' },
'msg.serverOutDone': { ja: 'サーバに出力しました: {0}', en: 'Saved on the server: {0}' },
'msg.serverOutFailed': { ja: 'サーバへの出力に失敗したため、ZIPダウンロードのみ行います: {0}',
en: 'Saving on the server failed, so only the ZIP download is provided: {0}' },
// ---- 機能設計書 MD の拡充 (Ver1.0.1): 生データ / データドメイン照合 ----
'md.rawData': { ja: '生データ (DB レコード)', en: 'Raw data (DB records)' },
'md.rawDataIntro': { ja: 'TALON リポジトリにある当機能のレコードを全列そのまま列挙します (設定画面に現れない列や、ブロックに紐付かない残存行も含む)。長文の列は表に参照番号だけを置き、本文は表の下にコードブロックで示します。',
en: 'Every repository record of this function with all columns (including columns not shown on screens and orphan rows not tied to any block). Long text columns are referenced by number in the table and listed below it.' },
'md.rawLongRef': { ja: '{0}文字 → #{1}', en: '{0} chars → #{1}' },
'md.rawLongHead': { ja: '長文列の本文', en: 'Long text columns' },
'md.domainTab': { ja: 'データドメイン照合', en: 'Data domain matching' },
'md.domainTabIntro': { ja: '当機能の画面項目と業務データ辞書 (データドメイン) の照合結果です。未登録項目は辞書に登録するか、システム列なら照合除外に登録してください。',
en: 'Result of matching the screen items of this function against the business data dictionary (data domains). Register unregistered items in the dictionary, or exclude them if they are system columns.' },
'md.domainUsed': { ja: '一致したデータドメイン', en: 'Matched data domains' },
'md.domainNoneUsed': { ja: '当機能の項目でデータドメインと一致するものはありませんでした。', en: 'No items in this function matched any registered domain.' },
'md.domainAmbig': { ja: '複数ドメイン一致 (要確認)', en: 'Ambiguous domain matches (needs review)' },
'md.domainUnreg': { ja: '未登録項目 (辞書未登録)', en: 'Unregistered items (not in the dictionary)' },
'md.domainItems': { ja: '{0}項目', en: '{0} items' },
'md.blockLevelFunc': { ja: '機能全体', en: 'function-level' },
// ---- ER.md の拡充 (Ver1.0.1): er-diagram.html と同等の情報 ----
'md.erIntro': { ja: 'テーブル / 列 / 外部キーを DB 接続先別に列挙し、er-diagram.html と同じ付加情報を付けます: 分類 (RESOURCE/EVENT 等)、業務分類 (テーブルを更新する機能の分類)、EDM エンティティ、使用機能 (✏ = 更新)、各列のデータドメイン照合 (⚠ 未登録 / 照合除外)。物理名はソース DB の元 case を保持し、論理名とコメントは COMMENT ON COLUMN / Description 由来です。',
en: 'Tables, columns, and foreign keys grouped by DB connection, with the same enrichment as er-diagram.html: entity kind, business category (by the functions that write the table), EDM entity, functions using the table (✏ = write), and the data-domain match of every column (⚠ unregistered / excluded). Physical names keep the source DB casing; logical names and comments come from COMMENT ON COLUMN / Description.' },
'md.erTableList': { ja: 'テーブル一覧', en: 'Table list' },
'md.erKind': { ja: '分類', en: 'Kind' },
'md.erBg': { ja: '業務分類 (メンテ機能基準)', en: 'Business category (by writer)' },
'md.erEdm': { ja: 'EDM', en: 'EDM' },
'md.erFuncs': { ja: '使用機能', en: 'Functions' },
'md.erWrite': { ja: '更新', en: 'write' },
'md.erRead': { ja: '参照', en: 'read' },
'md.erFuncCounts': { ja: '更新 / 参照 機能数', en: 'Write / read funcs' },
'md.erColCounts': { ja: '列数 / 子FK / 親FK', en: 'Cols / FK in / FK out' },
'md.erDomain': { ja: 'データドメイン', en: 'Data domain' },
'md.erUnreg': { ja: '未登録', en: 'unregistered' },
'md.erExcl': { ja: '照合除外', en: 'excluded' },
'md.erAmbig': { ja: '複数一致', en: 'ambiguous' },
'md.erIndexes': { ja: '索引 (インデックス)', en: 'Indexes' },
'md.erLogical': { ja: '論理名', en: 'Logical name' },
'md.erComment': { ja: 'コメント (説明)', en: 'Comment' },
'md.erFkRef': { ja: 'FK 参照先', en: 'FK reference' },
'md.erWarnUnreg': { ja: 'データドメイン 未登録の物理列', en: 'Physical columns not registered in any data domain' },
'md.erWarnUnregIntro': { ja: '以下の物理列はどのデータドメインにも一致せず、照合除外にも登録されていません。データドメインに登録するか、システム列なら照合除外に登録してください。',
en: 'These physical columns match no data domain and are not on the matching-exclusion list. Register a data domain, or exclude them if they are system columns.' },
'md.erWarnAmbig': { ja: 'データドメイン不整合 (1 列が複数ドメインに一致)', en: 'Data domain inconsistencies (a column matches multiple domains)' },
'md.erWarnLint': { ja: 'スキーマ整合性チェック', en: 'Schema integrity check' },
'md.erLintPkless': { ja: '更新対象だが主キーが検出できない (更新・複写・削除が不安定になる可能性)', en: 'update target but no primary key detected (update / copy / delete may be unstable)' },
'md.erNoWarn': { ja: '所見なし', en: 'no findings' }
};
TFC.t = function (key, lang) {
var entry = _labels[key];
if (!entry) return key;
var l = (lang === 'en') ? 'en' : 'ja';
return entry[l] != null ? entry[l] : (entry.ja != null ? entry.ja : key);
};
// ============================================================
// 機能下部バー (bottombar) ボタンカテゴリの表示順
// ============================================================
// TALON 実画面の慣行に従う左→右の順序を 1 配列にまとめる。
// 順序を変えたいときは この配列だけを変えれば全機能に波及する。
// 出力系 (PDF サイズ → PDF → Excel → 帳票 → ファイル → CSV出力)
// → 取込系 (CSV ドロップゾーン → Excel 更新 → CSV登録)
// → 通信系 (BAT 処理呼出 → AJAX 非同期)
// → 確定 (右側固定)
//
// 各キーは update-before.server.js の renderTlnBottombar 内のエミッタと対応する。
// 不明なキーは無視される (= レンダラに対応エミッタが無いカテゴリは安全に skip)。
TFC.BOTTOMBAR_CATEGORY_ORDER = [
'PDF_SIZE',
'PDF_BTN',
'EXCEL_BTN',
'BUTTON_REPORT',
'BUTTON_FILEIO',
'CSV_OUT_BUTTON',
'CSV_LOAD_DROPZONE',
'BUTTON_EXCEL_UPDATE',
'CSV_LOAD_BUTTON',
'BUTTON_BAT',
'BUTTON_AJAX'
];
// メッセージ内の {0}, {1} を args[0], args[1] で置換
TFC.tf = function (key, lang, args) {
var s = TFC.t(key, lang);
if (args && args.length) {
for (var i = 0; i < args.length; i++) {
s = s.split('{' + i + '}').join(args[i] != null ? String(args[i]) : '');
}
}
return s;
};
// ============================================================
// 言語・ラベル
// ============================================================
TFC.toLocale = function (lang) {
if (!lang) return Locale.JAPANESE;
var s = String(lang);
if (s.indexOf('_') > 0) {
var p = s.split('_');
return new Locale(p[0], p[1]);
}
if (s === 'ja') return Locale.JAPANESE;
if (s === 'en') return Locale.ENGLISH;
return new Locale(s);
};
// 5系 TALON は general_ja_JP.properties / general_en_US.properties 等、
// 国コード付きの ResourceBundle ファイル名を使用しているため、
// 6系のロケール (ja / en) で取得失敗した際の互換 fallback を提供する
TFC.toLocaleWithCountry = function (lang) {
var m = { ja: ['ja','JP'], en: ['en','US'], zh: ['zh','CN'], ko: ['ko','KR'] };
var s = String(lang || 'ja');
var p = m[s];
return p ? new Locale(p[0], p[1]) : null;
};
var _bundleCache = {};
// ResourceBundle 'general' は TALON 標準の翻訳リソース。
// 6系 (Payara 6.x / JDK 11): デフォルトの ResourceBundle.getBundle で成功。
// 5系 (Payara 5.2): Nashorn の eval クラスローダが WEB-INF/classes を見られず
// MissingResourceException になることがある。複数のクラスローダソースを順に試す:
// (1) Thread.currentThread().getContextClassLoader()
// (2) jp.talon.common.message.MessageManager のクラスローダ (TALON 本体クラスから取得)
// (3) ResourceBundle 自身のクラスローダ
// 各 classloader に対しさらに locale を (a) 国コード付き ja_JP / (b) 言語のみ ja で試行。
// 全て失敗した場合は null を返し、TFC.lbl は fallback / key で動作継続。
function _tryGetBundle(locale, classLoader) {
try {
return classLoader
? ResourceBundle.getBundle('general', locale, classLoader)
: ResourceBundle.getBundle('general', locale);
} catch (e) {
return null;
}
}
function _classLoaderSources() {
var srcs = [];
// (1) ContextClassLoader
try { srcs.push(Java.type('java.lang.Thread').currentThread().getContextClassLoader()); } catch (e) {}
// (2) TALON 本体クラスのクラスローダ (WEB-INF/classes 配下を読める想定)
var talonClasses = ['jp.talon.common.message.MessageManager',
'jp.talon.application.general.free.ap.process.ExecuteProcess'];
for (var i = 0; i < talonClasses.length; i++) {
try {
var T = Java.type(talonClasses[i]);
srcs.push(T.class.getClassLoader());
} catch (e) {}
}
// (3) ResourceBundle 自身のクラスローダ (フォールバック)
try { srcs.push(ResourceBundle.class.getClassLoader()); } catch (e) {}
// null や重複を除去
var seen = [], out = [];
for (var j = 0; j < srcs.length; j++) {
var cl = srcs[j];
if (!cl) continue;
if (seen.indexOf(cl) >= 0) continue;
seen.push(cl); out.push(cl);
}
return out;
}
TFC.getLabelBundle = function (lang) {
var key = lang || 'ja';
if (key in _bundleCache) return _bundleCache[key];
var loc = TFC.toLocale(key);
var locFb = TFC.toLocaleWithCountry(key);
var cls = _classLoaderSources();
var b = null;
// 各 classloader × 各 locale を試行
for (var ci = 0; !b && ci < cls.length; ci++) {
if (locFb) b = _tryGetBundle(locFb, cls[ci]);
if (!b) b = _tryGetBundle(loc, cls[ci]);
}
// 最後に引数なしも試行
if (!b && locFb) b = _tryGetBundle(locFb, null);
if (!b) b = _tryGetBundle(loc, null);
if (!b) {
try { TALON.getLogger().writeInfo('[TFC] ResourceBundle "general" 取得失敗 — fallback 文字列を使用 (key=' + key + ', tried ' + cls.length + ' classloaders)'); } catch (ignore) {}
} else {
try { TALON.getLogger().writeInfo('[TFC] ResourceBundle "general" 取得成功 (key=' + key + ')'); } catch (ignore) {}
}
_bundleCache[key] = b;
return b;
};
TFC.lbl = function (bundle, key, fallback) {
if (!bundle) return fallback != null ? fallback : key;
try {
return String(bundle.getString(key));
} catch (e) {
return fallback != null ? fallback : key;
}
};
// ============================================================
// エスケープ
// ============================================================
TFC.escapeHtml = function (s) {
if (s == null) return '';
return String(s)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
TFC.escapeAttr = function (s) {
if (s == null) return '';
return String(s)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
TFC.escapeMd = function (s) {
if (s == null) return '';
// テーブル区切り (|)、 コード (`)、 強調 (*)、 エスケープ自身 (\\) だけをエスケープする。
// _ ( ) [ ] # + - ! { } > は CommonMark ではテキスト中 (表のセル / 行の途中) で意味を持たず、
// 単語内の _ も強調にならない。 旧実装はこれらも \\ 付きにしていたため、 物理名や機能ID が
// `XDMF\\_BF100\\_0` のようになり AI / 検索の完全一致を壊していた (Ver1.0.1 で緩和)。
return String(s).replace(/([\\`*|])/g, '\\$1');
};
TFC.formatSql = function (s) {
if (s == null) return '';
return String(s).replace(/\r\n/g, '\n').replace(/\t/g, ' ').replace(/\n+$/, '');
};
// ============================================================
// APP_KBN ラベル ([TALON-DB設定マスタ.md] 出典)
// ============================================================
var APP_KBN_MAP = {
ja: { STD: '固定検索条件', FREE: 'フリー検索条件', SUB: '検索子画面', BAT: '検索ボタン無し' },
en: { STD: 'Fixed search condition', FREE: 'Free search condition', SUB: 'Sub search screen', BAT: 'No search button' }
};
TFC.appKbnLabel = function (appKbn, lang) {
var l = (lang && APP_KBN_MAP[lang]) ? lang : 'ja';
var m = APP_KBN_MAP[l];
return (m && m[appKbn]) || appKbn || '';
};
// ============================================================
// 項目情報の値マッピング
// ============================================================
// 出典: 公式マスタ #00316-#00321 (TALON_設定カタログ.md §12 / DB設定マスタ.csv)
// - 空/0: テキスト入力 (デフォルト)
// - 1: リストボックス
// - 2: 検索条件ラジオ/結果リスト
// - 3: 検索条件チェック/結果リスト
// - 4: ラジオボタン
// - 5: チェックボックス
// - 6: HIDDEN (非表示) — isHiddenItem() でこの値を検出
var COMPONENT_MAP = {
ja: {
'': 'テキスト入力', '0': 'テキスト入力',
'1': 'リストボックス',
'2': '検索条件ラジオ/結果リスト',
'3': '検索条件チェック/結果リスト',
'4': 'ラジオボタン',
'5': 'チェックボックス',
'6': 'HIDDEN (非表示)'
},
en: {
'': 'Text input', '0': 'Text input',
'1': 'List box',
'2': 'Search radio / result list',
'3': 'Search check / result list',
'4': 'Radio button',
'5': 'Checkbox',
'6': 'HIDDEN'
}
};
TFC.componentLabel = function (val, lang) {
var v = val == null ? '' : String(val);
var m = COMPONENT_MAP[lang === 'en' ? 'en' : 'ja'];
return (m && m[v]) || v;
};
// 出典: 公式マスタ #01441 + カタログ §12 DATA_TYPE 一覧
// - VARCHAR2: Java String
// - NUMBER: Java BigDecimal
// - DATE: Java java.sql.Date
// - DATETIME: Java Timestamp (※TIMESTAMP はエイリアスとして互換維持)
// - CLOB: Java String(CLOB)
var DATA_TYPE_MAP = {
ja: {
'VARCHAR2': '文字列 (VARCHAR2)',
'NUMBER': '数値 (NUMBER)',
'DATE': '日付 (DATE)',
'DATETIME': '日時 (DATETIME)',
'TIMESTAMP': '日時 (DATETIME)', // 互換エイリアス
'CLOB': 'CLOB (長文テキスト)'
},
en: {
'VARCHAR2': 'String (VARCHAR2)',
'NUMBER': 'Number (NUMBER)',
'DATE': 'Date (DATE)',
'DATETIME': 'Datetime (DATETIME)',
'TIMESTAMP': 'Datetime (DATETIME)',
'CLOB': 'CLOB (Large text)'
}
};
TFC.dataTypeLabel = function (val, lang) {
var v = val == null ? '' : String(val).toUpperCase();
var m = DATA_TYPE_MAP[lang === 'en' ? 'en' : 'ja'];
return (m && m[v]) || v;
};
// AUTO-GENERATED by tools/build_value_enum_js.py
// Source: talon-docs/_TALON仕様分析/DB設定/DB設定マスタ.csv (COL == DB_VALUE entries)
// 編集禁止 — 再生成するには `python tools/build_value_enum_js.py`
// 構造: VALUE_ENUMS[<FUNC_KBN>][<DB値>] = <表示名>
var VALUE_ENUMS = {
'ALL_REG_FLG': {
'1': 'ON',
},
'ALL_SELECT_CHECK': {
'1': 'ON',
},
'BACK_BUTTON_HDN_FLG': {
'1': 'ON',
},
'BACK_COLOR': {
'<': '<',
'<=': '<=',
'<>': '<>',
'=': '=',
'>': '>',
'>=': '>=',
'IN': 'IN',
'INFIX': 'INFIX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LIKE': 'LIKE',
'MACRO': 'マクロ',
'NOT IN': 'NOT IN',
'NOT LIKE': 'NOT LIKE',
'PREFIX': 'PREFIX',
'REG': '正規表現',
'SUFFIX': 'SUFFIX',
},
'BACK_COLOR_TR_KBN_': {
'MACRO': 'マクロ',
},
'BARCODE_FORMAT': {
'15%': '15%',
'25%': '25%',
'30%': '30%',
'7%': '7%',
'CODABAR': 'CODABAR',
'CODE_128': 'CODE 128',
'CODE_39': 'CODE 39',
'CODE_93': 'CODE 93',
'DATA_MATRIX': 'DATA MATRIX',
'EAN_13': 'EAN 13',
'EAN_8': 'EAN 8',
'ITF': 'ITF',
'QR': 'QR',
'UPC_A': 'UPC A',
'UPC_E': 'UPC E',
},
'BLOCK': {
'0': 'ON',
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'BLOCK_NAME_HDN_FLG': {
'1': 'ON',
},
'BUTTON_AJAX': {
'1': 'ON',
'INIT': '画面起動直後から',
'SEARCH': '初回検索ボタン押下後',
},
'BUTTON_BAT': {
'0': 'OFF',
'1': 'ON',
},
'BUTTON_BAT_': {
'TLN_LOGIN_BUMON': 'ログイン部門',
'TLN_LOGIN_USER': 'ログインID',
},
'BUTTON_NEXT': {
'0': '照会',
'1': 'ON',
'BTN_BTM': 'ボタンの下',
'BTN_R': 'ボタンの右',
'WIN_C_BTM': 'Window中央下',
'WIN_C_MDL': 'Window中央',
'WIN_C_TOP': 'Window中央上',
'WIN_L_BTM': 'Window左下',
'WIN_L_MDL': 'Window左中央',
'WIN_L_TOP': 'Window左上',
'WIN_R_BTM': 'Window右下',
'WIN_R_MDL': 'Window右中央',
'WIN_R_TOP': 'Window右上',
},
'BUTTON_NEXT_': {
'1': 'ON',
'<': '<',
'<=': '<=',
'<>': '<>',
'=': '=',
'>': '>',
'>=': '>=',
'BETWEEN': 'BETWEEN',
'IN': 'IN',
'INFIX': 'INFIX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LIKE': 'LIKE',
'NOT IN': 'NOT IN',
'NOT LIKE': 'NOT LIKE',
'PREFIX': 'PREFIX',
'SUFFIX': 'SUFFIX',
'TLN_LOGIN_BUMON': 'ログイン部門',
'TLN_LOGIN_USER': 'ログインID',
'day': 'day',
'dayGridMonth': 'month',
'halfYear': 'halfYear',
'hour': 'hour',
'minute': 'minute',
'month': 'month',
'quarterly': 'quarterly',
'second': 'second',
'timeGridDay': 'day',
'timeGridWeek': 'week',
'week': 'week',
'year': 'year',
},
'BUTTON_REPORT': {
'1': 'ON',
'2': 'ボタンと確定後',
'CLI_DIALOG': 'プリンタダイアログ表示',
'CLI_PRINTER': '通常使うプリンタに直接出力',
'DIALOG': 'プリンタダイアログ表示',
'EXCEL': 'EXCEL',
'PDF': 'PDF',
'PREVIEW': 'プレビュー印刷',
'PRINT': '通常使うプリンタに直接出力',
'PRINTER': 'サーバプリンタへ直接印刷',
'WORD': 'WORD',
},
'CAMMA_OFF': {
'1': 'ON',
},
'CHART': {
'0': '照会',
'1': 'ON',
'<': '<',
'<=': '<=',
'<>': '<>',
'=': '=',
'>': '>',
'>=': '>=',
'BETWEEN': 'BETWEEN',
'IN': 'IN',
'INFIX': 'INFIX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LIKE': 'LIKE',
'NOT IN': 'NOT IN',
'NOT LIKE': 'NOT LIKE',
'PREFIX': 'PREFIX',
'SUFFIX': 'SUFFIX',
'TLN_LOGIN_BUMON': 'ログイン部門',
'TLN_LOGIN_USER': 'ログインID',
'WIN_C_BTM': 'Window中央下',
'WIN_C_MDL': 'Window中央',
'WIN_C_TOP': 'Window中央上',
'WIN_L_BTM': 'Window左下',
'WIN_L_MDL': 'Window左中央',
'WIN_L_TOP': 'Window左上',
'WIN_R_BTM': 'Window右下',
'WIN_R_MDL': 'Window右中央',
'WIN_R_TOP': 'Window右上',
'area': '折れ線エリア',
'area_spline': '曲線エリア',
'area_step': '階段エリア',
'bar': '棒',
'bottom': '下',
'day': 'day',
'dayGridMonth': 'month',
'donut': 'ドーナツ',
'halfYear': 'halfYear',
'hour': 'hour',
'inner-bottom': '枠内下',
'inner-center': '枠内中央',
'inner-left': '枠内左',
'inner-middle': '枠内中央',
'inner-right': '枠内右',
'inner-top': '枠内上',
'line': '折れ線',
'minute': 'minute',
'month': 'month',
'outer-bottom': '枠外下',
'outer-center': '枠外中央',
'outer-left': '枠外左',
'outer-middle': '枠外中央',
'outer-right': '枠外右',
'outer-top': '枠外上',
'pie': '円',
'quarterly': 'quarterly',
'ratio': '比率',
'right': '右',
'scatter': '散布図',
'second': 'second',
'spline': '曲線',
'step': '階段',
'timeGridDay': 'day',
'timeGridWeek': 'week',
'value': '値',
'week': 'week',
'year': 'year',
},
'CHART_MARK': {
'<': '<',
'<=': '<=',
'<>': '<>',
'=': '=',
'>': '>',
'>=': '>=',
'IN': 'IN',
'INFIX': 'INFIX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LIKE': 'LIKE',
'MACRO': 'マクロ',
'NOT IN': 'NOT IN',
'NOT LIKE': 'NOT LIKE',
'PREFIX': 'PREFIX',
'REG': '正規表現',
'SUFFIX': 'SUFFIX',
},
'CLEAR_BUTTON_HDN_FLG': {
'1': 'ON',
},
'COL_BUTTON_HDN_FLG': {
'1': 'ON',
},
'CONDITION': {
'0': 'ON',
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'CONDITION_AREA': {
'1': '領域削除',
},
'COND_SAVE_HDN_FLG': {
'1': 'ON',
},
'CR_FLG_SEARCH': {
'1': 'ON',
},
'CSV_LOAD_BUTTON': {
'1': 'ON',
},
'CSV_LOAD_BUTTON_FILE': {
'1': 'ON',
'FIX': '固定長',
'VAR': '可変長',
},
'CSV_LOAD_BUTTON_OPTION': {
'"': '”',
'\'': '\'',
'1': 'ON',
'CAMMA': 'カンマ',
'EUC_JP': 'EUC',
'ISO-2022-JP': 'JISコード',
'ISO-8859-1': 'ASCII',
'NULL': 'なし',
'Shift_JIS': 'Shift_JIS',
'TAB': 'タブ',
'UTF-8': 'UTF-8',
},
'CSV_OUT_BUTTON': {
'1': 'ON',
},
'CSV_OUT_BUTTON_FILE': {
'FIX': '固定長',
'VAR': '可変長',
},
'CSV_OUT_BUTTON_OPTION': {
'"': '”',
'\'': '\'',
'1': 'ON',
'CAMMA': 'カンマ',
'EUC_JP': 'EUC',
'ISO-2022-JP': 'JISコード',
'ISO-8859-1': 'ASCII',
'NULL': 'なし',
'Shift_JIS': 'Shift_JIS',
'TAB': 'タブ',
'UTF-8': 'UTF-8',
'\\n': 'Lf',
'\\r': 'Cr',
'\\r\\n': 'CrLf',
},
'DELETE_FLG': {
'1': 'ON',
},
'DISP_POS': {
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'DRILL_DOWN': {
'1': 'ON',
},
'EXCELUPDATE_BTN_DISABLED_FLG': {
'1': 'ON',
},
'EXCELUPDATE_BUTTON_HDN_FLG': {
'1': 'ON',
},
'EXCEL_BUTTON_HDN_FLG': {
'1': 'ON',
},
'EXCLUSIVE_CONTROL_FLG': {
'1': 'ON',
},
'EXECUTE_BTN_HDN_FLG': {
'1': 'ON',
},
'EXE_DISP_INIT_FLG': {
'0': '初期化しない',
'1': '初期化する',
},
'EXE_DISP_TARGET_ONLY_FLG': {
'1': 'ON',
},
'EXE_TARGET_ONLY_FLG_NO_SEARCH': {
'1': 'ON',
},
'FIX_FORMULA': {
'<': '<',
'<=': '<=',
'<>': '<>',
'=': '=',
'>': '>',
'>=': '>=',
'BETWEEN': 'BETWEEN',
'IN': 'IN',
'INFIX': 'INFIX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LIKE': 'LIKE',
'NOT IN': 'NOT IN',
'NOT LIKE': 'NOT LIKE',
'PREFIX': 'PREFIX',
'SUFFIX': 'SUFFIX',
},
'FLAT_TEXT': {
'1': 'ON',
},
'FORE_COLOR': {
'1': 'ON',
'<': '<',
'<=': '<=',
'<>': '<>',
'=': '=',
'>': '>',
'>=': '>=',
'IN': 'IN',
'INFIX': 'INFIX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LIKE': 'LIKE',
'MACRO': 'マクロ',
'NOT IN': 'NOT IN',
'NOT LIKE': 'NOT LIKE',
'PREFIX': 'PREFIX',
'REG': '正規表現',
'SUFFIX': 'SUFFIX',
},
'FORE_COLOR_TR_KBN_': {
'MACRO': 'マクロ',
},
'FUNC_BUTTON_AREA_BTM': {
'0': 'ON',
'1': '領域削除',
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'FUNC_BUTTON_AREA_HEAD': {
'0': 'ON',
'1': '領域削除',
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'FUNC_BUTTON_AREA_TOP': {
'0': 'ON',
'1': '領域削除',
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'FUNC_TOP_AREA': {
'0': 'ON',
'1': '領域削除',
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'GANTT_DAY_GRID_INIT_VAL': {
'hour': 'hour',
'minute': 'minute',
},
'GANTT_HALF_YEAR_GRID_INIT_VAL': {
'month': 'month',
'week': 'week',
},
'GANTT_HOUR_GRID_INIT_VAL': {
'hour': 'hour',
'minute': 'minute',
},
'GANTT_MONTH_GRID_INIT_VAL': {
'day': 'day',
'hour': 'hour',
},
'GANTT_ONE_YEAR_GRID_INIT_VAL': {
'month': 'month',
'week': 'week',
},
'GANTT_QTR_YEAR_GRID_INIT_VAL': {
'month': 'month',
'week': 'week',
},
'GANTT_WEEK_GRID_INIT_VAL': {
'day': 'day',
'hour': 'hour',
},
'GANTT_YEARS_GRID_INIT_VAL': {
'month': 'month',
'year': 'year',
},
'HDN_LIST_SORT': {
'1': 'ON',
},
'HDN_PAGER_FLG': {
'1': 'ON',
},
'INIT_VALUE': {
'TLN_LOGIN_BUMON': 'ログイン部門',
'TLN_LOGIN_USER': 'ログインID',
'TLN_SYSDATE': 'システム日付',
'TLN_SYSDATE_FST': 'システム月初',
'TLN_SYSDATE_LST': 'システム月末',
},
'INPUT_CONDITION': {
'1': 'ON',
},
'INSERT_FLG': {
'1': 'ON',
},
'IS_ALL_DAY_CHECK_ON': {
'1': 'OFF',
},
'IS_BAR_MOUSE_ALLOW_MOVING': {
'OFF': 'OFF',
},
'IS_BAR_MOUSE_ALLOW_RESIZING': {
'OFF': 'OFF',
},
'IS_BAR_UPDATE_CONFIRM': {
'1': 'ON',
},
'IS_CLOSE_SWITCH': {
'1': 'ON',
},
'IS_CONDITION_TITLE_OFF': {
'1': 'ON',
},
'IS_DB_NOT_REGIST': {
'1': 'ON',
},
'IS_EXECUTE_CONFIRM': {
'1': 'ON',
},
'IS_EXECUTE_MESSAGE_HIDDEN': {
'1': 'ON',
},
'IS_EXE_AUTH': {
'ON': 'ON',
},
'IS_FIT_EVENT_BAR_MAX_WIDTH': {
'1': 'ON',
},
'IS_GANTT_DISP_DAY_BTN': {
'1': 'OFF',
},
'IS_GANTT_DISP_HALF_YEAR_BTN': {
'1': 'OFF',
},
'IS_GANTT_DISP_HOUR_BTN': {
'1': 'OFF',
},
'IS_GANTT_DISP_MONTH_BTN': {
'1': 'OFF',
},
'IS_GANTT_DISP_QUARTERLY_BTN': {
'1': 'OFF',
},
'IS_GANTT_DISP_WEEK_BTN': {
'1': 'OFF',
},
'IS_GANTT_DISP_YEARS_BTN': {
'1': 'OFF',
},
'IS_GANTT_DISP_YEAR_BTN': {
'1': 'OFF',
},
'IS_GRID_SNAP_OFF': {
'1': 'ON',
},
'IS_LIST_FIXED': {
'ON': 'ON',
},
'IS_LIST_ROW_SELECT': {
'1': 'ON',
},
'IS_NOT_WIN_RESIZE': {
'1': 'ON',
},
'IS_ON_RELOAD_ORIGIN_WIN_SIZE': {
'1': 'ON',
},
'IS_SCALE_HIDDEN_DAY': {
'1': 'OFF',
},
'IS_SCALE_HIDDEN_MONTH': {
'1': 'OFF',
},
'IS_SCALE_HIDDEN_WEEK': {
'1': 'OFF',
},
'IS_SCHEDULE_UIWAIT_LOCK': {
'1': 'ON',
},
'IS_SEARCH_NOTFOUND_MSG_HDN': {
'1': 'ON',
},
'IS_ST_ED_TOOLTIP_HIDDEN': {
'1': 'ON',
},
'IS_TASK_GROUING_DISP': {
'1': 'ON',
},
'IS_USE_SEARCH_RESULT_MAIL': {
'1': 'ON',
},
'IS_USE_SEARCH_RESULT_REPORT': {
'1': 'ON',
},
'IS_VERTICAL_LAYOUT': {
'1': 'ON',
},
'IS_WIN_OPENER_CLOSED': {
'OFF': 'OFF',
},
'KEY_COL_BLOCK': {
'0': '表示しない',
'1': '表示する',
},
'LOOK_UP': {
'WAIT_LOCK': 'ON',
},
'MASTER_CHECK': {
'1': 'ON',
},
'MATCH_PATTERN': {
'1': 'ON',
'ALL_MATCH': 'エラー条件',
'NULL': '許可条件 ※この設定は現在できない',
},
'OPEN_WINDOW_MODE': {
'NEW_WIN': '常に別Window',
'NORMAL': '別Window (既存あれば上書き)',
'NORMAL_DIALOG': '別Window (既存あれば警告)',
'OVER_WRITE': '上書き',
'OVER_WRITE_SEARCH': '上書き+親再検索',
},
'OPTION_LIST_SEARCH': {
'1': 'ON',
'WAIT_LOCK': 'ON',
},
'OTHER_FUNC': {
'1': 'ON',
'DELETE': '削除',
'INSERT': '登録',
'MERGE': '登録/更新',
'UPDATE': '更新',
},
// CHART 系 値辞書
'CHART_FUNC_INFO': {
'bar': '棒グラフ',
'line': '折れ線',
'pie': '円グラフ',
'donut': 'ドーナツ',
'area': '面グラフ',
'scatter': '散布図',
'spline': 'スプライン',
'step': '階段グラフ',
'area_spline': '面 (スプライン)',
'area_step': '面 (階段)',
},
'CHART_BASE': {
'1': 'ON',
},
'CHART_LEGEND_BASE': {
'1': 'ON',
'bottom': '下',
'right': '右',
'top': '上',
'left': '左',
},
'CHART_AXIS_X_LABEL_BASE': {
'inner-right': '内側-右',
'inner-center': '内側-中央',
'inner-left': '内側-左',
'outer-right': '外側-右',
'outer-center': '外側-中央',
'outer-left': '外側-左',
},
'CHART_AXIS_Y_LABEL_BASE': {
'inner-top': '内側-上',
'inner-middle': '内側-中央',
'inner-bottom': '内側-下',
'outer-top': '外側-上',
'outer-middle': '外側-中央',
'outer-bottom': '外側-下',
},
'CHART_AXIS_Y_R_LABEL_BASE': {
'inner-top': '内側-上',
'inner-middle': '内側-中央',
'inner-bottom': '内側-下',
'outer-top': '外側-上',
'outer-middle': '外側-中央',
'outer-bottom': '外側-下',
},
'PDF_BUTTON_HDN_FLG': {
'1': 'ON',
},
'REGIST_VALUE': {
'<': '<',
'<=': '<=',
'<>': '<>',
'=': '=',
'>': '>',
'>=': '>=',
'IN': 'IN',
'INFIX': 'INFIX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LIKE': 'LIKE',
'MACRO': 'マクロ',
'NOT IN': 'NOT IN',
'NOT LIKE': 'NOT LIKE',
'PREFIX': 'PREFIX',
'REG': '正規表現',
'SUFFIX': 'SUFFIX',
},
'REQUIRED_SEARCH': {
'1': 'ON',
},
'RESULT_AREA': {
'C': '中央',
'C_BTM': '下中央',
'C_MDL': '中間中央',
'C_TOP': '上中央',
'L': '左',
'L_BTM': '下左',
'L_MDL': '中間左',
'L_TOP': '上左',
'R': '右',
'R_BTM': '下右',
'R_MDL': '中間右',
'R_TOP': '上右',
},
'SCHEDULE_INIT_SCALE': {
'day': 'ON',
'dayGridMonth': '月',
'halfYear': 'ON',
'hour': 'ON',
'month': 'ON',
'quarterly': 'ON',
'timeGridDay': '日',
'timeGridWeek': '週',
'week': 'ON',
'year': 'ON',
'years': 'ON',
},
'SCHEDULE_START_WEEK': {
'0': 'Sun.',
'1': 'Mon.',
'2': 'Tue.',
'3': 'Wed.',
'4': 'Thu.',
'5': 'Fri.',
'6': 'Sat.',
},
'SEARCH_BUTTON_HDN_FLG': {
'1': 'ON',
},
'SEARCH_FUNC_ID': {
'BTN_BTM': 'ボタンの下',
'BTN_R': 'ボタンの右',
'WIN_C_BTM': 'Window中央下',
'WIN_C_MDL': 'Window中央',
'WIN_C_TOP': 'Window中央上',
'WIN_L_BTM': 'Window左下',
'WIN_L_MDL': 'Window左中央',
'WIN_L_TOP': 'Window左上',
'WIN_R_BTM': 'Window右下',
'WIN_R_MDL': 'Window右中央',
'WIN_R_TOP': 'Window右上',
},
'SEARCH_METHOD': {
'=': '=',
'BETWEEN': 'BETWEEN',
'IN': 'IN',
'INFIX': 'INFIX',
'NOT IN': 'NOT IN',
'PREFIX': 'PREFIX',
'SUFFIX': 'SUFFIX',
},
'SEND_MAIL': {
'1': 'ON',
},
'SERIAL_NUMBER_VAL': {
'1': 'ON',
},
'STD_EXCEL_EXT': {
'xls': 'xls',
'xlsx': 'xlsx',
},
'SUB_BTN_HDN': {
'1': 'ON',
},
'SUB_SEARCH': {
'INIT_SEARCH': 'ON',
},
'SUGGEST': {
'1': 'ON',
'INIT_SEARCH': 'ON',
'SKIP_INIT_SEARCH': 'OFF',
'WAIT_LOCK': 'ON',
},
'TABLE_LAYOUT': {
'1': 'ON',
},
'TABLE_TITLE_LAYOUT': {
'1': 'ON',
},
'TATE_CHECK': {
'1': 'ON',
},
'THUMBNAIL_SIZE': {
'1': 'ON',
},
'UPDATE_FLG': {
'1': 'ON',
},
'VIEW_BUTTON_HDN_FLG': {
'1': 'ON',
},
'WIN_POS': {
'BTN_BTM': 'ボタンの下',
'BTN_R': 'ボタンの右',
'WIN_C_BTM': 'Window中央下',
'WIN_C_MDL': 'Window中央',
'WIN_C_TOP': 'Window中央上',
'WIN_L_BTM': 'Window左下',
'WIN_L_MDL': 'Window左中央',
'WIN_L_TOP': 'Window左上',
'WIN_R_BTM': 'Window右下',
'WIN_R_MDL': 'Window右中央',
'WIN_R_TOP': 'Window右上',
},
'ZERO_SPLIT': {
'1': 'ON',
},
};
TFC.VALUE_ENUMS = VALUE_ENUMS;
TFC.flgLabel = function (val) {
var v = val == null ? '' : String(val);
if (v === '1') return '○';
if (v === '0' || v === '') return '';
return v;
};
// EN 翻訳 (主要エニュメレーションのみ)。VALUE_ENUMS は DB設定マスタ.csv が JA 起源のため
// ここで手動 EN 訳を提供。未登録キーは EN モード時に raw コード値だけを返す。
TFC.VALUE_ENUMS_EN = {
'OPEN_WINDOW_MODE': {
'NORMAL': 'New window (overwrite if existing)',
'NORMAL_DIALOG': 'New window (warn if existing)',
'NEW_WIN': 'Always new window',
'OVER_WRITE': 'Overwrite current',
'OVER_WRITE_SEARCH': 'Overwrite + parent re-search'
},
'WIN_POS': {
'BTN_BTM': 'Below button',
'BTN_R': 'Right of button',
'WIN_C_TOP': 'Window center top',
'WIN_C_MDL': 'Window center middle',
'WIN_C_BTM': 'Window center bottom',
'WIN_R_TOP': 'Window right top',
'WIN_R_MDL': 'Window right middle',
'WIN_R_BTM': 'Window right bottom',
'WIN_L_TOP': 'Window left top',
'WIN_L_MDL': 'Window left middle',
'WIN_L_BTM': 'Window left bottom'
},
'KEY_COL_BLOCK': {
'1': 'Show key items in block',
'0': 'Hide key items in block'
},
'EXE_DISP_INIT_FLG': {
'0': 'Do not reset',
'1': 'Reset to initial'
}
};
// FUNC_KBN ごとの DB 値 → 表示名 解決 (TFC.VALUE_ENUMS / VALUE_ENUMS_EN 参照)。
// OPEN_WINDOW_MODE 'NORMAL_DIALOG' → '別Window (既存あれば警告) [NORMAL_DIALOG]' (JA)
// → 'New window (warn if existing) [NORMAL_DIALOG]' (EN)
// 未登録は元の値をそのまま返す (EN モードで JA 説明を出さないよう注意)。
TFC.valueLabel = function (funcKbn, val, lang) {
var v = val == null ? '' : String(val);
if (v === '') return '';
// EN モード: 先に EN 辞書を引く。未登録なら JA 辞書値が ON/OFF 系なら共通翻訳、 それ以外は raw。
if (lang === 'en') {
var enDict = (TFC.VALUE_ENUMS_EN || {})[funcKbn];
if (enDict && enDict[v]) {
return (enDict[v] === v) ? v : (enDict[v] + ' [' + v + ']');
}
// JA 辞書が 'ON'/'OFF'/'表示'/'非表示' といった bool 系を返す場合は EN 共通辞書で翻訳
// (VALUE_ENUMS_EN を全 FUNC_KBN 分用意するのは現実的でないため、 共通 fallback)
var jaDictE = (TFC.VALUE_ENUMS || {})[funcKbn];
if (jaDictE && jaDictE[v]) {
var commonEn = { 'ON': 'ON', 'OFF': 'OFF', '表示': 'Shown', '非表示': 'Hidden',
'上': 'Top', '下': 'Bottom', '左': 'Left', '右': 'Right',
'中央': 'Middle' };
var jaV = jaDictE[v];
if (commonEn[jaV] != null) {
return (commonEn[jaV] === v) ? v : (commonEn[jaV] + ' [' + v + ']');
}
}
return v; // EN 翻訳なし → コード値のみ
}
// JA モード: VALUE_ENUMS (JA 辞書) を使用
var dict = (TFC.VALUE_ENUMS || {})[funcKbn];
if (!dict) return v;
var disp = dict[v];
if (disp == null) return v;
if (disp === v) return v;
return disp + ' [' + v + ']';
};
// FUNC_KBN ラベルのみ取得 (コード "(...)" 付加なし) — 別列でコードを表示するときに使う
TFC.fkLabelOnly = function (funcKbn, lang) {
var info = TFC.funcKbnInfo ? TFC.funcKbnInfo(funcKbn) : null;
if (!info) return funcKbn || '';
if (lang === 'en' && info.labelEn) return info.labelEn;
return info.labelJa || (funcKbn || '');
};
// ============================================================
// FUNC_KBN 辞書 (Phase 3: 全208項目, TALON-DB設定マスタ.md から自動生成)
// 生成スクリプト: AI開発/scripts/build_func_kbn_dict.py
//
// section: 'app-application' | 'app-report' | 'app-othernext' | 'app-ajax'
// | 'block-item' | 'block-detail' | 'block-detail-cal'
// | 'block-report' | 'block-proc' | 'block-othernext'
// | 'block-fileio' | 'block-otherfunc' | 'block-other'
// | 'block-chart-general' | 'block-chart-x' | 'block-chart-y'
// | 'block-chart-y2' | 'block-chart-series'
// | 'free-layout' | 'auth-menu' | 'other'
// ============================================================
var FUNC_KBN_DICT = {
'KEY_COL_BLOCK': { section: 'app-application', labelJa: '機能タイプ', labelEn: 'Function type', table: 'TLN_M_GENERAL_APP' },
'OPEN_WINDOW_MODE': { section: 'app-application', labelJa: '起動Window状態', labelEn: 'Initial window state', table: 'TLN_M_GENERAL_APP' },
'WIN_H': { section: 'app-application', labelJa: 'Window高さ', labelEn: 'Window height', table: 'TLN_M_GENERAL_APP' },
'WIN_W': { section: 'app-application', labelJa: 'Window幅', labelEn: 'Window width', table: 'TLN_M_GENERAL_APP' },
'WIN_POS_X': { section: 'app-application', labelJa: '表示位置 横', labelEn: 'Position X', table: 'TLN_M_GENERAL_APP' },
'WIN_POS_Y': { section: 'app-application', labelJa: '表示位置 縦', labelEn: 'Position Y', table: 'TLN_M_GENERAL_APP' },
'WIN_POS': { section: 'app-application', labelJa: '表示位置', labelEn: 'Display position', table: 'TLN_M_GENERAL_APP' },
'IS_NOT_WIN_RESIZE': { section: 'app-application', labelJa: 'Windowサイズ変更不可', labelEn: 'Window resize disabled', table: 'TLN_M_GENERAL_APP' },
'IS_ON_RELOAD_ORIGIN_WIN_SIZE': { section: 'app-application', labelJa: '再描画時、設定したWindow位置サイズに戻す', labelEn: 'Restore window pos/size on redraw', table: 'TLN_M_GENERAL_APP' },
'IS_WIN_OPENER_CLOSED': { section: 'app-application', labelJa: 'Window終了オプション', labelEn: 'Window close option', table: 'TLN_M_GENERAL_APP' },
'TAB_MENU_NAME': { section: 'app-application', labelJa: 'ブロック', labelEn: 'Block', table: 'TLN_M_GENERAL_APP' },
'CHART': { section: 'app-application', labelJa: 'ブロック', labelEn: 'Block', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CONDTN_CNT': { section: 'app-application', labelJa: '検索条件項目数', labelEn: 'Search condition count', table: 'TLN_M_GENERAL_APP' },
'COND_SAVE_HDN_FLG': { section: 'app-application', labelJa: '検索条件保存', labelEn: 'Save search conditions', table: 'TLN_M_GENERAL_APP' },
'IS_CONDITION_TITLE_OFF': { section: 'app-application', labelJa: '検索条件タイトル', labelEn: 'Search condition title', table: 'TLN_M_GENERAL_APP' },
'BACK_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'CLEAR_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'PDF_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'EXCEL_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'SEARCH_BUTTON_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_BTN_HDN_FLG': { section: 'app-application', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_BTN_CND': { section: 'app-application', labelJa: '確定ボタン', labelEn: 'Confirm button', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_BTN_NAME_DISP_FORMULA': { section: 'app-application', labelJa: '確定ボタン', labelEn: 'Confirm button', table: 'TLN_M_GENERAL_APP' },
'EXECUTE_MESSAGE': { section: 'app-application', labelJa: '確定終了メッセージ', labelEn: 'Confirm result message', table: 'TLN_M_GENERAL_APP' },
'IS_EXECUTE_MESSAGE_HIDDEN': { section: 'app-application', labelJa: '確定終了メッセージ', labelEn: 'Confirm result message', table: 'TLN_M_GENERAL_APP' },
'IS_EXECUTE_CONFIRM': { section: 'app-application', labelJa: '確定ボタン確認ダイアログ', labelEn: 'Confirm dialog', table: 'TLN_M_GENERAL_APP' },
'EXE_DISP_INIT_FLG': { section: 'app-application', labelJa: '確定後再表示オプション', labelEn: 'Post-confirm redisplay option', table: 'TLN_M_GENERAL_APP' },
'EXE_TARGET_ONLY_FLG_NO_SEARCH': { section: 'app-application', labelJa: '確定後再表示オプション', labelEn: 'Post-confirm redisplay option', table: 'TLN_M_GENERAL_APP' },
'EXE_DISP_TARGET_ONLY_FLG': { section: 'app-application', labelJa: '確定後再表示オプション', labelEn: 'Post-confirm redisplay option', table: 'TLN_M_GENERAL_APP' },
'IS_EXE_AUTH': { section: 'app-application', labelJa: '確定時認証', labelEn: 'Confirm-time authentication', table: 'TLN_M_GENERAL_APP' },
'SEND_MAIL': { section: 'app-application', labelJa: '確定後のメール送信', labelEn: 'Send mail after confirm', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SEND_MAIL_': { section: 'app-application', labelJa: '確定後のメール送信', labelEn: 'Send mail after confirm', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JAVA_SCRIPT_ENGINE': { section: 'app-application', labelJa: 'DB検索JavaScript', labelEn: 'DB search JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PL_SQL_NAME_SEARCH': { section: 'app-application', labelJa: 'DB検索プロシージャ名', labelEn: 'DB search procedure name', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME_SEARCH_AFTER': { section: 'app-application', labelJa: 'DB検索プロシージャ名', labelEn: 'DB search procedure name', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME': { section: 'app-application', labelJa: 'プロシージャ名', labelEn: 'Procedure name', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME_AFTER': { section: 'app-application', labelJa: 'プロシージャ名', labelEn: 'Procedure name', table: 'TLN_M_GENERAL_APP' },
'ACCESS_DB': { section: 'app-application', labelJa: 'DB接続先', labelEn: 'DB connection', table: 'TLN_M_GENERAL_APP' },
'JAVA_SCRIPT': { section: 'app-application', labelJa: 'Client-side JavaScript', labelEn: 'Client-side JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSS': { section: 'app-application', labelJa: 'CSS', labelEn: 'CSS', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JOIN': { section: 'app-application', labelJa: '結合項目', labelEn: 'Join items', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_DSP_POS': { section: 'app-application', labelJa: 'ボタン位置移動', labelEn: 'Button position', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_REPORT': { section: 'app-report', labelJa: 'EXCEL', labelEn: 'Excel', table: 'TLN_M_GENERAL_ITEM_OPTN' },
// ALL_OPT は BUTTON_REPORT.COL_NAME の値 (= 「追加オプション」) であり FUNC_KBN ではない。
// 表示は subCategoryPrefix (update-before.server.js) で COL_NAME='ALL_OPT' 検出時に解決する。
'BUTTON_NEXT': { section: 'app-othernext', labelJa: '機能画面設定', labelEn: 'Function screen setting', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_AJAX': { section: 'app-ajax', labelJa: 'ボタン名', labelEn: 'Button name', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_AJAX_CLIENT_JAVASCRIPT': { section: 'app-ajax', labelJa: '再表示ブロック', labelEn: 'Refresh block', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_AJAX_': { section: 'app-ajax', labelJa: 'DB検索前JavaScript', labelEn: 'Pre-search JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CR_FLG_SEARCH': { section: 'block-item', labelJa: '検索改行', labelEn: 'Search line break', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'REQUIRED_SEARCH': { section: 'block-item', labelJa: '検索必須', labelEn: 'Search required', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'IS_DB_NOT_REGIST': { section: 'block-item', labelJa: 'DB更新無し', labelEn: 'No DB update', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TABLE_LAYOUT': { section: 'block-item', labelJa: 'ROW SPAN', labelEn: 'ROW SPAN', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TABLE_TITLE_LAYOUT': { section: 'block-item', labelJa: 'タイトルROW SPAN', labelEn: 'Title ROW SPAN', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SEARCH_METHOD': { section: 'block-item', labelJa: '検索方式', labelEn: 'Search method', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'DISP_POS': { section: 'block-item', labelJa: '表示位置', labelEn: 'Display position', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TAB_INDEX_SEARCH': { section: 'block-item', labelJa: 'Tab index(検索)', labelEn: 'Tab index (search)', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TAB_INDEX': { section: 'block-item', labelJa: 'Tab index', labelEn: 'Tab index', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CAMMA_OFF': { section: 'block-item', labelJa: 'カンマ編集無し', labelEn: 'No comma editing', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'ZERO_SPLIT': { section: 'block-item', labelJa: '小数点ゼロ埋め', labelEn: 'Pad decimals with zero', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'ALL_SELECT_CHECK': { section: 'block-item', labelJa: 'コンポーネント', labelEn: 'Component', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TATE_CHECK': { section: 'block-item', labelJa: 'コンポーネント', labelEn: 'Component', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OPTION_LIST_FUNC_ID': { section: 'block-item', labelJa: 'オプションリスト機能ID', labelEn: 'Option list function ID', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OPTION_LIST_SEARCH': { section: 'block-item', labelJa: 'オプションリスト機能ID', labelEn: 'Option list function ID', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CLASS_CODE': { section: 'block-item', labelJa: '階層コード/レベル', labelEn: 'Hierarchy code / level', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'NEST': { section: 'block-item', labelJa: '階層コード/レベル', labelEn: 'Hierarchy code / level', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'INPUT_CONDITION': { section: 'block-item', labelJa: '入力許可パターン', labelEn: 'Input allow pattern', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'MATCH_PATTERN': { section: 'block-item', labelJa: '入力チェックパターン', labelEn: 'Input check pattern', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SEARCH_FUNC_ID': { section: 'block-item', labelJa: '検索子画面', labelEn: 'Sub search screen', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUB_SEARCH': { section: 'block-item', labelJa: '検索子画面', labelEn: 'Sub search screen', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUB_BTN_HDN': { section: 'block-item', labelJa: '子画面非表示', labelEn: 'Sub screen hidden', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'MASTER_CHECK': { section: 'block-item', labelJa: 'マスタチェック', labelEn: 'Master check', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'LOOK_UP_FUNC_ID': { section: 'block-item', labelJa: 'LOOKUP', labelEn: 'LOOKUP', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'LOOK_UP': { section: 'block-item', labelJa: 'LOOKUP', labelEn: 'LOOKUP', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FOCUS_OUT_JAVASCRIPT': { section: 'block-item', labelJa: 'FOCUS OUT', labelEn: 'FOCUS OUT', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FLAT_TEXT': { section: 'block-item', labelJa: '値保持', labelEn: 'Value retention', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUGGEST_FUNC_ID': { section: 'block-item', labelJa: 'SUGGEST', labelEn: 'SUGGEST', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SUGGEST': { section: 'block-item', labelJa: 'SUGGEST', labelEn: 'SUGGEST', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'PRINTING_UPDATE': { section: 'block-item', labelJa: '印刷時更新項目', labelEn: 'Print-time update items', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FORE_COLOR': { section: 'block-item', labelJa: '文字色', labelEn: 'Foreground color', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BACK_COLOR': { section: 'block-item', labelJa: '背景色', labelEn: 'Background color', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'INIT_VALUE_TEXT': { section: 'block-item', labelJa: '検索条件初期値', labelEn: 'Search initial value', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'INIT_VALUE': { section: 'block-item', labelJa: '検索条件初期値', labelEn: 'Search initial value', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'REGIST_VALUE': { section: 'block-item', labelJa: 'DB設定式', labelEn: 'DB set formula', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FIX_FORMULA': { section: 'block-item', labelJa: '固定条件式', labelEn: 'Fixed condition formula', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SAIBAN_SIKIBETU_CODE': { section: 'block-item', labelJa: '採番名', labelEn: 'Numbering name', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'SERIAL_NUMBER_VAL': { section: 'block-item', labelJa: 'シリアル番号加算値', labelEn: 'Serial number increment', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JAVASCRIPT': { section: 'block-item', labelJa: 'JavaScript呼出ボタン', labelEn: 'JavaScript call button', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'JAVASCRIPT_ENGINE': { section: 'block-item', labelJa: 'JavaScript呼出ボタン', labelEn: 'JavaScript call button', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BARCODE_FORMAT': { section: 'block-item', labelJa: 'EXCEL帳票', labelEn: 'Excel report', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'THUMBNAIL_SIZE': { section: 'block-item', labelJa: 'サムネイル・バーコードサイズ', labelEn: 'Thumbnail / barcode size', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'IMG_UPLOAD_SIZE': { section: 'block-item', labelJa: 'アップロードファイルサイズ', labelEn: 'Upload file size', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'DRILL_DOWN': { section: 'block-item', labelJa: 'ドリルダウンレベル項目', labelEn: 'Drill-down level item', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'HDN_LIST_SORT': { section: 'block-item', labelJa: '明細ソート無し', labelEn: 'No row sorting', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'TITLE_NOTE': { section: 'block-item', labelJa: 'タイトルツールチップ', labelEn: 'Title tooltip', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'MAX_LINE_COUNT': { section: 'block-detail', labelJa: '画面最大行数', labelEn: 'Max rows on screen', table: 'TLN_M_GENERAL_APP' },
'MAX_LINE_COUNT_EXCEL': { section: 'block-detail', labelJa: '標準Excel出力最大行数', labelEn: 'Standard Excel max rows', table: 'TLN_M_GENERAL_APP' },
'MAX_LINE_CNT_EXCEL_UPDATE': { section: 'block-detail', labelJa: '更新Excel出力最大行数', labelEn: 'Update Excel max rows', table: 'TLN_M_GENERAL_APP' },
'ADD_LINE_VAL_INIT': { section: 'block-detail', labelJa: '追加行の初期値', labelEn: 'Initial values for added rows', table: 'TLN_M_GENERAL_APP' },
'STD_EXCEL_EXT': { section: 'block-detail', labelJa: '標準Excel拡張子', labelEn: 'Standard Excel extension', table: 'TLN_M_GENERAL_APP' },
'LIST_PAGE_ROWS': { section: 'block-detail', labelJa: '初期ページ内行数', labelEn: 'Initial rows per page', table: 'TLN_M_GENERAL_APP' },
'LIST_PAGE_DROPDOWN': { section: 'block-detail', labelJa: '改頁行数選択リスト', labelEn: 'Rows-per-page dropdown list', table: 'TLN_M_GENERAL_APP' },
'SPACE_HEIGHT': { section: 'block-detail', labelJa: '表示高さ', labelEn: 'Display height', table: 'TLN_M_GENERAL_APP' },
'IS_VERTICAL_LAYOUT': { section: 'block-detail', labelJa: '行見出しレイアウト', labelEn: 'Row header layout', table: 'TLN_M_GENERAL_APP' },
'HDN_PAGER_FLG': { section: 'block-detail', labelJa: '改ページしない', labelEn: 'No pagination', table: 'TLN_M_GENERAL_APP' },
'BLOCK_NAME_HDN_FLG': { section: 'block-detail', labelJa: 'ブロック名フィールドを非表示', labelEn: 'Hide block name field', table: 'TLN_M_GENERAL_APP' },
'IS_SEARCH_NOTFOUND_MSG_HDN': { section: 'block-detail', labelJa: '検索結果0件メッセージを非表示', labelEn: 'Hide no-results message', table: 'TLN_M_GENERAL_APP' },
'IS_CLOSE_SWITCH': { section: 'block-detail', labelJa: '開閉表示状態', labelEn: 'Open/close state', table: 'TLN_M_GENERAL_APP' },
'IS_LIST_ROW_SELECT': { section: 'block-detail', labelJa: '明細行の編集方式', labelEn: 'Row edit mode', table: 'TLN_M_GENERAL_APP' },
'IS_LIST_FIXED': { section: 'block-detail', labelJa: '明細列の固定', labelEn: 'Pinned columns', table: 'TLN_M_GENERAL_APP' },
'EXCELUPDATE_BUTTON_HDN_FLG': { section: 'block-detail', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'VIEW_BUTTON_HDN_FLG': { section: 'block-detail', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'COL_BUTTON_HDN_FLG': { section: 'block-detail', labelJa: 'ボタンの非表示', labelEn: 'Button (hidden)', table: 'TLN_M_GENERAL_APP' },
'EXCELUPDATE_BTN_DISABLED_FLG': { section: 'block-detail', labelJa: '検索前ボタンの非活性', labelEn: 'Disable button before search', table: 'TLN_M_GENERAL_APP' },
'INSERT_FLG': { section: 'block-detail', labelJa: '処理権限', labelEn: 'Process permission', table: 'TLN_M_GENERAL_APP' },
'UPDATE_FLG': { section: 'block-detail', labelJa: '処理権限', labelEn: 'Process permission', table: 'TLN_M_GENERAL_APP' },
'DELETE_FLG': { section: 'block-detail', labelJa: '処理権限', labelEn: 'Process permission', table: 'TLN_M_GENERAL_APP' },
'EXCLUSIVE_CONTROL_FLG': { section: 'block-detail', labelJa: '確定時オプション', labelEn: 'Confirm option', table: 'TLN_M_GENERAL_APP' },
'ALL_REG_FLG': { section: 'block-detail', labelJa: '確定時オプション', labelEn: 'Confirm option', table: 'TLN_M_GENERAL_APP' },
'IS_USE_SEARCH_RESULT_REPORT': { section: 'block-detail', labelJa: '確定時オプション', labelEn: 'Confirm option', table: 'TLN_M_GENERAL_APP' },
'IS_USE_SEARCH_RESULT_MAIL': { section: 'block-detail', labelJa: '確定時オプション', labelEn: 'Confirm option', table: 'TLN_M_GENERAL_APP' },
'PLSQL_PARAM_COL': { section: 'block-detail', labelJa: 'プロシージャ名', labelEn: 'Procedure name', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'LISTSELECT_BTN_CND': { section: 'block-detail', labelJa: '参照ボタン', labelEn: 'View button', table: 'TLN_M_GENERAL_APP' },
'LISTSEL_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '参照ボタン', labelEn: 'View button', table: 'TLN_M_GENERAL_APP' },
'COPY_DL_BTN_CND': { section: 'block-detail', labelJa: '複写ボタン', labelEn: 'Copy button', table: 'TLN_M_GENERAL_APP' },
'COPY_DL_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '複写ボタン', labelEn: 'Copy button', table: 'TLN_M_GENERAL_APP' },
'ADDLINE_DL_BTN_CND': { section: 'block-detail', labelJa: '行追加ボタン', labelEn: 'Add-row button', table: 'TLN_M_GENERAL_APP' },
'ADDLINE_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '行追加ボタン', labelEn: 'Add-row button', table: 'TLN_M_GENERAL_APP' },
'DELETE_BTN_CND': { section: 'block-detail', labelJa: '削除ボタン', labelEn: 'Delete button', table: 'TLN_M_GENERAL_APP' },
'DELETE_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '削除ボタン', labelEn: 'Delete button', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_CODE_': { section: 'block-detail', labelJa: '行文字色', labelEn: 'Row foreground color', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_KBN_': { section: 'block-detail', labelJa: '行文字色', labelEn: 'Row foreground color', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_CND_': { section: 'block-detail', labelJa: '行文字色', labelEn: 'Row foreground color', table: 'TLN_M_GENERAL_APP' },
'BACK_COLOR_TR_CODE_': { section: 'block-detail', labelJa: '行背景色', labelEn: 'Row background color', table: 'TLN_M_GENERAL_APP' },
'BACK_COLOR_TR_KBN_': { section: 'block-detail', labelJa: '行背景色', labelEn: 'Row background color', table: 'TLN_M_GENERAL_APP' },
'BACK_COLOR_TR_CND_': { section: 'block-detail', labelJa: '行背景色', labelEn: 'Row background color', table: 'TLN_M_GENERAL_APP' },
'SAVE_BTN_CND': { section: 'block-detail', labelJa: '保存ボタン', labelEn: 'Save button', table: 'TLN_M_GENERAL_APP' },
'SAVE_BTN_NAME_DISP_FORMULA': { section: 'block-detail', labelJa: '保存ボタン', labelEn: 'Save button', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_TITLE_COL': { section: 'block-detail', labelJa: 'タスクコード', labelEn: 'Task code', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_GRID_TOP': { section: 'block-detail', labelJa: '時間グリッドのスクロールTOP', labelEn: 'Time grid scroll TOP', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_FROM_DATE_COL': { section: 'block-detail', labelJa: '開始日時', labelEn: 'Start datetime', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_TO_DATE_COL': { section: 'block-detail', labelJa: '終了日時', labelEn: 'End datetime', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_START_WEEK': { section: 'block-detail', labelJa: '開始曜日', labelEn: 'Start day of week', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_INIT_SCALE': { section: 'block-detail', labelJa: '描画期間初期値', labelEn: 'Initial draw period', table: 'TLN_M_GENERAL_APP' },
'IS_SCALE_HIDDEN_MONTH': { section: 'block-detail', labelJa: '描画期間スケールボタン表示', labelEn: 'Scale button visibility', table: 'TLN_M_GENERAL_APP' },
'IS_SCALE_HIDDEN_WEEK': { section: 'block-detail', labelJa: '描画期間スケールボタン表示', labelEn: 'Scale button visibility', table: 'TLN_M_GENERAL_APP' },
'IS_SCALE_HIDDEN_DAY': { section: 'block-detail', labelJa: '描画期間スケールボタン表示', labelEn: 'Scale button visibility', table: 'TLN_M_GENERAL_APP' },
'IS_ALL_DAY_CHECK_ON': { section: 'block-detail', labelJa: 'All Day チェックボックス状態', labelEn: 'All-day checkbox state', table: 'TLN_M_GENERAL_APP' },
'CALENDAR_SIKIBETU_CODE': { section: 'block-detail', labelJa: 'カレンダー識別コード', labelEn: 'Calendar code', table: 'TLN_M_GENERAL_APP' },
'IS_BAR_UPDATE_CONFIRM': { section: 'block-detail', labelJa: 'イベントバーの変更時確認', labelEn: 'Confirm bar update', table: 'TLN_M_GENERAL_APP' },
'IS_SCHEDULE_UIWAIT_LOCK': { section: 'block-detail', labelJa: '処理中ロック', labelEn: 'Lock while processing', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_TITLE_DISP_COL': { section: 'block-detail', labelJa: 'タスク表示名', labelEn: 'Task display name', table: 'TLN_M_GENERAL_APP' },
'IS_TASK_GROUING_DISP': { section: 'block-detail', labelJa: 'タスク名の全種表示', labelEn: 'Show all task names', table: 'TLN_M_GENERAL_APP' },
'TASK_AREA_WIDTH': { section: 'block-detail', labelJa: 'タスク領域幅', labelEn: 'Task area width', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_EVENT_TEXT_COL': { section: 'block-detail', labelJa: 'イベント内容項目', labelEn: 'Event content field', table: 'TLN_M_GENERAL_APP' },
'IS_FIT_EVENT_BAR_MAX_WIDTH': { section: 'block-detail', labelJa: 'イベント内容項目', labelEn: 'Event content field', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_EVENT_TOOLTIP_COL': { section: 'block-detail', labelJa: 'ツールチップ項目', labelEn: 'Tooltip field', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_UNIQUE_COL': { section: 'block-detail', labelJa: '関係線KEY項目', labelEn: 'Relation key field', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_CONNECT_FROM_COL': { section: 'block-detail', labelJa: '関係線FROM', labelEn: 'Relation FROM', table: 'TLN_M_GENERAL_APP' },
'SCHEDULE_CONNECT_TO_COL': { section: 'block-detail', labelJa: '関係線TO', labelEn: 'Relation TO', table: 'TLN_M_GENERAL_APP' },
'LABEL_DSP_CNT': { section: 'block-detail', labelJa: '日時ラベル最大表示数', labelEn: 'Max date labels', table: 'TLN_M_GENERAL_APP' },
'IS_GRID_SNAP_OFF': { section: 'block-detail', labelJa: 'イベントバーのグリッドスナップ', labelEn: 'Snap bar to grid', table: 'TLN_M_GENERAL_APP' },
'IS_ST_ED_TOOLTIP_HIDDEN': { section: 'block-detail', labelJa: '開始-終了日時ツールチップ', labelEn: 'Start/end datetime tooltip', table: 'TLN_M_GENERAL_APP' },
'IS_BAR_MOUSE_ALLOW_RESIZING': { section: 'block-detail', labelJa: 'イベントバーのマウス操作', labelEn: 'Bar mouse interaction', table: 'TLN_M_GENERAL_APP' },
'IS_BAR_MOUSE_ALLOW_MOVING': { section: 'block-detail', labelJa: 'イベントバーのマウス操作', labelEn: 'Bar mouse interaction', table: 'TLN_M_GENERAL_APP' },
// GANTT 固有設定 (カタログ §7C 準拠): スケールボタン表示8種 + グリッド初期値8種 + 時間スケール3種
'IS_GANTT_DISP_HOUR_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 時ボタン表示', labelEn: 'Scale btn > Hour', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_DAY_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 日ボタン表示', labelEn: 'Scale btn > Day', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_WEEK_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 週ボタン表示', labelEn: 'Scale btn > Week', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_MONTH_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 月ボタン表示', labelEn: 'Scale btn > Month', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_QUARTERLY_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 四半期ボタン表示', labelEn: 'Scale btn > Quarter', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_HALF_YEAR_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 半年ボタン表示', labelEn: 'Scale btn > Half year', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_YEAR_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 年ボタン表示', labelEn: 'Scale btn > Year', table: 'TLN_M_GENERAL_APP' },
'IS_GANTT_DISP_YEARS_BTN': { section: 'block-detail', labelJa: 'スケールボタン > 複数年ボタン表示', labelEn: 'Scale btn > Multi-year', table: 'TLN_M_GENERAL_APP' },
'GANTT_HOUR_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 時グリッド', labelEn: 'Grid init > Hour', table: 'TLN_M_GENERAL_APP' },
'GANTT_DAY_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 日グリッド', labelEn: 'Grid init > Day', table: 'TLN_M_GENERAL_APP' },
'GANTT_WEEK_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 週グリッド', labelEn: 'Grid init > Week', table: 'TLN_M_GENERAL_APP' },
'GANTT_MONTH_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 月グリッド', labelEn: 'Grid init > Month', table: 'TLN_M_GENERAL_APP' },
'GANTT_QTR_YEAR_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 四半期グリッド', labelEn: 'Grid init > Quarter', table: 'TLN_M_GENERAL_APP' },
'GANTT_HALF_YEAR_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 半年グリッド', labelEn: 'Grid init > Half year', table: 'TLN_M_GENERAL_APP' },
'GANTT_ONE_YEAR_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 年グリッド', labelEn: 'Grid init > Year', table: 'TLN_M_GENERAL_APP' },
'GANTT_YEARS_GRID_INIT_VAL': { section: 'block-detail', labelJa: 'グリッド初期値 > 複数年グリッド', labelEn: 'Grid init > Multi-year', table: 'TLN_M_GENERAL_APP' },
'GANTT_HOUR_FROM_INIT_VAL': { section: 'block-detail', labelJa: '時間スケール > 時間FROM初期値', labelEn: 'Time scale > Hour FROM', table: 'TLN_M_GENERAL_APP' },
'GANTT_HOUR_LIMIT_INIT_VAL': { section: 'block-detail', labelJa: '時間スケール > 時間LIMIT初期値', labelEn: 'Time scale > Hour LIMIT', table: 'TLN_M_GENERAL_APP' },
'GANTT_YEARS_INIT_VAL': { section: 'block-detail', labelJa: '時間スケール > 複数年初期値', labelEn: 'Time scale > Multi-year', table: 'TLN_M_GENERAL_APP' },
'GANTT_REF_UPDATE_TABLE': { section: 'block-detail', labelJa: 'GANTT参照更新テーブル', labelEn: 'GANTT ref update table', table: 'TLN_M_GENERAL_APP' },
'BUTTON_BAT': { section: 'block-proc', labelJa: 'JavaScript', labelEn: 'JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_BAT_CLIENT_JAVASCRIPT': { section: 'block-proc', labelJa: 'JavaScript', labelEn: 'JavaScript', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_BAT_': { section: 'block-proc', labelJa: 'プロシージャ', labelEn: 'Procedure', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'BUTTON_NEXT_': { section: 'block-othernext', labelJa: '設定(機能ID指定あり)', labelEn: 'Settings (with function ID)', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON': { section: 'block-fileio', labelJa: 'ファイル出力', labelEn: 'File output', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON_OPTION': { section: 'block-fileio', labelJa: 'ファイル出力', labelEn: 'File output', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON_FILE': { section: 'block-fileio', labelJa: 'ファイル出力', labelEn: 'File output', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_OUT_BUTTON_COL': { section: 'block-fileio', labelJa: 'ファイル出力', labelEn: 'File output', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON': { section: 'block-fileio', labelJa: 'DB登録', labelEn: 'DB register', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON_OPTION': { section: 'block-fileio', labelJa: 'DB登録', labelEn: 'DB register', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON_FILE': { section: 'block-fileio', labelJa: 'DB登録', labelEn: 'DB register', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CSV_LOAD_BUTTON_COL': { section: 'block-fileio', labelJa: 'DB登録', labelEn: 'DB register', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OTHER_FUNC': { section: 'block-otherfunc', labelJa: '式', labelEn: 'Formula', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'OTHER_FUNC_': { section: 'block-otherfunc', labelJa: '項目設定', labelEn: 'Item setting', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'UPDATE_TABLE': { section: 'block-other', labelJa: 'SELECT式', labelEn: 'SELECT formula', table: 'TLN_M_GENERAL_APP' },
'OTHER_BLOCK_FUNC': { section: 'block-other', labelJa: '他ブロック', labelEn: 'Other block', table: 'TLN_M_GENERAL_APP' },
'CHART_MARK': { section: 'block-chart-series', labelJa: 'マーカー', labelEn: 'Marker', table: 'TLN_M_GENERAL_ITEM_OPTN' },
// CHART タブ群 (カタログ §8 準拠) — 全般 / 凡例 / X軸 / Y軸 / Y2軸 / 系列
'CHART_FUNC_INFO': { section: 'block-chart-base', labelJa: 'グラフ種類', labelEn: 'Chart type', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_BASE': { section: 'block-chart-base', labelJa: '全般', labelEn: 'General', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_LEGEND_BASE': { section: 'block-chart-base', labelJa: '凡例', labelEn: 'Legend', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_X_BASE': { section: 'block-chart-axis-x', labelJa: 'X軸 基本', labelEn: 'X axis', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_X_LABEL_BASE': { section: 'block-chart-axis-x', labelJa: 'X軸 タイトルラベル', labelEn: 'X axis label', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_X_TICK_BASE': { section: 'block-chart-axis-x', labelJa: 'X軸 目盛りラベル', labelEn: 'X axis tick', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_GRID_X_BASE': { section: 'block-chart-axis-x', labelJa: 'X軸 グリッド', labelEn: 'X axis grid', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_Y_BASE': { section: 'block-chart-axis-y', labelJa: 'Y軸 基本', labelEn: 'Y axis', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_Y_LABEL_BASE': { section: 'block-chart-axis-y', labelJa: 'Y軸 タイトルラベル', labelEn: 'Y axis label', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_Y_TICK_BASE': { section: 'block-chart-axis-y', labelJa: 'Y軸 目盛りラベル', labelEn: 'Y axis tick', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_GRID_Y_BASE': { section: 'block-chart-axis-y', labelJa: 'Y軸 グリッド', labelEn: 'Y axis grid', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_Y_R_BASE': { section: 'block-chart-axis-y2', labelJa: 'Y2軸 基本', labelEn: 'Y2 axis', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_Y_R_LABEL_BASE': { section: 'block-chart-axis-y2', labelJa: 'Y2軸 タイトルラベル', labelEn: 'Y2 axis label', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_AXIS_Y_R_TICK_BASE': { section: 'block-chart-axis-y2', labelJa: 'Y2軸 目盛りラベル', labelEn: 'Y2 axis tick', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_SERIES_BASE': { section: 'block-chart-series', labelJa: '系列 基本', labelEn: 'Series', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_SERIES_ONCLICK': { section: 'block-chart-series', labelJa: '系列 ドリルダウン', labelEn: 'Series drill-down', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'CHART_SERIES_ONCLICK_WINSIZE': { section: 'block-chart-series', labelJa: '系列 ドリルダウン Window 寸法', labelEn: 'Drill-down window size', table: 'TLN_M_GENERAL_ITEM_OPTN' },
'FUNC_TOP_AREA': { section: 'free-layout', labelJa: '機能実行画面デザイン', labelEn: 'Function screen design', table: 'TLN_M_GENERAL_POSITION' },
'FUNC_BUTTON_AREA_HEAD': { section: 'free-layout', labelJa: '機能実行画面デザイン', labelEn: 'Function screen design', table: 'TLN_M_GENERAL_POSITION' },
'CONDITION_AREA': { section: 'free-layout', labelJa: '機能実行画面デザイン', labelEn: 'Function screen design', table: 'TLN_M_GENERAL_POSITION' },
'FUNC_BUTTON_AREA_TOP': { section: 'free-layout', labelJa: '機能実行画面デザイン', labelEn: 'Function screen design', table: 'TLN_M_GENERAL_POSITION' },
'RESULT_AREA': { section: 'free-layout', labelJa: '機能実行画面デザイン', labelEn: 'Function screen design', table: 'TLN_M_GENERAL_POSITION' },
'FUNC_BUTTON_AREA_BTM': { section: 'free-layout', labelJa: '機能実行画面デザイン', labelEn: 'Function screen design', table: 'TLN_M_GENERAL_POSITION' },
'BLOCK': { section: 'free-layout', labelJa: 'ブロックデザイン(明細)', labelEn: 'Block design (list)', table: 'TLN_M_GENERAL_POSITION' },
'CONDITION': { section: 'free-layout', labelJa: 'ブロックデザイン(検索条件)', labelEn: 'Block design (search)', table: 'TLN_M_GENERAL_POSITION' },
// === DB スキャンで未対応だった追加分 (TLN_M_GENERAL_APP) ===
'EXECUTE_BTN_DISP_NAME': { section: 'app-application', labelJa: '確定ボタン表示名', labelEn: 'Confirm button display name', table: 'TLN_M_GENERAL_APP' },
'HELP_LINK_NM': { section: 'app-application', labelJa: 'ヘルプリンク表示名', labelEn: 'Help link name', table: 'TLN_M_GENERAL_APP' },
'HELP_URL': { section: 'app-application', labelJa: 'ヘルプURL', labelEn: 'Help URL', table: 'TLN_M_GENERAL_APP' },
// === DB スキャンで未対応だった追加分 (TLN_M_GENERAL_ITEM_OPTN) ===
// ※ BUTTON_AJAX_<N>, BUTTON_BAT_<N>, BUTTON_NEXT_<N>, OTHER_FUNC_<N>, SEND_MAIL_<N> 系は
// _<digits> サフィックスのフォールバック解決でカバーされる (TFC.funcKbnInfo 参照)
// ※ PLOT / PLOT_BTN_CND / PLOT_COL / PLOT_COL_MARKER_STYLE / PLOT_COL_PIE_OPTION は
// TALON 6.2 ソースに存在せず削除 (CHART 系は CHART_BASE / CHART_SERIES_BASE 等に置き換え済)
'BUTTON_LIST_OPT': { section: 'block-otherfunc', labelJa: 'LIST明細選択ボタンオプション', labelEn: 'LIST row select button option', table: 'TLN_M_GENERAL_ITEM_OPTN' },
// === DB設定マスタ.csv (talon-docs) との突合で判明した追加分 ===
// 機能タブ アプリケーション (FUNC_SEQ=-1)
'SEARCH_FLG': { section: 'app-application', labelJa: '検索ボタン表示', labelEn: 'Show search button', table: 'TLN_M_GENERAL_APP' },
'CLEAR_FLG': { section: 'app-application', labelJa: 'クリアボタン表示', labelEn: 'Show clear button', table: 'TLN_M_GENERAL_APP' },
'EXCEL_OUT_FLG': { section: 'app-application', labelJa: 'Excel出力ボタン表示', labelEn: 'Show Excel out button', table: 'TLN_M_GENERAL_APP' },
'PDF_OUT_FLG': { section: 'app-application', labelJa: 'PDF出力ボタン表示', labelEn: 'Show PDF out button', table: 'TLN_M_GENERAL_APP' },
// ブロック設定 詳細 (FUNC_SEQ != -1) — _<N> サフィックス連番系の基底キーとして登録
'BACK_COLOR_TR_CODE': { section: 'block-detail', labelJa: '行背景色 動的キー', labelEn: 'Row background color (dynamic key)', table: 'TLN_M_GENERAL_APP' },
'FORE_COLOR_TR_CODE': { section: 'block-detail', labelJa: '行文字色 動的キー', labelEn: 'Row foreground color (dynamic key)', table: 'TLN_M_GENERAL_APP' },
// ブロック 検索呼出 (DLプロシージャ)
'PL_SQL_NAME_DL': { section: 'block-proc', labelJa: '検索前プロシージャ (引出)', labelEn: 'Pre-search procedure (DL)', table: 'TLN_M_GENERAL_APP' },
'PL_SQL_NAME_AFTER_DL': { section: 'block-proc', labelJa: '検索後プロシージャ (引出)', labelEn: 'Post-search procedure (DL)', table: 'TLN_M_GENERAL_APP' },
// 項目情報 (TLN_M_GENERAL_ITEM_OPTN)
'ZERO_INT': { section: 'block-item', labelJa: 'ゼロ値ハイフン表示', labelEn: 'Show hyphen for zero', table: 'TLN_M_GENERAL_ITEM_OPTN' },
};
// FUNC_KBN は同種設定が複数登録されると `_<N>` 連番サフィックスが付くことがある
// 例: BUTTON_NEXT, BUTTON_NEXT_0, BUTTON_NEXT_1, ... (同じ FUNC_KBN 系列を別レコードとして保持)
// この場合、辞書に基底キーがあればフォールバックで該当エントリを返す
function _resolveBaseKbn(funcKbn) {
if (!funcKbn) return null;
if (FUNC_KBN_DICT[funcKbn]) return FUNC_KBN_DICT[funcKbn];
// _<digits> 末尾を削って再検索
var m = funcKbn.match(/^(.+?)_(\d+)$/);
if (m && FUNC_KBN_DICT[m[1]]) return FUNC_KBN_DICT[m[1]];
return null;
}
TFC.funcKbnInfo = function (funcKbn) {
return _resolveBaseKbn(funcKbn);
};
TFC.isKnownFuncKbn = function (funcKbn) {
return _resolveBaseKbn(funcKbn) != null;
};
// FUNC_KBN コード → 「ラベル (コード)」形式の表示文字列。
// lang='en' で labelEn があればそれを使用、なければ labelJa にフォールバック。
// labelEn の翻訳率は段階的に上げる方針。
TFC.fkLabel = function (funcKbn, lang) {
var info = _resolveBaseKbn(funcKbn);
if (!info) return funcKbn || '';
var label = null;
if (lang === 'en' && info.labelEn) label = info.labelEn;
if (!label) label = info.labelJa;
return label ? (label + ' (' + funcKbn + ')') : (funcKbn || '');
};
// ============================================================
// HTML テンプレート部品
// ============================================================
// favicon: TALON ロゴを 32x32 PNG に縮小し base64 化したもの (data URL で各HTMLに埋め込み)
// 元画像: _local/talon_cs2 - ロゴ(イメージ).png (252x243 RGBA)
// _local/favicon_32.png 経由で生成 / 約 1.5KB → base64 約 2KB
TFC.FAVICON_DATA_URL = 'data:image/png;base64,' +
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFxElEQVR42uWWXYgdZxnHf887X+fs2bPb' +
'PUk0bSLSFlFaP/ADxAvpBsWLNpRo2YJYK60liY3bbUwolV6cHCkI0qpUQ+1aP8CLyMYgNSUfbWyyF2KF' +
'VFHjYkWsF8KaZLO753POzLzzPl6cs5tuY9PdNb3yD8PMMMzz/Oed////vMI1hQr6ulsBEOWaY2zKY0o9' +
'pvrnatWst5RcU2L3P1tGhgKoA8NQ8IWDn7vEwy/eQaH8TZJWjiIUSoakOc53PjPtr351VRBRdh95B2Hh' +
'22B8wBKVApLGr3lq+ySDN0wRlT9OOmzxQ488uwi8D5ERwuIHyLogAkEBuq3rAFZP4MABAZSgWCYqfwE/' +
'hDyDUgXSOAMmEbMBPxrBpuCF4HLtSyMl7VryzCIipF0PsGsjsAQjOWkcY5MA1QzTCDA0e43o4rIMdRaX' +
'+ah2++8EhAWfLPYRgbAASctfH4E8FbxihPEMuTUYz6Aa9J9eR2EoQAkICmDnK1SrhgW7QLf1KjbNQAVj' +
'PNTW10fACxWhi+YBQobmAXgpAM4eozX/d7JOTtrxcPkluNXnqd+c4BZOUZy9bMlXnrHrdIEK1TMRjYvC' +
'0CalEQnt0DL5sWw9xlm7C/aeHGHR+zqm4tGwOdGAh8z/FjjMQyf2URi6kawNJvDJbYPvfvoR9r30UcKB' +
'+4mbDgxERYNNnubJbefW7oIkqTC4cT9+CDaBYhm69etR/QUTJ/dS2bqF+ix4AbQupcAjOL2V4vCDONez' +
'YXEIFmdPAefWnmCBsyTtJnHDoQ5cDrh5RJQ8fZy51ybpNmZJYgtyftkdcT0j6cQk7d61agqwdgIu8igM' +
'ljEmw9pDLJ6/nYXZx9h55HoGKqd54rZdpPF2NDdA1MtbNWACIAAJwASYnv7WRqB62ieJO8SNcRZmb6Ld' +
'ehSjN7Lh3b+kNPwXooG/8vALP+HcKzPYxICGlzXkVh6rFqGqcOCMR22bhZpj5zNzUHqVkc0HUe6kOGSw' +
'KSRtJbeg7jWma13ec+Rd5HkCQFuPk89/iDTudZZU8LN/Xt2GqsJhDHdLDsDOX21kcPBeYCdR6b2oQtIG' +
'dbaXD4HgbJv2+ZsZqOygOBLRbTdpDx+6mkXl6l8M7Dq6hWJxN8Y8QFTajE3ApvlSMAOCOsvgRp/Gv/dg' +
'3Tk2bJ1GFdpzCTYbxosrMPQR0k7vPb9oSJtn+cFdF/w3BIyHiAUsu45uoVTcA+YBwuIm0hjihgUxCN7r' +
'CDvCkk/70p+Y/d2zbP3kDHHT4jJQ5vje7Ql7T32K8qaf0Vns2bBQhqbsAJ7zL6+EKDUs901tYmTjXsSM' +
'U6oMksX0ppsPmntvWDXFGAdqSFv3cMMnHqU4fDOdxQQvDBBn+i7ISGOHTS2CkPoenrc0DbXX/MHnNxMW' +
'92PMOFEpJK7PUZ+dwUij32ozfvh+8hyW9l3qcoojPq25Jzj42T8zceLniAEviAgLEKeDPesaBXFAP4lE' +
'enWWXDB+bCte+EN80yDPdrN44WUS+y9+vKO5Qh8Tx79GVH6yr2YlGvRpL/ye2eZjjE15xM0vIVIhiR1Z' +
'W3C210XyEsUhH8395SRM22GfgCgcu0incxeTd3auHDwInDHUtlliDiGdbyHGw/g5Nu2Qtu7h8N0pVTXU' +
'5Ox/Dy9eJl7cR9pxqEpPuPrHK11QPd3XxKijhi7vaHvFla8e/SDhwB9wLqdY9mnO3cf3t/+U6mmf2jZL' +
'VQ0zhy/XvGVMqYlb7TSUZetdgTMGyPHCD+NHYHyf1sKPVjQH3rTZkrVXDLfRHBH1Vyj6zTBzUQFF3R0U' +
'ykL9wln42x7Gpjxqo/lb771Fl/aAy6itOv+rvbD58nPvZP90nf3Ti3zl+ZuWf83/iFUUGDWAUo6+yMDI' +
'EN3653l6+z+YUu+t/u+1gIAKt1V9Jl5sMX7sGyvF+nZjqdFDxx9n4uQLb0fzqxerjeZUqz4LLif2x0CF' +
'Gjn/f6iq6c2Ma4//AF9eqeub4bVbAAAAAElFTkSuQmCC';
TFC.FAVICON_LINK = '<link rel="icon" type="image/png" href="' + TFC.FAVICON_DATA_URL + '">';
TFC.htmlHead = function (titleText, lang) {
var l = lang || 'ja';
var t = TFC.escapeHtml(titleText);
return '<!DOCTYPE html>\n' +
'<html lang="' + l + '">\n' +
'<head>\n' +
'<meta charset="UTF-8">\n' +
'<meta name="viewport" content="width=device-width,initial-scale=1.0">\n' +
// ★ <head> 内で scrollRestoration=manual を確定 (戻る時の auto scroll と我々の scrollTo の競合を回避)
// <body> 末尾 script に置くと、ブラウザの auto restoration が先に走ってしまう。
'<script>if("scrollRestoration" in history){try{history.scrollRestoration="manual";}catch(e){}}</script>\n' +
TFC.FAVICON_LINK + '\n' +
'<title>' + t + '</title>\n' +
'<style>' + TFC.CSS + '</style>\n' +
'</head>\n<body>\n';
};
TFC.htmlTail = function () {
return '\n<script>' + TFC.JS_TAIL + '</script>\n</body>\n</html>\n';
};
TFC.tabBadge = function (isOn, count, lang) {
var l = (lang === 'en') ? 'en' : 'ja';
if (isOn) {
var unit = TFC.t('badge.unit', l);
var on = '● ' + TFC.t('badge.set', l) + ' (' + count + (unit ? ' ' + unit : '') + ')';
return '<span class="tab-status tab-status-on">' + on + '</span>';
}
return '<span class="tab-status tab-status-off">○ ' + TFC.t('badge.none', l) + '</span>';
};
TFC.htmlSection = function (titleHtml, bodyHtml, classes) {
var c = classes ? ' ' + classes : '';
var body = bodyHtml || '';
// body 内に展開可能 <details> が複数含まれる場合、タブ単位の「全展開/全閉じる」
// ツールバーを上部に自動付加。tab-on (= 設定あり) のセクションのみ対象。
var isOn = c.indexOf('tab-on') >= 0;
if (isOn && (body.match(/<details/g) || []).length >= 2) {
var lang = (typeof TFC.LANG === 'string' && TFC.LANG) ? TFC.LANG : 'ja';
var btnLblExp = (lang === 'en') ? 'Expand all' : '全て展開';
var btnLblCls = (lang === 'en') ? 'Collapse all' : '全て閉じる';
body = '<div class="tfc-item-toolbar">' +
'<button class="tfc-item-toolbar-btn" onclick="tfcTabExpandAll(this)">▶ ' + btnLblExp + '</button>' +
'<button class="tfc-item-toolbar-btn" onclick="tfcTabCollapseAll(this)">▼ ' + btnLblCls + '</button>' +
'</div>' + body;
}
return '<details class="screen-section' + c + '">\n' +
'<summary>' + titleHtml + '</summary>\n' +
'<div class="section-body">\n' + body + '\n</div>\n' +
'</details>\n';
};
// よくある「タブセクション = ラベル + バッジ + body」パターンの便利ラッパ。
// labelKey: TFC.t() のキー (例: 'sec.funcDesc')
// bodyHtml: セクション本文 (空文字列なら off 扱い)
// count: バッジ件数 (省略時は body が空でなければ 1 扱い)
// lang: 'ja' | 'en'
// body が空なら tab-off + 件数 0、そうでなければ tab-on + 件数 N を表示する。
TFC.tabSection = function (labelKey, bodyHtml, count, lang) {
var hasBody = bodyHtml != null && String(bodyHtml).length > 0;
var n = (count == null) ? (hasBody ? 1 : 0) : count;
var on = n > 0 && hasBody;
var summary = TFC.t(labelKey, lang) + ' ' + TFC.tabBadge(on, n, lang);
return TFC.htmlSection(summary, hasBody ? bodyHtml : '', on ? 'tab-on' : 'tab-off');
};
/* 初期表示: 全設定タブは func-card (1レベル目) のみ open、内側はすべて close
全展開・全閉じ・カードのみ・設定ありのみ等の操作は controls ボタンから行う
★ 注意: 「全閉じ」は FuncDoc.html (details.func-card がある画面) でしか望ましくない。
Domains.html / DomainMatrix.html / er-diagram.html 等の他ページでは details
の構造が違うので、 func-card が無い場合はこのロジック自体をスキップする。 */
TFC.JS_TAIL =
"document.addEventListener('DOMContentLoaded',function(){" +
// FuncDoc.html (= details.func-card を持つ) でのみ全閉じ + カード展開を行う。
// 他ページでは details の初期状態を尊重 (HTML の open 属性に従う)
"if(document.querySelector('details.func-card')){" +
"document.querySelectorAll('details').forEach(function(d){d.open=false;});" +
"document.querySelectorAll('details.func-card,details.shared-card').forEach(function(d){d.open=true;});" +
"}" +
// コードブック sidebar クリック → 対象コードブロックへスムーズスクロール + フラッシュ表示
"document.querySelectorAll('.tfc-cb-side a').forEach(function(a){" +
"a.addEventListener('click',function(ev){" +
"var hr=a.getAttribute('href')||'';" +
"if(hr.charAt(0)!=='#')return;" +
"var tgt=document.getElementById(hr.substring(1));" +
"if(!tgt)return;" +
"ev.preventDefault();" +
"document.querySelectorAll('.tfc-cb-side a.tfc-cb-active').forEach(function(x){x.classList.remove('tfc-cb-active');});" +
"a.classList.add('tfc-cb-active');" +
"document.querySelectorAll('.tfc-fn-block.tfc-fn-target').forEach(function(x){x.classList.remove('tfc-fn-target');});" +
"tgt.classList.add('tfc-fn-target');" +
"tgt.scrollIntoView({behavior:'smooth',block:'start'});" +
"});" +
"});" +
"});" +
"function tfcAll(open){document.querySelectorAll('details').forEach(function(d){d.open=open;});}" +
"function tfcCardOnly(){document.querySelectorAll('details.func-card,details.shared-card').forEach(function(d){d.open=true;});" +
"document.querySelectorAll('details.func-card details, details.shared-card details').forEach(function(d){d.open=false;});}" +
"function tfcOnOnly(){document.querySelectorAll('details').forEach(function(d){d.open=true;});" +
"document.querySelectorAll('details.tab-off').forEach(function(d){d.open=false;});}";
// 仕様書 §8 の色パレットを採用
TFC.CSS = "body{font-family:'Segoe UI',Meiryo,sans-serif;background:#f1f5f9;color:#1e293b;margin:0;padding:0 12px 32px;line-height:1.55}" +
"h1{font-size:1.5em;margin:18px 0 8px}" +
".meta{font-size:.9em;color:#475569;margin-bottom:6px}" +
".legend{font-size:.85em;color:#475569;margin:6px 0}" +
".controls{position:sticky;top:0;background:#fff;padding:8px;border-bottom:1px solid #cbd5e1;z-index:10;margin-bottom:12px}" +
".controls button{margin-right:6px;padding:4px 10px;font-size:.9em;cursor:pointer;border:1px solid #94a3b8;background:#f8fafc;border-radius:3px}" +
".controls button:hover{background:#e2e8f0}" +
"details.func-card{border:2px solid #cbd5e1;border-radius:6px;background:#fff;margin:14px 0;padding:6px 10px}" +
"details.func-card[open]{border-color:#7dd3fc}" +
"details.func-card>summary{font-weight:bold;font-size:1.1em;cursor:pointer;padding:4px 0}" +
"details.shared-card{border:2px solid #f59e0b;border-radius:6px;background:#fef3c7;margin:14px 0;padding:6px 10px}" +
"details.block-card{border:1px solid #7dd3fc;border-radius:4px;margin:8px 0;padding:4px 8px;background:#f0f9ff}" +
"details.screen-section{border:1px solid #e2e8f0;border-radius:3px;margin:6px 0;padding:4px 8px;background:#f8fafc}" +
"details.screen-section.tab-on{border-color:#86efac;background:#f0fdf4}" +
"details.screen-section.tab-off{border-color:#e2e8f0;background:#f8fafc;opacity:.85}" +
"details>summary{cursor:pointer;outline:none}" +
".tab-status{font-size:.85em;margin-left:8px}" +
".tab-status-on{color:#15803d}" +
".tab-status-off{color:#94a3b8}" +
".section-body{padding:6px 0 6px 12px}" +
"table.kv{border-collapse:collapse;margin:4px 0;width:auto}" +
"table.kv th,table.kv td{border:1px solid #cbd5e1;padding:3px 8px;font-size:.92em;text-align:left;vertical-align:top}" +
"table.kv th{background:#f1f5f9;color:#475569;white-space:nowrap;min-width:160px}" +
"table.kv td.val{background:#fff}" +
"table.kv td.kv-code{background:#f8fafc;color:#64748b;font-size:.78em;width:1%;white-space:nowrap;font-family:Consolas,monospace}" +
"table.kv-compact{table-layout:auto;width:auto}" +
"table.kv-compact th{min-width:0;padding:2px 6px;white-space:nowrap;font-size:.85em}" +
"table.kv-compact td{padding:2px 6px;font-size:.88em;white-space:nowrap;max-width:280px;overflow:hidden;text-overflow:ellipsis}" +
"table.kv-compact td:hover{overflow:visible;white-space:normal;background:#fef3c7}" +
"code,pre{font-family:Consolas,'Courier New',monospace}" +
"pre.sql-code,pre.js-code{background:#0f172a;color:#a5f3fc;padding:8px 10px;border-radius:4px;overflow:auto;font-size:.85em;margin:4px 0;white-space:pre-wrap;word-break:break-word}" +
"details.tfc-code-box{display:block;margin:4px 0;border-left:3px solid #38bdf8;padding-left:8px;background:#f0f9ff}" +
"details.tfc-code-box>summary{cursor:pointer;color:#0369a1;font-weight:bold;padding:4px 6px;list-style:none}" +
"details.tfc-code-box>summary::-webkit-details-marker{display:none}" +
"details.tfc-code-box>summary::before{content:'\\25B8';display:inline-block;margin-right:6px;transition:transform .15s}" +
"details.tfc-code-box[open]>summary::before{transform:rotate(90deg)}" +
"details.tfc-code-box .tfc-code-len{color:#64748b;font-weight:normal;font-size:.85em}" +
".kbn{display:inline-block;background:#fef3c7;color:#b45309;padding:1px 6px;border-radius:3px;font-size:.82em;font-family:Consolas,monospace}";
// ============================================================
// PG 由来 SELECT 結果の キー大文字化 (DB 横断対応)
// PostgreSQL は bare alias を lowercase 化するため、 row['FUNC_ID'] (uppercase 直書き)
// ではアクセスできない。 全 row を JS object に変換 + キーを uppercase 化して、
// コード本体は DB 種別を意識せず row['FUNC_ID'] で書けるようにする。
// - TALON.select() / TALON.getBlockData_List() 等の戻り値はすべて selectU 経由が望ましい
// - 副作用なしの純粋な正規化 (元の Java Map は変更しない)
// ============================================================
TFC.normalizeRows = function (rows) {
if (rows == null) return rows;
var n = (typeof rows.size === 'function') ? rows.size() : rows.length;
for (var ni = 0; ni < n; ni++) {
var src = rows[ni];
if (src == null) continue;
if (typeof src.entrySet !== 'function') continue; // 既に純 JS object 化済
var dst = {};
var iter = src.entrySet().iterator();
while (iter.hasNext()) {
var e = iter.next();
dst[String(e.getKey()).toUpperCase()] = e.getValue();
}
if (typeof rows.set === 'function') rows.set(ni, dst);
}
return rows;
};
// TFC.selectU(sql): TALON.select() のラッパで返り値を normalize する。
// DB 横断の SELECT は必ずこれを使うこと (PG / SQL Server / MySQL / Oracle 共通)
// ※ ユーザー入力を含む WHERE 句がある場合は TFC.selectPS (PreparedStatement) を使うこと。
TFC.selectU = function (sql) { return TFC.normalizeRows(TALON.select(sql)); };
// TFC.selectUByConn(conn, sql): 任意の DB 接続 (= 複数DB接続の外部 DB) で SELECT。
// conn は TALON.getOtherDBConn("N") (N=1..15) で取得する TalonConfig。
// 主 TALON DB の場合は TFC.selectU でも TALON.getDbConfig() でも可。
// manual §5.20.10 / API 4.8.3 準拠。
//
// Nashorn ではグローバル TalonDbUtil が利用可能 (TALON が import 済)。
// 存在判定は typeof で行う (Java.type 解決の package パスに依存しない)。
TFC.selectUByConn = function (conn, sql) {
if (!conn) return TFC.selectU(sql);
if (typeof TalonDbUtil === 'undefined') {
// フォールバック: TalonDbUtil グローバルが見つからない → 主 DB の TALON.select で代替
try { TALON.getLogger().writeWarn('[TFC] selectUByConn: TalonDbUtil グローバル未定義 → 主 DB で代替'); } catch (ig) {}
return TFC.selectU(sql);
}
return TFC.normalizeRows(TalonDbUtil.select(conn, sql));
};
// ============================================================
// SQL インジェクション対策 (PreparedStatement パターン)
// セキュア設定マニュアル「6.1. SQLインジェクション対応」の
// V6.2.18 以前バージョン向け実装に準拠。
// ユーザー入力 (検索条件・チェック行の値・URL パラメータ等) を SQL に
// 組み込む箇所では 必ず TFC.selectPS / TFC.updatePS を使うこと。
//
// 使い方:
// var rows = TFC.selectPS(
// "SELECT FUNC_ID, FUNC_NM FROM TLN_M_GENERAL_FUNC WHERE FUNC_ID = ?",
// [funcId] // ← JS Array で OK
// );
// // rows: [{FUNC_ID: 'TLN_FUNC_DOC', FUNC_NM: '...'}, ...] (キーは uppercase 正規化済)
//
// var cnt = TFC.updatePS(
// "UPDATE tln_m_general_item SET col_name = ? WHERE func_id = ? AND col_name = ?",
// [lowerNm, funcId, upperNm]
// );
// ============================================================
var _HashMap = Java.type('java.util.HashMap');
// 内部: Connection 取得 (トランザクション未開始時は beginTransaction)
function _getConn(dbConfig) {
try {
return dbConfig.getDataSource().getConnection();
} catch (e) {
try { TalonDbUtil.beginTransaction(dbConfig); }
catch (e2) { /* 既に begin 済 */ }
return dbConfig.getDataSource().getConnection();
}
}
// 内部: PreparedStatement にパラメータを bind (setObject で型自動判別)
function _bindParams(stmt, params) {
if (params == null) return;
var n = (typeof params.length === 'function') ? params.length() :
(typeof params.length === 'number' ? params.length : params.size());
for (var i = 0; i < n; i++) {
var v = (typeof params.get === 'function') ? params.get(i) : params[i];
stmt.setObject(i + 1, v);
}
}
// 内部: ResultSet を [{COL_NAME: value, ...}, ...] 形式 (uppercase キー) で読み出し
function _readResultSet(rs) {
var md = rs.getMetaData();
var nc = md.getColumnCount();
var result = [];
while (rs.next()) {
var row = {};
for (var c = 1; c <= nc; c++) {
// getColumnLabel は AS 句の alias も取れる。 PG では lowercase で返るが
// uppercase に正規化して DB 横断対応とする。
row[String(md.getColumnLabel(c)).toUpperCase()] = rs.getObject(c);
}
result.push(row);
}
// selectU (Java List) との互換性のため size() メソッドを生やす
result.size = function () { return this.length; };
return result;
}
/**
* SELECT を PreparedStatement で実行 (SQL インジェクション安全).
* @param sql プレースホルダ「?」を含む SELECT 文
* @param params JS Array または java.util.ArrayList (省略可)
* @returns Array<{COL_NAME: value, ...}> (uppercase キー)
*/
TFC.selectPS = function (sql, params) {
var dbConfig = TALON.getDbConfig();
var conn = _getConn(dbConfig);
var stmt = null, rs = null;
try {
stmt = conn.prepareStatement(sql);
_bindParams(stmt, params);
rs = stmt.executeQuery();
return _readResultSet(rs);
} finally {
if (rs != null) { try { rs.close(); } catch (e) {} }
if (stmt != null) { try { stmt.close(); } catch (e) {} }
// Connection は TALON のトランザクション管理対象のため close しない
}
};
/**
* テーブルの列名一覧 (UPPER) を取得する (Ver0.51)。
*
* WHERE 1=0 の 0 行 SELECT の ResultSetMetaData から列名を得るため、
* 「列が無ければ失敗する SELECT を発行して catch で分岐」する方式と違い
* ★PostgreSQL のトランザクション汚染 (失敗文以降が 25P02 で全部失敗) を
* 起こさずにスキーマ差 (SETUP 前後 / 旧版列) を検出できる。
* 追加列のフォールバック分岐は必ずこちらを使うこと。
* @param tableName テーブル名 (内部固定値のみ。ユーザー入力を渡さない)
* @returns Array<string> 列名 (UPPER)。テーブル不在などは例外がそのまま伝播
*/
TFC.tableColumns = function (tableName) {
var dbConfig = TALON.getDbConfig();
var conn = _getConn(dbConfig);
var stmt = null, rs = null;
try {
stmt = conn.prepareStatement('SELECT * FROM ' + tableName + ' WHERE 1=0');
rs = stmt.executeQuery();
var md = rs.getMetaData();
var n = md.getColumnCount();
var out = [];
for (var i = 1; i <= n; i++) {
out.push(String(md.getColumnLabel(i)).toUpperCase());
}
return out;
} finally {
if (rs != null) { try { rs.close(); } catch (e) {} }
if (stmt != null) { try { stmt.close(); } catch (e) {} }
// Connection は TALON のトランザクション管理対象のため close しない
}
};
/**
* INSERT/UPDATE/DELETE を PreparedStatement で実行.
* @param sql プレースホルダ「?」を含む SQL
* @param params JS Array または java.util.ArrayList (省略可)
* @returns 影響行数 (int)
*/
TFC.updatePS = function (sql, params) {
var dbConfig = TALON.getDbConfig();
var conn = _getConn(dbConfig);
var stmt = null;
try {
stmt = conn.prepareStatement(sql);
_bindParams(stmt, params);
return stmt.executeUpdate();
} finally {
if (stmt != null) { try { stmt.close(); } catch (e) {} }
// Connection は閉じない (上記と同じ理由)
}
};
// ================================================================
// 画面文言の言語変換 (ja⇔en) — セットアップ画面の [日本語に変換]/[英語に変換]
//
// TALON は 1 機能内で機能名・項目名等の言語切替を持たないため、リポジトリの
// 表示値そのものを環境単位で書き換える (参考実装: ASP_SYS0010 change_language)。
// 標準メッセージ (CMN_W0008 等) はサーバ側で機能名・ブロックタイトルを合成する
// ので、DOM 書き換えではなくこの方式でないと言語が揃わない。
//
// - 正本 CSV は ja。リポジトリ再取込後は再度ボタンを押す運用
// - UI_LANG はキーベース対訳 (キー→[ja, en]) — ja⇔en 完全可逆
// - 対象は表示値のみ (機能名/ブロックTITLE/項目DISP_NAME/タブ・ボタンラベル/
// 製品汎用CD DSP1/宿題一覧 BODY_SQL の状態リテラル)。物理名・SQL構造・
// 顧客データには触れない。UPDATE は全て値ガード付き (現在値が対訳と一致する
// 行だけ書き換え = 冪等 & 利用者が変更した値はスキップ)
// - 現在言語 = 汎用CD TLN_FUNC_DOC_LANGUAGE/LANG の DSP1 ('ja'|'en')
// - ★変換後は デザイナ作り直し (verify_designer_roundtrip) でエラーなし・
// 差分ゼロが合格条件 (英語名は FUNC_NM<=50 / TITLE<=25 / DISP_NAME<=40 目安)
// ================================================================
var UI_LANG = {
FUNC_NM: {
'TLN_FUNC_DOC': ['Commonweal機能設計書出力', 'Commonweal Function Documents Output'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST': ['Commonweal業務データ辞書物理属性一覧', 'Commonweal Business Data Dictionary Attributes'],
'TLN_FUNC_DOC_DOMAIN_EDIT': ['Commonweal業務データ辞書記入', 'Commonweal Business Data Dictionary Entry'],
'TLN_FUNC_DOC_DOMAIN_LIST': ['Commonweal業務データ辞書一覧', 'Commonweal Business Data Dictionary List'],
'TLN_FUNC_DOC_DOMAIN_MAINTE': ['Commonweal業務データ辞書メンテナンス', 'Commonweal Business Data Dictionary Maintenance'],
'TLN_FUNC_DOC_DOMAIN_SEARCH': ['Commonweal業務データ辞書検索', 'Commonweal Dictionary Search'],
'TLN_FUNC_DOC_DOMAIN_TASKS': ['Commonweal業務データ辞書宿題一覧', 'Commonweal Business Data Dictionary Tasks'],
'TLN_FUNC_DOC_EDM': ['Commonweal_EDMメンテナンス', 'Commonweal EDM Maintenance'],
'TLN_FUNC_DOC_EDM_ATTR_SUGGEST': ['Commonweal_EDM属性サジェスト', 'Commonweal EDM Attribute Suggest'],
'TLN_FUNC_DOC_EXCL_MAINTE': ['Commonweal照合除外メンテナンス', 'Commonweal Matching Exclusion Maintenance'],
'TLN_FUNC_DOC_EXCL_PICK': ['Commonweal照合除外登録', 'Commonweal Matching Exclusion Registration'],
'TLN_FUNC_DOC_SETUP': ['Commonwealセットアップ', 'Commonweal Setup']
},
TITLE: {
'TLN_FUNC_DOC|0': ['機能一覧', 'Functions'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0': ['物理属性一覧', 'Physical attributes'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0': ['業務データ辞書記入', 'Dictionary entry'],
'TLN_FUNC_DOC_DOMAIN_LIST|0': ['業務データ辞書', 'Business data dictionary'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0': ['業務データ辞書', 'Business data dictionary'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|1': ['物理属性明細', 'Attribute details'],
'TLN_FUNC_DOC_DOMAIN_SEARCH|0': ['業務データ辞書', 'Business data dictionary'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0': ['宿題一覧', 'Task list'],
'TLN_FUNC_DOC_EDM|0': ['EDM情報', 'EDM info'],
'TLN_FUNC_DOC_EDM_ATTR_SUGGEST|0': ['EDM属性候補', 'EDM attr candidates'],
'TLN_FUNC_DOC_EXCL_MAINTE|0': ['照合除外', 'Matching exclusions'],
'TLN_FUNC_DOC_EXCL_PICK|0': ['テーブル別', 'By table'],
'TLN_FUNC_DOC_EXCL_PICK|1': ['列名別', 'By column']
},
DISP_NAME: {
'TLN_FUNC_DOC|0|TLN_FUNC_DOC_OUT_FLG': ['出力対象', 'Output'],
'TLN_FUNC_DOC|0|FUNC_ID': ['機能ID', 'Function ID'],
'TLN_FUNC_DOC|0|FUNC_ID_IN': ['機能ID(IN)', 'Function ID (IN)'],
'TLN_FUNC_DOC|0|FUNC_ID_LIKE': ['機能ID(LIKE)', 'Function ID (LIKE)'],
'TLN_FUNC_DOC|0|FUNC_NM': ['機能名', 'Function name'],
'TLN_FUNC_DOC|0|APP_KBN': ['アプリケーション区分', 'Application type'],
'TLN_FUNC_DOC|0|BG_L': ['業務分類(大)', 'Business category (L)'],
'TLN_FUNC_DOC|0|BG_M': ['業務分類(中)', 'Business category (M)'],
'TLN_FUNC_DOC|0|BG_S': ['業務分類(小)', 'Business category (S)'],
'TLN_FUNC_DOC|0|FUNC_OUTLINE': ['機能概要', 'Function outline'],
'TLN_FUNC_DOC|0|PROJECT_SEL': ['出力対象プロジェクト', 'Output project'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|PROJECT_ID': ['プロジェクト', 'Project'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|ATTR_NM': ['物理属性名', 'Physical attribute name'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|EDM_ATTR': ['EDM属性', 'EDM attribute'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|DOMAIN_CD': ['データドメインコード', 'Data domain code'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|MAIN_NM': ['データドメイン名', 'Data domain name'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|DOMAIN_KIND': ['辞書種別', 'Dictionary kind'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|RESP_DEPT': ['責任部門', 'Department'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST|0|NOTE': ['備考', 'Notes'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|MAIN_NM': ['データドメイン名称', 'Data domain name'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|RESP_DEPT': ['責任部門', 'Department'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|PROJECT_ID': ['プロジェクト', 'Project'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|BIZ_DEFN': ['業務的定義', 'Business definition'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|BIZ_RULE': ['ビジネスルール', 'Business rules'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|DERIVE_RULE': ['導出ルール (値の算出方法)', 'Derivation rules (calculation)'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|TACIT_KNOWLEDGE': ['暗黙知・運用慣習', 'Tacit knowledge'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|HANDOVER_NOTE': ['ITへの申し送り', 'Handover to IT'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|DOMAIN_CD': ['データドメインコード', 'Data domain code'],
'TLN_FUNC_DOC_DOMAIN_EDIT|0|DOMAIN_KIND': ['辞書種別', 'Dictionary kind'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|PROJECT_ID': ['プロジェクト', 'Project'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|DOMAIN_CD': ['データドメインコード', 'Data domain code'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|MAIN_NM': ['データドメイン名称', 'Data domain name'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|DOMAIN_KIND': ['辞書種別', 'Dictionary kind'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|CNT': ['物理属性数', 'Attribute count'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|RESP_DEPT': ['責任部門', 'Department'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|CREATED_USER_NM': ['作成者', 'Created by'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|CREATED_DATE': ['作成日', 'Created date'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|UPDATED_USER_NM': ['最終更新者', 'Last updated by'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|UPDATED_DATE': ['更新日', 'Updated date'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|BIZ_DEFN': ['業務的定義', 'Business definition'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|BIZ_RULE': ['ビジネスルール', 'Business rules'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|DERIVE_RULE': ['導出ルール', 'Derivation rules'],
'TLN_FUNC_DOC_DOMAIN_LIST|0|TACIT_KNOWLEDGE': ['暗黙知・運用慣習', 'Tacit knowledge'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|DOMAIN_CD': ['データドメインコード', 'Data domain code'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|PROJECT_ID': ['プロジェクト', 'Project'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|MAIN_NM': ['データドメイン名', 'Data domain name'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|DOMAIN_KIND': ['辞書種別', 'Dictionary kind'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|RESP_DEPT': ['責任部門', 'Department'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|CREATED_USER_NM': ['作成者', 'Created by'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|CREATED_DATE': ['作成日', 'Created date'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|UPDATED_USER_NM': ['最終更新者', 'Last updated by'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|UPDATED_DATE': ['最終更新日', 'Last updated'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|BIZ_DEFN': ['業務的定義', 'Business definition'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|BIZ_RULE': ['ビジネスルール', 'Business rules'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|DERIVE_RULE': ['導出ルール (値の算出方法)', 'Derivation rules (calculation)'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|TACIT_KNOWLEDGE': ['暗黙知・運用慣習', 'Tacit knowledge'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|0|HANDOVER_NOTE': ['ITへの申し送り', 'Handover to IT'],
'TLN_FUNC_DOC_DOMAIN_SEARCH|0|DOMAIN_CD': ['データドメインコード', 'Data domain code'],
'TLN_FUNC_DOC_DOMAIN_SEARCH|0|MAIN_NM': ['データドメイン名称', 'Data domain name'],
'TLN_FUNC_DOC_DOMAIN_SEARCH|0|DOMAIN_KIND': ['辞書種別', 'Dictionary kind'],
'TLN_FUNC_DOC_DOMAIN_SEARCH|0|RESP_DEPT': ['責任部門', 'Department'],
'TLN_FUNC_DOC_DOMAIN_SEARCH|0|PROJECT_ID': ['プロジェクト', 'Project'],
'TLN_FUNC_DOC_DOMAIN_SEARCH|0|UPDATED_DATE': ['最終更新日', 'Last updated'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|1|DOMAIN_CD': ['ドメインコード', 'Domain code'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|1|ATTR_NM': ['物理属性名', 'Physical attribute name'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|1|EDM_ATTR': ['EDM属性', 'EDM attribute'],
'TLN_FUNC_DOC_DOMAIN_MAINTE|1|NOTE': ['備考', 'Notes'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|PROJECT_SRCH': ['プロジェクト', 'Project'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|RESP_DEPT': ['責任部門', 'Department'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|MAIN_NM': ['データドメイン名称', 'Data domain name'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|MISSING_FLG': ['未記入のみ', 'Unfilled only'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|REG_STS': ['状態', 'Status'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|RESP_DEPT_NM': ['責任部門名', 'Department name'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|PROJECT_ID': ['プロジェクトID', 'Project ID'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|BIZ_DEFN_STS': ['業務的定義', 'Business definition'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|BIZ_RULE_STS': ['ビジネスルール', 'Business rules'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|DERIVE_RULE_STS': ['導出ルール', 'Derivation rules'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|TACIT_STS': ['暗黙知', 'Tacit knowledge'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|ALIAS_CNT': ['物理属性数', 'Attribute count'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|EDM_NMS': ['出典EDM', 'Source EDM'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|UPDATED_USER_NM': ['最終更新者', 'Last updated by'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|UPDATED_DATE': ['最終更新日', 'Last updated'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|DOMAIN_CD': ['データドメインコード', 'Data domain code'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|MISSING_CNT': ['未記入数', 'Unfilled count'],
'TLN_FUNC_DOC_DOMAIN_TASKS|0|STS_ORD': ['状態順', 'By status'],
'TLN_FUNC_DOC_EDM|0|EDM_CD': ['EDMコード', 'EDM code'],
'TLN_FUNC_DOC_EDM|0|EDM_NM': ['EDM表示名', 'EDM display name'],
'TLN_FUNC_DOC_EDM|0|PROJECT_ID': ['プロジェクト', 'Project'],
'TLN_FUNC_DOC_EDM|0|SORT_NO': ['表示順', 'Display order'],
'TLN_FUNC_DOC_EDM|0|SRC_FILE': ['EDMデータ', 'EDM data'],
'TLN_FUNC_DOC_EDM|0|SRC_FILE_READ': ['EDM表示', 'EDM display'],
'TLN_FUNC_DOC_EDM|0|NOTE': ['コメント', 'Comment'],
'TLN_FUNC_DOC_EDM|0|CREATED_DATE': ['作成日', 'Created date'],
'TLN_FUNC_DOC_EDM|0|UPDATED_DATE': ['更新日', 'Updated date'],
'TLN_FUNC_DOC_EDM|0|MODIFY_COUNT': ['更新数', 'Update count'],
'TLN_FUNC_DOC_EDM_ATTR_SUGGEST|0|ATTR_NM': ['EDM属性', 'EDM attribute'],
'TLN_FUNC_DOC_EXCL_MAINTE|0|DB_NO': ['接続先', 'Connection'],
'TLN_FUNC_DOC_EXCL_MAINTE|0|TBL_NM': ['物理テーブル名', 'Physical table name'],
'TLN_FUNC_DOC_EXCL_MAINTE|0|COL_NM': ['物理項目名', 'Physical column name'],
'TLN_FUNC_DOC_EXCL_MAINTE|0|LOGICAL_TBL_NM': ['論理テーブル名', 'Logical table name'],
'TLN_FUNC_DOC_EXCL_MAINTE|0|LOGICAL_COL_NM': ['論理項目名', 'Logical column name'],
'TLN_FUNC_DOC_EXCL_MAINTE|0|NOTE': ['コメント', 'Comment'],
'TLN_FUNC_DOC_EXCL_PICK|0|PICK_FLG': ['除外', 'Exclude'],
'TLN_FUNC_DOC_EXCL_PICK|0|FUNC_ID_IN': ['機能ID(IN)', 'Function ID (IN)'],
'TLN_FUNC_DOC_EXCL_PICK|0|FUNC_ID_LIKE': ['機能ID(LIKE)', 'Function ID (LIKE)'],
'TLN_FUNC_DOC_EXCL_PICK|0|FUNC_NM': ['機能名', 'Function name'],
'TLN_FUNC_DOC_EXCL_PICK|0|APP_KBN': ['アプリケーション区分', 'Application type'],
'TLN_FUNC_DOC_EXCL_PICK|0|BG_L': ['業務分類(大)', 'Business category (L)'],
'TLN_FUNC_DOC_EXCL_PICK|0|BG_M': ['業務分類(中)', 'Business category (M)'],
'TLN_FUNC_DOC_EXCL_PICK|0|BG_S': ['業務分類(小)', 'Business category (S)'],
'TLN_FUNC_DOC_EXCL_PICK|0|FUNC_OUTLINE': ['機能概要', 'Function outline'],
'TLN_FUNC_DOC_EXCL_PICK|0|DB_NO': ['接続先', 'Connection'],
'TLN_FUNC_DOC_EXCL_PICK|0|TBL_NM': ['物理テーブル名', 'Physical table name'],
'TLN_FUNC_DOC_EXCL_PICK|0|LOGICAL_TBL_NM_U': ['論理テーブル名(大小文字不問)', 'Logical table name (ignore case)'],
'TLN_FUNC_DOC_EXCL_PICK|0|COL_NM': ['物理項目名', 'Physical column name'],
'TLN_FUNC_DOC_EXCL_PICK|0|LOGICAL_COL_NM_U': ['論理項目名(大小文字不問)', 'Logical column name (ignore case)'],
'TLN_FUNC_DOC_EXCL_PICK|0|COL_TYPE': ['型', 'Type'],
'TLN_FUNC_DOC_EXCL_PICK|0|FUNC_CNT': ['参照機能数', 'Function count'],
'TLN_FUNC_DOC_EXCL_PICK|0|EXCL_STS_NM': ['除外状態', 'Exclusion status'],
'TLN_FUNC_DOC_EXCL_PICK|0|LOGICAL_TBL_NM': ['論理テーブル名', 'Logical table name'],
'TLN_FUNC_DOC_EXCL_PICK|0|LOGICAL_COL_NM': ['論理項目名', 'Logical column name'],
'TLN_FUNC_DOC_EXCL_PICK|1|PICK_FLG': ['除外', 'Exclude'],
'TLN_FUNC_DOC_EXCL_PICK|1|FUNC_ID_IN': ['機能ID(IN)', 'Function ID (IN)'],
'TLN_FUNC_DOC_EXCL_PICK|1|FUNC_ID_LIKE': ['機能ID(LIKE)', 'Function ID (LIKE)'],
'TLN_FUNC_DOC_EXCL_PICK|1|FUNC_NM': ['機能名', 'Function name'],
'TLN_FUNC_DOC_EXCL_PICK|1|APP_KBN': ['アプリケーション区分', 'Application type'],
'TLN_FUNC_DOC_EXCL_PICK|1|BG_L': ['業務分類(大)', 'Business category (L)'],
'TLN_FUNC_DOC_EXCL_PICK|1|BG_M': ['業務分類(中)', 'Business category (M)'],
'TLN_FUNC_DOC_EXCL_PICK|1|BG_S': ['業務分類(小)', 'Business category (S)'],
'TLN_FUNC_DOC_EXCL_PICK|1|FUNC_OUTLINE': ['機能概要', 'Function outline'],
'TLN_FUNC_DOC_EXCL_PICK|1|DB_NO': ['接続先', 'Connection'],
'TLN_FUNC_DOC_EXCL_PICK|1|COL_NM': ['物理項目名', 'Physical column name'],
'TLN_FUNC_DOC_EXCL_PICK|1|LOGICAL_COL_NM_U': ['論理項目名(大小文字不問)', 'Logical column name (ignore case)'],
'TLN_FUNC_DOC_EXCL_PICK|1|TBL_CNT': ['出現テーブル数', 'Table count'],
'TLN_FUNC_DOC_EXCL_PICK|1|EXCL_STS_NM': ['除外状態', 'Exclusion status'],
'TLN_FUNC_DOC_EXCL_PICK|1|LOGICAL_COL_NM': ['論理項目名', 'Logical column name'],
'TLN_FUNC_DOC_SETUP|0|DSP1': ['DBセットアップ', 'DB setup']
},
APP_VALUE: {
'TLN_FUNC_DOC|-1|EXECUTE_BTN_NAME_DISP_FORMULA': ['\'設計書出力\'', '\'Generate documents\''],
'TLN_FUNC_DOC_EXCL_PICK|-1|EXECUTE_BTN_NAME_DISP_FORMULA': ['\'除外登録\'', '\'Register exclusions\''],
'TLN_FUNC_DOC_EXCL_PICK|0|TAB_MENU_NAME': ['テーブル別', 'By table'],
'TLN_FUNC_DOC_EXCL_PICK|1|TAB_MENU_NAME': ['列名別', 'By column']
},
BTN_KIND: {
'処理実行': ['処理実行', 'Execute'],
'業務データ辞書': ['業務データ辞書', 'Business data dictionary'],
'ドメイン新規作成': ['ドメイン新規作成', 'New domain'],
'詳細': ['詳細', 'Details'],
'データドメイン新規作成': ['データドメイン新規作成', 'New data domain'],
'現場記入': ['現場記入', 'Business entry'],
'IT記入': ['IT記入', 'IT entry'],
'日本語に変換': ['日本語に変換', 'Convert to Japanese'],
'英語に変換': ['英語に変換', 'Convert to English'],
'メニュー登録': ['メニュー登録', 'Register menu']
},
// 明細行ボタンのラベル (TLN_M_GENERAL_USES.KEY_CODE)。
// ★対象は 利用者定義ボタン (OPTN='BUTTON') だけ。 TALON 標準の
// 参照 / 複写 / 削除 (OPTN='VIEW'/'COPY'/'DELETE') は TALON 自身が
// 所有するラベルで、 デザイナのブロック設定 [設定] (SAVE_BTN) が
// 既定値で再生成する (= 英訳しても保存 1 回で日本語へ戻る)。 実測:
// en 状態で roundtrip すると 'View'→'参照' 等の差分が必ず出る。
// フレームワークが再生成する値には製品から触れない。
USES_LABEL: {
'詳細': ['詳細', 'Details'],
'現場記入': ['現場記入', 'Business entry'],
'IT記入': ['IT記入', 'IT entry']
},
// 項目グループ名 (TLN_M_GENERAL_ITEM.GROUP_NAME)。 ラベル文字列単位で
// TLN_FUNC_DOC% 全機能へ適用 (No.119: グループ見出しが英語に変換されなかった)
GROUP_NAME: {
'ITとの受け渡し': ['ITとの受け渡し', 'IT handover'],
'意味の記述': ['意味の記述', 'Meaning description'],
'定義': ['定義', 'Definitions'],
'更新情報': ['更新情報', 'Update info']
},
HANYO_DSP1: {
'TLN_FUNC_DOC_APP_KBN|BAT': ['検索ボタン無し', 'No search button'],
'TLN_FUNC_DOC_APP_KBN|FREE': ['フリー検索条件', 'Free search condition'],
'TLN_FUNC_DOC_APP_KBN|STD': ['固定検索条件', 'Fixed search condition'],
'TLN_FUNC_DOC_APP_KBN|SUB': ['検索子画面', 'Sub search screen'],
'TLN_FUNC_DOC_DB_NO|0': ['0:主DB', '0:Primary DB'],
'TLN_FUNC_DOC_DB_NO|ALL': ['ALL:全接続先(串刺し)', 'ALL:All connections'],
'TLN_FUNC_DOC_DOMAIN_KIND|CATEGORY': ['カテゴリ', 'Category'],
'TLN_FUNC_DOC_DOMAIN_KIND|DATE': ['日付', 'Date'],
'TLN_FUNC_DOC_DOMAIN_KIND|IDENTIFIER': ['識別子', 'Identifier'],
'TLN_FUNC_DOC_DOMAIN_KIND|MONEY': ['金額', 'Amount'],
'TLN_FUNC_DOC_DOMAIN_KIND|OTHER': ['その他 (警告対象外)', 'Other (excluded from warnings)'],
'TLN_FUNC_DOC_DOMAIN_KIND|PENDING': ['(分類待ち — IT が設定)', '(Pending — IT will classify)'],
'TLN_FUNC_DOC_DOMAIN_KIND|QUANTITY': ['数量', 'Quantity'],
'TLN_FUNC_DOC_DOMAIN_KIND|TEXT': ['テキスト', 'Text']
},
// メニューのフォルダ名 (TLN_M_AUTHORITY.FUNC_NM)。 ja/en 同値でも
// 対訳として持っておく (将来の改名で片方だけ直す事故を防ぐ)
MENU_GRP: {
'systemCOMMONWEAL': ['Commonweal', 'Commonweal']
},
// メニューの表示名 (TLN_M_FUNCTION.FUNC_NM)。
// ★ここが メニュー登録 (TFC.registerMenu / MENU_DEF) の登録名の正本でもある。
// 登録は環境の現在言語 (TFC.uiLang) 側の値を書き込む。
// ★★呼称は 3 系統 (機能名 FUNC_NM / メニュー MENU_NM / マニュアル表記) で
// 必ず一致させる (テスター指摘 No.137 / Ver0.62)。 規則は
// 機能名 = 'Commonweal' + 統一名 (英字で始まる名は 'Commonweal_' + 統一名)
// メニュー = 統一名 (= 機能名から製品名を取り除いたもの)
// マニュアル = 統一名
// en も同じ規則 (機能名 = 'Commonweal ' + 統一名の Title Case /
// メニュー = 統一名の Sentence case)。 旧版では「メニューは短い運用名」と
// していたが、 短くなっておらず利用者が画面を同定できないため撤廃した。
MENU_NM: {
'TLN_FUNC_DOC': ['機能設計書出力', 'Function documents output'],
'TLN_FUNC_DOC_EDM': ['EDMメンテナンス', 'EDM maintenance'],
'TLN_FUNC_DOC_DOMAIN_TASKS': ['業務データ辞書宿題一覧', 'Business data dictionary tasks'],
'TLN_FUNC_DOC_DOMAIN_LIST': ['業務データ辞書一覧', 'Business data dictionary list'],
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST': ['業務データ辞書物理属性一覧', 'Business data dictionary attributes'],
'TLN_FUNC_DOC_DOMAIN_MAINTE': ['業務データ辞書メンテナンス', 'Business data dictionary maintenance'],
'TLN_FUNC_DOC_EXCL_MAINTE': ['照合除外メンテナンス', 'Matching exclusion maintenance'],
'TLN_FUNC_DOC_EXCL_PICK': ['照合除外登録', 'Matching exclusion registration']
},
// 宿題一覧 (TLN_FUNC_DOC_DOMAIN_TASKS) の BODY_SQL に直書きされた表示値。
// ★★2 値 CASE の両辺 ('済' / '未') に入る訳語は **バイト長を揃える** こと。
// Oracle は CASE の両辺が同じ長さの文字列リテラルなら CHAR(n) を、
// 長さが違うと VARCHAR2(n) を導出する。 導出型はデザイナの
// [項目情報生成] → [設定] が TLN_M_GENERAL_ITEM.DATA_TYPE へ書き戻すため、
// 長さが揃っていないと en 状態のデザイナ保存で CHAR→VARCHAR2 に化け、
// 出荷 CSV (CHAR) と食い違って roundtrip 差分になる (実測: 'Done'(4) と
// 'To do'(5) で BIZ_DEFN_STS 他 4 列が VARCHAR2 化)。
// → 'Done'(4) / 'Todo'(4) のように同バイト長の語を選ぶ。
// (ja 側は '済'(3B) / '未'(3B) で揃っている)
SQL_LIT: {
'未登録': ['未登録', 'Not registered'],
'済': ['済', 'Done'],
'未': ['未', 'Todo'],
'EDM配置済': ['EDM配置済', 'On EDM'],
'EDM未配置': ['EDM未配置', 'Not on EDM']
}
};
// ============================================================
// EDM 属性宣言 (TLN_M_FUNC_DOMAIN_ATTR.EDM_ATTR) の共通ヘルパ (Ver0.51)
// 宣言記法: 属性名 (無修飾) または エンティティ名.属性名 (修飾)。
// カンマ区切り (半角/全角/読点) で複数宣言可。 全角ピリオドは修飾区切りとして受理。
// 設計書出力 (update-before) とメンテ画面の入力補助 (DOMAIN_MAINTE) の双方で使う。
// ============================================================
TFC.parseEdmAttrDecl = function (raw) {
var out = [];
var s = TFC.s(raw);
if (!s) return out;
var parts = s.split(/[,,、]/);
for (var i = 0; i < parts.length; i++) {
var t = parts[i].replace(/\s+/g, ' ').replace(/^ | $/g, '');
if (t) out.push(t);
}
return out;
};
// ============================================================
// .a5er (A5:SQL Mk-2 ネイティブ) の軽量パーサ — 唯一の正 (Ver0.53)
//
// Ver0.52 までは 「宿題一覧の突合用 (型欄のドメイン名)」 と 「メンテ画面の
// 入力補助用 (エンティティ×属性名)」 で 2 つのパーサが並存し、 二重管理に
// なっていた。 両者が必要とする値は同じ Field= 行から取れるので 1 つに統合する。
//
// 戻り値 (a5er でなければ null):
// { entities: [{ nm: LName, cd: PName,
// attrs: [{ nm: 論理属性名, cd: 物理属性名, domain: 型欄 }] }],
// domainInfos: [ユーザー定義ドメインの定義名, ...] }
//
// ★仕様メモ (Ver0.52 までの 2 実装の挙動を維持するための約束):
// - Field= は CSV。 toks[0]=論理名 / toks[1]=物理名 / toks[2]=型欄
// - 型欄の先頭 '*' は A5M2 のユーザー定義ドメイン参照 → 剥がす
// - LName が空のエンティティも entities に載せる (型欄の集合は失わない)。
// 「エンティティ名が要る用途」 (属性カタログ) 側で捨てること
// - DomainInfo= は [Manager] のユーザー定義ドメイン定義 (名前 = dtoks[0])
// ============================================================
function _a5erUnesc(v) {
return String(v || '')
.replace(/\\\\/g, '\x00').replace(/\\n/g, '\n').replace(/\\t/g, '\t')
.replace(/\\Q/g, '"').replace(/\\q/g, "'").replace(/\x00/g, '\\');
}
function _a5erCsv(s) {
var out = [], i = 0, n = s.length;
while (i < n) {
if (s.charAt(i) === '"') {
i++; var t = '';
while (i < n) {
var ch = s.charAt(i);
if (ch === '"') { if (s.charAt(i + 1) === '"') { t += '"'; i += 2; continue; } i++; break; }
t += ch; i++;
}
out.push(t);
while (i < n && s.charAt(i) !== ',') i++;
if (i < n) i++;
} else {
var j = s.indexOf(',', i);
if (j < 0) { out.push(s.substring(i)); break; }
out.push(s.substring(i, j)); i = j + 1;
}
}
for (var u = 0; u < out.length; u++) out[u] = _a5erUnesc(out[u]);
return out;
}
function _a5erNorm(s) {
return String(s == null ? '' : s).replace(/\s+/g, ' ').replace(/^ | $/g, '');
}
TFC.parseA5er = function (text) {
if (!text) return null;
text = String(text).replace(/^/, '');
if (text.indexOf('A5:ER') < 0) return null; // .a5er 以外 (旧 drawio / SVG 等)
var res = { entities: [], domainInfos: [] };
var lines = text.split(/\r\n|\r|\n/);
var section = '', cur = null;
for (var i = 0; i < lines.length; i++) {
var ln = lines[i];
var st = ln.replace(/^\s+|\s+$/g, '');
if (st.charAt(0) === '[' && st.charAt(st.length - 1) === ']') {
if (cur) res.entities.push(cur);
section = st.substring(1, st.length - 1);
cur = (section === 'Entity') ? { nm: '', cd: '', attrs: [] } : null;
continue;
}
var eq = ln.indexOf('=');
if (eq < 0) continue;
var key = ln.substring(0, eq);
var val = ln.substring(eq + 1);
if (key === 'DomainInfo') {
var dnm = _a5erNorm(_a5erCsv(val)[0] || '');
if (dnm) res.domainInfos.push(dnm);
continue;
}
if (!cur) continue;
if (key === 'LName') cur.nm = _a5erNorm(val);
else if (key === 'PName') cur.cd = _a5erNorm(val);
else if (key === 'Field') {
var toks = _a5erCsv(val);
var dom = _a5erNorm(toks[2] || '');
if (dom.charAt(0) === '*') dom = dom.substring(1).replace(/^\s+/, '');
cur.attrs.push({
nm: _a5erNorm(toks[0] || ''),
cd: _a5erNorm(toks[1] || ''),
domain: dom
});
}
}
if (cur) res.entities.push(cur);
return res;
};
// ============================================================
// EDM 属性カタログ TLN_M_FUNC_EDM_ATTR_WK の洗い替え (Ver0.53)
//
// 登録済み EDM (.a5er) の中身を SQL で読めるテーブルにする。
// ★変化点は 「EDM の登録・差替・削除の確定」 だけ なので、 洗い替えの呼出も
// EDM メンテの確定後 (0S101) と セットアップ実行時 の 2 箇所だけにする。
// 辞書 (語・物理属性) の更新では EDM の中身は変わらないため呼ばない
// — 辞書との突合は 宿題一覧の検索時に SQL で行う
// (TFC.rebuildDomainTasksWkFromCatalog)。 これにより Excel 一括更新や
// 直接 SQL のような 「フックを通らない辞書更新」 でもずれない。
//
// 行種別 (ROW_KBN):
// 'E' = EDM 読取マーカー (SEQ_NO=0)。 .a5er として読めた EDM 1 件につき 1 行。
// 宿題一覧の 「読取れた EDM が 1 件以上あるか」 判定に使う
// 'A' = エンティティ属性行。 ENTITY_NM/CD + ATTR_NM/CD + DOMAIN_NM (型欄)
// 'D' = ユーザー定義ドメインの定義行 (DomainInfo)。 DOMAIN_NM のみ
// 'P' = 属性名 1 件 = 1 行の 「可視プロジェクト」 索引 (Ver0.61 / テスター指摘 No.134)。
// ATTR_NM + PJ_LIST (区切り文字連結のトークン列)。 EDM 属性サジェストの
// 候補元 (検索子画面) が この行だけを読み、 呼出元のプロジェクトで絞る。
// SEQ_NO=0 は 署名行 (ATTR_NM 空 / PJ_LIST=既知トークン列) — 再構築要否の判定用
//
// 確定トランザクション内で動く前提 (PreparedStatement 可・明示 commit 不要)。
// 識別子は未引用 = PG の小文字折りたたみで両対応。
// ============================================================
var EDM_ATTR_WK = 'TLN_M_FUNC_EDM_ATTR_WK';
var EDM_CAT_NM_MAX = 400; // ENTITY_NM / ATTR_NM / DOMAIN_NM / EDM_NM の列サイズ
var EDM_CAT_QNM_MAX = 801; // QUALIFIED_NM の列サイズ (400 + '.' + 400)
var EDM_CAT_PROJ_MAX = 200; // PROJECT_ID の列サイズ
var EDM_CAT_PJLIST_MAX = 2000; // PJ_LIST の列サイズ (可視プロジェクトのトークン列)
var EDM_CAT_PJ_CD = '*'; // 'P' 行の EDM_CD (PK 用の固定値 — 特定 EDM に属さない行)
// ★SEQ_NO は数値列。 JS の数値をそのまま setObject すると Nashorn が Double に
// 変換し、 PostgreSQL の INTEGER 列で型不一致になり得るため Integer で束縛する
var _JInt = Java.type('java.lang.Integer');
function _edmCatCut(s, n) {
var v = TFC.s(s);
return (v.length > n) ? v.substring(0, n) : v;
}
// .a5er の実ファイルを読む (DB 値 "物理パス//元ファイル名" → 実パス。 本体と同一規約)
function _edmCatReadSrc(basePath, srcVal) {
var v = TFC.s(srcVal);
if (!basePath || !v) return null;
var sepIdx = v.indexOf('//');
var physName = sepIdx >= 0 ? v.substring(0, sepIdx) : v;
if (!physName) return null;
var fullPath = (physName.indexOf('/') >= 0 || physName.indexOf('\\') >= 0)
? (basePath + '/' + physName)
: (basePath + '/TLN_M_FUNC_EDM/SRC_FILE/' + physName);
try {
var Files = Java.type('java.nio.file.Files');
var Paths = Java.type('java.nio.file.Paths');
var JString = Java.type('java.lang.String');
var pth = Paths.get(fullPath);
if (!Files.exists(pth)) return null;
return new JString(Files.readAllBytes(pth), 'UTF-8') + '';
} catch (eRd) {
return null;
}
}
/**
* EDM 属性カタログ (TLN_M_FUNC_EDM_ATTR_WK) を洗い替える。
* @returns {edms: 読取れた EDM 数, attrs: 属性行数, domains: DomainInfo 行数}
*/
TFC.rebuildEdmAttrWk = function () {
// --- 1. EDM 台帳 + ファイル置き場 ---
var thumb = '';
try {
var pRows = TFC.selectPS(
'SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE = ? AND KEY_CODE = ?',
['TLN_GENERAL', 'THUMBNAIL_UPLOAD_PATH']);
if (pRows.length > 0) thumb = TFC.s(pRows[0]['DSP1']);
} catch (eTh) { /* 未設定なら EDM を読めない = カタログは空になる */ }
var hasPj = false;
try { hasPj = TFC.tableColumns('TLN_M_FUNC_EDM').indexOf('PROJECT_ID') >= 0; } catch (eTc) {}
var edmRows = TFC.selectPS(
'SELECT EDM_CD,' + (hasPj ? ' PROJECT_ID,' : '') +
' EDM_NM, SRC_FILE FROM TLN_M_FUNC_EDM ORDER BY EDM_CD', []);
// --- 2. 先に全部パースする (途中で失敗しても既存カタログを壊さない) ---
var parsed = [];
for (var ei = 0; ei < edmRows.length; ei++) {
var er = edmRows[ei];
var edmCd = TFC.s(er['EDM_CD']);
if (!edmCd) continue;
var text = _edmCatReadSrc(thumb, er['SRC_FILE']);
if (!text) continue;
var doc = TFC.parseA5er(text);
if (doc == null) continue; // .a5er ではない (旧 drawio データ等)
parsed.push({
cd: edmCd,
nm: _edmCatCut(er['EDM_NM'], EDM_CAT_NM_MAX),
proj: _edmCatCut(_a5erNorm(TFC.s(er['PROJECT_ID'])), EDM_CAT_PROJ_MAX),
doc: doc
});
}
// --- 3. 洗い替え (DELETE + INSERT。 一意衝突は行単位スキップ) ---
TFC.updatePS('DELETE FROM ' + EDM_ATTR_WK, []);
var INS = 'INSERT INTO ' + EDM_ATTR_WK +
' (EDM_CD, ROW_KBN, SEQ_NO, EDM_NM, PROJECT_ID, ENTITY_NM, ENTITY_CD,' +
' ATTR_NM, ATTR_CD, DOMAIN_NM, QUALIFIED_NM, PJ_LIST)' +
' VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
var nAttr = 0, nDom = 0;
function insRow(p) {
try { TFC.updatePS(INS, p); return true; }
catch (eIns) {
// 一意制約 (照合順序による同値衝突等) はスキップ — EXCL_PICK No.77 と同じ流儀
if (!/DOMA2004|unique|constraint|重複|PRIMARY|duplicate/i.test(String(eIns))) throw eIns;
return false;
}
}
for (var pi = 0; pi < parsed.length; pi++) {
var p = parsed[pi];
var seq = 0;
insRow([p.cd, 'E', _JInt.valueOf(0), p.nm, p.proj, '', '', '', '', '', '', '']);
for (var en = 0; en < p.doc.entities.length; en++) {
var ent = p.doc.entities[en];
var entNm = _edmCatCut(ent.nm, EDM_CAT_NM_MAX);
var entCd = _edmCatCut(ent.cd, EDM_CAT_NM_MAX);
for (var at = 0; at < ent.attrs.length; at++) {
var a = ent.attrs[at];
var attrNm = _edmCatCut(a.nm, EDM_CAT_NM_MAX);
// ★型欄が 400 字超のときは DOMAIN_NM を空にする (旧実装の
// 「NM_MAXLEN 超はスキップ」 と同じ = 突合に参加しない)
var dom = (TFC.s(a.domain).length > EDM_CAT_NM_MAX) ? '' : TFC.s(a.domain);
var qnm = (entNm && attrNm) ? _edmCatCut(entNm + '.' + attrNm, EDM_CAT_QNM_MAX) : '';
seq++;
if (insRow([p.cd, 'A', _JInt.valueOf(seq), p.nm, p.proj, entNm, entCd,
attrNm, _edmCatCut(a.cd, EDM_CAT_NM_MAX), dom, qnm, ''])) nAttr++;
}
}
for (var di = 0; di < p.doc.domainInfos.length; di++) {
var dnm2 = TFC.s(p.doc.domainInfos[di]);
if (!dnm2 || dnm2.length > EDM_CAT_NM_MAX) continue;
seq++;
if (insRow([p.cd, 'D', _JInt.valueOf(seq), p.nm, p.proj,
'', '', '', '', dnm2, '', ''])) nDom++;
}
}
// --- 4. 可視プロジェクト索引 ('P' 行) を作り直す (Ver0.61) ---
var nPj = 0;
try { nPj = TFC.rebuildEdmAttrPjRows(true, false).rows; } catch (ePj) {
try { TALON.getLogger().writeWarn('[TFC-EDM-CATALOG] 可視プロジェクト索引の再構築をスキップ: ' + ePj); } catch (ig3) {}
}
try {
TALON.getLogger().writeInfo('[TFC-EDM-CATALOG] EDM 属性カタログ洗い替え: EDM ' +
parsed.length + ' 件 / 属性 ' + nAttr + ' 行 / ドメイン定義 ' + nDom + ' 行' +
' / 可視プロジェクト索引 ' + nPj + ' 行');
} catch (eLg) {}
return { edms: parsed.length, attrs: nAttr, domains: nDom, pjRows: nPj };
};
// ============================================================
// 可視プロジェクト索引 ('P' 行) — テスター指摘 No.134 (Ver0.61)
//
// EDM 属性サジェスト (検索子画面 TLN_FUNC_DOC_EDM_ATTR_SUGGEST) の候補を
// 「呼出元のデータドメインが属するプロジェクト」 で絞るための索引。
//
// ★なぜ事前展開するのか
// TALON はチェックボックス項目を引数にすると
// CONCAT(sep, CONCAT(列, sep)) LIKE '%sep+トークン+sep%' (選択トークンの OR)
// という 「トークンの重なり」 条件を **派生表の外側** に付ける
// (TLN_GENERALFREEDao#editSelectCondition)。 つまり
// ① 突合する列を SELECT リストへ射影しなければならない
// ② 「プロジェクト未設定の EDM = 全プロジェクトから見える」 を表すには
// 既知トークンを列側に並べておくしかない (全トークンの列挙が要る)
// ③ 候補は 1 行 = 1 オプション なので 属性名 1 件 = 1 行に畳む必要がある
// (畳まないと 「商品コード」 が EDM の数だけ候補に並ぶ)
// ②③ は文字列集約 (LISTAGG/STRING_AGG/GROUP_CONCAT) が要り 方言依存になる。
// さらにサジェストの子画面 SQL には ORDER BY を書けない (SQL Server の派生表制約)
// ので LISTAGG の WITHIN GROUP も使えない。 そこで JS 側で畳んで 'P' 行に持つ。
//
// ★陳腐化と再構築
// 'P' 行は 汎用CD TLN_FUNC_DOC_PROJECT の増減・辞書側 PROJECT_ID の変更でも
// 古くなる (新しいプロジェクトのドメインで候補が 0 件 = フェイルクローズになる)。
// そのため 「既知トークン列」 を署名行 (SEQ_NO=0) に持ち、 変化したときだけ
// 作り直す。 業務データ辞書メンテナンスの **検索前JS** から毎回呼んでも、 通常は
// SELECT 数本で終わる (冪等・低コスト)。 候補の取得は検索と同じ要求の中で
// 走るので、 検索前に追随させれば 「使う瞬間に必ず正しい」 が保証できる。
// ============================================================
// 属性名 → 可視プロジェクトのトークン列 を組み立てる (★純関数 — Node 単体回帰の対象)。
// attrRows : [{ ATTR_NM, PROJECT_ID }] ('A' 行。 PROJECT_ID = その EDM の所属)
// known : 既知プロジェクトトークンの配列 (昇順)
// sep : チェックボックスの区切り文字
// 戻り値 : [{ attrNm, pjList }] を attrNm 昇順で (= SEQ_NO が決定的になる)
// 規則: その属性を持つ EDM のうち 1 つでも 「プロジェクト未設定」 があれば
// 既知トークン全部 (= 誰から見ても可視)、 なければ所属トークンの和集合。
function _tfcEdmAttrPjRows(attrRows, known, sep) {
var s = String(sep || ';');
var allJoin = (known || []).join(s);
var map = {}, order = [];
for (var i = 0; i < (attrRows || []).length; i++) {
var r = attrRows[i] || {};
var nm = (r['ATTR_NM'] == null) ? '' : String(r['ATTR_NM']);
if (!nm) continue;
if (!map[nm]) { map[nm] = { seen: {}, toks: [], all: false }; order.push(nm); }
var pj = _tfcSplitProjectIds(r['PROJECT_ID'], s);
if (pj.length === 0) { map[nm].all = true; continue; }
for (var t = 0; t < pj.length; t++) {
if (!map[nm].seen[pj[t]]) { map[nm].seen[pj[t]] = 1; map[nm].toks.push(pj[t]); }
}
}
order.sort();
var out = [];
for (var o = 0; o < order.length; o++) {
var e = map[order[o]];
out.push({ attrNm: order[o], pjList: e.all ? allJoin : e.toks.sort().join(s) });
}
return out;
}
TFC.edmAttrPjRows = _tfcEdmAttrPjRows;
// 既知プロジェクトトークン (昇順・重複なし)。
// 汎用CD TLN_FUNC_DOC_PROJECT の KEY_CODE (= 画面のチェックボックスが出す値) に加え、
// EDM / 辞書に実際に格納されている値も拾う (汎用CD から消された後も残る値の救済)。
TFC.knownProjectTokens = function (sep) {
var s = sep || TFC.checkboxSep();
var seen = {}, out = [];
function add(raw) {
var toks = _tfcSplitProjectIds(raw, s);
for (var i = 0; i < toks.length; i++) {
if (!seen[toks[i]]) { seen[toks[i]] = 1; out.push(toks[i]); }
}
}
try {
var hc = TFC.selectPS(
'SELECT KEY_CODE FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE = ?',
['TLN_FUNC_DOC_PROJECT']);
for (var h = 0; h < hc.length; h++) add(hc[h]['KEY_CODE']);
} catch (eH) { /* 汎用CD 未投入 = 拾えるものだけ */ }
var srcs = [{ t: 'TLN_M_FUNC_EDM', c: 'PROJECT_ID' },
{ t: 'TLN_M_FUNC_DOMAIN', c: 'PROJECT_ID' }];
for (var si = 0; si < srcs.length; si++) {
try {
if (TFC.tableColumns(srcs[si].t).indexOf(srcs[si].c) < 0) continue;
var rs = TFC.selectPS('SELECT DISTINCT ' + srcs[si].c + ' AS PJ FROM ' + srcs[si].t, []);
for (var r2 = 0; r2 < rs.length; r2++) add(rs[r2]['PJ']);
} catch (eS) { /* 列が無い旧 DB / 権限なし = スキップ */ }
}
out.sort();
return out;
};
/**
* 可視プロジェクト索引 ('P' 行) を作り直す。
* @param {boolean} force true = 署名が同じでも必ず作り直す (カタログ洗い替え直後)
* @param {boolean} commit true = 書込み後に明示 commit する。
* ★検索前JS (0R100) はトランザクション外で走り、 検索の終了時に
* rollback されるため 明示 commit しないと索引が残らない
* (宿題一覧の TFC.rebuildDomainTasksWkFromCatalog と同じ作法)。
* 確定処理 (0S101 = EDM 確定) から呼ぶときは TALON の
* トランザクション管理に任せる = commit しない。
* @returns {rows: 作った属性行数, skipped: 署名一致でスキップしたか}
*/
TFC.rebuildEdmAttrPjRows = function (force, commit) {
var res = { rows: 0, skipped: false };
// PJ_LIST は Ver0.61 追加列 — セットアップ未実行の旧 DB では列が無い
try {
if (TFC.tableColumns(EDM_ATTR_WK).indexOf('PJ_LIST') < 0) {
res.skipped = true;
return res;
}
} catch (eTc2) { res.skipped = true; return res; }
var sep = TFC.checkboxSep();
var known = TFC.knownProjectTokens(sep);
var sigFull = known.join(sep);
var sig = (sigFull.length > EDM_CAT_PJLIST_MAX)
? sigFull.substring(0, EDM_CAT_PJLIST_MAX) : sigFull;
if (!force) {
try {
var cur = TFC.selectPS(
'SELECT PJ_LIST FROM ' + EDM_ATTR_WK +
" WHERE EDM_CD = ? AND ROW_KBN = 'P' AND SEQ_NO = 0", [EDM_CAT_PJ_CD]);
if (cur.length > 0 && TFC.s(cur[0]['PJ_LIST']) === sig) {
res.skipped = true;
return res;
}
} catch (eSg) { /* 署名が読めない = 作り直す */ }
}
var attrRows = TFC.selectPS(
'SELECT ATTR_NM, PROJECT_ID FROM ' + EDM_ATTR_WK + " WHERE ROW_KBN = 'A'", []);
var rows = _tfcEdmAttrPjRows(attrRows, known, sep);
TFC.updatePS('DELETE FROM ' + EDM_ATTR_WK + " WHERE ROW_KBN = 'P'", []);
var INS_P = 'INSERT INTO ' + EDM_ATTR_WK +
' (EDM_CD, ROW_KBN, SEQ_NO, EDM_NM, PROJECT_ID, ENTITY_NM, ENTITY_CD,' +
' ATTR_NM, ATTR_CD, DOMAIN_NM, QUALIFIED_NM, PJ_LIST)' +
' VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
function insP(seqNo, attrNm, pjList) {
try {
TFC.updatePS(INS_P, [EDM_CAT_PJ_CD, 'P', _JInt.valueOf(seqNo), '', '', '', '',
attrNm, '', '', '', pjList]);
return true;
} catch (eIp) {
if (!/DOMA2004|unique|constraint|重複|PRIMARY|duplicate/i.test(String(eIp))) throw eIp;
return false;
}
}
// SEQ_NO=0 = 署名行 (ATTR_NM 空 = 子画面の LIKE '_%' で候補に出ない)
insP(0, '', sig);
// 列幅を超えるときは **区切りの手前で** 切る (トークンを途中で割ると
// 別プロジェクトに化ける危険があるため。 落ちたプロジェクトからは
// その候補が見えなくなるので警告も出す)
function cutTokens(list) {
if (list.length <= EDM_CAT_PJLIST_MAX) return list;
var cutAt = list.lastIndexOf(sep, EDM_CAT_PJLIST_MAX);
return (cutAt > 0) ? list.substring(0, cutAt) : '';
}
var truncated = 0;
for (var i = 0; i < rows.length; i++) {
var pjl = rows[i].pjList;
if (pjl.length > EDM_CAT_PJLIST_MAX) {
pjl = cutTokens(pjl);
truncated++;
}
if (insP(i + 1, _edmCatCut(rows[i].attrNm, EDM_CAT_NM_MAX), pjl)) res.rows++;
}
if (truncated > 0) {
try {
TALON.getLogger().writeWarn('[TFC-EDM-CATALOG] 可視プロジェクト列が ' +
EDM_CAT_PJLIST_MAX + ' 文字を超えたため切り詰めました (' + truncated +
' 行)。 プロジェクト数が多すぎる可能性があります');
} catch (igT) {}
}
if (commit) {
try { TalonDbUtil.commit(TALON.getDbConfig()); } catch (eCm) {}
}
return res;
};
// 登録済み EDM の属性カタログ (エンティティ×属性名) を取得する。
// メンテ画面の入力補助 (EDM 属性宣言の存在チェック + 候補提示) 用。
// Ver0.53: .a5er の直接パースをやめ、 カタログ WK を読む
// (ファイルを読むのは TFC.rebuildEdmAttrWk = EDM 確定時 / SETUP 実行時だけ)。
// 戻り値: { hasData: bool, entities: [{ nm, cd, attrs: [属性名,...],
// attrDoms: [ドメイン欄の値,...] }] }
// attrDoms は attrs と同じ添字で対応する 型欄 (A5M2 ドメイン列) の値。
// Ver0.55: 宣言先が別のデータドメインに解決される場合の警告で使う
// (既存の呼出は attrs だけを見るため後方互換)。
// EDM 未登録 / カタログ未作成 (SETUP 未実行) → hasData=false (検証はスキップ)
TFC.listEdmAttrCatalog = function () {
var res = { hasData: false, entities: [] };
try {
var rows = TFC.selectPS(
'SELECT EDM_CD, ENTITY_NM, ENTITY_CD, ATTR_NM, DOMAIN_NM FROM ' + EDM_ATTR_WK +
" WHERE ROW_KBN = 'A' ORDER BY EDM_CD, SEQ_NO", []);
var cur = null, curEdm = null, curNm = null, curCd = null;
for (var i = 0; i < rows.length; i++) {
var entCd = TFC.s(rows[i]['ENTITY_CD']);
// 論理名 (LName) 未設定なら物理名 (PName) へフォールバック —
// 出力側レジストリ (_loadEdmRegistry の nm = lname || pname) と同一規則。
// ここで捨てると「設計書では解決されるのに確定時検証だけ迷子警告」の
// 非整合になる (2026-08-24 整合監査で検出)
var entNm = TFC.s(rows[i]['ENTITY_NM']) || entCd;
if (!entNm) continue; // 論理名も物理名も無いエンティティのみ除外
var edmCd = TFC.s(rows[i]['EDM_CD']);
// カタログは EDM 内の出現順 (SEQ_NO) で並ぶので 連続する同一エンティティをまとめる
if (cur == null || edmCd !== curEdm || entNm !== curNm || entCd !== curCd) {
cur = { nm: entNm, cd: entCd, attrs: [], attrDoms: [] };
res.entities.push(cur);
curEdm = edmCd; curNm = entNm; curCd = entCd;
}
var attrNm = TFC.s(rows[i]['ATTR_NM']);
if (attrNm) {
cur.attrs.push(attrNm);
cur.attrDoms.push(TFC.s(rows[i]['DOMAIN_NM']));
}
}
res.hasData = res.entities.length > 0;
} catch (e) {
try { TALON.getLogger().writeInfo('[TFC] EDM 属性カタログ取得スキップ: ' + e); } catch (ig) {}
}
return res;
};
// ドメイン名 (EDM の型欄の値) → DOMAIN_CD の 2 段階解決器を作る (Ver0.55)。
// ① MAIN_NM 完全一致 → ② 物理属性 (ATTR_NM) 照合。 いずれも前後空白除去 +
// 大文字化した完全一致で、 複数候補は DOMAIN_CD 昇順の先頭 (= 決定的)。
// ★設計書出力本体の _resolveEdmDomainCd / 宿題一覧の resolveCd と同一規則。
// いずれかを変えたら 3 箇所とも必ず揃えること (照合規約は 1 つ)。
// 修飾物理属性 (テーブル.項目) は物理列照合専用のため 照合に参加しない。
// 戻り値: { resolve: function (ドメイン名) -> DOMAIN_CD | null,
// mainNm: function (DOMAIN_CD) -> データドメイン名 (無ければコードそのもの) }
TFC.domainCdResolver = function () {
var byMain = {}, byAttr = {}, nmByCd = {};
function norm(s) {
return String(s == null ? '' : s).replace(/\s+/g, ' ').replace(/^ | $/g, '');
}
try {
var dRows = TFC.selectU('SELECT DOMAIN_CD, MAIN_NM FROM TLN_M_FUNC_DOMAIN ORDER BY DOMAIN_CD');
for (var di = 0; di < dRows.size(); di++) {
var mnRaw = norm(TFC.s(dRows[di]['MAIN_NM']));
var mn = mnRaw.toUpperCase();
var mcd = TFC.s(dRows[di]['DOMAIN_CD']);
if (!mcd) continue;
if (mnRaw && !nmByCd[mcd]) nmByCd[mcd] = mnRaw;
if (mn && !byMain[mn]) byMain[mn] = mcd;
}
var aRows = TFC.selectU(
'SELECT DOMAIN_CD, ATTR_NM FROM TLN_M_FUNC_DOMAIN_ATTR ORDER BY DOMAIN_CD, SEQ_NO');
for (var ai = 0; ai < aRows.size(); ai++) {
var anRaw = norm(TFC.s(aRows[ai]['ATTR_NM']));
var acd = TFC.s(aRows[ai]['DOMAIN_CD']);
if (!anRaw || !acd) continue;
// 修飾物理属性 (テーブル.項目) は除外 (ドット 1 個かつ両側が非空)
var anDot = anRaw.replace(/./g, '.');
var dot1 = anDot.indexOf('.');
if (dot1 > 0 && dot1 < anDot.length - 1 && anDot.indexOf('.', dot1 + 1) < 0) continue;
var anU = anRaw.toUpperCase();
if (!byAttr[anU]) byAttr[anU] = acd;
}
} catch (eIdx) {
try { TALON.getLogger().writeInfo('[TFC] ドメイン名索引の構築スキップ: ' + eIdx); } catch (ig2) {}
}
return {
resolve: function (rawText) {
var t = norm(rawText);
if (!t) return null;
var key = t.toUpperCase();
if (byMain[key]) return byMain[key];
if (byAttr[key]) return byAttr[key];
return null;
},
mainNm: function (cd) {
var k = TFC.s(cd);
return nmByCd[k] || k;
}
};
};
// ============================================================
// プロジェクト (コンテキスト) 集合の比較 (Ver0.57)
// PROJECT_ID は TALON チェックボックス複数値 (区切り文字連結 "A;B") で持つ。
// ★意味論: 空 (未選択) = 「全プロジェクトと重なる」(共通)。 設計書出力の
// _projectVisible (行側が空なら常に可視) と同じ扱いで、 出力時に必ず同居する。
// 純関数なので Node 単体回帰の対象 (tests/test_domain_name_dup.py)。
// ============================================================
// 区切り文字連結の PROJECT_ID をトークン配列へ分解する。
// 区切り文字 (既定 ';') に加えて カンマ / 角括弧 / 空白 も区切りとみなす
// (REST や画面から配列表現 "[A, B]" で届くことがあるため)。
function _tfcSplitProjectIds(raw, sep) {
var out = [];
var s = (raw == null) ? '' : String(raw);
if (!s) return out;
var esc = String(sep || ';').replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
var parts = s.split(new RegExp('[' + esc + ',\\[\\]\\s]+'));
for (var i = 0; i < parts.length; i++) {
if (parts[i]) out.push(parts[i]);
}
return out;
}
// プロジェクト集合が重なるか (= 同じ出力に同居し得るか)。
// どちらかが空 (共通) → true / 共通要素あり → true / それ以外 (素) → false
function _tfcProjectsOverlap(aList, bList) {
var a = aList || [], b = bList || [];
if (a.length === 0 || b.length === 0) return true;
for (var i = 0; i < a.length; i++) {
for (var j = 0; j < b.length; j++) {
if (a[i] === b[j]) return true;
}
}
return false;
}
TFC.splitProjectIds = _tfcSplitProjectIds;
TFC.projectsOverlap = _tfcProjectsOverlap;
// 同名エントリ群を「自分と同じ出力に同居し得るか」で 2 分する (★純関数)。
// overlapping = 同居する (= 本当に困る) / disjoint = 同居しない (= 参考情報)
function _tfcPartitionByOverlap(list, selfProjects) {
var out = { overlapping: [], disjoint: [] };
for (var i = 0; i < (list || []).length; i++) {
if (_tfcProjectsOverlap(selfProjects, list[i].projects)) out.overlapping.push(list[i]);
else out.disjoint.push(list[i]);
}
return out;
}
// 物理属性ヒット行 (DOMAIN_CD / ATTR_NM / MAIN_NM / PROJECT_ID) を DOMAIN_CD 単位へ畳む。
// ★純関数 (DB 非依存 — tests/test_domain_name_dup.py が Node で直接評価する)。
// 同じドメインに表記ゆれの同名物理属性が複数行あっても 1 エントリにまとめ、
// 一致した ATTR_NM は 大文字化した値で一意化して昇順に持つ。
// 並びは DOMAIN_CD 昇順 (DB の行順は非決定 — メッセージを決定的にするため)。
function _tfcGroupAttrDupRows(rows, sep, labelMap) {
var map = {}, order = [], lm = labelMap || {};
function _s(v) { return (v == null) ? '' : String(v); }
for (var i = 0; i < (rows || []).length; i++) {
var r = rows[i] || {};
var cd = _s(r['DOMAIN_CD']);
if (!cd) continue;
if (!map[cd]) {
var pj = _tfcSplitProjectIds(r['PROJECT_ID'], sep);
var pjNm = [];
for (var p = 0; p < pj.length; p++) pjNm.push(lm[pj[p]] || pj[p]);
map[cd] = { domainCd: cd, mainNm: _s(r['MAIN_NM']),
projects: pj, projectNames: pjNm, attrNms: [], seenAttr: {} };
order.push(cd);
}
var an = _s(r['ATTR_NM']);
var ak = an.replace(/^\s+|\s+$/g, '').toUpperCase();
if (an && !map[cd].seenAttr[ak]) {
map[cd].seenAttr[ak] = 1;
map[cd].attrNms.push(an);
}
}
order.sort();
var out = [];
for (var o = 0; o < order.length; o++) {
var e = map[order[o]];
e.attrNms.sort();
delete e.seenAttr;
out.push(e);
}
return out;
}
// TALON チェックボックス複数値の区切り文字 (汎用CD TLN_GENERAL/CHECKBOX_SEP、 既定 ';')
TFC.checkboxSep = function () {
var sep = ';';
try {
var rows = TFC.selectPS(
'SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE = ? AND KEY_CODE = ?',
['TLN_GENERAL', 'CHECKBOX_SEP']);
if (rows.length > 0 && TFC.s(rows[0]['DSP1'])) sep = TFC.s(rows[0]['DSP1']);
} catch (e) { /* 既定 ';' のまま */ }
return sep;
};
// プロジェクトID → 表示名 (汎用CD TLN_FUNC_DOC_PROJECT の DSP1)。 未登録キーはそのまま返す
TFC.projectLabelMap = function () {
var map = {};
try {
var rows = TFC.selectPS(
'SELECT KEY_CODE, DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE = ?',
['TLN_FUNC_DOC_PROJECT']);
for (var i = 0; i < rows.length; i++) {
var k = TFC.s(rows[i]['KEY_CODE']);
var v = TFC.s(rows[i]['DSP1']);
if (k) map[k] = v || k;
}
} catch (e) { /* 汎用CD 未投入 = キー表示 */ }
return map;
};
// ============================================================
// データドメイン名称 (MAIN_NM) の同名チェック
// ★テスター指摘 No.131 (Ver0.56) = 同名は確定をブロック。
// ★Ver0.57 = 「プロジェクト集合の重なり」で 2 分する:
// ・どちらかがプロジェクト未設定 (= 全プロジェクトと重なる) → ブロック
// ・共通のプロジェクトがある → ブロック
// ・両方が非空で共通なし (素) → 登録可 + 警告
// 名前解決 (物理項目・EDM 属性 → データドメイン) は同じ出力の中で 1 件に
// 決まればよいので、 出力時に同居し得ない同名は許してよい (ユーザー決定)。
// 正規化は辞書の名前解決 (byMainNm) と同じ「前後空白除去 + 大文字化の完全一致」。
// 集合比較は SQL ではなく JS 側で行う (DB 方言に依存させない)。
//
// 引数: mainNm=入力した名称 / domainCd=自分自身 (更新時。 空 = 新規) /
// selfProjectRaw=自分の PROJECT_ID (区切り文字連結。 空 = 未設定)
// 戻り値: { key, selfProjects, blocking: [entry...], disjoint: [entry...] }
// entry = { domainCd, mainNm, projects: [ID...], projectNames: [表示名...] }
// 並びは DOMAIN_CD 昇順 (メッセージを決定的にするため)
// ============================================================
TFC.checkDomainNameDup = function (mainNm, domainCd, selfProjectRaw) {
var out = { key: '', selfProjects: [], blocking: [], disjoint: [] };
var key = TFC.s(mainNm).replace(/^\s+|\s+$/g, '').toUpperCase();
out.key = key;
if (!key) return out;
// PROJECT_ID は v0.15 追加列 — SETUP 未実行の旧 DB では列が無いため先に検出する
// (列なし = 全員がプロジェクト未設定 = 従来どおり全同名をブロック)
var hasPj = false;
try { hasPj = TFC.tableColumns('TLN_M_FUNC_DOMAIN').indexOf('PROJECT_ID') >= 0; } catch (eTc) {}
// LTRIM(RTRIM(x)) は Oracle / PostgreSQL / MySQL / SQL Server 共通で使える
var sql = 'SELECT DOMAIN_CD, MAIN_NM' + (hasPj ? ', PROJECT_ID' : '') +
' FROM TLN_M_FUNC_DOMAIN WHERE UPPER(LTRIM(RTRIM(MAIN_NM))) = ?';
var prm = [key];
if (domainCd) { sql += ' AND DOMAIN_CD <> ?'; prm.push(domainCd); }
var rows = TFC.selectPS(sql, prm);
if (rows.length === 0) return out;
var sep = TFC.checkboxSep();
var labels = TFC.projectLabelMap();
out.selfProjects = _tfcSplitProjectIds(hasPj ? selfProjectRaw : '', sep);
var seen = {}, list = [];
for (var i = 0; i < rows.length; i++) {
var cd = TFC.s(rows[i]['DOMAIN_CD']);
if (!cd || seen[cd]) continue;
seen[cd] = true;
var pj = _tfcSplitProjectIds(hasPj ? rows[i]['PROJECT_ID'] : '', sep);
var pjNm = [];
for (var p = 0; p < pj.length; p++) pjNm.push(labels[pj[p]] || pj[p]);
list.push({ domainCd: cd, mainNm: TFC.s(rows[i]['MAIN_NM']),
projects: pj, projectNames: pjNm });
}
// ★決定的順序 (DB の行順は非決定 — メッセージが揺れないよう DOMAIN_CD 昇順)
list.sort(function (a, b) {
return a.domainCd < b.domainCd ? -1 : (a.domainCd > b.domainCd ? 1 : 0);
});
for (var j = 0; j < list.length; j++) {
if (_tfcProjectsOverlap(out.selfProjects, list[j].projects)) out.blocking.push(list[j]);
else out.disjoint.push(list[j]);
}
return out;
};
// ============================================================
// データドメイン名称 (MAIN_NM) × 他ドメインの物理属性 (ATTR_NM) の衝突チェック
// ★テスター指摘 No.135 (Ver0.60)。
// 名前解決は ① データドメイン名称 (MAIN_NM) → ② 物理属性 (ATTR_NM) の 2 段
// (本体 _resolveEdmDomainCd / 利用者マニュアル「#1 2 段階の名前解決」)。
// ① が先に当たるため、 入力した名称が「他ドメインの物理属性」と同じだと、
// これまで ② でそのドメインに解決されていた名前を 新しいドメインが横取りする。
// ★確定は止めない (同名異義の正当な登録もあるため) — 起きることを伝えるだけ。
// プロジェクト集合が重ならない相手は出力時に同居しないので参考情報へ格下げする
// (TFC.checkDomainNameDup と同じ「重なり」の規約に揃える)。
//
// 引数: mainNm=入力した名称 / domainCd=自分自身 (更新時。 空 = 新規) /
// selfProjectRaw=自分の PROJECT_ID (区切り文字連結。 空 = 未設定)
// 戻り値: { key, selfProjects, overlapping: [entry...], disjoint: [entry...] }
// entry = { domainCd, mainNm, projects, projectNames, attrNms: [一致した ATTR_NM...] }
// 並びは DOMAIN_CD 昇順 (メッセージを決定的にするため)
// ============================================================
TFC.checkDomainNameVsAttrDup = function (mainNm, domainCd, selfProjectRaw) {
var out = { key: '', selfProjects: [], overlapping: [], disjoint: [] };
var key = TFC.s(mainNm).replace(/^\s+|\s+$/g, '').toUpperCase();
out.key = key;
if (!key) return out;
// PROJECT_ID は v0.15 追加列 — SETUP 未実行の旧 DB では列が無い
// (列なし = 全員が未設定 = 全件が overlapping = 従来どおり全件を警告)
var hasPj = false;
try { hasPj = TFC.tableColumns('TLN_M_FUNC_DOMAIN').indexOf('PROJECT_ID') >= 0; } catch (eTc) {}
// LTRIM(RTRIM(x)) は Oracle / PostgreSQL / MySQL / SQL Server 共通で使える
var sql = 'SELECT a.DOMAIN_CD, a.ATTR_NM, d.MAIN_NM' + (hasPj ? ', d.PROJECT_ID' : '') +
' FROM TLN_M_FUNC_DOMAIN_ATTR a' +
' JOIN TLN_M_FUNC_DOMAIN d ON d.DOMAIN_CD = a.DOMAIN_CD' +
' WHERE UPPER(LTRIM(RTRIM(a.ATTR_NM))) = ?';
var prm = [key];
if (domainCd) { sql += ' AND a.DOMAIN_CD <> ?'; prm.push(domainCd); }
var rows = TFC.selectPS(sql, prm);
if (rows.length === 0) return out;
var sep = TFC.checkboxSep();
out.selfProjects = _tfcSplitProjectIds(hasPj ? selfProjectRaw : '', sep);
var list = _tfcGroupAttrDupRows(rows, sep, TFC.projectLabelMap());
var part = _tfcPartitionByOverlap(list, out.selfProjects);
out.overlapping = part.overlapping;
out.disjoint = part.disjoint;
return out;
};
// 同名チェックの相手側ラベル (「名称 [コード] (プロジェクト)」) を作る
TFC.domainDupLabels = function (list, lang) {
var EN = (lang === 'en');
var out = [];
for (var i = 0; i < (list || []).length; i++) {
var e = list[i];
var pj = e.projectNames && e.projectNames.length
? e.projectNames.join(EN ? ', ' : '・')
: TFC.t('dom.dupMainNm.noProj', lang);
out.push(e.mainNm + ' [' + e.domainCd + ']' +
(EN ? ' (' + pj + ')' : '(' + pj + ')'));
}
return out;
};
// ★No.135: 物理属性衝突の相手側ラベル。
// 「名称 [コード](プロジェクト)/ 一致した物理属性: XXX」 — どの語で衝突したかを明示する
// (相手ドメインの物理属性が複数ヒットすることもあるため一覧で持つ)
TFC.domainAttrDupLabels = function (list, lang) {
var EN = (lang === 'en');
var base = TFC.domainDupLabels(list, lang);
var out = [];
for (var i = 0; i < (list || []).length; i++) {
var an = (list[i].attrNms || []).join(EN ? ', ' : '・');
out.push(base[i] + (an ? ' / ' + TFC.tf('dom.dupAttrNm.attr', lang, [an]) : ''));
}
return out;
};
// ============================================================
// 宿題一覧ワークテーブル (TLN_M_FUNC_DOMAIN_TASKS_WK) の洗い替え (Ver0.53)
//
// ★Ver0.52 は 「EDM/辞書の確定時に突合結果を作る」 方式だったが、 辞書は
// Excel 一括更新や直接 SQL でも変わり得る (= フックを通らない) ため、
// 突合結果が黙ってずれる余地があった (ユーザー指摘)。
// Ver0.53 は 「EDM の中身 = カタログ WK (変化点は EDM 確定のみ)」 と
// 「辞書テーブル (常に現在値)」 を **宿題一覧の検索時に突き合わせる** 方式へ
// 戻す。 ファイル読み (.a5er のパース) は無くなったので検索は軽いまま。
//
// WK_KBN で 3 種:
// 'U' = 未登録 (EDM にあるが辞書に無いドメイン名。 出典 EDM 名・プロジェクト付き)
// 'M' = 一致した DOMAIN_CD (EDM_NMS に出典 EDM 名を ';' 連結 = 名前昇順)
// 'S' = 読取れた EDM が 1 件以上あるときだけ書くマーカー行
//
// 照合規約は設計書出力本体と同一に保つこと:
// 抽出 = カタログ WK の 'A' 行 (型欄 DOMAIN_NM) + 'D' 行 (DomainInfo 定義名)
// 名前解決 = _resolveEdmDomainCd の 2 段階 (MAIN_NM → ATTR_NM。
// 修飾物理属性 テーブル.項目 は照合に参加しない。
// 括弧除去の基底名再照合は撤廃 — ユーザー指摘 2026-08-23)
// 本体側を変更したときはこの最小実装も必ず同期する (本体側に同旨コメントあり)。
// WK は宿題一覧の表示専用 (DRAFT 非照合の原則) — 読むのは TASKS の BODY_SQL だけ。
//
// ★DB アクセスの作法: 呼出元は宿題一覧の検索前 JS (0R100) = トランザクション外
// のため PreparedStatement は DOMA2048 で使えない。 読み = TFC.selectU
// (SQL は全て内部固定値 = 注入余地なし)、 書き = TalonDbUtil.deleteByMap /
// insertByMap + 明示 commit。 ワークテーブルは単一共有 (USER_ID 条件なし —
// 0R100 は worker thread でログインユーザーを解決できない。 EXCL_PICK No.73)。
// ============================================================
TFC.rebuildDomainTasksWkFromCatalog = function () {
var NAME_CAP = 300, NM_MAXLEN = 400, EDMS_MAXLEN = 1000;
function norm(s) {
return String(s == null ? '' : s).replace(/\s+/g, ' ').replace(/^ | $/g, '');
}
function isQualifiedAlias(attrNm) {
var s = String(attrNm == null ? '' : attrNm).replace(/./g, '.');
var p1 = s.indexOf('.');
if (p1 < 0) return false;
if (s.indexOf('.', p1 + 1) >= 0) return false;
var tbl = s.substring(0, p1).replace(/^\s+|\s+$/g, '');
var col = s.substring(p1 + 1).replace(/^\s+|\s+$/g, '');
return !!(tbl && col);
}
// --- 1. 辞書索引 (MAIN_NM + 物理属性。 複数候補は DOMAIN_CD 昇順の先頭 = 決定的) ---
var byMain = {}, byAttr = {};
var dRows = TFC.selectU('SELECT DOMAIN_CD, MAIN_NM FROM TLN_M_FUNC_DOMAIN ORDER BY DOMAIN_CD');
for (var di = 0; di < dRows.size(); di++) {
var mn = norm(TFC.s(dRows[di]['MAIN_NM']));
var mcd = TFC.s(dRows[di]['DOMAIN_CD']);
if (mn && mcd && !byMain[mn.toUpperCase()]) byMain[mn.toUpperCase()] = mcd;
}
var aRows = TFC.selectU(
'SELECT DOMAIN_CD, ATTR_NM FROM TLN_M_FUNC_DOMAIN_ATTR ORDER BY DOMAIN_CD, SEQ_NO');
for (var ai = 0; ai < aRows.size(); ai++) {
var an = norm(TFC.s(aRows[ai]['ATTR_NM']));
var acd = TFC.s(aRows[ai]['DOMAIN_CD']);
if (!an || !acd || isQualifiedAlias(an)) continue;
if (!byAttr[an.toUpperCase()]) byAttr[an.toUpperCase()] = acd;
}
function resolveCd(rawText) {
var t = String(rawText == null ? '' : rawText).replace(/^\s+|\s+$/g, '');
if (!t) return null;
var key = t.toUpperCase();
if (byMain[key]) return byMain[key];
if (byAttr[key]) return byAttr[key];
return null;
}
// --- 2. EDM 属性カタログと突合 ---
var cRows = TFC.selectU(
'SELECT ROW_KBN, EDM_NM, PROJECT_ID, DOMAIN_NM FROM ' + EDM_ATTR_WK +
' ORDER BY EDM_CD, ROW_KBN, SEQ_NO');
var unreg = {}, unregCount = 0, matchedCds = {}, readableEdms = 0;
function noteUnreg(nm, edmNm, proj) {
var key = nm.toUpperCase();
if (!unreg[key]) {
if (unregCount >= NAME_CAP) return;
unreg[key] = { nm: nm, edms: {}, projs: {} };
unregCount++;
}
if (edmNm) unreg[key].edms[edmNm] = true;
if (proj) unreg[key].projs[proj] = true;
}
for (var ci = 0; ci < cRows.size(); ci++) {
var cr = cRows[ci];
var kbn = TFC.s(cr['ROW_KBN']);
if (kbn === 'E') { readableEdms++; continue; }
var nm2 = norm(TFC.s(cr['DOMAIN_NM']));
if (!nm2 || nm2.length > NM_MAXLEN) continue;
var edmNm2 = TFC.s(cr['EDM_NM']);
var proj2 = norm(TFC.s(cr['PROJECT_ID']));
var cd2 = resolveCd(nm2);
if (kbn === 'A') {
if (cd2) {
// EDM 出現 (孤立判定と同一意味論) + 出典 EDM 名を記録
if (!matchedCds[cd2]) matchedCds[cd2] = {};
if (edmNm2) matchedCds[cd2][edmNm2] = true;
} else noteUnreg(nm2, edmNm2, proj2);
} else if (kbn === 'D') {
// 定義のみ = EDM 出現には数えない (未登録検出だけに使う)
if (!cd2) noteUnreg(nm2, edmNm2, proj2);
}
}
// --- 3. WK 洗い替え (単一共有。 PG は物理名が小文字 — EXCL_PICK No.73 と同じ手当) ---
var _isPg = false;
try { _isPg = (String(TFC.detectDbType() || '').toLowerCase().indexOf('postg') >= 0); } catch (eDb) {}
var WK_TBL = _isPg ? 'tln_m_func_domain_tasks_wk' : 'TLN_M_FUNC_DOMAIN_TASKS_WK';
function wkCol(c) { return _isPg ? String(c).toLowerCase() : c; }
function wkMap(m) {
if (!_isPg || !m) return m;
var o = {};
for (var k in m) { o[String(k).toLowerCase()] = m[k]; }
return o;
}
function joinEdmNames(edmSet) {
// 名前昇順 = 決定的順序 (for...in 非決定による golden フレークの再演防止)
var s = Object.keys(edmSet).sort().join(';');
if (s.length > EDMS_MAXLEN) s = s.substring(0, EDMS_MAXLEN - 1) + '…';
return s;
}
function wkInsert(m) {
try { TalonDbUtil.insertByMap(TALON.getDbConfig(), WK_TBL, wkMap(m), null); return true; }
catch (eIns) {
if (!/DOMA2004|unique|constraint|重複|PRIMARY|duplicate/i.test(String(eIns))) throw eIns;
return false;
}
}
var kbns = ['U', 'M', 'S'];
for (var dk = 0; dk < kbns.length; dk++) {
TalonDbUtil.deleteByMap(TALON.getDbConfig(), WK_TBL,
wkMap({ WK_KBN: kbns[dk] }), [[null, '=', wkCol('WK_KBN')]]);
}
var keys = Object.keys(unreg).sort(); // 反復順を決定化
var inserted = 0;
for (var ki = 0; ki < keys.length; ki++) {
var u = unreg[keys[ki]];
var projJoin = Object.keys(u.projs).sort().join(';');
if (projJoin.length > 200) projJoin = projJoin.substring(0, 200);
if (wkInsert({ WK_KBN: 'U', DOMAIN_NM: u.nm,
EDM_NMS: joinEdmNames(u.edms), PROJECT_ID: projJoin })) inserted++;
}
var mKeys = Object.keys(matchedCds).sort();
for (var mi2 = 0; mi2 < mKeys.length; mi2++) {
wkInsert({ WK_KBN: 'M', DOMAIN_NM: mKeys[mi2],
EDM_NMS: joinEdmNames(matchedCds[mKeys[mi2]]) });
}
if (readableEdms > 0) {
try { wkInsert({ WK_KBN: 'S', DOMAIN_NM: 'EDM_PRESENT' }); } catch (eIs) {}
}
// ★検索トランザクションは終了時に rollback される → 書込み直後に明示 commit
try { TalonDbUtil.commit(TALON.getDbConfig()); } catch (eCm) {}
try {
TALON.getLogger().writeInfo('[TFC-DOMAIN-TASKS] EDM 照合 (カタログ突合): 未登録 ' + inserted +
' 件 / 一致ドメイン ' + mKeys.length + ' 件 / 読取 EDM ' + readableEdms + ' 件' +
(unregCount >= NAME_CAP ? ' (未登録は上限 ' + NAME_CAP + ' 件で打切り)' : ''));
} catch (eLg) {}
return { unreg: inserted, matched: mKeys.length, edms: readableEdms };
};
var UI_LANG_SIKIBETU = 'TLN_FUNC_DOC_LANGUAGE';
// 環境の画面言語 ('ja'|'en')。 マーカー汎用CD があればそれを優先し、
// 無ければ従来どおり利用者のブラウザ言語 (detectLang)。
// 画面に固定表示される値 (グリッドの状態値など) はこちらを使う。
// メッセージ (addMsg 等) は TALON 標準メッセージと同じ挙動に揃えるため
// 従来どおり TFC.detectLang() を使うこと。
TFC.uiLang = function () {
try {
var rows = TFC.selectPS(
'SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE = ? AND KEY_CODE = ?',
[UI_LANG_SIKIBETU, 'LANG']);
if (rows.length > 0) {
var v = String(rows[0]['DSP1'] || '').toLowerCase();
if (v === 'en' || v === 'ja') return v;
}
} catch (e) { /* マーカー未整備なら detectLang へ */ }
return TFC.detectLang();
};
// CLOB → 文字列 (BODY_SQL の全長読出。 §5.2 と同じ getSubString パターン)
function _uiLangClobToStr(v) {
if (v == null) return '';
try {
if (typeof v.getSubString === 'function') {
return String(v.getSubString(1, v.length()));
}
} catch (e) { /* fall through */ }
return String(v);
}
/**
* 製品画面の表示文言を toLang ('ja'|'en') へ書き換える。
* @returns {updated: 書換行数, skipped: 値不一致でスキップしたキー数, total: 対象キー数}
*/
TFC.changeUiLanguage = function (toLang) {
if (toLang !== 'ja' && toLang !== 'en') {
throw 'changeUiLanguage: invalid language ' + toLang;
}
var toIdx = (toLang === 'en') ? 1 : 0;
var fromIdx = 1 - toIdx;
var updated = 0, skipped = 0, total = 0;
function upd(sql, params) {
total++;
var n = TFC.updatePS(sql, params);
if (n > 0) { updated += n; } else { skipped++; }
}
var k, pair, parts;
for (k in UI_LANG.FUNC_NM) {
pair = UI_LANG.FUNC_NM[k];
upd('UPDATE TLN_M_GENERAL_FUNC SET FUNC_NM = ? WHERE FUNC_ID = ? AND FUNC_NM = ?',
[pair[toIdx], k, pair[fromIdx]]);
}
for (k in UI_LANG.TITLE) {
pair = UI_LANG.TITLE[k]; parts = k.split('|');
upd('UPDATE TLN_M_GENERAL_FUNC_SQL SET TITLE = ? ' +
'WHERE FUNC_ID = ? AND FUNC_SEQ = ? AND TITLE = ?',
[pair[toIdx], parts[0], Number(parts[1]), pair[fromIdx]]);
}
for (k in UI_LANG.DISP_NAME) {
pair = UI_LANG.DISP_NAME[k]; parts = k.split('|');
// ★COL_NAME は UPPER() で突合する。 PG 系環境では SETUP が col_name を
// 小文字化するため、 大文字キーの完全一致だと全件スキップになる
// (pg 納品環境で updated 60/188 になった実測バグの修正)
// ★DISP_NAME は前後空白を除去して突合する (No.119: デザイナ入力由来の
// 末尾スペース ('業務的定義 ') で値ガードが外れ変換されなかった。
// 書込値はクリーンな対訳なので、変換を通すと空白も正規化される)
upd('UPDATE TLN_M_GENERAL_ITEM SET DISP_NAME = ? ' +
'WHERE FUNC_ID = ? AND FUNC_SEQ = ? AND UPPER(COL_NAME) = ? ' +
'AND LTRIM(RTRIM(DISP_NAME)) = ?',
[pair[toIdx], parts[0], Number(parts[1]), parts[2], pair[fromIdx]]);
}
// 項目グループ名 (No.119: グループ見出しの変換漏れ)。 ラベル単位で製品全機能へ適用
for (k in UI_LANG.GROUP_NAME) {
pair = UI_LANG.GROUP_NAME[k];
upd("UPDATE TLN_M_GENERAL_ITEM SET GROUP_NAME = ? " +
"WHERE FUNC_ID LIKE 'TLN_FUNC_DOC%' AND LTRIM(RTRIM(GROUP_NAME)) = ?",
[pair[toIdx], pair[fromIdx]]);
}
for (k in UI_LANG.APP_VALUE) {
pair = UI_LANG.APP_VALUE[k]; parts = k.split('|');
upd('UPDATE TLN_M_GENERAL_APP SET VALUE = ? ' +
'WHERE FUNC_ID = ? AND FUNC_SEQ = ? AND FUNC_KBN = ? AND VALUE = ?',
[pair[toIdx], parts[0], Number(parts[1]), parts[2], pair[fromIdx]]);
}
for (k in UI_LANG.BTN_KIND) {
pair = UI_LANG.BTN_KIND[k];
upd("UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = ? " +
"WHERE FUNC_ID LIKE 'TLN_FUNC_DOC%' AND FUNC_KBN LIKE 'BUTTON%' AND KIND = ?",
[pair[toIdx], pair[fromIdx]]);
}
for (k in UI_LANG.USES_LABEL) {
pair = UI_LANG.USES_LABEL[k];
// ★OPTN='BUTTON' (利用者定義の行ボタン) のみ。 VIEW/COPY/DELETE は
// TALON 標準ラベルで デザイナが再生成するため対象外 (UI_LANG 参照)
upd("UPDATE TLN_M_GENERAL_USES SET KEY_CODE = ? " +
"WHERE FUNC_ID LIKE 'TLN_FUNC_DOC%' AND FUNC_KBN = 'LIST' " +
"AND OPTN = 'BUTTON' AND KEY_CODE = ?",
[pair[toIdx], pair[fromIdx]]);
}
for (k in UI_LANG.HANYO_DSP1) {
pair = UI_LANG.HANYO_DSP1[k]; parts = k.split('|');
upd('UPDATE TLN_M_HANYO_CODE_MAIN SET DSP1 = ? ' +
'WHERE SIKIBETU_CODE = ? AND KEY_CODE = ? AND DSP1 = ?',
[pair[toIdx], parts[0], parts[1], pair[fromIdx]]);
}
// メニュー (TFC.registerMenu で登録した フォルダ名 / 表示名)。
// ★メニューは リポジトリ移送の対象外 = 取込で ja に戻らない。 en 運用環境で
// 取込後に [英語に変換] を押しても、 メニューは既に en のままなので
// 値ガードで空振り (skipped) する — 冪等なので実害はない
for (k in UI_LANG.MENU_GRP) {
pair = UI_LANG.MENU_GRP[k];
upd('UPDATE TLN_M_AUTHORITY SET FUNC_NM = ? WHERE FUNC_ATH_ID = ? AND FUNC_NM = ?',
[pair[toIdx], k, pair[fromIdx]]);
}
for (k in UI_LANG.MENU_NM) {
pair = UI_LANG.MENU_NM[k];
// フォルダは限定しない (利用者が別フォルダへ移していても表示名は追随させる)
upd('UPDATE TLN_M_FUNCTION SET FUNC_NM = ? WHERE FUNC_ID = ? AND FUNC_NM = ?',
[pair[toIdx], k, pair[fromIdx]]);
}
// 宿題一覧 BODY_SQL 内の表示リテラル ('未登録' 等)。 引用符込みで置換して
// 部分文字列の誤置換を防ぐ。 変更があった行だけ UPDATE。
var bodies = TFC.selectPS(
'SELECT FUNC_SEQ, BODY_SQL FROM TLN_M_GENERAL_FUNC_SQL WHERE FUNC_ID = ?',
['TLN_FUNC_DOC_DOMAIN_TASKS']);
for (var bi = 0; bi < bodies.length; bi++) {
var body = _uiLangClobToStr(bodies[bi]['BODY_SQL']);
if (!body) continue;
var newBody = body;
for (k in UI_LANG.SQL_LIT) {
pair = UI_LANG.SQL_LIT[k];
newBody = newBody.split("'" + pair[fromIdx] + "'").join("'" + pair[toIdx] + "'");
}
total++;
if (newBody !== body) {
updated += TFC.updatePS(
'UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = ? WHERE FUNC_ID = ? AND FUNC_SEQ = ?',
[newBody, 'TLN_FUNC_DOC_DOMAIN_TASKS', Number(bodies[bi]['FUNC_SEQ'])]);
} else {
skipped++;
}
}
// 現在言語マーカー (無ければ作成)
var mk = TFC.selectPS(
'SELECT COUNT(*) CNT FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE = ? AND KEY_CODE = ?',
[UI_LANG_SIKIBETU, 'LANG']);
if (Number(mk[0]['CNT']) > 0) {
TFC.updatePS('UPDATE TLN_M_HANYO_CODE_MAIN SET DSP1 = ? WHERE SIKIBETU_CODE = ? AND KEY_CODE = ?',
[toLang, UI_LANG_SIKIBETU, 'LANG']);
} else {
TFC.updatePS('INSERT INTO TLN_M_HANYO_CODE_MAIN ' +
'(SIKIBETU_CODE, KEY_CODE, SIKIBETU_NM, DSP1, DSP_NO1, DSP_SORT1) ' +
'VALUES (?, ?, ?, ?, 0, 0)',
[UI_LANG_SIKIBETU, 'LANG', '設計書_画面言語', toLang]);
}
TALON.getLogger().writeInfo('[TFC] changeUiLanguage(' + toLang + '): updated=' + updated +
' skipped=' + skipped + ' total=' + total);
return { updated: updated, skipped: skipped, total: total };
};
// ================================================================
// メニュー登録 — セットアップ画面の [メニュー登録] (Ver0.54)
//
// TALON のメニューは リポジトリ移送の対象外 (機能設定・汎用CD・採番・JS のみが
// 運ばれる) のため、 取込だけでは製品の画面がメニューに出ない。 従来は
// セットアップガイド (Zendesk 記事4) §6「メニュー登録」を見ながら TALON 標準の
// メニュー設定機能で手登録してもらっていた。 これをボタン 1 つで済ませる。
//
// 触る 3 表 (いずれも TALON 標準):
// TLN_M_AUTHORITY メニューフォルダ (FUNC_ATH_ID, FUNC_NM)
// TLN_M_GROUP_RELATION ユーザグループ × フォルダ (FUNC_GRP_ID, FUNC_ATH_ID)
// TLN_M_FUNCTION フォルダ配下のメニュー項目 (FUNC_ATH_ID, FUNC_ID)
//
// 設計の約束:
// - **冪等**。 何度押しても増えない
// - **利用者の配置を尊重**する。 判定は「FUNC_ID が TLN_M_FUNCTION に
// 1 行でもあるか」(フォルダ横断) で行い、 有れば skip。 利用者が別フォルダへ
// 移した / 名前を変えた / 意図的に外した項目を作り直さない
// - **DELETE しない**。 撤去はセットアップガイド §10「アンインストール」の
// 手動 SQL に委ねる
// - 紐付け先のユーザグループは **実行権限 (TLN_M_GENERAL_AUTH) から動的導出**する
// (製品 CSV に同梱される実行権限と必ず一致させるため。 ハードコードしない)
// - PRINT_SORT は sortBase 起点。 既に使われている値は避けて空き窓へ退避する
// - 表示名は環境の現在言語 (TFC.uiLang) で入れる。 対訳は UI_LANG.MENU_NM が正本
// - **出荷名を改名したら 既存行も追随させる** (Ver0.62 / テスター指摘 No.137)。
// ただし追随させるのは **過去に出荷した名前と完全一致する行だけ**
// (MENU_NM_LEGACY の値ガード = changeUiLanguage と同じ思想)。 利用者が
// 独自に付けた名前は「利用者の配置を尊重する」約束どおり触らない
// - ★反映は **再ログイン後** (TALON のメニュー Bean が SessionScoped のため)
// ================================================================
// 過去に出荷した メニュー表示名 (FUNC_ID → [[ja, en], ...] 古い順)。
// registerMenu が「旧出荷名と完全一致する行」だけを現行の UI_LANG.MENU_NM へ
// 改名する。 ★改名するときは 旧値をここへ追記すること (消さない — 何世代前の
// 環境から更新されても追随できるようにするため)。
var MENU_NM_LEGACY = {
// Ver0.54〜0.61 の出荷名 (No.137 で機能名・マニュアル表記と統一)
'TLN_FUNC_DOC': [['設計情報出力', 'Design information output']],
'TLN_FUNC_DOC_EXCL_MAINTE': [['項目除外', 'Column exclusions']],
'TLN_FUNC_DOC_EXCL_PICK': [['項目一括除外', 'Bulk column exclusions']]
};
var MENU_DEF = {
athId: 'systemCOMMONWEAL', // メニューフォルダ ID (TLN_M_AUTHORITY)
authAnchorFuncId: 'TLN_FUNC_DOC', // 紐付けグループの導出元 (実行権限)
sortBase: 850, // PRINT_SORT の起点
urlPrefix: 'TALON/APPLICATION/GENERALFREE/GENERALFREE.xhtml?PARAM_FUNC_ID=',
// 登録する機能 (この順に PRINT_SORT を振る)。
// ★裏方の機能は載せない: DOMAIN_EDIT (宿題一覧の行ボタンから起動) /
// DOMAIN_SEARCH・EDM_ATTR_SUGGEST (検索子画面) / SETUP (導入時のみ)
funcIds: [
'TLN_FUNC_DOC',
'TLN_FUNC_DOC_EDM',
'TLN_FUNC_DOC_DOMAIN_TASKS',
'TLN_FUNC_DOC_DOMAIN_LIST',
'TLN_FUNC_DOC_DOMAIN_ALIAS_LIST',
'TLN_FUNC_DOC_DOMAIN_MAINTE',
'TLN_FUNC_DOC_EXCL_MAINTE',
'TLN_FUNC_DOC_EXCL_PICK'
]
};
function _menuNow() {
return new (Java.type('java.sql.Timestamp'))(
Java.type('java.lang.System').currentTimeMillis());
}
// 監査列 (CREATED_BY / UPDATED_BY) に入れるログインユーザ。 取れなければ機能 ID
function _menuActor() {
try {
if (typeof TALON !== 'undefined' && typeof TALON.getUserInfoMap === 'function') {
var ui = TALON.getUserInfoMap();
if (ui) {
for (var k in ui) {
if (/^(user_?id|login_?user_?id)$/i.test(k)) {
var v = TFC.s(ui[k]);
if (v) return v;
}
}
}
}
} catch (e) { /* 取れなければ既定値 */ }
return 'TLN_FUNC_DOC_SETUP';
}
function _menuCount(sql, params) {
var rows = TFC.selectPS(sql, params);
return (rows.length > 0) ? Number(rows[0]['CNT']) : 0;
}
/**
* 製品の画面を TALON のメニューへ登録する (冪等)。
* @returns {added: 追加した項目数, skipped: 既登録で見送った数, total: 対象数,
* renamed: 旧出荷名から改名した数,
* groups: 紐付けたユーザグループ数, folder: フォルダを新規作成したか}
*/
TFC.registerMenu = function () {
var li = (TFC.uiLang() === 'en') ? 1 : 0;
var athId = MENU_DEF.athId;
var now = _menuNow();
var by = _menuActor();
var prg = 'TLN_FUNC_DOC_SETUP';
var added = 0, skipped = 0, renamed = 0, groups = 0, folder = false;
var i;
// ① メニューフォルダ
if (_menuCount('SELECT COUNT(*) CNT FROM TLN_M_AUTHORITY WHERE FUNC_ATH_ID = ?',
[athId]) === 0) {
TFC.updatePS(
'INSERT INTO TLN_M_AUTHORITY (FUNC_ATH_ID, FUNC_NM, ' +
'CREATED_DATE, CREATED_BY, CREATED_PRG_NM, ' +
'UPDATED_DATE, UPDATED_BY, UPDATED_PRG_NM, MODIFY_COUNT) ' +
'VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0)',
[athId, UI_LANG.MENU_GRP[athId][li], now, by, prg, now, by, prg]);
folder = true;
}
// ② ユーザグループ × フォルダ (実行権限を持つグループへ紐付け)
var authRows = TFC.selectPS(
'SELECT DISTINCT FUNC_ATH_ID FROM TLN_M_GENERAL_AUTH WHERE FUNC_ID = ?',
[MENU_DEF.authAnchorFuncId]);
if (authRows.length === 0) {
TALON.getLogger().writeWarn(
'[TFC] registerMenu: ' + MENU_DEF.authAnchorFuncId +
' の機能実行権限が未設定のため、 メニューフォルダをユーザグループへ ' +
'紐付けませんでした (TALON の機能実行権限設定を確認してください)');
}
for (i = 0; i < authRows.length; i++) {
var grpId = TFC.s(authRows[i]['FUNC_ATH_ID']);
if (!grpId) continue;
if (_menuCount('SELECT COUNT(*) CNT FROM TLN_M_GROUP_RELATION ' +
'WHERE FUNC_GRP_ID = ? AND FUNC_ATH_ID = ?',
[grpId, athId]) > 0) continue;
TFC.updatePS(
'INSERT INTO TLN_M_GROUP_RELATION (FUNC_GRP_ID, FUNC_ATH_ID, ' +
'CREATED_DATE, CREATED_BY, CREATED_PRG_NM, ' +
'UPDATED_DATE, UPDATED_BY, UPDATED_PRG_NM, MODIFY_COUNT) ' +
'VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0)',
[grpId, athId, now, by, prg, now, by, prg]);
groups++;
}
// ③ 旧出荷名の追随 (値ガード付き改名)。 ★既登録の項目は ④ で skip されるため、
// ここで先に名前だけ現行の出荷名へ揃える。 ja 行は ja へ / en 行は en へ
// (環境の現在言語には寄せない = 言語状態を壊さない)
for (var fid0 in MENU_NM_LEGACY) {
var cur = UI_LANG.MENU_NM[fid0];
if (!cur) continue;
var olds = MENU_NM_LEGACY[fid0];
for (var oi = 0; oi < olds.length; oi++) {
for (var lang = 0; lang < 2; lang++) {
if (olds[oi][lang] === cur[lang]) continue;
renamed += TFC.updatePS(
'UPDATE TLN_M_FUNCTION SET FUNC_NM = ?, UPDATED_DATE = ?, ' +
'UPDATED_BY = ?, UPDATED_PRG_NM = ? WHERE FUNC_ID = ? AND FUNC_NM = ?',
[cur[lang], now, by, prg, fid0, olds[oi][lang]]);
}
}
}
// ④ メニュー項目。 使用済み PRINT_SORT を先に集めて空き窓を探す
var used = {};
var sortRows = TFC.selectPS(
'SELECT PRINT_SORT FROM TLN_M_FUNCTION WHERE PRINT_SORT >= ?',
[Java.type('java.lang.Integer').valueOf(MENU_DEF.sortBase)]);
for (i = 0; i < sortRows.length; i++) {
var s = sortRows[i]['PRINT_SORT'];
if (s != null) used[Number(s)] = 1;
}
for (i = 0; i < MENU_DEF.funcIds.length; i++) {
var fid = MENU_DEF.funcIds[i];
// ★フォルダを限定せずに探す = 利用者が別フォルダへ移した項目は作り直さない
if (_menuCount('SELECT COUNT(*) CNT FROM TLN_M_FUNCTION WHERE FUNC_ID = ?',
[fid]) > 0) {
skipped++;
continue;
}
var sort = MENU_DEF.sortBase + i;
while (used[sort]) sort++;
used[sort] = 1;
TFC.updatePS(
'INSERT INTO TLN_M_FUNCTION (FUNC_ATH_ID, FUNC_ID, FUNC_NM, AUTH_KBN, ' +
'PRINT_SORT, APP_URL, CREATED_DATE, CREATED_BY, CREATED_PRG_NM, ' +
'UPDATED_DATE, UPDATED_BY, UPDATED_PRG_NM, MODIFY_COUNT) ' +
'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)',
[athId, fid, UI_LANG.MENU_NM[fid][li], '1',
Java.type('java.lang.Integer').valueOf(sort),
MENU_DEF.urlPrefix + fid, now, by, prg, now, by, prg]);
added++;
}
TALON.getLogger().writeInfo('[TFC] registerMenu: added=' + added + ' skipped=' + skipped +
' renamed=' + renamed +
' groups=' + groups + ' folder=' + folder);
return { added: added, skipped: skipped, renamed: renamed,
total: MENU_DEF.funcIds.length, groups: groups, folder: folder };
};
/**
* 外部接続先 (複数DB接続) に対する SELECT を PreparedStatement で実行.
* cfg = TALON.getOtherDBConn('N') で取得した TalonConfig。null なら主 DB (selectPS と同じ)。
* 照合除外ピック画面 (TLN_FUNC_DOC_EXCL_PICK) のカタログ照会など、
* ユーザー入力 (LIKE パターン) を外部 DB のカタログに投げる用途で使う。
* @param cfg TalonConfig (null = 主 DB)
* @param sql プレースホルダ「?」を含む SELECT 文
* @param params JS Array (省略可)
* @returns Array<{COL_NAME: value, ...}> (uppercase キー)
*/
TFC.selectPSByConn = function (cfg, sql, params) {
if (!cfg) return TFC.selectPS(sql, params);
var conn = _getConn(cfg);
var stmt = null, rs = null;
try {
stmt = conn.prepareStatement(sql);
_bindParams(stmt, params);
rs = stmt.executeQuery();
return _readResultSet(rs);
} finally {
if (rs != null) { try { rs.close(); } catch (e) {} }
if (stmt != null) { try { stmt.close(); } catch (e) {} }
// Connection は TALON のトランザクション管理対象のため close しない
}
};
// ============================================================
// DB タイプ判定 (実行時) — JDBC DatabaseMetaData ベース
// 返り値: 'oracle' | 'postgres' | 'mysql' | 'sqlserver' | 'db2'
// | 'cdata' | 'cdata-<subdriver>' (例: 'cdata-salesforce')
// | 'unknown'
//
// 実装は Connection.getMetaData() の URL + productName を見て分類する:
// 1. URL prefix 優先 (確実) jdbc:oracle: / jdbc:postgresql: / jdbc:mysql:
// jdbc:mariadb: / jdbc:sqlserver: / jdbc:microsoft:sqlserver:
// jdbc:db2: / jdbc:cdata:<sub>:
// 2. URL から取れない場合: productName のキーワードでマッチ
// 'Oracle...' → oracle, 'PostgreSQL...' → postgres, 'DB2/...' → db2,
// 'MySQL...' → mysql, 'Microsoft SQL Server' → sqlserver,
// '...CData...' → cdata
// 3. 不明: productName をそのまま小文字化して返す (見えない種別を残す)
//
// キャッシュ無し: getMetaData() は JDBC pool が最適化済みで安価 (probe SQL 4 本より高速)。
// deploy 後の stale を避けるため毎回新規に判定する。
// ============================================================
// 内部: URL prefix と productName から正規化 DB type を導出
function _classifyDbType(url, productName) {
var u = String(url || '').toLowerCase();
var p = String(productName || '').toLowerCase();
// CData: jdbc:cdata:salesforce:User=... → 'cdata-salesforce'
// サブドライバ識別子 (salesforce/rest/excel/...) を含めて返す
var mC = u.match(/^jdbc:cdata:([a-z0-9_]+)/);
if (mC) return 'cdata-' + mC[1];
if (u.indexOf('jdbc:oracle:') === 0) return 'oracle';
if (u.indexOf('jdbc:postgresql:') === 0) return 'postgres';
if (u.indexOf('jdbc:mysql:') === 0) return 'mysql';
if (u.indexOf('jdbc:mariadb:') === 0) return 'mysql';
if (u.indexOf('jdbc:sqlserver:') === 0) return 'sqlserver';
if (u.indexOf('jdbc:microsoft:sqlserver:') === 0) return 'sqlserver';
if (u.indexOf('jdbc:db2:') === 0) return 'db2';
// CData 直接サブプロトコル URL (cdata: prefix 無し): jdbc:googlesheets: / jdbc:salesforce: /
// jdbc:kintone: / jdbc:rest: / jdbc:excel: 等。 CData JDBC ドライバは バージョン/設定で
// URL prefix が 'jdbc:cdata:<sub>:' か 'jdbc:<sub>:' の両形式を取りうるため、
// 既知 RDB 以外の jdbc:<X>: URL は CData サブドライバ '<X>' として扱う
// (sys_tables / sys_tablecolumns カタログにフォールバックして スキーマ取得を試みる)。
var mP = u.match(/^jdbc:([a-z0-9_]+):/);
if (mP) return 'cdata-' + mP[1];
// URL でマッチしない場合は productName で判定
if (p.indexOf('cdata') >= 0) return 'cdata';
if (p.indexOf('oracle') >= 0) return 'oracle';
if (p.indexOf('postgresql') >= 0) return 'postgres';
if (p.indexOf('mysql') >= 0) return 'mysql';
if (p.indexOf('mariadb') >= 0) return 'mysql';
if (p.indexOf('microsoft sql server') >= 0 || p.indexOf('sql server') >= 0) return 'sqlserver';
if (p.indexOf('db2') === 0 || p.indexOf('db2 ') >= 0 || p.indexOf('db2/') >= 0) return 'db2';
// 不明な種別は productName を返す (独自JDBCに対応)
return p || 'unknown';
}
// 内部: URL から データベース/サービス/カタログ名を抽出
// 例:
// jdbc:oracle:thin:@//host:1521/XEPDB1 → 'XEPDB1'
// jdbc:oracle:thin:@host:1521:XEPDB1 → 'XEPDB1' (SID)
// jdbc:postgresql://host:5432/mydb → 'mydb'
// jdbc:mysql://host:3306/mydb?useSSL=false → 'mydb'
// jdbc:sqlserver://host:1433;databaseName=mydb;... → 'mydb'
// jdbc:db2://host:50000/mydb → 'mydb'
// jdbc:cdata:salesforce:User=u@org.com;OAuthClientId=… → '' (catalog 経由で取得)
function _dbNameFromUrl(url) {
if (!url) return '';
var u = String(url);
// Oracle service name (slash 経由)
var mOraSvc = u.match(/jdbc:oracle:[^:]+:@\/\/[^\/]+\/([^?;]+)/i);
if (mOraSvc) return mOraSvc[1];
// Oracle SID (colon 経由)
var mOraSid = u.match(/jdbc:oracle:[^:]+:@[^:\/]+:\d+:([^?;]+)/i);
if (mOraSid) return mOraSid[1];
// PG / MySQL / MariaDB / DB2
var mDb = u.match(/jdbc:(?:postgresql|mysql|mariadb|db2):\/\/[^\/]+\/([^?;]+)/i);
if (mDb) return mDb[1];
// SQL Server (databaseName=xxx 形式)
var mSs = u.match(/databaseName=([^;]+)/i);
if (mSs) return mSs[1];
return '';
}
// 内部: TalonConfig (= getOtherDBConn の戻り値) または null から JDBC metadata 経由で
// DB type / URL / DB 名 / productName を取得。 null = 主 TALON DB。
// 返り値: { type: 'oracle'|...'cdata-salesforce'|'unknown',
// url: string, dbName: string, productName: string }
//
// トランザクション扱い:
// 主 DB はもうユーザー処理がトランザクション内にいる前提。 外部 DB は
// getOtherDBConn 直後の状態で getDataSource().getConnection() が
// TransactionNotYetBegunException を投げる。 そのため
// try dbConfig.begin() → connection → metadata → dbConfig.rollback()
// の順で 検出専用の短命トランザクションを張る。 既に begin 済の場合は
// 2 度目の begin() は失敗するので、 そのときは rollback もスキップする。
function _detectDbInfoViaMetaData(dbConfig) {
var cfg = dbConfig || TALON.getDbConfig();
var beganHere = false;
var info = { type: 'unknown', url: '', dbName: '', productName: '' };
try {
try { cfg.begin(); beganHere = true; } catch (eB) { /* 既に begin 済 */ }
var conn = cfg.getDataSource().getConnection();
var md = conn.getMetaData();
try { info.url = String(md.getURL() || ''); } catch (eU) {}
try { info.productName = String(md.getDatabaseProductName() || ''); } catch (eN) {}
info.type = _classifyDbType(info.url, info.productName);
try { TALON.getLogger().writeInfo('[TFC] detectDbInfo: url=' + info.url + ', productName=' + info.productName + ', type=' + info.type); } catch (igL) {}
// DB 名: まず Connection.getCatalog() を試す (CData は OAuth Org 名等が入る)、
// 取れなければ URL からパースする (Oracle SERVICE/SID, PG/MySQL/DB2 のパス, SS databaseName)
try {
var cat = String(conn.getCatalog() || '');
if (cat) info.dbName = cat;
} catch (eC) {}
if (!info.dbName) info.dbName = _dbNameFromUrl(info.url);
return info;
} catch (e) {
try { TALON.getLogger().writeWarn('[TFC] detectDbInfo: metadata 取得失敗 → unknown フォールバック: ' + e); } catch (ig) {}
return info;
} finally {
if (beganHere) { try { cfg.rollback(); } catch (eR) {} }
}
}
// type 文字列のみ返す互換 API (既存呼出は こちら)
TFC.detectDbType = function () {
return _detectDbInfoViaMetaData(null).type;
};
TFC.detectDbTypeByConn = function (conn) {
if (!conn) return TFC.detectDbType();
return _detectDbInfoViaMetaData(conn).type;
};
// 詳細 info を返す新 API (DB 名等が必要なときに使う)
TFC.detectDbInfo = function () {
return _detectDbInfoViaMetaData(null);
};
TFC.detectDbInfoByConn = function (conn) {
if (!conn) return TFC.detectDbInfo();
return _detectDbInfoViaMetaData(conn);
};
// ============================================================
// ER 図出力 (A5:SQL Mk-2 ネイティブ + DDL 生成)
// ============================================================
// TFC.generateErDiagram(tableNames, opts)
// tableNames: string[] 対象テーブル物理名
// opts: { dbType: 'oracle'|'postgres'|'mysql'|'sqlserver'|'db2'
// (default: opts.conn ? detectDbTypeByConn(conn) : detectDbType()),
// conn: TalonConfig (省略時 = 主 TALON DB)
// TALON.getOtherDBConn('1') 等で取得した外部 DB 接続。
// 指定するとそのコネクションでスキーマ情報を取得する (複数DB接続対応)。
// includeFks: true (default: true) }
// 戻り値: { meta: {tables, fks}, a5er: string, ddl: string }
// テーブル定義・FK・テーブル/列コメントを TalonDbUtil.select で DB スキーマビューから取得し、
// .a5er (A5:SQL Mk-2 ネイティブ INI 風 + UTF-8 BOM + CRLF) と .sql (DDL) を生成。
TFC.generateErDiagram = function (tableNames, opts) {
opts = opts || {};
var conn = opts.conn || null;
var dbType = (opts.dbType || (conn ? TFC.detectDbTypeByConn(conn) : TFC.detectDbType()) || 'oracle').toLowerCase();
// 'postgresql' エイリアスを 'postgres' に正規化
if (dbType === 'postgresql') dbType = 'postgres';
// 'mysql_linux' / 'mysql_windows' → 'mysql'
if (dbType.indexOf('mysql') === 0) dbType = 'mysql';
// 'cdata-salesforce' / 'cdata-rest' / ... → 'cdata' (sys_* カタログは 全サブドライバ共通)
// サブドライバ名は FK スキーマ系統の選択 (Salesforce = Referenced* 系) に使うため保持
var cdataSub = '';
if (dbType.indexOf('cdata-') === 0) {
cdataSub = dbType.substring(6);
dbType = 'cdata';
}
var includeFks = opts.includeFks !== false;
// 未知 DB: カタログビューが どの dialect とも 合致しない → テーブル名スタブだけ返す
// (依存関係タブ / 全設定タブの DB バッジ表示用 = accessDb / dbType の伝播)
if (dbType === 'unknown') {
var stubTables = [];
for (var sti = 0; sti < tableNames.length; sti++) {
stubTables.push({ name: tableNames[sti], comment: '', cols: [], pkCols: [] });
}
return { meta: { tables: stubTables, fks: [] }, a5er: '', ddl: '' };
}
// CData も SYS カタログ経由で 通常の DB と同じく メタ取得する。 catalog query が
// 失敗 (= 一部 CData ドライバで sys_* が無い場合) は スタブにフォールバック。
if (dbType === 'cdata') {
try {
var metaC = _fetchErMeta(tableNames, dbType, includeFks, conn, cdataSub);
return {
meta: metaC,
a5er: _erToA5er(metaC),
ddl: _erToDdl(metaC, dbType)
};
} catch (eCD) {
try { TALON.getLogger().writeWarn('[TFC] CData ER メタ取得失敗 → テーブル名スタブにフォールバック: ' + eCD); } catch (ig) {}
var stubC = [];
for (var stj = 0; stj < tableNames.length; stj++) {
stubC.push({ name: tableNames[stj], comment: '', cols: [], pkCols: [] });
}
return { meta: { tables: stubC, fks: [] }, a5er: '', ddl: '' };
}
}
var meta = _fetchErMeta(tableNames, dbType, includeFks, conn);
return {
meta: meta,
a5er: _erToA5er(meta),
ddl: _erToDdl(meta, dbType)
};
};
// ============================================================
// テーブル名 正規化キー (★抜本対応 2026-05-29)
// ============================================================
// 「表示用名前」 と「検索用キー」 の責任分離。
// - 表示 (HTML / DDL / A5er / tooltip) : DB 由来の元 case をそのまま使う
// (例: PG なら lowercase / Oracle なら UPPER / Salesforce 等 case-sensitive
// データソースでは PascalCase など、 取得元のものをそのまま見せる)
// - 検索 / Map キー / HTML anchor ID : _tblKey() で UPPER 正規化 (環境横断で安定)
//
// すべての内部 Map (erTableBgRead/Write / funcTableRefs / byTable / fkChildCols /
// physMatch.byTable など) は _tblKey() を通したキーで統一する。 anchor ID
// (er-diagram.html#tbl-XXX) も _tblKey() で統一することで、 環境別の case 違いに
// 関係なくリンクが解決する。
TFC._tblKey = function (name) { return String(name || '').toUpperCase(); };
// CData (Salesforce) の Description boilerplate からラベルを抽出する。
// Salesforce ドライバは sys_tablecolumns.ColumnLabel を持たない代わりに、
// Description にフィールドラベルを定型文で包んで返す:
// JA: "'顧客 ID' ラベルはこのフィールドに一致します。" → "顧客 ID"
// EN: "Label 'Account ID' corresponds to this field." → "Account ID"
// 定型文にマッチしない Description (= 利用者が設定した説明等) はそのまま返す。
function _cdataCommentToLabel(s) {
if (!s) return s;
var str = String(s);
var m = str.match(/^'(.+)'\s*ラベルはこのフィールドに一致します。?$/);
if (m) return m[1];
m = str.match(/^Label\s+'(.+)'\s+corresponds\s+to\s+this\s+field\.?$/i);
if (m) return m[1];
return s;
}
// テーブル メタデータ取得 (DB エンジン別)
// 返り値: {tables: [{name, comment, cols:[{name, type, len, prec, scale, nullable, isPk}]}],
// fks: [{childTable, childCol, parentTable, parentCol, name}]}
//
// `tables[i].name` は DB 由来の元 case を保持する。 内部 Map のキーとしては
// _tblKey(t.name) を使うこと。
function _fetchErMeta(tableNames, dbType, includeFks, conn, cdataSub) {
var meta = { tables: [], fks: [] };
if (!tableNames || tableNames.length === 0) return meta;
// 接続別 SELECT。 conn=null/undefined のときは主 TALON DB (TFC.selectU)。
function sel(sql) { return conn ? TFC.selectUByConn(conn, sql) : TFC.selectU(sql); }
// SQL の IN 句用に bind 化されない文字列リテラルでエスケープ (常に大文字化)
// inListExact は呼出側から渡された元 case のままの IN リスト。 CData では
// UPPER(TableName) 比較だと フィルタがドライバにプッシュダウンされず 全テーブルの
// メタデータ列挙 (Salesforce 等では数分) になるため、 exact-match を優先する。
var inList = '';
var inListExact = '';
var upperNames = [];
for (var i = 0; i < tableNames.length; i++) {
var nameUp = TFC._tblKey(tableNames[i]).replace(/'/g, "''");
upperNames.push(nameUp);
if (i > 0) { inList += ','; inListExact += ','; }
inList += "'" + nameUp + "'";
inListExact += "'" + String(tableNames[i] || '').replace(/'/g, "''") + "'";
}
var queries = _erQueries(dbType, inList, inListExact, cdataSub);
// 列定義 (selectUByConn 経由で PG の lowercase キー → uppercase 化)
var colRows = sel(queries.cols);
// CData の exact-match で 0 件 (= 設定由来の case が実テーブル名と不一致) の場合は
// UPPER() 比較版で再試行する (全メタデータ列挙になるため低速だが確実)
if (dbType === 'cdata' && colRows.size() === 0 && inListExact !== inList) {
try { TALON.getLogger().writeWarn('[TFC] CData exact-match 0 件 → UPPER 比較で再試行: ' + inListExact); } catch (igUx) {}
queries = _erQueries(dbType, inList, null, cdataSub);
colRows = sel(queries.cols);
}
var byTable = {};
for (var ci = 0; ci < colRows.size(); ci++) {
var r = colRows[ci];
var tn = TFC.s(r['TABLE_NAME']); // 元 case 保持 (表示用)
var tnKey = TFC._tblKey(tn); // 内部 Map キー (UPPER)
if (!byTable[tnKey]) byTable[tnKey] = { name: tn, comment: '', cols: [], colByName: {} };
// CData: 列コメント (Description) は cols クエリに統合済 (COL_COMMENT)。
// ボイラープレートを除外し、 定型文からラベル (= 論理名相当) を抽出する。
var colCmt = '';
if (dbType === 'cdata') {
var rawCc = TFC.s(r['COL_COMMENT']);
if (rawCc) {
var lcCc = rawCc.toLowerCase().replace(/\s+/g, ' ').replace(/\.\s*$/, '').trim();
if (lcCc !== 'autogenerated' && lcCc !== 'no description' && lcCc !== 'no information') {
colCmt = _cdataCommentToLabel(rawCc);
}
}
}
var colObj = {
name: TFC.s(r['COLUMN_NAME']),
type: TFC.s(r['DATA_TYPE']),
len: TFC.s(r['DATA_LENGTH']),
prec: TFC.s(r['DATA_PRECISION']),
scale: TFC.s(r['DATA_SCALE']),
nullable: TFC.s(r['NULLABLE']) !== 'N',
isPk: TFC.s(r['IS_PK']) === 'Y',
comment: colCmt
};
byTable[tnKey].cols.push(colObj);
byTable[tnKey].colByName[colObj.name] = colObj;
}
// テーブルコメント (オプション)
// ※ CData はサブドライバごとにカタログスキーマが異なるため、 コメント / FK は
// クエリ単位で非致命化する (失敗しても列定義だけは生かす)。
if (queries.comments) {
try {
var cmtRows = sel(queries.comments);
for (var mi = 0; mi < cmtRows.size(); mi++) {
var cr = cmtRows[mi];
var tn2 = TFC._tblKey(TFC.s(cr['TABLE_NAME']));
if (byTable[tn2]) byTable[tn2].comment = TFC.s(cr['COMMENTS']);
}
} catch (eCmt) {
try { TALON.getLogger().writeWarn('[TFC] テーブルコメント取得失敗 (続行): ' + eCmt); } catch (igC1) {}
}
}
// 列コメント (= 論理名相当) を取得して各列に紐付け
if (queries.colComments) {
try {
var ccRows = sel(queries.colComments);
for (var ki = 0; ki < ccRows.size(); ki++) {
var ccr = ccRows[ki];
var tn3 = TFC._tblKey(TFC.s(ccr['TABLE_NAME']));
var cn3 = TFC.s(ccr['COLUMN_NAME']);
var cmt3 = TFC.s(ccr['COMMENTS']);
// CData: Description の定型文からフィールドラベルを抽出
if (dbType === 'cdata') cmt3 = _cdataCommentToLabel(cmt3);
if (byTable[tn3] && byTable[tn3].colByName[cn3]) {
byTable[tn3].colByName[cn3].comment = cmt3;
}
}
} catch (eCc) {
try { TALON.getLogger().writeWarn('[TFC] 列コメント取得失敗 (続行): ' + eCc); } catch (igC2) {}
}
}
// ★テスター指摘 No.95: 索引メタ (IndexInfo 出力用)。 取得失敗しても続行 (非致命)
if (queries.indexes) {
try {
var ixRows = sel(queries.indexes);
for (var xi = 0; xi < ixRows.size(); xi++) {
var xr = ixRows[xi];
var tnx = TFC._tblKey(TFC.s(xr['TABLE_NAME']));
if (!byTable[tnx]) continue;
var tIdx = byTable[tnx];
if (!tIdx.indexes) { tIdx.indexes = []; tIdx._ixByName = {}; }
var ixn = TFC.s(xr['INDEX_NAME']);
var ixRec = tIdx._ixByName[ixn];
if (!ixRec) {
ixRec = { name: ixn, unique: TFC.s(xr['IS_UNIQUE']) === 'Y',
// uniqCons: ユニーク制約バック (uniq=2 / ADD CONSTRAINT UNIQUE)
uniqCons: TFC.s(xr['IS_UNIQ_CONS']) === 'Y', cols: [] };
tIdx._ixByName[ixn] = ixRec;
tIdx.indexes.push(ixRec);
}
ixRec.cols.push(TFC.s(xr['COLUMN_NAME']));
}
} catch (eIx) {
try { TALON.getLogger().writeWarn('[TFC] 索引メタ取得失敗 (続行): ' + eIx); } catch (igIx) {}
}
// 作業用の名前引きマップは下流 (erMeta / _erMetaForEdm) へ持ち出さない
for (var tnc in byTable) {
if (byTable.hasOwnProperty(tnc) && byTable[tnc]._ixByName) delete byTable[tnc]._ixByName;
}
}
// 並び順: tableNames の指定順を維持 (upperNames で照合)
for (var ti = 0; ti < upperNames.length; ti++) {
var name = upperNames[ti];
if (byTable[name]) meta.tables.push(byTable[name]);
}
// FK: childTable / parentTable は表示にも検索にも使うため、 元 case 保持。
// 利用側で必要に応じて _tblKey() で正規化する。
// CData: sys_foreignkeys のスキーマが 2 系統ある
// (ForeignKeyTable/PrimaryKeyTable 系 と TableName/ReferencedTableName 系)。
// 本命が失敗したら fksFallback で再試行し、 それも失敗したら FK 無しで続行する。
if (includeFks && queries.fks) {
var fkRows = null;
try {
fkRows = sel(queries.fks);
} catch (eFk1) {
if (queries.fksFallback) {
try { TALON.getLogger().writeWarn('[TFC] FK クエリ失敗 → 代替スキーマで再試行: ' + eFk1); } catch (igF1) {}
try { fkRows = sel(queries.fksFallback); }
catch (eFk2) {
try { TALON.getLogger().writeWarn('[TFC] FK 代替クエリも失敗 (FK 無しで続行): ' + eFk2); } catch (igF2) {}
}
} else {
try { TALON.getLogger().writeWarn('[TFC] FK クエリ失敗 (FK 無しで続行): ' + eFk1); } catch (igF3) {}
}
}
if (fkRows) {
for (var fi = 0; fi < fkRows.size(); fi++) {
var fr = fkRows[fi];
meta.fks.push({
childTable: TFC.s(fr['CHILD_TABLE']),
childCol: TFC.s(fr['CHILD_COL']),
parentTable: TFC.s(fr['PARENT_TABLE']),
parentCol: TFC.s(fr['PARENT_COL']),
name: TFC.s(fr['CONSTRAINT_NAME'])
});
}
}
}
return meta;
}
function _erQueries(dbType, inList, inListExact, cdataSub) {
// 大文字小文字不一致対策: 全 IN 比較を UPPER() 両側で行う。
// inList は呼出側で常に大文字化済。 各 DB ビュー側の値も UPPER 関数を適用。
// inListExact (元 case の IN リスト) は CData 専用: UPPER() 比較だと CData が
// フィルタをドライバにプッシュダウンできず全テーブルのメタデータ列挙になるため、
// exact-match で照会する (RDB 系カタログビューは高速なので UPPER のまま)。
if (dbType === 'oracle') {
return {
cols:
"SELECT c.table_name, c.column_name, c.data_type, c.data_length, " +
" c.data_precision, c.data_scale, c.nullable, c.column_id, " +
" CASE WHEN pk.column_name IS NOT NULL THEN 'Y' ELSE 'N' END AS is_pk " +
"FROM user_tab_columns c " +
"LEFT JOIN ( " +
" SELECT cc.table_name, cc.column_name " +
" FROM user_constraints uc " +
" JOIN user_cons_columns cc ON uc.constraint_name = cc.constraint_name " +
" WHERE uc.constraint_type = 'P' " +
") pk ON pk.table_name = c.table_name AND pk.column_name = c.column_name " +
"WHERE UPPER(c.table_name) IN (" + inList + ") " +
"ORDER BY c.table_name, c.column_id",
// ★テスター指摘 No.95: 索引 (PK 索引は A5M2 側で別管理のため除外)。
// FBI (関数索引) は列名が SYS_NC 内部名になるため、 DOMAIN 索引 (Oracle Text 等)
// とあわせて除外。 UNUSABLE (無効化) も出力しない。
indexes:
"SELECT i.table_name AS TABLE_NAME, i.index_name AS INDEX_NAME, " +
" CASE WHEN i.uniqueness = 'UNIQUE' THEN 'Y' ELSE 'N' END AS IS_UNIQUE, " +
// ユニーク制約バックの索引 (A5M2 IndexInfo uniq=2 / DDL は ADD CONSTRAINT UNIQUE)
" CASE WHEN EXISTS (SELECT 1 FROM user_constraints uq " +
" WHERE uq.constraint_type = 'U' AND uq.index_name = i.index_name) " +
" THEN 'Y' ELSE 'N' END AS IS_UNIQ_CONS, " +
" ic.column_name AS COLUMN_NAME " +
"FROM user_indexes i " +
"JOIN user_ind_columns ic ON ic.index_name = i.index_name " +
"WHERE UPPER(i.table_name) IN (" + inList + ") " +
"AND i.index_type NOT LIKE 'FUNCTION-BASED%' " +
"AND i.index_type <> 'DOMAIN' " +
"AND i.status <> 'UNUSABLE' " +
"AND NOT EXISTS (SELECT 1 FROM user_constraints uc " +
" WHERE uc.constraint_type = 'P' AND uc.index_name = i.index_name) " +
"ORDER BY i.table_name, i.index_name, ic.column_position",
comments:
"SELECT table_name, comments " +
"FROM user_tab_comments " +
"WHERE UPPER(table_name) IN (" + inList + ")",
colComments:
"SELECT table_name, column_name, comments " +
"FROM user_col_comments " +
"WHERE UPPER(table_name) IN (" + inList + ") " +
"AND comments IS NOT NULL",
fks:
"SELECT a.table_name AS child_table, a.column_name AS child_col, " +
" r.table_name AS parent_table, r.column_name AS parent_col, " +
" c.constraint_name " +
"FROM user_constraints c " +
"JOIN user_cons_columns a ON c.constraint_name = a.constraint_name " +
"JOIN user_cons_columns r ON c.r_constraint_name = r.constraint_name " +
" AND a.position = r.position " +
"WHERE c.constraint_type = 'R' " +
"AND UPPER(a.table_name) IN (" + inList + ") " +
"ORDER BY a.table_name, c.constraint_name, a.position"
};
}
if (dbType === 'postgres' || dbType === 'postgresql') {
return {
cols:
"SELECT c.table_name AS \"TABLE_NAME\", c.column_name AS \"COLUMN_NAME\", " +
" c.data_type AS \"DATA_TYPE\", c.character_maximum_length AS \"DATA_LENGTH\", " +
" c.numeric_precision AS \"DATA_PRECISION\", c.numeric_scale AS \"DATA_SCALE\", " +
" c.is_nullable AS \"NULLABLE\", c.ordinal_position AS \"COLUMN_ID\", " +
" CASE WHEN pk.column_name IS NOT NULL THEN 'Y' ELSE 'N' END AS \"IS_PK\" " +
"FROM information_schema.columns c " +
"LEFT JOIN ( " +
" SELECT kcu.table_name, kcu.column_name " +
" FROM information_schema.table_constraints tc " +
" JOIN information_schema.key_column_usage kcu USING (constraint_name) " +
" WHERE tc.constraint_type = 'PRIMARY KEY' " +
") pk ON pk.table_name = c.table_name AND pk.column_name = c.column_name " +
"WHERE c.table_schema = current_schema() " +
"AND UPPER(c.table_name) IN (" + inList + ") " +
"ORDER BY c.table_name, c.ordinal_position",
// ★テスター指摘 No.95: 索引 (PK は indisprimary で除外)。
// ・pg_namespace で current_schema() に限定 (無いと同名テーブルを持つ
// 別スキーマの索引が混入する — cols クエリと非対称だった)
// ・k.ord <= indnkeyatts で INCLUDE 列 (PG11+ の非キー列) を除外
// ・indexprs IS NULL で式索引を除外 (式部分は列名が引けず黙って欠落するため、
// 索引ごと出力しない方が正確)
indexes:
"SELECT t.relname AS \"TABLE_NAME\", ci.relname AS \"INDEX_NAME\", " +
" CASE WHEN ix.indisunique THEN 'Y' ELSE 'N' END AS \"IS_UNIQUE\", " +
" CASE WHEN EXISTS (SELECT 1 FROM pg_constraint uq " +
" WHERE uq.contype = 'u' AND uq.conindid = ix.indexrelid) " +
" THEN 'Y' ELSE 'N' END AS \"IS_UNIQ_CONS\", " +
" a.attname AS \"COLUMN_NAME\" " +
"FROM pg_index ix " +
"JOIN pg_class t ON t.oid = ix.indrelid " +
"JOIN pg_namespace n ON n.oid = t.relnamespace AND n.nspname = current_schema() " +
"JOIN pg_class ci ON ci.oid = ix.indexrelid " +
"JOIN unnest(ix.indkey) WITH ORDINALITY AS k(attnum, ord) " +
" ON k.ord <= ix.indnkeyatts " +
"JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum " +
"WHERE t.relkind = 'r' AND NOT ix.indisprimary " +
"AND ix.indexprs IS NULL " +
"AND UPPER(t.relname) IN (" + inList + ") " +
"ORDER BY t.relname, ci.relname, k.ord",
// コメント系も current_schema() に限定 (索引と同じ別スキーマ混入対策)
comments:
"SELECT c.relname AS \"TABLE_NAME\", d.description AS \"COMMENTS\" " +
"FROM pg_class c " +
"JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = current_schema() " +
"JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = 0 " +
"WHERE c.relkind = 'r' " +
"AND UPPER(c.relname) IN (" + inList + ")",
colComments:
"SELECT c.relname AS \"TABLE_NAME\", a.attname AS \"COLUMN_NAME\", " +
" d.description AS \"COMMENTS\" " +
"FROM pg_class c " +
"JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = current_schema() " +
"JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum > 0 " +
"JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = a.attnum " +
"WHERE c.relkind = 'r' " +
"AND UPPER(c.relname) IN (" + inList + ")",
// FK: information_schema.constraint_column_usage は複合 FK で親列との対応が
// 取れず (kcu × ccu がクロス積になる PG の既知の落とし穴)、 列ペアが
// 崩れるため pg_constraint の conkey/confkey を位置対応で unnest する。
fks:
"SELECT tc.relname AS \"CHILD_TABLE\", ca.attname AS \"CHILD_COL\", " +
" tp.relname AS \"PARENT_TABLE\", pa.attname AS \"PARENT_COL\", " +
" cn.conname AS \"CONSTRAINT_NAME\" " +
"FROM pg_constraint cn " +
"JOIN pg_class tc ON tc.oid = cn.conrelid " +
"JOIN pg_namespace n ON n.oid = tc.relnamespace AND n.nspname = current_schema() " +
"JOIN pg_class tp ON tp.oid = cn.confrelid " +
"JOIN unnest(cn.conkey) WITH ORDINALITY AS k(attnum, ord) ON true " +
"JOIN unnest(cn.confkey) WITH ORDINALITY AS fk(attnum, ord) ON fk.ord = k.ord " +
"JOIN pg_attribute ca ON ca.attrelid = tc.oid AND ca.attnum = k.attnum " +
"JOIN pg_attribute pa ON pa.attrelid = tp.oid AND pa.attnum = fk.attnum " +
"WHERE cn.contype = 'f' " +
"AND UPPER(tc.relname) IN (" + inList + ") " +
"ORDER BY tc.relname, cn.conname, k.ord"
};
}
if (dbType === 'mysql') {
// MySQL: information_schema を使用。テーブルコメントは TABLES.TABLE_COMMENT、
// 列コメントは COLUMNS.COLUMN_COMMENT。スキーマは DATABASE() (現在 DB)。
return {
cols:
"SELECT c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, " +
" c.CHARACTER_MAXIMUM_LENGTH AS DATA_LENGTH, " +
" c.NUMERIC_PRECISION AS DATA_PRECISION, c.NUMERIC_SCALE AS DATA_SCALE, " +
" c.IS_NULLABLE AS NULLABLE, c.ORDINAL_POSITION AS COLUMN_ID, " +
" CASE WHEN c.COLUMN_KEY = 'PRI' THEN 'Y' ELSE 'N' END AS IS_PK " +
"FROM information_schema.COLUMNS c " +
"WHERE c.TABLE_SCHEMA = DATABASE() " +
"AND UPPER(c.TABLE_NAME) IN (" + inList + ") " +
"ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION",
// ★テスター指摘 No.95: 索引 (PRIMARY は除外)。
// ・COLUMN_NAME IS NOT NULL: MySQL 8 の関数索引は列名が NULL になり
// 空文字が混ざった歪んだカラムリストになるため除外
// ・INDEX_TYPE: FULLTEXT / SPATIAL を通常索引として出さない
indexes:
"SELECT s.TABLE_NAME, s.INDEX_NAME, " +
" CASE WHEN s.NON_UNIQUE = 0 THEN 'Y' ELSE 'N' END AS IS_UNIQUE, " +
// MySQL はユニーク制約 = ユニーク索引で別概念が無い (常に索引扱い = uniq 1)
" 'N' AS IS_UNIQ_CONS, " +
" s.COLUMN_NAME " +
"FROM information_schema.STATISTICS s " +
"WHERE s.TABLE_SCHEMA = DATABASE() " +
"AND UPPER(s.TABLE_NAME) IN (" + inList + ") " +
"AND s.INDEX_NAME <> 'PRIMARY' " +
"AND s.COLUMN_NAME IS NOT NULL " +
"AND s.INDEX_TYPE IN ('BTREE','HASH') " +
"ORDER BY s.TABLE_NAME, s.INDEX_NAME, s.SEQ_IN_INDEX",
comments:
"SELECT TABLE_NAME, TABLE_COMMENT AS COMMENTS " +
"FROM information_schema.TABLES " +
"WHERE TABLE_SCHEMA = DATABASE() " +
"AND UPPER(TABLE_NAME) IN (" + inList + ")",
colComments:
"SELECT TABLE_NAME, COLUMN_NAME, COLUMN_COMMENT AS COMMENTS " +
"FROM information_schema.COLUMNS " +
"WHERE TABLE_SCHEMA = DATABASE() " +
"AND UPPER(TABLE_NAME) IN (" + inList + ") " +
"AND COLUMN_COMMENT <> ''",
fks:
"SELECT kcu.TABLE_NAME AS CHILD_TABLE, kcu.COLUMN_NAME AS CHILD_COL, " +
" kcu.REFERENCED_TABLE_NAME AS PARENT_TABLE, " +
" kcu.REFERENCED_COLUMN_NAME AS PARENT_COL, " +
" kcu.CONSTRAINT_NAME " +
"FROM information_schema.KEY_COLUMN_USAGE kcu " +
"WHERE kcu.TABLE_SCHEMA = DATABASE() " +
"AND kcu.REFERENCED_TABLE_NAME IS NOT NULL " +
"AND UPPER(kcu.TABLE_NAME) IN (" + inList + ") " +
"ORDER BY kcu.TABLE_NAME, kcu.CONSTRAINT_NAME, kcu.ORDINAL_POSITION"
};
}
if (dbType === 'sqlserver') {
// SQL Server: sys.* + sys.extended_properties (MS_Description) でコメント
return {
cols:
// 桁数 (DATA_LENGTH): sys.columns.max_length は バイト長。
// ・nchar/nvarchar は 2 バイト/文字 なので /2 して文字数に
// ・ntext/text/image/xml (LOB) と max(-1) は固定桁数が無いので NULL
// ・それ以外 (char/varchar/binary 等) は max_length をそのまま
"SELECT t.name AS TABLE_NAME, c.name AS COLUMN_NAME, " +
" TYPE_NAME(c.user_type_id) AS DATA_TYPE, " +
" CASE WHEN c.max_length = -1 THEN NULL " +
" WHEN TYPE_NAME(c.user_type_id) IN ('ntext','text','image','xml') THEN NULL " +
" WHEN TYPE_NAME(c.user_type_id) IN ('nchar','nvarchar') THEN c.max_length / 2 " +
" ELSE c.max_length END AS DATA_LENGTH, " +
" c.precision AS DATA_PRECISION, c.scale AS DATA_SCALE, " +
" CASE WHEN c.is_nullable = 1 THEN 'Y' ELSE 'N' END AS NULLABLE, " +
" c.column_id AS COLUMN_ID, " +
" CASE WHEN EXISTS ( " +
" SELECT 1 FROM sys.index_columns ic " +
" JOIN sys.indexes i ON i.object_id = ic.object_id AND i.index_id = ic.index_id " +
" WHERE ic.object_id = c.object_id AND ic.column_id = c.column_id AND i.is_primary_key = 1 " +
" ) THEN 'Y' ELSE 'N' END AS IS_PK " +
"FROM sys.columns c " +
"JOIN sys.tables t ON t.object_id = c.object_id " +
"WHERE UPPER(t.name) IN (" + inList + ") " +
"ORDER BY t.name, c.column_id",
// ★テスター指摘 No.95: 索引 (PK 索引・ヒープ・自動統計は除外)。
// type IN (1,2) = clustered/nonclustered のみ (XML/spatial 等は列表現が
// 別物のため除外)。 無効化 (is_disabled) / 仮想 (hypothetical) も出さない。
indexes:
"SELECT t.name AS TABLE_NAME, i.name AS INDEX_NAME, " +
" CASE WHEN i.is_unique = 1 THEN 'Y' ELSE 'N' END AS IS_UNIQUE, " +
" CASE WHEN i.is_unique_constraint = 1 THEN 'Y' ELSE 'N' END AS IS_UNIQ_CONS, " +
" c.name AS COLUMN_NAME " +
"FROM sys.indexes i " +
"JOIN sys.tables t ON t.object_id = i.object_id " +
"JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id " +
"JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id " +
"WHERE UPPER(t.name) IN (" + inList + ") " +
"AND i.is_primary_key = 0 AND i.type IN (1, 2) AND i.name IS NOT NULL " +
"AND i.is_disabled = 0 AND i.is_hypothetical = 0 AND ic.key_ordinal > 0 " +
"ORDER BY t.name, i.name, ic.key_ordinal",
comments:
"SELECT t.name AS TABLE_NAME, CAST(ep.value AS NVARCHAR(MAX)) AS COMMENTS " +
"FROM sys.tables t " +
"LEFT JOIN sys.extended_properties ep ON ep.major_id = t.object_id " +
" AND ep.minor_id = 0 AND ep.name = 'MS_Description' " +
"WHERE UPPER(t.name) IN (" + inList + ") AND ep.value IS NOT NULL",
colComments:
"SELECT t.name AS TABLE_NAME, c.name AS COLUMN_NAME, " +
" CAST(ep.value AS NVARCHAR(MAX)) AS COMMENTS " +
"FROM sys.tables t " +
"JOIN sys.columns c ON c.object_id = t.object_id " +
"JOIN sys.extended_properties ep ON ep.major_id = t.object_id " +
" AND ep.minor_id = c.column_id AND ep.name = 'MS_Description' " +
"WHERE UPPER(t.name) IN (" + inList + ")",
fks:
"SELECT tc.name AS CHILD_TABLE, cc.name AS CHILD_COL, " +
" tp.name AS PARENT_TABLE, cp.name AS PARENT_COL, " +
" fk.name AS CONSTRAINT_NAME " +
"FROM sys.foreign_keys fk " +
"JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id " +
"JOIN sys.tables tc ON tc.object_id = fkc.parent_object_id " +
"JOIN sys.columns cc ON cc.object_id = fkc.parent_object_id AND cc.column_id = fkc.parent_column_id " +
"JOIN sys.tables tp ON tp.object_id = fkc.referenced_object_id " +
"JOIN sys.columns cp ON cp.object_id = fkc.referenced_object_id AND cp.column_id = fkc.referenced_column_id " +
"WHERE UPPER(tc.name) IN (" + inList + ") " +
"ORDER BY tc.name, fk.name, fkc.constraint_column_id"
};
}
if (dbType === 'cdata') {
// CData JDBC (Salesforce / REST / Excel / SharePoint / 200+ ドライバ群)
// 全ドライバ共通の SYS カタログ:
// - sys_tables: TableName / TableType / Description
// - sys_tablecolumns: TableName / ColumnName / DataTypeName / Length /
// NumericPrecision / NumericScale / IsKey / IsNullable /
// Description / Ordinal / IsHidden / IsReadOnly
// - sys_foreignkeys: PrimaryKeyTable / PrimaryKeyColumn / ForeignKeyTable /
// ForeignKeyColumn / ForeignKeyName / KeySeq
// テーブル名は ソース上の case を保持 (Salesforce: 'Account' / REST: 任意)。
// UPPER() による IN 句で 大小区別なくマッチ可能。
// IsNullable / IsKey は boolean (true/false or 1/0) のため CASE で 'Y'/'N' に正規化。
// IsHidden 列は除外 (内部用途の カラム)。
// exact-match (元 case) を優先し、 無ければ UPPER 比較 (低速) にフォールバック。
// _fetchErMeta 側で exact 0 件時に inListExact=null で再呼出しされる。
var cdT = inListExact ? ("TableName IN (" + inListExact + ")")
: ("UPPER(TableName) IN (" + inList + ")");
var cdTc = inListExact ? ("c.TableName IN (" + inListExact + ")")
: ("UPPER(c.TableName) IN (" + inList + ")");
var cdFk = inListExact ? ("ForeignKeyTable IN (" + inListExact + ")")
: ("UPPER(ForeignKeyTable) IN (" + inList + ")");
// FK クエリ: sys_foreignkeys のスキーマは 2 系統ある:
// legacy: ForeignKeyTable/ForeignKeyColumn/PrimaryKeyTable/PrimaryKeyColumn (Google Sheets 等)
// ref: TableName/ColumnName/ReferencedTableName/ReferencedColumnName (Salesforce 25.0 で確認)
// 未知列を含むクエリは CData が全メタデータ列挙に落ちて失敗まで数分かかるため、
// サブドライバ名が分かる場合は正しい側を本命にし、 もう一方をフォールバックに回す。
var _cdFkLegacy =
"SELECT ForeignKeyTable AS CHILD_TABLE, ForeignKeyColumn AS CHILD_COL, " +
" PrimaryKeyTable AS PARENT_TABLE, PrimaryKeyColumn AS PARENT_COL, " +
" ForeignKeyName AS CONSTRAINT_NAME " +
"FROM sys_foreignkeys " +
"WHERE " + cdFk + " " +
"ORDER BY ForeignKeyTable, ForeignKeyName, KeySeq";
var _cdFkRef =
"SELECT TableName AS CHILD_TABLE, ColumnName AS CHILD_COL, " +
" ReferencedTableName AS PARENT_TABLE, ReferencedColumnName AS PARENT_COL, " +
" ForeignKeyName AS CONSTRAINT_NAME " +
"FROM sys_foreignkeys " +
"WHERE " + cdT + " " +
"ORDER BY TableName, ForeignKeyName";
return {
cols:
// 注: ColumnLabel 列は SELECT しない。 Salesforce ドライバ (25.0) には
// 存在せず、 未知列を含むクエリは CData が全メタデータ列挙に落ちて
// 失敗までに数分かかる。 ラベル相当は Description の定型文
// ("'X' ラベルはこのフィールドに一致します。") から抽出する
// (_cdataCommentToLabel)。 Google Sheets 等の ColumnLabel は
// ColumnName と同値のため SELECT する価値が無い。
// ★ 性能: 列コメント (Description) を cols に統合し、 別途 colComments で
// sys_tablecolumns を 2 回スキャンしていたのを 1 回に削減 (colComments=null)。
"SELECT c.TableName AS TABLE_NAME, c.ColumnName AS COLUMN_NAME, " +
" c.DataTypeName AS DATA_TYPE, c.Length AS DATA_LENGTH, " +
" c.NumericPrecision AS DATA_PRECISION, c.NumericScale AS DATA_SCALE, " +
" CASE WHEN c.IsNullable = true THEN 'Y' ELSE 'N' END AS NULLABLE, " +
" c.Ordinal AS COLUMN_ID, " +
" CASE WHEN c.IsKey = true THEN 'Y' ELSE 'N' END AS IS_PK, " +
" c.Description AS COL_COMMENT " +
"FROM sys_tablecolumns c " +
"WHERE " + cdTc + " " +
"AND (c.IsHidden IS NULL OR c.IsHidden = false) " +
"ORDER BY c.TableName, c.Ordinal",
comments:
// CData boilerplate ('autogenerated.' / 'No description.') は除外
"SELECT TableName AS TABLE_NAME, Description AS COMMENTS " +
"FROM sys_tables " +
"WHERE " + cdT + " " +
"AND Description IS NOT NULL " +
"AND Description != 'autogenerated.' AND Description != 'autogenerated' " +
"AND Description != 'No description.' AND Description != 'No description'",
// colComments は cols に統合済 (sys_tablecolumns の再スキャンを廃止して高速化)
colComments: null,
fks: (cdataSub === 'salesforce') ? _cdFkRef : _cdFkLegacy,
fksFallback: (cdataSub === 'salesforce') ? _cdFkLegacy : _cdFkRef
};
}
if (dbType === 'db2') {
// DB2: SYSCAT.* カタログビュー。 既定スキーマは CURRENT SCHEMA。
// - SYSCAT.COLUMNS: TABNAME / COLNAME / TYPENAME / LENGTH / SCALE / NULLS
// (NULLS='Y' が NULL 許可) / COLNO / KEYSEQ (>0 が PK) / REMARKS
// - SYSCAT.TABLES: TABNAME / REMARKS (テーブルコメント)
// - SYSCAT.REFERENCES + SYSCAT.KEYCOLUSE: FK 関係 (子 KEYCOLUSE と親 KEYCOLUSE を
// COLSEQ で対応付けて 1 列ずつ展開)
return {
cols:
"SELECT c.TABNAME AS TABLE_NAME, c.COLNAME AS COLUMN_NAME, " +
" c.TYPENAME AS DATA_TYPE, c.LENGTH AS DATA_LENGTH, " +
" c.LENGTH AS DATA_PRECISION, c.SCALE AS DATA_SCALE, " +
" c.NULLS AS NULLABLE, c.COLNO AS COLUMN_ID, " +
" CASE WHEN c.KEYSEQ > 0 THEN 'Y' ELSE 'N' END AS IS_PK " +
"FROM SYSCAT.COLUMNS c " +
"WHERE c.TABSCHEMA = CURRENT SCHEMA " +
"AND UPPER(c.TABNAME) IN (" + inList + ") " +
"ORDER BY c.TABNAME, c.COLNO",
comments:
"SELECT TABNAME AS TABLE_NAME, REMARKS AS COMMENTS " +
"FROM SYSCAT.TABLES " +
"WHERE TABSCHEMA = CURRENT SCHEMA " +
"AND UPPER(TABNAME) IN (" + inList + ") AND REMARKS IS NOT NULL",
colComments:
"SELECT TABNAME AS TABLE_NAME, COLNAME AS COLUMN_NAME, REMARKS AS COMMENTS " +
"FROM SYSCAT.COLUMNS " +
"WHERE TABSCHEMA = CURRENT SCHEMA " +
"AND UPPER(TABNAME) IN (" + inList + ") AND REMARKS IS NOT NULL",
fks:
"SELECT r.TABNAME AS CHILD_TABLE, kc.COLNAME AS CHILD_COL, " +
" r.REFTABNAME AS PARENT_TABLE, kp.COLNAME AS PARENT_COL, " +
" r.CONSTNAME AS CONSTRAINT_NAME " +
"FROM SYSCAT.REFERENCES r " +
"JOIN SYSCAT.KEYCOLUSE kc ON kc.CONSTNAME = r.CONSTNAME " +
" AND kc.TABSCHEMA = r.TABSCHEMA " +
" AND kc.TABNAME = r.TABNAME " +
"JOIN SYSCAT.KEYCOLUSE kp ON kp.CONSTNAME = r.REFKEYNAME " +
" AND kp.TABSCHEMA = r.REFTABSCHEMA " +
" AND kp.TABNAME = r.REFTABNAME " +
" AND kp.COLSEQ = kc.COLSEQ " +
"WHERE r.TABSCHEMA = CURRENT SCHEMA " +
"AND UPPER(r.TABNAME) IN (" + inList + ") " +
"ORDER BY r.TABNAME, r.CONSTNAME, kc.COLSEQ"
};
}
throw new Error('Unsupported dbType: ' + dbType);
}
// ============================================================
// DDL (CREATE TABLE + ALTER TABLE ADD CONSTRAINT) 生成
// ============================================================
// draw.io / MySQL Workbench / A5:SQL Mk-2 / DBeaver 等 ほぼ全ての ER 図ツールで
// 「DDL リバース」入力として使える業界標準形式。 副次的にバックアップ・移植にも使える。
// FK 行 (列単位) を制約単位にグルーピング (複合 FK 対応)。
// 各方言クエリの ORDER BY (テーブル → 制約名 → 列位置) 順を保持する。
// 従来は列単位のまま出力しており、 複合 FK が DDL では同名 ALTER の複数発行 (2 本目が
// エラー)、 a5er では同一テーブル間の [Relation] 複数本になっていた。
// 制約名の無い行はグルーピングできないため 1 行 1 制約として扱う。
function _groupFks(fks) {
var out = [], byKey = {};
for (var i = 0; i < fks.length; i++) {
var f = fks[i];
var key = f.name ? (f.childTable + '' + f.name) : ('' + i);
var g = byKey[key];
if (!g) {
g = { name: f.name, childTable: f.childTable, parentTable: f.parentTable,
childCols: [], parentCols: [] };
byKey[key] = g; out.push(g);
}
g.childCols.push(f.childCol);
g.parentCols.push(f.parentCol);
}
return out;
}
function _erToDdl(meta, dbType) {
var s = '-- Generated by TLN_FUNC_DOC_ER_DIAGRAM_COMMON (dbType=' + dbType + ')\n';
s += '-- ' + new Date() + '\n\n';
// CREATE TABLE
for (var ti = 0; ti < meta.tables.length; ti++) {
var t = meta.tables[ti];
s += '-- ============================================================\n';
s += '-- ' + t.name + (t.comment ? ' (' + t.comment + ')' : '') + '\n';
s += '-- ============================================================\n';
s += 'CREATE TABLE ' + t.name + ' (\n';
var pkCols = [];
for (var ci = 0; ci < t.cols.length; ci++) {
var c = t.cols[ci];
s += ' ' + c.name + ' ' + _ddlType(c, dbType);
if (!c.nullable) s += ' NOT NULL';
s += (ci < t.cols.length - 1) ? ',\n' : '\n';
if (c.isPk) pkCols.push(c.name);
}
s += ');\n';
if (pkCols.length > 0) {
s += 'ALTER TABLE ' + t.name +
' ADD CONSTRAINT PK_' + t.name +
' PRIMARY KEY (' + pkCols.join(', ') + ');\n';
}
// テーブルコメント (Oracle / PostgreSQL ともに COMMENT ON TABLE 構文)
if (t.comment) {
s += "COMMENT ON TABLE " + t.name + " IS '" + _ddlEsc(t.comment) + "';\n";
}
// 列コメント (= 論理名相当)
for (var ck = 0; ck < t.cols.length; ck++) {
var cc = t.cols[ck];
if (cc.comment) {
s += "COMMENT ON COLUMN " + t.name + "." + cc.name + " IS '" + _ddlEsc(cc.comment) + "';\n";
}
}
// ★テスター指摘 No.95 拡張: 索引 (非 PK)。 a5er の IndexInfo と対で DDL にも出力
// (CREATE [UNIQUE] INDEX は 4 方言共通構文)
var _dIdxs = t.indexes || [];
for (var dxi = 0; dxi < _dIdxs.length; dxi++) {
var _dx = _dIdxs[dxi];
if (_dx.uniqCons) {
// ユニーク制約バック: CREATE UNIQUE INDEX だと再生成時に制約が索引に
// 化けるため、 制約として出力する (a5er の uniq=2 と対)
s += 'ALTER TABLE ' + t.name + ' ADD CONSTRAINT ' + _dx.name +
' UNIQUE (' + _dx.cols.join(', ') + ');\n';
} else {
s += 'CREATE ' + (_dx.unique ? 'UNIQUE ' : '') + 'INDEX ' + _dx.name +
' ON ' + t.name + ' (' + _dx.cols.join(', ') + ');\n';
}
}
s += '\n';
}
// FK 制約 (複合 FK は 1 本の ALTER に列を並べる — _groupFks)
var _fkGroups = _groupFks(meta.fks);
if (_fkGroups.length > 0) {
s += '-- ============================================================\n';
s += '-- Foreign Key Constraints\n';
s += '-- ============================================================\n';
for (var fi = 0; fi < _fkGroups.length; fi++) {
var f = _fkGroups[fi];
s += 'ALTER TABLE ' + f.childTable +
' ADD CONSTRAINT ' + (f.name || ('FK_' + f.childTable + '_' + (fi + 1))) +
' FOREIGN KEY (' + f.childCols.join(', ') + ')' +
' REFERENCES ' + f.parentTable + ' (' + f.parentCols.join(', ') + ');\n';
}
}
return s;
}
function _ddlType(c, dbType) {
var t = String(c.type || '').toUpperCase();
if ((t === 'NUMBER' || t === 'NUMERIC' || t === 'DECIMAL')) {
if (c.prec) {
return t + '(' + c.prec + (c.scale && c.scale !== '0' ? ',' + c.scale : '') + ')';
}
return t;
}
if ((t.indexOf('CHAR') >= 0 || t.indexOf('VARCHAR') >= 0) && c.len && c.len !== '0') {
return t + '(' + c.len + ')';
}
return t || 'VARCHAR2(255)';
}
function _ddlEsc(s) {
return String(s || '').replace(/'/g, "''");
}
// ============================================================
// A5:SQL Mk-2 ネイティブ形式 (.a5er) 生成
// ============================================================
// 公式仕様: A5:SQL Mk-2 (https://a5m2.mmatsubara.com/) の独自 INI 風テキスト形式。
// - 文字コード: UTF-8 (BOM 付き)
// - 改行: CRLF
// - ヘッダ + [Manager] + [Entity]* + [Relation]* セクション
// - Field 行: "論理名","物理名","型","制約",主キー順序(0始まり/非キー空),"","",$色,"コメント"
// - Relation 行: Entity1=親(1側) / Entity2=子(多側)、 Fields1/Fields2=親/子の関連列物理名
// (複合キーはカンマ連結)
// - 自動配置: テーブルを横 4 列 × 縦 N 行のグリッドに配置
function _erToA5er(meta) {
// レイアウト方針:
// 4 列固定 × 列ごとに Y を独立して詰めるパッキングレイアウト。
// 各エンティティのボックス高は HDR_H + (列数 × ROW_H) + FOOTER_H で算出し、
// 列数の多いテーブル (TLN_M_GENERAL_ITEM 等) が <続きあり> で切れないようにする。
// テーブル数が多くキャンバスから溢れる場合は、A5:SQL Mk-2 側で
// [設定 → ER図のプロパティ → 用紙サイズ/ページ数] を手動拡張する想定。
var ENT_W = 600, SP_X = 200, SP_Y = 100;
var HDR_H = 70; // テーブル名ヘッダ部 + 上余白
var ROW_H = 36; // 列 1 行あたりの logical unit (実測: 旧 ENT_H=500 / 13 列 ≈ 34)
var FOOTER_H = 30; // 下マージン + <続きあり> マーカー領域分
var MIN_H = 200; // 列が極端に少ない場合の最小高
var TOP0 = 100, LEFT0 = 100;
var _geom = { entW: ENT_W, spX: SP_X, spY: SP_Y, hdrH: HDR_H, rowH: ROW_H,
footerH: FOOTER_H, minH: MIN_H, top0: TOP0, left0: LEFT0 };
// ★テスター指摘 No.90: 用紙サイズと列数をセットで自動選択する。
// 初版 (2026-08-01) は 4 列固定のまま用紙だけ自動選択したため、 テーブルが増えると
// 縦にだけ伸びて A1 でも高さを超え、 横幅は余ったままだった (2026-08-04 再指摘)。
// → 小さい用紙から順に「その用紙幅に入る列数」で詰め直し、 収まった時点で確定する。
// どれにも収まらなければ最大用紙 (A1) の列数で出力する (A5M2 側でページ拡張可)。
var _PAPER_W = [2970, 4200, 5940, 8410]; // A4 / A3 / A2 / A1 Landscape の幅
var positions = null, _maxX = 0, _maxY = 0;
for (var pwI = 0; pwI < _PAPER_W.length; pwI++) {
var _cols = _a5erColsForPaper(_PAPER_W[pwI], ENT_W, SP_X, LEFT0);
var _packed = _a5erPack(meta.tables, _cols, _geom);
positions = _packed.positions;
_maxX = _packed.maxX;
_maxY = _packed.maxY;
// この用紙に収まったら確定 (収まらなければ次の大きい用紙で列数を増やして再配置)
if (_a5erPickPaper(_maxX, _maxY).w <= _PAPER_W[pwI]) break;
}
var _paper = _a5erPickPaper(_maxX, _maxY);
var N = meta.tables.length;
var L = [];
// ヘッダ
L.push('# A5:ER FORMAT:21');
L.push('# A5:ER ENCODING:UTF8');
L.push('# A5:ER Mk-1 Copyright © 2007 m.matsubara');
L.push('# A5:SQL Mk-2 Generated by TLN_FUNC_DOC_ER_DIAGRAM_COMMON');
L.push('# https://a5m2.mmatsubara.com');
L.push('');
// Manager セクション
L.push('[Manager]');
L.push('ProjectName=');
L.push('Author=');
L.push('MaxEntityRowShow=1000');
L.push('ReadOnlyRecommend=0');
// PageInfo="ページ名",表示モード,"用紙サイズ","背景色"。 表示モード 3 は A5M2 既定の
// シリアライズ値 (E2E で開けることを確認済み。 意味の公開仕様なし)
L.push('PageInfo="Main",3,"' + _paper.nm + '",$FFFFFF');
L.push('LogicalView=0');
L.push('DecodeDomain=0');
L.push('ViewFormat=0');
L.push('UseNondependenceDashLine=0');
L.push('FontName=Tahoma');
L.push('FontSize=9');
L.push('PaperSize=' + _paper.nm);
L.push('ShowPageoutRelation=1');
L.push('DefaultPkName=%0:s_PKC');
L.push('DefaultPkIndexName=%0:s_PKI');
L.push('DefaultIndexName=%0:s_IX%1:d');
L.push('DefaultFkName=%0:s_FK%1:d');
L.push('SqlSeparator=0');
L.push('UpperCaseKeyword=0');
L.push('ShowTag=1');
L.push('ShowCommonAttributes=0');
L.push('ShowDisableAttributes=0');
L.push('BugFixEntityWidth=1');
L.push('');
// Entities (事前計算した positions を使用)
var stamp = _a5erTimestamp();
for (var ti = 0; ti < N; ti++) {
var t = meta.tables[ti];
var p = positions[ti];
L.push('[Entity]');
L.push('PName=' + _a5erLine(t.name));
// ★テスター指摘 No.94: TALON のテーブルコメントは「論理名■補足説明」形式。
// LName には ■ より前 (論理名) だけを入れ、 補足は Comment に回す
// (従来は ■ 込みの全文を LName に入れ、 A5M2 で論理名が長大になっていた)。
// ★型の使い分け (公式仕様 §4.1 / §1.2): LName/PName は String (エスケープしない —
// \q 等を入れると A5M2 がそのまま表示してしまう)。 行形式を壊す改行/タブのみ
// 空白へ置換 (_a5erLine)。 Comment は EscapedString (§1.2 エスケープ対象)。
var _tc = _a5erSplitComment(t.comment);
L.push('LName=' + _a5erLine(_tc.lname || t.name));
L.push('Comment=' + _a5erStr(_tc.supp));
L.push('TableInnerOption=');
L.push('TableOption=');
L.push('Page=Main');
L.push('Left=' + p.left);
L.push('Top=' + p.top);
// ★テスター指摘 No.65: Field の5番目トークンは A5M2 仕様上「主キー順序」
// (0 始まり・非キー列は空)。 従来は PK フラグ (1/0) を出しており、 A5M2 で
// 編集・保存すると「リストのインデックスが範囲を超えています」で保存不能だった
// (非キー列の '0' を PK 順序 0 と誤認するため)。 PK 列に 0,1,2… を割当て、
// 非 PK 列は空にする。 順序は列出現順 (= 多くの場合キー定義順) で近似する。
var pkOrder = 0;
for (var ci = 0; ci < t.cols.length; ci++) {
var c = t.cols[ci];
var notNull = c.nullable ? '' : 'NOT NULL';
// Field="論理名","物理名","型","制約",主キー順序(0始まり/非キー空),"","",$色,"コメント"
// 論理名 = USER_COL_COMMENTS / pg_description の列コメント。 無ければ物理名で代替
// ★No.94: 列コメントも「論理名■補足」形式。 論理名は ■ より前、 補足は
// 最終トークン (コメント) に回す。
var _cc = _a5erSplitComment(c.comment);
var pkTok = c.isPk ? String(pkOrder++) : '';
L.push('Field="' + _a5erStr(_cc.lname || c.name) + '","' + _a5erStr(c.name) +
'","' + _a5erStr(_a5erType(c)) + '","' + notNull + '",' +
pkTok + ',"","",$FFFFFFFF,"' + _a5erStr(_cc.supp) + '"');
}
// ★テスター指摘 No.95: 索引 (IndexInfo 複合値 §4.1.2)。 PK 索引はクエリ側で除外済。
// "索引名",ユニークフラグ(0=非/1=ユニーク),"カラムリスト(カンマ区切り)","オプション"
var _tIdxs = t.indexes || [];
for (var xi2 = 0; xi2 < _tIdxs.length; xi2++) {
var _ix2 = _tIdxs[xi2];
L.push('IndexInfo="' + _a5erStr(_ix2.name) + '",' +
(_ix2.uniqCons ? 2 : (_ix2.unique ? 1 : 0)) + // §4.1.2: 2=ユニーク制約
',"' + _a5erStr(_ix2.cols.join(',')) + '",""');
}
L.push('EffectMode=None');
L.push('Color=$000000');
L.push('BkColor=$FFFFFF');
L.push('ModifiedDateTime=' + stamp);
L.push('Position="Main",' + p.left + ',' + p.top + ',' + ENT_W + ',' + p.height);
L.push('ZOrder=' + (ti + 1));
L.push('');
}
// Relations (FK) — 公式仕様 (a5er_specification.md):
// Entity1=親(1側) / Entity2=子(多側)、 Fields1/Fields2 は 親/子の関連カラム物理名。
// RelationType: 0=指定なし, 1=0または1, 2=1, 3=0以上, 4=1以上, 5=N個固定
// → FK は 親(1) 対 子(0以上) なので RelationType1=2 / RelationType2=3。
// ※テスター指摘 No.49: 旧実装は Entity1=子 + RelationType1=1 で親子と多重度が
// 逆転しており、 A5M2 で 1対多 が 多対1 に見えていた。
// ★複合 FK は 1 つの [Relation] に Fields をカンマ連結 (§4.2)。 従来は列単位で
// [Relation] が複数出て A5M2 で線が列数分引かれていた (_groupFks で制約単位化)。
var _a5FkGroups = _groupFks(meta.fks);
for (var fi = 0; fi < _a5FkGroups.length; fi++) {
var f = _a5FkGroups[fi];
L.push('[Relation]');
L.push('Entity1=' + f.parentTable);
L.push('Entity2=' + f.childTable);
L.push('RelationType1=2');
L.push('RelationType2=3');
L.push('Fields1=' + f.parentCols.join(','));
L.push('Fields2=' + f.childCols.join(','));
L.push('Cardinarity1=');
L.push('Cardinarity2=');
L.push('Position="MAIN",0,1438,8562,1812,R,R,""');
L.push('Dependence=0');
L.push('Caption=');
L.push('PName=');
L.push('LineMode=0');
L.push('Bar1=144');
L.push('Bar2=856');
L.push('Bar3=181');
L.push('TermPos1=R');
L.push('TermPos2=R');
L.push('ZOrder=' + (meta.tables.length + fi + 1));
L.push('');
}
// UTF-8 BOM () + CRLF 連結
return '' + L.join('\r\n');
}
function _a5erType(c) {
var t = String(c.type || '').toUpperCase();
if ((t === 'NUMBER' || t === 'NUMERIC' || t === 'DECIMAL') && c.prec) {
return t + '(' + c.prec + (c.scale && c.scale !== '0' ? ',' + c.scale : '') + ')';
}
if ((t.indexOf('CHAR') >= 0 || t.indexOf('VARCHAR') >= 0) && c.len && c.len !== '0') {
return t + '(' + c.len + ')';
}
return t || 'VARCHAR2';
}
// String 型プロパティ (LName= 等、 §1.2 エスケープ対象外) 用のサニタイザ。
// エスケープはしない (A5M2 が \q 等を復元しないため入れると表示が壊れる)。
// 行ベース形式を壊す改行/タブのみ空白へ置換する。
function _a5erLine(s) {
return String(s || '').replace(/[\r\n\t]+/g, ' ');
}
// ★テスター指摘 No.90: レイアウト最大座標 (0.1mm 単位) から収まる最小の用紙 (横) を選ぶ。
// 公式仕様: 描画エリアの上下左右 5mm は余白、 さらにオブジェクト位置は
// 「用紙サイズ - 1.0cm 以内」 → 利用可能域 = 用紙寸法×10 - 100。
// A1Landscape でも収まらない場合は A1Landscape のまま出力する (A5M2 側でページ数を
// 増やして調整可能)。 純関数 (jsunit の実コード抽出テスト対象 — tests/test_a5er_output.py)。
function _a5erPickPaper(maxX, maxY) {
var PAPERS = [
{ nm: 'A4Landscape', w: 2970, h: 2100 },
{ nm: 'A3Landscape', w: 4200, h: 2970 },
{ nm: 'A2Landscape', w: 5940, h: 4200 },
{ nm: 'A1Landscape', w: 8410, h: 5940 }
];
for (var pp = 0; pp < PAPERS.length; pp++) {
if (maxX < PAPERS[pp].w - 100 && maxY < PAPERS[pp].h - 100) return PAPERS[pp];
}
return PAPERS[PAPERS.length - 1];
}
// ★テスター指摘 No.90 (2026-08-04 再指摘): 用紙幅に入る列数を算出する。
// 従来は 4 列固定だったため、 テーブルが増えると縦にだけ伸びて 用紙の高さを超え、
// 横幅は余ったままだった (30 テーブルで縦超過 / 横は空き)。 用紙を大きくしても
// 列数が 4 のままでは同じ形で伸びるだけなので、 用紙幅に応じて列数を増やす。
// 利用可能幅 = 用紙幅 - 100 (公式仕様: オブジェクト位置は用紙サイズ - 1.0cm 以内)
// - left0 (左上の開始オフセット)
// n 列の所要幅 = n*entW + (n-1)*spX → n = floor((利用可能幅 + spX) / (entW + spX))
// 純関数 (jsunit の実コード抽出テスト対象 — tests/test_a5er_output.py)。
function _a5erColsForPaper(paperW, entW, spX, left0) {
var avail = paperW - 100 - left0;
var n = Math.floor((avail + spX) / (entW + spX));
return n < 1 ? 1 : n;
}
// ★No.90: 指定列数でテーブルを詰め、 位置と最大 X/Y を返す (列ごとに Y を独立して詰める)。
// 純関数 (jsunit の実コード抽出テスト対象)。
function _a5erPack(tables, cols, geom) {
var positions = [], colY = [], maxX = 0, maxY = 0;
for (var ci = 0; ci < cols; ci++) colY[ci] = geom.top0;
for (var ti = 0; ti < tables.length; ti++) {
var t = tables[ti];
var nc = (t.cols && t.cols.length) || 0;
var h = Math.max(geom.minH, geom.hdrH + nc * geom.rowH + geom.footerH);
var col = ti % cols;
var left = geom.left0 + col * (geom.entW + geom.spX);
var top = colY[col];
colY[col] = top + h + geom.spY;
positions[ti] = { left: left, top: top, height: h };
if (left + geom.entW > maxX) maxX = left + geom.entW;
if (top + h > maxY) maxY = top + h;
}
return { positions: positions, maxX: maxX, maxY: maxY };
}
// ★テスター指摘 No.94: TALON のコメント「論理名■補足説明」を分割する。
// lname が空 (コメント無し / 先頭が ■) の場合は呼出側で物理名等にフォールバックする。
// 純関数 (jsunit の実コード抽出テスト対象)。
function _a5erSplitComment(comment) {
var parts = TFC.s(comment).split('■');
return { lname: parts[0] || '', supp: parts.length > 1 ? parts.slice(1).join('■') : '' };
}
function _a5erStr(s) {
// ★テスター指摘 No.91: A5:SQL Mk-2 公式仕様 §1.2 (EscapedString / Complex 中の文字列) のエスケープ。
// 従来は CSV 風の "→"" だったが仕様と異なり、 コメントに改行や引用符があると
// A5M2 でファイルが壊れる/照合に失敗した。 正しくは \→\\ / "→\Q / '→\q /
// タブ→\t / 改行(CR/LF/CRLF)→\n (順序重要: バックスラッシュを最初に置換)。
return String(s || '')
.replace(/\\/g, '\\\\')
.replace(/"/g, '\\Q')
.replace(/'/g, '\\q')
.replace(/\t/g, '\\t')
.replace(/\r\n|\r|\n/g, '\\n');
}
function _a5erTimestamp() {
var d = new Date();
function p(n) { n = '' + n; return n.length < 2 ? '0' + n : n; }
return '' + d.getFullYear() + p(d.getMonth() + 1) + p(d.getDate()) +
p(d.getHours()) + p(d.getMinutes()) + p(d.getSeconds());
}
// ============================================================
// ZIP 出力 (Java util.zip)
// ============================================================
// entries: [{name: 'a.html', content: 'string'}, {name: 'b.drawio', content: byte[]}]
// content は string (= UTF-8 でエンコード) または Java byte[] (= そのまま書き込み)
// バイナリファイル (.drawio 圧縮 XML / 画像 等) は byte[] で渡すこと
// 戻り値: byte[] (Java)
TFC.zip = function (entries) {
var baos = new ByteArrayOutputStream();
var zos = new ZipOutputStream(baos, Charset.forName('UTF-8'));
try {
for (var i = 0; i < entries.length; i++) {
var e = entries[i];
zos.putNextEntry(new ZipEntry(e.name));
var bytes;
// Java byte[] (= getClass().getName() === '[B') ならそのまま使う
if (e.content && typeof e.content === 'object' &&
e.content.getClass && e.content.getClass().getName() === '[B') {
bytes = e.content;
} else {
bytes = new JString(e.content).getBytes(Charset.forName('UTF-8'));
}
zos.write(bytes, 0, bytes.length);
zos.closeEntry();
}
} finally {
zos.close();
}
return baos.toByteArray();
};
// ============================================================
// サーバ側出力 (Ver1.0.1)
// ============================================================
// ZIP と同じ成果物一式を サーバ上の {ベース}/{yyyyMMdd_HHmmss}/ に展開し、 {ベース}/index.html
// (出力履歴の一覧) を再生成する。 ZIP ダウンロードとの切替は 汎用CD TLN_FUNC_DOC_SERVER_OUT
// (SETUP が 0 行時に seed。 環境設定なので出荷 CSV には含めない — filter_product_pkg_export.py):
// MODE : 2=サーバのみ (SETUP の既定、 2026-09-11) / 1=ZIP + サーバ / 0=ZIP ダウンロードのみ
// (汎用CD が無い・値が不正なときは 0 = 従来どおり ZIP)
// PATH : 物理ベースフォルダ (空 = THUMBNAIL_UPLOAD_PATH の表示値 + /commonweal)
// URL : 一覧の URL 接頭辞 (空 = THUMBNAIL_UPLOAD_PATH の表示2 + /commonweal。
// TALON の添付ファイル URL と同じ規則: 先頭 '/' あり = ルート相対 (docroot 配信) /
// 無し = /Talon コンテキスト相対 (alternatedocroot 配信)。 クライアント側で解決する)
// KEEP : 保持世代数 (空/0 = 無制限。 超過分は古い順に削除)
// 一覧は 各世代フォルダの manifest.json を走査して毎回作り直す (文字列挿入ではない =
// 同時実行・手動削除に強い)。 index.html は一時ファイルに書いてから置換する。
// ★ファイル名に日本語を含むため、 Linux では JVM の sun.jnu.encoding が UTF-8 であること
// (Payara 公式イメージは LANG=en_US.UTF-8 で満たす)。
var _NioFiles = Java.type('java.nio.file.Files');
var _NioPaths = Java.type('java.nio.file.Paths');
var _NioCopyOpt = Java.type('java.nio.file.StandardCopyOption');
var _JComparator = Java.type('java.util.Comparator');
TFC.SERVER_OUT_SIKIBETU = 'TLN_FUNC_DOC_SERVER_OUT';
// 既定フォルダ名 = 設計書出力の機能 ID。 TALON 側で THUMBNAIL 配信サーブレット (認可付き) が入ったとき
// 「最初のフォルダ名が機能 ID ならその機能の権限で判定」 の規則に乗るため (2026-09-11 決定)。
// Ver1.0.1 のテスター版で使っていた 'commonweal' は初回出力時にフォルダごと改名して履歴を引き継ぐ。
TFC.SERVER_OUT_SUBDIR = 'TLN_FUNC_DOC';
TFC.SERVER_OUT_SUBDIR_LEGACY = 'commonweal';
TFC.SERVER_OUT_MANIFEST = 'manifest.json';
// string → UTF-8 bytes / Java byte[] → そのまま (TFC.zip と同じ規約)
function _contentToBytes(content) {
if (content && typeof content === 'object' &&
content.getClass && content.getClass().getName() === '[B') {
return content;
}
return new JString(content == null ? '' : String(content)).getBytes(Charset.forName('UTF-8'));
}
function _trimS(v) { return TFC.s(v).replace(/^\s+|\s+$/g, ''); }
// 汎用CD TLN_FUNC_DOC_SERVER_OUT + THUMBNAIL_UPLOAD_PATH から設定を解決する。
// 戻り値: { mode, basePath, urlBase, keep, thumbPath, thumbTop, error }
// 汎用CD 未整備 (SETUP 未実行) や取得失敗は mode=0 (= 従来どおり ZIP のみ)。
TFC.serverOutConfig = function () {
var cfg = { mode: 0, basePath: '', urlBase: '', keep: 0, thumbPath: '', thumbTop: '', error: '' };
try {
var rows = TFC.selectPS(
'SELECT KEY_CODE, DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE = ?',
[TFC.SERVER_OUT_SIKIBETU]);
var vals = {};
for (var i = 0; i < rows.length; i++) {
vals[_trimS(rows[i]['KEY_CODE']).toUpperCase()] = _trimS(rows[i]['DSP1']);
}
var m = parseInt(vals['MODE'], 10);
cfg.mode = (m === 1 || m === 2) ? m : 0;
var k = parseInt(vals['KEEP'], 10);
cfg.keep = (k > 0) ? k : 0;
cfg.basePath = vals['PATH'] || '';
cfg.urlBase = vals['URL'] || '';
} catch (e) {
cfg.error = String(e);
}
if (cfg.mode === 0) return cfg;
try {
var tp = TFC.selectPS(
"SELECT DSP1, DSP2 FROM TLN_M_HANYO_CODE_MAIN " +
"WHERE SIKIBETU_CODE = 'TLN_GENERAL' AND KEY_CODE = 'THUMBNAIL_UPLOAD_PATH'", []);
if (tp.length > 0) {
cfg.thumbPath = _trimS(tp[0]['DSP1']);
cfg.thumbTop = _trimS(tp[0]['DSP2']);
}
} catch (e2) { /* 取得不能なら PATH/URL の明示設定だけを使う */ }
var pathExplicit = !!cfg.basePath; // 汎用CD PATH で出力先を上書きしているか
if (!cfg.basePath && cfg.thumbPath) {
cfg.basePath = cfg.thumbPath.replace(/[\\\/]+$/, '') + '/' + TFC.SERVER_OUT_SUBDIR;
}
// URL は PATH を上書きしていないときだけ THUMBNAIL の規則から導く。 PATH を別の場所にした場合は
// その場所を配信する URL を利用者が設定する (空ならリンクを出さず、 完了メッセージで保存先フォルダだけを案内)。
// 旧実装は PATH に関係なく THUMBNAIL 配下の URL を組み立てていたため、 開けないリンクになっていた (2026-09-11)。
if (!cfg.urlBase && !pathExplicit) {
var top = cfg.thumbTop.replace(/\\/g, '/').replace(/\/+$/, '');
if (top) cfg.urlBase = top + '/' + TFC.SERVER_OUT_SUBDIR;
}
return cfg;
};
// {ベース} 直下の世代フォルダ (manifest.json を持つもの) を新しい順に読む
function _serverOutManifestList(base) {
var list = [];
if (!_NioFiles.isDirectory(base)) return list;
var ds = _NioFiles.newDirectoryStream(base);
try {
var it = ds.iterator();
while (it.hasNext()) {
var p = it.next();
if (!_NioFiles.isDirectory(p)) continue;
var mf = p.resolve(TFC.SERVER_OUT_MANIFEST);
if (!_NioFiles.isRegularFile(mf)) continue;
try {
var m = JSON.parse(String(new JString(_NioFiles.readAllBytes(mf), 'UTF-8')));
m.dir = String(p.getFileName());
list.push(m);
} catch (eM) { /* 壊れた manifest は一覧から外す */ }
}
} finally { ds.close(); }
list.sort(function (a, b) { return a.dir < b.dir ? 1 : (a.dir > b.dir ? -1 : 0); });
return list;
}
function _serverOutDeleteTree(p) {
var st = _NioFiles.walk(p);
try {
var it = st.sorted(_JComparator.reverseOrder()).iterator();
while (it.hasNext()) _NioFiles.deleteIfExists(it.next());
} finally { st.close(); }
}
// 保持世代数を超えた古い世代を削除する (manifest.json を持つフォルダだけが対象)
function _serverOutPrune(base, keep) {
if (!(keep > 0)) return 0;
var list = _serverOutManifestList(base);
var removed = 0;
for (var i = keep; i < list.length; i++) {
try {
_serverOutDeleteTree(base.resolve(list[i].dir));
removed++;
} catch (eD) {
try { TALON.getLogger().writeWarn('[TFC] server out prune failed: ' + list[i].dir + ' ' + eD); } catch (ig) {}
}
}
return removed;
}
function _serverOutWriteAtomic(path, bytes) {
var tmp = path.resolveSibling(String(path.getFileName()) + '.tmp');
_NioFiles.write(tmp, bytes);
try {
_NioFiles.move(tmp, path, _NioCopyOpt.REPLACE_EXISTING, _NioCopyOpt.ATOMIC_MOVE);
} catch (eA) {
_NioFiles.move(tmp, path, _NioCopyOpt.REPLACE_EXISTING);
}
}
/**
* 成果物一式をサーバへ展開し、 一覧 index.html を再生成する。
* @param cfg TFC.serverOutConfig() の戻り値 (mode >= 1)
* @param entries ZIP と同じ [{name, content}] (content は string または Java byte[])
* @param manifest {stamp, datetime, user, lang, edition, funcs, conditions, projects, zipName}
* (dir / fileCount / bytes / zipFile / zipBytes はこの関数が補う)
* @param extras 任意。 成果物とは別に世代フォルダへ置くファイル [{name, content}] (例: ZIP 本体。
* 一覧 index.html から「ZIPをダウンロード」でそのまま取得できる)
* @returns {dir, dirName, url, indexUrl, mdZipUrl, fileCount, bytes, removed, generations}
* extras: [{name, content, key?}] — key='mdZip' の要素は manifest.mdZipFile / mdZipBytes に記録する
*/
TFC.serverOutWrite = function (cfg, entries, manifest, extras) {
if (!cfg || !cfg.basePath) {
throw new Error('server out: base path is empty (THUMBNAIL_UPLOAD_PATH or PATH is not set)');
}
var base = _NioPaths.get(cfg.basePath);
// 旧既定フォルダ (commonweal/) が残っていて新フォルダが無ければ、 フォルダごと改名して世代と manifest を
// 引き継ぐ (一覧 index.html は manifest から再生成されるので改名だけで復元する)。 PATH で明示された
// 出力先 (末尾が既定名でない) は対象外。 改名に失敗したら新フォルダで始める (旧フォルダはそのまま残る)。
if (!_NioFiles.exists(base) && String(base.getFileName()) === TFC.SERVER_OUT_SUBDIR) {
var legacy = base.resolveSibling(TFC.SERVER_OUT_SUBDIR_LEGACY);
if (_NioFiles.isDirectory(legacy)) {
try {
_NioFiles.move(legacy, base);
try { TALON.getLogger().writeInfo('[TFC] server out: renamed legacy folder ' + legacy + ' -> ' + base); } catch (ig1) {}
} catch (eMv) {
try { TALON.getLogger().writeWarn('[TFC] server out: legacy folder rename failed, starting a new folder: ' + eMv); } catch (ig2) {}
}
}
}
_NioFiles.createDirectories(base);
var dirName = manifest.stamp;
var dir = base.resolve(dirName);
for (var n = 2; _NioFiles.exists(dir) && n < 100; n++) { // 同秒の衝突 (別利用者の同時実行)
dirName = manifest.stamp + '_' + n;
dir = base.resolve(dirName);
}
_NioFiles.createDirectories(dir);
var bytesTotal = 0, fileCount = 0;
for (var i = 0; i < entries.length; i++) {
var e = entries[i];
var rel = String(e.name).replace(/\\/g, '/').replace(/^\/+/, '');
if (!rel || rel.split('/').indexOf('..') >= 0) continue; // 防御: 世代フォルダ外への書込を禁止
var p = dir.resolve(rel);
var parent = p.getParent();
if (parent != null) _NioFiles.createDirectories(parent);
var bytes = _contentToBytes(e.content);
_NioFiles.write(p, bytes);
bytesTotal += bytes.length;
fileCount++;
}
manifest.dir = dirName;
manifest.fileCount = fileCount;
manifest.bytes = bytesTotal;
// 付随ファイル (ZIP 本体など)。 世代フォルダ直下に置き、 KEEP の削除でフォルダごと消える
if (extras && extras.length) {
for (var x = 0; x < extras.length; x++) {
var xn = String(extras[x].name).replace(/[\\/]/g, '_');
if (!xn) continue;
var xb = _contentToBytes(extras[x].content);
_NioFiles.write(dir.resolve(xn), xb);
if (extras[x].key === 'mdZip') { // AI 向け Markdown (meta/) だけの ZIP
manifest.mdZipFile = xn;
manifest.mdZipBytes = xb.length;
} else if (/\.zip$/i.test(xn) && !manifest.zipFile) {
manifest.zipFile = xn;
manifest.zipBytes = xb.length;
}
}
}
_NioFiles.write(dir.resolve(TFC.SERVER_OUT_MANIFEST), _contentToBytes(JSON.stringify(manifest, null, 1)));
var removed = _serverOutPrune(base, cfg.keep);
var list = _serverOutManifestList(base);
_serverOutWriteAtomic(base.resolve('index.html'), _contentToBytes(_serverOutIndexHtml(list, TFC.uiLang())));
var urlBase = TFC.s(cfg.urlBase).replace(/\/+$/, '');
return {
dir: String(dir.toAbsolutePath()), dirName: dirName, fileCount: fileCount, bytes: bytesTotal,
url: urlBase ? (urlBase + '/' + dirName + '/index.html') : '',
indexUrl: urlBase ? (urlBase + '/index.html') : '',
mdZipUrl: (urlBase && manifest.mdZipFile) ? (urlBase + '/' + dirName + '/' + manifest.mdZipFile) : '',
removed: removed, generations: list.length
};
};
var _SV_CSS =
"body{font-family:'Segoe UI',Meiryo,sans-serif;background:#f1f5f9;color:#1e293b;margin:0;padding:0 24px 32px;line-height:1.55}" +
".sv-hero{background:linear-gradient(135deg,#0369a1,#0891b2);color:#fff;padding:24px 28px;border-radius:8px;margin:18px 0 16px}" +
".sv-hero h1{font-size:1.5em;margin:0;font-weight:bold}" +
".sv-hero .sub{margin-top:6px;opacity:.9;font-size:.92em}" +
".sv-count{color:#64748b;font-size:.9em;margin:0 0 10px}" +
".sv-table{border-collapse:collapse;width:100%;background:#fff;border:1px solid #cbd5e1;font-size:.9em}" +
".sv-table th{background:#e2e8f0;text-align:left;padding:8px 10px;border-bottom:1px solid #cbd5e1;white-space:nowrap}" +
".sv-table td{padding:8px 10px;border-bottom:1px solid #e2e8f0;vertical-align:top}" +
".sv-table tr:hover td{background:#f8fafc}" +
".sv-id{color:#94a3b8;font-family:Consolas,monospace;font-size:.85em}" +
".sv-dt{white-space:nowrap;font-family:Consolas,monospace}" +
".sv-funcs,.sv-cond{margin:0;padding-left:1.1em}" +
".sv-cond{color:#334155}" +
".sv-open{display:inline-block;padding:5px 12px;background:#0369a1;color:#fff;border-radius:4px;text-decoration:none;font-weight:bold;white-space:nowrap}" +
".sv-open:hover{background:#075985}" +
".sv-zip{display:inline-block;margin-left:6px;padding:5px 10px;border:1px solid #0369a1;color:#0369a1;border-radius:4px;text-decoration:none;font-weight:bold;white-space:nowrap;background:#fff}" +
".sv-zip:hover{background:#e0f2fe}" +
".sv-meta{color:#94a3b8;font-size:.82em;margin-top:4px;font-family:Consolas,monospace}" +
".sv-empty{color:#64748b}" +
"details summary{cursor:pointer;color:#0369a1}";
function _svFuncLi(fn, esc) {
fn = fn || {};
return '<li><span class="sv-id">' + esc(fn.id) + '</span> ' + esc(fn.nm) + '</li>';
}
// 出力履歴の一覧 HTML (純関数。 manifests は新しい順、 lang は環境の画面言語)。
// 単体回帰: tests/test_server_out_index.py (Node)
function _serverOutIndexHtml(manifests, lang) {
lang = (lang === 'en') ? 'en' : 'ja';
var esc = function (v) { return TFC.escapeHtml(TFC.s(v)); };
var FUNC_SHOW = 5;
var editionLabel = { '1': TFC.t('sv.edition1', lang), '2': TFC.t('sv.edition2', lang), '3': TFC.t('sv.edition3', lang) };
var langLabel = { ja: TFC.t('sv.lang.ja', lang), en: TFC.t('sv.lang.en', lang) };
manifests = manifests || [];
var s = '<!DOCTYPE html><html lang="' + lang + '"><head><meta charset="UTF-8">' +
'<meta name="viewport" content="width=device-width,initial-scale=1.0">' +
(TFC.FAVICON_LINK || '') +
'<title>' + esc(TFC.t('sv.title', lang)) + '</title>' +
'<style>' + _SV_CSS + '</style></head><body>' +
'<div class="sv-hero"><h1>' + esc(TFC.t('sv.title', lang)) + '</h1>' +
'<div class="sub">' + esc(TFC.t('sv.intro', lang)) + '</div></div>' +
'<div class="sv-count">' + esc(TFC.tf('sv.count', lang, [manifests.length])) + '</div>';
if (manifests.length === 0) {
s += '<p class="sv-empty">' + esc(TFC.t('sv.empty', lang)) + '</p>';
} else {
s += '<table class="sv-table"><thead><tr>' +
'<th>' + esc(TFC.t('sv.col.datetime', lang)) + '</th>' +
'<th>' + esc(TFC.t('sv.col.user', lang)) + '</th>' +
'<th>' + esc(TFC.t('sv.col.funcs', lang)) + '</th>' +
'<th>' + esc(TFC.t('sv.col.conditions', lang)) + '</th>' +
'<th>' + esc(TFC.t('sv.col.lang', lang)) + '</th>' +
'<th>' + esc(TFC.t('sv.col.edition', lang)) + '</th>' +
'<th>' + esc(TFC.t('sv.col.open', lang)) + '</th>' +
'</tr></thead><tbody>';
for (var i = 0; i < manifests.length; i++) {
var m = manifests[i] || {};
var funcs = m.funcs || [];
var u = m.user || {};
// 出力した機能: 先頭 FUNC_SHOW 件 + 残りは details で畳む
var fh = '<div>' + esc(TFC.tf('sv.funcCount', lang, [funcs.length])) + '</div><ul class="sv-funcs">';
for (var f = 0; f < funcs.length && f < FUNC_SHOW; f++) fh += _svFuncLi(funcs[f], esc);
fh += '</ul>';
if (funcs.length > FUNC_SHOW) {
fh += '<details><summary>' + esc(TFC.tf('sv.funcMore', lang, [funcs.length - FUNC_SHOW])) +
'</summary><ul class="sv-funcs">';
for (var f2 = FUNC_SHOW; f2 < funcs.length; f2++) fh += _svFuncLi(funcs[f2], esc);
fh += '</ul></details>';
}
// 検索条件 (非空のみ) + プロジェクト
var conds = m.conditions || [];
var ch = '';
for (var c = 0; c < conds.length; c++) {
var ck = TFC.s(conds[c].key).toUpperCase();
var lk = 'cond.' + ck;
var lbl = TFC.t(lk, lang);
if (lbl === lk) lbl = ck;
ch += '<li>' + esc(lbl) + ': ' + esc(conds[c].value) + '</li>';
}
if (m.projects && m.projects.length) {
ch += '<li>' + esc(TFC.t('sv.project', lang)) + ': ' + esc(m.projects.join(', ')) + '</li>';
}
ch = ch ? ('<ul class="sv-cond">' + ch + '</ul>')
: ('<span class="sv-empty">' + esc(TFC.t('sv.noCondition', lang)) + '</span>');
var dirAttr = TFC.escapeAttr(TFC.s(m.dir));
s += '<tr>' +
'<td class="sv-dt">' + esc(m.datetime || m.stamp) + '</td>' +
'<td>' + esc(u.name || u.id) +
((u.id && u.name) ? ' <span class="sv-id">' + esc(u.id) + '</span>' : '') + '</td>' +
'<td>' + fh + '</td>' +
'<td>' + ch + '</td>' +
'<td>' + esc(langLabel[m.lang] || m.lang) + '</td>' +
'<td>' + esc(editionLabel[String(m.edition)] || m.edition) + '</td>' +
'<td><a class="sv-open" href="' + dirAttr + '/index.html">' + esc(TFC.t('sv.open', lang)) + '</a>' +
(m.zipFile ? '<a class="sv-zip" href="' + dirAttr + '/' + TFC.escapeAttr(TFC.s(m.zipFile)) + '" download>' +
esc(TFC.t('sv.zip', lang)) + '</a>' : '') +
(m.mdZipFile ? '<a class="sv-zip sv-md" href="' + dirAttr + '/' + TFC.escapeAttr(TFC.s(m.mdZipFile)) + '" download>' +
esc(TFC.t('sv.mdZip', lang)) + '</a>' : '') +
'<div class="sv-meta">' + esc(m.dir) + ' / ' + esc(TFC.tf('sv.files', lang, [m.fileCount || 0])) +
(m.zipFile ? ' / ' + esc(m.zipFile) : (m.zipName ? ' / ' + esc(m.zipName) : '')) + '</div></td>' +
'</tr>';
}
s += '</tbody></table>';
}
s += '</body></html>';
return s;
}
TFC.serverOutIndexHtml = _serverOutIndexHtml;
// ============================================================
// Markdown テンプレート部品
// ============================================================
TFC.mdHeader = function (title) {
return '# ' + (title || '') + '\n\n';
};
TFC.mdSection = function (level, heading, body) {
var hashes = '';
for (var i = 0; i < (level || 2); i++) hashes += '#';
return hashes + ' ' + (heading || '') + '\n\n' + (body || '') + '\n';
};
TFC.mdKvTable = function (rows, lang) {
// rows: [[key, val], ...] / lang: 'ja' or 'en' (省略時は 'ja')
if (!rows || rows.length === 0) return '';
var head = '| ' + TFC.t('th.item', lang) + ' | ' + TFC.t('th.value', lang) + ' |\n|------|----|\n';
var s = head;
for (var i = 0; i < rows.length; i++) {
var k = TFC.escapeMd(rows[i][0]);
var v = TFC.escapeMd(rows[i][1] != null ? String(rows[i][1]) : '');
s += '| ' + k + ' | ' + v + ' |\n';
}
return s + '\n';
};
TFC.mdCodeBlock = function (lang, code) {
return '```' + (lang || '') + '\n' + (code || '') + '\n```\n\n';
};
// セル値を raw 扱い (escapeMd しない) でテーブルに埋め込むためのマーカー。
// inline HTML (<a>...</a> 等) を MD テーブルセルに入れたいときに使う。
TFC.mdRaw = function (s) { return { __mdRaw: true, value: String(s || '') }; };
// 任意列のテーブル: headers=['項目1','項目2',...], rows=[[v,v,...],[v,v,...]]
// セル値は文字列 (escapeMd 適用) または TFC.mdRaw(...) オブジェクト (raw 通過)
TFC.mdTable = function (headers, rows) {
if (!headers || headers.length === 0) return '';
var s = '|';
for (var h = 0; h < headers.length; h++) s += ' ' + TFC.escapeMd(headers[h]) + ' |';
s += '\n|';
for (var d = 0; d < headers.length; d++) s += '------|';
s += '\n';
if (rows) {
for (var r = 0; r < rows.length; r++) {
s += '|';
for (var c = 0; c < rows[r].length; c++) {
var cv = rows[r][c];
var v;
if (cv != null && typeof cv === 'object' && cv.__mdRaw) {
// raw: pipe だけは MD テーブルセル区切りと衝突するためエスケープ
v = String(cv.value).replace(/\|/g, '\\|').replace(/\r?\n/g, '<br>');
} else {
v = (cv != null ? String(cv) : '');
v = TFC.escapeMd(v).replace(/\r?\n/g, '<br>');
}
s += ' ' + v + ' |';
}
s += '\n';
}
}
return s + '\n';
};
// ============================================================
// ユーティリティ
// ============================================================
TFC.s = function (v) {
if (v == null) return '';
var s = String(v);
// NUM 系列の DB エンジン差を正規化:
// Oracle : "1"
// SQL Server / MySQL : "1.000000" (BigDecimal scale が CSV 取込時に保持される)
// → 整数化可能なら "1" に揃える。 比較 (=== '1') が DB 横断で動くようにする。
// 実数値 ("1.5" 等) は変更しない。
if (s.length > 2 && s.indexOf('.') > 0 && /^-?\d+\.0+$/.test(s)) {
return s.replace(/\.0+$/, '');
}
return s;
};
TFC.isEmpty = function (v) { return v == null || String(v).length === 0; };
TFC.coalesce = function () {
for (var i = 0; i < arguments.length; i++) {
if (!TFC.isEmpty(arguments[i])) return arguments[i];
}
return '';
};
// ================================================================
// テーブル参照スキャン (scanTableRefs 一式)
// 2026-07-20 に TLN_FUNC_DOC/update-before.server.js から移設 (EXCL_PICK と共有)。
// 呼出前に TFC.scanConfigure({lang, select, dbType}) で実行文脈を渡す:
// lang : 'ja'|'en' — 出典ラベルの言語 (省略時 'ja')
// select : function(sql, params) — DB アクセサ。省略時 TFC.selectPS。
// 0R100 (検索前 = トランザクション外) では PS が使えないため、
// TFC.scanInlineParams で ? を展開し TFC.selectU で実行するアクセサを
// 渡す (TLN_FUNC_DOC_EXCL_PICK の search-before 参照)
// dbType : proc 本体取得の方言 ('oracle'|'postgres'|'mysql'|'sqlserver'|...)。
// 省略時は接続の productName から検出 (トランザクション文脈が必要)
// scanConfigure は proc ソース等のキャッシュをリセットする (共通 JS はエンジンに
// キャッシュされ得るため、リクエストをまたいだ古いキャッシュを残さない)
// ================================================================
var _scanSel = null;
var _scanLang = 'ja';
var _scanDbTypeOverride = '';
function _scanSizeOf(a) {
if (a == null) return 0;
if (typeof a.size === 'function') return a.size();
return a.length || 0;
}
function _scanSelect(sql, params) {
if (_scanSel) return _scanSel(sql, params);
return TFC.selectPS(sql, params);
}
// テーブル参照スキャンの識別子パターン。
// ・multibyte (日本語等) のテーブル名に対応 (- を識別子文字に含める)
// ・各種クォート対応: キャプチャ 1="..." 2=`...` 3=[...] 4=非クォート
// キーワード regex (FROM/JOIN 等) には他のキャプチャを置かないので、 マッチした
// テーブル名は常に m[1]..m[4] のいずれか (_tblFromMatch で解決)。
// ※ Nashorn は関数内からトップレベル var を参照できないことがあるため、 定数 var で
// はなく関数で返す (呼び出し側がローカル変数に受けて使う)。
function _tblPat() {
return '(?:"([^"]+)"|`([^`]+)`|\\[([^\\]]+)\\]|([A-Za-z_$\\u0080-\\uffff][A-Za-z0-9_$\\u0080-\\uffff]*))';
}
function _tblFromMatch(m) {
return m[1] || m[2] || m[3] || m[4] || '';
}
// SQL テキストからノイズ (コメント / 単一引用符文字列) を除去。
// ・/* ... */ ブロックコメント / -- 行コメント を除去
// ・'...' 文字列リテラルを空白化 (メッセージ中の FROM/JOIN を誤検出しないため)
// ・"..." / `...` / [...] は SQL の 識別子クォートなので保持する
function _stripSqlNoise(text) {
var s = String(text), out = [], i = 0, n = s.length;
while (i < n) {
var c = s.charAt(i), c2 = (i + 1 < n) ? s.charAt(i + 1) : '';
if (c === '/' && c2 === '*') { var e = s.indexOf('*/', i + 2); i = (e < 0) ? n : e + 2; out.push(' '); continue; }
if (c === '-' && c2 === '-') { var e2 = s.indexOf('\n', i + 2); i = (e2 < 0) ? n : e2; out.push(' '); continue; }
if (c === "'") {
i++;
while (i < n) {
if (s.charAt(i) === "'" && s.charAt(i + 1) === "'") { i += 2; continue; } // SQL の '' エスケープ
if (s.charAt(i) === "'") { i++; break; }
i++;
}
out.push(' ');
continue;
}
out.push(c); i++;
}
return out.join('');
}
// SQL テキストから文字列リテラル ('...') の内容を抽出 ('' エスケープは ' に復元)。
// コメント内のリテラルは対象外。 動的SQL (EXECUTE IMMEDIATE / PREPARE ... FROM /
// sp_executesql 等) がリテラル内に組み立てる SQL の抽出 (テスター指摘 No.6) に使う。
function _collectSqlLiterals(text) {
var s = String(text), out = [], i = 0, n = s.length;
while (i < n) {
var c = s.charAt(i), c2 = (i + 1 < n) ? s.charAt(i + 1) : '';
if (c === '/' && c2 === '*') { var e = s.indexOf('*/', i + 2); i = (e < 0) ? n : e + 2; continue; }
if (c === '-' && c2 === '-') { var e2 = s.indexOf('\n', i + 2); i = (e2 < 0) ? n : e2; continue; }
if (c === "'") {
i++;
var buf = [];
while (i < n) {
if (s.charAt(i) === "'" && s.charAt(i + 1) === "'") { buf.push("'"); i += 2; continue; }
if (s.charAt(i) === "'") { i++; break; }
buf.push(s.charAt(i)); i++;
}
out.push(buf.join(''));
continue;
}
i++;
}
return out;
}
// JS テキストからコメント (// , /* */) を除去。 文字列リテラルは残す
// (内部の SQL は scanJs が「SQL らしさ」で判定して抽出するため。 コメント中の
// FROM/JOIN は確実にテーブルでないので、 ここで落とすことで誤検出を防ぐ)。
function _stripJsComments(text) {
var s = String(text), out = [], i = 0, n = s.length;
while (i < n) {
var c = s.charAt(i), c2 = (i + 1 < n) ? s.charAt(i + 1) : '';
if (c === '/' && c2 === '*') { var e = s.indexOf('*/', i + 2); i = (e < 0) ? n : e + 2; out.push(' '); continue; }
if (c === '/' && c2 === '/') { var e2 = s.indexOf('\n', i + 2); i = (e2 < 0) ? n : e2; out.push(' '); continue; }
if (c === "'" || c === '"' || c === '`') {
var q = c; out.push(c); i++;
while (i < n) {
var d = s.charAt(i);
if (d === '\\') { out.push(d); if (i + 1 < n) out.push(s.charAt(i + 1)); i += 2; continue; }
out.push(d); i++;
if (d === q) break;
}
continue;
}
out.push(c); i++;
}
return out.join('');
}
// JS 内の DB 接続取得呼出の検出 regex (scanTableRefs / _analyzeJsConnSegments 共通)。
// グループ: [1]=getOtherDBConn の接続番号 / [2]=getTalonDbConfig / [3]=getDbConfig
function _jsConnRe() {
return /TALON\.(?:getOtherDBConn\s*\(\s*['"]?(\d+)['"]?\s*\)|(getTalonDbConfig)\s*\(\s*\)|(getDbConfig)\s*\(\s*\))/g;
}
// JS テキスト (コメント除去済) の文字列リテラル範囲を [start, end) で列挙。
// 接続呼出の検出や識別子探索を「文字列の外」に限定するために使う。
function _jsStringSpans(text) {
var spans = [], i = 0, n = text.length;
while (i < n) {
var c = text.charAt(i);
if (c === "'" || c === '"' || c === '`') {
var st = i; i++;
while (i < n) {
var d = text.charAt(i);
if (d === '\\') { i += 2; continue; }
i++;
if (d === c) break;
}
spans.push([st, i]);
continue;
}
i++;
}
return spans;
}
function _inSpans(spans, idx) {
for (var i = 0; i < spans.length; i++) {
if (idx >= spans[i][0] && idx < spans[i][1]) return true;
if (spans[i][0] > idx) break;
}
return false;
}
// テスター指摘 No.30 (残課題): `var sql = 'SELECT ...'; TalonDbUtil.select(TALON.getXXX(), sql);`
// のように SQL リテラルの宣言が接続取得呼出より「前」にある書き方は、 区間分割 (接続呼出は
// 後続テキストに効く) だとリテラルが 1 つ前の区間に落ちて誤帰属する。
// ここで 変数 → SQL リテラル のバインディングを収集し、 接続取得と同一引数リスト内で
// 参照される変数の SQL をその接続に帰属させて返す。 解決に使ったリテラルは rest 上で
// 空白化する (後続の区間分割スキャンで二重抽出しないため)。
// 戻り値: { resolved: [{sql, db}], rest, spans }
// db: null=既定接続先 / ''=主接続先 明示 / '1'..'15'=複数DB接続先
function _resolveJsSqlBindings(text) {
var spans = _jsStringSpans(text);
// ── 1. 代入文 (var x = <リテラル連結>) の収集 ──
// `+=` / セグメント内の自己参照 (x = x + '...') は直前バインディングへの追記として連結。
var bindings = {}; // name → [{start, content, spans}] (出現順)
var asgRe = /(?:\bvar\s+|\blet\s+|\bconst\s+)?([A-Za-z_$][A-Za-z0-9_$]*)\s*(\+?=)(?![=>])/g;
var am;
while ((am = asgRe.exec(text)) !== null) {
if (_inSpans(spans, am.index)) continue;
// プロパティ代入 (obj.prop = ...) は変数バインディングではないので除外
var before = am.index > 0 ? text.charAt(am.index - 1) : '';
if (before === '.') continue;
var name = am[1], op = am[2];
// 値セグメント: '=' の後から 文字列外の次の ';' まで
var segStart = asgRe.lastIndex, segEnd = text.length;
for (var si = segStart; si < text.length; si++) {
if (text.charAt(si) === ';' && !_inSpans(spans, si)) { segEnd = si; break; }
}
// セグメント内のリテラルを連結 (間に変数が挟まっても ' ' で繋ぐ — FROM 句の解析には十分)
var ownContent = [], ownSpans = [];
for (var sp = 0; sp < spans.length; sp++) {
if (spans[sp][0] < segStart || spans[sp][0] >= segEnd) continue;
ownContent.push(text.substring(spans[sp][0] + 1, Math.max(spans[sp][0] + 1, spans[sp][1] - 1)));
ownSpans.push(spans[sp]);
}
if (ownContent.length === 0) continue; // リテラルを含まない代入は対象外
var list = bindings[name] || (bindings[name] = []);
var prev = list.length > 0 ? list[list.length - 1] : null;
// 自己参照判定: セグメント (文字列外) に自変数名が現れるか
var selfRe = new RegExp('\\b' + name.replace(/\$/g, '\\$') + '\\b', 'g');
selfRe.lastIndex = 0;
var isAppend = (op === '+=');
if (!isAppend && prev) {
var sm2;
while ((sm2 = selfRe.exec(text.substring(segStart, segEnd))) !== null) {
if (!_inSpans(spans, segStart + sm2.index)) { isAppend = true; break; }
}
}
var content = ownContent.join(' ');
var allSpans = ownSpans;
if (isAppend && prev) {
content = prev.content + ' ' + content;
allSpans = prev.spans.concat(ownSpans);
}
list.push({ start: am.index, content: content, spans: allSpans });
}
// ── 2. 接続取得呼出サイトの後続引数から 変数参照を解決 ──
var resolved = [];
var consumed = {}; // 'start:end' → true (空白化対象リテラル)
var connRe = _jsConnRe();
var cm;
while ((cm = connRe.exec(text)) !== null) {
if (_inSpans(spans, cm.index)) continue;
var db = (cm[1] != null) ? cm[1] : ((cm[2] != null) ? '' : null);
// 直後が ',' (= 同一呼出の後続引数がある) の場合のみ対象
var p = connRe.lastIndex;
while (p < text.length && /\s/.test(text.charAt(p))) p++;
if (text.charAt(p) !== ',') continue;
// 囲み呼出の ')' まで (深さ追跡 / 文字列スキップ) = 後続引数テキスト
var argEnd = text.length, depth = 0;
for (var q = p + 1; q < text.length; q++) {
if (_inSpans(spans, q)) continue;
var qc = text.charAt(q);
if (qc === '(') depth++;
else if (qc === ')') { if (depth === 0) { argEnd = q; break; } depth--; }
}
// 引数リスト内の識別子をバインディングと突合 (呼出サイトより前の最新の代入を採用)
var idRe = /[A-Za-z_$][A-Za-z0-9_$]*/g;
idRe.lastIndex = 0;
var argText = text.substring(p + 1, argEnd);
var im;
while ((im = idRe.exec(argText)) !== null) {
var absIdx = p + 1 + im.index;
if (_inSpans(spans, absIdx)) continue;
var cand = bindings[im[0]];
if (!cand) continue;
var hit = null;
for (var ci2 = 0; ci2 < cand.length; ci2++) {
if (cand[ci2].start < cm.index) hit = cand[ci2];
}
if (!hit) continue;
resolved.push({ sql: hit.content, db: db });
for (var hs = 0; hs < hit.spans.length; hs++) {
consumed[hit.spans[hs][0] + ':' + hit.spans[hs][1]] = true;
}
}
}
// ── 3. 消費済みリテラルを空白化 (オフセット維持) ──
var rest = text;
for (var key in consumed) {
if (!consumed.hasOwnProperty(key)) continue;
var pr = key.split(':');
var cs = Number(pr[0]), ce = Number(pr[1]);
var blank = new Array(ce - cs + 1).join(' ');
rest = rest.substring(0, cs) + blank + rest.substring(ce);
}
return { resolved: resolved, rest: rest, spans: spans };
}
// JS コード (CHR_TEXT) を 接続帰属付きでスキャンするための分解 (§5.20.10 / No.30 / No.43)。
// 1. コメント除去 (★No.43: 生テキストのまま接続呼出で区間分割すると、 コメントアウトされた
// 接続呼出で区間が切れ、 2 区間目以降が「/* を含まない」ためコメント除去をすり抜けて
// ブロックコメント内の DB アクセスが誤抽出される)
// 2. 変数バインディング解決 (No.30 残: リテラル宣言が接続呼出より前の書き方)
// 3. 残テキストを接続呼出位置で区間分割 (文字列リテラル内の呼出風テキストは無視)
// 戻り値: { resolved: [{sql, db}], segments: [{text, db}] }
function _analyzeJsConnSegments(ct) {
var text = _stripJsComments(String(ct || ''));
var bind = _resolveJsSqlBindings(text);
var segments = [];
var re = _jsConnRe();
var lastEnd = 0, currentDb = null, m;
while ((m = re.exec(bind.rest)) !== null) {
if (_inSpans(bind.spans, m.index)) continue;
segments.push({ text: bind.rest.substring(lastEnd, m.index), db: currentDb });
currentDb = (m[1] != null) ? m[1] : ((m[2] != null) ? '' : null);
lastEnd = re.lastIndex;
}
segments.push({ text: bind.rest.substring(lastEnd), db: currentDb });
return { resolved: bind.resolved, segments: segments };
}
// SQL 文字列から CTE / 派生表エイリアス名 (UPPER) を収集 (テーブル誤検出の除外用)。
// 例: WITH SUB AS (...) / , TMP AS (...) — これらは物理テーブルではないので除外する。
function _collectSqlLocalNames(sql) {
var set = {};
var reAs = new RegExp('([A-Za-z_$\\u0080-\\uffff][A-Za-z0-9_$\\u0080-\\uffff]*)\\s+AS\\s*\\(', 'gi');
var m;
while ((m = reAs.exec(sql)) !== null) set[String(m[1]).toUpperCase()] = true;
return set;
}
// SQL 予約語など、 テーブル名として採用しない語。
function _sqlSkipWord(u) {
var skip = { 'DUAL': 1, 'SELECT': 1, 'WHERE': 1, 'AND': 1, 'OR': 1, 'NULL': 1,
'TRUE': 1, 'FALSE': 1, 'TABLE': 1, 'SET': 1, 'VALUES': 1, 'AS': 1, 'BY': 1,
'ON': 1, 'IN': 1, 'EXISTS': 1, 'CASE': 1, 'WHEN': 1, 'THEN': 1, 'END': 1, 'ELSE': 1 };
return !!skip[u];
}
// 修飾付き識別子パターン (schema.table) — 詳細は _qrefPat。
function _qrefPat() {
var seg = '(?:"[^"]+"|`[^`]+`|\\[[^\\]]+\\]|[A-Za-z_$\\u0080-\\uffff][A-Za-z0-9_$\\u0080-\\uffff]*)';
return '(' + seg + '(?:\\s*\\.\\s*' + seg + ')*)';
}
function _dequoteIdent(s) {
s = String(s).replace(/^\s+|\s+$/g, '');
var n = s.length;
if (n >= 2) {
var a = s.charAt(0), b = s.charAt(n - 1);
if ((a === '"' && b === '"') || (a === '`' && b === '`')) return s.substring(1, n - 1);
if (a === '[' && b === ']') return s.substring(1, n - 1);
}
return s;
}
// 修飾付き参照 (schema.table) から実テーブル名 (最終セグメント) を取り出す。
// スキーマ名をテーブル名と誤認しないために必須。
function _tableNameFromRef(ref) {
if (!ref) return '';
var parts = String(ref).split('.');
return _dequoteIdent(parts[parts.length - 1]);
}
// トップレベル (括弧外) カンマで分割 (FROM の カンマ結合解析用)
function _splitTopLevelComma(str) {
var out = [], depth = 0, cur = '', n = str.length;
for (var i = 0; i < n; i++) {
var c = str.charAt(i);
if (c === '(') { depth++; cur += c; }
else if (c === ')') { if (depth > 0) depth--; cur += c; }
else if (c === ',' && depth === 0) { out.push(cur); cur = ''; }
else cur += c;
}
if (cur.length) out.push(cur);
return out;
}
// SQL 文字列からテーブル参照を抽出 (UPPER 名の {read, write})。 全スキャン共通コア。
// ・schema.table / db.schema.table は最終セグメント (実テーブル名) を採用 (スキーマ誤認防止)
// ・FROM のカンマ結合 (FROM a, b, c) を各テーブルとして検出 (旧式結合)
// ・FROM/JOIN 直後の括弧、 CTE / 派生表エイリアス除外、 multibyte・各種クォート対応
function _collectSqlTableNames(sqlText) {
if (!sqlText) return { read: [], write: [] };
var read = {}, write = {};
var s = _stripSqlNoise(sqlText);
var local = _collectSqlLocalNames(s);
var QREF = _qrefPat();
function addName(map, name) {
if (!name) return;
var u = String(name).toUpperCase();
if (_sqlSkipWord(u) || local[u]) return;
map[u] = true;
}
function addRef(map, refStr) { addName(map, _tableNameFromRef(refStr)); }
var m, re;
// FROM 句 (カンマ結合含む): FROM の後を 句境界まで取り出し トップレベルカンマで分割。
var boundary = /^\s*\b(WHERE|GROUP\b|HAVING|ORDER\b|UNION|INTERSECT|MINUS|EXCEPT|CONNECT\b|START\b|FETCH\b|FOR\b|JOIN|INNER\b|LEFT\b|RIGHT\b|FULL\b|CROSS\b|NATURAL\b|OUTER\b)/i;
var qHead = new RegExp('^' + QREF);
var fromKw = /\bFROM\b/gi, fm;
while ((fm = fromKw.exec(s)) !== null) {
var p = fm.index + fm[0].length, depth = 0, buf = '', j = p;
while (j < s.length) {
var ch = s.charAt(j);
if (ch === '(') { depth++; buf += ch; j++; continue; }
if (ch === ')') { if (depth === 0) break; depth--; buf += ch; j++; continue; }
// 句境界キーワード (WHERE/JOIN/ORDER 等) は「単語の先頭」でのみ成立させる。
// s.substr(j,12) は部分文字列の先頭が常に ^\b 扱いになるため、 直前文字が
// 単語文字 (例: TLN_..._ORDER の '_') の場合は途中一致なので境界とみなさない。
// (これを怠ると、 末尾が ORDER/GROUP 等のテーブル名で FROM 句が途中打ち切りになる)
var atWordStart = (j === 0) || !/\w/.test(s.charAt(j - 1));
if (depth === 0 && (ch === ';' || (/[A-Za-z]/.test(ch) && atWordStart && boundary.test(s.substr(j, 12))))) break;
buf += ch; j++;
}
var segs = _splitTopLevelComma(buf);
for (var si = 0; si < segs.length; si++) {
var seg = segs[si].replace(/^\s+/, '');
if (seg.charAt(0) === '(') continue; // サブクエリ (内側 FROM は別途検出)
var tm = seg.match(qHead);
if (tm) addRef(read, tm[1]);
}
}
re = new RegExp('\\bJOIN[\\s(]+' + QREF, 'gi'); while ((m = re.exec(s)) !== null) addRef(read, m[1]);
re = new RegExp('\\bINSERT\\s+INTO\\s+' + QREF, 'gi'); while ((m = re.exec(s)) !== null) addRef(write, m[1]);
re = new RegExp('\\bUPDATE\\s+' + QREF + '\\s+SET\\b', 'gi'); while ((m = re.exec(s)) !== null) addRef(write, m[1]);
re = new RegExp('\\bDELETE\\s+FROM[\\s(]+' + QREF, 'gi'); while ((m = re.exec(s)) !== null) addRef(write, m[1]);
re = new RegExp('\\bMERGE\\s+INTO\\s+' + QREF, 'gi'); while ((m = re.exec(s)) !== null) addRef(write, m[1]);
// REPLACE INTO (MySQL の UPSERT 系 DML = 書き込み) — テスター指摘 No.4。
// ★INTO を必須にする: MySQL 文法上 INTO は省略可だが、 REPLACE は SQL 関数名でもあり
// 「REPLACE <識別子>」 まで許すと REPLACE(col, ...) や英文中の replace を誤検出する。
re = new RegExp('\\bREPLACE\\s+INTO\\s+' + QREF, 'gi'); while ((m = re.exec(s)) !== null) addRef(write, m[1]);
// MERGE の USING 句のソース表 (= 読み取り) — テスター指摘 No.5。
// JOIN ... USING (col) / EXECUTE ... USING 変数 と誤認しないよう、
// MERGE INTO <表> [別名] USING <表> の並びに限定して抽出する。
// USING (SELECT ...) のサブクエリは内側の FROM を既存スキャンが拾うため対象外。
re = new RegExp('\\bMERGE\\s+INTO\\s+' + QREF +
'(?:\\s+(?:AS\\s+)?[A-Za-z_$\\u0080-\\uffff][A-Za-z0-9_$\\u0080-\\uffff]*)?\\s+USING\\s+' + QREF, 'gi');
while ((m = re.exec(s)) !== null) addRef(read, m[2]);
// 動的SQL (EXECUTE IMMEDIATE / PREPARE ... FROM / sp_executesql 等) — テスター指摘 No.6。
// _stripSqlNoise は文字列リテラルを除去するため、 リテラル内に組み立てた SQL は上の
// スキャンでは拾えない。 原文からリテラルを抽出し、 内容が DML 文で「始まる」ものだけを
// SQL とみなして再帰走査する (メッセージ等の「DML 語を含むだけ」の文字列は先頭一致
// しないため対象外)。 'UPDATE ' || 変数 のような動的テーブル名は解決不能 (注記に明記)。
var dmlHead = /^\s*(SELECT|INSERT|UPDATE|DELETE|MERGE|REPLACE|WITH)\b/i;
var lits = _collectSqlLiterals(sqlText);
for (var li = 0; li < lits.length; li++) {
if (!dmlHead.test(lits[li])) continue;
var sub = _collectSqlTableNames(lits[li]);
for (var sr = 0; sr < sub.read.length; sr++) addName(read, sub.read[sr]);
for (var sw = 0; sw < sub.write.length; sw++) addName(write, sub.write[sw]);
}
return { read: Object.keys(read), write: Object.keys(write) };
}
// SQL 文字列からテーブル参照を抽出して readArr / writeArr (UPPER) に push する。
// コード概要チップ等、 出典タグ不要な箇所で _collectSqlTableNames を再利用する。
function _pushSqlTables(sqlText, readArr, writeArr) {
var r = _collectSqlTableNames(sqlText);
for (var i = 0; i < r.read.length; i++) readArr.push(r.read[i]);
for (var w = 0; w < r.write.length; w++) writeArr.push(r.write[w]);
}
// JS コードから SQL を含む文字列リテラルだけを抽出し _pushSqlTables にかける。
// コメント除去 + DML キーワードを含むリテラルのみ対象 (メッセージ/コメント誤検出を防ぐ)。
// JS コード内の文字列リテラルを抽出し、 '+' 演算子で連結されたリテラル列を 1 つに結合して返す。
// TALON の JS は SQL を 'SELECT ...' + ' FROM TBL ' + ' WHERE ...' のように 複数リテラルへ
// 分割して書く。 リテラル単位で DML 判定すると、 テーブル名を含む 'FROM TBL' のリテラルが
// DML キーワードを持たず取りこぼされる (= 参照テーブル検出漏れ)。 連結を復元してから判定する。
// 結合の条件: リテラル間のテキストが「空白 と + のみ」であること (変数や ) ; , が挟まれば分割)。
// 戻り値: [連結後の文字列, ...] (DML 判定は呼び出し側)
function _joinJsSqlLiterals(jsText) {
var out = [];
if (!jsText) return out;
var s = _stripJsComments(jsText);
var litRe = /'((?:\\.|[^'\\])*)'|"((?:\\.|[^"\\])*)"|`((?:\\.|[^`\\])*)`/g;
var gapJoin = /^[\s+]*\+[\s+]*$/; // リテラル間が「+ と空白のみ」= 連結とみなす
var cur = null, prevEnd = -1, lm;
while ((lm = litRe.exec(s)) !== null) {
var content = (lm[1] !== undefined) ? lm[1] : ((lm[2] !== undefined) ? lm[2] : lm[3]);
if (content === undefined || content === null) content = '';
var gap = (prevEnd >= 0) ? s.substring(prevEnd, lm.index) : null;
if (cur !== null && gap !== null && gapJoin.test(gap)) {
cur += content;
} else {
if (cur !== null) out.push(cur);
cur = content;
}
prevEnd = litRe.lastIndex;
}
if (cur !== null) out.push(cur);
return out;
}
function _pushSqlTablesFromJs(jsText, readArr, writeArr) {
if (!jsText) return;
var dmlRe = _dmlKeywordRe();
var groups = _joinJsSqlLiterals(jsText);
for (var gi = 0; gi < groups.length; gi++) {
if (!dmlRe.test(groups[gi])) continue;
_pushSqlTables(groups[gi], readArr, writeArr);
}
}
// ── 共有ヘルパ (重複定義の一元化) ──────────────────────────
// トップレベル var のミュータブル状態は Nashorn の関数スコープで undefined 化する
// ハマりがあるため (=_procSrcCache の教訓)、 定数はすべて関数が返すリテラルにする。
// 「SQL らしさ」判定の DML キーワード (scanJs / _pushSqlTablesFromJs 共通)
function _dmlKeywordRe() {
return /\b(SELECT|INSERT|UPDATE|DELETE|MERGE|REPLACE|WITH)\b/i;
}
// FUNC_SEQ (正規化) → 表示ブロック番号 (SORT+1 — §5.3 の表記規則) のマップを構築。
// _collectProcRefs / renderCodebook / mdSecCodebook 共通。
function _buildSeqBlockMap(ctx) {
var map = {};
if (!ctx || !ctx.sql) return map;
for (var i = 0; i < _scanSizeOf(ctx.sql); i++) {
var r = ctx.sql[i];
var seq = TFC.s(r['FUNC_SEQ']);
if (seq === '' || seq === '-1') continue;
map[String(Number(seq))] = Number(TFC.s(r['SORT'])) + 1;
}
return map;
}
// TLN_M_GENERAL_APP のプロシージャ名系 FUNC_KBN → 設定箇所ラベルキー (TFC.t)。
// キー集合としても使う (_getCalledBlockRefs / _collectProcRefs 共通)。
function _plSqlNameLabelKeys() {
return { PL_SQL_NAME: 'cb.procPlaceConfirmBefore', PL_SQL_NAME_AFTER: 'cb.procPlaceConfirmAfter',
PL_SQL_NAME_DL: 'cb.procPlaceDlBefore', PL_SQL_NAME_AFTER_DL: 'cb.procPlaceDlAfter',
PL_SQL_NAME_SEARCH: 'cb.procPlaceSearchBefore', PL_SQL_NAME_SEARCH_AFTER: 'cb.procPlaceSearchAfter' };
}
// コードブック (HTML / MD) の対象 FUNC_KBN 判定 (JS/CSS コード本体を持つもののみ)。
// 除外: SEND_MAIL.CHR_TEXT (本文) / OTHER_FUNC.CHR_TEXT (処理名) / TITLE_NOTE /
// CHART_SERIES_BASE (系列ラベル) / INIT_VALUE_TEXT 等の非コード CHR_TEXT。
function _isCodebookCodeKbn(fk) {
if (fk === 'JAVA_SCRIPT' || fk === 'JAVA_SCRIPT_ENGINE' ||
fk === 'JAVASCRIPT' || fk === 'JAVASCRIPT_ENGINE' ||
fk === 'FOCUS_OUT_JAVASCRIPT' || fk === 'CSS') return true;
if (fk === 'BUTTON_BAT' || /^BUTTON_BAT_(\d+|CLIENT_JAVASCRIPT)$/.test(fk)) return true;
if (fk === 'BUTTON_AJAX' || /^BUTTON_AJAX_(\d+|CLIENT_JAVASCRIPT)$/.test(fk)) return true;
if (fk === 'BUTTON_NEXT' || /^BUTTON_NEXT_(\d+|CLIENT_JAVASCRIPT)$/.test(fk)) return true;
if (fk === 'BUTTON_REPORT' || fk === 'BUTTON_REPORT_JAVASCRIPT' ||
fk === 'BUTTON_REPORT_JAVASCRIPT_ON_CLICK') return true;
return false;
}
// ストアドプロシージャ本体ソースの取得 (DB 方言別カタログから)。 名前→ソース文字列をキャッシュ。
// パッケージ/スキーマ修飾 (A.B) に備え ドット分割の各セグメントも候補に含める。
// 対応: Oracle (ALL_SOURCE) / PostgreSQL (pg_get_functiondef) /
// MySQL (INFORMATION_SCHEMA.ROUTINES) / SQL Server (sys.sql_modules)。
// db2 / unknown は当面空を返す。
var _procSrcCache = {};
var _procDbTypeCache = null;
// DB 方言の判定。 TFC.detectDbType は検出用に begin()/rollback() を張るため、
// 生成処理中に呼ぶとアクティブなトランザクションを終了させてしまい
// 後続の selectPS が TransactionNotYetBegunException になる。
// ここでは selectPS と同じ _getConn (安全に auto-begin、 rollback しない) で
// 取得した接続の productName から判定する (probe トランザクションを張らない)。
function _procDbType() {
if (_procDbTypeCache) return _procDbTypeCache;
if (_scanDbTypeOverride) { _procDbTypeCache = _scanDbTypeOverride; return _procDbTypeCache; }
var t = 'oracle';
try {
var conn = _getConn(TALON.getDbConfig());
var pn = String(conn.getMetaData().getDatabaseProductName() || '').toLowerCase();
if (pn.indexOf('oracle') >= 0) t = 'oracle';
else if (pn.indexOf('postgresql') >= 0) t = 'postgres';
else if (pn.indexOf('mysql') >= 0 || pn.indexOf('mariadb') >= 0) t = 'mysql';
else if (pn.indexOf('sql server') >= 0) t = 'sqlserver';
else if (pn.indexOf('db2') >= 0) t = 'db2';
else t = 'unknown';
} catch (eD) {
try { TALON.getLogger().writeInfo('[TFC] proc dbType 検出失敗 → oracle: ' + eD); } catch (ig) {}
t = 'oracle';
}
_procDbTypeCache = t;
return t;
}
function _getProcSource(name) {
if (!_procSrcCache) _procSrcCache = {};
var key = TFC.s(name).replace(/^\s+|\s+$/g, '').toUpperCase();
if (!key) return '';
if (key in _procSrcCache) return _procSrcCache[key];
var cands = [key], seen = {};
seen[key] = 1;
if (key.indexOf('.') >= 0) {
var parts = key.split('.');
var last = parts[parts.length - 1], first = parts[0];
if (!seen[last]) { seen[last] = 1; cands.push(last); }
if (!seen[first]) { seen[first] = 1; cands.push(first); }
}
var dbType = _procDbType();
var src = '';
try {
var ph = cands.map(function () { return '?'; }).join(',');
var sql, params;
if (dbType === 'postgres') {
// pg_proc.proname は小文字保存。 候補も小文字化して照合。
// pg_get_functiondef は CREATE FUNCTION/PROCEDURE 全文 (本体含む) を返す。
var candsLower = cands.map(function (c) { return c.toLowerCase(); });
sql = "SELECT pg_get_functiondef(p.oid) AS TEXT FROM pg_proc p " +
"JOIN pg_namespace n ON n.oid = p.pronamespace " +
"WHERE n.nspname NOT IN ('pg_catalog','information_schema') " +
"AND lower(p.proname) IN (" + ph + ")";
params = candsLower;
} else if (dbType === 'mysql') {
sql = "SELECT ROUTINE_DEFINITION AS TEXT FROM INFORMATION_SCHEMA.ROUTINES " +
"WHERE ROUTINE_SCHEMA = DATABASE() AND UPPER(ROUTINE_NAME) IN (" + ph + ")";
params = cands;
} else if (dbType === 'sqlserver') {
sql = "SELECT m.definition AS TEXT FROM sys.sql_modules m " +
"JOIN sys.objects o ON o.object_id = m.object_id " +
"WHERE UPPER(o.name) IN (" + ph + ")";
params = cands;
} else if (dbType === 'oracle') {
sql = "SELECT TEXT FROM ALL_SOURCE WHERE OWNER = SYS_CONTEXT('USERENV','CURRENT_SCHEMA') " +
"AND NAME IN (" + ph + ") AND TYPE IN ('PROCEDURE','FUNCTION','PACKAGE BODY') " +
"ORDER BY NAME, TYPE, LINE";
params = cands;
} else {
// db2 / unknown / cdata: プロシージャ本体取得は未対応
_procSrcCache[key] = '';
return '';
}
var rows = _scanSelect(sql, params);
var buf = [];
for (var i = 0; i < rows.length; i++) buf.push(TFC.s(rows[i]['TEXT']));
// Oracle は ALL_SOURCE 行を行単位で連結 (改行込み)、 他DBは 1 行=全文を改行区切り。
src = buf.join(dbType === 'oracle' ? '' : '\n');
} catch (e) {
try { TALON.getLogger().writeInfo('[TFC] プロシージャソース取得スキップ (' + name + ', db=' + dbType + '): ' + e); } catch (ig) {}
src = '';
}
_procSrcCache[key] = src;
return src;
}
// 機能が参照するストアドプロシージャ名を収集 (テーブル入出力抽出 / コードブックで共用)。
// 格納箇所:
// ・TLN_M_GENERAL_ITEM_OPTN FUNC_KBN='BUTTON_BAT' AND FLAG='0' → CHR1
// ([ブロック]処理呼出 > プロシージャ呼出。 1 ブロックに複数ボタン可 = 複数行を全件収集)
// ・TLN_M_GENERAL_APP FUNC_KBN=PL_SQL_NAME系 → VALUE (確定/明細/検索 の前後)
// 返り値: { procName: { seq: 代表FUNC_SEQ, places: [設定箇所ラベル, ...] } }
// (テスター指摘 No.3: 同名 proc が複数箇所に設定され得るため、 どの設定箇所で
// 呼ばれるかを保持してコードブックに表示する。 ブロック番号は SORT+1 表示規則)
function _collectProcRefs(ctx) {
var procRefs = {};
var seqBlock = _buildSeqBlockMap(ctx); // FUNC_SEQ (正規化) → 表示ブロック番号 (SORT+1)
function placeOf(labelKey, funcSeq) {
var lbl = TFC.t(labelKey, _scanLang);
var seqS = TFC.s(funcSeq);
if (seqS === '-1') return lbl + ' (' + TFC.t('cb.funcLevel', _scanLang) + ')';
var bn = seqBlock[String(Number(seqS))];
return lbl + (bn ? ' (BLOCK ' + bn + ')' : '');
}
function addProc(pn, seq, place) {
if (!pn) return;
if (!(pn in procRefs)) procRefs[pn] = { seq: seq, places: [] };
if (procRefs[pn].places.indexOf(place) < 0) procRefs[pn].places.push(place);
}
if (ctx && ctx.optn) {
for (var pi = 0; pi < _scanSizeOf(ctx.optn); pi++) {
var po = ctx.optn[pi];
if (TFC.s(po['FUNC_KBN']) === 'BUTTON_BAT' && TFC.s(po['FLAG']) === '0') {
var pn = TFC.s(po['CHR1']);
if (pn) addProc(pn, TFC.s(po['FUNC_SEQ']), placeOf('cb.procPlaceBatButton', TFC.s(po['FUNC_SEQ'])));
}
}
}
if (ctx && ctx.app) {
var plKbn = _plSqlNameLabelKeys();
for (var pj = 0; pj < _scanSizeOf(ctx.app); pj++) {
var pa = ctx.app[pj];
var paKbn = TFC.s(pa['FUNC_KBN']);
if (plKbn[paKbn]) {
var pnm = TFC.s(pa['VALUE']);
if (pnm) addProc(pnm, TFC.s(pa['FUNC_SEQ']), placeOf(plKbn[paKbn], TFC.s(pa['FUNC_SEQ'])));
}
}
}
return procRefs;
}
// 他機能呼出 (OTHER_FUNC) の呼出先ブロックが更新するテーブルを DB 横断で取得。
// 呼出先は CHR2=機能ID / NUM1=ブロック FUNC_SEQ で特定 (出典: TALON OtherFuncStruct
// .setFieldValue → CHR2=funcId, NUM1=blockIndex)。 呼出先ブロックの UPDATE_TABLE が
// 呼出元の登録/更新/削除に連動して INSERT/UPDATE/DELETE/MERGE される (manual 5.13.1)。
// 呼出先機能は選択機能集合に含まれないことが多いため、 selectPS で都度引く (キャッシュ)。
// ★No.42: 取り込むのは「連動更新で実際に実行されるもの」だけに限定する
// (出典: TALON 本体 BaseProcess.executeOtherFunc — 呼出先ブロックについて実行されるのは
// 対象行 SELECT / 処理前後 JS (UPDATE_BEFORE・UPDATE_AFTER) / 処理前後プロシージャ
// (PL_SQL_NAME・PL_SQL_NAME_AFTER) / UPDATE_TABLE への DML / 設定値登録 / メール送信):
// ・UPDATE_TABLE (書き) + BODY_SQL/TITLE_SQL (対象行 SELECT の読み)
// ・ブロック処理前後 JS = ITEM_OPTN の JAVA_SCRIPT_ENGINE × UPDATE_BEFORE/UPDATE_AFTER のみ
// ・ブロック処理前後プロシージャ = APP の PL_SQL_NAME / PL_SQL_NAME_AFTER のみ
// 取り込まないもの (ボタン・画面操作起点のため連動更新では実行されない — テスター指摘 No.42):
// 帳票出力の処理後 JS (BUTTON_REPORT) / 項目の JS 呼出ボタン (JAVASCRIPT・JAVASCRIPT_ENGINE) /
// 処理呼出 (BUTTON_BAT) の JavaScript・プロシージャ / 非同期通信 (BUTTON_AJAX) /
// フォーカスアウト JS / 検索前後 JS・プロシージャ / 帳票前後プロシージャ (DL 系)
// ★1 階層のみ: 呼出先ブロックがさらに持つ OTHER_FUNC は辿らない (manual: 他機能呼出は
// 指定ブロックのみ実行)。
// 返り値: { tables: [UPDATE_TABLE...], read: [...], write: [...], title, funcNm }
var _calledBlockCache = {};
var _clobTypeForCalled = null;
function _readClobVal(v) {
if (v == null) return '';
try {
if (!_clobTypeForCalled) _clobTypeForCalled = Java.type('java.sql.Clob');
if (v instanceof _clobTypeForCalled) {
var len = v.length();
return len > 0 ? String(v.getSubString(1, len)) : '';
}
} catch (e) { return ''; }
return String(v);
}
function _getCalledBlockRefs(funcId, funcSeq) {
if (!_calledBlockCache) _calledBlockCache = {};
var key = TFC.s(funcId).toUpperCase() + '#' + TFC.s(funcSeq);
if (key in _calledBlockCache) return _calledBlockCache[key];
var info = { tables: [], read: [], write: [], title: '', funcNm: '' };
var seqWant = String(Number(TFC.s(funcSeq)));
try {
var procNames = {}; // 呼出先ブロックが呼ぶプロシージャ名の集合
var fn = _scanSelect("SELECT FUNC_NM FROM TLN_M_GENERAL_FUNC WHERE FUNC_ID = ?", [TFC.s(funcId)]);
if (fn.length > 0) info.funcNm = TFC.s(fn[0]['FUNC_NM']);
// UPDATE_TABLE (宣言的な更新先 = 書き込み) と 処理前後プロシージャを APP から取得。
// ★No.42: 連動更新で実行されるのは PL_SQL_NAME (処理前) / PL_SQL_NAME_AFTER (処理後)
// のみ。 帳票 (DL 系) / 検索 (SEARCH 系) のプロシージャは実行されないため除外。
// FUNC_SEQ は数値列。 文字列をバインドすると PostgreSQL で型不一致 (integer = text)
// になるため、 FUNC_ID だけで引いて FUNC_SEQ は JS 側で照合する (DB 横断で安全)。
var ap = _scanSelect(
"SELECT FUNC_KBN, FUNC_SEQ, VALUE FROM TLN_M_GENERAL_APP WHERE FUNC_ID = ?",
[TFC.s(funcId)]);
for (var i = 0; i < ap.length; i++) {
if (String(Number(TFC.s(ap[i]['FUNC_SEQ']))) !== seqWant) continue;
var akbn = TFC.s(ap[i]['FUNC_KBN']);
var aval = TFC.s(ap[i]['VALUE']);
if (akbn === 'UPDATE_TABLE') { if (aval) { info.tables.push(aval); info.write.push(aval); } }
else if ((akbn === 'PL_SQL_NAME' || akbn === 'PL_SQL_NAME_AFTER') && aval) procNames[aval] = 1;
}
// BODY_SQL / TITLE_SQL (読み/書き)。 CLOB は getSubString で読出。
var sq = _scanSelect(
"SELECT FUNC_SEQ, TITLE, BODY_SQL, TITLE_SQL FROM TLN_M_GENERAL_FUNC_SQL WHERE FUNC_ID = ?",
[TFC.s(funcId)]);
for (var j = 0; j < sq.length; j++) {
if (String(Number(TFC.s(sq[j]['FUNC_SEQ']))) !== seqWant) continue;
info.title = TFC.s(sq[j]['TITLE']);
_pushSqlTables(_readClobVal(sq[j]['BODY_SQL']), info.read, info.write);
_pushSqlTables(_readClobVal(sq[j]['TITLE_SQL']), info.read, info.write);
}
// CHR_TEXT (JavaScript) — ★No.42: 連動更新で実行されるのは呼出先ブロックの
// 処理前後 JS (JAVA_SCRIPT_ENGINE × UPDATE_BEFORE/UPDATE_AFTER) のみ。
// 帳票出力の処理後 JS / 項目の JS 呼出ボタン / 処理呼出 (BUTTON_BAT) の JS・
// プロシージャ / 非同期通信 / フォーカスアウト / 検索前後 JS 等のボタン・
// 画面操作起点のコードは実行されないため取り込まない。
// (COL_NAME は TALON 標準の UI コンポーネント識別子のため PG でも大文字維持だが、
// 防御的に大文字化して比較する)
var op = _scanSelect(
"SELECT FUNC_SEQ, FUNC_KBN, COL_NAME, CHR_TEXT FROM TLN_M_GENERAL_ITEM_OPTN WHERE FUNC_ID = ?",
[TFC.s(funcId)]);
for (var k = 0; k < op.length; k++) {
if (String(Number(TFC.s(op[k]['FUNC_SEQ']))) !== seqWant) continue;
var okbn = TFC.s(op[k]['FUNC_KBN']);
if (okbn !== 'JAVA_SCRIPT_ENGINE') continue;
var ocol = TFC.s(op[k]['COL_NAME']).toUpperCase();
if (ocol !== 'UPDATE_BEFORE' && ocol !== 'UPDATE_AFTER') continue;
_pushSqlTablesFromJs(_readClobVal(op[k]['CHR_TEXT']), info.read, info.write);
}
// 呼出先ブロックが呼ぶストアドプロシージャの本体も走査 (1 階層)。
var pnames = Object.keys(procNames);
for (var p = 0; p < pnames.length; p++) {
var psrc = _getProcSource(pnames[p]);
if (psrc) _pushSqlTables(psrc, info.read, info.write);
}
} catch (e) {
try { TALON.getLogger().writeInfo('[TFC] 他機能呼出 呼出先ブロック取得スキップ (' + funcId + '#' + funcSeq + '): ' + e); } catch (ig) {}
}
_calledBlockCache[key] = info;
return info;
}
// 備考欄 (TLN_M_GENERAL_FUNC.NOTE = 機能説明タブの備考) から手動依存タグを抽出する。
// スクリプト解析で捕捉できない依存 (プロシージャから呼ぶ別プロシージャ、 JS から呼ぶ
// Java 等) を利用者が明示宣言する仕組み。 タグは 1 タグ 1 テーブルで、 他の文章の中に
// 埋まっていても抽出する:
// [R:TBL] 読み込みのみ
// [W:TBL@2] 書き込みのみ (ACCESS_DB=2 を明示。 @0 = 主 TALON DB の明示)
// [WR:S1.TBL] 読み書き (RW も同義。 スキーマ修飾可)
// @N 省略時の接続先は呼び出し側で 機能レベル ACCESS_DB (アプリケーションタブの
// DB 接続先、 無ければ主 DB) に解決される (= FUNC_SEQ=-1 の参照として扱う)。
// 全角入力 ([WR:TBL@2] 等) は半角へ正規化してからパースする (IME 対策)。
// テーブル名には日本語 (かな / 漢字 / 長音 等) も使える (日本語識別子の DB 対応)。
// 返り値: [{ mode: 'R'|'W'|'WR', table: 'UPPER名', tableRaw: 'UPPER原文名',
// db: '2'|''|null, raw: '[W:TBL@2]' }]
// db: null = 省略 (既定接続先) / '' = @0 (主 DB 明示) / '1'..'15' = ACCESS_DB
// tableRaw: 全角英数字を半角化する前のテーブル名 (★No.130 の原文フォールバック候補)
function _collectNoteDepTags(noteText) {
var out = [];
if (!noteText) return out;
// タグ構文文字 ([]:@) の全角 → 半角は 常に行う (IME 対策)。
var s0 = String(noteText)
.replace(/[/g, '[').replace(/]/g, ']')
.replace(/:/g, ':').replace(/@/g, '@');
// ★全角英数字 → 半角の正規化は 既存互換のため維持する ([WR:TBL_A@2] → [WR:TBL_A@2])。
// 変換対象は 全角英数字・_$#. のみで、 かな / 漢字 / 長音 (ー) / 半角カナ 等の
// 日本語文字は対象外なので、 日本語テーブル名は壊れない。
// ★テスター指摘 No.130: 実テーブル名そのものが全角英数字を含む場合 (例: 受注ヘッダ2)、
// 半角化した名前は DB カタログと一致せず 「DB未検出」 になっていた。 半角化前の名前も
// tableRaw として保持し、 呼び出し側 (scanTableRefs) で照合のフォールバック候補にする。
// 変換は 1 文字 → 1 文字なので s と s0 の文字位置は完全に一致する
// (= マッチ位置 m.index / 長さ m[0].length で s0 側の同じ区間を切り出せる)。
var s = s0.replace(/[A-Za-z0-9_$#.]/g, function (c) {
return String.fromCharCode(c.charCodeAt(0) - 0xFEE0);
});
// テーブル名 1 文字ぶんの文字クラス。 日本語テーブル名を受理するため
// 「使える文字の列挙」 ではなく 「使えない文字の除外」 で定義する
// (_collectSqlTableNames の識別子パターンが非 ASCII を通すのと同じ思想)。
// 除外するもの:
// ・半角: 英数字 _ $ # . 以外すべて (制御文字 / 空白 / カンマ / [ ] : @ /
// ハイフン / 引用符 / % & ( ) 等 — タグ構文文字と SQL 記号を排除)
// ・非 ASCII: 空白・区切り・括弧・引用符の類のみ
// (U+00A0 / 一般句読点 U+2000-206F / 、。〃〄 / 〈〉「」【】〜 等 U+3008-3020 /
// 中黒 ・ / 全角記号 !-/ :-@ [-` {-・)
// → カンマ列挙 ([R:T1,T2] / [R:T1,T2]) と 名前中の空白は 従来どおり不成立。
var TCH = '[^\\x00-\\x22\\x25-\\x2D\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F' +
'\\u00A0\\u2000-\\u206F\\u3000-\\u3004\\u3008-\\u3020\\u30FB' +
'\\uFF01-\\uFF0F\\uFF1A-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65]';
// 先頭文字だけは '.' を許さない (従来どおり [R:.TBL] は不成立)
var re = new RegExp('\\[\\s*(WR|RW|R|W)\\s*:\\s*((?!\\.)' + TCH + TCH + '*)' +
'\\s*(?:@\\s*(\\d{1,2}))?\\s*\\]', 'gi');
var m;
while ((m = re.exec(s)) !== null) {
var mode = m[1].toUpperCase();
if (mode === 'RW') mode = 'WR';
var db = (m[3] === undefined || m[3] === null) ? null : String(Number(m[3]));
if (db === '0') db = ''; // @0 = 主 TALON DB の明示指定
// 原文 (全角英数字を半角化する前) のテーブル名を s0 の同じ位置から切り出す。
// s と s0 は 1 文字 → 1 文字の置換しかしていないため 長さ・位置が完全に一致する。
// タグ内のテーブル名の開始位置は 「':' の後に現れる m[2]」 で特定する。
var tblRaw = m[2];
try {
var colonPos = m[0].indexOf(':');
var tblOff = m[0].indexOf(m[2], colonPos + 1);
if (tblOff >= 0) {
tblRaw = s0.substring(m.index + tblOff, m.index + tblOff + m[2].length);
}
} catch (eRaw) { /* 切り出し失敗時は 正規化名をそのまま原文候補とする */ }
out.push({ mode: mode, table: m[2].toUpperCase(), tableRaw: String(tblRaw).toUpperCase(),
db: db, raw: m[0] });
}
return out;
}
// 備考タグのテーブル名解決 (★テスター指摘 No.130)。
// タグは IME 対策で全角英数字を半角化してからパースするため、 実テーブル名そのものが
// 全角英数字を含む場合 (例: 受注ヘッダ2) は 半角化した名前が DB カタログと一致せず
// 「DB未検出」 (リンク無し) になっていた。
// 照合順: ① 正規化名 (半角化) → ② 原文名。 ① で実在が確認できたときは 従来どおり
// ① を使うので、 既存の出力は一切変わらない。 ② でだけ実在するときに限り カタログの
// 実名 (= 原文側) を採用して、 実在照合・リンク・ER 図の和集合に載せる。
// どちらも実在しない場合も 従来どおり ① (= 「DB未検出」表示は正規化名のまま)。
var _noteTagNameCache = {};
function _resolveNoteTagTableName(norm, raw, accessDb) {
if (!raw || raw === norm) return norm;
var ck = String(accessDb == null ? '' : accessDb) + '|' + norm + '|' + raw;
if (_noteTagNameCache.hasOwnProperty(ck)) return _noteTagNameCache[ck];
var resolved = norm;
var conn = null;
try {
var dbType;
if (accessDb) {
// ★テスター指摘 No.133: 照合は タグが帰属する接続先のカタログだけで行う。
// 接続先が未設定/取得失敗のときに 主 DB で照合すると、 指定先に無いテーブルを
// 主 DB の名前で解決してしまい 帰属と食い違う (= 主 DB へリンクされる) ため、
// 照合そのものを諦めて 正規化名のまま返す (実在照合側も 「DB未検出」 になる)。
try { conn = TALON.getOtherDBConn(String(accessDb)); }
catch (eOc) {
try { TALON.getLogger().writeInfo('[TFC] 備考タグ 照合: getOtherDBConn(' + accessDb +
') 失敗 → 原文フォールバック照合をスキップ: ' + eOc); } catch (ig0) {}
conn = null;
}
if (!conn) {
_noteTagNameCache[ck] = norm;
return norm;
}
}
if (conn) dbType = TFC.detectDbTypeByConn(conn);
// 主 DB は _procDbType (probe トランザクションを張らない安全な判定) を使う
else dbType = _procDbType();
dbType = String(dbType || '').toLowerCase();
if (dbType === 'postgresql') dbType = 'postgres';
if (dbType.indexOf('mysql') === 0) dbType = 'mysql';
if (dbType.indexOf('cdata') === 0) dbType = 'cdata';
if (dbType && dbType !== 'unknown') {
// 指定順 (正規化名 → 原文名) がそのまま優先順位になる
var meta = _fetchErMeta([norm, raw], dbType, false, conn);
if (meta && meta.tables && meta.tables.length > 0) {
resolved = TFC.s(meta.tables[0].name) || norm;
}
}
} catch (eR) {
try { TALON.getLogger().writeWarn('[TFC] 備考タグ テーブル名の原文フォールバック照合をスキップ (' +
norm + ' / ' + raw + '): ' + eR); } catch (ig) {}
resolved = norm;
}
// 外部 DB 接続はプールへ返却 (読み取りのみなので rollback で副作用なし)
if (conn && typeof TalonDbUtil !== 'undefined') {
try { TalonDbUtil.rollback(conn); } catch (eRb) {}
}
_noteTagNameCache[ck] = resolved;
return resolved;
}
// BODY_SQL / TITLE_SQL / CHR_TEXT (JavaScript) / ストアドプロシージャ本体 を走査してテーブル参照を抽出
// 返り値: { read: [{table, src}], write: [{table, src}] }
// src は出典 (例: "BLOCK1.BODY_SQL", "0S100/UPDATE_BEFORE", "プロシージャ XXX" 等)
// src 内で同じ table が read/write 両方に該当する場合は両方に登録
// - 読み込み: FROM <T>, JOIN <T>
// - 書き込み: INSERT INTO <T>, UPDATE <T> SET, DELETE FROM <T>, MERGE INTO <T>
function scanTableRefs(ctx) {
// map 構造: { tableName: { srcs: {src1: true}, seqs: {seq1: true, seq2: true} } }
// seqs は 複数DB接続 (§5.20) の ACCESS_DB 紐付けに使う。 同一テーブルが複数ブロック
// から参照されると 複数 FUNC_SEQ が記録され、 各 FUNC_SEQ の ACCESS_DB 設定で接続先
// を解決する。 同一テーブルが異なる DB 接続から参照されるケースもあり得る (= ER メタ
// 取得は ACCESS_DB ごとに分離して呼び出す)。
var read = {}, write = {};
function pushTbl(map, table, src, funcSeq, jsDbs) {
if (!table) return;
var t = String(table).toUpperCase();
var skip = { 'DUAL': 1, 'SELECT': 1, 'WHERE': 1, 'AND': 1, 'OR': 1, 'NULL': 1,
'TRUE': 1, 'FALSE': 1, 'TABLE': 1, 'SET': 1, 'VALUES': 1, 'AS': 1, 'BY': 1,
'ON': 1, 'IN': 1, 'EXISTS': 1, 'CASE': 1, 'WHEN': 1, 'THEN': 1, 'END': 1, 'ELSE': 1 };
if (skip[t]) return;
if (!map[t]) map[t] = { srcs: {}, seqs: {}, jsDbs: {}, srcInfo: {} };
map[t].srcs[src] = true;
// 出典 (src) 単位の接続情報も保持 (No.27: 依存関係タブで同名テーブルを接続先ごとに
// 別ボックス表示するため、 どの出典がどの接続先へのアクセスかを後で解決できるようにする)
if (!map[t].srcInfo[src]) map[t].srcInfo[src] = { seqs: {}, jsDbs: {} };
if (funcSeq !== undefined && funcSeq !== null && funcSeq !== '') {
map[t].seqs[String(funcSeq)] = true;
map[t].srcInfo[src].seqs[String(funcSeq)] = true;
}
if (jsDbs && jsDbs.length > 0) {
for (var ji = 0; ji < jsDbs.length; ji++) {
map[t].jsDbs[String(jsDbs[ji])] = true;
map[t].srcInfo[src].jsDbs[String(jsDbs[ji])] = true;
}
}
}
// SQL 文字列を走査してテーブル参照を抽出。
// ・コメント / 文字列リテラルは除去済テキストに対して regex を当てる
// ・CTE / 派生表エイリアス (WITH SUB AS (...) 等) は物理テーブルから除外
// ・FROM/JOIN は直後に '(' が来るケース (括弧付き結合) にも対応 ([\s(]+)
function scanSql(text, src, funcSeq, jsDbs) {
if (!text) return;
// 共通コアで {read, write} (UPPER 名) を抽出し、 各テーブルに同一 src を付与。
// (src/funcSeq/jsDbs は 1 つの BODY_SQL に対して定数)
var r = _collectSqlTableNames(text);
for (var i = 0; i < r.read.length; i++) pushTbl(read, r.read[i], src, funcSeq, jsDbs);
for (var w = 0; w < r.write.length; w++) pushTbl(write, r.write[w], src, funcSeq, jsDbs);
}
// JS コード (CHR_TEXT) を走査。 コメントを除去した後、 文字列リテラルのうち
// 「SQL らしい (DML キーワードを含む)」もののみ scanSql に回す。 これにより
// addMsg('...FROM clause.') のようなメッセージ文字列を テーブルと誤検出しない。
function scanJs(text, src, funcSeq, jsDbs) {
if (!text) return;
// '+' で連結された SQL リテラル (例: 'SELECT ...' + ' FROM TBL ' + ' WHERE ...') を
// 1 つに復元してから走査する (リテラル単位だと FROM 句のテーブルを取りこぼすため)。
var dmlRe = _dmlKeywordRe();
var groups = _joinJsSqlLiterals(text);
for (var gi = 0; gi < groups.length; gi++) {
if (!dmlRe.test(groups[gi])) continue;
scanSql(groups[gi], src, funcSeq, jsDbs);
}
}
// BODY_SQL / TITLE_SQL (FUNC_SQL)
for (var i = 0; i < _scanSizeOf(ctx.sql); i++) {
var sq = ctx.sql[i];
var seq = TFC.s(sq['FUNC_SEQ']);
var sortNo = TFC.s(sq['SORT']);
var blockNo = (seq === '-1') ? (_scanLang === 'en' ? 'Whole function' : '機能全体') : ('BLOCK' + (Number(sortNo) + 1));
scanSql(TFC.s(sq['BODY_SQL']), blockNo + '.BODY_SQL', seq, null);
scanSql(TFC.s(sq['TITLE_SQL']), blockNo + '.TITLE_SQL', seq, null);
}
// CHR_TEXT (JavaScript エンジン / 各種コード)
// ★ 5.20.10 対応: JS コード内の DB 接続取得呼び出しを検出して、 後続のテーブル参照を
// 対応する接続先に紐付ける。 区間ベース:
// [先頭] ... [getOtherDBConn('1')] ... [getTalonDbConfig()] ... [末尾]
// 区間 0 (=既定) / 区間 1 (=DB=1) / 区間 2 (=主接続先)
// 各区間を独立にスキャンして 区間内のテーブルに DB タグを付与する。
// (1 ブロックに複数 DB を叩く JS でも 正確に対応関係を捕捉)
// テスター指摘 No.30 の接続先ルール:
// TALON.getOtherDBConn(X) → 複数DB接続先 X ('1'..'15')
// TALON.getTalonDbConfig() → 主接続先 ('')
// TALON.getDbConfig() → 既定 (機能レベルJS=機能設定 DB接続先 /
// ブロックJS=ブロック SELECT式 DB接続先 / 空欄=主)
// = seqs 経由の _resolveAccessDb と同じ解決
// ★分解の実体は _analyzeJsConnSegments (No.43: コメント除去→分割 / No.30 残:
// 変数バインディング解決で「リテラル宣言が接続呼出より前」の書き方に対応)
var dmlReJs = _dmlKeywordRe();
for (var j = 0; j < _scanSizeOf(ctx.optn); j++) {
var o = ctx.optn[j];
var ct = TFC.s(o['CHR_TEXT']);
if (ct.length === 0) continue;
var oSeq = TFC.s(o['FUNC_SEQ']);
var src = TFC.s(o['FUNC_KBN']) + (TFC.s(o['COL_NAME']) ? '/' + TFC.s(o['COL_NAME']) : '') +
' (FUNC_SEQ=' + oSeq + ')';
var jsParts = _analyzeJsConnSegments(ct);
// 変数経由で接続に帰属した SQL。 db=null は「既定接続先」(= jsDbs を付けず seqs 経由で
// 解決)、 db='' は「主接続先 明示」。 明示接続は seqs を記録しない (二重帰属防止)。
for (var rvi = 0; rvi < jsParts.resolved.length; rvi++) {
var rv = jsParts.resolved[rvi];
if (!dmlReJs.test(rv.sql)) continue;
if (rv.db != null) scanSql(rv.sql, src, null, [rv.db]);
else scanSql(rv.sql, src, oSeq, null);
}
// 残テキストの区間分割スキャン (接続呼出の後にリテラルを直接書く書き方)
for (var ci = 0; ci < jsParts.segments.length; ci++) {
var c = jsParts.segments[ci];
if (c.db != null) scanJs(c.text, src, null, [c.db]);
else scanJs(c.text, src, oSeq, null);
}
}
// TALON STD 機能の暗黙の DB 書込み: UPDATE_TABLE (機能ブロックの 更新対象テーブル)。
// TLN_M_GENERAL_APP に FUNC_KBN='UPDATE_TABLE' で更新先テーブルが設定される
// (manual §5.20.8/9 のブロック設定参照)。 SQL テキストには出てこないため scan() では
// 捕捉できず、 ここで明示的に追加。 ACCESS_DB 紐付けにも FUNC_SEQ を持たせる。
if (ctx.app) {
for (var ai = 0; ai < _scanSizeOf(ctx.app); ai++) {
var aRec = ctx.app[ai];
var aKbn = TFC.s(aRec['FUNC_KBN']);
if (aKbn !== 'UPDATE_TABLE') continue;
var aTbl = TFC.s(aRec['VALUE']);
if (!aTbl) continue;
var aSeq = TFC.s(aRec['FUNC_SEQ']);
var aSrc = aKbn + ' (FUNC_SEQ=' + aSeq + ')';
pushTbl(write, aTbl, aSrc, aSeq);
}
}
// ストアドプロシージャ参照: 本体ソースを取得して 読み/書き テーブルを抽出。
// プロシージャ名の格納箇所 (DB設定マスタ準拠):
// ・TLN_M_GENERAL_ITEM_OPTN FUNC_KBN='BUTTON_BAT' AND FLAG='0' → CHR1
// ・TLN_M_GENERAL_APP FUNC_KBN=PL_SQL_NAME系 → VALUE (確定/明細/検索 の前後)
try {
var procRefs = _collectProcRefs(ctx);
var procNames = Object.keys(procRefs);
for (var pk = 0; pk < procNames.length; pk++) {
var pname = procNames[pk];
var psrc = _getProcSource(pname);
if (psrc) scanSql(psrc, 'プロシージャ ' + pname, procRefs[pname].seq, null);
}
} catch (eProc) {
try { TALON.getLogger().writeWarn('[TFC] プロシージャ参照スキャン失敗: ' + eProc); } catch (ig) {}
}
// 他機能呼出 (OTHER_FUNC): 呼出先ブロックが更新するテーブルを 書き込み として追加。
// 呼出元ブロックで登録/更新/削除が実行されると、 呼出先ブロックの UPDATE_TABLE にも
// INSERT/UPDATE/DELETE/MERGE が連動実行される (manual 5.13.1 「他機能を呼び出しDB更新する」)。
// ITEM_OPTN FUNC_KBN='OTHER_FUNC': CHR2=呼出先機能ID, NUM1=呼出先ブロック FUNC_SEQ,
// CHR3/CHR4/CHR5=登録/更新/削除時モード (いずれも未選択なら呼出先は実行されない)。
try {
if (ctx.optn) {
for (var ofi = 0; ofi < _scanSizeOf(ctx.optn); ofi++) {
var ofo = ctx.optn[ofi];
if (TFC.s(ofo['FUNC_KBN']) !== 'OTHER_FUNC') continue;
var ofMode = TFC.s(ofo['CHR3']) || TFC.s(ofo['CHR4']) || TFC.s(ofo['CHR5']);
if (!ofMode) continue; // 登録/更新/削除いずれも未選択 = 呼出先処理なし
var ofFid = TFC.s(ofo['CHR2']);
if (!ofFid) continue;
var ofSeqRaw = TFC.s(ofo['NUM1']);
var ofSeq = (ofSeqRaw === '') ? '0' : String(Number(ofSeqRaw)); // "1.0" → "1"
var srcSeq = TFC.s(ofo['FUNC_SEQ']);
var cb = _getCalledBlockRefs(ofFid, ofSeq);
var ofSrc = '他機能呼出 ' + ofFid + (cb.title ? ' / ' + cb.title : '');
// 呼出先ブロックの UPDATE_TABLE / BODY_SQL / JS で参照するテーブルを
// 呼出元の 書き込み・読み取り として取り込む (1 階層のみ)。
for (var ocw = 0; ocw < cb.write.length; ocw++) pushTbl(write, cb.write[ocw], ofSrc, srcSeq);
for (var ocr = 0; ocr < cb.read.length; ocr++) pushTbl(read, cb.read[ocr], ofSrc, srcSeq);
}
}
} catch (eOf) {
try { TALON.getLogger().writeWarn('[TFC] 他機能呼出 参照スキャン失敗: ' + eOf); } catch (ig) {}
}
// 備考欄の手動依存タグ ([R:TBL] / [W:TBL@2] / [WR:S1.TBL] — _collectNoteDepTags 参照)。
// @N 無し → FUNC_SEQ=-1 として push (= 機能レベル ACCESS_DB → 主 DB の順で解決)
// @N 有り → jsDbs へ明示 DB として push (既定接続先へは紐付けない)
// ★No.130: 実テーブル名が全角英数字を含む場合は 原文の名前でも実在照合する
// (_resolveNoteTagTableName)。 照合先の接続先は @N 明示 → 機能レベル ACCESS_DB →
// 主 DB の順 (= 出典の帰属先と同じ) で、 @N の帰属 (jsDbs) は名前に依らず不変。
try {
var noteTags = _collectNoteDepTags(ctx.func ? TFC.s(ctx.func['NOTE']) : '');
var ntFuncLevelDb = null; // 遅延解決 (フォールバックが必要なタグがある時だけ引く)
for (var nti = 0; nti < noteTags.length; nti++) {
var ntg = noteTags[nti];
var ntSrc = (_scanLang === 'en' ? 'Note tag ' : '備考タグ ') + ntg.raw;
var ntSeq = (ntg.db === null) ? '-1' : null;
var ntDbs = (ntg.db === null) ? null : [ntg.db];
var ntTbl = ntg.table;
if (ntg.tableRaw && ntg.tableRaw !== ntg.table) {
if (ntFuncLevelDb === null) {
ntFuncLevelDb = '';
try { ntFuncLevelDb = _collectAccessDbMap(ctx).funcLevel || ''; } catch (eAd) {}
}
ntTbl = _resolveNoteTagTableName(ntg.table, ntg.tableRaw,
(ntg.db === null) ? ntFuncLevelDb : ntg.db);
}
if (ntg.mode.indexOf('R') >= 0) pushTbl(read, ntTbl, ntSrc, ntSeq, ntDbs);
if (ntg.mode.indexOf('W') >= 0) pushTbl(write, ntTbl, ntSrc, ntSeq, ntDbs);
}
} catch (eNote) {
try { TALON.getLogger().writeWarn('[TFC] 備考タグ 参照スキャン失敗: ' + eNote); } catch (ig) {}
}
function toArr(map) {
var arr = [];
var keys = Object.keys(map);
for (var k = 0; k < keys.length; k++) {
var entry = map[keys[k]];
// srcInfo は {src: {seqs: [...], jsDbs: [...]}} の配列化形式に変換
var srcInfoOut = {};
var siKeys = Object.keys(entry.srcInfo || {});
for (var s2 = 0; s2 < siKeys.length; s2++) {
var si = entry.srcInfo[siKeys[s2]];
srcInfoOut[siKeys[s2]] = {
seqs: Object.keys(si.seqs || {}),
jsDbs: Object.keys(si.jsDbs || {})
};
}
arr.push({
table: keys[k],
srcs: Object.keys(entry.srcs || entry),
seqs: Object.keys(entry.seqs || {}),
jsDbs: Object.keys(entry.jsDbs || {}),
srcInfo: srcInfoOut
});
}
arr.sort(function (a, b) { return a.table < b.table ? -1 : a.table > b.table ? 1 : 0; });
return arr;
}
return { read: toArr(read), write: toArr(write) };
}
// 機能内の ACCESS_DB (複数DB接続) 設定を集約。
// manual §5.20.8 (機能アプリケーションタブ) + §5.20.9 (ブロック SELECT 式タブ)
//
// 優先順位:
// 1. ブロック設定 (FUNC_SEQ=N, N>=0)
// 2. 機能設定 (FUNC_SEQ=-1) ← なければ "" (= 主 TALON DB)
// ※ TLN_M_GENERAL_APP に FUNC_KBN='ACCESS_DB' で VALUE='1'..'15' (talonJdbc.properties
// に登録した接続番号) が格納されている。
//
// 戻り値: { funcLevel: '1'|'', byBlock: { '0': '1', '1': '2', ... } }
function _collectAccessDbMap(ctx) {
var funcLevel = '';
var byBlock = {};
if (!ctx || !ctx.app) return { funcLevel: funcLevel, byBlock: byBlock };
for (var i = 0; i < _scanSizeOf(ctx.app); i++) {
var a = ctx.app[i];
if (TFC.s(a['FUNC_KBN']) !== 'ACCESS_DB') continue;
var seq = TFC.s(a['FUNC_SEQ']);
var val = TFC.s(a['VALUE']);
if (!val) continue;
if (seq === '-1') funcLevel = val;
else byBlock[seq] = val;
}
return { funcLevel: funcLevel, byBlock: byBlock };
}
// 指定 FUNC_SEQ で使われる ACCESS_DB を解決。
// テスター指摘 No.29: 機能レベル (アプリケーションタブ) の DB接続先はブロックへ波及しない。
// ブロック (FUNC_SEQ>=0) の SELECT式 DB接続先が空欄なら 主接続先 ('') にアクセスされる。
// 機能レベル設定が適用されるのは 機能レベル処理 (FUNC_SEQ=-1: 機能レベル JS /
// 備考タグ @N 省略時 等) のみ。
function _resolveAccessDb(accessDbInfo, funcSeq) {
if (!accessDbInfo) return '';
var key = String(funcSeq);
if (key === '-1') return accessDbInfo.funcLevel || '';
if (accessDbInfo.byBlock && accessDbInfo.byBlock.hasOwnProperty(key)) return accessDbInfo.byBlock[key];
return '';
}
TFC.scanConfigure = function (opts) {
opts = opts || {};
_scanSel = opts.select || null;
_scanLang = opts.lang || 'ja';
_scanDbTypeOverride = TFC.s(opts.dbType || '');
_procSrcCache = {};
_procDbTypeCache = null;
_calledBlockCache = {};
_noteTagNameCache = {};
};
// '?' プレースホルダを値リテラルへ展開 (0R100 用 — PS が使えない文脈で TFC.selectU に
// 渡す SQL を作る)。文字列リテラル内の '?' は展開しない。「'」は二重化エスケープ。
// SQL 文字列リテラルのエスケープ (DB 方言対応)。 「'」は SQL 標準どおり二重化。
// ★MySQL はリテラル内で「\」をエスケープ文字として扱う (NO_BACKSLASH_ESCAPES 無効が既定)
// ため、「\」も二重化しないと `'FUNCID_TEST_\'` のように文字列が閉じず SQL 文法エラー
// になる (テスター指摘 No.78 = MySQL 環境で FUNC_ID にバックスラッシュを含む機能を検索)。
// Oracle/PostgreSQL/SQLServer は「\」を通常文字として扱うので二重化してはならない (値が壊れる)。
TFC.sqlLitEscape = function (v, dbType) {
var s = String(v);
if (/mysql/i.test(String(dbType || ''))) s = s.replace(/\\/g, '\\\\');
return s.replace(/'/g, "''");
};
TFC.scanInlineParams = function (sql, params) {
var s = String(sql || '');
var out = '';
var inStr = false;
var pi = 0;
for (var i = 0; i < s.length; i++) {
var c = s.charAt(i);
if (inStr) { out += c; if (c === "'") inStr = false; continue; }
if (c === "'") { out += c; inStr = true; continue; }
if (c === '?') {
var v = (params && pi < params.length) ? params[pi] : null;
pi++;
if (v == null) out += 'NULL';
else if (typeof v === 'number') out += String(v);
else out += "'" + TFC.sqlLitEscape(v, _scanDbTypeOverride) + "'";
continue;
}
out += c;
}
return out;
};
TFC.scanTableRefs = scanTableRefs;
TFC.collectAccessDbMap = _collectAccessDbMap;
TFC.resolveAccessDb = _resolveAccessDb;
TFC.stripJsComments = _stripJsComments;
TFC.getProcSource = _getProcSource;
TFC.collectProcRefs = _collectProcRefs;
TFC.getCalledBlockRefs = _getCalledBlockRefs;
TFC.collectNoteDepTags = _collectNoteDepTags;
TFC.buildSeqBlockMap = _buildSeqBlockMap;
TFC.isCodebookCodeKbn = _isCodebookCodeKbn;
TFC.pushSqlTablesFromJs = _pushSqlTablesFromJs;
TFC.readClobVal = _readClobVal;
// export
global.TFC = TFC;
return TFC;
})(this);
≣ サーバJS ライブラリTLN_FUNC_TEST_JAVA TLN_FUNC_TEST_JAVA 2字
//
≣ サーバJS ライブラリWCRG_COMMON WCRG_共通クラス群 21653字
function createPoolRanking(_CND_DTYEAR, _CND_KBPOOL) {
var sql = "" +
"SELECT " +
" POINT_LIST.DTYEAR " +
", POINT_LIST.KBPOOL " +
", POINT_LIST.IDTEAM " +
", POINT_LIST.TXNAME " +
", SUM(POINT_LIST.POINT_SCORE) AS VLPOINT " +
", SUM(POINT_LIST.SCORE_M - POINT_LIST.SCORE_A) AS VLTOKUSITTEN " +
", SUM(POINT_LIST.VLTRYCNT_M - POINT_LIST.VLTRYCNT_A) AS VLTRYSASU " +
", SUM(POINT_LIST.SCORE_M) AS VLTOKUTEN " +
", SUM(POINT_LIST.VLTRYCNT_M) AS VLTRYSU " +
", WCRG_AT040.VLRANKW " +
", 0 AS VLWINPOINT " +
"FROM ( " +
" SELECT " +
" WCRG_V_LEAGUE_LIST.DTYEAR " +
" , WCRG_V_LEAGUE_LIST.KBPOOL " +
" , WCRG_V_LEAGUE_LIST.IDTEAM1 AS IDTEAM " +
" , WCRG_V_LEAGUE_LIST.TXNAME1 AS TXNAME " +
" , case when WCRG_V_LEAGUE_LIST.POINT_SCORE1 is null then 0 else WCRG_V_LEAGUE_LIST.POINT_SCORE1 end AS POINT_SCORE " +
" , WCRG_V_LEAGUE_LIST.SCORE1 AS SCORE_M " +
" , WCRG_V_LEAGUE_LIST.SCORE2 AS SCORE_A " +
" , WCRG_V_LEAGUE_LIST.VLTRYCNT1 AS VLTRYCNT_M " +
" , WCRG_V_LEAGUE_LIST.VLTRYCNT2 AS VLTRYCNT_A " +
" FROM WCRG_V_LEAGUE_LIST " +
" WHERE WCRG_V_LEAGUE_LIST.DTYEAR = '" + _CND_DTYEAR + "' " +
" AND WCRG_V_LEAGUE_LIST.KBPOOL = '" + _CND_KBPOOL + "' " +
" " +
" UNION ALL " +
" " +
" SELECT " +
" DTYEAR " +
" , KBPOOL " +
" , IDTEAM2 AS IDTEAM " +
" , TXNAME2 AS TXNAME " +
" , case when POINT_SCORE2 is null then 0 else POINT_SCORE2 end AS POINT_SCORE " +
" , WCRG_V_LEAGUE_LIST.SCORE2 AS SCORE_M " +
" , WCRG_V_LEAGUE_LIST.SCORE1 AS SCORE_A " +
" , WCRG_V_LEAGUE_LIST.VLTRYCNT2 AS VLTRYCNT_M " +
" , WCRG_V_LEAGUE_LIST.VLTRYCNT1 AS VLTRYCNT_A " +
" FROM WCRG_V_LEAGUE_LIST " +
" WHERE WCRG_V_LEAGUE_LIST.DTYEAR = '" + _CND_DTYEAR + "' " +
" AND WCRG_V_LEAGUE_LIST.KBPOOL = '" + _CND_KBPOOL + "' " +
") POINT_LIST " +
" " +
"LEFT OUTER JOIN WCRG_AT040 " +
" ON POINT_LIST.DTYEAR = WCRG_AT040.DTYEAR " +
" AND POINT_LIST.IDTEAM = WCRG_AT040.IDTEAM " +
" " +
"GROUP BY " +
" POINT_LIST.DTYEAR " +
", POINT_LIST.KBPOOL " +
", POINT_LIST.IDTEAM " +
", POINT_LIST.TXNAME " +
", WCRG_AT040.VLRANKW " +
" " +
"ORDER BY " +
" POINT_LIST.DTYEAR " +
", POINT_LIST.KBPOOL " +
", SUM(POINT_LIST.POINT_SCORE) DESC " +
", SUM(POINT_LIST.SCORE_M - POINT_LIST.SCORE_A) DESC " +
", SUM(POINT_LIST.VLTRYCNT_M - POINT_LIST.VLTRYCNT_A) DESC " +
", SUM(POINT_LIST.SCORE_M) DESC " +
", SUM(POINT_LIST.VLTRYCNT_M) DESC " +
", WCRG_AT040.VLRANKW " +
" ";
var itemSelectListMain = TalonDbUtil.select( TALON.getDbConfig() , sql );
var itemSelectListSub = itemSelectListMain;
for (var iMain = 0; iMain < itemSelectListMain.length; iMain++) {
var lineDataMapMain = itemSelectListMain[iMain];
var _DTYEAR = lineDataMapMain['DTYEAR'];
var _KBPOOL = lineDataMapMain['KBPOOL'];
var _M_IDTEAM = lineDataMapMain['IDTEAM'];
var _M_TXNAME = lineDataMapMain['TXNAME'];
var _M_VLPOINT = lineDataMapMain['VLPOINT'];
var _M_VLTOKUSITTEN = lineDataMapMain['VLTOKUSITTEN'];
var _M_VLTRYSASU = lineDataMapMain['VLTRYSASU'];
var _M_VLTOKUTEN = lineDataMapMain['VLTOKUTEN'];
var _M_VLTRYSU = lineDataMapMain['VLTRYSU'];
var _M_VLRANKW = lineDataMapMain['VLPOINT'];
var _M_VLWINPOINT = 0;
for (var iSub = 0; iSub < itemSelectListSub.length; iSub++) {
var lineDataMapSub = itemSelectListSub[iMain];
var _S_IDTEAM = lineDataMapSub['IDTEAM'];
var _S_VLPOINT = lineDataMapSub['VLPOINT'];
if (_M_VLPOINT == _S_VLPOINT) {
_M_VLWINPOINT = _M_VLWINPOINT + getWinPoint(_DTYEAR, _KBPOOL, _M_IDTEAM, _S_IDTEAM);
}
}
lineDataMapMain['VLWINPOINT'] = _M_VLWINPOINT;
var sql = "" +
"INSERT INTO WCRG_WK020 ( " +
" DTYEAR " +
" , KBPOOL " +
" , IDTEAM " +
" , TXNAME " +
" , VLPOINT " +
" , VLWINPOINT " +
" , VLTOKUSITTEN " +
" , VLTRYSASU " +
" , VLTOKUTEN " +
" , VLTRYSU " +
" , VLRANKW " +
") VALUES ( " +
" '" + _DTYEAR + "'" +
" , '" + _KBPOOL + "'" +
" , '" + _M_IDTEAM + "'" +
" , '" + _M_TXNAME + "'" +
" , " + _M_VLPOINT + " " +
" , " + _M_VLWINPOINT + " " +
" , " + _M_VLTOKUSITTEN + " " +
" , " + _M_VLTRYSASU + " " +
" , " + _M_VLTOKUTEN + " " +
" , " + _M_VLTRYSU + " " +
" , " + _M_VLRANKW + " " +
") " +
" ";
var insertCount = TalonDbUtil.insert( TALON.getDbConfig() , sql );
}
var sql = "" +
"SELECT " +
" DTYEAR " +
", KBPOOL " +
", IDTEAM " +
", TXNAME " +
", VLPOINT " +
", VLWINPOINT " +
", VLTOKUSITTEN " +
", VLTRYSASU " +
", VLTOKUTEN " +
", VLTRYSU " +
", VLRANKW " +
", VLRANKNUMBER " +
"FROM WCRG_WK020 " +
"ORDER BY " +
" VLPOINT " +
", VLWINPOINT " +
", VLTOKUSITTEN " +
", VLTRYSASU " +
", VLTOKUTEN " +
", VLTRYSU " +
", VLRANKW " +
" ";
for (var iMain = 0; iMain < itemSelectListMain.length; iMain++) {
var lineDataMapMain = itemSelectListMain[iMain];
var _DTYEAR = lineDataMapMain['DTYEAR'];
var _KBPOOL = lineDataMapMain['KBPOOL'];
var _M_IDTEAM = lineDataMapMain['IDTEAM'];
var sql = "" +
"UPDATE WCRG_WK020 SET " +
" VLRANKNUMBER = " + (iMain + 1) + " " +
"WHERE DTYEAR = '" + _DTYEAR + "'" +
" AND KBPOOL = '" + _KBPOOL + "'" +
" AND IDTEAM = '" + _M_IDTEAM + "'" +
" ";
var updateCount = TalonDbUtil.update( TALON.getDbConfig() , sql );
}
}
function getWinPoint(_DTYEAR, _KBPOOL, _M_IDTEAM, _S_IDTEAM) {
var sql = "" +
"SELECT " +
"WINPTN " +
"FROM ( " +
" SELECT " +
" case when ( (case when SCORE1 is null then 0 else SCORE1 end) > (case when SCORE2 is null then 0 else SCORE2 end) ) then 1 else 0 end AS WINPTN " +
" FROM WCRG_V_LEAGUE_LIST " +
" WHERE DTYEAR = '2019' " +
" AND KBPOOL = 'PL-A' " +
" AND IDTEAM1 = 'TM10' " +
" AND IDTEAM2 = 'TM13' " +
" " +
" UNION ALL " +
" " +
" SELECT " +
" case when ( (case when SCORE2 is null then 0 else SCORE2 end) > (case when SCORE1 is null then 0 else SCORE1 end) ) then 1 else 0 end AS WINPTN " +
" FROM WCRG_V_LEAGUE_LIST " +
" WHERE DTYEAR = '2019' " +
" AND KBPOOL = 'PL-A' " +
" AND IDTEAM1 = 'TM13' " +
" AND IDTEAM2 = 'TM10' " +
") MN " +
" ";
var itemSelectListPoint = TalonDbUtil.select( TALON.getDbConfig() , sql );
if (itemSelectListPoint.length == 0 ) {
var _WINPTN = 0;
} else {
var lineDataMapPoint = itemSelectListPoint[0];
var _WINPTN = lineDataMapPoint['WINPTN'];
}
return _WINPTN;
}
// -----------------------------------------------------------------------------
function createTournamentList(_CND_DTYEAR){
//準々決勝:プール戦結果
var sql = "" +
"SELECT " +
" WCRG_AT030.DTYEAR " +
", WCRG_AT030.SQTMATCH " +
", WCRG_AT030.SQTMATCHUP " +
", WCRG_AT030.VLWAKU " +
", WCRG_WK020_1.IDTEAM AS IDTEAM1 " +
", WCRG_WK020_1.TXNAME AS TXNAME1 " +
", WCRG_WK020_2.IDTEAM AS IDTEAM2 " +
", WCRG_WK020_2.TXNAME AS TXNAME2 " +
"FROM WCRG_AT030 " +
"LEFT OUTER JOIN WCRG_WK020 WCRG_WK020_1 " +
" ON WCRG_AT030.DTYEAR = WCRG_WK020_1.DTYEAR " +
" AND WCRG_AT030.KBPOOL1 = WCRG_WK020_1.KBPOOL " +
" AND WCRG_WK020_1.VLRANKNUMBER = 1 " +
"LEFT OUTER JOIN WCRG_WK020 WCRG_WK020_2 " +
" ON WCRG_AT030.DTYEAR = WCRG_WK020_2.DTYEAR " +
" AND WCRG_AT030.KBPOOL2 = WCRG_WK020_2.KBPOOL " +
" AND WCRG_WK020_2.VLRANKNUMBER = 2 " +
"WHERE WCRG_AT030.KBPOOL1 IS NOT NULL "
" AND WCRG_AT030.DTYEAR = '" + _CND_DTYEAR + "' ";
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
for (var i = 0; i < itemSelectList.length; i++) {
var lineDataMap = itemSelectList[i];
insertWCRG_WK030(lineDataMap['DTYEAR'], lineDataMap['SQTMATCH'], lineDataMap['IDTEAM1'], lineDataMap['TXNAME1'], lineDataMap['IDTEAM2'], lineDataMap['TXNAME2']) ;
}
//準決勝:準々決勝結果(勝)
var sql = selectWCRG_WK030(_CND_DTYEAR, 2, 0);
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
for (var i = 0; i < itemSelectList.length; i++) {
var lineDataMap = itemSelectList[i];
insertWCRG_WK030(lineDataMap['DTYEAR'], lineDataMap['SQTMATCH'], lineDataMap['IDTEAM1'], lineDataMap['TXNAME1'], lineDataMap['IDTEAM2'], lineDataMap['TXNAME2']) ;
}
//決勝:準決勝結果(勝)
var sql = selectWCRG_WK030(_CND_DTYEAR, 0, 0);
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
for (var i = 0; i < itemSelectList.length; i++) {
var lineDataMap = itemSelectList[i];
insertWCRG_WK030(lineDataMap['DTYEAR'], lineDataMap['SQTMATCH'], lineDataMap['IDTEAM1'], lineDataMap['TXNAME1'], lineDataMap['IDTEAM2'], lineDataMap['TXNAME2']) ;
}
//3位決定戦:準決勝結果(負)
var sql = selectWCRG_WK030(_CND_DTYEAR, 1, 1);
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
for (var i = 0; i < itemSelectList.length; i++) {
var lineDataMap = itemSelectList[i];
insertWCRG_WK030(lineDataMap['DTYEAR'], lineDataMap['SQTMATCH'], lineDataMap['IDTEAM1'], lineDataMap['TXNAME1'], lineDataMap['IDTEAM2'], lineDataMap['TXNAME2']) ;
}
}
/*
_VLLEVEL 参照する階層
_KBN 0:勝者チーム 1:敗者チーム
*/
function selectWCRG_WK030(_DTYEAR, _VLLEVEL, _KBN) {
var sql = "";
//3位決定戦の場合、決勝の負けを取得
if (_VLLEVEL == 1) {
sql = sql + "" +
"SELECT DTYEAR, SQTMATCH FROM WCRG_AT030 " +
"WHERE WCRG_AT030.DTYEAR = '" + _DTYEAR + "' " +
" AND WCRG_AT030.VLLEVEL= " + _VLLEVEL + " "
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
var lineDataMap = itemSelectList[0];
var _SQTMATCH = lineDataMap['SQTMATCH'];
}
var sql = "";
if (_VLLEVEL == 1) {
sql = sql + "" +
"SELECT " +
" " +
" WCRG_AT030.DTYEAR " +
", '" + _SQTMATCH + "' as SQTMATCH " +
" ";
_VLLEVEL = 0;
} else {
sql = sql + "" +
"SELECT " +
" " +
" WCRG_AT030.DTYEAR " +
", WCRG_AT030.SQTMATCH " +
" ";
}
if (_KBN == 1) {
//3位決定戦 : 敗者を取得
sql = sql + "" +
", CASE " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1>WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.IDTEAM2 " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1<WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.IDTEAM1 " +
" ELSE NULL " +
" END AS IDTEAM1 " +
" " +
", CASE " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1>WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.TXNAME2 " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1<WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.TXNAME1 " +
" ELSE NULL " +
" END AS TXNAME1 " +
" " +
", CASE " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1>WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.IDTEAM2 " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1<WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.IDTEAM1 " +
" ELSE NULL " +
" END AS IDTEAM2 " +
" " +
", CASE " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1>WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.TXNAME2 " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1<WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.TXNAME1 " +
" ELSE NULL " +
" END AS TXNAME2 " +
" ";
} else {
//準決勝・決勝時 : 勝者を取得
sql = sql + "" +
", CASE " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1>WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.IDTEAM1 " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1<WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.IDTEAM2 " +
" ELSE NULL " +
" END AS IDTEAM1 " +
" " +
", CASE " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1>WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.TXNAME1 " +
" WHEN WCRG_AT030_KEKKA1.ALLSCORE1<WCRG_AT030_KEKKA1.ALLSCORE2 THEN WCRG_AT030_KEKKA1.TXNAME2 " +
" ELSE NULL " +
" END AS TXNAME1 " +
" " +
", CASE " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1>WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.IDTEAM1 " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1<WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.IDTEAM2 " +
" ELSE NULL " +
" END AS IDTEAM2 " +
" " +
", CASE " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1>WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.TXNAME1 " +
" WHEN WCRG_AT030_KEKKA2.ALLSCORE1<WCRG_AT030_KEKKA2.ALLSCORE2 THEN WCRG_AT030_KEKKA2.TXNAME2 " +
" ELSE NULL " +
" END AS TXNAME2 " +
" ";
}
sql = sql + "" +
"FROM WCRG_AT030 " +
" " +
"LEFT OUTER JOIN ( " +
" SELECT " +
" " +
" WCRG_AT030.DTYEAR " +
" , WCRG_AT030.SQTMATCH " +
" , WCRG_AT030.VLLEVEL " +
" , WCRG_AT030.VLWAKU " +
" , WCRG_AT030.SQTMATCHUP " +
" " +
" , WCRG_WK030.IDTEAM1 " +
" , WCRG_WK030.TXNAME1 " +
" , case when WCRG_AT032_1.ALLSCORE is null then 0 else WCRG_AT032_1.ALLSCORE end AS ALLSCORE1 " +
" " +
" , WCRG_WK030.IDTEAM2 " +
" , WCRG_WK030.TXNAME2 " +
" , case when WCRG_AT032_2.ALLSCORE is null then 0 else WCRG_AT032_2.ALLSCORE end AS ALLSCORE2 " +
" " +
" FROM WCRG_AT030 " +
" " +
" LEFT OUTER JOIN WCRG_WK030 " +
" ON WCRG_AT030.DTYEAR = WCRG_WK030.DTYEAR " +
" AND WCRG_AT030.SQTMATCH = WCRG_WK030.SQTMATCH " +
" " +
" LEFT OUTER JOIN ( " +
" SELECT " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ,SUM( " +
" ( case when VLTRYCNT is null then 0 else VLTRYCNT end * 5 ) " +
" + " +
" ( case when VLCNVCNT is null then 0 else VLCNVCNT end * 2 ) " +
" + " +
" ( case when VLPENCNT is null then 0 else VLPENCNT end * 3 ) " +
" + " +
" ( case when VLDRPCNT is null then 0 else VLDRPCNT end * 3 ) " +
" ) AS ALLSCORE " +
" FROM WCRG_AT032 " +
" GROUP BY " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ) WCRG_AT032_1 " +
" ON WCRG_WK030.DTYEAR = WCRG_AT032_1.DTYEAR " +
" AND WCRG_WK030.SQTMATCH = WCRG_AT032_1.SQTMATCH " +
" AND WCRG_WK030.IDTEAM1 = WCRG_AT032_1.IDTEAM " +
" " +
" LEFT OUTER JOIN ( " +
" SELECT " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ,SUM( " +
" ( case when VLTRYCNT is null then 0 else VLTRYCNT end * 5 ) " +
" + " +
" ( case when VLCNVCNT is null then 0 else VLCNVCNT end * 2 ) " +
" + " +
" ( case when VLPENCNT is null then 0 else VLPENCNT end * 3 ) " +
" + " +
" ( case when VLDRPCNT is null then 0 else VLDRPCNT end * 3 ) " +
" ) AS ALLSCORE " +
" FROM WCRG_AT032 " +
" GROUP BY " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ) WCRG_AT032_2 " +
" ON WCRG_WK030.DTYEAR = WCRG_AT032_2.DTYEAR " +
" AND WCRG_WK030.SQTMATCH = WCRG_AT032_2.SQTMATCH " +
" AND WCRG_WK030.IDTEAM2 = WCRG_AT032_2.IDTEAM " +
" WHERE WCRG_AT030.VLWAKU = 1 " +
") WCRG_AT030_KEKKA1 " +
" ON WCRG_AT030.DTYEAR = WCRG_AT030_KEKKA1.DTYEAR " +
" AND WCRG_AT030.SQTMATCH = WCRG_AT030_KEKKA1.SQTMATCHUP " +
" " +
"LEFT OUTER JOIN ( " +
" SELECT " +
" " +
" WCRG_AT030.DTYEAR " +
" , WCRG_AT030.SQTMATCH " +
" , WCRG_AT030.VLLEVEL " +
" , WCRG_AT030.VLWAKU " +
" , WCRG_AT030.SQTMATCHUP " +
" " +
" , WCRG_WK030.IDTEAM1 " +
" , WCRG_WK030.TXNAME1 " +
" , WCRG_AT032_1.ALLSCORE AS ALLSCORE1 " +
" " +
" , WCRG_WK030.IDTEAM2 " +
" , WCRG_WK030.TXNAME2 " +
" , WCRG_AT032_2.ALLSCORE AS ALLSCORE2 " +
" " +
" FROM WCRG_AT030 " +
" " +
" LEFT OUTER JOIN WCRG_WK030 " +
" ON WCRG_AT030.DTYEAR = WCRG_WK030.DTYEAR " +
" AND WCRG_AT030.SQTMATCH = WCRG_WK030.SQTMATCH " +
" " +
" LEFT OUTER JOIN ( " +
" SELECT " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ,SUM( " +
" ( case when VLTRYCNT is null then 0 else VLTRYCNT end * 5 ) " +
" + " +
" ( case when VLCNVCNT is null then 0 else VLCNVCNT end * 2 ) " +
" + " +
" ( case when VLPENCNT is null then 0 else VLPENCNT end * 3 ) " +
" + " +
" ( case when VLDRPCNT is null then 0 else VLDRPCNT end * 3 ) " +
" ) AS ALLSCORE " +
" FROM WCRG_AT032 " +
" GROUP BY " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ) WCRG_AT032_1 " +
" ON WCRG_WK030.DTYEAR = WCRG_AT032_1.DTYEAR " +
" AND WCRG_WK030.SQTMATCH = WCRG_AT032_1.SQTMATCH " +
" AND WCRG_WK030.IDTEAM1 = WCRG_AT032_1.IDTEAM " +
" " +
" LEFT OUTER JOIN ( " +
" SELECT " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ,SUM( " +
" ( case when VLTRYCNT is null then 0 else VLTRYCNT end * 5 ) " +
" + " +
" ( case when VLCNVCNT is null then 0 else VLCNVCNT end * 2 ) " +
" + " +
" ( case when VLPENCNT is null then 0 else VLPENCNT end * 3 ) " +
" + " +
" ( case when VLDRPCNT is null then 0 else VLDRPCNT end * 3 ) " +
" ) AS ALLSCORE " +
" FROM WCRG_AT032 " +
" GROUP BY " +
" DTYEAR " +
" ,SQTMATCH " +
" ,IDTEAM " +
" ) WCRG_AT032_2 " +
" ON WCRG_WK030.DTYEAR = WCRG_AT032_2.DTYEAR " +
" AND WCRG_WK030.SQTMATCH = WCRG_AT032_2.SQTMATCH " +
" AND WCRG_WK030.IDTEAM2 = WCRG_AT032_2.IDTEAM " +
" WHERE WCRG_AT030.VLWAKU = 2 " +
") WCRG_AT030_KEKKA2 " +
" ON WCRG_AT030.DTYEAR = WCRG_AT030_KEKKA2.DTYEAR " +
" AND WCRG_AT030.SQTMATCH = WCRG_AT030_KEKKA2.SQTMATCHUP " +
" " +
"WHERE WCRG_AT030.DTYEAR = '" + _DTYEAR + "' " +
" AND WCRG_AT030.VLLEVEL= " + _VLLEVEL + " " +
" ";
return sql;
}
function insertWCRG_WK030(_DTYEAR, _SQTMATCH, _IDTEAM1, _TXNAME1, _IDTEAM2, _TXNAME2 ) {
if (_IDTEAM1 == null) { _IDTEAM1 = ""; }
if (_TXNAME1 == null) { _TXNAME1 = ""; }
if (_IDTEAM2 == null) { _IDTEAM2 = ""; }
if (_TXNAME2 == null) { _TXNAME2 = ""; }
var sql = "" +
"INSERT INTO WCRG_WK030 ( " +
" DTYEAR " +
", SQTMATCH " +
", IDTEAM1 " +
", TXNAME1 " +
", IDTEAM2 " +
", TXNAME2 " +
") VALUES ( " +
" '" + _DTYEAR + "' " +
", '" + _SQTMATCH + "' " +
", '" + _IDTEAM1 + "' " +
", '" + _TXNAME1 + "' " +
", '" + _IDTEAM2 + "' " +
", '" + _TXNAME2 + "' " +
") ";
var insertCount = TalonDbUtil.insert( TALON.getDbConfig() , sql );
}
≣ サーバJS ライブラリWFS_COMMON [共通]ワークフローシステム 59371字
/**
* WFS_COMMON : [共通]ワークフローシステム
*
* 最終更新: WFS_2_0_3
* @version 2025/07/29
*/
//-------------------------------------------
//[共通]部品
//-------------------------------------------
var _USER_ID = '';
var _FUNC_ID = '';
function tln_com_escape(val) {
var toStr = Object.prototype.toString;
var tType = toStr.call( val ).slice(8, -1).toUpperCase();
if (tType == 'STRING' ) {
return val.replace( /'/g , "''" );
} else {
return val;
}
}
function tln_com_nowdate() {
var sysDate = new java.util.Date();
return sysDate;
}
function tln_com_todate(val) {
y = parseInt(val.split("/")[0]) - 1900;
m = parseInt(val.split("/")[1]) - 1;
d = parseInt(val.split("/")[2]);
var sysDate = new java.util.Date(y,m,d);
return sysDate;
}
function tln_com_func_id() {
if (_FUNC_ID == '') {
_FUNC_ID = TALON.getUserInfoMap().get("FUNC_ID");
}
return _FUNC_ID;
}
function tln_com_user_id() {
if (_USER_ID == '') {
var lineDataMap = TALON.getUserInfoMap();
_USER_ID = getMapVal( lineDataMap , 'USER_ID' );
}
return _USER_ID;
}
function tln_com_log(val) {
var log = TALON.getLogger();
log.writeDebug(val);
}
//-------------------------------------------
//[共通]部品0
//-------------------------------------------
function tln_insertByMap(tbl, lst ,name) {
if ( chkLowercase() ) {
TalonDbUtil.insertByMap( TALON.getDbConfig(), tbl.toLowerCase(), lst , name );
} else {
TalonDbUtil.insertByMap( TALON.getDbConfig(), tbl , lst , name );
}
}
function tln_updateByMap(tbl, lst ,name ,where) {
if ( chkLowercase() ) {
TalonDbUtil.updateByMap( TALON.getDbConfig(), tbl.toLowerCase(), lst , name , where);
} else {
TalonDbUtil.updateByMap( TALON.getDbConfig(), tbl , lst , name , where);
}
}
function tln_deleteByMap(tbl, lst ,name) {
if ( chkLowercase() ) {
TalonDbUtil.deleteByMap( TALON.getDbConfig(), tbl.toLowerCase(), lst , name );
} else {
TalonDbUtil.deleteByMap( TALON.getDbConfig(), tbl , lst , name );
}
}
//-------------------------------------------
//[共通]処理0
//-------------------------------------------
function getMapVal(map , id) {
var _rec = null;
_rec = map[id];
if (_rec == null) {
_rec = map[id.toLowerCase()];
}
return _rec;
}
function setMapVal(map , id , val) {
if ( TALON.getDbConfig().isPostgres() ) {
map[ id.toLowerCase() ] = val;
} else {
map[ id ] = val;
}
}
function putBindVal(key , val) {
if ( TALON.getDbConfig().isPostgres() ) {
TALON.putBindValue( key.toLowerCase() , val );
} else {
TALON.putBindValue( key , val );
}
}
function chkLowercase() {
if ( TALON.getDbConfig().isPostgres() ) {
return true;
} else if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE BINARY TABLE_NAME = BINARY 'WFS_M_AUTH' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal( lineDataMap , 'CNT' );
if (_CNT == 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
function editLowList(obj) {
if ( TALON.getDbConfig().isPostgres() ) {
for(var lop = 0; lop < obj.length; lop++) {
obj[lop] = obj[lop].toLowerCase();
}
}
return obj;
}
//-------------------------------------------
//[共通]処理
//-------------------------------------------
//-------------------------------------------
//WFSワークフロー管理マスタ
function selectWFS_M_CONTROL(_WORK_ID) {
var sql =
"SELECT " +
" WORK_ID " +
", WORK_NM " +
", LVL_ROWS " +
", REJECT_KBN " +
", DAIRI_FLG " +
", MAIL_SEND_FLG " +
", CREATED_DATE " +
", CREATED_BY " +
", CREATED_PRG_NM " +
", UPDATED_DATE " +
", UPDATED_BY " +
", UPDATED_PRG_NM " +
", MODIFY_COUNT " +
"FROM WFS_M_CONTROL " +
"WHERE WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'"
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
//WFSワークフロー階層マスタ
function selectWFS_M_LEVEL(_WORK_ID, _LVL, _ROUTE_ID) {
var sql =
"SELECT " +
" WFS_M_LEVEL.WORK_ID " +
", WFS_M_LEVEL.LVL " +
", WFS_M_LEVEL.LVL_NM " +
", CASE WHEN WFS_M_LEVEL.SYONIN_PTN IS NOT NULL THEN WFS_M_LEVEL.SYONIN_PTN ELSE WFS_M_AUTH.SYONIN_PTN END AS SYONIN_PTN " +
", WFS_M_LEVEL.CREATED_DATE " +
", WFS_M_LEVEL.CREATED_BY " +
", WFS_M_LEVEL.CREATED_PRG_NM " +
", WFS_M_LEVEL.UPDATED_DATE " +
", WFS_M_LEVEL.UPDATED_BY " +
", WFS_M_LEVEL.UPDATED_PRG_NM " +
", WFS_M_LEVEL.MODIFY_COUNT " +
"FROM WFS_M_LEVEL " +
"LEFT OUTER JOIN WFS_M_AUTH " +
" ON WFS_M_LEVEL.WORK_ID = WFS_M_AUTH.WORK_ID " +
" AND WFS_M_LEVEL.LVL = WFS_M_AUTH.LVL " +
" AND '" + tln_com_escape( _ROUTE_ID ) + "' = WFS_M_AUTH.ROUTE_ID " +
"WHERE WFS_M_LEVEL.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'" +
" AND WFS_M_LEVEL.LVL = '" + tln_com_escape( _LVL ) + "'"
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
function selectWFS_M_LEVEL_NEXTPRE(_WORK_ID,_ROUTE_ID,_LVL,_FLG) {
//_FLG : 1 = 次のレベル / ELSE = 前のレベル
var wh = '';
if (_FLG == '1') {
wh = " AND WFS_M_LEVEL.LVL > '" + _LVL + "' " +
"ORDER BY WFS_M_LEVEL.LVL ";
} else {
wh = " AND WFS_M_LEVEL.LVL < '" + _LVL + "' " +
"ORDER BY WFS_M_LEVEL.LVL DESC ";
}
var sql =
"SELECT " +
" WFS_M_LEVEL.LVL " +
"FROM WFS_M_LEVEL " +
"INNER JOIN WFS_M_AUTH " +
" ON WFS_M_AUTH.WORK_ID = WFS_M_LEVEL.WORK_ID " +
" AND WFS_M_AUTH.LVL = WFS_M_LEVEL.LVL " +
" AND WFS_M_AUTH.ROUTE_ID = '" + tln_com_escape( _ROUTE_ID ) + "'" +
"WHERE WFS_M_LEVEL.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'" +
wh
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
//WFSワークフローグループ権限割り付けマスタ
function selectWFS_M_AUTH(_WORK_ID,_LVL,_ROUTE_ID) {
var sql =
"SELECT " +
" WORK_ID " +
", LVL " +
", ROUTE_ID " +
", USR_GRP_ID " +
", CREATED_DATE " +
", CREATED_BY " +
", CREATED_PRG_NM " +
", UPDATED_DATE " +
", UPDATED_BY " +
", UPDATED_PRG_NM " +
", MODIFY_COUNT " +
"FROM WFS_M_AUTH " +
"WHERE WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'" +
" AND LVL = '" + tln_com_escape( _LVL ) + "'" +
" AND ROUTE_ID = '" + tln_com_escape( _ROUTE_ID ) + "'"
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
//WFSワークフローグループ権限割り付けマスタ
function selectWFS_M_AUTH_TANTO_CNT(_WORK_ID,_LVL,_ROUTE_ID,_OBJECT_ID) {
//承認者指定を行っている場合はその人数が次階層に移動する基準となる
var sql =
"SELECT " +
" WFS_M_AUTH.WORK_ID " +
",WFS_M_AUTH.LVL " +
",WFS_M_AUTH.ROUTE_ID " +
",WFS_M_AUTH.USR_GRP_ID " +
",CASE WHEN WFS_T_WORKAPPROVALRES_CNT.CNT IS NULL THEN COUNT(*) ELSE WFS_T_WORKAPPROVALRES_CNT.CNT END as TANTO_CNT " +
"FROM WFS_M_AUTH " +
"INNER JOIN WFS_M_USR_GRP_DEPDTL " +
" ON WFS_M_USR_GRP_DEPDTL.USR_GRP_ID = WFS_M_AUTH.USR_GRP_ID " +
"LEFT OUTER JOIN ( " +
" SELECT " +
" WORK_ID " +
" ,OBJECT_ID " +
" ,LVL " +
" ,COUNT(*) AS CNT " +
" FROM WFS_T_WORKAPPROVALRES " +
" GROUP BY " +
" WORK_ID " +
" ,OBJECT_ID " +
" ,LVL " +
" ) WFS_T_WORKAPPROVALRES_CNT " +
" ON WFS_M_AUTH.WORK_ID = WFS_T_WORKAPPROVALRES_CNT.WORK_ID " +
" AND '" + _OBJECT_ID + "' = WFS_T_WORKAPPROVALRES_CNT.OBJECT_ID " +
" AND WFS_M_AUTH.LVL = WFS_T_WORKAPPROVALRES_CNT.LVL " +
"WHERE WFS_M_AUTH.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'" +
" AND WFS_M_AUTH.LVL = '" + tln_com_escape( _LVL ) + "'" +
" AND WFS_M_AUTH.ROUTE_ID = '" + tln_com_escape( _ROUTE_ID ) + "'" +
"GROUP BY " +
" WFS_M_AUTH.WORK_ID " +
",WFS_M_AUTH.LVL " +
",WFS_M_AUTH.ROUTE_ID " +
",WFS_M_AUTH.USR_GRP_ID " +
",WFS_T_WORKAPPROVALRES_CNT.CNT "
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
function selectWFS_T_WORKFLOW(_WORK_ID,_OBJECT_ID,_STEP) {
var sql =
"SELECT " +
" WORK_ID " +
", OBJECT_ID " +
", STEP " +
", OBJECT_NM " +
", ROUTE_ID " +
", USR_ID " +
", STATUS " +
", LVL " +
", APP_MEMO " +
", RES_MEMO " +
", REJECT_KBN " +
", CURENT_FLG " +
", CREATED_DATE " +
", CREATED_BY " +
", CREATED_PRG_NM " +
", UPDATED_DATE " +
", UPDATED_BY " +
", UPDATED_PRG_NM " +
", MODIFY_COUNT " +
"FROM WFS_T_WORKFLOW " +
"WHERE WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'" +
" AND OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "'" +
" AND STEP = '" + tln_com_escape( _STEP ) + "'"
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
if ( TALON.getDbConfig().isPostgres() ) {
var itemColName_WFS_T_WORKFLOW = [
'work_id'
,'object_id'
,'step'
,'object_nm'
,'route_id'
,'usr_id'
,'status'
,'lvl'
,'app_memo'
,'res_memo'
,'curent_flg'
,'active_flg'
,'created_date'
,'created_by'
,'created_prg_nm'
,'updated_date'
,'updated_by'
,'updated_prg_nm'
,'modify_count'
];
} else {
var itemColName_WFS_T_WORKFLOW = [
'WORK_ID'
,'OBJECT_ID'
,'STEP'
,'OBJECT_NM'
,'ROUTE_ID'
,'USR_ID'
,'STATUS'
,'LVL'
,'APP_MEMO'
,'RES_MEMO'
,'CURENT_FLG'
,'ACTIVE_FLG'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
}
//-------------------------------------------
function insertWFS_T_WORKFLOW(itemDataList) {
setMapVal( itemDataList , 'CREATED_DATE' , tln_com_nowdate() );
setMapVal( itemDataList , 'CREATED_BY' , tln_com_user_id() );
setMapVal( itemDataList , 'CREATED_PRG_NM' , tln_com_func_id() );
setMapVal( itemDataList , 'UPDATED_DATE' , tln_com_nowdate() );
setMapVal( itemDataList , 'UPDATED_BY' , tln_com_user_id() );
setMapVal( itemDataList , 'UPDATED_PRG_NM' , tln_com_func_id() );
setMapVal( itemDataList , 'MODIFY_COUNT' , 1 );
setMapVal( itemDataList , 'ACTIVE_FLG' , '1' );
tln_insertByMap( 'WFS_T_WORKFLOW', itemDataList , itemColName_WFS_T_WORKFLOW );
}
//-------------------------------------------
function updateWFS_T_WORKFLOW(itemDataList) {
setMapVal( itemDataList , 'UPDATED_DATE' , tln_com_nowdate() );
setMapVal( itemDataList , 'UPDATED_BY' , tln_com_user_id() );
setMapVal( itemDataList , 'UPDATED_PRG_NM' , tln_com_func_id() );
setMapVal( itemDataList , 'MODIFY_COUNT' , 1 );
if ( TALON.getDbConfig().isPostgres() ) {
var whereTbl1 = [ null, '=' , 'work_id' ];
var whereTbl2 = [ null, '=' , 'object_id' ];
var whereTbl3 = [ null, '=' , 'step' ];
} else {
var whereTbl1 = [ null, '=' , 'WORK_ID' ];
var whereTbl2 = [ null, '=' , 'OBJECT_ID' ];
var whereTbl3 = [ null, '=' , 'STEP' ];
}
var whereList = new Array();
whereList.push(whereTbl1);
whereList.push(whereTbl2);
whereList.push(whereTbl3);
tln_updateByMap( 'WFS_T_WORKFLOW', itemDataList , itemColName_WFS_T_WORKFLOW , whereList );
}
//-------------------------------------------
function updateWFS_T_WORKFLOW_CURENT_FLG(_WORK_ID, _OBJECT_ID) {
TalonDbUtil.update( TALON.getDbConfig(), "update WFS_T_WORKFLOW set CURENT_FLG = '0' where WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' and OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "'" );
}
//-------------------------------------------
function updateWFS_T_WORKFLOW_ACTIVE_FLG(_WORK_ID, _OBJECT_ID, _TRG_LVL) {
TalonDbUtil.update( TALON.getDbConfig(),
"update WFS_T_WORKFLOW set ACTIVE_FLG = '0' " +
"where WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' " +
" and OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "'" +
" and LVL >= " + tln_com_escape( _TRG_LVL ) + ""
);
}
//-------------------------------------------
function selectWFS_T_WORKFLOW_CURENT_DATA(_WORK_ID,_OBJECT_ID) {
//承認者も取得する(連続承認者の時の承認省略に使用→and承認の場合は発動しない為MAXで取得)
var sql =
"SELECT " +
" COUNT(*) AS CURENT_DATA_CNT " +
" ,MAX(SHONIN_ID) AS SHONIN_ID " +
"FROM WFS_T_WORKFLOW " +
"WHERE WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'" +
" AND OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "'" +
" AND CURENT_FLG = '1'"
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
function selectWFS_T_WORKFLOW_CURENT_MY_DATA(_WORK_ID,_OBJECT_ID,_EXEC_BY) {
var sql =
"SELECT " +
" COUNT(*) AS MY_DATA_CNT " +
"FROM WFS_T_WORKFLOW " +
"WHERE WORK_ID = '" + tln_com_escape( _WORK_ID ) + "'" +
" AND OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "'" +
" AND SHONIN_ID = '" + tln_com_escape( _EXEC_BY ) + "'" +
" AND CURENT_FLG = '1'" +
" AND STATUS <> '4'"
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
//取戻時、対象のレベルを取得
function selectWFS_T_WORKFLOW_MY_LVL_BACK(_WORK_ID,_ROUTE_ID,_NOW_LVL,_SHONIN_ID) {
var sql =
"SELECT " +
" WFS_M_AUTH.WORK_ID " +
" ,WFS_M_AUTH.ROUTE_ID " +
" ,MAX(WFS_M_AUTH.LVL) AS LVL " +
"FROM WFS_M_AUTH " +
"INNER JOIN WFS_M_USR_GRP_DEPDTL " +
" ON WFS_M_AUTH.USR_GRP_ID = WFS_M_USR_GRP_DEPDTL.USR_GRP_ID " +
" AND ( " +
" WFS_M_USR_GRP_DEPDTL.USR_ID = '" + tln_com_escape( _SHONIN_ID ) + "' " +
" OR " +
" 1 = (SELECT CASE WHEN ADMIN_USER_ID IS NULL THEN 0 ELSE 1 END FROM WFS_M_USR_ADMIN WHERE ADMIN_USER_ID = '" + tln_com_escape( _SHONIN_ID ) + "' ) " +
" ) " +
"WHERE WFS_M_AUTH.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' " +
" AND WFS_M_AUTH.ROUTE_ID = '" + tln_com_escape( _ROUTE_ID ) + "' " +
" AND WFS_M_AUTH.LVL <= " + tln_com_escape( _NOW_LVL ) + " -1 " +
"GROUP BY " +
" WFS_M_AUTH.WORK_ID " +
" ,WFS_M_AUTH.ROUTE_ID "
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//引上げ時、対象のレベルを取得
function selectWFS_T_WORKFLOW_MY_LVL_PLUP(_WORK_ID,_ROUTE_ID,_NOW_LVL,_SHONIN_ID) {
var sql =
"SELECT " +
" WFS_M_AUTH.WORK_ID " +
" ,WFS_M_AUTH.ROUTE_ID " +
" ,MIN(WFS_M_AUTH.LVL) AS LVL " +
"FROM WFS_M_AUTH " +
"INNER JOIN WFS_M_USR_GRP_DEPDTL " +
" ON WFS_M_AUTH.USR_GRP_ID = WFS_M_USR_GRP_DEPDTL.USR_GRP_ID " +
" AND ( " +
" WFS_M_USR_GRP_DEPDTL.USR_ID = '" + tln_com_escape( _SHONIN_ID ) + "' " +
" OR " +
" 1 = (SELECT CASE WHEN ADMIN_USER_ID IS NULL THEN 0 ELSE 1 END FROM WFS_M_USR_ADMIN WHERE ADMIN_USER_ID = '" + tln_com_escape( _SHONIN_ID ) + "' ) " +
" ) " +
"WHERE WFS_M_AUTH.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' " +
" AND WFS_M_AUTH.ROUTE_ID = '" + tln_com_escape( _ROUTE_ID ) + "' " +
" AND WFS_M_AUTH.LVL > " + tln_com_escape( _NOW_LVL ) + " " +
"GROUP BY " +
" WFS_M_AUTH.WORK_ID " +
" ,WFS_M_AUTH.ROUTE_ID "
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
//-------------------------------------------
//承認者連続時省略フラグ制御用、同一ルートで承認者が承認可能なリスト
function selectWFS_T_WORKFLOW_APPROVAL(_WORK_ID,_ROUTE_ID,_LVL,_SHONIN_ID, _OBJECT_ID, _LOGIN_USER_ID) {
//承認者も取得する(連続承認者の時の承認省略に使用→and承認の場合は発動しない為MAXで取得)
var sql =
"SELECT " +
" WFS_M_CONTROL.WORK_ID " +
" ,WFS_M_CONTROL.WORK_NM " +
" ,WFS_M_AUTH.ROUTE_ID " +
" ,WFS_M_AUTH.LVL " +
" ,WFS_M_USR_GRP_DEPDTL.USR_GRP_ID " +
" ,WFS_M_USR_GRP_DEPDTL.USR_ID " +
" ,CASE WHEN WFS_M_LEVEL.SYONIN_PTN IS NOT NULL THEN WFS_M_LEVEL.SYONIN_PTN ELSE WFS_M_AUTH.SYONIN_PTN END AS SYONIN_PTN " +
"FROM WFS_M_CONTROL " +
"INNER JOIN WFS_M_AUTH " +
" ON WFS_M_CONTROL.WORK_ID = WFS_M_AUTH.WORK_ID " +
" AND '" + _ROUTE_ID + "' = WFS_M_AUTH.ROUTE_ID " +
" AND " + _LVL + " <= WFS_M_AUTH.LVL " +
"INNER JOIN WFS_M_USR_GRP_DEPDTL " +
" ON WFS_M_AUTH.USR_GRP_ID = WFS_M_USR_GRP_DEPDTL.USR_GRP_ID " +
" AND '" + _SHONIN_ID + "' = WFS_M_USR_GRP_DEPDTL.USR_ID " +
"LEFT OUTER JOIN WFS_M_LEVEL " +
" ON WFS_M_AUTH.WORK_ID = WFS_M_LEVEL.WORK_ID " +
" AND WFS_M_AUTH.LVL = WFS_M_LEVEL.LVL " +
" " +
"LEFT OUTER JOIN ( " +
" SELECT " +
" WORK_ID " +
" ,OBJECT_ID " +
" ,LVL " +
" ,COUNT(*) AS CNT " +
" FROM WFS_T_WORKAPPROVALRES " +
" GROUP BY " +
" WORK_ID " +
" ,OBJECT_ID " +
" ,LVL " +
") WFS_T_WORKAPPROVALRES_CNT " +
" ON WFS_M_AUTH.WORK_ID = WFS_T_WORKAPPROVALRES_CNT.WORK_ID " +
" AND '" + _OBJECT_ID + "' = WFS_T_WORKAPPROVALRES_CNT.OBJECT_ID " +
" AND WFS_M_AUTH.LVL = WFS_T_WORKAPPROVALRES_CNT.LVL " +
" " +
"LEFT OUTER JOIN WFS_T_WORKAPPROVALRES " +
" ON WFS_M_AUTH.WORK_ID = WFS_T_WORKAPPROVALRES.WORK_ID " +
" AND '" + _OBJECT_ID + "' = WFS_T_WORKAPPROVALRES.OBJECT_ID " +
" AND WFS_M_AUTH.LVL = WFS_T_WORKAPPROVALRES.LVL " +
" AND WFS_M_USR_GRP_DEPDTL.USR_ID = WFS_T_WORKAPPROVALRES.USR_ID " +
" AND ( " +
" WFS_T_WORKAPPROVALRES.USR_ID = '" + tln_com_escape( _LOGIN_USER_ID ) + "' " +
" OR " +
" WFS_T_WORKAPPROVALRES.USR_ID IN (SELECT USR_ID FROM WFS_M_USR_DAIRI WHERE DAIRI_USR_ID = '" + tln_com_escape( _LOGIN_USER_ID ) + "' AND YUKO_KBN = '1' AND SHONIN_FLG = '1') " +
" ) " +
" " +
"WHERE WFS_M_CONTROL.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' " +
" AND WFS_M_CONTROL.APPROVAL_FLG = '1' " +
" AND ( " +
" WFS_T_WORKAPPROVALRES_CNT.CNT IS NULL " +
" OR " +
" WFS_T_WORKAPPROVALRES_CNT.CNT = 0 " +
" OR " +
" ( " +
" WFS_T_WORKAPPROVALRES_CNT.CNT IS NOT NULL " +
" AND " +
" WFS_T_WORKAPPROVALRES.WORK_ID IS NOT NULL " +
" ) " +
" ) " +
"ORDER BY LVL "
;
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), sql);
return itemSelectList;
}
function updateWFS_T_WORKFLOW_STATUS(_WORK_ID, _OBJECT_ID, _STATUS, _STEP, _RES_MEMO, _SHONIN_ID) {
TalonDbUtil.update( TALON.getDbConfig(),
"update WFS_T_WORKFLOW set " +
" STATUS = '" + tln_com_escape( _STATUS ) + "' " +
" ,RES_MEMO = '" + tln_com_escape( _RES_MEMO ) + "' " +
" ,SHONIN_ID = '" + tln_com_escape( _SHONIN_ID ) + "' " +
"where WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' " +
" and OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "' " +
" and STEP = '" + tln_com_escape( _STEP ) + "' "
);
}
function execWorkFlow() {
//入力値取得
var itemBlockListHed = TALON.getBlockData_List(1);
var lineDataMap = itemBlockListHed[0];
return execWorkFlowMain(lineDataMap);
}
var _WFS_SYORI_KBN_SHINSEI = '10'; //申請
var _WFS_SYORI_KBN_SHONIN = '20'; //承認(次階層あり)
var _WFS_SYORI_KBN_KESSAI = '21'; //承認(次階層なし=決裁)
var _WFS_SYORI_KBN_SASHIMODOSHI = '30'; //差戻
var _WFS_SYORI_KBN_HININ = '90'; //否認
var _WFS_SYORI_KBN_TORIMODOSHIS = '50'; //取戻(申請者取戻)
var _WFS_SYORI_KBN_TORIKESHI = '60'; //取消
var _WFS_SYORI_KBN_TORIMODOSHIS = '70'; //取戻(承認者取戻)
var _WFS_SYORI_KBN_HIKIAGE = '80'; //引上
function execWorkFlowMain(lineDataMap) {
//入力値取得
//var itemBlockListHed = TALON.getBlockData_List(1);
//var lineDataMap = itemBlockListHed[0];
var lineUserDataMap = TALON.getUserInfoMap();
var _LOGIN_USER_ID = getMapVal( lineUserDataMap , 'USER_ID' );
//承認結果が申請の場合
if (getMapVal( lineDataMap , 'STATUS' ) == '1') {
//階層テーブルにて次のレベルが存在するかチェック
var itemSelectList = selectWFS_M_LEVEL_NEXTPRE( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'ROUTE_ID' ), getMapVal( lineDataMap , 'LVL' ), '1');
if (itemSelectList.length > 0) {
var lineSelectDataMap = itemSelectList[0];
var _NX_LVL = getMapVal( lineSelectDataMap , 'LVL' );
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ));
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID' ) );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM' ) );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , _NX_LVL );
setMapVal( itemDataList , 'APP_MEMO' , getMapVal( lineDataMap , 'APP_MEMO' ) );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_SHINSEI);
}
}
//承認結果が取戻の場合(申請者が取り戻す)
if ( getMapVal( lineDataMap , 'STATUS' ) == '5' ) {
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ) );
//申請者に戻すのでLVLが1以上のデータのACTIVE_FLGをゼロに更新(18/08/07)
updateWFS_T_WORKFLOW_ACTIVE_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID'), 1 );
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID' ) );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM' ) );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , 1 );
setMapVal( itemDataList , 'APP_MEMO' , '' );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_TORIMODOSHIS);
}
//承認結果が取戻の場合(承認者が取り戻す)
if ( getMapVal( lineDataMap , 'STATUS' ) == '7' ) {
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ) );
////取戻時、対象のレベルを取得
var itemSelectList = selectWFS_T_WORKFLOW_MY_LVL_BACK( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'ROUTE_ID' ), getMapVal( lineDataMap , 'LVL' ), tln_com_user_id() );
var lineSelectDataMap = itemSelectList[0];
var _MY_LVL = getMapVal( lineSelectDataMap , 'LVL' );
//指定したレベルまで戻すのでLVLがその値以上のデータのACTIVE_FLGをゼロに更新(18/08/07)
updateWFS_T_WORKFLOW_ACTIVE_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID'), _MY_LVL );
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID' ) );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM' ) );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , _MY_LVL );
setMapVal( itemDataList , 'APP_MEMO' , '' );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_TORIMODOSHIS);
}
//承認結果が引上げの場合(承認者が引き上げる)
if ( getMapVal( lineDataMap , 'STATUS' ) == '8' ) {
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ) );
////引上時、対象のレベルを取得
var itemSelectList = selectWFS_T_WORKFLOW_MY_LVL_PLUP( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'ROUTE_ID' ), getMapVal( lineDataMap , 'LVL' ), tln_com_user_id() );
var lineSelectDataMap = itemSelectList[0];
var _MY_LVL = getMapVal( lineSelectDataMap , 'LVL' );
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID' ) );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM' ) );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , _MY_LVL );
setMapVal( itemDataList , 'APP_MEMO' , '' );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_HIKIAGE);
}
//承認、差戻、否認の処理で対象階層がAND承認の場合、すでに同一承認者で処理されていればエラーとする。
if (
( getMapVal( lineDataMap , 'STATUS' ) == '2') ||
( getMapVal( lineDataMap , 'STATUS' ) == '3') ||
( getMapVal( lineDataMap , 'STATUS' ) == '9')
) {
var itemSelectList = selectWFS_M_LEVEL( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'LVL' ), getMapVal( lineDataMap , 'ROUTE_ID' ) );
var lineSelectDataMap = itemSelectList[0];
var _SYONIN_PTN = getMapVal( lineSelectDataMap , 'SYONIN_PTN' );
if (_SYONIN_PTN == '2') {
//同一ユーザーで既に当サイクルで承認されている場合はエラーとする
//→同一ユーザーを同一承認者ID(SHONIN_ID)で判断するようにする
var itemSelectList = selectWFS_T_WORKFLOW_CURENT_MY_DATA( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ), getMapVal( lineDataMap , 'SHONIN_ID' ) );
var lineSelectDataMap = itemSelectList[0];
var _MY_DATA_CNT = getMapVal( lineSelectDataMap , 'MY_DATA_CNT' );
//ここまでの処理で1件は登録されている為
if ( _MY_DATA_CNT != 1 ) {
TALON.addErrorMsg( "既に指定された承認者で「承認/差戻/否認」処理が実施されている為、実行する事は出来ません。" );
TALON.setIsSuccess(false);
return false;
}
}
}
//承認結果が承認の場合
if ( getMapVal( lineDataMap , 'STATUS' ) == '2') {
var next_flg = '0';
var itemSelectList = selectWFS_M_LEVEL( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'LVL' ), getMapVal( lineDataMap , 'ROUTE_ID' ) );
var lineSelectDataMap = itemSelectList[0];
var _SYONIN_PTN = getMapVal( lineSelectDataMap , 'SYONIN_PTN' );
var itemSelectList = selectWFS_T_WORKFLOW_CURENT_DATA( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ) );
var lineSelectDataMap = itemSelectList[0];
var _CURENT_DATA_CNT = getMapVal( lineSelectDataMap , 'CURENT_DATA_CNT' );
var _SHONIN_ID = getMapVal( lineSelectDataMap , 'SHONIN_ID' );
var itemSelectList = selectWFS_M_AUTH_TANTO_CNT( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'LVL' ), getMapVal( lineDataMap , 'ROUTE_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ) );
var lineSelectDataMap = itemSelectList[0];
var _TANTO_CNT = getMapVal( lineSelectDataMap , 'TANTO_CNT' );
if (_SYONIN_PTN == '1') {
next_flg = '1';
}
if (_SYONIN_PTN == '2') {
// * 上位でチェックするのでここでは実施しない
// * -------------------------------------------
// * //同一ユーザーで既に当サイクルで承認されている場合はエラーとする →同一ユーザーを同一承認者ID(SHONIN_ID)で判断するようにする
// * var lineUserDataMap = TALON.getUserInfoMap();
// * var _LOGIN_USER_ID = getMapVal( lineUserDataMap , 'USER_ID' );
// *
// * //var itemSelectList = selectWFS_T_WORKFLOW_CURENT_MY_DATA( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ), _LOGIN_USER_ID );
// * var itemSelectList = selectWFS_T_WORKFLOW_CURENT_MY_DATA( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ), getMapVal( lineDataMap , 'SHONIN_ID' ) );
// * var lineSelectDataMap = itemSelectList[0];
// * var _MY_DATA_CNT = getMapVal( lineSelectDataMap , 'MY_DATA_CNT' );
// *
// * //ここまでの処理で1件は登録されている為
// * if ( _MY_DATA_CNT != 1 ) {
// * TALON.addErrorMsg( "既に指定された承認者で「承認」処理が実施されている為、実行する事は出来ません。" );
// * TALON.setIsSuccess(false);
// *
// * return false;
// * }
if (_CURENT_DATA_CNT >= _TANTO_CNT) {
next_flg = '1';
}
}
if (next_flg == '1') {
//階層テーブルにて次のレベルが存在するかチェック
var itemSelectList = selectWFS_M_LEVEL_NEXTPRE( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'ROUTE_ID' ), getMapVal( lineDataMap , 'LVL' ), '1');
if (itemSelectList.length > 0) {
var lineSelectDataMap = itemSelectList[0];
var _NX_LVL = getMapVal( lineSelectDataMap , 'LVL' );
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ) );
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID' ) );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM' ) );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , _NX_LVL );
setMapVal( itemDataList , 'APP_MEMO' , getMapVal( lineDataMap , 'APP_MEMO' ) );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
//----------------------------------------------------------
// 以降の階層で今回の承認者が実施可能な階層を抽出
// OR承認の場合に発動
var _T_WORK_ID = getMapVal( lineDataMap , 'WORK_ID' );
var _T_OBJECT_ID = getMapVal( lineDataMap , 'OBJECT_ID' );
var _T_OBJECT_NM = getMapVal( lineDataMap , 'OBJECT_NM' );
var _T_ROUTE_ID = getMapVal( lineDataMap , 'ROUTE_ID' );
var _T_USR_ID = getMapVal( lineDataMap , 'USR_ID' );
var _T_APP_MEMO = getMapVal( lineDataMap , 'APP_MEMO' );
var _T_RES_MEMO = getMapVal( lineDataMap , 'RES_MEMO' );
var _T_STEP = parseInt( getMapVal( lineDataMap , 'STEP' ) + 1);
var _T_LVL = parseInt(_NX_LVL);
if (_SYONIN_PTN == '1') {
var itemSelectListApproval = selectWFS_T_WORKFLOW_APPROVAL( _T_WORK_ID, _T_ROUTE_ID, _NX_LVL, _SHONIN_ID, _T_OBJECT_ID, _LOGIN_USER_ID);
for (var i = 0; i < itemSelectListApproval.length; i++) {
var lineDataMap = itemSelectListApproval[i];
var _NOW_SYONIN_PTN = getMapVal( lineDataMap , 'SYONIN_PTN' );
if ( _T_LVL == parseInt( getMapVal( lineDataMap , 'LVL' ) ) && (_NOW_SYONIN_PTN == '1') ) {
//承認待ち階層にも承認者の権限あり
//上位で作成した承認待ちデータを承認済みに更新
//以下を更新
// ステータス=2承認
// 理由=入力値
// 承認者
updateWFS_T_WORKFLOW_STATUS( _T_WORK_ID, _T_OBJECT_ID, '2', _T_STEP , _T_RES_MEMO , _SHONIN_ID);
//階層テーブルにて次のレベルが存在するかチェック
var itemSelectList = selectWFS_M_LEVEL_NEXTPRE( _T_WORK_ID, _T_ROUTE_ID, _T_LVL, '1');
if (itemSelectList.length > 0) {
var lineSelectDataMap = itemSelectList[0];
var _NX_LVL = getMapVal( lineSelectDataMap , 'LVL' );
_T_STEP++;
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( _T_WORK_ID, _T_OBJECT_ID );
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , _T_WORK_ID );
setMapVal( itemDataList , 'OBJECT_ID' , _T_OBJECT_ID );
setMapVal( itemDataList , 'STEP' , _T_STEP );
setMapVal( itemDataList , 'OBJECT_NM' , _T_OBJECT_NM );
setMapVal( itemDataList , 'ROUTE_ID' , _T_ROUTE_ID );
setMapVal( itemDataList , 'USR_ID' , _T_USR_ID );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , _NX_LVL );
setMapVal( itemDataList , 'APP_MEMO' , _T_APP_MEMO );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
}
_T_LVL++;
} else {
//連続していないので終了
break;
}
}
}
//----------------------------------------------------------
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_SHONIN);
} else {
//決裁
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_KESSAI);
}
} else {
//同じ階層で 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID') );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM') );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , getMapVal( lineDataMap , 'LVL' ) );
setMapVal( itemDataList , 'APP_MEMO' , getMapVal( lineDataMap , 'APP_MEMO' ) );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
}
}
//承認結果が差戻の場合
if (getMapVal( lineDataMap , 'STATUS' ) == '3') {
//否決の動きが申請者に戻るか一つ前に戻るか確認
if (getMapVal( lineDataMap , 'REJECT_KBN' ) == '1') {
//申請者に戻る場合
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID') );
//申請者に戻すのでLVLが1以上のデータのACTIVE_FLGをゼロに更新(18/08/07)
updateWFS_T_WORKFLOW_ACTIVE_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID'), 1 );
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID' ) );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM' ) );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , 1 );
setMapVal( itemDataList , 'APP_MEMO' , '' );
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_SASHIMODOSHI);
}
if (getMapVal( lineDataMap , 'REJECT_KBN' ) == '2') {
//ひとつ前に戻る場合
//階層テーブルにて前のレベルが存在するかチェック
var itemSelectList = selectWFS_M_LEVEL_NEXTPRE( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'ROUTE_ID' ), getMapVal( lineDataMap , 'LVL' ), '2');
if (itemSelectList.length > 0) {
var lineSelectDataMap = itemSelectList[0];
var _NX_LVL = getMapVal( lineSelectDataMap , 'LVL' );
//次期対象以外のCURENT_FLGを0に更新
updateWFS_T_WORKFLOW_CURENT_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ) );
//申請者に戻すのでLVLが一つ前の値以上のデータのACTIVE_FLGをゼロに更新(18/08/07)
updateWFS_T_WORKFLOW_ACTIVE_FLG( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID'), _NX_LVL );
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID') );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
setMapVal( itemDataList , 'OBJECT_NM' , getMapVal( lineDataMap , 'OBJECT_NM') );
setMapVal( itemDataList , 'ROUTE_ID' , getMapVal( lineDataMap , 'ROUTE_ID' ) );
setMapVal( itemDataList , 'USR_ID' , getMapVal( lineDataMap , 'USR_ID' ) );
setMapVal( itemDataList , 'STATUS' , '4' );
setMapVal( itemDataList , 'LVL' , _NX_LVL );
if (_NX_LVL == 1) {
setMapVal( itemDataList , 'APP_MEMO' , '' );
} else {
setMapVal( itemDataList , 'APP_MEMO' , getMapVal( lineDataMap , 'APP_MEMO' ) );
}
setMapVal( itemDataList , 'CURENT_FLG' , '1' );
insertWFS_T_WORKFLOW(itemDataList);
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_SASHIMODOSHI);
}
}
}
//承認結果が否認の場合(当処理としては何もしない(上位TALONで実施済み)
if ( getMapVal( lineDataMap , 'STATUS' ) == '9' ) {
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_HININ);
}
return true;
}
function execWorkFlowStop() {
//入力値取得
var itemBlockListHed = TALON.getBlockData_List(1);
var lineDataMap = itemBlockListHed[0];
//次ステップのデータが
//存在する場合はエラーとする
var itemSelectList = selectWFS_T_WORKFLOW( getMapVal( lineDataMap , 'WORK_ID' ), getMapVal( lineDataMap , 'OBJECT_ID' ), ( getMapVal( lineDataMap , 'STEP' ) + 1 ) );
if (itemSelectList.length > 0) {
TALON.addErrorMsg( "既に処理が行われている為、中止処理を実施できません" );
TALON.setIsSuccess(false);
} else {
//データありの場合のみ 次レコード作成
var itemDataList = new Array();
setMapVal( itemDataList , 'WORK_ID' , getMapVal( lineDataMap , 'WORK_ID' ) );
setMapVal( itemDataList , 'OBJECT_ID' , getMapVal( lineDataMap , 'OBJECT_ID') );
setMapVal( itemDataList , 'STEP' , parseInt( getMapVal( lineDataMap , 'STEP' ) ) );
setMapVal( itemDataList , 'STATUS' , '6' );
updateWFS_T_WORKFLOW(itemDataList);
execWorkFlowCustom(getMapVal( lineDataMap , 'WORK_ID' ) , getMapVal( lineDataMap , 'OBJECT_ID' ) , _WFS_SYORI_KBN_TORIKESHI);
TALON.addMsg( "中止処理を実施しました" );
TALON.setIsSuccess(true);
}
}
function _mail_data_wfs(_WORK_ID, _STEP, _OBJECT_ID) {
var mailData = {};
mailData.WFS_SUBJ = null;
mailData.WFS_MAIL = null;
mailData.WFS_MLTEXT = null;
var sql = "" +
"SELECT " +
" " +
" BASE.WORK_ID " +
",BASE.WORK_NM " +
",BASE.STEP " +
",BASE.OBJECT_ID " +
",BASE.USR_ID " +
",BASE.MAIL_ADD AS MAIL " +
" " +
",REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" BASE.MAIL_TITLE, " +
" '%1_STEP%', " +
" concat(BASE.STEP ,'') " +
" ), " +
" '%1_OBJECT_NM%', " +
" case when BASE.OBJECT_NM is null then '' else BASE.OBJECT_NM end " +
" ), " +
" '%1_WORK_ID%', " +
" BASE.WORK_ID " +
" ), " +
" '%1_WORK_NM%', " +
" case when BASE.WORK_NM is null then '' else BASE.WORK_NM end " +
" ), " +
" '%1_OBJECT_ID%', " +
" BASE.OBJECT_ID " +
" ), " +
" '%1_RES_MEMO%', " +
" case when BASE.RES_MEMO is null then '' else BASE.RES_MEMO end " +
" ) AS SUBJ " +
" " +
" " +
",REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" BASE.MAIL_TEXT, " +
" '%1_STEP%', " +
" concat(BASE.STEP ,'') " +
" ), " +
" '%1_OBJECT_NM%', " +
" case when BASE.OBJECT_NM is null then '' else BASE.OBJECT_NM end " +
" ), " +
" '%1_WORK_ID%', " +
" BASE.WORK_ID " +
" ), " +
" '%1_WORK_NM%', " +
" case when BASE.WORK_NM is null then '' else BASE.WORK_NM end " +
" ), " +
" '%1_OBJECT_ID%', " +
" BASE.OBJECT_ID " +
" ), " +
" '%1_RES_MEMO%', " +
" case when BASE.RES_MEMO is null then '' else BASE.RES_MEMO end " +
" ) AS MLTEXT " +
" " +
"FROM ( " +
" SELECT " +
" " +
" WFS_T_WORKFLOW.WORK_ID " +
" ,WFS_M_CONTROL.WORK_NM " +
" ,WFS_T_WORKFLOW.STEP " +
" ,WFS_T_WORKFLOW.OBJECT_ID " +
" ,WFS_T_WORKFLOW.OBJECT_NM " +
" ,WFS_T_WORKFLOW.USR_ID " +
" ,WFS_T_WORKFLOW.LVL " +
" ,WFS_T_WORKFLOW.ROUTE_ID " +
" ,WFS_T_WORKFLOW.STATUS " +
" ,WFS_T_WORKFLOW.RES_MEMO " +
" " +
" ,CASE " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NULL AND WFS_T_WORKFLOW.STATUS = '2' THEN '決裁' " +
" WHEN WFS_T_WORKFLOW.LVL = '1' THEN '再申請' " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NOT NULL AND (WFS_T_WORKFLOW.STATUS = '1' or WFS_T_WORKFLOW.STATUS = '2') THEN '承認' " +
" WHEN WFS_T_WORKFLOW.LVL <> '1' AND WFS_T_WORKFLOW.STATUS = '3' THEN '否認' " +
" END AS EXEC_FLG " +
" " +
" ,CASE " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NULL AND WFS_T_WORKFLOW.STATUS = '2' THEN " +
" TLN_CONCAT( " +
" WFS_ALL_MAIL(WFS_M_AUTH_FT.USR_GRP_ID, WFS_T_WORKFLOW.USR_ID ,WFS_T_WORKFLOW.WORK_ID ,WFS_T_WORKFLOW.OBJECT_ID ,WFS_M_AUTH_FT.LVL), " +
" CASE WHEN WFS_M_ROUTE_HED.END_SEND_MAIL IS NULL THEN '' ELSE WFS_M_ROUTE_HED.END_SEND_MAIL END , " +
" ',' " +
" ) " +
" WHEN WFS_T_WORKFLOW.LVL = '1' THEN WFS_ALL_MAIL(WFS_M_AUTH_NX.USR_GRP_ID, NULL ,WFS_T_WORKFLOW.WORK_ID ,WFS_T_WORKFLOW.OBJECT_ID ,WFS_M_AUTH_NX.LVL) " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NOT NULL AND (WFS_T_WORKFLOW.STATUS = '1' or WFS_T_WORKFLOW.STATUS = '2') THEN WFS_ALL_MAIL(WFS_M_AUTH_NX.USR_GRP_ID, NULL ,WFS_T_WORKFLOW.WORK_ID ,WFS_T_WORKFLOW.OBJECT_ID ,WFS_M_AUTH_NX.LVL) " +
" WHEN WFS_T_WORKFLOW.LVL <> '1' AND WFS_T_WORKFLOW_NX.LVL <> '1' AND WFS_T_WORKFLOW.STATUS = '3' THEN WFS_ALL_MAIL(WFS_M_AUTH_NX.USR_GRP_ID, NULL ,WFS_T_WORKFLOW.WORK_ID ,WFS_T_WORKFLOW.OBJECT_ID ,WFS_M_AUTH_NX.LVL) " +
" WHEN WFS_T_WORKFLOW.LVL <> '1' AND WFS_T_WORKFLOW_NX.LVL = '1' AND WFS_T_WORKFLOW.STATUS = '3' THEN WFS_ALL_MAIL(WFS_M_AUTH_FT.USR_GRP_ID, WFS_T_WORKFLOW.USR_ID ,WFS_T_WORKFLOW.WORK_ID ,WFS_T_WORKFLOW.OBJECT_ID ,WFS_M_AUTH_FT.LVL) " +
" WHEN WFS_T_WORKFLOW.STATUS = '9' THEN WFS_ALL_MAIL(WFS_M_AUTH_FT.USR_GRP_ID, WFS_T_WORKFLOW.USR_ID ,WFS_T_WORKFLOW.WORK_ID ,WFS_T_WORKFLOW.OBJECT_ID ,WFS_M_AUTH_FT.LVL) " +
" END AS MAIL_ADD " +
" " +
" ,CASE " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NULL AND WFS_T_WORKFLOW.STATUS = '2' THEN WFS_M_CONTROL.MAIL_TITLE_KESSAI " +
" WHEN WFS_T_WORKFLOW.LVL = '1' THEN WFS_M_CONTROL.MAIL_TITLE_SINSEI " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NOT NULL AND (WFS_T_WORKFLOW.STATUS = '1' or WFS_T_WORKFLOW.STATUS = '2') THEN WFS_M_CONTROL.MAIL_TITLE_SYONIN " +
" WHEN WFS_T_WORKFLOW.LVL <> '1' AND WFS_T_WORKFLOW.STATUS = '3' THEN WFS_M_CONTROL.MAIL_TITLE_HININ " +
" WHEN WFS_T_WORKFLOW.STATUS = '9' THEN WFS_M_CONTROL.MAIL_TITLE_HININ2 " +
" END AS MAIL_TITLE " +
" " +
" ,CASE " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NULL AND WFS_T_WORKFLOW.STATUS = '2' THEN WFS_M_CONTROL.MAIL_TEXT_KESSAI " +
" WHEN WFS_T_WORKFLOW.LVL = '1' THEN WFS_M_CONTROL.MAIL_TEXT_SINSEI " +
" WHEN WFS_T_WORKFLOW_NX.WORK_ID IS NOT NULL AND (WFS_T_WORKFLOW.STATUS = '1' or WFS_T_WORKFLOW.STATUS = '2') THEN WFS_M_CONTROL.MAIL_TEXT_SYONIN " +
" WHEN WFS_T_WORKFLOW.LVL <> '1' AND WFS_T_WORKFLOW.STATUS = '3' THEN WFS_M_CONTROL.MAIL_TEXT_HININ " +
" WHEN WFS_T_WORKFLOW.STATUS = '9' THEN WFS_M_CONTROL.MAIL_TEXT_HININ2 " +
" END AS MAIL_TEXT " +
" " +
" FROM WFS_T_WORKFLOW " +
" " +
" INNER JOIN WFS_M_CONTROL " +
" ON WFS_M_CONTROL.WORK_ID = WFS_T_WORKFLOW.WORK_ID " +
" " +
" LEFT OUTER JOIN WFS_T_WORKFLOW WFS_T_WORKFLOW_NX " +
" ON WFS_T_WORKFLOW.WORK_ID = WFS_T_WORKFLOW_NX.WORK_ID " +
" AND WFS_T_WORKFLOW.OBJECT_ID = WFS_T_WORKFLOW_NX.OBJECT_ID " +
" AND WFS_T_WORKFLOW.STEP + 1 = WFS_T_WORKFLOW_NX.STEP " +
" " +
" LEFT OUTER JOIN WFS_M_AUTH WFS_M_AUTH_NX " +
" ON WFS_T_WORKFLOW_NX.WORK_ID = WFS_M_AUTH_NX.WORK_ID " +
" AND WFS_T_WORKFLOW_NX.LVL = WFS_M_AUTH_NX.LVL " +
" AND WFS_T_WORKFLOW_NX.ROUTE_ID = WFS_M_AUTH_NX.ROUTE_ID " +
" " +
" LEFT OUTER JOIN WFS_T_WORKFLOW WFS_T_WORKFLOW_FT " +
" ON WFS_T_WORKFLOW.WORK_ID = WFS_T_WORKFLOW_FT.WORK_ID " +
" AND WFS_T_WORKFLOW.OBJECT_ID = WFS_T_WORKFLOW_FT.OBJECT_ID " +
" AND 1 = WFS_T_WORKFLOW_FT.STEP " +
" " +
" LEFT OUTER JOIN WFS_M_AUTH WFS_M_AUTH_FT " +
" ON WFS_T_WORKFLOW_FT.WORK_ID = WFS_M_AUTH_FT.WORK_ID " +
" AND WFS_T_WORKFLOW_FT.LVL = WFS_M_AUTH_FT.LVL " +
" AND WFS_T_WORKFLOW_FT.ROUTE_ID = WFS_M_AUTH_FT.ROUTE_ID " +
" " +
" LEFT OUTER JOIN WFS_M_ROUTE_HED " +
" ON WFS_T_WORKFLOW.ROUTE_ID = WFS_M_ROUTE_HED.ROUTE_ID " +
" " +
" WHERE WFS_T_WORKFLOW.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' " +
" AND WFS_T_WORKFLOW.STEP = '" + tln_com_escape( _STEP ) + "' " +
" AND WFS_T_WORKFLOW.OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "' " +
" " +
") BASE " +
" ";
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
if (itemSelectList.length > 0) {
var lineDataMap = itemSelectList[0];
mailData.WFS_SUBJ = getMapVal( lineDataMap , 'SUBJ' );
mailData.WFS_MAIL = getMapVal( lineDataMap , 'MAIL' );
mailData.WFS_MLTEXT = getMapVal( lineDataMap , 'MLTEXT' );
}
return mailData;
}
function _mail_data_reminder(_WORK_ID, _STEP, _OBJECT_ID) {
var mailData = {};
mailData.WFS_SUBJ = null;
mailData.WFS_MAIL = null;
mailData.WFS_MLTEXT = null;
var sql = "" +
"SELECT " +
" " +
" BASE.WORK_ID " +
",BASE.WORK_NM " +
",BASE.STEP as STEP " +
",BASE.REMINDER_ID " +
" " +
",BASE.OBJECT_ID " +
",BASE.USR_ID " +
",BASE.MAIL_ADD AS MAIL " +
" " +
",REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" BASE.MAIL_TITLE, " +
" '%1_STEP%', " +
" concat(BASE.STEP ,'') " +
" ), " +
" '%1_OBJECT_NM%', " +
" case when BASE.OBJECT_NM is null then '' else BASE.OBJECT_NM end " +
" ), " +
" '%1_WORK_ID%', " +
" BASE.WORK_ID " +
" ), " +
" '%1_WORK_NM%', " +
" case when BASE.WORK_NM is null then '' else BASE.WORK_NM end " +
" ), " +
" '%1_OBJECT_ID%', " +
" BASE.OBJECT_ID " +
" ), " +
" '%1_RES_MEMO%', " +
" case when BASE.RES_MEMO is null then '' else BASE.RES_MEMO end " +
" ) AS SUBJ " +
" " +
",REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" REPLACE( " +
" BASE.MAIL_TEXT, " +
" '%1_STEP%', " +
" concat(BASE.STEP ,'') " +
" ), " +
" '%1_OBJECT_NM%', " +
" case when BASE.OBJECT_NM is null then '' else BASE.OBJECT_NM end " +
" ), " +
" '%1_WORK_ID%', " +
" BASE.WORK_ID " +
" ), " +
" '%1_WORK_NM%', " +
" case when BASE.WORK_NM is null then '' else BASE.WORK_NM end " +
" ), " +
" '%1_OBJECT_ID%', " +
" BASE.OBJECT_ID " +
" ), " +
" '%1_RES_MEMO%', " +
" case when BASE.RES_MEMO is null then '' else BASE.RES_MEMO end " +
" ) AS MLTEXT " +
" " +
"FROM ( " +
" " +
" SELECT " +
" WFS_T_WORKREMINDER.WORK_ID " +
" ,WFS_M_CONTROL.WORK_NM " +
" ,WFS_T_WORKREMINDER.STEP " +
" ,WFS_T_WORKREMINDER.OBJECT_ID " +
" ,WFS_T_WORKFLOW.OBJECT_NM " +
" ,WFS_T_WORKREMINDER.REMINDER_ID " +
" ,WFS_T_WORKFLOW.USR_ID " +
" ,WFS_T_WORKFLOW.LVL " +
" ,WFS_T_WORKFLOW.ROUTE_ID " +
" ,WFS_T_WORKFLOW.STATUS " +
" ,WFS_T_WORKREMINDER.RES_MEMO " +
" " +
" ,WFS_ALL_MAIL(WFS_M_AUTH.USR_GRP_ID, NULL , WFS_T_WORKREMINDER.WORK_ID , WFS_T_WORKREMINDER.OBJECT_ID , WFS_M_AUTH.LVL) AS MAIL_ADD " +
" " +
" ,WFS_M_CONTROL.MAIL_TITLE_SAISOKU AS MAIL_TITLE " +
" " +
" ,WFS_M_CONTROL.MAIL_TEXT_SAISOKU AS MAIL_TEXT " +
" " +
" FROM WFS_T_WORKREMINDER " +
" " +
" INNER JOIN WFS_T_WORKFLOW " +
" ON WFS_T_WORKREMINDER.WORK_ID = WFS_T_WORKFLOW.WORK_ID " +
" AND WFS_T_WORKREMINDER.OBJECT_ID = WFS_T_WORKFLOW.OBJECT_ID " +
" AND WFS_T_WORKREMINDER.STEP = WFS_T_WORKFLOW.STEP " +
" " +
" INNER JOIN WFS_M_CONTROL " +
" ON WFS_M_CONTROL.WORK_ID = WFS_T_WORKFLOW.WORK_ID " +
" " +
" LEFT OUTER JOIN WFS_M_AUTH WFS_M_AUTH " +
" ON WFS_T_WORKFLOW.WORK_ID = WFS_M_AUTH.WORK_ID " +
" AND WFS_T_WORKFLOW.LVL = WFS_M_AUTH.LVL " +
" AND WFS_T_WORKFLOW.ROUTE_ID = WFS_M_AUTH.ROUTE_ID " +
" " +
" WHERE WFS_T_WORKFLOW.WORK_ID = '" + tln_com_escape( _WORK_ID ) + "' " +
" AND WFS_T_WORKFLOW.STEP = '" + tln_com_escape( _STEP ) + "' " +
" AND WFS_T_WORKFLOW.OBJECT_ID = '" + tln_com_escape( _OBJECT_ID ) + "' " +
" " +
") BASE " +
" ";
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig() , sql );
if (itemSelectList.length > 0) {
var lineDataMap = itemSelectList[itemSelectList.length - 1]; // STEPが進行しないまま複数回の催促が起こり得るため、最後の催促内容をメール送信する
mailData.WFS_SUBJ = getMapVal( lineDataMap , 'SUBJ' );
mailData.WFS_MAIL = getMapVal( lineDataMap , 'MAIL' );
mailData.WFS_MLTEXT = getMapVal( lineDataMap , 'MLTEXT' );
}
return mailData;
}
≣ サーバJS ライブラリWFS_CUSTOM [共通]ワークフローシステム(ユーザー処理用) 1504字
/**
* WFS_CUSTOM : [共通]ワークフローシステム(ユーザー処理用)
*
* @version 2019/03/01
*/
//-------------------------------------------------------
// パラメータ
// work_id ワークフローID
// object_id オブジェクトID
// syori_kbn 処理区分
// 10 : 申請 [ STATUS = 1 ]
// 20 : 承認(次階層あり) [ STATUS = 2 ]
// 21 : 承認(次階層なし=決裁) [ STATUS = 2 ]
// 30 : 差戻 [ STATUS = 3 ]
// 90 : 否認 [ STATUS = 9 ]
// 50 : 取戻(申請者取戻) [ STATUS = 5 ]
// 60 : 取消 [ STATUS = 6 ]
// 70 : 取戻(承認者取戻) [ STATUS = 7 ]
// 80 : 引上 [ STATUS = 8 ]
//-------------------------------------------------------
var _WFS_SYORI_KBN_SHINSEI = '10'; //申請
var _WFS_SYORI_KBN_SHONIN = '20'; //承認(次階層あり)
var _WFS_SYORI_KBN_KESSAI = '21'; //承認(次階層なし=決裁)
var _WFS_SYORI_KBN_SASHIMODOSHI = '30'; //差戻
var _WFS_SYORI_KBN_HININ = '90'; //否認
var _WFS_SYORI_KBN_TORIMODOSHIS = '50'; //取戻(申請者取戻)
var _WFS_SYORI_KBN_TORIKESHI = '60'; //取消
var _WFS_SYORI_KBN_TORIMODOSHIS = '70'; //取戻(承認者取戻)
var _WFS_SYORI_KBN_HIKIAGE = '80'; //引上
function execWorkFlowCustom(work_id , obj_id , syori_kbn) {
var status = '';
var table = '';
var join = '';
var param = '';
switch (work_id) {
//(WORK_ID:XXXXXXXXXX)
case 'XXXXXXXXXX':
break;
//(WORK_ID:XXXXXXXXXX)
case 'XXXXXXXXXX':
break;
default:
break;
}
}
≣ サーバJS ライブラリWFS_SETUP [共通]ワークフローシステム(環境構築) 144200字
/**
* WFS_SETUP : [共通]ワークフローシステム(環境構築)
*
* 最終更新:WFS_2_0_2
* @version 2023/11/13
*/
//--------------------------------------------
// セットアップ関連共通
//--------------------------------------------
function table_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_TABLES WHERE TABLE_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM information_schema.tables WHERE table_name = '" + nm + "' AND table_schema = '" + _DSP1 + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'U' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(DISTINCT table_name) AS CNT FROM information_schema.columns WHERE LOWER(table_name) = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function function_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION' AND OBJECT_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_SCHEMA = '" + _DSP1 + "' AND SPECIFIC_NAME = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'FN' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM pg_proc WHERE proname = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function view_exists(nm) {
if ( TALON.getDbConfig().isOra() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM USER_OBJECTS WHERE OBJECT_TYPE = 'VIEW' AND OBJECT_NAME = '" + nm + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
}
if ( TALON.getDbConfig().isMy() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT DSP1 FROM TLN_M_HANYO_CODE_MAIN WHERE SIKIBETU_CODE='TLN_GENERAL' AND KEY_CODE='DB_NAME'" );
var lineDataMap = itemSelectList[0];
var _DSP1 = getMapVal(lineDataMap,'DSP1');
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '" + nm + "' AND TABLE_SCHEMA = '" + _DSP1 + "' " );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isMssql() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM sys.objects WHERE type = 'V' AND name = '" + nm + "'" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if ( TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM pg_class WHERE relkind = 'v' and relname = LOWER('" + nm + "')" );
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
};
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function field_exists(nm,fl) {
if ( !TALON.getDbConfig().isPostgres() ) {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE TABLE_NAME = '" + nm + "' AND COLUMN_NAME = '" + fl + "' " );
} else {
var itemSelectList = TalonDbUtil.select( TALON.getDbConfig(), "SELECT COUNT(*) AS CNT FROM TLN_M_NAME_MANAGER WHERE TABLE_NAME = LOWER('" + nm + "') AND COLUMN_NAME = LOWER('" + fl + "') " );
}
var lineDataMap = itemSelectList[0];
var _CNT = getMapVal(lineDataMap,'CNT');
if (_CNT == 0) {
return false;
} else {
return true;
}
}
function executeSQL(sql) {
if ( TALON.getDbConfig().isOra() ) {
//Oracleの場合true
TALON.executeSQL(sql);
};
if ( TALON.getDbConfig().isMy() ) {
//MySQLの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
if ( TALON.getDbConfig().isMssql() ) {
//MsSqlServerの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
if ( TALON.getDbConfig().isPostgres() ) {
//Postgresの場合true
TalonDbUtil.update( TALON.getDbConfig(), sql);
};
}
function table_exists_drop(nm) {
if (table_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP TABLE " + nm ) ;
} else {
executeSQL( "DROP TABLE " + nm.toLowerCase() ) ;
}
}
}
function function_exists_drop(nm) {
if (function_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP FUNCTION " + nm ) ;
} else {
executeSQL( "DROP FUNCTION " + nm.toLowerCase() ) ;
}
}
}
function view_exists_drop(nm) {
if (view_exists(nm)) {
if ( !TALON.getDbConfig().isPostgres() ) {
executeSQL( "DROP VIEW " + nm ) ;
} else {
executeSQL( "DROP VIEW " + nm.toLowerCase() ) ;
}
}
}
//--------------------------------------------
// セットアップ後環境別データ修正
//--------------------------------------------
function exec_custom() {
if ( TALON.getDbConfig().isMy() ) {
//MySQLの場合true
if ( chkLowercase() ) {
//lowercaseとして判断
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_APP SET VALUE = LOWER(VALUE) WHERE FUNC_KBN = 'UPDATE_TABLE' AND FUNC_ID LIKE 'WFS_%' ");
}
}
if ( TALON.getDbConfig().isMssql() ) {
//MsSqlServerの場合true
var array = ["TLN_DATE_TO_CHAR","TLN_CHAR_TO_DATE","TLN_SYSDATE","TLN_CONCAT","TLN_CHARINDEX","TLN_CHAR_TO_NUMBER","WFS_ALL_MAIL","WFS_AUTH_MAIN","WFS_AUTH_SHINSEI","WFS_AUTH_SHONIN","WFS_WF_EXISTS","WFS_WF_STEP"];
var i;
var num = array.length;
for(i=0;i < num;i++){
//--------------
//TLN_M_GENERAL_FUNC_SQL
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_GENERAL_FUNC_SQL " +
" SET " +
" BODY_SQL = REPLACE(REPLACE(BODY_SQL ,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" ,TITLE_SQL = REPLACE(REPLACE(TITLE_SQL,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE FUNC_ID LIKE 'WFS_%' "
);
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_GENERAL_ITEM_OPTN " +
" SET " +
" CHR_TEXT = REPLACE(REPLACE(CHR_TEXT,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_ID <> 'WFS_M000' " +
" AND (FUNC_KBN = 'JAVA_SCRIPT_ENGINE' OR (FUNC_KBN = 'BUTTON_BAT' AND FLAG = 2)) "
);
//--------------
//TLN_M_HANYO_CODE_MAIN
TalonDbUtil.update( TALON.getDbConfig(),
" UPDATE TLN_M_HANYO_CODE_MAIN " +
" SET " +
" NOTE = REPLACE(REPLACE(NOTE,'" + array[i] + "','dbo." + array[i] + "'),'dbo.dbo.','dbo.') " +
" WHERE SIKIBETU_CODE = 'TLN_GENERAL_JAVASCRIPT_ENGINE' " +
" AND KEY_CODE <> 'WFS_SETUP' "
);
}
}
if ( TALON.getDbConfig().isPostgres() ) {
//PostgreSQLの場合true
//lower
//--------------
//TLN_M_GENERAL_ITEM
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM SET COL_NAME = LOWER(COL_NAME) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_ID <> 'WFS_M000' ");
//--------------
//TLN_M_GENERAL_FUNC_SQL
// * TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = LOWER(BODY_SQL) WHERE FUNC_ID LIKE 'WFS_%' ");
// * TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET TITLE_SQL = LOWER(TITLE_SQL) WHERE FUNC_ID LIKE 'WFS_%' ");
// *
// * TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'tln_login_user','TLN_LOGIN_USER') WHERE FUNC_ID LIKE 'WFS_%' ");
// * TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'wfs_all_chk' ,'WFS_ALL_CHK' ) WHERE FUNC_ID LIKE 'WFS_%' ");
// *
// * WFS_M034のみバインド変数を小文字化
// * TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%WORK_ID%**/' ,'/**%work_id%**/' ) WHERE FUNC_ID LIKE 'WFS_M034' ");
// * TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%WORK_NM%**/' ,'/**%work_nm%**/' ) WHERE FUNC_ID LIKE 'WFS_M034' ");
// * TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%ROUTE_ID%**/' ,'/**%route_id%**/' ) WHERE FUNC_ID LIKE 'WFS_M034' ");
//機能内で使用しているバインド変数を小文字に変換
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%APP_MEMO_SEL%**/' ,'/**%app_memo_sel%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%ID%**/' ,'/**%id%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%JOB_ID%**/' ,'/**%job_id%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%LVL%**/' ,'/**%lvl%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%NOT_END_FLG%**/' ,'/**%not_end_flg%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%OBJECT_ID%**/' ,'/**%object_id%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%OBJECT_NM%**/' ,'/**%object_nm%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%PARAM_CTL_UMU%**/' ,'/**%param_ctl_umu%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%PARAM_TRG%**/' ,'/**%param_trg%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%ROUTE_ID%**/' ,'/**%route_id%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%SEL_CHK_NO%**/' ,'/**%sel_chk_no%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%SEL_DEL_FLG%**/' ,'/**%sel_del_flg%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%SEL_WORK_ID%**/' ,'/**%sel_work_id%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%TENKAI_HOUKOU%**/' ,'/**%tenkai_houkou%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%USR_ID%**/' ,'/**%usr_id%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%WORK_ID%**/' ,'/**%work_id%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_FUNC_SQL SET BODY_SQL = REPLACE(BODY_SQL,'/**%WORK_NM%**/' ,'/**%work_nm%**/' ) WHERE FUNC_ID LIKE 'WFS_%' ");
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = LOWER(CHR4) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = replace(CHR4,'sample_work01','SAMPLE_WORK01') WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR4 = replace(CHR4,'sample_work02','SAMPLE_WORK02') WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'BUTTON_NEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND), CHR1 = LOWER(CHR1), CHR_TEXT = LOWER(CHR_TEXT), CHR4 = LOWER(CHR4) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'SEND_MAIL' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND) WHERE FUNC_ID LIKE 'WFS_%' AND ( FUNC_KBN LIKE 'BUTTON_NEXT_%' or FUNC_KBN = 'INPUT_CONDITION' ) ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1), CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'WFS_%' AND ( FUNC_KBN = 'SUB_SEARCH' OR FUNC_KBN = 'LOOK_UP' ) ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'REGIST_VALUE' AND CHR1 NOT LIKE '%WFS%' AND CHR1 NOT LIKE '%SYSDATE%' AND CHR1 NOT LIKE '%LOGIN_ID%' AND CHR1 NOT LIKE '%TLN_M%'"); //システムバインド変数、機能ID、URLはそのまま
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'REGIST_VALUE' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET KIND = LOWER(KIND) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'MATCH_PATTERN' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) , CHR2 = LOWER(CHR2) , CHR3 = LOWER(CHR3) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'SUGGEST' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'FORE_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'INIT_VALUE_TEXT' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'OTHER_FUNC' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = LOWER(CHR1), CHR3 = LOWER(CHR3) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN LIKE 'OTHER_FUNC_%' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR3 = replace(CHR3,'%login_id%','%LOGIN_ID%') WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN LIKE 'OTHER_FUNC_%' "); //他機能呼出のシステム変数は大文字
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR2 = LOWER(CHR2) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'BACK_COLOR' ");
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET CHR1 = REPLACE(CHR1,'%2_ROUTE_SET_KBN_NULL%' ,'%2_route_set_kbn_null%' ) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'REGIST_VALUE' ");
//--------------
//TLN_M_GENERAL_ITEM_OPTN
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_ITEM_OPTN SET COL_NAME = LOWER(COL_NAME) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN NOT IN ('SEND_MAIL' , 'OTHER_FUNC' , 'JAVA_SCRIPT_ENGINE' , 'JAVA_SCRIPT' , 'BUTTON_NEXT' , 'BUTTON_BAT' , 'BUTTON_DSP_POS' ) AND FUNC_KBN NOT LIKE 'BUTTON_AJAX%' ");
//TLN_M_GENERAL_APP
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_APP SET VALUE = LOWER(VALUE) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_KBN = 'UPDATE_TABLE' ");
//TLN_M_GENERAL_USES
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_USES SET KEY_CODE = LOWER(KEY_CODE) WHERE FUNC_ID LIKE 'WFS_%' AND USER_CODE = 'TLN_GEN_ALL' ");
//--------------
//TLN_M_GENERAL_POSITION
TalonDbUtil.update( TALON.getDbConfig(), " UPDATE TLN_M_GENERAL_POSITION SET NAME = LOWER(NAME) WHERE FUNC_ID LIKE 'WFS_%' AND FUNC_ID <> 'WFS_M000' AND CHR1='ITEM' ");
}
}
//--------------------------------------------
// Ver1.4へのバージョンアップ
//--------------------------------------------
function exec_ver_up_14( _func_chk ){
//テーブルの追加
exec_ver_up_14_TableModify();
//データのパッチ(補填)
exec_ver_up_patch_14_DataPatch();
//画面でファンクションの再構築が設定された場合(初回インストールは固定1で呼び出される)
if ( _func_chk == '1' ) {
//ファンクションの再構築 →ファンクション・Viewはパッチ毎に最新を作成
exec_create_Function();
//Viewの再構築 →ファンクション・Viewはパッチ毎に最新を作成
exec_create_View();
}
}
function exec_ver_up_14_TableModify(){
//テーブル変更、追加処理
//------------------------------
if ( TALON.getDbConfig().isOra() ) {
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_AUTH','SYONIN_PTN')) {
executeSQL(
"ALTER TABLE WFS_M_AUTH ADD ( " +
"SYONIN_PTN VARCHAR2(20) NULL " +
")" +
"");
}
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_CONTROL','APPROVAL_FLG')) {
executeSQL(
"ALTER TABLE WFS_M_CONTROL MODIFY ( " +
"MAIL_TEXT_KESSAI VARCHAR2(3000) , " +
"MAIL_TEXT_SINSEI VARCHAR2(3000) , " +
"MAIL_TEXT_SYONIN VARCHAR2(3000) , " +
"MAIL_TEXT_HININ VARCHAR2(3000) " +
")" +
"");
executeSQL(
"ALTER TABLE WFS_M_CONTROL ADD ( " +
"APPROVAL_FLG VARCHAR2(20) NULL , " +
"ROUTE_SET_KBN VARCHAR2(50) NULL , " +
"ROUTE_STRUCT_ID VARCHAR2(50) NULL , " +
"MAIL_TITLE_HININ2 VARCHAR2(100) NULL , " +
"MAIL_TEXT_HININ2 VARCHAR2(3000) NULL , " +
"MAIL_TITLE_SAISOKU VARCHAR2(100) NULL , " +
"MAIL_TEXT_SAISOKU VARCHAR2(3000) NULL , " +
"CATEGORY_ID VARCHAR2(50) NULL " +
")" +
"");
}
//--------------------------------------
//[変更]WFS_M_ROUTE_HED
if (!field_exists('WFS_M_ROUTE_HED','PARAM_FM')) {
executeSQL(
"ALTER TABLE WFS_M_ROUTE_HED ADD ( " +
"PARAM_FM VARCHAR2(50) NULL , " +
"PARAM_VAL VARCHAR2(100) NULL , " +
"PARAM_TP VARCHAR2(50) NULL , " +
"END_SEND_MAIL VARCHAR2(100) NULL , " +
"DEL_FLG VARCHAR2(10) NULL " +
")" +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_HED
if (!table_exists('WFS_M_STRUCT_HED')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_HED " + "\n" +
" (" + "\n" +
" ID VARCHAR2(50) NOT NULL," + "\n" +
" TITLE VARCHAR2(100) ," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_HED " + "\n" +
" ADD ( CONSTRAINT PK_WFS_M_STRUCT_HED PRIMARY KEY (ID) USING INDEX ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_DTL
if (!table_exists('WFS_M_STRUCT_DTL')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_DTL " + "\n" +
" (" + "\n" +
" ID VARCHAR2(50) NOT NULL," + "\n" +
" SEQ NUMBER(10) NOT NULL," + "\n" +
" CHILD_ID VARCHAR2(50) ," + "\n" +
" OYA_ID VARCHAR2(50) ," + "\n" +
" BOTTOM_FLG VARCHAR2(10) ," + "\n" +
" SYONIN_PTN VARCHAR2(20) ," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_DTL " + "\n" +
" ADD ( CONSTRAINT PK_WFS_M_STRUCT_DTL PRIMARY KEY (ID, SEQ) USING INDEX ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_TEMP
if (!table_exists('WFS_W_STRUCT_TEMP')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_TEMP " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR2(50) NOT NULL," + "\n" +
" ID VARCHAR2(50) ," + "\n" +
" SEQ NUMBER(10) NOT NULL," + "\n" +
" CHILD_ID VARCHAR2(50) ," + "\n" +
" OYA_ID VARCHAR2(50) ," + "\n" +
" BOTTOM_FLG VARCHAR2(10) ," + "\n" +
" SYONIN_PTN VARCHAR2(20) ," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_TEMP " + "\n" +
" ADD ( CONSTRAINT PK_WFS_W_STRUCT_TEMP PRIMARY KEY (JOB_ID, SEQ) USING INDEX ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_LIST
if (!table_exists('WFS_W_STRUCT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_LIST " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR2(50) NOT NULL," + "\n" +
" ID VARCHAR2(50) ," + "\n" +
" SEQ NUMBER(10) NOT NULL," + "\n" +
" SORT VARCHAR2(50) ," + "\n" +
" LVL VARCHAR2(10) ," + "\n" +
" OYA_ID VARCHAR2(50) ," + "\n" +
" CHILD_ID VARCHAR2(50) ," + "\n" +
" SYONIN_PTN VARCHAR2(20) ," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_LIST " + "\n" +
" ADD ( CONSTRAINT PK_WFS_W_STRUCT_LIST PRIMARY KEY (JOB_ID, SEQ) USING INDEX ) " + "\n" +
"");
}
//--------------------------------------
//[変更]WFS_T_WORKFLOW
if (!field_exists('WFS_T_WORKFLOW','SHONIN_ID')) {
executeSQL(
"ALTER TABLE WFS_T_WORKFLOW ADD ( " +
"SHONIN_ID VARCHAR2(100) NULL , " +
"ACTIVE_FLG VARCHAR2(20) NULL , " +
"HOLD_FLG VARCHAR2(20) NULL " +
")" +
"");
}
//--------------------------------------
//[新規]WFS_W_STAT_LIST
if (!table_exists('WFS_W_STAT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STAT_LIST " + "\n" +
" (" + "\n" +
" WORK_ID VARCHAR2(100) NOT NULL ," + "\n" +
" OBJECT_ID VARCHAR2(100) NOT NULL ," + "\n" +
" LVL01_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL01_DT DATE DEFAULT NULL ," + "\n" +
" LVL01_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL02_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL02_DT DATE DEFAULT NULL ," + "\n" +
" LVL02_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL03_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL03_DT DATE DEFAULT NULL ," + "\n" +
" LVL03_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL04_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL04_DT DATE DEFAULT NULL ," + "\n" +
" LVL04_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL05_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL05_DT DATE DEFAULT NULL ," + "\n" +
" LVL05_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL06_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL06_DT DATE DEFAULT NULL ," + "\n" +
" LVL06_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL07_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL07_DT DATE DEFAULT NULL ," + "\n" +
" LVL07_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL08_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL08_DT DATE DEFAULT NULL ," + "\n" +
" LVL08_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL09_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL09_DT DATE DEFAULT NULL ," + "\n" +
" LVL09_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL10_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL10_DT DATE DEFAULT NULL ," + "\n" +
" LVL10_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL11_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL11_DT DATE DEFAULT NULL ," + "\n" +
" LVL11_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL12_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL12_DT DATE DEFAULT NULL ," + "\n" +
" LVL12_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL13_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL13_DT DATE DEFAULT NULL ," + "\n" +
" LVL13_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL14_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL14_DT DATE DEFAULT NULL ," + "\n" +
" LVL14_US VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL15_NM VARCHAR2(100) DEFAULT NULL ," + "\n" +
" LVL15_DT DATE DEFAULT NULL ," + "\n" +
" LVL15_US VARCHAR2(100) DEFAULT NULL " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STAT_LIST " + "\n" +
" ADD ( CONSTRAINT PK_WFS_W_STAT_LIST PRIMARY KEY (WORK_ID, OBJECT_ID) USING INDEX ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_USR_DAIRI
if (!table_exists('WFS_M_USR_DAIRI')) {
executeSQL(
" CREATE TABLE WFS_M_USR_DAIRI " + "\n" +
" (" + "\n" +
" USR_ID VARCHAR2(100) NOT NULL," + "\n" +
" DAIRI_USR_ID VARCHAR2(100) NOT NULL," + "\n" +
" SHINSEI_FLG VARCHAR2(10) ," + "\n" +
" SHONIN_FLG VARCHAR2(10) ," + "\n" +
" YUKO_KBN VARCHAR2(10) ," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_USR_DAIRI " + "\n" +
" ADD ( CONSTRAINT PK_WFS_M_USR_DAIRI PRIMARY KEY (USR_ID, DAIRI_USR_ID) USING INDEX ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKREMINDER
if (!table_exists('WFS_T_WORKREMINDER')) {
executeSQL(
" CREATE TABLE WFS_T_WORKREMINDER " + "\n" +
" (" + "\n" +
" WORK_ID VARCHAR2(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR2(100) NOT NULL," + "\n" +
" STEP DECIMAL(10,0) NOT NULL," + "\n" +
" REMINDER_ID VARCHAR2(100) NOT NULL," + "\n" +
" ROUTE_ID VARCHAR2(100) ," + "\n" +
" LVL DECIMAL(10,0) ," + "\n" +
" RES_MEMO VARCHAR2(4000) ," + "\n" +
" SEND_ADDRESS VARCHAR2(500) ," + "\n" +
" SEND_TITLE VARCHAR2(500) ," + "\n" +
" SEND_TEXT VARCHAR2(4000) ," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKREMINDER " + "\n" +
" ADD ( CONSTRAINT PK_WFS_T_WORKREMINDER PRIMARY KEY (WORK_ID, OBJECT_ID, STEP, REMINDER_ID) USING INDEX ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKAPPROVALRES
if (!table_exists('WFS_T_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" WORK_ID VARCHAR2(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR2(100) NOT NULL," + "\n" +
" LVL DECIMAL(10,0) NOT NULL," + "\n" +
" ROUTE_ID VARCHAR2(100) ," + "\n" +
" USR_GRP_ID VARCHAR2(100) ," + "\n" +
" USR_ID VARCHAR2(100) NOT NULL," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" ADD ( CONSTRAINT PK_WFS_T_WORKAPPROVALRES PRIMARY KEY (WORK_ID, OBJECT_ID, LVL, USR_ID) USING INDEX ) " + "\n" +
"");
}
}
if ( TALON.getDbConfig().isMy() ) {
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_AUTH','SYONIN_PTN')) {
executeSQL(
"ALTER TABLE WFS_M_AUTH " +
"ADD COLUMN SYONIN_PTN VARCHAR(20) NULL " +
"");
}
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_CONTROL','APPROVAL_FLG')) {
executeSQL(
"ALTER TABLE WFS_M_CONTROL " +
"CHANGE COLUMN MAIL_TEXT_KESSAI MAIL_TEXT_KESSAI TEXT NULL DEFAULT NULL , " +
"CHANGE COLUMN MAIL_TEXT_SINSEI MAIL_TEXT_SINSEI TEXT NULL DEFAULT NULL , " +
"CHANGE COLUMN MAIL_TEXT_SYONIN MAIL_TEXT_SYONIN TEXT NULL DEFAULT NULL , " +
"CHANGE COLUMN MAIL_TEXT_HININ MAIL_TEXT_HININ TEXT NULL DEFAULT NULL , " +
"ADD COLUMN APPROVAL_FLG VARCHAR(20) NULL , " +
"ADD COLUMN ROUTE_SET_KBN VARCHAR(50) NULL , " +
"ADD COLUMN ROUTE_STRUCT_ID VARCHAR(50) NULL , " +
"ADD COLUMN MAIL_TITLE_HININ2 VARCHAR(100) NULL , " +
"ADD COLUMN MAIL_TEXT_HININ2 TEXT NULL , " +
"ADD COLUMN MAIL_TITLE_SAISOKU VARCHAR(100) NULL , " +
"ADD COLUMN MAIL_TEXT_SAISOKU TEXT NULL , " +
"ADD COLUMN CATEGORY_ID VARCHAR(50) NULL " +
"");
}
//--------------------------------------
//[変更]WFS_M_ROUTE_HED
if (!field_exists('WFS_M_ROUTE_HED','PARAM_FM')) {
executeSQL(
"ALTER TABLE WFS_M_ROUTE_HED " +
"ADD COLUMN PARAM_FM VARCHAR(50) NULL , " +
"ADD COLUMN PARAM_VAL VARCHAR(100) NULL , " +
"ADD COLUMN PARAM_TP VARCHAR(50) NULL , " +
"ADD COLUMN END_SEND_MAIL VARCHAR(100) NULL , " +
"ADD COLUMN DEL_FLG VARCHAR(10) NULL " +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_HED
if (!table_exists('WFS_M_STRUCT_HED')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_HED " + "\n" +
" (" + "\n" +
" ID VARCHAR(50) NOT NULL," + "\n" +
" TITLE VARCHAR(100) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_HED " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (ID)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_DTL
if (!table_exists('WFS_M_STRUCT_DTL')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_DTL " + "\n" +
" (" + "\n" +
" ID VARCHAR(50) NOT NULL," + "\n" +
" SEQ INT(10) NOT NULL," + "\n" +
" CHILD_ID VARCHAR(50) ," + "\n" +
" OYA_ID VARCHAR(50) ," + "\n" +
" BOTTOM_FLG VARCHAR(10) ," + "\n" +
" SYONIN_PTN VARCHAR(20) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_DTL " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (ID, SEQ)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_TEMP
if (!table_exists('WFS_W_STRUCT_TEMP')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_TEMP " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR(50) NOT NULL," + "\n" +
" ID VARCHAR(50) ," + "\n" +
" SEQ INT(10) NOT NULL," + "\n" +
" CHILD_ID VARCHAR(50) ," + "\n" +
" OYA_ID VARCHAR(50) ," + "\n" +
" BOTTOM_FLG VARCHAR(10) ," + "\n" +
" SYONIN_PTN VARCHAR(20) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_TEMP " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (JOB_ID, SEQ)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_LIST
if (!table_exists('WFS_W_STRUCT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_LIST " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR(50) NOT NULL," + "\n" +
" ID VARCHAR(50) ," + "\n" +
" SEQ INT(10) NOT NULL," + "\n" +
" SORT VARCHAR(50) ," + "\n" +
" LVL VARCHAR(10) ," + "\n" +
" OYA_ID VARCHAR(50) ," + "\n" +
" CHILD_ID VARCHAR(50) ," + "\n" +
" SYONIN_PTN VARCHAR(20) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_LIST " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (JOB_ID, SEQ)" + "\n" +
"");
}
//--------------------------------------
//[変更]WFS_T_WORKFLOW
if (!field_exists('WFS_T_WORKFLOW','SHONIN_ID')) {
executeSQL(
"ALTER TABLE WFS_T_WORKFLOW " +
"ADD COLUMN SHONIN_ID VARCHAR(100) NULL , " +
"ADD COLUMN ACTIVE_FLG VARCHAR(20) NULL , " +
"ADD COLUMN HOLD_FLG VARCHAR(20) NULL " +
"");
}
//--------------------------------------
//[新規]WFS_W_STAT_LIST
if (!table_exists('WFS_W_STAT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STAT_LIST " + "\n" +
" (" + "\n" +
" WORK_ID VARCHAR(100) NOT NULL ," + "\n" +
" OBJECT_ID VARCHAR(100) NOT NULL ," + "\n" +
" LVL01_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL01_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL01_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL02_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL02_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL02_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL03_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL03_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL03_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL04_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL04_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL04_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL05_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL05_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL05_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL06_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL06_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL06_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL07_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL07_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL07_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL08_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL08_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL08_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL09_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL09_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL09_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL10_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL10_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL10_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL11_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL11_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL11_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL12_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL12_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL12_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL13_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL13_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL13_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL14_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL14_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL14_US VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL15_NM VARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL15_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL15_US VARCHAR(100) DEFAULT NULL " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STAT_LIST " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (WORK_ID, OBJECT_ID)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_USR_DAIRI
if (!table_exists('WFS_M_USR_DAIRI')) {
executeSQL(
" CREATE TABLE WFS_M_USR_DAIRI " + "\n" +
" (" + "\n" +
" USR_ID VARCHAR(100) NOT NULL," + "\n" +
" DAIRI_USR_ID VARCHAR(100) NOT NULL," + "\n" +
" SHINSEI_FLG VARCHAR(10) ," + "\n" +
" SHONIN_FLG VARCHAR(10) ," + "\n" +
" YUKO_KBN VARCHAR(10) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_USR_DAIRI " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (USR_ID, DAIRI_USR_ID)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKREMINDER
if (!table_exists('WFS_T_WORKREMINDER')) {
executeSQL(
" CREATE TABLE WFS_T_WORKREMINDER " + "\n" +
" (" + "\n" +
" WORK_ID VARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR(100) NOT NULL," + "\n" +
" STEP DECIMAL(10,0) NOT NULL," + "\n" +
" REMINDER_ID VARCHAR(100) NOT NULL," + "\n" +
" ROUTE_ID VARCHAR(100) ," + "\n" +
" LVL DECIMAL(10,0) ," + "\n" +
" RES_MEMO VARCHAR(4000) ," + "\n" +
" SEND_ADDRESS VARCHAR(500) ," + "\n" +
" SEND_TITLE VARCHAR(500) ," + "\n" +
" SEND_TEXT VARCHAR(4000) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKREMINDER " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (WORK_ID, OBJECT_ID, STEP, REMINDER_ID)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKAPPROVALRES
if (!table_exists('WFS_T_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" WORK_ID VARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR(100) NOT NULL," + "\n" +
" LVL DECIMAL(10,0) NOT NULL," + "\n" +
" ROUTE_ID VARCHAR(100) ," + "\n" +
" USR_GRP_ID VARCHAR(100) ," + "\n" +
" USR_ID VARCHAR(100) NOT NULL," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (WORK_ID, OBJECT_ID, LVL, USR_ID)" + "\n" +
"");
}
};
if ( TALON.getDbConfig().isMssql() ) {
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_AUTH','SYONIN_PTN')) {
executeSQL(
"ALTER TABLE WFS_M_AUTH ADD " +
"SYONIN_PTN NVARCHAR(20) NULL " +
"");
}
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_CONTROL','APPROVAL_FLG')) {
executeSQL(
"ALTER TABLE WFS_M_CONTROL ALTER COLUMN MAIL_TEXT_KESSAI NVARCHAR(3000) ; " +
"");
executeSQL(
"ALTER TABLE WFS_M_CONTROL ALTER COLUMN MAIL_TEXT_SINSEI NVARCHAR(3000) ; " +
"");
executeSQL(
"ALTER TABLE WFS_M_CONTROL ALTER COLUMN MAIL_TEXT_SYONIN NVARCHAR(3000) ; " +
"");
executeSQL(
"ALTER TABLE WFS_M_CONTROL ALTER COLUMN MAIL_TEXT_HININ NVARCHAR(3000) ; " +
"");
executeSQL(
"ALTER TABLE WFS_M_CONTROL ADD " +
"APPROVAL_FLG NVARCHAR(20) NULL , " +
"ROUTE_SET_KBN NVARCHAR(50) NULL , " +
"ROUTE_STRUCT_ID NVARCHAR(50) NULL , " +
"MAIL_TITLE_HININ2 NVARCHAR(100) NULL , " +
"MAIL_TEXT_HININ2 NVARCHAR(3000) NULL , " +
"MAIL_TITLE_SAISOKU NVARCHAR(100) NULL , " +
"MAIL_TEXT_SAISOKU NVARCHAR(3000) NULL , " +
"CATEGORY_ID NVARCHAR(50) NULL " +
"");
}
//--------------------------------------
//[変更]WFS_M_ROUTE_HED
if (!field_exists('WFS_M_ROUTE_HED','PARAM_FM')) {
executeSQL(
"ALTER TABLE WFS_M_ROUTE_HED ADD " +
"PARAM_FM NVARCHAR(50) NULL , " +
"PARAM_VAL NVARCHAR(100) NULL , " +
"PARAM_TP NVARCHAR(50) NULL , " +
"END_SEND_MAIL NVARCHAR(100) NULL , " +
"DEL_FLG NVARCHAR(10) NULL " +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_HED
if (!table_exists('WFS_M_STRUCT_HED')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_HED " + "\n" +
" (" + "\n" +
" ID NVARCHAR(50) NOT NULL," + "\n" +
" TITLE NVARCHAR(100) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_HED " + "\n" +
" ADD CONSTRAINT PK_WFS_M_STRUCT_HED PRIMARY KEY NONCLUSTERED (ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_DTL
if (!table_exists('WFS_M_STRUCT_DTL')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_DTL " + "\n" +
" (" + "\n" +
" ID NVARCHAR(50) NOT NULL," + "\n" +
" SEQ NUMERIC(10) NOT NULL," + "\n" +
" CHILD_ID NVARCHAR(50) ," + "\n" +
" OYA_ID NVARCHAR(50) ," + "\n" +
" BOTTOM_FLG NVARCHAR(10) ," + "\n" +
" SYONIN_PTN NVARCHAR(20) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_DTL " + "\n" +
" ADD CONSTRAINT PK_WFS_M_STRUCT_DTL PRIMARY KEY NONCLUSTERED (ID, SEQ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_TEMP
if (!table_exists('WFS_W_STRUCT_TEMP')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_TEMP " + "\n" +
" (" + "\n" +
" JOB_ID NVARCHAR(50) NOT NULL," + "\n" +
" ID NVARCHAR(50) ," + "\n" +
" SEQ NUMERIC(10) NOT NULL," + "\n" +
" CHILD_ID NVARCHAR(50) ," + "\n" +
" OYA_ID NVARCHAR(50) ," + "\n" +
" BOTTOM_FLG NVARCHAR(10) ," + "\n" +
" SYONIN_PTN NVARCHAR(20) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_TEMP " + "\n" +
" ADD CONSTRAINT PK_WFS_W_STRUCT_TEMP PRIMARY KEY NONCLUSTERED (JOB_ID, SEQ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_LIST
if (!table_exists('WFS_W_STRUCT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_LIST " + "\n" +
" (" + "\n" +
" JOB_ID NVARCHAR(50) NOT NULL," + "\n" +
" ID NVARCHAR(50) ," + "\n" +
" SEQ NUMERIC(10) NOT NULL," + "\n" +
" SORT NVARCHAR(50) ," + "\n" +
" LVL NVARCHAR(10) ," + "\n" +
" OYA_ID NVARCHAR(50) ," + "\n" +
" CHILD_ID NVARCHAR(50) ," + "\n" +
" SYONIN_PTN NVARCHAR(20) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_LIST " + "\n" +
" ADD CONSTRAINT PK_WFS_W_STRUCT_LIST PRIMARY KEY NONCLUSTERED (JOB_ID, SEQ) " + "\n" +
"");
}
//--------------------------------------
//[変更]WFS_T_WORKFLOW
if (!field_exists('WFS_T_WORKFLOW','SHONIN_ID')) {
executeSQL(
"ALTER TABLE WFS_T_WORKFLOW ADD " +
"SHONIN_ID NVARCHAR(100) NULL , " +
"ACTIVE_FLG NVARCHAR(20) NULL , " +
"HOLD_FLG NVARCHAR(20) NULL " +
"");
}
//--------------------------------------
//[新規]WFS_W_STAT_LIST
if (!table_exists('WFS_W_STAT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STAT_LIST " + "\n" +
" (" + "\n" +
" WORK_ID NVARCHAR(100) NOT NULL ," + "\n" +
" OBJECT_ID NVARCHAR(100) NOT NULL ," + "\n" +
" LVL01_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL01_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL01_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL02_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL02_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL02_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL03_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL03_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL03_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL04_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL04_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL04_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL05_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL05_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL05_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL06_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL06_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL06_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL07_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL07_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL07_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL08_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL08_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL08_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL09_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL09_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL09_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL10_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL10_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL10_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL11_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL11_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL11_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL12_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL12_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL12_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL13_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL13_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL13_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL14_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL14_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL14_US NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL15_NM NVARCHAR(100) DEFAULT NULL ," + "\n" +
" LVL15_DT DATETIME DEFAULT NULL ," + "\n" +
" LVL15_US NVARCHAR(100) DEFAULT NULL " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STAT_LIST " + "\n" +
" ADD CONSTRAINT PK_WFS_W_STAT_LIST PRIMARY KEY NONCLUSTERED (WORK_ID, OBJECT_ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_USR_DAIRI
if (!table_exists('WFS_M_USR_DAIRI')) {
executeSQL(
" CREATE TABLE WFS_M_USR_DAIRI " + "\n" +
" (" + "\n" +
" USR_ID NVARCHAR(100) NOT NULL," + "\n" +
" DAIRI_USR_ID NVARCHAR(100) NOT NULL," + "\n" +
" SHINSEI_FLG NVARCHAR(10) ," + "\n" +
" SHONIN_FLG NVARCHAR(10) ," + "\n" +
" YUKO_KBN NVARCHAR(10) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_USR_DAIRI " + "\n" +
" ADD CONSTRAINT PK_WFS_M_USR_DAIRI PRIMARY KEY NONCLUSTERED (USR_ID, DAIRI_USR_ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKREMINDER
if (!table_exists('WFS_T_WORKREMINDER')) {
executeSQL(
" CREATE TABLE WFS_T_WORKREMINDER " + "\n" +
" (" + "\n" +
" WORK_ID NVARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID NVARCHAR(100) NOT NULL," + "\n" +
" STEP NUMERIC(10,0) NOT NULL," + "\n" +
" REMINDER_ID NVARCHAR(100) NOT NULL," + "\n" +
" ROUTE_ID NVARCHAR(100) ," + "\n" +
" LVL NUMERIC(10,0) ," + "\n" +
" RES_MEMO NVARCHAR(4000) ," + "\n" +
" SEND_ADDRESS NVARCHAR(500) ," + "\n" +
" SEND_TITLE NVARCHAR(500) ," + "\n" +
" SEND_TEXT NVARCHAR(4000) ," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKREMINDER " + "\n" +
" ADD CONSTRAINT PK_WFS_T_WORKREMINDER PRIMARY KEY NONCLUSTERED (WORK_ID, OBJECT_ID, STEP, REMINDER_ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKAPPROVALRES
if (!table_exists('WFS_T_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" WORK_ID NVARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID NVARCHAR(100) NOT NULL," + "\n" +
" LVL NUMERIC(10,0) NOT NULL," + "\n" +
" ROUTE_ID NVARCHAR(100) ," + "\n" +
" USR_GRP_ID NVARCHAR(100) ," + "\n" +
" USR_ID NVARCHAR(100) NOT NULL," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" ADD CONSTRAINT PK_WFS_T_WORKAPPROVALRES PRIMARY KEY NONCLUSTERED (WORK_ID, OBJECT_ID, LVL, USR_ID) " + "\n" +
"");
}
};
if ( TALON.getDbConfig().isPostgres() ) {
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_AUTH','SYONIN_PTN')) {
executeSQL(
"ALTER TABLE WFS_M_AUTH " +
"ADD SYONIN_PTN character varying(20) NULL " +
"");
}
//--------------------------------------
//[変更]WFS_M_CONTROL
if (!field_exists('WFS_M_CONTROL','APPROVAL_FLG')) {
executeSQL(
"ALTER TABLE WFS_M_CONTROL " +
"ALTER COLUMN MAIL_TEXT_KESSAI TYPE character varying(3000) , " +
"ALTER COLUMN MAIL_TEXT_SINSEI TYPE character varying(3000) , " +
"ALTER COLUMN MAIL_TEXT_SYONIN TYPE character varying(3000) , " +
"ALTER COLUMN MAIL_TEXT_HININ TYPE character varying(3000) " +
"");
executeSQL(
"ALTER TABLE WFS_M_CONTROL " +
"ADD APPROVAL_FLG character varying(20) NULL , " +
"ADD ROUTE_SET_KBN character varying(50) NULL , " +
"ADD ROUTE_STRUCT_ID character varying(50) NULL , " +
"ADD MAIL_TITLE_HININ2 character varying(100) NULL , " +
"ADD MAIL_TEXT_HININ2 character varying(3000) NULL , " +
"ADD MAIL_TITLE_SAISOKU character varying(100) NULL , " +
"ADD MAIL_TEXT_SAISOKU character varying(3000) NULL , " +
"ADD CATEGORY_ID character varying(50) NULL " +
"");
}
//--------------------------------------
//[変更]WFS_M_ROUTE_HED
if (!field_exists('WFS_M_ROUTE_HED','PARAM_FM')) {
executeSQL(
"ALTER TABLE WFS_M_ROUTE_HED " +
"ADD PARAM_FM character varying(50) NULL , " +
"ADD PARAM_VAL character varying(100) NULL , " +
"ADD PARAM_TP character varying(50) NULL , " +
"ADD END_SEND_MAIL character varying(100) NULL , " +
"ADD DEL_FLG character varying(10) NULL " +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_HED
if (!table_exists('WFS_M_STRUCT_HED')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_HED " + "\n" +
" (" + "\n" +
" ID character varying(50) NOT NULL," + "\n" +
" TITLE character varying(100) ," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_HED " + "\n" +
" ADD CONSTRAINT PK_WFS_M_STRUCT_HED PRIMARY KEY (ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_STRUCT_DTL
if (!table_exists('WFS_M_STRUCT_DTL')) {
executeSQL(
" CREATE TABLE WFS_M_STRUCT_DTL " + "\n" +
" (" + "\n" +
" ID character varying(50) NOT NULL," + "\n" +
" SEQ numeric(10,0) NOT NULL," + "\n" +
" CHILD_ID character varying(50) ," + "\n" +
" OYA_ID character varying(50) ," + "\n" +
" BOTTOM_FLG character varying(10) ," + "\n" +
" SYONIN_PTN character varying(20) ," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_STRUCT_DTL " + "\n" +
" ADD CONSTRAINT PK_WFS_M_STRUCT_DTL PRIMARY KEY (ID, SEQ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_TEMP
if (!table_exists('WFS_W_STRUCT_TEMP')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_TEMP " + "\n" +
" (" + "\n" +
" JOB_ID character varying(50) NOT NULL," + "\n" +
" ID character varying(50) ," + "\n" +
" SEQ numeric(10,0) NOT NULL," + "\n" +
" CHILD_ID character varying(50) ," + "\n" +
" OYA_ID character varying(50) ," + "\n" +
" BOTTOM_FLG character varying(10) ," + "\n" +
" SYONIN_PTN character varying(20) ," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_TEMP " + "\n" +
" ADD CONSTRAINT PK_WFS_W_STRUCT_TEMP PRIMARY KEY (JOB_ID, SEQ) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_STRUCT_LIST
if (!table_exists('WFS_W_STRUCT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STRUCT_LIST " + "\n" +
" (" + "\n" +
" JOB_ID character varying(50) NOT NULL," + "\n" +
" ID character varying(50) ," + "\n" +
" SEQ numeric(10,0) NOT NULL," + "\n" +
" SORT character varying(50) ," + "\n" +
" LVL character varying(10) ," + "\n" +
" OYA_ID character varying(50) ," + "\n" +
" CHILD_ID character varying(50) ," + "\n" +
" SYONIN_PTN character varying(20) ," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STRUCT_LIST " + "\n" +
" ADD CONSTRAINT PK_WFS_W_STRUCT_LIST PRIMARY KEY (JOB_ID, SEQ) " + "\n" +
"");
}
//--------------------------------------
//[変更]WFS_T_WORKFLOW
if (!field_exists('WFS_T_WORKFLOW','SHONIN_ID')) {
executeSQL(
"ALTER TABLE WFS_T_WORKFLOW " +
"ADD SHONIN_ID character varying(100) NULL , " +
"ADD ACTIVE_FLG character varying(20) NULL , " +
"ADD HOLD_FLG character varying(20) NULL " +
"");
}
//--------------------------------------
//[新規]WFS_W_STAT_LIST
if (!table_exists('WFS_W_STAT_LIST')) {
executeSQL(
" CREATE TABLE WFS_W_STAT_LIST " + "\n" +
" (" + "\n" +
" WORK_ID character varying(100) NOT NULL ," + "\n" +
" OBJECT_ID character varying(100) NOT NULL ," + "\n" +
" LVL01_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL01_DT timestamp DEFAULT NULL ," + "\n" +
" LVL01_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL02_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL02_DT timestamp DEFAULT NULL ," + "\n" +
" LVL02_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL03_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL03_DT timestamp DEFAULT NULL ," + "\n" +
" LVL03_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL04_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL04_DT timestamp DEFAULT NULL ," + "\n" +
" LVL04_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL05_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL05_DT timestamp DEFAULT NULL ," + "\n" +
" LVL05_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL06_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL06_DT timestamp DEFAULT NULL ," + "\n" +
" LVL06_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL07_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL07_DT timestamp DEFAULT NULL ," + "\n" +
" LVL07_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL08_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL08_DT timestamp DEFAULT NULL ," + "\n" +
" LVL08_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL09_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL09_DT timestamp DEFAULT NULL ," + "\n" +
" LVL09_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL10_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL10_DT timestamp DEFAULT NULL ," + "\n" +
" LVL10_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL11_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL11_DT timestamp DEFAULT NULL ," + "\n" +
" LVL11_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL12_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL12_DT timestamp DEFAULT NULL ," + "\n" +
" LVL12_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL13_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL13_DT timestamp DEFAULT NULL ," + "\n" +
" LVL13_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL14_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL14_DT timestamp DEFAULT NULL ," + "\n" +
" LVL14_US character varying(100) DEFAULT NULL ," + "\n" +
" LVL15_NM character varying(100) DEFAULT NULL ," + "\n" +
" LVL15_DT timestamp DEFAULT NULL ," + "\n" +
" LVL15_US character varying(100) DEFAULT NULL " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_STAT_LIST " + "\n" +
" ADD CONSTRAINT PK_WFS_W_STAT_LIST PRIMARY KEY (WORK_ID, OBJECT_ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_M_USR_DAIRI
if (!table_exists('WFS_M_USR_DAIRI')) {
executeSQL(
" CREATE TABLE WFS_M_USR_DAIRI " + "\n" +
" (" + "\n" +
" USR_ID character varying(100) NOT NULL," + "\n" +
" DAIRI_USR_ID character varying(100) NOT NULL," + "\n" +
" SHINSEI_FLG character varying(10) ," + "\n" +
" SHONIN_FLG character varying(10) ," + "\n" +
" YUKO_KBN character varying(10) ," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_M_USR_DAIRI " + "\n" +
" ADD CONSTRAINT PK_WFS_M_USR_DAIRI PRIMARY KEY (USR_ID, DAIRI_USR_ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKREMINDER
if (!table_exists('WFS_T_WORKREMINDER')) {
executeSQL(
" CREATE TABLE WFS_T_WORKREMINDER " + "\n" +
" (" + "\n" +
" WORK_ID character varying(100) NOT NULL," + "\n" +
" OBJECT_ID character varying(100) NOT NULL," + "\n" +
" STEP numeric(10,0) NOT NULL," + "\n" +
" REMINDER_ID character varying(100) NOT NULL," + "\n" +
" ROUTE_ID character varying(100) ," + "\n" +
" LVL numeric(10,0) ," + "\n" +
" RES_MEMO character varying(4000) ," + "\n" +
" SEND_ADDRESS character varying(500) ," + "\n" +
" SEND_TITLE character varying(500) ," + "\n" +
" SEND_TEXT character varying(4000) ," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKREMINDER " + "\n" +
" ADD CONSTRAINT PK_WFS_T_WORKREMINDER PRIMARY KEY (WORK_ID, OBJECT_ID, STEP, REMINDER_ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_T_WORKAPPROVALRES
if (!table_exists('WFS_T_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" WORK_ID character varying(100) NOT NULL," + "\n" +
" OBJECT_ID character varying(100) NOT NULL," + "\n" +
" LVL numeric(10,0) NOT NULL," + "\n" +
" ROUTE_ID character varying(100) ," + "\n" +
" USR_GRP_ID character varying(100) ," + "\n" +
" USR_ID character varying(100) NOT NULL," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_T_WORKAPPROVALRES " + "\n" +
" ADD CONSTRAINT PK_WFS_T_WORKAPPROVALRES PRIMARY KEY (WORK_ID, OBJECT_ID, LVL, USR_ID) " + "\n" +
"");
}
};
}
function exec_ver_up_patch_14_DataPatch(){
//データパッチ処理 : バージョンアップに伴いデータ修正が必要となった際のパッチ処理
//------------------------------
// WFS_T_WORKFLOW の ACTIVE_FLG
// function patch_WORKFLOW_ACTIVE_FLG()
//-------
var sql = "" +
"SELECT WORK_ID , OBJECT_ID FROM WFS_T_WORKFLOW " +
"WHERE ACTIVE_FLG IS NULL " +
"GROUP BY WORK_ID , OBJECT_ID ";
var itemSelectListMain = TalonDbUtil.select( TALON.getDbConfig(), sql );
for (var i = 0; i < itemSelectListMain.length; i++) {
var lineDataMap = itemSelectListMain[i];
var _WORK_ID = getMapVal( lineDataMap , 'WORK_ID' );
var _OBJECT_ID = getMapVal( lineDataMap , 'OBJECT_ID' );
//ひとまず全ACTIVE_FLGを1にセット
var sql = "" +
"UPDATE WFS_T_WORKFLOW SET ACTIVE_FLG = '1' " +
"WHERE WORK_ID = '" + _WORK_ID + "' " +
" AND OBJECT_ID = '" + _OBJECT_ID + "' ";
TalonDbUtil.update( TALON.getDbConfig(), sql );
var sql = "" +
"SELECT WORK_ID , OBJECT_ID , STEP , STATUS , LVL FROM WFS_T_WORKFLOW " +
"WHERE WORK_ID = '" + _WORK_ID + "' " +
" AND OBJECT_ID = '" + _OBJECT_ID + "' " +
"ORDER BY STEP ";
var itemSelectListSub = TalonDbUtil.select( TALON.getDbConfig(), sql );
for (var ii = 0; ii < itemSelectListSub.length; ii++) {
var lineDataMap = itemSelectListSub[ii];
// * var _STEP = lineDataMap['STEP'];
// * var _STATUS = lineDataMap['STATUS'];
// * var _LVL = lineDataMap['LVL'];
var _STEP = getMapVal( lineDataMap , 'STEP' );
var _STATUS = getMapVal( lineDataMap , 'STATUS' );
var _LVL = getMapVal( lineDataMap , 'LVL' );
//自分より下のSTEPで、自分のLVL以上のデータはACTIVE_FLGを0
var sql = "" +
"UPDATE WFS_T_WORKFLOW SET ACTIVE_FLG = '0' " +
"WHERE WORK_ID = '" + _WORK_ID + "' " +
" AND OBJECT_ID = '" + _OBJECT_ID + "' " +
" AND STEP < " + _STEP + " " +
" AND LVL >= " + _LVL + " ";
TalonDbUtil.update( TALON.getDbConfig(), sql );
}
}
// WFS_M_CONTROL の CATEGORY_ID (nullのデータについて99を更新)
//
//-------
TalonDbUtil.update( TALON.getDbConfig(), "UPDATE WFS_M_CONTROL SET CATEGORY_ID = '99' WHERE CATEGORY_ID IS NULL ");
TalonDbUtil.update( TALON.getDbConfig(), "UPDATE WFS_M_CONTROL SET APPROVAL_FLG = '0' WHERE APPROVAL_FLG IS NULL ");
TalonDbUtil.update( TALON.getDbConfig(), "UPDATE WFS_M_CONTROL SET ROUTE_SET_KBN = '0' WHERE ROUTE_SET_KBN IS NULL ");
}
//--------------------------------------------
// Ver1.7へのバージョンアップ
//--------------------------------------------
function exec_ver_up_17( _func_chk ){
//テーブルの追加
exec_ver_up_17_TableModify();
//データのパッチ(補填)
exec_ver_up_patch_17_DataPatch();
}
function exec_ver_up_17_TableModify(){
//テーブル変更、追加処理
//------------------------------
if ( TALON.getDbConfig().isOra() ) {
//--------------------------------------
//[新規]WFS_W_WORKFLOW
if (!table_exists('WFS_W_WORKFLOW')) {
executeSQL(
" CREATE TABLE WFS_W_WORKFLOW " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR2(100) NOT NULL," + "\n" +
" WORK_ID VARCHAR2(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR2(100) NOT NULL," + "\n" +
" STEP NUMBER(10,0) NOT NULL," + "\n" +
" OBJECT_NM VARCHAR2(500)," + "\n" +
" ROUTE_ID VARCHAR2(100)," + "\n" +
" USR_ID VARCHAR2(100)," + "\n" +
" STATUS VARCHAR2(20)," + "\n" +
" LVL NUMBER(10,0)," + "\n" +
" APP_MEMO VARCHAR2(4000)," + "\n" +
" RES_MEMO VARCHAR2(4000)," + "\n" +
" REJECT_KBN VARCHAR2(20)," + "\n" +
" CURENT_FLG VARCHAR2(20)," + "\n" +
" CREATED_DATE DATE," + "\n" +
" CREATED_BY VARCHAR2(50)," + "\n" +
" CREATED_PRG_NM VARCHAR2(50)," + "\n" +
" UPDATED_DATE DATE," + "\n" +
" UPDATED_BY VARCHAR2(50)," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50)," + "\n" +
" MODIFY_COUNT NUMBER(10,0)," + "\n" +
" SHONIN_ID VARCHAR2(100)," + "\n" +
" ACTIVE_FLG VARCHAR2(20)," + "\n" +
" HOLD_FLG VARCHAR2(20) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKFLOW " + "\n" +
" ADD(CONSTRAINT PK_WFS_W_WORKFLOW PRIMARY KEY (JOB_ID) USING INDEX)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_WORKAPPROVALRES
if (!table_exists('WFS_W_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR2(100) NOT NULL," + "\n" +
" WORK_ID VARCHAR2(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR2(100) NOT NULL," + "\n" +
" LVL DECIMAL(10,0) NOT NULL," + "\n" +
" ROUTE_ID VARCHAR2(100) ," + "\n" +
" USR_GRP_ID VARCHAR2(100) ," + "\n" +
" USR_ID VARCHAR2(100) NOT NULL," + "\n" +
" CREATED_DATE DATE ," + "\n" +
" CREATED_BY VARCHAR2(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR2(50) ," + "\n" +
" UPDATED_DATE DATE ," + "\n" +
" UPDATED_BY VARCHAR2(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR2(50) ," + "\n" +
" MODIFY_COUNT NUMBER(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" ADD ( CONSTRAINT PK_WFS_W_WORKAPPROVALRES PRIMARY KEY (JOB_ID, WORK_ID, OBJECT_ID, LVL, USR_ID) USING INDEX ) " + "\n" +
"");
}
}
if ( TALON.getDbConfig().isMy() ) {
//--------------------------------------
//[新規]WFS_W_WORKFLOW
if (!table_exists('WFS_W_WORKFLOW ')) {
executeSQL(
" CREATE TABLE WFS_W_WORKFLOW " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR(100) NOT NULL," + "\n" +
" WORK_ID VARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR(100) NOT NULL," + "\n" +
" STEP DECIMAL(10,0) NOT NULL," + "\n" +
" OBJECT_NM VARCHAR(500)," + "\n" +
" ROUTE_ID VARCHAR(100)," + "\n" +
" USR_ID VARCHAR(100)," + "\n" +
" STATUS VARCHAR(20)," + "\n" +
" LVL DECIMAL(10,0)," + "\n" +
" APP_MEMO TEXT," + "\n" +
" RES_MEMO TEXT," + "\n" +
" REJECT_KBN VARCHAR(20)," + "\n" +
" CURENT_FLG VARCHAR(20)," + "\n" +
" CREATED_DATE DATETIME," + "\n" +
" CREATED_BY VARCHAR(50)," + "\n" +
" CREATED_PRG_NM VARCHAR(50)," + "\n" +
" UPDATED_DATE DATETIME," + "\n" +
" UPDATED_BY VARCHAR(50)," + "\n" +
" UPDATED_PRG_NM VARCHAR(50)," + "\n" +
" MODIFY_COUNT BIGINT(10)," + "\n" +
" SHONIN_ID VARCHAR(100)," + "\n" +
" ACTIVE_FLG VARCHAR(20)," + "\n" +
" HOLD_FLG VARCHAR(20) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKFLOW " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (JOB_ID)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_WORKAPPROVALRES
if (!table_exists('WFS_W_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" JOB_ID VARCHAR(100) NOT NULL," + "\n" +
" WORK_ID VARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID VARCHAR(100) NOT NULL," + "\n" +
" LVL DECIMAL(10,0) NOT NULL," + "\n" +
" ROUTE_ID VARCHAR(100) ," + "\n" +
" USR_GRP_ID VARCHAR(100) ," + "\n" +
" USR_ID VARCHAR(100) NOT NULL," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY VARCHAR(50) ," + "\n" +
" CREATED_PRG_NM VARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY VARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM VARCHAR(50) ," + "\n" +
" MODIFY_COUNT BIGINT(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" ADD CONSTRAINT PRIMARY KEY (JOB_ID, WORK_ID, OBJECT_ID, LVL, USR_ID)" + "\n" +
"");
}
};
if ( TALON.getDbConfig().isMssql() ) {
//--------------------------------------
//[新規]WFS_W_WORKFLOW
if (!table_exists('WFS_W_WORKFLOW ')) {
executeSQL(
" CREATE TABLE WFS_W_WORKFLOW " + "\n" +
" (" + "\n" +
" JOB_ID NVARCHAR(100) NOT NULL," + "\n" +
" WORK_ID NVARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID NVARCHAR(100) NOT NULL," + "\n" +
" STEP NUMERIC(10,0) NOT NULL," + "\n" +
" OBJECT_NM NVARCHAR(500) NULL," + "\n" +
" ROUTE_ID NVARCHAR(100) NULL," + "\n" +
" USR_ID NVARCHAR(100) NULL," + "\n" +
" STATUS NVARCHAR(20) NULL," + "\n" +
" LVL NUMERIC(10,0) NULL," + "\n" +
" APP_MEMO NVARCHAR(4000) NULL," + "\n" +
" RES_MEMO NVARCHAR(4000) NULL," + "\n" +
" REJECT_KBN NVARCHAR(20) NULL," + "\n" +
" CURENT_FLG NVARCHAR(20) NULL," + "\n" +
" CREATED_DATE DATETIME NULL," + "\n" +
" CREATED_BY NVARCHAR(50) NULL," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) NULL," + "\n" +
" UPDATED_DATE DATETIME NULL," + "\n" +
" UPDATED_BY NVARCHAR(50) NULL," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) NULL," + "\n" +
" MODIFY_COUNT NUMERIC(10,0) NULL," + "\n" +
" SHONIN_ID NVARCHAR(100)," + "\n" +
" ACTIVE_FLG NVARCHAR(20)," + "\n" +
" HOLD_FLG NVARCHAR(20) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKFLOW " + "\n" +
" ADD CONSTRAINT PK_WFS_W_WORKFLOW PRIMARY KEY NONCLUSTERED (JOB_ID)" + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_WORKAPPROVALRES
if (!table_exists('WFS_W_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" JOB_ID NVARCHAR(100) NOT NULL," + "\n" +
" WORK_ID NVARCHAR(100) NOT NULL," + "\n" +
" OBJECT_ID NVARCHAR(100) NOT NULL," + "\n" +
" LVL NUMERIC(10,0) NOT NULL," + "\n" +
" ROUTE_ID NVARCHAR(100) ," + "\n" +
" USR_GRP_ID NVARCHAR(100) ," + "\n" +
" USR_ID NVARCHAR(100) NOT NULL," + "\n" +
" CREATED_DATE DATETIME ," + "\n" +
" CREATED_BY NVARCHAR(50) ," + "\n" +
" CREATED_PRG_NM NVARCHAR(50) ," + "\n" +
" UPDATED_DATE DATETIME ," + "\n" +
" UPDATED_BY NVARCHAR(50) ," + "\n" +
" UPDATED_PRG_NM NVARCHAR(50) ," + "\n" +
" MODIFY_COUNT NUMERIC(10) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" ADD CONSTRAINT PK_WFS_W_WORKAPPROVALRES PRIMARY KEY NONCLUSTERED (JOB_ID, WORK_ID, OBJECT_ID, LVL, USR_ID) " + "\n" +
"");
}
};
if ( TALON.getDbConfig().isPostgres() ) {
//--------------------------------------
//[新規]WFS_W_WORKFLOW
if (!table_exists('WFS_W_WORKFLOW')) {
executeSQL(
" CREATE TABLE WFS_W_WORKFLOW " + "\n" +
" (" + "\n" +
" JOB_ID character varying(100) NOT NULL," + "\n" +
" WORK_ID character varying(100) NOT NULL," + "\n" +
" OBJECT_ID character varying(100) NOT NULL," + "\n" +
" STEP numeric(10,0) NOT NULL," + "\n" +
" OBJECT_NM character varying(500)," + "\n" +
" ROUTE_ID character varying(100)," + "\n" +
" USR_ID character varying(100)," + "\n" +
" STATUS character varying(20)," + "\n" +
" LVL numeric(10,0)," + "\n" +
" APP_MEMO character varying(4000)," + "\n" +
" RES_MEMO character varying(4000)," + "\n" +
" REJECT_KBN character varying(20)," + "\n" +
" CURENT_FLG character varying(20)," + "\n" +
" CREATED_DATE timestamp," + "\n" +
" CREATED_BY character varying(50)," + "\n" +
" CREATED_PRG_NM character varying(50)," + "\n" +
" UPDATED_DATE timestamp," + "\n" +
" UPDATED_BY character varying(50)," + "\n" +
" UPDATED_PRG_NM character varying(50)," + "\n" +
" MODIFY_COUNT numeric(10,0)," + "\n" +
" SHONIN_ID character varying(100)," + "\n" +
" ACTIVE_FLG character varying(20)," + "\n" +
" HOLD_FLG character varying(20) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKFLOW " + "\n" +
" ADD CONSTRAINT PK_WFS_W_WORKFLOW PRIMARY KEY (JOB_ID) " + "\n" +
"");
}
//--------------------------------------
//[新規]WFS_W_WORKAPPROVALRES
if (!table_exists('WFS_W_WORKAPPROVALRES')) {
executeSQL(
" CREATE TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" (" + "\n" +
" JOB_ID character varying(100) NOT NULL," + "\n" +
" WORK_ID character varying(100) NOT NULL," + "\n" +
" OBJECT_ID character varying(100) NOT NULL," + "\n" +
" LVL numeric(10,0) NOT NULL," + "\n" +
" ROUTE_ID character varying(100) ," + "\n" +
" USR_GRP_ID character varying(100) ," + "\n" +
" USR_ID character varying(100) NOT NULL," + "\n" +
" CREATED_DATE timestamp ," + "\n" +
" CREATED_BY character varying(50) ," + "\n" +
" CREATED_PRG_NM character varying(50) ," + "\n" +
" UPDATED_DATE timestamp ," + "\n" +
" UPDATED_BY character varying(50) ," + "\n" +
" UPDATED_PRG_NM character varying(50) ," + "\n" +
" MODIFY_COUNT numeric(10,0) " + "\n" +
" )" + "\n" +
"");
//--------------------
executeSQL(
" ALTER TABLE WFS_W_WORKAPPROVALRES " + "\n" +
" ADD CONSTRAINT PK_WFS_W_WORKAPPROVALRES PRIMARY KEY (JOB_ID, WORK_ID, OBJECT_ID, LVL, USR_ID) " + "\n" +
"");
}
};
}
function exec_ver_up_patch_17_DataPatch(){
}
function exec_create_Function() {
//≪FUNCTION DROP≫
//--------------------
//[FUNCTION]WFS_ALL_MAIL
function_exists_drop('WFS_ALL_MAIL');
//[FUNCTION]WFS_AUTH_SHINSEI
function_exists_drop('WFS_AUTH_SHINSEI');
//[FUNCTION]WFS_WF_EXISTS
function_exists_drop('WFS_WF_EXISTS');
//[FUNCTION]Ver14追加分 WFS_AUTH_MAIN
function_exists_drop('WFS_AUTH_MAIN');
//[FUNCTION]Ver14追加分 WFS_AUTH_SHONIN
function_exists_drop('WFS_AUTH_SHONIN');
//[FUNCTION]Ver14追加分 WFS_WF_STEP
function_exists_drop('WFS_WF_STEP');
if ( TALON.getDbConfig().isOra() ) {
//--------------------
//WFS_ALL_MAIL
executeSQL(
"CREATE FUNCTION WFS_ALL_MAIL( " + "\n" +
" P_USR_GRP_ID IN VARCHAR2 " + "\n" +
" ,P_USR_ID IN VARCHAR2 " + "\n" +
" ,P_WORK_ID IN VARCHAR2 " + "\n" +
" ,P_OBJECT_ID IN VARCHAR2 " + "\n" +
" ,P_LVL IN DECIMAL " + "\n" +
" ) " + "\n" +
"RETURN VARCHAR2 " + "\n" +
"AS " + "\n" +
" REC VARCHAR2(4000); " + "\n" +
" TMP VARCHAR2(100); " + "\n" +
"BEGIN " + "\n" +
" REC := NULL; " + "\n" +
" TMP := NULL; " + "\n" +
" " + "\n" +
" DECLARE " + "\n" +
" CURSOR CUR_MAIL IS " + "\n" +
" SELECT " + "\n" +
" WFS_M_USR_GRP_DEPDTL.MAIL as MAIL " + "\n" +
" FROM WFS_M_USR_GRP_DEPDTL " + "\n" +
" LEFT OUTER JOIN ( " + "\n" +
" SELECT " + "\n" +
" COUNT(*) AS CNT " + "\n" +
" FROM WFS_T_WORKAPPROVALRES " + "\n" +
" WHERE WORK_ID = P_WORK_ID " + "\n" +
" AND OBJECT_ID = P_OBJECT_ID " + "\n" +
" AND LVL = P_LVL " + "\n" +
" ) WFS_T_WORKAPPROVALRES_CNT " + "\n" +
" ON 1 = 1 " + "\n" +
" LEFT OUTER JOIN ( " + "\n" +
" SELECT " + "\n" +
" USR_ID " + "\n" +
" FROM WFS_T_WORKAPPROVALRES " + "\n" +
" WHERE WORK_ID = P_WORK_ID " + "\n" +
" AND OBJECT_ID = P_OBJECT_ID " + "\n" +
" AND LVL = P_LVL " + "\n" +
" ) WFS_T_WORKAPPROVALRES " + "\n" +
" ON WFS_M_USR_GRP_DEPDTL.USR_ID = WFS_T_WORKAPPROVALRES.USR_ID " + "\n" +
" WHERE WFS_M_USR_GRP_DEPDTL.USR_GRP_ID = P_USR_GRP_ID " + "\n" +
" AND (WFS_M_USR_GRP_DEPDTL.USR_ID = P_USR_ID OR P_USR_ID IS NULL) " + "\n" +
" AND ( " + "\n" +
" WFS_T_WORKAPPROVALRES_CNT.CNT IS NULL " + "\n" +
" OR " + "\n" +
" WFS_T_WORKAPPROVALRES_CNT.CNT = 0 " + "\n" +
" OR " + "\n" +
" ( " + "\n" +
" WFS_T_WORKAPPROVALRES_CNT.CNT IS NOT NULL " + "\n" +
" AND " + "\n" +
" WFS_M_USR_GRP_DEPDTL.USR_ID = WFS_T_WORKAPPROVALRES.USR_ID " + "\n" +
" ) " + "\n" +
" ); " + "\n" +
" BEGIN " + "\n" +
" FOR RCD IN CUR_MAIL LOOP " + "\n" +
" IF (RCD.MAIL IS NOT NULL) THEN " + "\n" +
" IF (REC IS NULL) THEN " + "\n" +
" REC := RCD.MAIL; " + "\n" +
" ELSE " + "\n" +
" REC := REC || ',' || RCD.MAIL; " + "\n" +
" END IF; " + "\n" +
" END IF; " + "\n" +
" END LOOP; " + "\n" +
" END; " + "\n" +
" " + "\n" +
" RETURN REC; " + "\n" +
" " + "\n" +
"END WFS_ALL_MAIL; " + "\n" +
""
);
//--------------------
//WFS_AUTH_MAIN
executeSQL(
"CREATE FUNCTION WFS_AUTH_MAIN( " + "\n" +
" P_WORK_ID IN VARCHAR " + "\n" +
" ,P_ROUTE_ID IN VARCHAR " + "\n" +
" ,P_USR_ID IN VARCHAR " + "\n" +
" ,P_LVL IN DECIMAL " + "\n" +
" ,P_KBN IN VARCHAR " + "\n" +
" ) " + "\n" +
"RETURN VARCHAR2 " + "\n" +
"AS " + "\n" +
" -- P_KBN 1:申請 2:承認 " + "\n" +
" REC VARCHAR2(20); " + "\n" +
"BEGIN " + "\n" +
" REC := NULL; " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" CASE " + "\n" +
" WHEN COUNT(*) = 0 THEN '0' " + "\n" +
" ELSE '1' " + "\n" +
" END STATUS INTO REC " + "\n" +
" FROM ( " + "\n" +
" SELECT " + "\n" +
" WFS_M_AUTH.WORK_ID " + "\n" +
" ,WFS_M_AUTH.ROUTE_ID " + "\n" +
" ,WFS_M_AUTH.LVL " + "\n" +
" ,WFS_M_USR_GRP_DEPDTL.USR_ID " + "\n" +
" ,'0' AS KBN " + "\n" +
" ,'' AS SEIKI_USR_ID " + "\n" +
" FROM WFS_M_AUTH " + "\n" +
" INNER JOIN WFS_M_USR_GRP_DEPDTL " + "\n" +
" ON WFS_M_USR_GRP_DEPDTL.USR_GRP_ID = WFS_M_AUTH.USR_GRP_ID " + "\n" +
" " + "\n" +
" UNION ALL " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" WFS_M_AUTH.WORK_ID " + "\n" +
" ,WFS_M_AUTH.ROUTE_ID " + "\n" +
" ,WFS_M_AUTH.LVL " + "\n" +
" ,WFS_M_USR_DAIRI.DAIRI_USR_ID AS USR_ID " + "\n" +
" ,'1' AS KBN " + "\n" +
" ,WFS_M_USR_DAIRI.USR_ID AS SEIKI_USR_ID " + "\n" +
" FROM WFS_M_AUTH " + "\n" +
" INNER JOIN WFS_M_USR_GRP_DEPDTL " + "\n" +
" ON WFS_M_AUTH.USR_GRP_ID = WFS_M_USR_GRP_DEPDTL.USR_GRP_ID " + "\n" +
" INNER JOIN WFS_M_USR_DAIRI " + "\n" +
" ON WFS_M_USR_GRP_DEPDTL.USR_ID = WFS_M_USR_DAIRI.USR_ID " + "\n" +
" AND WFS_M_USR_DAIRI.YUKO_KBN = '1' " + "\n" +
" AND WFS_M_USR_DAIRI.SHINSEI_FLG = CASE WHEN P_KBN = '1' THEN '1' ELSE '0' END " + "\n" +
" AND WFS_M_USR_DAIRI.SHONIN_FLG = CASE WHEN P_KBN = '2' THEN '1' ELSE '0' END " + "\n" +
" ) MN " + "\n" +
" WHERE MN.WORK_ID = P_WORK_ID " + "\n" +
" AND MN.ROUTE_ID = P_ROUTE_ID " + "\n" +
" AND MN.LVL = P_LVL " + "\n" +
" AND MN.USR_ID = P_USR_ID " + "\n" +
" ; " + "\n" +
" " + "\n" +
" RETURN REC; " + "\n" +
" " + "\n" +
" END WFS_AUTH_MAIN; " + "\n" +
""
);
//--------------------
//WFS_AUTH_SHINSEI
executeSQL(
"CREATE FUNCTION WFS_AUTH_SHINSEI ( " + "\n" +
" P_WORK_ID VARCHAR2 " + "\n" +
" ,P_ROUTE_ID VARCHAR2 " + "\n" +
" ,P_USR_ID VARCHAR2 " + "\n" +
") " + "\n" +
"RETURN VARCHAR2 " + "\n" +
"AS " + "\n" +
" REC VARCHAR2(20); " + "\n" +
"BEGIN " + "\n" +
" REC := WFS_AUTH_MAIN(P_WORK_ID,P_ROUTE_ID,P_USR_ID,1,'1'); " + "\n" +
" RETURN REC; " + "\n" +
"END WFS_AUTH_SHINSEI; " + "\n" +
""
);
//--------------------
//WFS_AUTH_SHINSEI
executeSQL(
"CREATE FUNCTION WFS_AUTH_SHONIN ( " + "\n" +
" P_WORK_ID VARCHAR2 " + "\n" +
" ,P_ROUTE_ID VARCHAR2 " + "\n" +
" ,P_USR_ID VARCHAR2 " + "\n" +
" ,P_LVL DECIMAL " + "\n" +
") " + "\n" +
"RETURN VARCHAR2 " + "\n" +
"AS " + "\n" +
" REC VARCHAR2(20); " + "\n" +
"BEGIN " + "\n" +
" REC := WFS_AUTH_MAIN(P_WORK_ID,P_ROUTE_ID,P_USR_ID,P_LVL,'2'); " + "\n" +
" RETURN REC; " + "\n" +
"END WFS_AUTH_SHONIN; " + "\n" +
""
);
//--------------------
//WFS_WF_EXISTS
executeSQL(
"CREATE FUNCTION WFS_WF_EXISTS( " + "\n" +
" P_WORK_ID VARCHAR2 " + "\n" +
" ,P_OBJECT_ID VARCHAR2 " + "\n" +
") " + "\n" +
"RETURN VARCHAR2 " + "\n" +
"AS " + "\n" +
" REC VARCHAR2(20); " + "\n" +
"BEGIN " + "\n" +
" REC := NULL; " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" CASE " + "\n" +
" WHEN COUNT(*) = 0 THEN '0' " + "\n" +
" ELSE '1' " + "\n" +
" END STATUS INTO REC " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" WHERE WORK_ID = P_WORK_ID " + "\n" +
" AND OBJECT_ID = P_OBJECT_ID " + "\n" +
" ; " + "\n" +
" " + "\n" +
" IF (REC = '1') THEN " + "\n" +
" SELECT " + "\n" +
" CASE " + "\n" +
" WHEN WFS_T_WORKFLOW.LVL = 1 AND STATUS <> '6' THEN '1' " + "\n" +
" WHEN WFS_T_WORKFLOW.LVL = 1 AND STATUS = '6' THEN '4' " + "\n" +
" WHEN WFS_LEVEL.LVL = WFS_T_WORKFLOW.LVL AND WFS_T_WORKFLOW.STATUS = '2' THEN '3' " + "\n" +
" WHEN WFS_T_WORKFLOW.STATUS = '9' THEN '9' " + "\n" +
" ELSE '2' " + "\n" +
" END STATUS INTO REC " + "\n" +
" FROM ( " + "\n" +
" SELECT " + "\n" +
" S1.WORK_ID " + "\n" +
" ,S1.OBJECT_ID " + "\n" +
" ,S1.STEP " + "\n" +
" ,S1.LVL " + "\n" +
" ,S1.STATUS " + "\n" +
" ,S1.ROUTE_ID " + "\n" +
" FROM WFS_T_WORKFLOW S1 " + "\n" +
" INNER JOIN ( " + "\n" +
" SELECT " + "\n" +
" WORK_ID " + "\n" +
" ,OBJECT_ID " + "\n" +
" ,MAX(STEP) AS STEP " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" GROUP BY " + "\n" +
" WORK_ID " + "\n" +
" ,OBJECT_ID " + "\n" +
" ) S2 " + "\n" +
" ON S2.WORK_ID = S1.WORK_ID " + "\n" +
" AND S2.OBJECT_ID = S1.OBJECT_ID " + "\n" +
" AND S2.STEP = S1.STEP " + "\n" +
" ) WFS_T_WORKFLOW " + "\n" +
" LEFT OUTER JOIN WFS_M_CONTROL " + "\n" +
" ON WFS_M_CONTROL.WORK_ID = WFS_T_WORKFLOW.WORK_ID " + "\n" +
" LEFT OUTER JOIN ( SELECT WORK_ID, ROUTE_ID, MAX(LVL) AS LVL FROM WFS_M_AUTH GROUP BY WORK_ID, ROUTE_ID ) WFS_LEVEL " + "\n" +
" ON WFS_LEVEL.WORK_ID = WFS_T_WORKFLOW.WORK_ID " + "\n" +
" AND WFS_LEVEL.ROUTE_ID = WFS_T_WORKFLOW.ROUTE_ID " + "\n" +
" WHERE WFS_T_WORKFLOW.WORK_ID = P_WORK_ID " + "\n" +
" AND WFS_T_WORKFLOW.OBJECT_ID = P_OBJECT_ID " + "\n" +
" ; " + "\n" +
" END IF; " + "\n" +
" " + "\n" +
" RETURN REC; " + "\n" +
" " + "\n" +
"END WFS_WF_EXISTS; " + "\n" +
""
);
//--------------------
//WFS_WF_STEP
executeSQL(
"CREATE FUNCTION WFS_WF_STEP ( " + "\n" +
" P_WORK_ID VARCHAR2 " + "\n" +
" ,P_OBJECT_ID VARCHAR2 " + "\n" +
" ) " + "\n" +
"RETURN DECIMAL " + "\n" +
"AS " + "\n" +
" REC DECIMAL(10,0); " + "\n" +
"BEGIN " + "\n" +
" REC := 0; " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" MAX(STEP) AS STEP " + "\n" +
" INTO REC " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" WHERE WORK_ID = P_WORK_ID " + "\n" +
" AND OBJECT_ID = P_OBJECT_ID " + "\n" +
" ; " + "\n" +
" " + "\n" +
" RETURN REC; " + "\n" +
" " + "\n" +
"END WFS_WF_STEP; " + "\n" +
""
);
};
if ( TALON.getDbConfig().isMy() ) {
//SQLファイルで作成
};
if ( TALON.getDbConfig().isMssql() ) {
//--------------------
//WFS_ALL_MAIL
executeSQL(
" CREATE FUNCTION [dbo].[WFS_ALL_MAIL]( " + "\n" +
" @P_USR_GRP_ID VARCHAR(100) " + "\n" +
" ,@P_USR_ID VARCHAR(100) " + "\n" +
" ,@P_WORK_ID VARCHAR(100) " + "\n" +
" ,@P_OBJECT_ID VARCHAR(100) " + "\n" +
" ,@P_LVL DECIMAL(10,0) " + "\n" +
" ) RETURNS VARCHAR(4000) AS " + "\n" +
" BEGIN " + "\n" +
" DECLARE @TMP VARCHAR(100) " + "\n" +
" DECLARE @REC VARCHAR(4000) " + "\n" +
" " + "\n" +
" SET @REC = NULL " + "\n" +
" " + "\n" +
" " + "\n" +
" DECLARE CUR_MAIL CURSOR FOR " + "\n" +
" SELECT " + "\n" +
" WFS_M_USR_GRP_DEPDTL.MAIL as MAIL " + "\n" +
" FROM WFS_M_USR_GRP_DEPDTL " + "\n" +
" LEFT OUTER JOIN ( " + "\n" +
" SELECT " + "\n" +
" COUNT(*) AS CNT " + "\n" +
" FROM WFS_T_WORKAPPROVALRES " + "\n" +
" WHERE WORK_ID = @P_WORK_ID " + "\n" +
" AND OBJECT_ID = @P_OBJECT_ID " + "\n" +
" AND LVL = @P_LVL " + "\n" +
" ) WFS_T_WORKAPPROVALRES_CNT " + "\n" +
" ON 1 = 1 " + "\n" +
" LEFT OUTER JOIN ( " + "\n" +
" SELECT " + "\n" +
" USR_ID " + "\n" +
" FROM WFS_T_WORKAPPROVALRES " + "\n" +
" WHERE WORK_ID = @P_WORK_ID " + "\n" +
" AND OBJECT_ID = @P_OBJECT_ID " + "\n" +
" AND LVL = @P_LVL " + "\n" +
" ) WFS_T_WORKAPPROVALRES " + "\n" +
" ON WFS_M_USR_GRP_DEPDTL.USR_ID = WFS_T_WORKAPPROVALRES.USR_ID " + "\n" +
" WHERE WFS_M_USR_GRP_DEPDTL.USR_GRP_ID = @P_USR_GRP_ID " + "\n" +
" AND (WFS_M_USR_GRP_DEPDTL.USR_ID = @P_USR_ID OR @P_USR_ID IS NULL) " + "\n" +
" AND ( " + "\n" +
" WFS_T_WORKAPPROVALRES_CNT.CNT IS NULL " + "\n" +
" OR " + "\n" +
" WFS_T_WORKAPPROVALRES_CNT.CNT = 0 " + "\n" +
" OR " + "\n" +
" ( " + "\n" +
" WFS_T_WORKAPPROVALRES_CNT.CNT IS NOT NULL " + "\n" +
" AND " + "\n" +
" WFS_M_USR_GRP_DEPDTL.USR_ID = WFS_T_WORKAPPROVALRES.USR_ID " + "\n" +
" ) " + "\n" +
" ) " + "\n" +
" " + "\n" +
" OPEN CUR_MAIL " + "\n" +
" " + "\n" +
" FETCH NEXT FROM CUR_MAIL INTO @TMP " + "\n" +
" " + "\n" +
" WHILE @@FETCH_STATUS = 0 " + "\n" +
" BEGIN " + "\n" +
" IF (@TMP IS NOT NULL) " + "\n" +
" BEGIN " + "\n" +
" IF (@REC IS NOT NULL) " + "\n" +
" BEGIN " + "\n" +
" SET @REC = @REC + ',' + @TMP " + "\n" +
" END " + "\n" +
" IF (@REC IS NULL) " + "\n" +
" BEGIN " + "\n" +
" SET @REC = @TMP " + "\n" +
" END " + "\n" +
" END " + "\n" +
" FETCH NEXT FROM CUR_MAIL INTO @TMP " + "\n" +
" END " + "\n" +
" CLOSE CUR_MAIL " + "\n" +
" DEALLOCATE CUR_MAIL " + "\n" +
" " + "\n" +
" RETURN @REC " + "\n" +
" END " + "\n" +
""
);
//--------------------
//WFS_AUTH_MAIN
executeSQL(
" CREATE FUNCTION [dbo].[WFS_AUTH_MAIN]( " + "\n" +
" @P_WORK_ID VARCHAR(100) " + "\n" +
" ,@P_ROUTE_ID VARCHAR(100) " + "\n" +
" ,@P_USR_ID VARCHAR(100) " + "\n" +
" ,@P_LVL DECIMAL(10,0) " + "\n" +
" ,@P_KBN VARCHAR(10) " + "\n" +
" ) RETURNS VARCHAR(100) AS " + "\n" +
" BEGIN " + "\n" +
" DECLARE @TMP VARCHAR(100) " + "\n" +
" DECLARE @REC VARCHAR(20) " + "\n" +
" " + "\n" +
" SET @REC = NULL " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" @REC = " + "\n" +
" CASE " + "\n" +
" WHEN COUNT(*) = 0 THEN '0' " + "\n" +
" ELSE '1' " + "\n" +
" END " + "\n" +
" FROM ( " + "\n" +
" SELECT " + "\n" +
" WFS_M_AUTH.WORK_ID " + "\n" +
" ,WFS_M_AUTH.ROUTE_ID " + "\n" +
" ,WFS_M_AUTH.LVL " + "\n" +
" ,WFS_M_USR_GRP_DEPDTL.USR_ID " + "\n" +
" ,'0' AS KBN " + "\n" +
" ,'' AS SEIKI_USR_ID " + "\n" +
" FROM WFS_M_AUTH " + "\n" +
" INNER JOIN WFS_M_USR_GRP_DEPDTL " + "\n" +
" ON WFS_M_USR_GRP_DEPDTL.USR_GRP_ID = WFS_M_AUTH.USR_GRP_ID " + "\n" +
" " + "\n" +
" UNION ALL " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" WFS_M_AUTH.WORK_ID " + "\n" +
" ,WFS_M_AUTH.ROUTE_ID " + "\n" +
" ,WFS_M_AUTH.LVL " + "\n" +
" ,WFS_M_USR_DAIRI.DAIRI_USR_ID AS USR_ID " + "\n" +
" ,'1' AS KBN " + "\n" +
" ,WFS_M_USR_DAIRI.USR_ID AS SEIKI_USR_ID " + "\n" +
" FROM WFS_M_AUTH " + "\n" +
" INNER JOIN WFS_M_USR_GRP_DEPDTL " + "\n" +
" ON WFS_M_AUTH.USR_GRP_ID = WFS_M_USR_GRP_DEPDTL.USR_GRP_ID " + "\n" +
" INNER JOIN WFS_M_USR_DAIRI " + "\n" +
" ON WFS_M_USR_GRP_DEPDTL.USR_ID = WFS_M_USR_DAIRI.USR_ID " + "\n" +
" AND WFS_M_USR_DAIRI.YUKO_KBN = '1' " + "\n" +
" AND WFS_M_USR_DAIRI.SHINSEI_FLG = CASE WHEN @P_KBN = '1' THEN '1' ELSE '0' END " + "\n" +
" AND WFS_M_USR_DAIRI.SHONIN_FLG = CASE WHEN @P_KBN = '2' THEN '1' ELSE '0' END " + "\n" +
" ) MN " + "\n" +
" WHERE MN.WORK_ID = @P_WORK_ID " + "\n" +
" AND MN.ROUTE_ID = @P_ROUTE_ID " + "\n" +
" AND MN.LVL = @P_LVL " + "\n" +
" AND MN.USR_ID = @P_USR_ID " + "\n" +
" " + "\n" +
" RETURN @REC " + "\n" +
" END " + "\n" +
""
);
//--------------------
//WFS_AUTH_SHINSEI
executeSQL(
" CREATE FUNCTION [dbo].[WFS_AUTH_SHINSEI]( " + "\n" +
" @P_WORK_ID VARCHAR(100) " + "\n" +
" ,@P_ROUTE_ID VARCHAR(100) " + "\n" +
" ,@P_USR_ID VARCHAR(100) " + "\n" +
" ) RETURNS VARCHAR(100) AS " + "\n" +
" BEGIN " + "\n" +
" DECLARE @REC VARCHAR(20) " + "\n" +
" " + "\n" +
" SET @REC = [dbo].[WFS_AUTH_MAIN](@P_WORK_ID,@P_ROUTE_ID,@P_USR_ID,1,'1') " + "\n" +
" " + "\n" +
" RETURN @REC " + "\n" +
" END " + "\n" +
""
);
//--------------------
//WFS_AUTH_SHINSEI
executeSQL(
" CREATE FUNCTION [dbo].[WFS_AUTH_SHONIN]( " + "\n" +
" @P_WORK_ID VARCHAR(100) " + "\n" +
" ,@P_ROUTE_ID VARCHAR(100) " + "\n" +
" ,@P_USR_ID VARCHAR(100) " + "\n" +
" ,@P_LVL DECIMAL(10,0) " + "\n" +
" ) RETURNS VARCHAR(100) AS " + "\n" +
" BEGIN " + "\n" +
" DECLARE @REC VARCHAR(20) " + "\n" +
" " + "\n" +
" SET @REC = [dbo].[WFS_AUTH_MAIN](@P_WORK_ID,@P_ROUTE_ID,@P_USR_ID,@P_LVL,'2') " + "\n" +
" " + "\n" +
" RETURN @REC " + "\n" +
" END " + "\n" +
""
);
//--------------------
//WFS_WF_EXISTS
executeSQL(
" CREATE FUNCTION [dbo].[WFS_WF_EXISTS]( " + "\n" +
" @P_WORK_ID VARCHAR(100) " + "\n" +
" ,@P_OBJECT_ID VARCHAR(100) " + "\n" +
" ) RETURNS VARCHAR(100) AS " + "\n" +
" BEGIN " + "\n" +
" DECLARE @TMP VARCHAR(100) " + "\n" +
" DECLARE @REC VARCHAR(20) " + "\n" +
" " + "\n" +
" SET @REC = NULL " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" @REC = " + "\n" +
" CASE " + "\n" +
" WHEN COUNT(*) = 0 THEN '0' " + "\n" +
" ELSE '1' " + "\n" +
" END " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" WHERE WORK_ID = @P_WORK_ID " + "\n" +
" AND OBJECT_ID = @P_OBJECT_ID " + "\n" +
" " + "\n" +
" " + "\n" +
" IF (@REC = '1') " + "\n" +
" BEGIN " + "\n" +
" SELECT " + "\n" +
" @REC = " + "\n" +
" CASE " + "\n" +
" WHEN WFS_T_WORKFLOW.LVL = 1 AND STATUS <> '6' THEN '1' " + "\n" +
" WHEN WFS_T_WORKFLOW.LVL = 1 AND STATUS = '6' THEN '4' " + "\n" +
" WHEN WFS_LEVEL.LVL = WFS_T_WORKFLOW.LVL AND WFS_T_WORKFLOW.STATUS = '2' THEN '3' " + "\n" +
" WHEN WFS_T_WORKFLOW.STATUS = '9' THEN '9' " + "\n" +
" ELSE '2' " + "\n" +
" END " + "\n" +
" FROM ( " + "\n" +
" SELECT " + "\n" +
" S1.WORK_ID " + "\n" +
" ,S1.OBJECT_ID " + "\n" +
" ,S1.STEP " + "\n" +
" ,S1.LVL " + "\n" +
" ,S1.STATUS " + "\n" +
" ,S1.ROUTE_ID " + "\n" +
" FROM WFS_T_WORKFLOW S1 " + "\n" +
" INNER JOIN ( " + "\n" +
" SELECT " + "\n" +
" WORK_ID " + "\n" +
" ,OBJECT_ID " + "\n" +
" ,MAX(STEP) AS STEP " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" GROUP BY " + "\n" +
" WORK_ID " + "\n" +
" ,OBJECT_ID " + "\n" +
" ) S2 " + "\n" +
" ON S2.WORK_ID = S1.WORK_ID " + "\n" +
" AND S2.OBJECT_ID = S1.OBJECT_ID " + "\n" +
" AND S2.STEP = S1.STEP " + "\n" +
" ) WFS_T_WORKFLOW " + "\n" +
" LEFT OUTER JOIN WFS_M_CONTROL " + "\n" +
" ON WFS_M_CONTROL.WORK_ID = WFS_T_WORKFLOW.WORK_ID " + "\n" +
" LEFT OUTER JOIN ( SELECT WORK_ID, ROUTE_ID, MAX(LVL) AS LVL FROM WFS_M_AUTH GROUP BY WORK_ID, ROUTE_ID ) WFS_LEVEL " + "\n" +
" ON WFS_LEVEL.WORK_ID = WFS_T_WORKFLOW.WORK_ID " + "\n" +
" AND WFS_LEVEL.ROUTE_ID = WFS_T_WORKFLOW.ROUTE_ID " + "\n" +
" WHERE WFS_T_WORKFLOW.WORK_ID = @P_WORK_ID " + "\n" +
" AND WFS_T_WORKFLOW.OBJECT_ID = @P_OBJECT_ID " + "\n" +
" " + "\n" +
" END " + "\n" +
" " + "\n" +
" RETURN @REC " + "\n" +
" END " + "\n" +
""
);
//--------------------
//WFS_WF_STEP
executeSQL(
" CREATE FUNCTION [dbo].[WFS_WF_STEP]( " + "\n" +
" @P_WORK_ID VARCHAR(100) " + "\n" +
" ,@P_OBJECT_ID VARCHAR(100) " + "\n" +
" ) RETURNS decimal(10,0) AS " + "\n" +
" BEGIN " + "\n" +
" DECLARE @REC DECIMAL(10,0) " + "\n" +
" " + "\n" +
" SET @REC = 0 " + "\n" +
" " + "\n" +
" SELECT " + "\n" +
" @REC = " + "\n" +
" MAX(STEP) " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" WHERE WORK_ID = @P_WORK_ID " + "\n" +
" AND OBJECT_ID = @P_OBJECT_ID " + "\n" +
" " + "\n" +
" RETURN @REC " + "\n" +
" END " + "\n" +
""
);
};
if ( TALON.getDbConfig().isPostgres() ) {
//SQLファイルで作成
};
}
function exec_create_View() {
//≪VIEW DROP≫
//--------------------
//[VIEW]Ver14追加分 WFS_WF_STATUS_LIST
view_exists_drop('WFS_WF_STATUS_LIST');
//[VIEW]Ver14追加分 WFS_WF_STATUS_LIST_SUB
view_exists_drop('WFS_WF_STATUS_LIST_SUB');
if ( TALON.getDbConfig().isOra() ) {
//--------------------
//WFS_WF_STATUS_LIST_SUB
executeSQL(
"CREATE VIEW WFS_WF_STATUS_LIST_SUB AS " + "\n" +
" SELECT " + "\n" +
" WFS_T_WORKFLOW.WORK_ID AS WORK_ID, " + "\n" +
" WFS_T_WORKFLOW.OBJECT_ID AS OBJECT_ID, " + "\n" +
" WFS_T_WORKFLOW.LVL AS LVL, " + "\n" +
" MAX(WFS_T_WORKFLOW.STEP) AS STEP " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" GROUP BY WFS_T_WORKFLOW.WORK_ID , WFS_T_WORKFLOW.OBJECT_ID , WFS_T_WORKFLOW.LVL " + "\n" +
""
);
//--------------------
//WFS_WF_STATUS_LIST_SUB
executeSQL(
"CREATE VIEW WFS_WF_STATUS_LIST AS " + "\n" +
" SELECT " + "\n" +
" MN.WORK_ID " + "\n" +
" ,MN.OBJECT_ID " + "\n" +
" ,MN.LVL " + "\n" +
" ,MN.STEP " + "\n" +
" ,MN.STATUS " + "\n" +
" ,MN.CREATED_BY " + "\n" +
" ,MN.CREATED_DATE " + "\n" +
" ,MN.UPDATED_BY AS WFS_ID " + "\n" +
" ,TLN_M_USER.USER_NM AS WFS_NAME " + "\n" +
" ,MN.UPDATED_DATE AS WFS_DATE " + "\n" +
" FROM WFS_T_WORKFLOW MN " + "\n" +
" INNER JOIN WFS_WF_STATUS_LIST_SUB MX " + "\n" +
" ON MX.WORK_ID = MN.WORK_ID " + "\n" +
" AND MX.OBJECT_ID = MN.OBJECT_ID " + "\n" +
" AND MX.LVL = MN.LVL " + "\n" +
" AND MX.STEP = MN.STEP " + "\n" +
" AND MN.STATUS IN ('1','2') " + "\n" +
" AND MN.ACTIVE_FLG = '1' " + "\n" +
" LEFT OUTER JOIN TLN_M_USER " + "\n" +
" ON MN.UPDATED_BY = TLN_M_USER.USER_ID " + "\n" +
""
);
};
if ( TALON.getDbConfig().isMy() ) {
//SQLファイルで作成
};
if ( TALON.getDbConfig().isMssql() ) {
//--------------------
//WFS_WF_STATUS_LIST_SUB
executeSQL(
"CREATE VIEW WFS_WF_STATUS_LIST_SUB AS " + "\n" +
" SELECT " + "\n" +
" WFS_T_WORKFLOW.WORK_ID AS WORK_ID, " + "\n" +
" WFS_T_WORKFLOW.OBJECT_ID AS OBJECT_ID, " + "\n" +
" WFS_T_WORKFLOW.LVL AS LVL, " + "\n" +
" MAX(WFS_T_WORKFLOW.STEP) AS STEP " + "\n" +
" FROM WFS_T_WORKFLOW " + "\n" +
" GROUP BY WFS_T_WORKFLOW.WORK_ID , WFS_T_WORKFLOW.OBJECT_ID , WFS_T_WORKFLOW.LVL " + "\n" +
""
);
//--------------------
//WFS_WF_STATUS_LIST_SUB
executeSQL(
"CREATE VIEW WFS_WF_STATUS_LIST AS " + "\n" +
" SELECT " + "\n" +
" MN.WORK_ID " + "\n" +
" ,MN.OBJECT_ID " + "\n" +
" ,MN.LVL " + "\n" +
" ,MN.STEP " + "\n" +
" ,MN.STATUS " + "\n" +
" ,MN.CREATED_BY " + "\n" +
" ,MN.CREATED_DATE " + "\n" +
" ,MN.UPDATED_BY AS WFS_ID " + "\n" +
" ,TLN_M_USER.USER_NM AS WFS_NAME " + "\n" +
" ,MN.UPDATED_DATE AS WFS_DATE " + "\n" +
" FROM WFS_T_WORKFLOW MN " + "\n" +
" INNER JOIN WFS_WF_STATUS_LIST_SUB MX " + "\n" +
" ON MX.WORK_ID = MN.WORK_ID " + "\n" +
" AND MX.OBJECT_ID = MN.OBJECT_ID " + "\n" +
" AND MX.LVL = MN.LVL " + "\n" +
" AND MX.STEP = MN.STEP " + "\n" +
" AND MN.STATUS IN ('1','2') " + "\n" +
" AND MN.ACTIVE_FLG = '1' " + "\n" +
" LEFT OUTER JOIN TLN_M_USER " + "\n" +
" ON MN.UPDATED_BY = TLN_M_USER.USER_ID " + "\n" +
""
);
};
if ( TALON.getDbConfig().isPostgres() ) {
//SQLファイルで作成
};
}
≣ サーバJS ライブラリXDMF_JS001_0 [共通]共通 56159字
//-------------------------------------------
//[部品]共通
//-------------------------------------------
var _USER_ID = '';
var _FUNC_ID = '';
function tln_com_escape(val) {
return val.replace("'","''");
}
//システム日付を返す
//更新時、データベースの日付型項目へバインドする際に使用(更新日付など)
function tln_com_nowdate() {
var sysDate = new java.util.Date();
return sysDate;
}
//システム日付(文字列 YYYY-MM-DD HH:MI:SS)を返す
//更新時、タイムスタンプ型としてSQLに組み込む際に使用
function tln_com_nowdate_str() {
var sysDate = new java.util.Date();
return (sysDate.getYear()+1900) + "-" + (sysDate.getMonth()+1) + "-" + sysDate.getDate() + " " + sysDate.getHours() + ":" + sysDate.getMinutes() + ":" + sysDate.getSeconds();
}
//文字列型の日付(画面項目)(YYYY/MM/DD)を日付型に変換
function tln_com_todate(val) {
y = parseInt(val.split("/")[0]) - 1900;
m = parseInt(val.split("/")[1]) - 1;
d = parseInt(val.split("/")[2]);
var sysDate = new java.util.Date(y,m,d);
return sysDate;
}
//文字列型の日付(YYYY-MM-DD HH:MI)を日付型に変換
function tln_com_todatetime(val) {
//val = val.replace("-","/")
var regExp = new RegExp( "-", "g" ) ;
val = val.replace( regExp , "/" ) ;
var val1 = val.split(" ")[0];
var val2 = val.split(" ")[1];
var y = parseInt(val1.split("/")[0]) - 1900;
var m = parseInt(val1.split("/")[1]) - 1;
var d = parseInt(val1.split("/")[2]) + 0;
var h = parseInt(val2.split(":")[0]);
var f = parseInt(val2.split(":")[1]);
var sysDate = new java.util.Date(y,m,d,h,f);
return sysDate;
}
//日付型を文字列型に変換(単純変換)
function tln_com_date2string(obj) {
if (obj == null) {
return null;
} else {
return obj.toString();
}
}
//日付型を文字列型に変換(YYYY-MM-DD HH:MI:SS変換)
//function tln_com_date2string2(obj) {
// return (obj.getYear()+1900) + "-" + tln_com_zpad2(obj.getMonth()+1) + "-" + tln_com_zpad2(obj.getDate()) + " " + tln_com_zpad2(obj.getHours()) + ":" + tln_com_zpad2(obj.getMinutes()) + ":" + tln_com_zpad2(obj.getSeconds());
//}
//日付型を文字列型に変換(YYYY-MM-DD HH:MI:SS変換)
function tln_com_date2string2(obj) {
var DTYPE = 'DATETIME';
try {
var tmp = obj.getHours();
} catch(e) {
DTYPE = 'DATE';
}
if ( DTYPE == 'DATETIME' ) {
return (obj.getYear()+1900) + "-" + tln_com_zpad2(obj.getMonth()+1) + "-" + tln_com_zpad2(obj.getDate()) + " " + tln_com_zpad2(obj.getHours()) + ":" + tln_com_zpad2(obj.getMinutes()) + ":" + tln_com_zpad2(obj.getSeconds());
} else {
return (obj.getYear()+1900) + "-" + tln_com_zpad2(obj.getMonth()+1) + "-" + tln_com_zpad2(obj.getDate()) + " " + "00:00:00";
}
}
//機能IDを返す(Ver3.2用)
function tln_com_func_id() {
if (_FUNC_ID == '') {
_FUNC_ID = TALON.getUserInfoMap().get("FUNC_ID");
}
return _FUNC_ID;
}
//ログインユーザーIDを返す
function tln_com_user_id() {
if (_USER_ID == '') {
var lineDataMap = TALON.getUserInfoMap();
_USER_ID = lineDataMap['USER_ID'];
}
return _USER_ID;
}
//ログファイルに出力
function tln_com_log(val) {
var log = TALON.getLogger();
log.writeDebug(val);
}
//指定文字数でカット
function tln_com_lcut(str,len) {
return str.substring( 0 , len );
}
//ゼロ詰め(2けた)
function tln_com_zpad2(str) {
return ( '0' + str ).slice( -2 );
}
//
function tln_timestamp(str) {
var val = str;
var regExp = new RegExp( "-", "g" ) ;
val = val.replace( regExp , "/" ) ;
var val1 = val.split(" ")[0];
var val2 = val.split(" ")[1];
var val2h = val2.split(":")[0];
var val2m = val2.split(":")[1];
var val2s = val2.split(":")[2];
return val1 + " " + val2h + ":" + val2m + ":" + val2s;
}
//-------------------------------------------
//[部品]消費税率
//-------------------------------------------
function getTAX_RATE(_KIJUN) {
var itemSelectList = TALON.select( "SELECT VLTAXRATE FROM ZT060 WHERE TLN_DATE_TO_CHAR('YMD', DTSTART) <= '" + _KIJUN + "' ORDER BY DTSTART DESC " );
var lineDataMap = itemSelectList[0];
var val = lineDataMap['VLTAXRATE'];
//var val = 0.08;
return val;
}
//-------------------------------------------
//[部品]会計年度・月序 チェック
//-------------------------------------------
function checkNENDO(_NENDO,GMSEQ) {
var itemSelectList = TALON.select( "SELECT TXVALUE FROM ZT010 WHERE IDVARIANT = 'ALLOWED_FISCAL_MONTH' " );
var lineDataMap = itemSelectList[0];
var _ALLOWED_FISCAL_MONTH = lineDataMap['TXVALUE'];
if ( ( ( _NENDO * 100 ) + GMSEQ ) < parseInt(_ALLOWED_FISCAL_MONTH) ) {
TALON.addErrorMsg( "すでに会計締め処理済み取引日のため処理できません" );
TALON.setIsSuccess(false);
}
return true;
}
//-------------------------------------------
//[部品]会計年度
//パラメータ基準日(YYYY/MM/DD)
//-------------------------------------------
function getNENDO(BASE_DATE) {
var regExp = new RegExp( "-", "g" ) ;
BASE_DATE = tln_com_date2string2(BASE_DATE).replace( regExp , "/" ) ;
var BASE_DATE1 = BASE_DATE.split(" ")[0];
var BASE_DATE2 = BASE_DATE.split(" ")[1];
BASE_DATE = BASE_DATE1
var itemSelectList = TALON.select( "SELECT TXVALUE FROM ZT010 WHERE IDVARIANT = 'FIRST_MONTH' " );
var lineDataMap = itemSelectList[0];
var _FIRST_MONTH = lineDataMap['TXVALUE'];
var itemSelectList = TALON.select( "SELECT TXVALUE FROM ZT010 WHERE IDVARIANT = 'LAST_DAY' " );
var lineDataMap = itemSelectList[0];
var _LAST_DAY = lineDataMap['TXVALUE'];
var _END_MONTH = 0;
var _END_DAY = 0;
//END日を取得
if (_FIRST_MONTH == 1) {
_END_MONTH = 12;
} else {
_END_MONTH = _FIRST_MONTH - 1;
}
if (_LAST_DAY == 31) {
//END_MONTHの最終日(_FIRST_MONTH初日の前日)
var _TEMP = "1999/" + tln_com_zpad2(_FIRST_MONTH) + "/01" + " " + "00:00:00";
var wdate = tln_com_todatetime(_TEMP);
wdate.setMinutes(wdate.getMinutes() - 1);
var tdate = tln_com_date2string2(wdate);
_TEMP = (tdate.toString().split(" ")[0]).substr( 8 , 2 );
_END_DAY = _TEMP;
} else {
if ( ( _END_MONTH == 2 ) && ( _LAST_DAY >= 28 ) ) {
_END_DAY = 28;
} else {
_END_DAY = _LAST_DAY;
}
}
_END_MONTH = tln_com_zpad2(_END_MONTH);
_END_DAY = tln_com_zpad2(_END_DAY);
//TALON.addMsg( _END_MONTH + "/" + _END_DAY );
var _BASE_DATE_NEN = BASE_DATE.split("/")[0];
var _BASE_DATE_BAS = BASE_DATE.split("/")[1] + BASE_DATE.split("/")[2];
if ( (_BASE_DATE_BAS >= '0101' ) && (_BASE_DATE_BAS <= ( _END_MONTH + _END_DAY ) ) ) {
_BASE_DATE_NEN = _BASE_DATE_NEN - 1;
}
//TALON.addMsg( _BASE_DATE_NEN );
return _BASE_DATE_NEN;
}
//-------------------------------------------
//[部品]月例
//パラメータ基準日(YYYY/MM/DD)
//-------------------------------------------
function getGMSEQ(BASE_DATE) {
var regExp = new RegExp( "-", "g" ) ;
BASE_DATE = tln_com_date2string2(BASE_DATE).replace( regExp , "/" ) ;
var BASE_DATE1 = BASE_DATE.split(" ")[0];
var BASE_DATE2 = BASE_DATE.split(" ")[1];
BASE_DATE = BASE_DATE1
var itemSelectList = TALON.select( "SELECT TXVALUE FROM ZT010 WHERE IDVARIANT = 'FIRST_MONTH' " );
var lineDataMap = itemSelectList[0];
var _FIRST_MONTH = lineDataMap['TXVALUE'];
var itemSelectList = TALON.select( "SELECT TXVALUE FROM ZT010 WHERE IDVARIANT = 'LAST_DAY' " );
var lineDataMap = itemSelectList[0];
var _LAST_DAY = lineDataMap['TXVALUE'];
var _BASE_DATE_NEN = BASE_DATE.split("/")[0];
var _BASE_DATE_MON = BASE_DATE.split("/")[1];
var _BASE_DATE_DAY = BASE_DATE.split("/")[2];
//締め日が31の場合はそのまま月で計算
if (parseInt(_LAST_DAY) == 31) {
_BASE_DATE_MON = parseInt(_BASE_DATE_MON);
}
//締め日が31以外で日付が締め日より大きい場合、翌月数字で計算
if ( (parseInt(_LAST_DAY) != 31) && (parseInt(_LAST_DAY) < parseInt(_BASE_DATE_DAY)) ) {
if (_BASE_DATE_MON == 12) {
_BASE_DATE_MON = 1;
} else {
_BASE_DATE_MON = parseInt(_BASE_DATE_MON) + 1;
}
}
//締め日が31以外で日付が締め日より小さい場合、そのままの月数字で計算
if ( (parseInt(_LAST_DAY) != 31) && (parseInt(_LAST_DAY) >= parseInt(_BASE_DATE_DAY)) ) {
_BASE_DATE_MON = parseInt(_BASE_DATE_MON);
}
var REC = 0;
if (parseInt(_FIRST_MONTH) > parseInt(_BASE_DATE_MON)) {
REC = (parseInt(_BASE_DATE_MON) + 12) - (parseInt(_FIRST_MONTH) - 1);
} else {
REC = (parseInt(_BASE_DATE_MON)) - (parseInt(_FIRST_MONTH) - 1);
}
//TALON.addMsg( REC );
return REC;
}
//-------------------------------------------
//[部品]休日チェック(1:休日 / 0:平日)
//-------------------------------------------
function getHOLIDAY_FLG(_KBCALENDAR, _DTOFF) {
var sql =
"SELECT " +
"COUNT(*) AS CNT " +
"FROM ZT070 " +
"WHERE ZT070.KBCALENDAR = '" + _KBCALENDAR + "' " +
" AND ZT070.DTOFF = TLN_CHAR_TO_DATE('YMDHMS','" + tln_timestamp(_DTOFF) + "') "
;
var itemSelectList = TALON.select(sql);
var lineDataMap = itemSelectList[0];
var _CNT = lineDataMap['CNT'];
return _CNT;
}
//-------------------------------------------
//[部品]品目[BT010]
//-------------------------------------------
function selectBT010(_IDHINMOKU) {
var sql =
"SELECT " +
" IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBHINSYU " +
",PRGENKA " +
",PRHANBAI " +
",KBUNIT " +
",KBUNITPUR " +
",VLKANZAN " +
",PRKOUNYU " +
",IDSIIRESAKI " +
",FGZAIKO " +
",FGKOUNYU " +
",FGHANBAI " +
",FGSEIZO " +
",TXTEKIYO " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM BT010 " +
"WHERE IDHINMOKU = '" + _IDHINMOKU + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]仕入先[DT010]
//-------------------------------------------
function selectDT010(_IDSIIRESAKI) {
var sql =
"SELECT " +
" IDSIIRESAKI " +
",KBSIHARAI " +
",TXHURIKOMI " +
",TXTEKIYO " +
",AMKISYUKAIKAKE " +
",AMSIIRE " +
",AMSIHARAI " +
",AMGENKAIKAKE " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM DT010 " +
"WHERE IDSIIRESAKI = '" + _IDSIIRESAKI + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateDT010(itemDataList) {
//項目
var itemColNameTbl = [
'IDSIIRESAKI'
,'KBSIHARAI'
,'TXHURIKOMI'
,'TXTEKIYO'
,'AMKISYUKAIKAKE'
,'AMSIIRE'
,'AMSIHARAI'
,'AMGENKAIKAKE'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
var itemSelectList = selectDT010(itemDataList['IDSIIRESAKI']);
var lineDataMap = itemSelectList[0];
var _MODIFY_COUNT = lineDataMap['MODIFY_COUNT'];
//UPDATE
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = (_MODIFY_COUNT + 1);
var whereList = new Array();
var whereTbl1 = [ null, '=' , 'IDSIIRESAKI' ];
whereList.push(whereTbl1);
TALON.updateByMap( 'DT010', itemDataList , itemColNameTbl , whereList );
}
//-------------------------------------------
//[部品]得意先[ET010]
//-------------------------------------------
function selectET010(_IDTOKUISAKI) {
var sql =
"SELECT " +
" IDTOKUISAKI " +
",TXTANTOUBUSYO " +
",TXTANTOUSYA " +
",TXTANTOUSYASYOKUI " +
",TXTANTOUSYAEMAIL " +
",TXTANTOUSYADENWA " +
",KBSEIKYUHOUSHIKI " +
",TXSIMEBI " +
",KBNYUKINHOUHOU " +
",VLNYUKINSAITO " +
",AMYOSHIN " +
",NRTANTOUJYUGYOIN " +
",TXTEKIYO " +
",AMKISYUURIKAKE " +
",AMURIAGE " +
",AMJYURYO " +
",AMGENURIKAKE " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM ET010 " +
"WHERE IDTOKUISAKI = '" + _IDTOKUISAKI + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateET010(itemDataList) {
//項目
var itemColNameTbl = [
'IDTOKUISAKI'
,'TXTANTOUBUSYO'
,'TXTANTOUSYA'
,'TXTANTOUSYASYOKUI'
,'TXTANTOUSYAEMAIL'
,'TXTANTOUSYADENWA'
,'KBSEIKYUHOUSHIKI'
,'TXSIMEBI'
,'KBNYUKINHOUHOU'
,'VLNYUKINSAITO'
,'AMYOSHIN'
,'NRTANTOUJYUGYOIN'
,'TXTEKIYO'
,'AMKISYUURIKAKE'
,'AMURIAGE'
,'AMJYURYO'
,'AMGENURIKAKE'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
var itemSelectList = selectET010(itemDataList['IDTOKUISAKI']);
var lineDataMap = itemSelectList[0];
var _MODIFY_COUNT = lineDataMap['MODIFY_COUNT'];
//UPDATE
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = (_MODIFY_COUNT + 1);
var whereList = new Array();
var whereTbl1 = [ null, '=' , 'IDTOKUISAKI' ];
whereList.push(whereTbl1);
TALON.updateByMap( 'ET010', itemDataList , itemColNameTbl , whereList );
}
//-------------------------------------------
//[部品]倉庫在庫[FT010]
//-------------------------------------------
function selectFT010(_IDHINMOKU, _CDSOUKO) {
var sql =
"SELECT " +
" IDHINMOKU " +
",CDSOUKO " +
",QTKISYU " +
",QTNYUKO " +
",QTSYUKKO " +
",AMKISYU " +
",AMNYUKO " +
",AMSYUKKO " +
",QTGENZAIKO " +
",AMGENZAIKO " +
",PRGENZAIKO " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM FT010 " +
"WHERE IDHINMOKU = '" + _IDHINMOKU + "'" +
" AND CDSOUKO = '" + _CDSOUKO + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function selectFT010_CDSOUKO(_CDSOUKO) {
var sql =
"SELECT " +
" IDHINMOKU " +
",CDSOUKO " +
",QTKISYU " +
",QTNYUKO " +
",QTSYUKKO " +
",AMKISYU " +
",AMNYUKO " +
",AMSYUKKO " +
",QTGENZAIKO " +
",AMGENZAIKO " +
",PRGENZAIKO " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM FT010 " +
"WHERE CDSOUKO = '" + _CDSOUKO + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateFT010(itemDataList) {
//項目
var itemColNameTbl = [
'IDHINMOKU'
,'CDSOUKO'
,'QTKISYU'
,'QTNYUKO'
,'QTSYUKKO'
,'AMKISYU'
,'AMNYUKO'
,'AMSYUKKO'
,'QTGENZAIKO'
,'AMGENZAIKO'
,'PRGENZAIKO'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
//共通
//--------
//現在庫数
itemDataList['QTGENZAIKO'] = itemDataList['QTKISYU'] + itemDataList['QTNYUKO'] - itemDataList['QTSYUKKO'];
//現在庫額
itemDataList['AMGENZAIKO'] = itemDataList['AMKISYU'] + itemDataList['AMNYUKO'] - itemDataList['AMSYUKKO'];
//現在庫単価
if (itemDataList['QTGENZAIKO'] == 0) {
itemDataList['PRGENZAIKO'] = 0;
} else {
itemDataList['PRGENZAIKO'] = itemDataList['AMGENZAIKO'] / itemDataList['QTGENZAIKO'];
}
//データが存在する場合はupdate、存在しない場合はinsert
var itemSelectList = selectFT010(itemDataList['IDHINMOKU'], itemDataList['CDSOUKO']);
if (itemSelectList.length == 0) {
//INSERT
itemDataList['CREATED_DATE'] = tln_com_nowdate();
itemDataList['CREATED_BY'] = tln_com_user_id();
itemDataList['CREATED_PRG_NM'] = tln_com_func_id();
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = 1;
TALON.insertByMap( 'FT010', itemDataList , itemColNameTbl );
} else {
var lineDataMap = itemSelectList[0];
var _MODIFY_COUNT = lineDataMap['MODIFY_COUNT'];
//UPDATE
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = (_MODIFY_COUNT + 1);
var whereList = new Array();
var whereTbl1 = [ null, '=' , 'IDHINMOKU' ];
var whereTbl2 = [ null, '=' , 'CDSOUKO' ];
whereList.push(whereTbl1);
whereList.push(whereTbl2);
TALON.updateByMap( 'FT010', itemDataList , itemColNameTbl , whereList );
}
}
//-------------------------------------------
//[部品]在庫増減履歴[FT100]
//-------------------------------------------
function selectFT100(_NRZAITORI) {
var sql =
"SELECT " +
" NRZAITORI " +
",DTTORIHIKI " +
",KBUKEBARAI " +
",KBZAIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",CDSOUKO " +
",TXAITESAKI " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTORIHIKI " +
",AMSAGAKU " +
",NRSOURCE " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",QTZOUGEN " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM FT100 " +
"WHERE NRZAITORI = '" + _NRZAITORI + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateFT100(itemDataList) {
//項目
var itemColNameTbl = [
'NRZAITORI'
,'DTTORIHIKI'
,'KBUKEBARAI'
,'KBZAIHURI'
,'KBAKADEN'
,'FGVALID'
,'IDHINMOKU'
,'TXHINBAN'
,'TXHINMEI'
,'KBUNIT'
,'CDSOUKO'
,'TXAITESAKI'
,'PRTORIHIKI'
,'QTTORIHIKI'
,'AMTORIHIKI'
,'AMSAGAKU'
,'NRSOURCE'
,'DTCREATE'
,'TXREFNO'
,'DTNEND'
,'DTMSEQ'
,'QTZOUGEN'
,'AMZOUGEN'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
//関連情報補填(採番)
//在庫取引№
var numList = TALON.getNumberingData('XDMF_FF_ZAITORI', 1)
itemDataList['NRZAITORI'] = numList[0];
//関連情報補填(品目マスタ)
var itemSelectList = selectBT010(itemDataList['IDHINMOKU']);
var lineDataMap = itemSelectList[0];
//品番
itemDataList['TXHINBAN'] = lineDataMap['TXHINBAN'];
//品名
itemDataList['TXHINMEI'] = lineDataMap['TXHINMEI'];
//単位区分
itemDataList['KBUNIT'] = lineDataMap['KBUNIT'];
//取引差額
if ( (itemDataList['AMSAGAKU'] == "") || (itemDataList['AMSAGAKU'] == null) ) {
itemDataList['AMSAGAKU'] = 0;
}
//共通
itemDataList['CREATED_DATE'] = tln_com_nowdate();
itemDataList['CREATED_BY'] = tln_com_user_id();
itemDataList['CREATED_PRG_NM'] = tln_com_func_id();
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = 1;
var _NENDO = getNENDO(itemDataList['DTTORIHIKI']);
var _GMSEQ = getGMSEQ(itemDataList['DTTORIHIKI']);
checkNENDO(_NENDO, _GMSEQ);
//年度
itemDataList['DTNEND'] = _NENDO;
//月序
itemDataList['DTMSEQ'] = _GMSEQ;
TALON.insertByMap( 'FT100', itemDataList , itemColNameTbl );
}
function insertAkaFT100(_NRZAITORI) {
//関連情報補填(採番)
//在庫取引№
var numList = TALON.getNumberingData('XDMF_FF_ZAITORI', 1)
_NEXT_NRZAITORI = numList[0];
//
TALON.insert(
" INSERT INTO FT100 ( " +
" NRZAITORI " +
" ,DTTORIHIKI " +
" ,KBUKEBARAI " +
" ,KBZAIHURI " +
" ,KBAKADEN " +
" ,FGVALID " +
" ,IDHINMOKU " +
" ,TXHINBAN " +
" ,TXHINMEI " +
" ,KBUNIT " +
" ,CDSOUKO " +
" ,TXAITESAKI " +
" ,PRTORIHIKI " +
" ,QTTORIHIKI " +
" ,AMTORIHIKI " +
" ,AMSAGAKU " +
" ,NRSOURCE " +
" ,DTCREATE " +
" ,TXREFNO " +
" ,DTNEND " +
" ,DTMSEQ " +
" ,QTZOUGEN " +
" ,AMZOUGEN " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" ) " +
" SELECT " +
" '" + _NEXT_NRZAITORI + "' " +
" ,DTTORIHIKI " +
" ,KBUKEBARAI " +
" ,KBZAIHURI " +
" ,'2' " +
" ,'F' " +
" ,IDHINMOKU " +
" ,TXHINBAN " +
" ,TXHINMEI " +
" ,KBUNIT " +
" ,CDSOUKO " +
" ,TXAITESAKI " +
" ,PRTORIHIKI " +
" ,QTTORIHIKI " +
" ,AMTORIHIKI " +
" ,AMSAGAKU " +
" ,NRSOURCE " +
" ,DTCREATE " +
" ,TXREFNO " +
" ,DTNEND " +
" ,DTMSEQ " +
" ,(QTZOUGEN * -1) " +
" ,(AMZOUGEN * -1) " +
" ,TLN_CHAR_TO_DATE('YMDHMS','" + tln_timestamp(tln_com_nowdate_str()) + "') " +
" ,'" + tln_com_user_id() + "' " +
" ,'" + tln_com_func_id() + "' " +
" ,TLN_CHAR_TO_DATE('YMDHMS','" + tln_timestamp(tln_com_nowdate_str()) + "') " +
" ,'" + tln_com_user_id() + "' " +
" ,'" + tln_com_func_id() + "' " +
" ,0 " +
" FROM FT100 " +
" WHERE NRZAITORI = '" + _NRZAITORI + "'"
);
}
//-------------------------------------------
//[部品]買掛増減履歴[DT100]
//-------------------------------------------
function selectDT100(_NRKAIKAKE) {
var sql =
"SELECT " +
" NRKAIKAKE " +
",IDSIIRESAKI " +
",DTTORIHIKI " +
",KBKAITORI " +
",KBKAIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTORIHIKI " +
",AMTAX " +
",NRSIHARAI " +
",NRSOURCE " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM DT100 " +
"WHERE NRKAIKAKE = '" + _NRKAIKAKE + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateDT100(itemDataList) {
//項目
var itemColNameTbl = [
'NRKAIKAKE'
,'IDSIIRESAKI'
,'DTTORIHIKI'
,'KBKAITORI'
,'KBKAIHURI'
,'KBAKADEN'
,'FGVALID'
,'IDHINMOKU'
,'TXHINBAN'
,'TXHINMEI'
,'KBUNIT'
,'PRTORIHIKI'
,'QTTORIHIKI'
,'AMTORIHIKI'
,'AMTAX'
,'NRSIHARAI'
,'NRSOURCE'
,'DTCREATE'
,'TXREFNO'
,'DTNEND'
,'DTMSEQ'
,'AMZOUGEN'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
//関連情報補填(採番)
//買掛取引№
var numList = TALON.getNumberingData('XDMF_DF_KAIKAKE', 1)
itemDataList['NRKAIKAKE'] = numList[0];
//関連情報補填(品目マスタ) ※品目IDが入っているときのみ
if (itemDataList['IDHINMOKU'] != '') {
var itemSelectList = selectBT010(itemDataList['IDHINMOKU']);
var lineDataMap = itemSelectList[0];
//品番
itemDataList['TXHINBAN'] = lineDataMap['TXHINBAN'];
//品名
itemDataList['TXHINMEI'] = lineDataMap['TXHINMEI'];
//単位区分
itemDataList['KBUNIT'] = lineDataMap['KBUNITPUR'];
}
//共通
itemDataList['CREATED_DATE'] = tln_com_nowdate();
itemDataList['CREATED_BY'] = tln_com_user_id();
itemDataList['CREATED_PRG_NM'] = tln_com_func_id();
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = 1;
var _NENDO = getNENDO(itemDataList['DTTORIHIKI']);
var _GMSEQ = getGMSEQ(itemDataList['DTTORIHIKI']);
checkNENDO(_NENDO, _GMSEQ);
//年度
itemDataList['DTNEND'] = _NENDO;
//月序
itemDataList['DTMSEQ'] = _GMSEQ;
TALON.insertByMap( 'DT100', itemDataList , itemColNameTbl );
}
function insertAkaDT100(_NRKAIKAKE) {
//関連情報補填(採番)
//買掛取引№
var numList = TALON.getNumberingData('XDMF_DF_KAIKAKE', 1)
_NEXT_NRKAIKAKE = numList[0];
//
TALON.insert(
" INSERT INTO DT100 ( " +
" NRKAIKAKE " +
" ,IDSIIRESAKI " +
" ,DTTORIHIKI " +
" ,KBKAITORI " +
" ,KBKAIHURI " +
" ,KBAKADEN " +
" ,FGVALID " +
" ,IDHINMOKU " +
" ,TXHINBAN " +
" ,TXHINMEI " +
" ,KBUNIT " +
" ,PRTORIHIKI " +
" ,QTTORIHIKI " +
" ,AMTORIHIKI " +
" ,AMTAX " +
" ,NRSIHARAI " +
" ,NRSOURCE " +
" ,DTCREATE " +
" ,TXREFNO " +
" ,DTNEND " +
" ,DTMSEQ " +
" ,AMZOUGEN " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" ) " +
" SELECT " +
" '" + _NEXT_NRKAIKAKE + "' " +
" ,IDSIIRESAKI " +
" ,DTTORIHIKI " +
" ,KBKAITORI " +
" ,KBKAIHURI " +
" ,'2' " +
" ,'F' " +
" ,IDHINMOKU " +
" ,TXHINBAN " +
" ,TXHINMEI " +
" ,KBUNIT " +
" ,PRTORIHIKI " +
" ,QTTORIHIKI " +
" ,AMTORIHIKI " +
" ,AMTAX " +
" ,NRSIHARAI " +
" ,NRSOURCE " +
" ,DTCREATE " +
" ,TXREFNO " +
" ,DTNEND " +
" ,DTMSEQ " +
" ,(AMZOUGEN * -1) " +
" ,TLN_CHAR_TO_DATE('YMDHMS','" + tln_timestamp(tln_com_nowdate_str()) + "') " +
" ,'" + tln_com_user_id() + "' " +
" ,'" + tln_com_func_id() + "' " +
" ,TLN_CHAR_TO_DATE('YMDHMS','" + tln_timestamp(tln_com_nowdate_str()) + "') " +
" ,'" + tln_com_user_id() + "' " +
" ,'" + tln_com_func_id() + "' " +
" ,0 " +
" FROM DT100 " +
" WHERE NRKAIKAKE = '" + _NRKAIKAKE + "'"
);
}
//-------------------------------------------
//[部品]売掛増減履歴[ET100]
//-------------------------------------------
function selectET100(_NRURIKAKE) {
var sql =
"SELECT " +
" NRURIKAKE " +
",IDTOKUISAKI " +
",DTTORIHIKI " +
",KBURITORI " +
",KBURIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTAX " +
",AMGENKA " +
",NRSOURCE " +
",NRSEIKYU " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",AMARARI " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
",AMTORIHIKI " +
"FROM ET100 " +
"WHERE NRURIKAKE = '" + _NRURIKAKE + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateET100(itemDataList) {
//項目
var itemColNameTbl = [
'NRURIKAKE'
,'IDTOKUISAKI'
,'DTTORIHIKI'
,'KBURITORI'
,'KBURIHURI'
,'KBAKADEN'
,'FGVALID'
,'IDHINMOKU'
,'TXHINBAN'
,'TXHINMEI'
,'KBUNIT'
,'PRTORIHIKI'
,'QTTORIHIKI'
,'AMTAX'
,'AMGENKA'
,'NRSOURCE'
,'NRSEIKYU'
,'DTCREATE'
,'TXREFNO'
,'DTNEND'
,'DTMSEQ'
,'AMARARI'
,'AMZOUGEN'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
,'AMTORIHIKI'
];
//関連情報補填(採番)
//買掛取引№
var numList = TALON.getNumberingData('XDMF_EF_URIKAKE', 1)
itemDataList['NRURIKAKE'] = numList[0];
//関連情報補填(品目マスタ) ※品目IDが入っているときのみ
if (itemDataList['IDHINMOKU'] != '') {
var itemSelectList = selectBT010(itemDataList['IDHINMOKU']);
var lineDataMap = itemSelectList[0];
//品番
itemDataList['TXHINBAN'] = lineDataMap['TXHINBAN'];
//品名
itemDataList['TXHINMEI'] = lineDataMap['TXHINMEI'];
//単位区分
itemDataList['KBUNIT'] = lineDataMap['KBUNIT'];
}
//共通
itemDataList['CREATED_DATE'] = tln_com_nowdate();
itemDataList['CREATED_BY'] = tln_com_user_id();
itemDataList['CREATED_PRG_NM'] = tln_com_func_id();
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = 1;
var _NENDO = getNENDO(itemDataList['DTTORIHIKI']);
var _GMSEQ = getGMSEQ(itemDataList['DTTORIHIKI']);
checkNENDO(_NENDO, _GMSEQ);
//年度
itemDataList['DTNEND'] = _NENDO;
//月序
itemDataList['DTMSEQ'] = _GMSEQ;
TALON.insertByMap( 'ET100', itemDataList , itemColNameTbl );
}
function insertAkaET100(_NRURIKAKE) {
//関連情報補填(採番)
//買掛取引№
var numList = TALON.getNumberingData('XDMF_EF_URIKAKE', 1)
_NEXT_NRURIKAKE = numList[0];
//
TALON.insert(
" INSERT INTO ET100 ( " +
" NRURIKAKE " +
" ,IDTOKUISAKI " +
" ,DTTORIHIKI " +
" ,KBURITORI " +
" ,KBURIHURI " +
" ,KBAKADEN " +
" ,FGVALID " +
" ,IDHINMOKU " +
" ,TXHINBAN " +
" ,TXHINMEI " +
" ,KBUNIT " +
" ,PRTORIHIKI " +
" ,QTTORIHIKI " +
" ,AMTAX " +
" ,AMGENKA " +
" ,NRSOURCE " +
" ,NRSEIKYU " +
" ,DTCREATE " +
" ,TXREFNO " +
" ,DTNEND " +
" ,DTMSEQ " +
" ,AMARARI " +
" ,AMZOUGEN " +
" ,AMTORIHIKI " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" ) " +
" SELECT " +
" '" + _NEXT_NRURIKAKE + "' " +
" ,IDTOKUISAKI " +
" ,DTTORIHIKI " +
" ,KBURITORI " +
" ,KBURIHURI " +
" ,'2' " +
" ,'F' " +
" ,IDHINMOKU " +
" ,TXHINBAN " +
" ,TXHINMEI " +
" ,KBUNIT " +
" ,PRTORIHIKI " +
" ,QTTORIHIKI " +
" ,AMTAX " +
" ,AMGENKA " +
" ,NRSOURCE " +
" ,NRSEIKYU " +
" ,DTCREATE " +
" ,TXREFNO " +
" ,DTNEND " +
" ,DTMSEQ " +
" ,AMARARI " +
" ,(AMZOUGEN * -1) " +
" ,AMTORIHIKI " +
" ,TLN_CHAR_TO_DATE('YMDHMS','" + tln_timestamp(tln_com_nowdate_str()) + "') " +
" ,'" + tln_com_user_id() + "' " +
" ,'" + tln_com_func_id() + "' " +
" ,TLN_CHAR_TO_DATE('YMDHMS','" + tln_timestamp(tln_com_nowdate_str()) + "') " +
" ,'" + tln_com_user_id() + "' " +
" ,'" + tln_com_func_id() + "' " +
" ,0 " +
" FROM ET100 " +
" WHERE NRURIKAKE = '" + _NRURIKAKE + "'"
);
}
//-------------------------------------------
//[部品]製造指示[JT010]
//-------------------------------------------
function selectJT010(_NRSEIZO) {
var sql =
" SELECT " +
" NRSEIZO " +
" ,IDTOKUISAKI " +
" ,SQSYUKKASAKI " +
" ,TXTYUMONBANGO " +
" ,IDHINMOKU " +
" ,DTNOUKI " +
" ,QTJYUTYU " +
" ,QTSYUKKA " +
" ,QTSEIZO " +
" ,QTKANSEI " +
" ,QTHURYO " +
" ,QTHAIKI " +
" ,AMGENKA " +
" ,PRMITSUMORI " +
" ,PRJYUTYU " +
" ,TXTEKIYO " +
" ,CDSOUKOKAN " +
" ,CDSOUKOZAI " +
" ,DTCREATE " +
" ,DTHAKKO " +
" ,DTSYUKKO " +
" ,DTKANSEI " +
" ,DTSYUKKA " +
" ,DTCANCEL " +
" ,NRSOURCE " +
" ,STSEIZO " +
" ,PRYOTEIGEN " +
" ,AMHANBAI " +
" ,AMARARI " +
" ,PRGENKA " +
" ,TXSEIZOYOTEI " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" FROM JT010 " +
" WHERE JT010.NRSEIZO = '" + _NRSEIZO + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateJT010(itemDataList) {
//項目
var itemColNameTbl = [
'NRSEIZO'
,'IDTOKUISAKI'
,'SQSYUKKASAKI'
,'TXTYUMONBANGO'
,'IDHINMOKU'
,'DTNOUKI'
,'QTJYUTYU'
,'QTSYUKKA'
,'QTSEIZO'
,'QTKANSEI'
,'QTHURYO'
,'QTHAIKI'
,'AMGENKA'
,'PRMITSUMORI'
,'PRJYUTYU'
,'TXTEKIYO'
,'CDSOUKOKAN'
,'CDSOUKOZAI'
,'DTCREATE'
,'DTHAKKO'
,'DTSYUKKO'
,'DTKANSEI'
,'DTSYUKKA'
,'DTCANCEL'
,'NRSOURCE'
,'STSEIZO'
,'PRYOTEIGEN'
,'AMHANBAI'
,'AMARARI'
,'PRGENKA'
,'TXSEIZOYOTEI'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
var itemSelectList = selectJT010(itemDataList['NRSEIZO']);
var lineDataMap = itemSelectList[0];
var _MODIFY_COUNT = lineDataMap['MODIFY_COUNT'];
//UPDATE
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = (_MODIFY_COUNT + 1);
var whereList = new Array();
var whereTbl1 = [ null, '=' , 'NRSEIZO' ];
whereList.push(whereTbl1);
TALON.updateByMap( 'JT010', itemDataList , itemColNameTbl , whereList );
}
//-------------------------------------------
//[部品]製造指示工程明細[JT030]
//-------------------------------------------
function selectJT030(_NRSEIZO) {
var sql =
" SELECT " +
" JT030.NRSEIZO " +
" ,JT030.SQKOUTEI " +
" ,JT030.CDKOUTEI " +
" ,JT030.SQCENTER " +
" ,JT030.LTSEIZO " +
" ,JT030.DTFROM " +
" ,JT030.TMFROM " +
" ,JT030.DTTHRU " +
" ,JT030.TMTHRU " +
" ,JT030.SQLIST " +
" ,JT030.TXSAGYOYOTEI " +
" ,JT030.AMKAKOU " +
" ,JT030.CREATED_DATE " +
" ,JT030.CREATED_BY " +
" ,JT030.CREATED_PRG_NM " +
" ,JT030.UPDATED_DATE " +
" ,JT030.UPDATED_BY " +
" ,JT030.UPDATED_PRG_NM " +
" ,JT030.MODIFY_COUNT " +
" ,BT060.RTKAKOU " +
" FROM JT030 " +
" INNER JOIN BT060 " +
" ON BT060.CDKOUTEI = JT030.CDKOUTEI " +
" AND BT060.SQCENTER = JT030.SQCENTER " +
" WHERE JT030.NRSEIZO = '" + _NRSEIZO + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateJT030(itemDataList) {
//項目
var itemColNameTbl = [
'NRSEIZO'
,'SQKOUTEI'
,'CDKOUTEI'
,'SQCENTER'
,'LTSEIZO'
,'DTFROM'
,'TMFROM'
,'DTTHRU'
,'TMTHRU'
,'SQLIST'
,'TXSAGYOYOTEI'
,'AMKAKOU'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
var itemSelectList = selectJT030(itemDataList['NRSEIZO']);
var lineDataMap = itemSelectList[0];
var _MODIFY_COUNT = lineDataMap['MODIFY_COUNT'];
//UPDATE
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = (_MODIFY_COUNT + 1);
var whereList = new Array();
var whereTbl1 = [ null, '=' , 'NRSEIZO' ];
var whereTbl2 = [ null, '=' , 'SQKOUTEI' ];
whereList.push(whereTbl1);
whereList.push(whereTbl2);
TALON.updateByMap( 'JT030', itemDataList , itemColNameTbl , whereList );
}
//-------------------------------------------
//[部品]製造指示材料明細[JT040]
//-------------------------------------------
function selectJT040(_NRSEIZO) {
var sql =
" SELECT " +
" JT040.NRSEIZO " +
" ,JT040.SQZAIRYO " +
" ,JT040.IDHINMOKU " +
" ,JT040.QTTOUNYU " +
" ,JT040.SQKOUTEI " +
" ,JT040.PRYOTEI " +
" ,JT040.PRSYUKKO " +
" ,JT040.SQLIST " +
" ,JT040.CDSOUKO " +
" ,JT040.CREATED_DATE " +
" ,JT040.CREATED_BY " +
" ,JT040.CREATED_PRG_NM " +
" ,JT040.UPDATED_DATE " +
" ,JT040.UPDATED_BY " +
" ,JT040.UPDATED_PRG_NM " +
" ,JT040.MODIFY_COUNT " +
" FROM JT040 " +
" WHERE JT040.NRSEIZO = '" + _NRSEIZO + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]売掛振替[LT010]
//-------------------------------------------
function selectLT010(_NRURIHURI) {
var sql =
" SELECT " +
" NRURIHURI " +
" ,KBURIHURI " +
" ,DTHURIKAE " +
" ,IDTOKUISAKI " +
" ,AMHURIKAE " +
" ,TXTEKIYO " +
" ,NRSEIKYU " +
" ,NRSOURCE " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" ,KBZOUGEN " +
" FROM LT010 " +
" WHERE LT010.NRURIHURI = '" + _NRURIHURI + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]特殊売上[LT020]
//-------------------------------------------
function selectLT020(_NRTOKUURI) {
var sql =
" SELECT " +
" NRTOKUURI " +
",KBTOKUURI " +
",IDTOKUISAKI " +
",SQSYUKKASAKI " +
",DTTORIHIKI " +
",IDHINMOKU " +
",CDSOUKO " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",PRZAIKO " +
",QTZAIKO " +
",TXTEKIYO " +
",NRSOURCE " +
",AMTORIHIKI " +
",AMTAX " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
" FROM LT020 " +
" WHERE LT020.NRTOKUURI = '" + _NRTOKUURI + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]在庫振替[MT010]
//-------------------------------------------
function selectMT010(_NRZAIHURI) {
var sql =
" SELECT " +
" NRZAIHURI " +
" ,CDSOUKO " +
" ,DTHURIKAE " +
" ,KBZOUGEN " +
" ,KBZAIHURI " +
" ,IDHINMOKU " +
" ,PRHURIKAE " +
" ,QTHURIKAE " +
" ,TXTEKIYO " +
" ,NRSOURCE " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" FROM MT010 " +
" WHERE NRZAIHURI = '" + _NRZAIHURI + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]棚卸指示[MT020]
//-------------------------------------------
function selectMT020(_NRTANAOROSI) {
var sql =
" SELECT " +
" NRTANAOROSI " +
" ,CDSOUKO " +
" ,DTKIJYUN " +
" ,DTKAKUTEI " +
" ,TXTEKIYO " +
" ,NRSOURCE " +
" ,DTKIJYUNWORK " +
" ,STTANAOROSI " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" FROM MT020 " +
" WHERE NRTANAOROSI = '" + _NRTANAOROSI + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]棚卸指示明細[MT021]
//-------------------------------------------
function selectMT021(_NRTANAOROSI,_IDHINMOKU) {
var sql =
" SELECT " +
" NRTANAOROSI " +
" ,IDHINMOKU " +
" ,PRKIJYUN " +
" ,QTKIJYUN " +
" ,PRJITSUTANA " +
" ,QTJITSUTANA " +
" ,QTDIFF " +
" ,AMDIFF " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" FROM MT021 " +
" WHERE NRTANAOROSI = '" + _NRTANAOROSI + "' " +
" AND IDHINMOKU = '" + _IDHINMOKU + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateMT021(itemDataList) {
//項目
var itemColNameTbl = [
'NRTANAOROSI'
,'IDHINMOKU'
,'PRKIJYUN'
,'QTKIJYUN'
,'PRJITSUTANA'
,'QTJITSUTANA'
,'QTDIFF'
,'AMDIFF'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
//共通
itemDataList['CREATED_DATE'] = tln_com_nowdate();
itemDataList['CREATED_BY'] = tln_com_user_id();
itemDataList['CREATED_PRG_NM'] = tln_com_func_id();
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = 1;
TALON.insertByMap( 'MT021', itemDataList , itemColNameTbl );
}
//-------------------------------------------
//[部品]棚卸指示明細[MT021]
//-------------------------------------------
function selectMT021_NRTANAOROSI(_NRTANAOROSI) {
var sql =
" SELECT " +
" NRTANAOROSI " +
" ,IDHINMOKU " +
" ,PRKIJYUN " +
" ,QTKIJYUN " +
" ,PRJITSUTANA " +
" ,QTJITSUTANA " +
" ,QTDIFF " +
" ,AMDIFF " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" FROM MT021 " +
" WHERE NRTANAOROSI = '" + _NRTANAOROSI + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]在庫移動指示[MT030]
//-------------------------------------------
function selectMT030(_NRZAIIDOU) {
var sql =
" SELECT " +
" NRZAIIDOU " +
" ,CDSOUKOFROM " +
" ,CDSOUKOTHRU " +
" ,DTSHIJI " +
" ,DTKANRYOU " +
" ,TXTEKIYO " +
" ,NRSOURCE " +
" ,STZAIIDOU " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" FROM MT030 " +
" WHERE NRZAIIDOU = '" + _NRZAIIDOU + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]在庫移動指示明細[MT031]
//-------------------------------------------
function selectMT031_NRZAIIDOU(_NRZAIIDOU) {
var sql =
" SELECT " +
" NRZAIIDOU " +
" ,IDHINMOKU " +
" ,PRZAIIDOU " +
" ,QTZAIIDOU " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
" FROM MT031 " +
" WHERE NRZAIIDOU = '" + _NRZAIIDOU + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[部品]工程日付計算リバース
//-------------------------------------------
function calcDTTM_R(sBasDy,sBasTm,sLet,_kakof,_kakot,_calender) {
var rec = '';
var flg1 = true;
var flg2 = true;
sBasDy = sBasDy.toString().split(" ")[0];
tln_com_log("☆R[param ]" + sBasDy + " / " + sBasTm + " / " + sLet + " / " + _kakof + " / " + _kakot + " / " + _calender);
//スタート時点の基準日が既に稼働対象外の場合は直近の稼働に変更する
if (_kakot < sBasTm ) {
tln_com_log("☆R[param ] (1)");
sBasTm = _kakot;
}
if (_kakof > sBasTm ) {
tln_com_log("☆R[param ] (2)");
sBasTm = _kakot;
//前日完了
var wdate = tln_com_todatetime(sBasDy + " " + "00:00:00");
wdate.setMinutes(wdate.getMinutes() - 1);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
flg2 = true;
while (flg2){
if (getHOLIDAY_FLG(_calender,sBasDy + ' 00:00:00') == '0') {
flg2 = false;
} else {
wdate = tln_com_todatetime(sBasDy + ' 00:00:00');
wdate.setMinutes(wdate.getMinutes() - 1);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
}
}
}
rec = sBasDy + " " + sBasTm;
while (flg1){
sBasDy = sBasDy.toString().split(" ")[0];
var wdate = tln_com_todatetime(sBasDy + " " + sBasTm);
var wdatl = tln_com_todatetime(sBasDy + " " + sBasTm);
wdatl.setMinutes(wdate.getMinutes() - sLet);
var wdats = tln_com_todatetime(sBasDy + " " + _kakof);
var tdate = tln_com_date2string2(wdatl);
var tDat = tdate.toString().split(" ")[0];
var tTim = tdate.toString().split(" ")[1];
tTim = tln_com_lcut(tTim,5);
tln_com_log("☆R[wdate ]" + wdate);
tln_com_log("☆R[sLet ]" + sLet);
tln_com_log("☆R[wdatl ]" + wdatl);
tln_com_log("☆R[wdats ]" + wdats);
tln_com_log("☆R[tDat ]" + tDat);
tln_com_log("☆R[sBasDy ]" + sBasDy);
tln_com_log("☆R[tTim ]" + tTim);
tln_com_log("☆R[kakof ]" + _kakof);
if (tDat == sBasDy && tTim >= _kakof) {
sBasTm = tTim;
flg1 = false;
} else {
//日付が異なっている場合、もしくは同日でも稼働開始時間より前の開始時刻の場合
//基準から開始日までの時間を計算し残りリードタイムを計算し
//基準日を前日、基準時間を稼働終了時刻にして再度実施
//var sWok = wdats - wdate;
var sWok = getDiff(tln_com_date2string2(wdats),tln_com_date2string2(wdate));
if (sWok < 0) {
sWok = sWok * -1;
}
sLet = sLet - sWok;
tln_com_log("☆R[sWok ]" + sWok);
tln_com_log("☆R[sLet ]" + sLet);
var wdate = tln_com_todatetime(sBasDy + " " + "00:00:00");
wdate.setMinutes(wdate.getMinutes() - 1);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
flg2 = true;
while (flg2){
if (getHOLIDAY_FLG(_calender,sBasDy + ' 00:00:00') == '0') {
flg2 = false;
} else {
wdate = tln_com_todatetime(sBasDy + ' 00:00:00');
wdate.setMinutes(wdate.getMinutes() - 1);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
}
}
sBasTm = _kakot;
}
}
tln_com_log("☆R[return ]" + (sBasDy + " " + sBasTm + "," + rec));
return (sBasDy + " " + sBasTm + "," + rec);
}
//-------------------------------------------
//[部品]工程日付計算フォワード
//返り値:(完了日),(開始日)
//-------------------------------------------
function calcDTTM_F(sBasDy,sBasTm,sLet,_kakof,_kakot,_calender) {
var rec = '';
var flg1 = true;
var flg2 = true;
sBasDy = sBasDy.toString().split(" ")[0];
tln_com_log("☆F[param ]" + sBasDy + " / " + sBasTm + " / " + sLet + " / " + _kakof + " / " + _kakot + " / " + _calender);
//スタート時点の基準日が既に稼働対象外の場合は直近の稼働に変更する
if (_kakof > sBasTm ) {
tln_com_log("☆F[param ] (1)");
sBasTm = _kakof;
}
if (_kakot < sBasTm ) {
tln_com_log("☆F[param ] (2)");
sBasTm = _kakof;
//翌日開始
var wdate = tln_com_todatetime(sBasDy + " " + "23:59:00");
wdate.setMinutes(wdate.getMinutes() + 1);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
flg2 = true;
while (flg2){
if (getHOLIDAY_FLG(_calender,sBasDy + ' 00:00:00') == '0') {
flg2 = false;
} else {
wdate = tln_com_todatetime(sBasDy + ' 23:59:00');
wdate.setMinutes(wdate.getMinutes() + 2);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
}
}
}
rec = sBasDy + " " + sBasTm;
while (flg1){
sBasDy = sBasDy.toString().split(" ")[0];
var wdate = tln_com_todatetime(sBasDy + " " + sBasTm);
var wdatl = tln_com_todatetime(sBasDy + " " + sBasTm);
wdatl.setMinutes(wdate.getMinutes() + sLet);
var wdats = tln_com_todatetime(sBasDy + " " + _kakot);
var tdate = tln_com_date2string2(wdatl);
var tDat = tdate.toString().split(" ")[0];
var tTim = tdate.toString().split(" ")[1];
tTim = tln_com_lcut(tTim,5);
tln_com_log("☆F[wdate ]" + wdate);
tln_com_log("☆F[sLet ]" + sLet);
tln_com_log("☆F[wdatl ]" + wdatl);
tln_com_log("☆F[wdats ]" + wdats);
tln_com_log("☆F[tDat ]" + tDat);
tln_com_log("☆F[sBasDy ]" + sBasDy);
tln_com_log("☆F[tTim ]" + tTim);
tln_com_log("☆F[_kakof ]" + _kakof);
if (tDat == sBasDy && tTim <= _kakot) {
sBasTm = tTim;
flg1 = false;
} else {
//日付が異なっている場合、もしくは同日でも稼働完了時間より先の終了時刻の場合
//基準から終了日までの時間を計算し残りリードタイムを計算し
//基準日を翌日、基準時間を稼働開始時刻にして再度実施
//var sWok = wdats - wdate;
var sWok = getDiff(tln_com_date2string2(wdats),tln_com_date2string2(wdate));
if (sWok < 0) {
sWok = sWok * -1;
}
sLet = sLet - sWok;
tln_com_log("☆F[sWok ]" + sWok);
tln_com_log("☆F[sLet ]" + sLet);
var wdate = tln_com_todatetime(sBasDy + " " + "23:59:00");
wdate.setMinutes(wdate.getMinutes() + 2);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
flg2 = true;
while (flg2){
if (getHOLIDAY_FLG(_calender,sBasDy + ' 00:00:00') == '0') {
flg2 = false;
} else {
wdate = tln_com_todatetime(sBasDy + ' 23:59:00');
wdate.setMinutes(wdate.getMinutes() + 2);
var tdate = tln_com_date2string2(wdate);
sBasDy = tdate.toString().split(" ")[0];
}
}
sBasTm = _kakof;
}
}
tln_com_log("☆R[return ]" + (sBasDy + " " + sBasTm + "," + rec));
return (sBasDy + " " + sBasTm + "," + rec);
}
function getDiff(date1Str, date2Str) {
var date1 = new Date(date1Str);
var date2 = new Date(date2Str);
var msDiff = date2.getTime() - date1.getTime();
var daysDiff = Math.floor(msDiff / (1000 * 60));
return (++daysDiff) - 1;
}
≣ サーバJS ライブラリXDMF_JS002_0 [共通]仕入関連 45996字
//-------------------------------------------
//[処理]入庫処理
//-------------------------------------------
//入庫新規登録
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量
// 6 : 税抜金額
// 7 : ソース番号
// 8 : 参照番号
function exec_nyuko_ins(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _ZEINUKI_KINGAKU, _NRSOURCE, _TXREFNO) {
//数値準備
var itemSelectList = selectBT010(_HINMOKU);
var lineDataMap = itemSelectList[0];
var _C_SURYO = _SURYO;
var _C_ZEIGAKU = _ZEINUKI_KINGAKU * getTAX_RATE(_TORIHIKIDATE);
var _C_KINGAKU_NUKI = _ZEINUKI_KINGAKU;
var _C_KINGAKU_KOMI = _ZEINUKI_KINGAKU + _C_ZEIGAKU;
var _C_TANKA_NUKI = _C_KINGAKU_NUKI / _C_SURYO;
var _C_TANKA_KOMI = _C_KINGAKU_KOMI / _C_SURYO;
var _C_SURYO_KEISU = _C_SURYO * lineDataMap['VLKANZAN'];
var _C_TANKA_KOMI_KEISU = _C_KINGAKU_KOMI / _C_SURYO_KEISU;
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = _C_SURYO_KEISU;
//期間出庫数
itemDataList['QTSYUKKO'] = 0;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額(税込金額)
itemDataList['AMNYUKO'] = _C_KINGAKU_KOMI;
//期間出庫額
itemDataList['AMSYUKKO'] = 0;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + _C_SURYO_KEISU;
//期間出庫数
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額(税込金額)
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + _C_KINGAKU_KOMI;
//期間出庫額
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分 (030 : 仕入入庫)
itemDataList['KBUKEBARAI'] = "030";
//振替区分 (Null)
itemDataList['KBZAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
//取引単価(係数込税込単価)
itemDataList['PRTORIHIKI'] = _C_TANKA_KOMI_KEISU;
//取引数(係数込取引数)
itemDataList['QTTORIHIKI'] = _C_SURYO_KEISU;
//取引額(税込金額)
itemDataList['AMTORIHIKI'] = _C_KINGAKU_KOMI;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(係数込取引数)
itemDataList['QTZOUGEN'] = _C_SURYO_KEISU;
//残高増減額(税込金額
itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI;
updateFT100(itemDataList);
//買掛履歴作成
//--------------------
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = _TORIHIKISAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分 (00:入荷仕入)
itemDataList['KBKAITORI'] = "00";
//振替区分 (Null)
itemDataList['KBKAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//取引単価(税抜単価)
itemDataList['PRTORIHIKI'] = _C_TANKA_NUKI;
//取引数
itemDataList['QTTORIHIKI'] = _C_SURYO;
//税抜取引額(税抜金額)
itemDataList['AMTORIHIKI'] = _C_KINGAKU_NUKI;
//消費税額
itemDataList['AMTAX'] = _C_ZEIGAKU;
//支払依頼№
itemDataList['NRSIHARAI'] = "";
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減額(税込金額)
itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI;
updateDT100(itemDataList);
//仕入先情報更新
//--------------------
var itemDataList = new Array();
//仕入先情報取得
var itemSelectList = selectDT010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI'];
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI'];
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE'];
//期間仕入額(税込金額)
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE'] + _C_KINGAKU_KOMI;
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI'];
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE'];
updateDT010(itemDataList);
}
//-------------------------------------------
//入庫取消削除
// 1 : 品目コード
// 2 : 取引先
// 3 : 倉庫
// 4 : 取引日
// 5 : 数量
// 6 : 税抜金額
// 7 : ソース番号
// 8 : 参照番号
//
// * : 在庫取引№
// * : 買掛取引№
function exec_nyuko_del(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _ZEINUKI_KINGAKU, _NRSOURCE, _TXREFNO,
_NRZAITORI, _NRKAIKAKE) {
//数値準備
// * var itemSelectList = selectBT010(_HINMOKU);
// * var lineDataMap = itemSelectList[0];
// *
// * var _C_SURYO = _SURYO;
// * var _C_ZEIGAKU = _ZEINUKI_KINGAKU * getTAX_RATE(_TORIHIKIDATE);
// * var _C_KINGAKU_NUKI = _ZEINUKI_KINGAKU;
// * var _C_KINGAKU_KOMI = _ZEINUKI_KINGAKU + _C_ZEIGAKU;
// * var _C_TANKA_NUKI = _C_KINGAKU_NUKI / _C_SURYO;
// * var _C_TANKA_KOMI = _C_KINGAKU_KOMI / _C_SURYO;
// *
// * var _C_SURYO_KEISU = _C_SURYO * lineDataMap['VLKANZAN'];
// * var _C_TANKA_KOMI_KEISU = _C_KINGAKU_KOMI / _C_SURYO_KEISU;
var itemSelectList = selectFT100(_NRZAITORI);
var lineDataMapFT100 = itemSelectList[0];
var itemSelectList = selectDT100(_NRKAIKAKE);
var lineDataMapDT100 = itemSelectList[0];
var _C_SURYO = lineDataMapDT100['QTTORIHIKI'];
var _C_ZEIGAKU = lineDataMapDT100['AMTAX'];
var _C_KINGAKU_NUKI = lineDataMapDT100['AMTORIHIKI'];
var _C_KINGAKU_KOMI = lineDataMapDT100['AMZOUGEN'];
var _C_TANKA_NUKI = lineDataMapDT100['PRTORIHIKI'];
//var _C_TANKA_KOMI = (使用無し)
var _C_SURYO_KEISU = lineDataMapFT100['QTTORIHIKI'];
var _C_TANKA_KOMI_KEISU = lineDataMapFT100['PRTORIHIKI'];
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = _C_SURYO_KEISU * -1;
//期間出庫数
itemDataList['QTSYUKKO'] = 0;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額(税込金額)
itemDataList['AMNYUKO'] = _C_KINGAKU_KOMI * -1;
//期間出庫額
itemDataList['AMSYUKKO'] = 0;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + (_C_SURYO_KEISU * -1);
//期間出庫数
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額(税込金額)
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + (_C_KINGAKU_KOMI * -1);
//期間出庫額
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
// * var itemDataList = new Array();
// *
// * //取引日
// * itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
// * //受払区分 (030 : 仕入入庫)
// * itemDataList['KBUKEBARAI'] = "030";
// * //振替区分 (Null)
// * itemDataList['KBZAIHURI'] = "";
// * //赤黒 (2:赤伝)
// * itemDataList['KBAKADEN'] = "2";
// * //効区 (F:無効)
// * itemDataList['FGVALID'] = "F";
// * //品目ID
// * itemDataList['IDHINMOKU'] = _HINMOKU;
// * //倉庫C
// * itemDataList['CDSOUKO'] = _SOUKO;
// * //相手先名
// * itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
// * //取引単価(係数込税込単価)
// * itemDataList['PRTORIHIKI'] = _C_TANKA_KOMI_KEISU;
// * //取引数(係数込取引数)
// * itemDataList['QTTORIHIKI'] = _C_SURYO_KEISU;
// * //取引額(税込金額)
// * itemDataList['AMTORIHIKI'] = _C_KINGAKU_KOMI;
// * //取引ソース№
// * itemDataList['NRSOURCE'] = _NRSOURCE;
// * //登録日時
// * itemDataList['DTCREATE'] = tln_com_nowdate();
// * //参照番号
// * itemDataList['TXREFNO'] = _TXREFNO;
// * //年度(Null)
// * itemDataList['DTNEND'] = '';
// * //月序(Null)
// * itemDataList['DTMSEQ'] = '';
// * //残高増減数(係数込取引数)
// * itemDataList['QTZOUGEN'] = _C_SURYO_KEISU * -1;
// * //残高増減額(税込金額)
// * itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI * -1;
// *
// * updateFT100(itemDataList);
// *
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + "030" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//買掛履歴作成
//--------------------
// * var itemDataList = new Array();
// *
// * //仕入先ID
// * itemDataList['IDSIIRESAKI'] = _TORIHIKISAKI;
// * //取引日
// * itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
// * //取引区分 (00:入荷仕入)
// * itemDataList['KBKAITORI'] = "00";
// * //振替区分 (Null)
// * itemDataList['KBKAIHURI'] = "";
// * //赤黒 (2:赤伝)
// * itemDataList['KBAKADEN'] = "2";
// * //効区 (F:無効)
// * itemDataList['FGVALID'] = "F";
// * //品目ID
// * itemDataList['IDHINMOKU'] = _HINMOKU;
// * //取引単価(税抜単価)
// * itemDataList['PRTORIHIKI'] = _C_TANKA_NUKI;
// * //取引数
// * itemDataList['QTTORIHIKI'] = _C_SURYO;
// * //税抜取引額(税抜金額)
// * itemDataList['AMTORIHIKI'] = _C_KINGAKU_NUKI;
// * //消費税額(消費税額)
// * itemDataList['AMTAX'] = _C_ZEIGAKU;
// * //支払依頼№
// * itemDataList['NRSIHARAI'] = "";
// * //取引ソース№
// * itemDataList['NRSOURCE'] = _NRSOURCE;
// * //登録日時
// * itemDataList['DTCREATE'] = tln_com_nowdate();
// * //参照番号
// * itemDataList['TXREFNO'] = _TXREFNO;
// * //年度(Null)
// * itemDataList['DTNEND'] = '';
// * //月序(Null)
// * itemDataList['DTMSEQ'] = '';
// * //残高増減額(税込金額)
// * itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI * -1;
// *
// * updateDT100(itemDataList);
// *
insertAkaDT100(_NRKAIKAKE);
//買掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE DT100 SET " +
" FGVALID = 'F' " +
" WHERE KBKAITORI = '" + "00" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//仕入先情報更新
//--------------------
//仕入先情報取得
var itemSelectList = selectDT010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI']
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI']
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI']
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO']
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE']
//期間仕入額(税込金額)
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE'] - _C_KINGAKU_KOMI
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI']
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE']
updateDT010(itemDataList);
}
//-------------------------------------------
//[処理]買掛振替処理
//-------------------------------------------
//買掛振替新規登録
// 1 : 仕入先
// 2 : 取引日
// 3 : 増減区分
// 4 : 振替区分
// 5 : 適用
// 6 : 取引単価
// 7 : ソース番号
// 8 : 参照番号
function exec_kaihuri_ins(_IDSIIRESAKI, _TORIHIKIDATE, _KBZOUGEN, _KBKAIHURI, _TXTEKIYO, _ZEINUKI_HURIKAE, _NRSOURCE, _TXREFNO) {
//数値準備
var _C_SURYO = 1;
var _C_ZEIGAKU = 0;
var _C_KINGAKU_NUKI = _ZEINUKI_HURIKAE;
var _C_KINGAKU_KOMI = _ZEINUKI_HURIKAE + _C_ZEIGAKU;
var _C_TANKA_NUKI = _C_KINGAKU_NUKI / _C_SURYO;
var _C_TANKA_KOMI = _C_KINGAKU_KOMI / _C_SURYO;
//買掛履歴作成
//--------------------
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = _IDSIIRESAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分
if (_KBZOUGEN == '0') {
//増減区分=0:残高減 → 10:振替控除
itemDataList['KBKAITORI'] = "10";
} else {
//増減区分=1:残高増 → 11:振替計上
itemDataList['KBKAITORI'] = "11";
}
//振替区分 (Null)
itemDataList['KBKAIHURI'] = _KBKAIHURI;
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = '';
//品名/摘要
itemDataList['TXHINMEI'] = _TXTEKIYO;
//単位区分
itemDataList['KBUNIT'] = 'CNT';
//取引単価(税抜単価)
itemDataList['PRTORIHIKI'] = _C_TANKA_NUKI;
//取引数
itemDataList['QTTORIHIKI'] = _C_SURYO;
//税抜取引額(税抜金額)
itemDataList['AMTORIHIKI'] = _C_KINGAKU_NUKI;
//消費税額
itemDataList['AMTAX'] = _C_ZEIGAKU;
//支払依頼№
itemDataList['NRSIHARAI'] = "";
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減額(税込金額)
if (_KBZOUGEN == '0') {
//増減区分=0:残高減 → 10:振替控除
var _AMZOUGEN = _C_KINGAKU_KOMI * -1;
} else {
//増減区分=1:残高増 → 11:振替計上
var _AMZOUGEN = _C_KINGAKU_KOMI;
}
itemDataList['AMZOUGEN'] = _AMZOUGEN;
updateDT100(itemDataList);
//仕入先情報更新
//--------------------
//仕入先情報取得
var itemSelectList = selectDT010(_IDSIIRESAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI']
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI']
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI']
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO']
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE']
//期間仕入額(税込金額)
if (_KBZOUGEN == '0') {
//増減区分=0:残高減 → 10:振替控除
var _AMZOUGEN = _C_KINGAKU_KOMI * -1;
} else {
//増減区分=1:残高増 → 11:振替計上
var _AMZOUGEN = _C_KINGAKU_KOMI;
}
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE'] + _AMZOUGEN
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI']
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE']
updateDT010(itemDataList);
}
//-------------------------------------------
//買掛振替取消削除
// 1 : 仕入先
// 2 : 取引日
// 3 : 増減区分
// 4 : 振替区分
// 5 : 適用
// 6 : 取引単価
// 7 : ソース番号
// 8 : 参照番号
//
// * : 買掛取引№
function exec_kaihuri_del(_IDSIIRESAKI, _TORIHIKIDATE, _KBZOUGEN, _KBKAIHURI, _TXTEKIYO, _ZEINUKI_HURIKAE, _NRSOURCE, _TXREFNO,
_NRKAIKAKE) {
//数量準備
// * var _C_SURYO = 1;
// * var _C_ZEIGAKU = 0;
// * var _C_KINGAKU_NUKI = _ZEINUKI_HURIKAE;
// * var _C_KINGAKU_KOMI = _ZEINUKI_HURIKAE + _C_ZEIGAKU;
// * var _C_TANKA_NUKI = _C_KINGAKU_NUKI / _C_SURYO;
// * var _C_TANKA_KOMI = _C_KINGAKU_KOMI / _C_SURYO;
var itemSelectList = selectDT100(_NRKAIKAKE);
var lineDataMapDT100 = itemSelectList[0];
var _C_SURYO = lineDataMapDT100['QTTORIHIKI'];
var _C_ZEIGAKU = lineDataMapDT100['AMTAX'];
var _C_KINGAKU_NUKI = lineDataMapDT100['AMTORIHIKI'];
var _C_KINGAKU_KOMI = lineDataMapDT100['AMZOUGEN'];
if (_C_KINGAKU_KOMI < 0 ) {
_C_KINGAKU_KOMI = _C_KINGAKU_KOMI * -1;
}
var _C_TANKA_NUKI = lineDataMapDT100['PRTORIHIKI'];
//var _C_TANKA_KOMI = (使用無し)
//買掛履歴作成
//--------------------
// * var itemDataList = new Array();
// *
// * //仕入先ID
// * itemDataList['IDSIIRESAKI'] = _IDSIIRESAKI;
// * //取引日
// * itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
// * //取引区分
// * if (_KBZOUGEN == '0') {
// * //増減区分=0:残高減 → 10:振替控除
// * itemDataList['KBKAITORI'] = "10";
// * } else {
// * //増減区分=1:残高増 → 11:振替計上
// * itemDataList['KBKAITORI'] = "11";
// * }
// * //振替区分 (Null)
// * itemDataList['KBKAIHURI'] = _KBKAIHURI;
// * //赤黒 (2:赤伝)
// * itemDataList['KBAKADEN'] = "2";
// * //効区 (F:無効)
// * itemDataList['FGVALID'] = "F";
// * //品目ID
// * itemDataList['IDHINMOKU'] = '';
// * //品名/摘要
// * itemDataList['TXHINMEI'] = _TXTEKIYO;
// * //単位区分
// * itemDataList['KBUNIT'] = 'CNT';
// * //取引単価(税抜単価)
// * itemDataList['PRTORIHIKI'] = _C_TANKA_NUKI;
// * //取引数
// * itemDataList['QTTORIHIKI'] = _C_SURYO;
// * //税抜取引額(税抜金額)
// * itemDataList['AMTORIHIKI'] = _C_KINGAKU_NUKI;
// * //消費税額
// * itemDataList['AMTAX'] = _C_ZEIGAKU;
// * //支払依頼№
// * itemDataList['NRSIHARAI'] = "";
// * //取引ソース№
// * itemDataList['NRSOURCE'] = _NRSOURCE;
// * //登録日時
// * itemDataList['DTCREATE'] = tln_com_nowdate();
// * //参照番号
// * itemDataList['TXREFNO'] = _TXREFNO;
// * //年度(Null)
// * itemDataList['DTNEND'] = '';
// * //月序(Null)
// * itemDataList['DTMSEQ'] = '';
// * //残高増減額(税込金額)
// * if (_KBZOUGEN == '0') {
// * //増減区分=0:残高減 → 10:振替控除
// * var _AMZOUGEN = _C_KINGAKU_KOMI * -1;
// * } else {
// * //増減区分=1:残高増 → 11:振替計上
// * var _AMZOUGEN = _C_KINGAKU_KOMI;
// * }
// * itemDataList['AMZOUGEN'] = _AMZOUGEN * -1;
// *
// * updateDT100(itemDataList);
// *
insertAkaDT100(_NRKAIKAKE);
//買掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
if (_KBZOUGEN == '0') {
//増減区分=0:残高減 → 10:振替控除
var _KBKAITORI = "10";
} else {
//増減区分=1:残高増 → 11:振替計上
var _KBKAITORI = "11";
}
TALON.update( " UPDATE DT100 SET " +
" FGVALID = 'F' " +
" WHERE KBKAITORI = '" + _KBKAITORI + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//仕入先情報更新
//--------------------
//仕入先情報取得
var itemSelectList = selectDT010(_IDSIIRESAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI']
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI']
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI']
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO']
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE']
//期間仕入額
//期間仕入額(税込金額)
if (_KBZOUGEN == '0') {
//増減区分=0:残高減 → 10:振替控除
var _AMZOUGEN = _C_KINGAKU_KOMI * -1;
} else {
//増減区分=1:残高増 → 11:振替計上
var _AMZOUGEN = _C_KINGAKU_KOMI;
}
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE'] + (_AMZOUGEN * -1)
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI']
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE']
updateDT010(itemDataList);
}
//-------------------------------------------
//[処理]特殊仕入処理
//-------------------------------------------
//特殊仕入新規登録
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 取引区分
// 6 : 取引数
// 7 : 税抜単価
// 8 : 税抜取引額
// 9 : 消費税額
// 10 : ソース番号
// 11 : 参照番号
function exec_tsiire_ins(
_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _KBTOKUSIIRE,
_SURYO, _ZEINUKI_TANKA, _ZEINUKI_KINGAKU, _ZEIGAKU,
_NRSOURCE, _TXREFNO) {
//数値準備
var itemSelectList = selectBT010(_HINMOKU);
var lineDataMap = itemSelectList[0];
var _C_SURYO = _SURYO;
var _C_ZEIGAKU = _ZEIGAKU;
var _C_KINGAKU_NUKI = _ZEINUKI_KINGAKU;
var _C_KINGAKU_KOMI = _ZEINUKI_KINGAKU + _C_ZEIGAKU;
var _C_TANKA_NUKI = _ZEINUKI_TANKA;
var _C_TANKA_KOMI = _C_KINGAKU_KOMI / _C_SURYO;
var _C_SURYO_KEISU = _C_SURYO * lineDataMap['VLKANZAN'];
var _C_TANKA_KOMI_KEISU = _C_KINGAKU_KOMI / _C_SURYO_KEISU;
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
/*
取引区分=10:仕入返品 → 買掛取引区分=02:仕入返品 →出庫
取引区分=20:直接入荷 → 買掛取引区分=01:直入荷仕入 →入庫
*/
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期首在庫額
itemDataList['AMKISYU'] = 0;
if (_KBTOKUSIIRE == '20') {
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = _C_SURYO_KEISU;
//期間出庫数
itemDataList['QTSYUKKO'] = 0;
//期間入庫額(税込金額)
itemDataList['AMNYUKO'] = _C_KINGAKU_KOMI;
//期間出庫額
itemDataList['AMSYUKKO'] = 0;
} else {
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(係数込取引数)
itemDataList['QTSYUKKO'] = _C_SURYO_KEISU;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(税込金額)
itemDataList['AMSYUKKO'] = _C_KINGAKU_KOMI;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
if (_KBTOKUSIIRE == '20') {
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + _C_SURYO_KEISU;
//期間出庫数
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + _C_KINGAKU_KOMI;
//期間出庫額
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(係数込取引数)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _C_SURYO_KEISU;
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + _C_KINGAKU_KOMI;
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分
//10:仕入返品 → 02:仕入返品 → 140:仕入返品
//20:直接入荷 → 01:直入荷仕入 → 040:直仕入入庫
if (_KBTOKUSIIRE == '20') {
itemDataList['KBUKEBARAI'] = "040";
} else {
itemDataList['KBUKEBARAI'] = "140";
}
//振替区分 (Null)
itemDataList['KBZAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
//取引単価(係数込税込単価)
itemDataList['PRTORIHIKI'] = _C_TANKA_KOMI_KEISU;
//取引数(係数込取引数)
itemDataList['QTTORIHIKI'] = _C_SURYO_KEISU;
//取引額(税込金額)
itemDataList['AMTORIHIKI'] = _C_KINGAKU_KOMI;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
if (_KBTOKUSIIRE == '20') {
//20:直接入荷 → 01:直入荷仕入 → 040:直仕入入庫
//残高増減数(係数込税込単価
itemDataList['QTZOUGEN'] = _C_SURYO_KEISU;
//残高増減額(税込金額)
itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI;
} else {
//10:仕入返品 → 02:仕入返品 → 140:仕入返品
//残高増減数(係数込税込単価
itemDataList['QTZOUGEN'] = _C_SURYO_KEISU * -1;
//残高増減額(税込金額)
itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI * -1;
}
updateFT100(itemDataList);
//買掛履歴作成
//--------------------
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = _TORIHIKISAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分
//10:仕入返品 → 02:仕入返品
//20:直接入荷 → 01:直入荷仕入
if (_KBTOKUSIIRE == '20') {
itemDataList['KBKAITORI'] = "01";
} else {
itemDataList['KBKAITORI'] = "02";
}
//振替区分 (Null)
itemDataList['KBKAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//取引単価(税抜単価)
itemDataList['PRTORIHIKI'] = _C_TANKA_NUKI;
//取引数
itemDataList['QTTORIHIKI'] = _C_SURYO;
//税抜取引額(税抜金額)
itemDataList['AMTORIHIKI'] = _C_KINGAKU_NUKI;
//消費税額
itemDataList['AMTAX'] = _C_ZEIGAKU;
//支払依頼№
itemDataList['NRSIHARAI'] = "";
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減額(税込金額)
if (_KBTOKUSIIRE == '20') {
//20:直接入荷 → 01:直入荷仕入
itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI;
} else {
//10:仕入返品 → 02:仕入返品
itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI * -1;
}
updateDT100(itemDataList);
//仕入先情報更新
//--------------------
var itemDataList = new Array();
//仕入先情報取得
var itemSelectList = selectDT010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI'];
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI'];
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE'];
//期間仕入額(税込金額)
if (_KBTOKUSIIRE == '20') {
//20:直接入荷 → 01:直入荷仕入
var _AMSIIRE = _C_KINGAKU_KOMI;
} else {
//10:仕入返品 → 02:仕入返品
var _AMSIIRE = _C_KINGAKU_KOMI * -1;
}
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE'] + _AMSIIRE;
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI'];
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE'];
updateDT010(itemDataList);
}
//-------------------------------------------
//特殊仕入取消削除
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 取引区分
// 6 : 取引数
// 7 : 税抜単価
// 8 : 税抜取引額
// 9 : 消費税額
// 10 : ソース番号
// 11 : 参照番号
//
// * : 在庫取引№
// * : 買掛取引№
function exec_tsiire_del(
_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _KBTOKUSIIRE,
_SURYO, _ZEINUKI_TANKA, _ZEINUKI_KINGAKU, _ZEIGAKU,
_NRSOURCE, _TXREFNO,
_NRZAITORI, _NRKAIKAKE) {
//数値準備
// * var itemSelectList = selectBT010(_HINMOKU);
// * var lineDataMap = itemSelectList[0];
// *
// * var _C_SURYO = _SURYO;
// * var _C_ZEIGAKU = _ZEIGAKU;
// * var _C_KINGAKU_NUKI = _ZEINUKI_KINGAKU;
// * var _C_KINGAKU_KOMI = _ZEINUKI_KINGAKU + _C_ZEIGAKU;
// * var _C_TANKA_NUKI = _ZEINUKI_TANKA;
// * var _C_TANKA_KOMI = _C_KINGAKU_KOMI / _C_SURYO;
// *
// * var _C_SURYO_KEISU = _C_SURYO * lineDataMap['VLKANZAN'];
// * var _C_TANKA_KOMI_KEISU = _C_KINGAKU_KOMI / _C_SURYO_KEISU;
var itemSelectList = selectFT100(_NRZAITORI);
var lineDataMapFT100 = itemSelectList[0];
var itemSelectList = selectDT100(_NRKAIKAKE);
var lineDataMapDT100 = itemSelectList[0];
var _C_SURYO = lineDataMapDT100['QTTORIHIKI'];
var _C_ZEIGAKU = lineDataMapDT100['AMTAX'];
var _C_KINGAKU_NUKI = lineDataMapDT100['AMTORIHIKI'];
var _C_KINGAKU_KOMI = lineDataMapDT100['AMZOUGEN'];
if (_C_KINGAKU_KOMI < 0 ) {
_C_KINGAKU_KOMI = _C_KINGAKU_KOMI * -1;
}
var _C_TANKA_NUKI = lineDataMapDT100['PRTORIHIKI'];
//var _C_TANKA_KOMI = (使用無し)
var _C_SURYO_KEISU = lineDataMapFT100['QTTORIHIKI'];
var _C_TANKA_KOMI_KEISU = lineDataMapFT100['PRTORIHIKI'];
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
/*
取引区分=10:仕入返品 → 買掛取引区分=02:仕入返品 →出庫
取引区分=20:直接入荷 → 買掛取引区分=01:直入荷仕入 →入庫
*/
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期首在庫額
itemDataList['AMKISYU'] = 0;
if (_KBTOKUSIIRE == '20') {
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = _C_SURYO_KEISU * -1;
//期間出庫数
itemDataList['QTSYUKKO'] = 0;
//期間入庫額(税込金額)
itemDataList['AMNYUKO'] = _C_KINGAKU_KOMI * -1;
//期間出庫額
itemDataList['AMSYUKKO'] = 0;
} else {
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(係数込取引数)
itemDataList['QTSYUKKO'] = _C_SURYO_KEISU * -1;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(税込金額)
itemDataList['AMSYUKKO'] = _C_KINGAKU_KOMI * -1;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
if (_KBTOKUSIIRE == '20') {
//期間入庫数(係数込取引数)
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + (_C_SURYO_KEISU * -1);
//期間出庫数
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
//期間入庫額(税込金額)
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + (_C_KINGAKU_KOMI * -1);
//期間出庫額
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(係数込取引数)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + (_C_SURYO_KEISU * -1);
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額(税込金額)
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + (_C_KINGAKU_KOMI * -1);
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
// * var itemDataList = new Array();
// *
// * //取引日
// * itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
// * //受払区分
// * //10:仕入返品 → 02:仕入返品 → 140:仕入返品
// * //20:直接入荷 → 01:直入荷仕入 → 040:直仕入入庫
// * if (_KBTOKUSIIRE == '20') {
// * itemDataList['KBUKEBARAI'] = "040";
// * } else {
// * itemDataList['KBUKEBARAI'] = "140";
// * }
// * //振替区分 (Null)
// * itemDataList['KBZAIHURI'] = "";
// * //赤黒 (2:赤伝)
// * itemDataList['KBAKADEN'] = "2";
// * //効区 (F:無効)
// * itemDataList['FGVALID'] = "F";
// * //品目ID
// * itemDataList['IDHINMOKU'] = _HINMOKU;
// * //倉庫C
// * itemDataList['CDSOUKO'] = _SOUKO;
// * //相手先名
// * itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
// * //取引単価(係数込税込単価)
// * itemDataList['PRTORIHIKI'] = _C_TANKA_KOMI_KEISU;
// * //取引数(係数込取引数)
// * itemDataList['QTTORIHIKI'] = _C_SURYO_KEISU;
// * //取引額(税込金額)
// * itemDataList['AMTORIHIKI'] = _C_KINGAKU_KOMI;
// * //取引ソース№
// * itemDataList['NRSOURCE'] = _NRSOURCE;
// * //登録日時
// * itemDataList['DTCREATE'] = tln_com_nowdate();
// * //参照番号
// * itemDataList['TXREFNO'] = _TXREFNO;
// * //年度(Null)
// * itemDataList['DTNEND'] = '';
// * //月序(Null)
// * itemDataList['DTMSEQ'] = '';
// * if (_KBTOKUSIIRE == '20') {
// * //20:直接入荷 → 01:直入荷仕入 → 040:直仕入入庫
// * //残高増減数(係数込取引数)
// * itemDataList['QTZOUGEN'] = _C_SURYO_KEISU * -1;
// * //残高増減額(税込金額)
// * itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI * -1;
// * } else {
// * //10:仕入返品 → 02:仕入返品 → 140:仕入返品
// * //残高増減数(係数込取引数)
// * itemDataList['QTZOUGEN'] = (_C_SURYO_KEISU * -1) * -1;
// * //残高増減額(税込金額)
// * itemDataList['AMZOUGEN'] = (_C_KINGAKU_KOMI * -1) * -1;
// * }
// *
// * updateFT100(itemDataList);
// *
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
if (_KBTOKUSIIRE == '20') {
var _KBUKEBARAI = "040";
} else {
var _KBUKEBARAI = "140";
}
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + _KBUKEBARAI + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//買掛履歴作成
//--------------------
// * var itemDataList = new Array();
// *
// * //仕入先ID
// * itemDataList['IDSIIRESAKI'] = _TORIHIKISAKI;
// * //取引日
// * itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
// * //取引区分
// * //10:仕入返品 → 02:仕入返品
// * //20:直接入荷 → 01:直入荷仕入
// * if (_KBTOKUSIIRE == '20') {
// * itemDataList['KBKAITORI'] = "01";
// * } else {
// * itemDataList['KBKAITORI'] = "02";
// * }
// * //振替区分 (Null)
// * itemDataList['KBKAIHURI'] = "";
// * //赤黒 (2:赤伝)
// * itemDataList['KBAKADEN'] = "2";
// * //効区 (F:無効)
// * itemDataList['FGVALID'] = "F";
// * //品目ID
// * itemDataList['IDHINMOKU'] = _HINMOKU;
// * //取引単価(税抜単価)
// * itemDataList['PRTORIHIKI'] = _C_TANKA_NUKI;
// * //取引数
// * itemDataList['QTTORIHIKI'] = _C_SURYO;
// * //税抜取引額(税抜金額)
// * itemDataList['AMTORIHIKI'] = _C_KINGAKU_NUKI;
// * //消費税額
// * itemDataList['AMTAX'] = _C_ZEIGAKU;
// * //支払依頼№
// * itemDataList['NRSIHARAI'] = "";
// * //取引ソース№
// * itemDataList['NRSOURCE'] = _NRSOURCE;
// * //登録日時
// * itemDataList['DTCREATE'] = tln_com_nowdate();
// * //参照番号
// * itemDataList['TXREFNO'] = _TXREFNO;
// * //年度(Null)
// * itemDataList['DTNEND'] = '';
// * //月序(Null)
// * itemDataList['DTMSEQ'] = '';
// * //残高増減額(税込金額)
// * if (_KBTOKUSIIRE == '20') {
// * //20:直接入荷 → 01:直入荷仕入
// * itemDataList['AMZOUGEN'] = _C_KINGAKU_KOMI * -1;
// * } else {
// * //10:仕入返品 → 02:仕入返品
// * itemDataList['AMZOUGEN'] = (_C_KINGAKU_KOMI * -1) * -1;
// * }
// *
// * updateDT100(itemDataList);
// *
insertAkaDT100(_NRKAIKAKE);
//買掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
if (_KBTOKUSIIRE == '20') {
//10:仕入返品 → 02:仕入返品
var _KBKAITORI = "01";
} else {
//20:直接入荷 → 01:直入荷仕入
var _KBKAITORI = "02";
}
TALON.update( " UPDATE DT100 SET " +
" FGVALID = 'F' " +
" WHERE KBKAITORI = '" + _KBKAITORI + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//仕入先情報更新
//--------------------
var itemDataList = new Array();
//仕入先情報取得
var itemSelectList = selectDT010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI']
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI']
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI']
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO']
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE']
//期間仕入額(税込金額)
if (_KBTOKUSIIRE == '20') {
//20:直接入荷 → 01:直入荷仕入
var _AMSIIRE = _C_KINGAKU_KOMI;
} else {
//10:仕入返品 → 02:仕入返品
var _AMSIIRE = _C_KINGAKU_KOMI * -1;
}
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE'] + (_AMSIIRE * -1);
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI']
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE']
updateDT010(itemDataList);
}
//-------------------------------------------
//[処理]仕入関連処理
//-------------------------------------------
//-------------------------------------------
//入荷見出し
function selectHT020(_NRNYUKA) {
var sql =
"SELECT " +
" NRNYUKA " +
",IDSIIRESAKI " +
",DTNYUKA " +
",DTKENSYU " +
",CDSOUKO " +
",STNYUKA " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM HT020 " +
"WHERE NRNYUKA = '" + _NRNYUKA + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//発注見出し
function selectHT010(_NRHATTYU) {
var sql =
"SELECT " +
" HT010.NRHATTYU " +
",HT010.IDSIIRESAKI " +
",HT010.DTHATTYU " +
",HT010.DTCREATE " +
",HT010.CDSOUKO " +
",HT010.TXTEKIYO " +
",HT010.STHATTYU " +
",HT010.CREATED_DATE " +
",HT010.CREATED_BY " +
",HT010.CREATED_PRG_NM " +
",HT010.UPDATED_DATE " +
",HT010.UPDATED_BY " +
",HT010.UPDATED_PRG_NM " +
",HT010.MODIFY_COUNT " +
",HT011.QTHATTYU " +
",HT011.QTKENSYU " +
"FROM HT010 " +
"INNER JOIN ( SELECT NRHATTYU, SUM(QTHATTYU) AS QTHATTYU, SUM(QTKENSYU) AS QTKENSYU FROM HT011 GROUP BY NRHATTYU ) HT011 " +
" ON HT011.NRHATTYU = HT010.NRHATTYU " +
"WHERE HT010.NRHATTYU = '" + _NRHATTYU + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
function updateHT010(itemDataList) {
//項目
var itemColNameTbl = [
'NRHATTYU'
,'IDSIIRESAKI'
,'DTHATTYU'
,'DTCREATE'
,'CDSOUKO'
,'TXTEKIYO'
,'STHATTYU'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
var itemSelectList = selectHT010(itemDataList['NRHATTYU']);
var lineDataMap = itemSelectList[0];
var _MODIFY_COUNT = lineDataMap['MODIFY_COUNT'];
//UPDATE
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = (_MODIFY_COUNT + 1);
var whereList = new Array();
var whereTbl1 = [ null, '=' , 'NRHATTYU' ];
whereList.push(whereTbl1);
TALON.updateByMap( 'HT010', itemDataList , itemColNameTbl , whereList );
}
//発注明細(入荷№)
function selectHT011_NRNYUKA(_NRNYUKA) {
var sql =
"SELECT " +
" HT011.NRHATTYU " +
",HT011.SQHATTYU " +
",HT011.IDHINMOKU " +
",HT011.PRHATTYU " +
",HT011.QTHATTYU " +
",HT011.QTKENSYU " +
",HT011.DTNOUKI " +
",HT011.NRNYUKA " +
",HT011.NRSOURCE " +
",HT011.QTKANZAN " +
",HT011.FGNYUKA " +
",HT011.CREATED_DATE " +
",HT011.CREATED_BY " +
",HT011.CREATED_PRG_NM " +
",HT011.UPDATED_DATE " +
",HT011.UPDATED_BY " +
",HT011.UPDATED_PRG_NM " +
",HT011.MODIFY_COUNT " +
",HT010.IDSIIRESAKI " +
",HT010.CDSOUKO " +
"FROM HT011 " +
"INNER JOIN HT010 " +
" ON HT010.NRHATTYU = HT011.NRHATTYU " +
"WHERE NRNYUKA = '" + _NRNYUKA + "' "
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//在庫増減履歴(受払区分+取引ソース番号)
function selectFT100_NRSOURCE(_KBUKEBARAI,_NRSOURCE) {
var sql =
"SELECT " +
" NRZAITORI " +
",DTTORIHIKI " +
",KBUKEBARAI " +
",KBZAIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",CDSOUKO " +
",TXAITESAKI " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTORIHIKI " +
",AMSAGAKU " +
",NRSOURCE " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",QTZOUGEN " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM FT100 " +
"WHERE KBUKEBARAI = '" + _KBUKEBARAI + "'" +
" AND FGVALID = 'T'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//買掛振替[KT010]
function selectKT010(_NRKAIHURI) {
var sql =
"SELECT " +
" NRKAIHURI " +
",KBKAIHURI " +
",DTHURIKAE " +
",IDSIIRESAKI " +
",AMHURIKAE " +
",TXTEKIYO " +
",NRSOURCE " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
",KBZOUGEN " +
"FROM KT010 " +
"WHERE NRKAIHURI = '" + _NRKAIHURI + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//買掛増減履歴(受払区分+取引ソース番号)
function selectDT100_NRSOURCE(_KBKAITORI,_NRSOURCE) {
var sql =
"SELECT " +
" NRKAIKAKE " +
",IDSIIRESAKI " +
",DTTORIHIKI " +
",KBKAITORI " +
",KBKAIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTORIHIKI " +
",AMTAX " +
",NRSIHARAI " +
",NRSOURCE " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM DT100 " +
"WHERE KBKAITORI = '" + _KBKAITORI + "'" +
" AND FGVALID = 'T'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//特殊仕入[KT020]
function selectKT020(_NRTOKUSIIRE) {
var sql =
"SELECT " +
" NRTOKUSIIRE " +
",KBTOKUSIIRE " +
",IDSIIRESAKI " +
",DTTORIHIKI " +
",IDHINMOKU " +
",CDSOUKO " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",PRZAIKO " +
",TXTEKIYO " +
",NRSOURCE " +
",AMTORIHIKI " +
",AMTAX " +
",QTZAITORI " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM KT020 " +
"WHERE NRTOKUSIIRE = '" + _NRTOKUSIIRE + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[処理]支払関連
//-------------------------------------------
//支払依頼[DT110]
function selectDT110(_NRSIHARAI) {
var sql =
"SELECT " +
" NRSIHARAI " +
" ,IDSIIRESAKI " +
" ,DTSIHARAI " +
" ,DTSYONIN " +
" ,KBSIHARAI " +
" ,TXSEIKYU " +
" ,TXTEKIYO " +
" ,NRSOURCE " +
" ,AMSIHARAI " +
" ,STSIHARAI " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
"FROM DT110 " +
"WHERE NRSIHARAI = '" + _NRSIHARAI + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[処理]支払承認
//-------------------------------------------
// 1 : 仕入先ID
// 2 : 支払承認日
// 3 : 支払依頼額
// 4 : 摘要
// 5 : ソース番号
// 6 : 参照番号
function exec_shiharaisyonin_ins(_TORIHIKISAKI, _TORIHIKIDATE, _AMSIHARAI, _TXTEKIYO , _NRSOURCE, _TXREFNO) {
//買掛履歴作成
//--------------------
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = _TORIHIKISAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分 (90:支払)
itemDataList['KBKAITORI'] = "90";
//振替区分 (Null)
itemDataList['KBKAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = "";
//品目名/摘要
itemDataList['TXHINMEI'] = _TXTEKIYO;
//取引単価(税抜単価)
itemDataList['PRTORIHIKI'] = _AMSIHARAI;
//取引数
itemDataList['QTTORIHIKI'] = 1;
//税抜取引額(税抜金額)
itemDataList['AMTORIHIKI'] = _AMSIHARAI;
//消費税額
itemDataList['AMTAX'] = 0;
//支払依頼№
itemDataList['NRSIHARAI'] = "";
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減額(税込金額)
itemDataList['AMZOUGEN'] = _AMSIHARAI;
updateDT100(itemDataList);
//仕入先情報更新
//--------------------
var itemDataList = new Array();
//仕入先情報取得
var itemSelectList = selectDT010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI'];
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI'];
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE'];
//期間仕入額(税込金額)
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE'];
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI'] + _AMSIHARAI;
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE'];
updateDT010(itemDataList);
}
// 1 : 仕入先ID
// 2 : 支払承認日
// 3 : 支払依頼額
// 4 : 摘要
// 5 : ソース番号
// 6 : 参照番号
// * : 買掛取引№
function exec_shiharaisyonin_del(_TORIHIKISAKI, _TORIHIKIDATE, _AMSIHARAI, _TXTEKIYO , _NRSOURCE, _TXREFNO, _NRKAIKAKE) {
//買掛履歴作成
insertAkaDT100(_NRKAIKAKE);
//買掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE DT100 SET " +
" FGVALID = 'F' " +
" WHERE KBKAITORI = '" + "90" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//仕入先情報更新
//--------------------
//仕入先情報取得
var itemSelectList = selectDT010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//仕入先ID
itemDataList['IDSIIRESAKI'] = lineDataMap['IDSIIRESAKI']
//支払方法区分
itemDataList['KBSIHARAI'] = lineDataMap['KBSIHARAI']
//振込銀行口座
itemDataList['TXHURIKOMI'] = lineDataMap['TXHURIKOMI']
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO']
//期首買掛残高
itemDataList['AMKISYUKAIKAKE'] = lineDataMap['AMKISYUKAIKAKE']
//期間仕入額(税込金額)
itemDataList['AMSIIRE'] = lineDataMap['AMSIIRE']
//期間支払額
itemDataList['AMSIHARAI'] = lineDataMap['AMSIHARAI'] - _AMSIHARAI
//現買掛残高
itemDataList['AMGENKAIKAKE'] = lineDataMap['AMGENKAIKAKE']
updateDT010(itemDataList);
}
≣ サーバJS ライブラリXDMF_JS003_0 [共通]製造関連 70763字
//-------------------------------------------
//[処理]出庫処理
//-------------------------------------------
//出庫新規登録
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量
// 6 : 税抜単価
// 7 : 税抜金額
// 8 : ソース番号
// 9 : 参照番号
function exec_syuko_ins(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _TANKA, _KINGAKU, _NRSOURCE, _TXREFNO) {
//在庫更新
//--------------------
var _QTZOUGEN = _SURYO * -1
var _AMZOUGEN = _KINGAKU * -1
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = _SURYO;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = _KINGAKU;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _SURYO;
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + _KINGAKU;
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分 (160:材料出庫)
itemDataList['KBUKEBARAI'] = "160";
//振替区分 (Null)
itemDataList['KBZAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _TANKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _SURYO;
//取引額(金額)
itemDataList['AMTORIHIKI'] = _KINGAKU;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)
itemDataList['QTZOUGEN'] = _QTZOUGEN;
//残高増減額(金額)
itemDataList['AMZOUGEN'] = _AMZOUGEN;
updateFT100(itemDataList);
}
//-------------------------------------------
//出庫取消削除
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量
// 6 : 税抜単価
// 7 : 税抜金額
// 8 : ソース番号
// 9 : 参照番号
//
// * : 在庫取引№
function exec_syuko_del(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _TANKA, _KINGAKU, _NRSOURCE, _TXREFNO,
_NRZAITORI
) {
//数値準備(赤データで再セット)
var itemSelectList = selectFT100(_NRZAITORI);
var lineDataMapFT100 = itemSelectList[0];
_SURYO = lineDataMapFT100['QTTORIHIKI'];
_KINGAKU = lineDataMapFT100['AMTORIHIKI'];
_TANKA = lineDataMapFT100['PRTORIHIKI'];
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = _SURYO * -1;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = _KINGAKU * -1;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + (_SURYO * -1);
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + (_KINGAKU * -1);
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + "160" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'" +
" AND NRZAITORI = '" + _NRZAITORI + "'"
);
}
//-------------------------------------------
//[処理]完成・出荷(完成入庫)処理
//-------------------------------------------
//完成・出荷入庫新規登録
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量
// 6 : 税抜単価
// 7 : 税抜金額
// 8 : ソース番号
// 9 : 参照番号
function exec_kansei_nyuko_ins(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _TANKA, _KINGAKU, _NRSOURCE, _TXREFNO) {
//計算
//--------------------
var _C_KINGAKU = _SURYO * _TANKA;
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数(数量)
itemDataList['QTNYUKO'] = _SURYO;
//期間出庫数
itemDataList['QTSYUKKO'] = 0;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額(金額)
itemDataList['AMNYUKO'] = _C_KINGAKU;
//期間出庫額
itemDataList['AMSYUKKO'] = 0;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数(数量)
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + _SURYO;
//期間出庫数
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額(金額)
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + _C_KINGAKU;
//期間出庫額
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分 (060 : 完成入庫)
itemDataList['KBUKEBARAI'] = "060";
//振替区分 (Null)
itemDataList['KBZAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _TANKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _SURYO;
//取引額(金額)
itemDataList['AMTORIHIKI'] = _C_KINGAKU;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)
itemDataList['QTZOUGEN'] = _SURYO;
//残高増減額(金額)
itemDataList['AMZOUGEN'] = _C_KINGAKU;
updateFT100(itemDataList);
}
//-------------------------------------------
//完成出荷入庫取消削除
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量
// 6 : 税抜単価
// 7 : 税抜金額
// 8 : ソース番号
// 9 : 参照番号
//
// * : 在庫取引№
function exec_kansei_nyuko_del(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _TANKA, _KINGAKU, _NRSOURCE, _TXREFNO,
_NRZAITORI) {
//数値準備(赤データで再セット)
var itemSelectList = selectFT100(_NRZAITORI);
var lineDataMapFT100 = itemSelectList[0];
_SURYO = lineDataMapFT100['QTTORIHIKI'];
_KINGAKU = lineDataMapFT100['AMTORIHIKI'];
_TANKA = lineDataMapFT100['PRTORIHIKI'];
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数(数量)
itemDataList['QTNYUKO'] = _SURYO * -1;
//期間出庫数
itemDataList['QTSYUKKO'] = 0;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額(金額)
itemDataList['AMNYUKO'] = _KINGAKU * -1;
//期間出庫額
itemDataList['AMSYUKKO'] = 0;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数(数量)
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + (_SURYO * -1);
//期間出庫数
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額(金額)
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + (_KINGAKU * -1);
//期間出庫額
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + "060" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
}
//-------------------------------------------
//[処理]完成・出荷(廃棄)処理
//-------------------------------------------
//完成・出荷(廃棄)新規登録
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量
// 6 : 税抜単価
// 7 : 税抜金額
// 8 : ソース番号
// 9 : 参照番号
function exec_kansei_haiki_ins(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _TANKA, _KINGAKU, _NRSOURCE, _TXREFNO) {
//計算
//--------------------
var _C_KINGAKU = _SURYO * _TANKA;
//在庫更新
//--------------------
var _QTZOUGEN = _SURYO * -1
var _AMZOUGEN = _C_KINGAKU * -1
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = _SURYO;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = _C_KINGAKU;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _SURYO;
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + _C_KINGAKU;
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分 (120 : 振替出庫)
itemDataList['KBUKEBARAI'] = "120";
//振替区分 (11:雑損)
itemDataList['KBZAIHURI'] = "11";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _TANKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _SURYO;
//取引額(金額)
itemDataList['AMTORIHIKI'] = _C_KINGAKU;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)
itemDataList['QTZOUGEN'] = _QTZOUGEN;
//残高増減額(金額)
itemDataList['AMZOUGEN'] = _AMZOUGEN;
updateFT100(itemDataList);
}
//-------------------------------------------
//完成・出荷(廃棄)取消削除
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量
// 6 : 税抜単価
// 7 : 税抜金額
// 8 : ソース番号
// 9 : 参照番号
//
// * : 在庫取引№
function exec_kansei_haiki_del(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _SURYO, _TANKA, _KINGAKU, _NRSOURCE, _TXREFNO,
_NRZAITORI) {
//数値準備(赤データで再セット)
var itemSelectList = selectFT100(_NRZAITORI);
var lineDataMapFT100 = itemSelectList[0];
_SURYO = lineDataMapFT100['QTTORIHIKI'];
_KINGAKU = lineDataMapFT100['AMTORIHIKI'];
_TANKA = lineDataMapFT100['PRTORIHIKI'];
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = _SURYO * -1;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = _KINGAKU * -1;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + (_SURYO * -1);
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + (_KINGAKU * -1);
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + "120" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
}
//-------------------------------------------
//[処理]完成・出荷(販売出荷)処理
//-------------------------------------------
//完成・出荷(販売出荷)新規登録
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量(出荷数)
// 6 : 単価(実勢原価)
// 7 : 単価(受注単価)
// 8 : 実勢原価額
// 9 : ソース番号
// 10 : 参照番号
function exec_kansei_hanbai_ins(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE,
_SYUKA_SURYO, _JISEI_GENKA, _JUCHU_TANKA, _JISEI_KINGAKU,
_NRSOURCE, _TXREFNO) {
//計算
//取引額=実勢原価額
//出荷額
var _C_SYUKA_KINGAKU = _SYUKA_SURYO * _JISEI_GENKA;
var _C_JISEI_KINGAKU = _C_SYUKA_KINGAKU;
//受注金額/消費税額
var _C_JUCHU_KINGAKU_NUKI = _SYUKA_SURYO * _JUCHU_TANKA;
var _C_JUCHU_ZEIGAKU = _C_JUCHU_KINGAKU_NUKI * getTAX_RATE(_TORIHIKIDATE);
var _C_JUCHU_KINGAKU_KOMI = _C_JUCHU_KINGAKU_NUKI + _C_JUCHU_ZEIGAKU;
//在庫更新
//--------------------
var _QTZOUGEN = _SYUKA_SURYO * -1
var _AMZOUGEN = _C_SYUKA_KINGAKU * -1
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = _SYUKA_SURYO;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = _C_SYUKA_KINGAKU;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _SYUKA_SURYO;
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + _C_SYUKA_KINGAKU;
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分 (130 : 売上出庫)
itemDataList['KBUKEBARAI'] = "130";
//振替区分 (Null)
itemDataList['KBZAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _JISEI_GENKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _SYUKA_SURYO;
//取引額(金額)
itemDataList['AMTORIHIKI'] = _C_SYUKA_KINGAKU;
//取引差額 ['(【製造指示】出荷数 *【製造指示】受注単価)-【製造指示】実勢原価額]
itemDataList['AMSAGAKU'] = (_SYUKA_SURYO * _JUCHU_TANKA) - _C_JISEI_KINGAKU;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)
itemDataList['QTZOUGEN'] = _QTZOUGEN;
//残高増減額(金額)
itemDataList['AMZOUGEN'] = _AMZOUGEN;
updateFT100(itemDataList);
//売掛履歴作成
//--------------------
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = _TORIHIKISAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分(00 : 出荷売上)
itemDataList['KBURITORI'] = "00";
//振替区分(Null)
itemDataList['KBURIHURI'] = "";
//赤黒(1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区(T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//取引単価(受注単価)
itemDataList['PRTORIHIKI'] = _JUCHU_TANKA;
//取引数(出荷数)
itemDataList['QTTORIHIKI'] = _SYUKA_SURYO;
//消費税額(受注金額消費税額)
itemDataList['AMTAX'] = _C_JUCHU_ZEIGAKU;
//販売原価
itemDataList['AMGENKA'] = _C_JISEI_KINGAKU;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//請求№(Null)
itemDataList['NRSEIKYU'] = "";
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//粗利額
itemDataList['AMARARI'] = _C_JUCHU_KINGAKU_NUKI - _C_JISEI_KINGAKU;
//残高増減額
itemDataList['AMZOUGEN'] = _C_JUCHU_KINGAKU_KOMI;
//税抜取引額
itemDataList['AMTORIHIKI'] = _C_JUCHU_KINGAKU_NUKI;
updateET100(itemDataList);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + _C_JUCHU_KINGAKU_KOMI;
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'];
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}
//-------------------------------------------
//完成・出荷(販売出荷)取消削除
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 数量(出荷数)
// 6 : 数量(受注数)
// 7 : 単価(実勢原価)
// 8 : 単価(受注単価)
// 9 : 実勢原価額
// 10 : ソース番号
// 11 : 参照番号
//
// * : 在庫取引№
// * : 売掛取引№
function exec_kansei_hanbai_del(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE,
_SYUKA_SURYO, _JISEI_GENKA, _JUCHU_TANKA, _JISEI_KINGAKU,
_NRSOURCE, _TXREFNO,
_NRZAITORI, _NRURIKAKE) {
//数値準備
// * //出荷額
// * var _C_SYUKA_KINGAKU = _SYUKA_SURYO * _JISEI_GENKA;
// * //受注金額/消費税額
// * var _C_JUCHU_KINGAKU_NUKI = _SYUKA_SURYO * _JUCHU_TANKA;
// * var _C_JUCHU_ZEIGAKU = _C_JUCHU_KINGAKU_NUKI * getTAX_RATE(_TORIHIKIDATE);
// * var _C_JUCHU_KINGAKU_KOMI = _C_JUCHU_KINGAKU_NUKI + _C_JUCHU_ZEIGAKU;
//数値準備(赤データで再セット)
var itemSelectList = selectFT100(_NRZAITORI);
var lineDataMapFT100 = itemSelectList[0];
var itemSelectList = selectET100(_NRURIKAKE);
var lineDataMapET100 = itemSelectList[0];
_SYUKA_SURYO = lineDataMapFT100['QTTORIHIKI'];
_JISEI_GENKA = lineDataMapFT100['PRTORIHIKI'];
var _C_SYUKA_KINGAKU = lineDataMapFT100['AMTORIHIKI'];
var _C_JUCHU_KINGAKU_NUKI = lineDataMapET100['AMTORIHIKI'];
var _C_JUCHU_ZEIGAKU = lineDataMapET100['AMTAX'];
var _C_JUCHU_KINGAKU_KOMI = _C_JUCHU_KINGAKU_NUKI + _C_JUCHU_ZEIGAKU;
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数
itemDataList['QTNYUKO'] = 0;
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = _SYUKA_SURYO * -1;
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額
itemDataList['AMNYUKO'] = 0;
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = _C_SYUKA_KINGAKU * -1;
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
//期間出庫数(数量)
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + (_SYUKA_SURYO * -1);
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
//期間出庫額(金額)
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + (_C_SYUKA_KINGAKU * -1);
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + "130" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//売掛履歴作成
//--------------------
insertAkaET100(_NRURIKAKE);
//売掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE ET100 SET " +
" FGVALID = 'F' " +
" WHERE KBURITORI = '" + "00" + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + (_C_JUCHU_KINGAKU_KOMI * -1);
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'];
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}
//-------------------------------------------
//[処理]売掛振替登録処理
//-------------------------------------------
//売掛振替登録処理
// 1 : 取引先コード
// 2 : 取引日
// 3 : 増減区分
// 4 : 振替区分
// 5 : 適用
// 6 : 振替額
// 7 : ソース番号
// 8 : 参照番号(売掛振替№)
function exec_urikake_ins(_TORIHIKISAKI, _TORIHIKIDATE, _ZOGENKBN, _HURIKAEKBN, _TEKIYO, _HURIKAEGAKU,
_NRSOURCE, _TXREFNO) {
//売掛履歴作成
//--------------------
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = _TORIHIKISAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分(00 : 出荷売上)
if (_ZOGENKBN == '0') {
//10:振替控除
itemDataList['KBURITORI'] = "10";
} else {
//11:振替計上
itemDataList['KBURITORI'] = "11";
}
//振替区分(Null)
itemDataList['KBURIHURI'] = _HURIKAEKBN;
//赤黒(1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区(T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = '';
//品名/摘要
itemDataList['TXHINMEI'] = _TEKIYO;
//単位区分
itemDataList['KBUNIT'] = 'CNT';
//取引単価
itemDataList['PRTORIHIKI'] = _HURIKAEGAKU;
//取引数
itemDataList['QTTORIHIKI'] = 1;
//消費税額
itemDataList['AMTAX'] = 0;
//販売原価
itemDataList['AMGENKA'] = 0;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//請求№(Null)
itemDataList['NRSEIKYU'] = "";
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//粗利額
itemDataList['AMARARI'] = 0;
//残高増減額
//取引区分(00 : 出荷売上)
if (_ZOGENKBN == '0') {
//10:振替控除
itemDataList['AMZOUGEN'] = _HURIKAEGAKU * -1;
} else {
//11:振替計上
itemDataList['AMZOUGEN'] = _HURIKAEGAKU;
}
//税抜取引額
itemDataList['AMTORIHIKI'] = _HURIKAEGAKU;
updateET100(itemDataList);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
if (_ZOGENKBN == '0') {
//10:振替控除
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + (_HURIKAEGAKU * -1);
} else {
//11:振替計上
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + _HURIKAEGAKU;
}
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'];
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}
//-------------------------------------------
//売掛振替削除処理
// 1 : 取引先コード
// 2 : 取引日
// 3 : 増減区分
// 4 : 振替区分
// 5 : 適用
// 6 : 振替額
// 7 : ソース番号
// 8 : 参照番号(売掛振替№)
// * : 売掛取引№
// * : 取引区分
function exec_urikake_del(_TORIHIKISAKI, _TORIHIKIDATE, _ZOGENKBN, _HURIKAEKBN, _TEKIYO, _HURIKAEGAKU,
_NRSOURCE, _TXREFNO, _NRURIKAKE,_KBURITORI) {
//売掛履歴作成
//--------------------
insertAkaET100(_NRURIKAKE);
//売掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE ET100 SET " +
" FGVALID = 'F' " +
" WHERE KBURITORI = '" + _KBURITORI + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
//if (_ZOGENKBN == '0') {
if (_KBURITORI == '10') {
//増減区分=0:残高減 → 取引区分=10:振替控除
//10:振替控除
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + ((_HURIKAEGAKU * -1) * -1);
} else {
//11:振替計上
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + (_HURIKAEGAKU * -1);
}
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'];
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}
//-------------------------------------------
//[処理]特殊売上登録処理
//-------------------------------------------
//特殊売上登録処理
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 取引区分
// 6 : 数量
// 7 : 単価
// 8 : 消費税
// 9 税抜取引額
// 10 : 在庫単価
// 11 : 在庫取引数
// 12 : ソース番号
// 13 : 参照番号
function exec_tokuuri_ins(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _TORIHIKIKBN,
_SURYO, _TANKA, _SYOHIZEI, _NUKIGAKU, _ZAIKOTANKA, _ZAIKOTORIHIKISU,
_NRSOURCE, _TXREFNO) {
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数/期間出庫数(数量)
if (_TORIHIKIKBN == '10') {
itemDataList['QTNYUKO'] = _ZAIKOTORIHIKISU;
itemDataList['QTSYUKKO'] = 0;
} else {
itemDataList['QTNYUKO'] = 0;
itemDataList['QTSYUKKO'] = _ZAIKOTORIHIKISU;
}
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額/期間出庫額(金額)
if (_TORIHIKIKBN == '10') {
itemDataList['AMNYUKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA);
itemDataList['AMSYUKKO'] = 0;
} else {
itemDataList['AMNYUKO'] = 0;
itemDataList['AMSYUKKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数/期間出庫数(数量)
if (_TORIHIKIKBN == '10') {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + _ZAIKOTORIHIKISU;
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
} else {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _ZAIKOTORIHIKISU;
}
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額/期間出庫額(金額)
if (_TORIHIKIKBN == '10') {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分
if (_TORIHIKIKBN == '10') {
itemDataList['KBUKEBARAI'] = "050";
} else {
itemDataList['KBUKEBARAI'] = "150";
}
//振替区分 (Null)
itemDataList['KBZAIHURI'] = "";
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _TORIHIKISAKI;
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _ZAIKOTANKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _ZAIKOTORIHIKISU;
//取引額(金額)
itemDataList['AMTORIHIKI'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
//取引差額
itemDataList['AMSAGAKU'] = _NUKIGAKU - (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)/残高増減額(金額)
if (_TORIHIKIKBN == '10') {
itemDataList['QTZOUGEN'] = _ZAIKOTORIHIKISU;
itemDataList['AMZOUGEN'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
} else {
itemDataList['QTZOUGEN'] = _ZAIKOTORIHIKISU * -1;
itemDataList['AMZOUGEN'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU) * -1;
}
updateFT100(itemDataList);
//売掛履歴作成
//--------------------
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = _TORIHIKISAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分
if (_TORIHIKIKBN == '10') {
itemDataList['KBURITORI'] = "02";
} else {
itemDataList['KBURITORI'] = "01";
}
//振替区分(Null)
itemDataList['KBURIHURI'] = "";
//赤黒(1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区(T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//取引単価
itemDataList['PRTORIHIKI'] = _TANKA;
//取引数(出荷数)
itemDataList['QTTORIHIKI'] = _SURYO;
//消費税額
itemDataList['AMTAX'] = _SYOHIZEI;
//販売原価
itemDataList['AMGENKA'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//請求№(Null)
itemDataList['NRSEIKYU'] = "";
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//粗利額
itemDataList['AMARARI'] = _NUKIGAKU - (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
//残高増減額
if (_TORIHIKIKBN == '10') {
itemDataList['AMZOUGEN'] = (_NUKIGAKU + _SYOHIZEI) * -1;
} else {
itemDataList['AMZOUGEN'] = _NUKIGAKU + _SYOHIZEI;
}
//税抜取引額
itemDataList['AMTORIHIKI'] = _NUKIGAKU;
updateET100(itemDataList);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
if (_TORIHIKIKBN == '10') {
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + ( (_NUKIGAKU + _SYOHIZEI) * -1 );
} else {
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + (_NUKIGAKU + _SYOHIZEI);
}
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'];
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}
//-------------------------------------------
//特殊売上削除処理
// 1 : 品目コード
// 2 : 取引先コード
// 3 : 倉庫コード
// 4 : 取引日
// 5 : 取引区分
// 6 : 数量
// 7 : 単価
// 8 : 消費税
// 9 税抜取引額
// 10 : 在庫単価
// 11 : 在庫取引数
// 12 : ソース番号
// 13 : 参照番号
//
// * : 在庫取引№
// * : 売掛取引№
function exec_tokuuri_del(_HINMOKU, _TORIHIKISAKI, _SOUKO, _TORIHIKIDATE, _TORIHIKIKBN,
_SURYO, _TANKA, _SYOHIZEI, _NUKIGAKU, _ZAIKOTANKA, _ZAIKOTORIHIKISU,
_NRSOURCE, _TXREFNO,
_NRZAITORI, _NRURIKAKE) {
//数値準備(赤データで再セット)
// * var itemSelectList = selectFT100(_NRZAITORI);
// * var lineDataMapFT100 = itemSelectList[0];
// * _SYUKA_SURYO = lineDataMapFT100['QTTORIHIKI'];
// * _JISEI_GENKA = lineDataMapFT100['PRTORIHIKI'];
// * var _C_SYUKA_KINGAKU = lineDataMapFT100['AMTORIHIKI'];
var itemSelectList = selectET100(_NRURIKAKE);
var lineDataMapET100 = itemSelectList[0];
// * var _C_JUCHU_KINGAKU_NUKI = lineDataMapET100['AMTORIHIKI'];
// * var _C_JUCHU_ZEIGAKU = lineDataMapET100['AMTAX'];
// * var _C_JUCHU_KINGAKU_KOMI = _C_JUCHU_KINGAKU_NUKI + _C_JUCHU_ZEIGAKU;
var _AMZOUGEN = lineDataMapET100['AMZOUGEN'];
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数/期間出庫数(数量)
if (_TORIHIKIKBN == '02') {
itemDataList['QTNYUKO'] = _ZAIKOTORIHIKISU * -1;
itemDataList['QTSYUKKO'] = 0;
} else {
itemDataList['QTNYUKO'] = 0;
itemDataList['QTSYUKKO'] = _ZAIKOTORIHIKISU * -1;
}
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額/期間出庫額(金額)
if (_TORIHIKIKBN == '02') {
itemDataList['AMNYUKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1;
itemDataList['AMSYUKKO'] = 0;
} else {
itemDataList['AMNYUKO'] = 0;
itemDataList['AMSYUKKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1 ;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数/期間出庫数(数量)
if (_TORIHIKIKBN == '02') {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + (_ZAIKOTORIHIKISU * -1);
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
} else {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + (_ZAIKOTORIHIKISU * -1);
}
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額/期間出庫額(金額)
if (_TORIHIKIKBN == '02') {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + ( (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1);
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + ( (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1) ;
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
//受払区分
if (_TORIHIKIKBN == '02') {
var _KBUKEBARAI = "050";
} else {
var _KBUKEBARAI = "150";
}
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + _KBUKEBARAI + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//売掛履歴作成
//--------------------
insertAkaET100(_NRURIKAKE);
//売掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE ET100 SET " +
" FGVALID = 'F' " +
" WHERE KBURITORI = '" + _TORIHIKIKBN + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
//itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + (_C_JUCHU_KINGAKU_KOMI * -1);
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'] + (_AMZOUGEN * -1);
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'];
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}
//-------------------------------------------
//[処理]在庫振替の保守
//-------------------------------------------
//在庫振替登録処理
// 1 : 品目コード
// 2 : 倉庫コード
// 3 : 振替日(取引日)
// 4 : 増減区分
// 4 : 振替区分
// 5 : 取引数量
// 6 : 取引単価
// 7 : ソース番号
// 8 : 参照番号
function exec_zaihuri_ins(_HINMOKU, _SOUKO, _TORIHIKIDATE, _ZOGENKBN, _HURIKAEKBN,
_ZAIKOTORIHIKISU, _ZAIKOTANKA, _NRSOURCE, _TXREFNO) {
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数/期間出庫数(数量)
if (_ZOGENKBN == '1') {
itemDataList['QTNYUKO'] = _ZAIKOTORIHIKISU;
itemDataList['QTSYUKKO'] = 0;
} else {
itemDataList['QTNYUKO'] = 0;
itemDataList['QTSYUKKO'] = _ZAIKOTORIHIKISU;
}
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額/期間出庫額(金額)
if (_ZOGENKBN == '1') {
itemDataList['AMNYUKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA);
itemDataList['AMSYUKKO'] = 0;
} else {
itemDataList['AMNYUKO'] = 0;
itemDataList['AMSYUKKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数/期間出庫数(数量)
if (_ZOGENKBN == '1') {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + _ZAIKOTORIHIKISU;
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
} else {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _ZAIKOTORIHIKISU;
}
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額/期間出庫額(金額)
if (_ZOGENKBN == '1') {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分
if (_ZOGENKBN == '1') {
itemDataList['KBUKEBARAI'] = "020";
} else {
itemDataList['KBUKEBARAI'] = "120";
}
//振替区分 (Null)
itemDataList['KBZAIHURI'] = _HURIKAEKBN;
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = "";
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _ZAIKOTANKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _ZAIKOTORIHIKISU;
//取引額(金額)
itemDataList['AMTORIHIKI'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
//取引差額
itemDataList['AMSAGAKU'] = 0;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)/残高増減額(金額)
if (_ZOGENKBN == '1') {
itemDataList['QTZOUGEN'] = _ZAIKOTORIHIKISU;
itemDataList['AMZOUGEN'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
} else {
itemDataList['QTZOUGEN'] = _ZAIKOTORIHIKISU * -1;
itemDataList['AMZOUGEN'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU) * -1;
}
updateFT100(itemDataList);
}
//-------------------------------------------
//[処理]在庫振替削除
//-------------------------------------------
//在庫振替削除処理
// 1 : 品目コード
// 2 : 倉庫コード
// 3 : 振替日(取引日)
// 5 : 取引数量
// 6 : 取引単価
// 7 : 受払区分
// 7 : ソース番号
// 8 : 参照番号
// * : 在庫取引№
function exec_zaihuri_del(_HINMOKU, _SOUKO, _TORIHIKIDATE, _ZAIKOTORIHIKISU, _ZAIKOTANKA, _KBUKEBARAI,
_NRSOURCE, _TXREFNO, _NRZAITORI) {
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数/期間出庫数(数量)
if (_KBUKEBARAI == '020') {
itemDataList['QTNYUKO'] = _ZAIKOTORIHIKISU * -1;
itemDataList['QTSYUKKO'] = 0;
} else {
itemDataList['QTNYUKO'] = 0;
itemDataList['QTSYUKKO'] = _ZAIKOTORIHIKISU * -1;
}
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額/期間出庫額(金額)
if (_KBUKEBARAI == '020') {
itemDataList['AMNYUKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1;
itemDataList['AMSYUKKO'] = 0;
} else {
itemDataList['AMNYUKO'] = 0;
itemDataList['AMSYUKKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1 ;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数/期間出庫数(数量)
if (_KBUKEBARAI == '020') {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + (_ZAIKOTORIHIKISU * -1);
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
} else {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + (_ZAIKOTORIHIKISU * -1);
}
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額/期間出庫額(金額)
if (_KBUKEBARAI == '020') {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + ( (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1);
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + ( (_ZAIKOTORIHIKISU * _ZAIKOTANKA) * -1) ;
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
insertAkaFT100(_NRZAITORI);
//入出庫履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE FT100 SET " +
" FGVALID = 'F' " +
" WHERE KBUKEBARAI = '" + _KBUKEBARAI + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
}
//-------------------------------------------
//[処理]在庫振替の保守
//-------------------------------------------
//在庫振替登録処理
// 1 : 品目コード
// 2 : 倉庫コード
// 2 : 相手倉庫コード
// 3 : 振替日(取引日)
// 4 : 受払区分
// 5 : 取引数量
// 6 : 取引単価
// 7 : ソース番号
// 8 : 参照番号
function exec_zaiidou_ins(_HINMOKU, _SOUKO, _AITE_SOUKO, _TORIHIKIDATE, _KBUKEBARAI,
_ZAIKOTORIHIKISU, _ZAIKOTANKA, _NRSOURCE, _TXREFNO) {
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数/期間出庫数(数量)
if (_KBUKEBARAI == '010') {
itemDataList['QTNYUKO'] = _ZAIKOTORIHIKISU;
itemDataList['QTSYUKKO'] = 0;
} else {
itemDataList['QTNYUKO'] = 0;
itemDataList['QTSYUKKO'] = _ZAIKOTORIHIKISU;
}
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額/期間出庫額(金額)
if (_KBUKEBARAI == '010') {
itemDataList['AMNYUKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA);
itemDataList['AMSYUKKO'] = 0;
} else {
itemDataList['AMNYUKO'] = 0;
itemDataList['AMSYUKKO'] = (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数/期間出庫数(数量)
if (_KBUKEBARAI == '010') {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + _ZAIKOTORIHIKISU;
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
} else {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _ZAIKOTORIHIKISU;
}
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額/期間出庫額(金額)
if (_KBUKEBARAI == '010') {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + (_ZAIKOTORIHIKISU * _ZAIKOTANKA) ;
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//受払区分
itemDataList['KBUKEBARAI'] = _KBUKEBARAI;
//振替区分 (Null)
itemDataList['KBZAIHURI'] = null;
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = _AITE_SOUKO;
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _ZAIKOTANKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _ZAIKOTORIHIKISU;
//取引額(金額)
itemDataList['AMTORIHIKI'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
//取引差額
itemDataList['AMSAGAKU'] = 0;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)/残高増減額(金額)
if (_KBUKEBARAI == '010') {
itemDataList['QTZOUGEN'] = _ZAIKOTORIHIKISU;
itemDataList['AMZOUGEN'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU);
} else {
itemDataList['QTZOUGEN'] = _ZAIKOTORIHIKISU * -1;
itemDataList['AMZOUGEN'] = (_ZAIKOTANKA * _ZAIKOTORIHIKISU) * -1;
}
updateFT100(itemDataList);
}
//-------------------------------------------
//[処理]棚卸確定更新
//-------------------------------------------
//棚卸確定更新処理
// 1 : 品目コード
// 2 : 倉庫コード
// 4 : 確定日時
// 5 : 実棚数量
// 6 : 基準数量
// 7 : 実棚単価
// 8 : ソース番号
// 9 : 参照番号(棚卸№)
function exec_tanakakutei_ins(_HINMOKU, _SOUKO, _KAKUTEIDATE, _JITSUSU, _KIJUNSU,
_TANKA, _NRSOURCE, _TXREFNO) {
if (_JITSUSU - _KIJUNSU != 0 ) {
if (_JITSUSU == '') { _JITSUSU = 0; }
if (_KIJUNSU == '') { _KIJUNSU = 0; }
if (_TANKA == '') { _TANKA = 0; }
var _KBUKEBARAI = '';
var _QTTORIHIKI = 0;
var _AMTORIHIKI = 0;
var _QTZOUGEN = 0;
var _AMZOUGEN = 0;
if (_JITSUSU - _KIJUNSU > 0 ) {
_KBUKEBARAI = '070';
_QTTORIHIKI = _JITSUSU - _KIJUNSU;
_AMTORIHIKI = (_JITSUSU - _KIJUNSU) * _TANKA;
_QTZOUGEN = _QTTORIHIKI;
_AMZOUGEN = _AMTORIHIKI;
} else {
_KBUKEBARAI = '170';
_QTTORIHIKI = (_JITSUSU - _KIJUNSU) * -1;
_AMTORIHIKI = ((_JITSUSU - _KIJUNSU) * _TANKA) * -1;
_QTZOUGEN = _QTTORIHIKI * -1;
_AMZOUGEN = _AMTORIHIKI * -1;
}
//在庫更新
//--------------------
//現在在庫情報取得
var itemSelectList = selectFT010(_HINMOKU, _SOUKO);
//
var itemDataList = new Array();
if (itemSelectList.length == 0) {
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = 0;
//期間入庫数/期間出庫数(数量)
if (_KBUKEBARAI == '070') {
itemDataList['QTNYUKO'] = _QTTORIHIKI;
itemDataList['QTSYUKKO'] = 0;
} else {
itemDataList['QTNYUKO'] = 0;
itemDataList['QTSYUKKO'] = _QTTORIHIKI;
}
//期首在庫額
itemDataList['AMKISYU'] = 0;
//期間入庫額/期間出庫額(金額)
if (_KBUKEBARAI == '070') {
itemDataList['AMNYUKO'] = _AMTORIHIKI;
itemDataList['AMSYUKKO'] = 0;
} else {
itemDataList['AMNYUKO'] = 0;
itemDataList['AMSYUKKO'] = _AMTORIHIKI;
}
} else {
var lineDataMap = itemSelectList[0];
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//期首在庫数
itemDataList['QTKISYU'] = lineDataMap['QTKISYU'];
//期間入庫数/期間出庫数(数量)
if (_KBUKEBARAI == '070') {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'] + _QTTORIHIKI;
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'];
} else {
itemDataList['QTNYUKO'] = lineDataMap['QTNYUKO'];
itemDataList['QTSYUKKO'] = lineDataMap['QTSYUKKO'] + _QTTORIHIKI;
}
//期首在庫額
itemDataList['AMKISYU'] = lineDataMap['AMKISYU'];
//期間入庫額/期間出庫額(金額)
if (_KBUKEBARAI == '070') {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'] + _AMTORIHIKI ;
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'];
} else {
itemDataList['AMNYUKO'] = lineDataMap['AMNYUKO'];
itemDataList['AMSYUKKO'] = lineDataMap['AMSYUKKO'] + _AMTORIHIKI ;
}
}
updateFT010(itemDataList);
//入出庫履歴作成
//--------------------
var itemDataList = new Array();
//取引日
itemDataList['DTTORIHIKI'] = _KAKUTEIDATE;
//受払区分
itemDataList['KBUKEBARAI'] = _KBUKEBARAI;
//振替区分 (Null)
itemDataList['KBZAIHURI'] = null;
//赤黒 (1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区 (T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = _HINMOKU;
//倉庫C
itemDataList['CDSOUKO'] = _SOUKO;
//相手先名
itemDataList['TXAITESAKI'] = null;
//取引単価(単価)
itemDataList['PRTORIHIKI'] = _TANKA;
//取引数(数量)
itemDataList['QTTORIHIKI'] = _QTTORIHIKI;
//取引額(金額)
itemDataList['AMTORIHIKI'] = _AMTORIHIKI;
//取引差額
itemDataList['AMSAGAKU'] = 0;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//残高増減数(数量)/残高増減額(金額)
itemDataList['QTZOUGEN'] = _QTZOUGEN;
itemDataList['AMZOUGEN'] = _AMZOUGEN;
updateFT100(itemDataList);
}
}
//-------------------------------------------
//[処理]製造関連処理
//-------------------------------------------
//-------------------------------------------
//製造指示[JT010]
function selectJT010(_NRSEIZO) {
var sql =
"SELECT " +
" NRSEIZO " +
",IDTOKUISAKI " +
",SQSYUKKASAKI " +
",TXTYUMONBANGO " +
",IDHINMOKU " +
",DTNOUKI " +
",QTJYUTYU " +
",QTSYUKKA " +
",QTSEIZO " +
",QTKANSEI " +
",QTHURYO " +
",QTHAIKI " +
",AMGENKA " +
",PRMITSUMORI " +
",PRJYUTYU " +
",TXTEKIYO " +
",CDSOUKOKAN " +
",CDSOUKOZAI " +
",DTCREATE " +
",DTHAKKO " +
",DTSYUKKO " +
",DTKANSEI " +
",DTSYUKKA " +
",DTCANCEL " +
",NRSOURCE " +
",STSEIZO " +
",PRYOTEIGEN " +
",AMHANBAI " +
",AMARARI " +
",PRGENKA " +
",TXSEIZOYOTEI " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM JT010 " +
"WHERE NRSEIZO = '" + _NRSEIZO + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//製造指示材料明細(製造指示番号)[JT040]
function selectJT040_NRSEIZO(_NRSEIZO) {
var sql =
"SELECT " +
" NRSEIZO " +
",SQZAIRYO " +
",IDHINMOKU " +
",QTTOUNYU " +
",SQKOUTEI " +
",PRYOTEI " +
",PRSYUKKO " +
",SQLIST " +
",CDSOUKO " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM JT040 " +
"WHERE NRSEIZO = '" + _NRSEIZO + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//在庫増減履歴
function selectFT100(_NRZAITORI) {
var sql =
"SELECT " +
" NRZAITORI " +
",DTTORIHIKI " +
",KBUKEBARAI " +
",KBZAIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",CDSOUKO " +
",TXAITESAKI " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTORIHIKI " +
",AMSAGAKU " +
",NRSOURCE " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",QTZOUGEN " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM FT100 " +
"WHERE NRZAITORI = '" + _NRZAITORI + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//在庫増減履歴(受払区分+取引ソース番号)
function selectFT100_NRSOURCE(_KBUKEBARAI,_NRSOURCE) {
var sql =
"SELECT " +
" NRZAITORI " +
",DTTORIHIKI " +
",KBUKEBARAI " +
",KBZAIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",CDSOUKO " +
",TXAITESAKI " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTORIHIKI " +
",AMSAGAKU " +
",NRSOURCE " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",QTZOUGEN " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
"FROM FT100 " +
"WHERE KBUKEBARAI = '" + _KBUKEBARAI + "'" +
" AND FGVALID = 'T'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//売掛増減履歴(受払区分、効区(T)、取引ソース番号)
function selectET100_NRSOURCE(_KBURITORI, _NRSOURCE) {
var sql =
"SELECT " +
" NRURIKAKE " +
",IDTOKUISAKI " +
",DTTORIHIKI " +
",KBURITORI " +
",KBURIHURI " +
",KBAKADEN " +
",FGVALID " +
",IDHINMOKU " +
",TXHINBAN " +
",TXHINMEI " +
",KBUNIT " +
",PRTORIHIKI " +
",QTTORIHIKI " +
",AMTAX " +
",AMGENKA " +
",NRSOURCE " +
",NRSEIKYU " +
",DTCREATE " +
",TXREFNO " +
",DTNEND " +
",DTMSEQ " +
",AMARARI " +
",AMZOUGEN " +
",CREATED_DATE " +
",CREATED_BY " +
",CREATED_PRG_NM " +
",UPDATED_DATE " +
",UPDATED_BY " +
",UPDATED_PRG_NM " +
",MODIFY_COUNT " +
",AMTORIHIKI " +
"FROM ET100 " +
"WHERE KBURITORI = '" + _KBURITORI + "'" +
" AND FGVALID = 'T'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//請求見出し[ET110]
function insertET110(itemDataList) {
//項目
var itemColNameTbl = [
'NRSEIKYU'
,'IDTOKUISAKI'
,'DTSEIKYU'
,'TXTEKIYO'
,'AMSEIKYU'
,'AMNYUKIN'
,'CREATED_DATE'
,'CREATED_BY'
,'CREATED_PRG_NM'
,'UPDATED_DATE'
,'UPDATED_BY'
,'UPDATED_PRG_NM'
,'MODIFY_COUNT'
];
//var numList = TALON.getNumberingData('XDMF_EF_SEIKYU', 1)
//itemDataList['NRSEIKYU'] = numList[0];
//共通
itemDataList['CREATED_DATE'] = tln_com_nowdate();
itemDataList['CREATED_BY'] = tln_com_user_id();
itemDataList['CREATED_PRG_NM'] = tln_com_func_id();
itemDataList['UPDATED_DATE'] = tln_com_nowdate();
itemDataList['UPDATED_BY'] = tln_com_user_id();
itemDataList['UPDATED_PRG_NM'] = tln_com_func_id();
itemDataList['MODIFY_COUNT'] = 1;
TALON.insertByMap( 'ET110', itemDataList , itemColNameTbl );
}
//-------------------------------------------
//[処理]受領関連
//-------------------------------------------
//受領明細[ET120]
function selectET120(_NRJYURYOU) {
var sql =
"SELECT " +
" NRJYURYOU " +
" ,IDTOKUISAKI " +
" ,DTJYURYOU " +
" ,KBKINSYU " +
" ,AMJYURYOU " +
" ,AMTESURYOU " +
" ,NRSOURCE " +
" ,CREATED_DATE " +
" ,CREATED_BY " +
" ,CREATED_PRG_NM " +
" ,UPDATED_DATE " +
" ,UPDATED_BY " +
" ,UPDATED_PRG_NM " +
" ,MODIFY_COUNT " +
"FROM ET120 " +
"WHERE NRJYURYOU = '" + _NRJYURYOU + "'"
;
var itemSelectList = TALON.select(sql);
return itemSelectList;
}
//-------------------------------------------
//[処理]受領処理
//-------------------------------------------
// 1 : 得意先ID
// 2 : 受領日
// 3 : 金種区分
// 4 : 金額(受領金額/残高控除分手数料)
// 5 : 処理区分(1:金額処理/2:手数料処理)
// 5 : 取引ソース№
// 6 : 受領№
function exec_juryo_ins(_TORIHIKISAKI, _TORIHIKIDATE, _KBKINSYU, _KINGAKU, _SYORIKBN,
_NRSOURCE, _TXREFNO) {
//売掛履歴作成
//--------------------
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = _TORIHIKISAKI;
//取引日
itemDataList['DTTORIHIKI'] = _TORIHIKIDATE;
//取引区分
if (_SYORIKBN == '1') {
if (_KBKINSYU == '1') {
itemDataList['KBURITORI'] = "90";
} else if (_KBKINSYU == '2') {
itemDataList['KBURITORI'] = "91";
} else {
itemDataList['KBURITORI'] = "XX";
}
} else {
itemDataList['KBURITORI'] = "92";
}
//振替区分(Null)
itemDataList['KBURIHURI'] = "";
//赤黒(1:黒伝)
itemDataList['KBAKADEN'] = "1";
//効区(T:有効)
itemDataList['FGVALID'] = "T";
//品目ID
itemDataList['IDHINMOKU'] = "";
//単位区分
itemDataList['KBUNIT'] = "CNT";
//取引単価
itemDataList['PRTORIHIKI'] = _KINGAKU;
//取引数
itemDataList['QTTORIHIKI'] = 1;
//消費税額
itemDataList['AMTAX'] = 0;
//販売原価
itemDataList['AMGENKA'] = 0;
//取引ソース№
itemDataList['NRSOURCE'] = _NRSOURCE;
//請求№(Null)
itemDataList['NRSEIKYU'] = "";
//登録日時
itemDataList['DTCREATE'] = tln_com_nowdate();
//参照番号
itemDataList['TXREFNO'] = _TXREFNO;
//年度(Null)
itemDataList['DTNEND'] = '';
//月序(Null)
itemDataList['DTMSEQ'] = '';
//粗利額
itemDataList['AMARARI'] = 0;
//残高増減額
itemDataList['AMZOUGEN'] = _KINGAKU;
//税抜取引額
itemDataList['AMTORIHIKI'] = _KINGAKU;
updateET100(itemDataList);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'];
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'] + _KINGAKU;
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}
//-------------------------------------------
// 1 : 得意先ID
// 2 : 受領日
// 3 : 金種区分
// 4 : 金額(受領金額/残高控除分手数料)
// 5 : 処理区分(1:金額処理/2:手数料処理)
// 5 : 取引ソース№
// 6 : 受領№
// * : 売掛取引№
// * : 取引区分
function exec_juryo_del(_TORIHIKISAKI, _TORIHIKIDATE, _KBKINSYU, _KINGAKU, _SYORIKBN,
_NRSOURCE, _TXREFNO, _NRURIKAKE, _KBURITORI) {
//売掛履歴作成
//--------------------
insertAkaET100(_NRURIKAKE);
//売掛履歴更新
//--------------------
//赤伝発行と共に元黒の効区をF:無効に更新(対象受払区分+取引ソース内で効区は全てFに)
TALON.update( " UPDATE ET100 SET " +
" FGVALID = 'F' " +
" WHERE KBURITORI = '" + _KBURITORI + "'" +
" AND NRSOURCE = '" + _NRSOURCE + "'"
);
//得意先情報更新
//--------------------
var itemDataList = new Array();
//得意先情報取得
var itemSelectList = selectET010(_TORIHIKISAKI);
var lineDataMap = itemSelectList[0];
var itemDataList = new Array();
//得意先ID
itemDataList['IDTOKUISAKI'] = lineDataMap['IDTOKUISAKI'];
//客先担当部署
itemDataList['TXTANTOUBUSYO'] = lineDataMap['TXTANTOUBUSYO'];
//客先担当名
itemDataList['TXTANTOUSYA'] = lineDataMap['TXTANTOUSYA'];
//客先担当職位
itemDataList['TXTANTOUSYASYOKUI'] = lineDataMap['TXTANTOUSYASYOKUI'];
//客先担当メアド
itemDataList['TXTANTOUSYAEMAIL'] = lineDataMap['TXTANTOUSYAEMAIL'];
//客先担当TEL
itemDataList['TXTANTOUSYADENWA'] = lineDataMap['TXTANTOUSYADENWA'];
//請求方式区分
itemDataList['KBSEIKYUHOUSHIKI'] = lineDataMap['KBSEIKYUHOUSHIKI'];
//締め日
itemDataList['TXSIMEBI'] = lineDataMap['TXSIMEBI'];
//標準入金方法区分
itemDataList['KBNYUKINHOUHOU'] = lineDataMap['KBNYUKINHOUHOU'];
//売上入金サイト
itemDataList['VLNYUKINSAITO'] = lineDataMap['VLNYUKINSAITO'];
//与信限度額
itemDataList['AMYOSHIN'] = lineDataMap['AMYOSHIN'];
//担当営業№
itemDataList['NRTANTOUJYUGYOIN'] = lineDataMap['NRTANTOUJYUGYOIN'];
//摘要
itemDataList['TXTEKIYO'] = lineDataMap['TXTEKIYO'];
//期首売掛残高
itemDataList['AMKISYUURIKAKE'] = lineDataMap['AMKISYUURIKAKE'];
//期間売上額(税込金額)
itemDataList['AMURIAGE'] = lineDataMap['AMURIAGE'];
//期間受領額
itemDataList['AMJYURYO'] = lineDataMap['AMJYURYO'] + (_KINGAKU * -1);
//現売掛残高
itemDataList['AMGENURIKAKE'] = lineDataMap['AMGENURIKAKE'];
updateET010(itemDataList);
}