SQLエラー

This commit is contained in:
野間 2023-06-02 10:33:16 +09:00
parent 6497a0b86d
commit 45c6af090c
9 changed files with 314 additions and 132 deletions

View File

@ -73,16 +73,19 @@ def search_doc(
# if batch_status_service.is_batch_processing():
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
# 生物由来データを検索
ultmarc_doctor_data = []
# 医師データを検索
ultmarc_doctor_data = ultmarc_service.search_doctor_data(ultmarc_doctor_form)
# 検索項目などのデータを取得
ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session)
ultmarc.is_batch_processing = batch_status_service.is_batch_processing()
ultmarc.doctor_data = ultmarc_doctor_data
ultmarc.form_data = ultmarc_doctor_form
# bio: BioViewModel = bio_service.prepare_bio_view(session)
# bio.bio_data = ultmarc_doctor_data
# bio.form_data = bio_form
# セッション書き換え
session.update(
actions=[

View File

@ -4,7 +4,7 @@ class SQLCondition:
param: str
literal: bool
def __init__(self, column: str, operator: str, param: str, literal=False) -> None:
def __init__(self, column: str, operator: str, param: str, literal=False, like_wildcard=False) -> None:
"""
Args:
column (str): カラム名
@ -12,17 +12,22 @@ class SQLCondition:
param (str): パラメータ(プレースホルダーかリテラル値か)
literal (bool, optional): リテラル値を埋め込むかどうか
画面から渡ってきた値を使うとSQLインジェクションの危険性があるため固定値で使用すること
like_wildcard (bool, optional): like検索で部分一致検索にするかどうか
"""
self.column = column
self.operator = operator
self.param = param
self.literal=literal
self.literal = literal
self.like_wildcard = like_wildcard
def apply(self):
# literalがFalseならプレースホルダー。Trueだったならは固定値。
param = f':{self.param}' if self.literal is False else self.param
# like_wildcardがTrueならLike検索にする
param = f'%{param}%' if self.like_wildcard is False else param
return f' {self.column} {self.operator} {param}'
# 定数
EQ = '='
NE = '<>'
@ -32,4 +37,4 @@ GE = '>='
LE = '<='
LIKE = 'LIKE'
IS = 'IS'
IS_NOT = 'IS NOT'
IS_NOT = 'IS NOT'

View File

@ -0,0 +1,19 @@
from typing import Optional
from src.model.db.base_db_model import BaseDBModel
from src.util.sanitize import sanitize
@sanitize
class UltmarcDoctorDBModel(BaseDBModel):
dcf_pcf_dr_cd: Optional[str]
dr_name: Optional[str]
form_inst_name_kanji: Optional[str]
dcf_dsf_inst_cd: Optional[str]
blng_sec_name: Optional[str]
trt_course_name: Optional[str]
form_post_name: Optional[str]
alma: Optional[str]
grad_y: Optional[str]
prefc_name: Optional[str]
blng_sec_cd: Optional[str]

View File

@ -6,8 +6,8 @@ from typing import Optional
from pydantic import BaseModel
from src.model.db.prefc_master import PrefcMasterModel
from src.model.db.wholesaler_master import WholesalerMasterModel
from src.model.request.bio import BioModel
# from src.model.db.doctor_view import DoctorViewModel
from src.model.request.ultmarc_doctor import UltmarcDoctorModel
from src.model.view.bio_disp_model import BisDisplayModel
from src.system_var import environment
@ -16,13 +16,14 @@ class UltmarcDoctorViewModel(BaseModel):
subtitle: str = '医師検索一覧'
is_batch_processing: Optional[bool]
prefc_models: list[PrefcMasterModel]
# doctor_models: list[DoctorViewModel]
doctor_data: Optional[list[BisDisplayModel]] = []
form_data: Optional[BioModel]
form_data: Optional[UltmarcDoctorModel]
def display_wholesaler_names(self):
display_names = [
f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}'
for whs_model in self.whs_models
for whs_model in self.doctor_models
]
return display_names
@ -30,13 +31,74 @@ class UltmarcDoctorViewModel(BaseModel):
def date_handler(obj):
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
return json.dumps([model.dict() for model in self.doctor_data], ensure_ascii=False, default=date_handler)
# ************************** のま作 **************************
# def is_selected_whs_name(self, selected_wholesaler):
# if not self.is_form_submitted():
# return ''
# 医師コード
def is_input_dcf_pcf_dr_cd(self):
if not self.is_form_submitted():
return ''
return self.form_data.dcf_pcf_dr_cd
# form_wholesaler_full_name = f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}'
# return self._selected_value(form_wholesaler_full_name, selected_wholesaler)
# 氏名(漢字)
def is_input_dr_name(self):
if not self.is_form_submitted():
return ''
return self.form_data.dr_name
# 氏名(かな・カナ)
def is_input_dr_name_kana(self):
if not self.is_form_submitted():
return ''
return self.form_data.dr_name_kana
# 勤務先コード
def is_input_dcf_dsf_inst_cd(self):
if not self.is_form_submitted():
return ''
return self.form_data.dcf_dsf_inst_cd
# 勤務先名(漢字)
def is_input_form_inst_name_kanji(self):
if not self.is_form_submitted():
return ''
return self.form_data.form_inst_name_kanji
# 勤務先名(かな・カナ)
def is_input_form_inst_name_kana(self):
if not self.is_form_submitted():
return ''
return self.form_data.form_inst_name_kana
# 勤務先都道府県
def is_selected_prefc_cd(self, selected_prefc_cd):
if not self.is_form_submitted():
return ''
return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd)
# 所属部科(漢字)
def is_input_blng_sec_name(self):
if not self.is_form_submitted():
return ''
return self.form_data.blng_sec_name
# 診療科目(漢字)
def is_input_trt_course_name(self):
if not self.is_form_submitted():
return ''
return self.form_data.trt_course_name
# 出身大学(漢字)
def is_input_alma(self):
if not self.is_form_submitted():
return ''
return self.form_data.alma
# 卒年
def is_grad_y(self):
if not self.is_form_submitted():
return ''
return self.form_data.grad_y
# ************************** のま作 **************************
# def is_selected_org_kbn(self, selected_org_kbn):
# if not self.is_form_submitted():
@ -67,12 +129,6 @@ class UltmarcDoctorViewModel(BaseModel):
# return self._selected_value(self.form_data.data_kbn, selected_data_kbn)
def is_selected_prefc_cd(self, selected_prefc_cd):
if not self.is_form_submitted():
return ''
return ''
# return self._selected_value(self.form_data.maker_cd, selected_prefc_cd)
# def is_input_rev_hsdnymd_srk_from(self):
# if not self.is_form_submitted():
# return ''

