トップ/TECHS 解説/詳細/アーキテクチャ
00-architecture.md

3 階層構成 (WinForms / IIS+ASMX / SQL Server)、ログイン、排他制御

00 — TECHS-S System Architecture

Reverse-engineering reference. Cites paths under /home/rmondo/repos/fab-forward-techs/analysis/decomp/ (_t1_* = client, _t2_* = small fragment of server-side modules shipped on the client install). Method bodies are sometimes blanked due to ilspycmd / [OptionText] obfuscation; class names, constants and c_clm* / c_TableNm* fields are the primary signal.

Subject system: TECHS-S (Technoa Corp., Japan) — Make-To-Order discrete manufacturing PMS. Version per Techs.ini: 0605.0002.0001.0000 → product line TECHS-S 6.05 / client build 6.05.0002.0001 with DB schema baseline 0.


1. High-level topology (3-tier + satellites)

Key facts cross-referenced from the decomp:

AspectSource (file:line)Constant / value
WebService URL pattern_t1_Technoa.Techs.Menu/app.config:60http://localhost/TechsService/TSS000002100.asmx
URL re-base helper_t1_Technoa.Techs.ClientCommonLibrary/Technoa.Techs.Common/ApplicationInfo.cs:1239 (GetWebServiceUrl)rewrites server / port / folder, default webFolder=TechsService, webPort=80
Report-server URLsame file, :1287 (GetReportServerUrl)default oldReportFolder = "TechsReports", oldReportServer = "ReportServer"
ASMX SOAP stub_t1_Technoa.Techs.Menu/Technoa.Techs.Menu.WebRef/SIMenu.cs:17WebServiceBinding(Name = "SIMenuSoap", Namespace = "http://technoa.techs.co.jp/SI") extends SoapHttpClientProtocol
Mutex to forbid 2× client per machine_t1_Technoa.Techs.Menu/Technoa.Techs.Menu/clsMain.cs:62-90new Mutex(false, Application.ProductName)
Concurrency / license limits_t1_Technoa.Techs.Menu/app.config:46-55DuplicatedLogin=no, LimitedRunningAp=10, LimitedControl=350, SIConnectInterval=600
Help PDFs path_t1_Technoa.Techs.Menu/app.config:52 and frmMenu.cs:2782HelpPath\<screenId>.pdf (matches our analysis/help_txt/)

The build is essentially a Citrix-style fat WinForms client that makes synchronous SOAP calls into a colocated IIS server, plus a few operations that go directly against SQL Server (login validation, SymPassword updates, lock-table scans, history housekeeping). The server tier is layered:

ASMX (SI*)  →  BE* (business entity, transactions)
            →  CM* (common runtime: locks, query builder, masters)
            →  DA* (data access — typed SqlCommand builders)

This four-letter prefix convention is consistent across the dump:

PrefixRoleExample file
SIWeb Service Interface (entry-point, transport)_t2_Technoa.Techs.SI.TSS000001100_S/Technoa.Techs.SI_S/SICommon.cs
BEBusiness Entity (orchestrator, validation, refill)_t2_Technoa.Techs.BE.TES000006100_S/Technoa.Techs.BE_S/BESharedGetData.cs
CMCommon (lock, query builder, master CRUD bases)_t2_Technoa.Techs.CM.TCS000020100_S/Technoa.Techs.DA_S/DACtlLock.cs
DAData Access (SqlConnection / SqlCommand builders)_t2_Technoa.Techs.DA.TDS000006100_S/...
BE.TES…, SI.TSS…, CM.TCS…, DA.TDS…numeric module IDs pair to TCS000xxxxxx_S runtime IDs_t2_Technoa.Techs.CM.TCS000020100_S (lock module)

Only ~16 of these *_S assemblies are present in the dump (lock, query builder, master CRUD, shared get-data, …). The rest (per-screen business logic for 0201001, 0501001, …) live on the IIS box at %TechsService6%\bin\ and are not in the dump.