View File

@ -0,0 +1,120 @@
from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel
from src.repositories.base_repository import BaseRepository
from src.db import sql_condition as condition
from src.db.sql_condition import SQLCondition
from src.model.request.ultmarc_doctor import UltmarcDoctorModel
from src.repositories.base_repository import BaseRepository
from src.util.string_util import is_not_empty
class UltmarcDoctorRepository(BaseRepository):
FETCH_SQL = """\
SELECT
com_dr.dcf_pcf_dr_cd,
com_dr.dr_name,
com_inst.form_inst_name_kanji,
com_inst.dcf_dsf_inst_cd,
com_blng_sec.blng_sec_name,
com_trt_course.trt_course_name,
com_post.form_post_name,
com_alma.alma,
com_dr.grad_y,
mst_prefc.prefc_name,
com_dr_wrkplace.blng_sec_cd
FROM
src05.com_dr
LEFT JOIN src05.mst_prefc ON com_dr.prefc_cd = mst_prefc.prefc_cd
LEFT JOIN src05.com_dr_wrkplace ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace.dcf_pcf_dr_cd
LEFT JOIN src05.com_inst ON com_dr_wrkplace.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd
LEFT JOIN src05.com_blng_sec ON com_dr_wrkplace.blng_sec_cd = com_blng_sec.blng_sec_cd
LEFT JOIN src05.com_dr_trt_course ON com_dr.dcf_pcf_dr_cd = com_dr_trt_course.dcf_pcf_dr_cd
LEFT JOIN src05.com_trt_course ON com_dr_trt_course.trt_course_cd = com_trt_course.trt_course_cd
LEFT JOIN src05.com_post ON com_dr_wrkplace.post_cd = com_post.post_cd
LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd
WHERE
{where_clause}
ORDER BY
com_dr.dcf_pcf_dr_cd,
com_dr_wrkplace.dcf_dsf_inst_cd,
com_dr_wrkplace.blng_sec_cd,
com_dr_trt_course.trt_course_cd
\
"""
def fetch_many(self, parameter: UltmarcDoctorModel) -> list[UltmarcDoctorDBModel]:
try:
self._database.connect()
where_clause = self.__build_condition(parameter)
query = self.FETCH_SQL.format(where_clause=where_clause)
result = self._database.execute_select(query, parameter.dict())
models = [UltmarcDoctorDBModel(**r) for r in result]
return models
except Exception as e:
# TODO: ファイルへの書き出しはloggerでやる
print(f"[ERROR] DB Error : Exception={e.args}")
raise e
finally:
self._database.disconnect()
def __build_condition(self, parameter: UltmarcDoctorModel):
where_clauses: list[SQLCondition] = []
# 医師コード
if is_not_empty(parameter.dcf_pcf_dr_cd):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('com_dr.dcf_pcf_dr_cd', condition.LIKE,
'dcf_pcf_dr_cd', like_wildcard=True))
# 氏名(漢字)
if is_not_empty(parameter.dr_name):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('dr_name', condition.LIKE, 'dr_name', like_wildcard=True))
# 氏名(かな・カナ)
if is_not_empty(parameter.dr_name_kana):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('dr_name_kana', condition.LIKE, 'dr_name_kana', like_wildcard=True))
# 勤務先コード
if is_not_empty(parameter.dcf_dsf_inst_cd):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('com_inst.dcf_dsf_inst_cd',
condition.LIKE, 'dcf_dsf_inst_cd', like_wildcard=True))
# 勤務先名(漢字)
if is_not_empty(parameter.form_inst_name_kanji):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('form_inst_name_kanji', condition.LIKE,
'form_inst_name_kanji', like_wildcard=True))
# 勤務先名(かな・カナ)
if is_not_empty(parameter.form_inst_name_kana):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE,
'form_inst_name_kana', like_wildcard=True))
# 勤務先都道府県
if is_not_empty(parameter.prefc_cd):
where_clauses.append(SQLCondition('com_inst.prefc_cd', condition.EQ, 'prefc_cd'))
# 所属部科(漢字)
if is_not_empty(parameter.blng_sec_name):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('com_blng_sec.blng_sec_name',
condition.LIKE, 'blng_sec_name', like_wildcard=True))
# 診療科目(漢字)
if is_not_empty(parameter.trt_course_name):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('trt_course_name', condition.LIKE, 'trt_course_name', like_wildcard=True))
# 出身大学(漢字)
if is_not_empty(parameter.alma):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma', like_wildcard=True))
# 卒年
if is_not_empty(parameter.grad_y):
# 必ず部分一致で検索
where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y', like_wildcard=True))
where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses])
return where_clauses_str

View File

@ -7,12 +7,13 @@ import pandas as pd
from src.aws.aws_api_client import AWSAPIClient
from src.aws.s3 import S3Client
from src.model.internal.session import UserSession
from src.model.request.bio import BioModel
from src.model.request.ultmarc_doctor import UltmarcDoctorModel
from src.model.view.bio_disp_model import BisDisplayModel
from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel
from src.repositories.base_repository import BaseRepository
from src.repositories.bio_sales_view_repository import BioSalesViewRepository
from src.repositories.prefc_master_repository import PrefcMasterRepository
from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository
from src.repositories.pharmacy_product_master_repository import \
PharmacyProductMasterRepository
from src.repositories.wholesaler_master_repository import \
@ -23,11 +24,11 @@ from src.system_var import constants, environment
class UltmarcViewService(BaseService):
REPOSITORIES = {
'ultmarc_doctor_repository': WholesalerMasterRepository,
'ultmarc_doctor_repository': UltmarcDoctorRepository,
'prefc_repository': PrefcMasterRepository
}
ultmarc_doctor_repository: WholesalerMasterRepository
ultmarc_doctor_repository: UltmarcDoctorRepository
prefc_repository: PrefcMasterRepository
def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None:
@ -47,65 +48,62 @@ class UltmarcViewService(BaseService):
)
return ultmarc
def search_bio_data(self, search_params: BioModel):
# 生物由来データを検索
bio_sales_view_data = self.bio_sales_repository.fetch_many(parameter=search_params)
# 画面表示用に加工
display_bio_data: list[BisDisplayModel] = [BisDisplayModel(data) for data in bio_sales_view_data]
def search_doctor_data(self, search_params: UltmarcDoctorModel):
# 医師データを検索
ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params)
return ultmarc_doctor_data
return display_bio_data
# def search_download_bio_data(self, search_params: BioModel):
# # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換
# bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params)
# return bio_sales_data_frame
def search_download_bio_data(self, search_params: BioModel):
# 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換
bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params)
return bio_sales_data_frame
# def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime):
# # Excelに書き込み
# output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
# f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx')
def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime):
# Excelに書き込み
output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx')
# # テンプレートファイルをコピーして出力ファイルの枠だけを作る
# shutil.copyfile(
# src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH,
# dst=output_file_path
# )
# # ExcelWriterの追記モード(`mode`='a')でファイルを開く
# # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ)
# # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する
# with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
# # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。
# # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。
# # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。
# data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0)
# テンプレートファイルをコピーして出力ファイルの枠だけを作る
shutil.copyfile(
src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH,
dst=output_file_path
)
# ExcelWriterの追記モード(`mode`='a')でファイルを開く
# `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ)
# 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する
with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
# `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。
# DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。
# `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。
data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0)
# return output_file_path
return output_file_path
# def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime):
# # csvに書き込み
# output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
# f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv')
# # 横長のDataFrameとするため、ヘッダーの加工処理
# header_data = {}
# for df_column, header_column in zip(data_frame.columns, header):
# header_data[df_column] = header_column
def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime):
# csvに書き込み
output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv')
# 横長のDataFrameとするため、ヘッダーの加工処理
header_data = {}
for df_column, header_column in zip(data_frame.columns, header):
header_data[df_column] = header_column
# header_df = pd.DataFrame([header_data], index=None)
# output_df = pd.concat([header_df, data_frame])
# # ヘッダー行としてではなく、1レコードとして出力する
# output_df.to_csv(output_file_path, index=False, header=False)
header_df = pd.DataFrame([header_data], index=None)
output_df = pd.concat([header_df, data_frame])
# ヘッダー行としてではなく、1レコードとして出力する
output_df.to_csv(output_file_path, index=False, header=False)
# return output_file_path
return output_file_path
# def upload_bio_data_file(self, local_file_path: str) -> None:
# bucket_name = environment.BIO_ACCESS_LOG_BUCKET
# # TODO: フォルダを変える
# file_key = f'bio/{path.basename(local_file_path)}'
# self.s3_client.upload_file(local_file_path, bucket_name, file_key)
def upload_bio_data_file(self, local_file_path: str) -> None:
bucket_name = environment.BIO_ACCESS_LOG_BUCKET
# TODO: フォルダを変える
file_key = f'bio/{path.basename(local_file_path)}'
self.s3_client.upload_file(local_file_path, bucket_name, file_key)
def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str:
bucket_name = environment.BIO_ACCESS_LOG_BUCKET
# TODO: フォルダを変える
file_key = f'bio/{path.basename(local_file_path)}'
download_filename = f'{user_id}_生物由来卸販売データ.{kind}'
return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename)
# def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str:
# bucket_name = environment.BIO_ACCESS_LOG_BUCKET
# # TODO: フォルダを変える
# file_key = f'bio/{path.basename(local_file_path)}'
# download_filename = f'{user_id}_生物由来卸販売データ.{kind}'
# return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename)