2. Client startup sequence

Entry point is clsMain.Main() (_t1_Technoa.Techs.Menu/Technoa.Techs.Menu/clsMain.cs:62). High level:

  1. Create a named mutex (Application.ProductName) — refuses to start twice on the same machine.
  2. clsMain.StartSetUp()clsSetUp.SetUpAsync() (async worker thread):
    • BaseSheet.CreateSheet() (UI scaffolding)
    • clsAuthorize.DBConnect() — opens SqlConnection(m_clsInfo.ConnectionString) and immediately SqlConnection.ClearPool to validate.
    • clsAuthorize.SIConnect() — calls m_clsInfo.SI.SIConnect() (SOAP SIMenu.SIConnect).
    • clsAuthorize.SIDBConnect() — server-side DB-connect probe via SOAP.
    • clsAuthorize.CheckVersion()SI.GetVersion(serverVersion, clientVersion, dbVersion); client requires Asia/Tokyo timezone, Japanese 西暦 calendar, yyyy/MM/dd date format, HH:mm:ss time format.
  3. Splash → frmLogin is shown.
  4. User enters PersonCd / Password → frmLogin.StartLogin()clsLogin.LoginAsync()LoginWorker runs in steps:

Where exactly things come from

License / lock seat enforcement

clsAuthorize.ConnectingSetting (:468-533) calls SI.ConnectingSetting(personCd, cnString, license) (or ConnectingSettingForce when app.config DuplicatedLogin=yes). Return codes:

CodeMeaning
0OK
-2License config file missing → fatal
-3License count exceeded → retry
-6User already logged in elsewhere → operator can confirm a force-takeover

Server-side this stamps a row keyed by the MachineName from MachineInfo.GetMachineName() (clsMenuInfo.cs:495). At graceful shutdown clsAuthorize.ConnectingRemove (:985) calls SI.ConnectingRemove(personCd); for crash recovery, ApplicationInfo.ForceEndLockAll(apInfo, personCd) is called as part of GetLoginInfo (clsAuthorize.cs:575).


3. Client → server call shape (per-module SI / BE / CM / DA stack)

Wire payload is a DataSet (or array of DataSets) plus an ArrayList of UIParam records (key/value/type triples). Example seen on every reference op:

SIMenu.SoapHttpClientProtocol  (Namespace = http://technoa.techs.co.jp/SI)
  ConnectingSetting(personCd, cnString, license)       -> int
  GetVersion(ref serverVer, ref clientVer, ref dbVer)  -> int
  GetConnectionInfo(APInfo, ref DataSet)               -> int
  GetLockInfo(APInfo, ref DataSet)                     -> int
  RemoveLockInfo(APInfo, connectPersonCd)              -> int
  GetPasswordList / GetPassword / RegistPassword / ClearPassword
  GetLoginInfo / GetPersonInfo / GetItemInfo / GetMessage / ...
  ReloadSendMailBox / SendMail / DeleteSendMail (mailbox panel)

Source: enumerated OperationCompleted callbacks in _t1_Technoa.Techs.Menu/Technoa.Techs.Menu.WebRef/SIMenu.cs:25-130 plus the public method list at :283-705.

SICommon.GetCommonSharedData (_t2_Technoa.Techs.SI.TSS000001100_S/Technoa.Techs.SI_S/SICommon.cs:15) is the canonical pattern for a per-module SI:

public int GetCommonSharedData(ArrayList apInfoArray, ArrayList uiParameter,
                               ref DataSet data, bool countOnly)
{
    Dictionary<object, UIHashParam> uiParamDictionary = null;
    int rc = RefillParameter.RefillUIParam(uiParameter, ref uiParamDictionary);   // CM_S
    if (rc != 0) return rc;
    BESharedGetData be = BESharedGetData.GetInstance();
    int dataCount = 0;
    return be.Reference(apInfoArray, uiParamDictionary, ref data, countOnly, ref dataCount);
}

BESharedGetData.Reference (_t2_Technoa.Techs.BE.TES000006100_S/Technoa.Techs.BE_S/BESharedGetData.cs:35-60) loops the apInfoArray, refills each entry into a strongly-typed APInfo (RefillParameter.ReFillApParam), then delegates to DASharedGetData.Reference(apParamStrt, refParameter, ref data, …). Empty result is normalised to return-code -10 so the UI can show "該当なし".

DA layer extends DABusinessBase (_t2_Technoa.Techs.CM.TCS000006100_S/Technoa.Techs.DA_S/DABusinessBase.cs:16), with virtuals each concrete DA must override:

VirtualMeaning
string DTableNameDataSet table name returned to client
string BTableNameBacking physical table
string QueryCtrlIdPicks a row out of SymQueryCtrl (cf. c_QueryCtrlId = "C001" in DACtlCompLock)
Dictionary<string,bool> SettingInsertColumns / SettingUpdateColumnsPer-column write filter
bool UpdateValidFlgAllow update?
DataTable DTableEmpty schema for client downloads

Convention: rows have a DelFlg column (constant c_DelFlg = "DelFlg", value S0 = active — DABusinessBase.cs:22-24); soft-delete is the default.


4. Lock model (排他制御 / "exclusion control")

Three concrete lock kinds, all extending DACtlLock (_t2_Technoa.Techs.CM.TCS000020100_S/Technoa.Techs.DA_S/DACtlLock.cs):

ClassMaster tableBacking tablePurpose
DACtlApLockCtmApLockCtlApLock"Whole AP" lock — only one user may run a given screen (e.g. period close)
DACtlCompLockCtmCompLock, CtmCompLockKey, CtmCompLockCondition, CtmCompLockQuery, CtmCompLockQueryKeyCtlCompLock"Component" / "row-set" lock — locks one or more business keys (Seiban, ApCd) for an editing user
DACtlSameStartLockCtmSameStartLockCtlSameStartLock"Same start" lock — prevents two users from launching the same key combination concurrently

All three insert their lock row using the same shape (BuildSqlBeginLock):

IF NOT EXISTS (<query that finds existing matching lock>)
BEGIN
  INSERT INTO <BTableName> (
      ApCd, PersonCd[, KeyFieldNms, KeyValues],
      UserAuthorityKbn, TerminalNm, LockKbn,
      InsUserCd, InsApCd, UpdUserCd, UpdApCd
  ) VALUES (@ApCd, @PersonCd[, @KeyFieldNms, @KeyValues],
            @UserAuthority, @MachineName, @LockType,
            @PersonCd, @ApCd, @PersonCd, @ApCd)
END

The EndLock / ForceEndLock shapes are the symmetric DELETE (DACtlLock.BuildSqlEndLock / BuildSqlForceEndLock, DACtlLock.cs:29-54). PartEndLock (CompLock only — DACtlCompLock.cs:129-145) deletes one specific key tuple.

Lock master schema for CompLock (rich case):

Cited from _t2_Technoa.Techs.CM.TCS000020100_S/Technoa.Techs.DA_S/DACtlCompLock.cs:13-200 (constants c_MasterName, c_MasterKeyName, …) plus GetMasterData (:147-181) which loads the five master tables in order to discover (a) the keys to lock on, (b) the FROM/WHERE template, (c) the LockTargetKbn for the requested operation. GetPhraseLockTarget (DACtlLock.cs:106-115) maps the runtime intent to that target column:

LockType.AddNew -> "M.lockTargetKbn='S0'"
LockType.Edit   -> "(M.lockTargetKbn='S0' OR M.lockTargetKbn='S1')"
LockType.AddUp  -> "M.lockTargetKbn='S2'"

So the "what to lock" is data-driven, sourced from the master tables. This is the single most important insight to migrate: the business layer doesn't hard-code which tables/keys to take locks on — it asks the lock master, which returns a SQL fragment ("FROM TblHd JOIN TblDt … WHERE TblHd.SeibanCd=@SeibanCd"), the lock layer pastes the fragment into the IF NOT EXISTS (…) template, and a row goes into CtlCompLock with the resolved key values.

Pessimistic table-level fallback also exists for "stop-the-world" journaling-style operations (period close): Technoa.CMN.BaseCommon.LockInfo.DBLockTreat (_t1_Technoa.TechsCommonClass/Technoa.CMN.BaseCommon/LockInfo.cs:13-53):

IF NOT EXISTS (
   SELECT * FROM VIEW_LOCK
   WHERE TableName='WrkLock' AND LockMode LIKE '%排他%')
   SELECT * FROM WrkLock WITH (TABLOCKX, HOLDLOCK)
ELSE
   SELECT * FROM WrkLockCtrl WHERE [Dmy] IS NULL

It loops with a MessageBox prompt ("他の端末でデータの登録中…再度 登録処理を行って下さい") until the table-level X lock is granted. WrkLock is a sentinel/empty table; WrkLockCtrl records waiters.

Summary of locking strategy

Error code constant c_errExclusion = "ES99120004" appears in every lock DA — this is the wire-level signal for "lock conflict" surfaced to the UI.


5. Plug-ins / external integrations

5.1 Seiryu — production scheduler (help screen 0301011 "Seiryu連携処理")

Source: _t1_Technoa.Techs.ClientCommonLibrary/Technoa.Techs.Common/ApplicationStartingPLS.cs.

The pair of help PDFs 0301011.txt (大日程 / 部品小日程連携) confirms both directions of data flow: TECHS → Seiryu (schedule push) and Seiryu → TECHS (read back computed dates).

5.2 EUC tool (ad-hoc query)

Source: ApplicationStartingEUC.cs and frmMenu.cs:2733-2740:

if (Operators.CompareString("E", Strings.Mid(info.ApCd, 1, 1), true) == 0)
    CallEucEXE(GetApInfo(info));
else if (Operators.CompareString("1201073", info.ApCd, true) == 0)
    ShowEucConnection();

So AP codes starting with E… are routed to the EUC executable (separate Euc.exe), and the system management screen 1201073 ("EUC接続情報設定") configures the connection — typically pointing at a separate EUCTOOL database for free-form SQL by power users.

5.3 Excel report controller / EUC export

ApplicationInfo.cs and BuyLinkInfo.cs reference Excel automation (grep hit, full source not in dump — likely ships in Technoa.Techs.XlController / XlControllerEUC, also referenced by the help corpus). Each report DLL drops to Excel via late-bound COM or via SSRS export.

5.4 Mail (MailBox / NewMail panes)

Sources: clsMailBox.cs, MailBoxPanelControl.cs, NewMailPanelControl.cs plus the SOAP methods ReloadSendMailBox / SendMail / DeleteSendMail / ReloadReceiveMailBox (SIMenu.cs callbacks). The client-side panel renders an in-app mailbox, while the server stores messages internally — there is also Outlook / Thunderbird launch logic (referenced from clsShedule.cs) to hand a composed mail to the local client. So "mail" is dual-mode: in-app mail (server-stored) + hand-off to OS mail client.

5.5 BtoB / EDI

_t1_Technoa.Techs.BtoBCommonLibrary is a separate assembly grouping the EDI inbound/outbound handlers. The order side has an OrderInfo.EDIFlg enum (OrderCommonLibrary/.../OrderInfo.cs:82-86) distinguishing manual vs EDI rows. Help screens prefixed 0202xxx, 0501xxx reference EDI dispatch / receive.

5.6 PlasurmStart (PS prefix)

In frmMenu.StartAp (frmMenu.cs:2741-2744):

else if (Operators.CompareString("PS", Strings.Mid(info.ApCd, 1, 2), true) == 0)
    CallPlasurmStart(info);

AP codes starting with PS are dispatched to the Plasurm (another Technoa companion product, possibly process-simulation) launcher.

5.7 SSRS reports

GetReportServerUrl(... oldReportFolder = "TechsReports", oldReportServer = "ReportServer", ...) (ApplicationInfo.cs:1287) confirms reports are an SSRS-hosted ReportServer folder named TechsReports by default. The per-AP report registry comes from GetReportInfoAll (clsAuthorize.GetMenuData, :933-934); each report row carries PrintTypeKbn so a single screen can have multiple printout layouts.


6. Persistence / utility patterns

6.1 Direct ADO.NET (client-side)

Used only for: login validation, password update, history cleanup (SysStartRec, SysUpdRec, SysUpdKeyRec), WrkLock/WrkLockCtrl TABLOCKX. All other reads/writes are routed through SOAP. Pattern seen in clsAuthorize.cs:258-321:

SqlConnection cn = new SqlConnection(m_clsInfo.ConnectionString);
cn.Open();
SqlCommand cmd = new SqlCommand(sb.ToString(), cn);
cmd.Parameters.Add("@PersonCd", SqlDbType.VarChar, 10);
cmd.Parameters["@PersonCd"].Value = personCd;
SqlDataReader r = cmd.ExecuteReader();

i.e. parameterised SqlCommand + StringBuilder SQL + named typed parameters (always @CamelCase).

6.2 Server-side query builder (SqlCombination / MakeSelect /

MakeInsert / MakeUpdate / MakeDelete / ExecProcedure)

In _t2_Technoa.Techs.CM.TCS000005100_S/Technoa.Techs.DA_S/SqlCombination.cs

…and emit dynamic SQL with positional / named parameters. Concrete DAs (MstHouseInfo, MstSupplierInfo, MstPersonInfo, MstItemNoInfo, MstCustomerInfo, CostPersonInfo) supply only the overrides above and inherit the entire CRUD machinery — strong template-method pattern.

6.3 Audit / journal (SysUpdRec / SysUpdKeyRec)

UpdRecInfo.cs (_t2_Technoa.Techs.CM.TCS000006100_S/Technoa.Techs.DA_S/UpdRecInfo.cs) is the row-history infrastructure. Every business write produces:

Cleanup is in clsAuthorize.DeleteUpdRec / DeleteUpdKeyRec (clsAuthorize.cs:788-890): on every login, drop history older than 60 days for the current user, plus orphaned SysUpdKeyRec rows (UpdSeq no longer in SysUpdRec).

6.4 Stored-procedure helper

Technoa.Techs.DA_S.ExecProcedure (in TCS000006100_S and used by ApplicationStartingPLS.cs) wraps SqlCommand {CommandType=StoredProcedure} with named-parameter setters (SqlDataType.Char/Varchar, ParameterDirection.Input). All stored procedures use the prefix Prc… (PrcAddApStartRecord) or SI… (SIPls_UpdSchedule) — visible from the few we see.

6.5 Common runtime helpers (server)

_t1_Technoa.Techs.ServerCommonLibrary_S/Technoa.Techs.Common_S/ holds the cross-cutting helpers reused by all BE/CM:


7. Cross-cutting reference tables (sourced via login or per-AP)

Inferred from c_TableNm* / SQL strings across the dump.

TableRoleLoaded by
SysStartRecPer-user launch history (recent screens)clsAuthorize.GetMenuDataGetMenuStartRecList; reaped at login (DeleteStartRec :731)
SysUpdRec / SysUpdKeyRecUpdate audit trailServer-side every business write; reaped at login
SysGpFileGeneric blob/file attachmentsclsAttachFileBusiness.cs (Menu)
SymSystemCtrlSystem control / serial / license / version / inquiryNoclsAuthorize.GetSystemInfo :258-321
MstSystemCtrlPer-instance system master (referenced in feature catalog)server SI
SymPasswordPassword hash storeclsAuthorize.GetPassword / RegistPassword
MstPersonInfo (table MstPerson)Personnel masterApplicationInfo.GetPersonInfo
UImItemUI-item dictionary (column → label/abbr/format/help)ApplicationInfo.GetUImItemInfoMessageInfo.SetItemData
SymMessageMessage catalog (incl. error codes ES99…)ApplicationInfo.GetMessageInfo
SymKbnEnum / Kbn dictionary (drop-downs)ApplicationInfo.GetKbnInfo
MstApCtrlPer-AP control (e.g. cf01-style flags, lock-master IDs)per-screen via SI
MstSql / SymQueryCtrlStored query templates picked by QueryCtrlId ("C001", …)MakeSelect / MakeUpdate
MstDataGeneric master-of-mastersserver SI
MstUnitUnit masterConvertUnit
MstColorColor master (UI / sheet styling)UI
CtmApLock / CtmCompLock (+Key/Condition/Query/QueryKey) / CtmSameStartLockLock specificationsDACtlLock family
CtlApLock / CtlCompLock / CtlSameStartLockLive lock holdingsDACtlLock family
WrkLock / WrkLockCtrlStop-the-world journaling lockLockInfo.DBLockTreat

Database name: TECHS6 (per task brief; the connection string is built externally and fed via CommonConfiguration.ConnectionString). The EUC tool talks to a separate EUCTOOL DB via the connection configured by AP 1201073.


8. Versioning & deployment

Re-platforming notes: this is a hard couple to Japan / Asia-Tokyo operationally — any rewrite must consider how to relax these checks without breaking the date math elsewhere (OperateDate, MoneyCalculate, TaxCalculate all assume Japanese fiscal conventions).


9. Module map (top-level assemblies in dump)

Client common libraries (_t1_*)

AssemblyRole
Technoa.Techs.MenuMenu.exe shell — login, splash, menu, mail, schedule, AP launcher
Technoa.Techs.ClientCommonLibraryCross-screen helpers: ApplicationInfo, ApplicationStarting* (PLS / EUC), BuyLinkInfo, web-service URL re-base
Technoa.Techs.BaseCommonLibrary, Technoa.TechsCommonClass, BaseCommonLibraryBase UI / pessimistic-lock helpers (LockInfo.DBLockTreat)
Technoa.Techs.UI.Template, Technoa.UI.UIBase, Technoa.Techs.MultiControlsForm base classes, custom controls
Technoa.Techs.OrderCommonLibraryOrder / Seiban / Prod enums + helpers
Technoa.Techs.SOrderCommonLibrarySales order
Technoa.Techs.AcceptCommonLibraryInspection (検収) enums
Technoa.Techs.AllocateCommonLibraryAllocation (引当) enums
Technoa.Techs.BomCommonLibraryBOM / 部品表
Technoa.Techs.BtoBCommonLibraryEDI
Technoa.Techs.DeliCommonLibraryDelivery + tax/fraction helpers
Technoa.Techs.InOutCommonLibrary入出庫 (in/out/move/issue/complete/ship/inv/adj)
Technoa.Techs.MasterCommonLibraryMaster CRUD UI
Technoa.Techs.OpeDayReptCommonLibrary日報 (OpeMrDBInfo)
Technoa.Techs.OpeFinishCommonLibrary完成
Technoa.Techs.OutsrcIndCommonLibrary外注加工 (Outsourcing instruction / delivery / inspection)
Technoa.Techs.PayCommonLibrary支払 (AP)
Technoa.Techs.PsCommonLibraryProduction Scheduling (Seiryu glue)
Technoa.Techs.ReceiptCommonLibrary入金 (AR receipt)
Technoa.Techs.ShipCommonLibrary出荷 / 完成
Technoa.Techs.ServerCommonLibrary_SServer-side cross-cutting (also distributed to client for shared types)
Technoa.Techs.ConfigSettings, Technoa.Techs.ClientSettingConfig + per-machine settings
Technoa.Techs.ExceptionTechsException class
Technoa.Techs.StartUp, Technoa.Techs.UserHPStartUpBootstrap / launcher

Server fragments present in dump (_t2_*)

AssemblyModule IDRole (inferred from contents)
Technoa.Techs.SI.TSS000001100_SSI 0001100SICommon — generic shared-data SI
Technoa.Techs.BE.TES000006100_SBE 0006100BESharedGetData (matches the SI above)
Technoa.Techs.DA.TDS000006100_SDA 0006100(data access — DA fragments)
Technoa.Techs.CM.TCS000004100_SCM 0004100IDataAccessLogicComponents / IBusinessEntity interfaces
Technoa.Techs.CM.TCS000005100_SCM 0005100DABase, SqlCombination, MakeSelect, master-info DAs (MstHouseInfo, MstSupplierInfo, …)
Technoa.Techs.CM.TCS000006100_SCM 0006100DABusinessBase, MakeInsert/Update/Delete, WrkKeyInfo, UpdRecInfo, ExecProcedure
Technoa.Techs.CM.TCS000007100_SCM 0007100(BE base / interfaces)
Technoa.Techs.CM.TCS000008100_SCM 0008100BEBusinessBase, IBEBusinessBase*Info, ConvertUpdRec
Technoa.Techs.CM.TCS000009100_SCM 0009100(further BE base)
Technoa.Techs.CM.TCS000010100_SCM 0010100(further BE base)
Technoa.Techs.CM.TCS000020100_SCM 0020100Lock moduleDACtlLock, DACtlApLock, DACtlCompLock, DACtlSameStartLock, plus VOCtl* value objects
Technoa.Techs.CM.TCS000021100_SCM 0021100(lock continuation / BE wrappers)
Technoa.Techs.CM.TCS000030100_SCM 0030100(probably MessageInfo / MessageRelated)
Technoa.Techs.CM.TCS000040100_SCM 0040100(likely UI-arrange / form-design persistence)
Technoa.Techs.CM.TCS000041100_SCM 0041100(continuation of above)

The bulk of business logic (per-screen DLLs Technoa.Techs.BE.TES000NNNNNN_S for every 0201001, 0501001, …) is not in the dump.


10. What flows over the wire (canonical UIParam shape)

UIParam[] = [
  { Key = "PersonCd",  Value = "U001",       SqlDataType = Varchar, Size = 10, ConvertType = ... },
  { Key = "SeibanCd",  Value = "2025-001",   SqlDataType = Varchar, Size = 20, ... },
  ...
]
APInfo = {
  ApCd          = "0201001",
  ApMode        = (Master|Reporting|Query|Input|Output|Tool|PickUp|Search|AddUp|Entry|EUC|Common)
  ApName, ApID, AutoRefMode, ExecLevel,
  MachineName, PersonCd,
  QueryCtrlId   = "C001"                    // selects which SymQueryCtrl row
  QueryID, TableName, UserAuthority,
  WebServer, WebFolder
}

Server side RefillParameter.RefillUIParam turns UIParam[] into Dictionary<object, UIHashParam> keyed by KeyFieldNm; the BE/DA stack uses that dict to fill @PersonCd / @SeibanCd / … parameters positionally on the generated SQL.


11. Open items / gaps (server-side guesswork)

For a fresh build, the takeaways are:

  1. Treat the lock model as a first-class data-driven feature, not an afterthought — CtmCompLock* is genuine business config and migrating it requires reading those master tables, not the client code.
  2. The "screen → SI → BE → CM/DA → SQL" stack is mechanical and shape-preserving: porting one screen tells you exactly how the next 562 work.
  3. The DataSet / DataTable wire format is the entire integration contract — every column name in every table is identified by its c_clm* constant somewhere in *CommonLibrary and reused server side. A modern rewrite that keeps the column names verbatim can re-use the help-PDF documentation 1:1.
← 前へ
経営層向け解説資料
次へ →
モジュール