View File

@ -6,9 +6,12 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css" integrity="sha384-b6lVK+yci+bfDmaY1u0zE8YYJt0TZxLEAFyYSLHId4xoVvsrQu3INevFKo+Xir8e" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<link rel="stylesheet" href="/static/css/pagenation.css">
<link rel="stylesheet" href="/static/css/datepicker.css">
<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script>
<script src="https://pagination.js.org/dist/2.5.0/pagination.min.js" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/ja.min.js"></script>
<script src="/static/function/businessLogicScript.js"></script>
<script src="/static/lib/fixed_midashi.js"></script>

View File

@ -5,10 +5,7 @@
{% include '_header.html' %}
{% endwith %}
<link rel="stylesheet" href="/static/css/bioStyle.css">
<link rel="stylesheet" href="/static/css/pagenation.css">
<link rel="stylesheet" href="/static/css/datepicker.css">
<script src="/static/lib/fixed_midashi.js"></script>
<script type="text/javascript">
window.onload = function() {
// 見出し固定初期化

View File

@ -15,9 +15,6 @@ require_once('/home/nds_dwh/webroot/common/function/getDateBatchJSString.php');
{% include '_header.html' %}
{% endwith %}
<link rel="stylesheet" href="/static/css/ultStyle.css">
<link rel="stylesheet" href="/static/css/pagenation.css">
<link rel="stylesheet" href="/static/css/datepicker.css">
<script src="/static/lib/fixed_midashi.js"></script>
<!-- <link rel="stylesheet" type="text/css" href="<?php echo $ultCss ?>"> -->
<!-- <script type="text/javascript" src="<?php echo $ultJsPath ?>"></script> -->
@ -180,14 +177,16 @@ if (!isset($isDBSuccess)) {
<tr>
<td class="docSearchColumnTd">医師コード:</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_pcf_dr_cd" value="" maxlength='10' oninput="formBtDisabled()">
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_pcf_dr_cd"
value="{{ultmarc.is_input_dcf_pcf_dr_cd()}}" maxlength='10' oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION['docTextbox_1'])) {
echo $_SESSION['docTextbox_1'];
} ?> -->
</td>
<td class="docSearchColumnTd">氏名(漢字)</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name" value="" oninput="formBtDisabled()">
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name"
value="{{ultmarc.is_input_dr_name()}}" oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION["docTextbox_3"])) {
echo $_SESSION["docTextbox_2"];
} ?> -->
@ -195,7 +194,8 @@ if (!isset($isDBSuccess)) {
<!-- アルトマーク課題管理表No.8の修正 氏名(カナ)→氏名(かな・カナ) -->
<td class="docSearchColumnTd">氏名(かな・カナ)</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name_kana" value="" oninput="formBtDisabled()">
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name_kana"
value="{{ultmarc.is_input_dr_name_kana()}}" oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION["docTextbox_3"])) {
echo $_SESSION["docTextbox_3"];
} ?> -->
@ -204,14 +204,16 @@ if (!isset($isDBSuccess)) {
<tr>
<td class="docSearchColumnTd">勤務先コード:</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_dsf_inst_cd" value="" maxlength='11' oninput="formBtDisabled()">
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_dsf_inst_cd"
value="{{ultmarc.is_input_dcf_dsf_inst_cd()}}" maxlength='11' oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION['docTextbox_4'])) {
echo $_SESSION['docTextbox_4'];
} ?> -->
</td>
<td class="docSearchColumnTd">勤務先名(漢字)</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kanji" value="" oninput="formBtDisabled()">
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kanji"
value="{{ultmarc.is_input_form_inst_name_kanji()}}" oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION["docTextbox_5"])) {
echo $_SESSION["docTextbox_5"];
} ?> -->
@ -219,7 +221,8 @@ if (!isset($isDBSuccess)) {
<!-- アルトマーク課題管理表No.8の修正 勤務先名(カナ)→勤務先名(かな・カナ) -->
<td class="docSearchColumnTd">勤務先名(かな・カナ)</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kana" value="" oninput="formBtDisabled()">
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kana"
value="{{ultmarc.is_input_form_inst_name_kana()}}" oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION["docTextbox_6"])) {
echo $_SESSION["docTextbox_6"];
} ?> -->
@ -252,14 +255,16 @@ if (!isset($isDBSuccess)) {
<!-- アルトマーク課題管理表No.2の追加 End -->
<td class="docSearchColumnTd">所属部科(漢字)</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" type="text" name="ctrl_blng_sec_name" value="" oninput="formBtDisabled()">
<input class="text docSearchTextbox" type="text" name="ctrl_blng_sec_name"
value="{{ultmarc.is_input_blng_sec_name()}}" oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION["docTextbox_7"])) {
echo $_SESSION["docTextbox_7"];
} ?> -->
</td>
<td class="docSearchColumnTd">診療科目(漢字)</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" type="text" name="ctrl_trt_course_name" value="" oninput="formBtDisabled()">
<input class="text docSearchTextbox" type="text" name="ctrl_trt_course_name"
value="{{ultmarc.is_input_trt_course_name()}}" oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION["docTextbox_8"])) {
echo $_SESSION["docTextbox_8"];
} ?> -->
@ -268,13 +273,15 @@ if (!isset($isDBSuccess)) {
<tr>
<td class="docSearchColumnTd">出身大学(漢字)</td>
<td class="docSearchTextboxTd">
<input class="text docSearchTextbox" type="text" name="ctrl_alma" value="" oninput="formBtDisabled()">
<input class="text docSearchTextbox" type="text" name="ctrl_alma"
value="{{ultmarc.is_input_alma()}}" oninput="formBtDisabled()">
<!-- <?php if(isset($_SESSION["docTextbox_9"])) {
echo $_SESSION["docTextbox_9"];
} ?> -->
</td>
<td class="docSearchColumnTd">卒年:</td>
<td class="docSearchTextboxTd"><input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_grad_y" value="" maxlength='4' oninput="formBtDisabled()"></td>
<td class="docSearchTextboxTd"><input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_grad_y"
value="" maxlength='4' oninput="formBtDisabled()"></td>
<!-- <?php if(isset($_SESSION["docTextbox_10"])) {
echo $_SESSION["docTextbox_10"];
} ?> -->
@ -672,7 +679,7 @@ if (!isset($isDBSuccess)) {
$(function() {
// スピナー出さない場合は以下、エスケープせず埋め込む
// {% autoescape False%}
let searchResultString = '{}'
let searchResultString = '{{ultmarc.ultmarc_data_json_str()}}'
// {% endautoescape%}
const searchResultData = JSON.parse(searchResultString)
if (searchResultData.length == 0) {
@ -699,43 +706,17 @@ if (!isset($isDBSuccess)) {
function pagination_content(datas) {
const display_keys = [
'slip_org_kbn',
'slip_mgt_no',
'rec_ymd',
'rec_whs_cd',
'rec_whs_sub_cd',
'whs_nm',
'rec_whs_org_cd',
'rec_urag_no',
'rev_hsdnymd_srk',
'rec_tran_kbn',
'tran_kbn_nm',
'mkr_cd',
'rec_comm_cd',
'comm_nm',
'whs_rep_comm_nm',
'nnsk_cd',
'rec_nnskfcl_nm',
'whs_rep_nnskfcl_nm',
'rec_nnsk_fcl_addr',
'whs_rep_nnsk_fcl_addr',
'rec_lot_num',
'amt_fugo',
'expr_dt',
'data_kbn',
'lot_no_err_flg',
'bef_slip_mgt_no',
'ins_usr',
'ins_dt',
'inst_cd',
'inst_name_form',
'address',
'tel_no',
'v_whs_cd',
'v_whsorg_cd',
'whs_org_nm',
'v_tran_cd',
'iko_flg',
'dcf_pcf_dr_cd',
'dr_name',
'form_inst_name_kanji',
'dcf_dsf_inst_cd',
'blng_sec_name',
'trt_course_name',
'form_post_name',
'alma',
'grad_y',
'prefc_name',
'blng_sec_cd'
];
const tableRow = document.createElement('tr')
return datas.map(function (data) {