3 階層構成 (WinForms / IIS+ASMX / SQL Server)、ログイン、排他制御
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 andc_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.
Key facts cross-referenced from the decomp:
| Aspect | Source (file:line) | Constant / value |
|---|---|---|
| WebService URL pattern | _t1_Technoa.Techs.Menu/app.config:60 | http://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 URL | same file, :1287 (GetReportServerUrl) | default oldReportFolder = "TechsReports", oldReportServer = "ReportServer" |
| ASMX SOAP stub | _t1_Technoa.Techs.Menu/Technoa.Techs.Menu.WebRef/SIMenu.cs:17 | WebServiceBinding(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-90 | new Mutex(false, Application.ProductName) |
| Concurrency / license limits | _t1_Technoa.Techs.Menu/app.config:46-55 | DuplicatedLogin=no, LimitedRunningAp=10, LimitedControl=350, SIConnectInterval=600 |
| Help PDFs path | _t1_Technoa.Techs.Menu/app.config:52 and frmMenu.cs:2782 | HelpPath\<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:
| Prefix | Role | Example file |
|---|---|---|
SI | Web Service Interface (entry-point, transport) | _t2_Technoa.Techs.SI.TSS000001100_S/Technoa.Techs.SI_S/SICommon.cs |
BE | Business Entity (orchestrator, validation, refill) | _t2_Technoa.Techs.BE.TES000006100_S/Technoa.Techs.BE_S/BESharedGetData.cs |
CM | Common (lock, query builder, master CRUD bases) | _t2_Technoa.Techs.CM.TCS000020100_S/Technoa.Techs.DA_S/DACtlLock.cs |
DA | Data 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.
Entry point is clsMain.Main()
(_t1_Technoa.Techs.Menu/Technoa.Techs.Menu/clsMain.cs:62). High level:
Application.ProductName) — refuses to
start twice on the same machine.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.frmLogin is shown.frmLogin.StartLogin() → clsLogin.LoginAsync() → LoginWorker runs in steps:clsMenuInfo.Reset()
(_t1_Technoa.Techs.Menu/Technoa.Techs.Menu/clsMenuInfo.cs:476-479)
copies CommonConfiguration.ConnectionString into m_cnString.
CommonConfiguration is a per-install XML maintained by
frmConnection.cs (the connection-edit dialog) and is referenced via
CommonConfiguration.WebServiceServer /
.WebServiceFolder / .SIPort.Reset() call:
m_SI.Url = ApplicationInfo.GetWebServiceUrl(
m_SI.Url,
CommonConfiguration.WebServiceServer,
CommonConfiguration.WebServiceFolder,
CommonConfiguration.SIPort);
The original SIMenu.Url is templated from app.config
(http://localhost/TechsService/TSS000002100.asmx) and only the
host:port/folder part is rewritten — the asmx filename is preserved
(last path segment, array[^1],
ApplicationInfo.cs:1270).SymSystemCtrl is decrypted with
Cryptogram.DecryptString using TechSerial as key and a
hard-coded salt "Technoa.Techs"
(clsAuthorize.cs:24-26, 230-256). Trial vs Product is determined
here: validityTerm == "none" → Product, else Trial with expiry
compared against server time from SELECT GetDate().SymPassword, encrypted by EncryptPassword
= Cryptogram.EncryptString(personCd + password, SerialKey, personCd)
(clsAuthorize.cs:1100-1104). Update path goes through
SI.RegistPassword (server-side; clsAuthorize.cs:1077-1098); first
registration of an empty password is recognised by InsDt == UpdDt.ApplicationInfo.GetPersonInfo / GetUImItemInfo /
GetMessageInfo / GetKbnInfo; rows go into the
MstPersonInfo / UImItem / SymMessage / SymKbn DataTables
(clsAuthorize.cs:584-700). MessageInfo.SetMessage /
SetKbnData / SetItemData populate the global runtime caches the
rest of the client uses for label / dropdown / error-message lookup.clsAuthorize.GetMenuData()
(:921-950) populate one DataSet (m_clsInfo.MenuData):
GetMenuAPList — full list of authorised AP codes (the launchable
screens) → drives clsApListBusiness.GetMenuMyMenuList → clsMyMenuBusiness.GetMenuStartRecList (table SysStartRec) → clsStartRecBusiness
(recent-launch panel).GetMyWorkData → "MyWork" tile.GetTransitAPInfoAll → drill-through links registry (the
TransitListBusiness that lets a screen launch another with
parameters).GetReportInfoAll → SSRS report registry per AP.GetPersonSchedule → calendar pane.clsAuthorize.ConnectingSetting (:468-533) calls
SI.ConnectingSetting(personCd, cnString, license) (or
ConnectingSettingForce when app.config DuplicatedLogin=yes).
Return codes:
| Code | Meaning |
|---|---|
0 | OK |
-2 | License config file missing → fatal |
-3 | License count exceeded → retry |
-6 | User 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).
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:
| Virtual | Meaning |
|---|---|
string DTableName | DataSet table name returned to client |
string BTableName | Backing physical table |
string QueryCtrlId | Picks a row out of SymQueryCtrl (cf. c_QueryCtrlId = "C001" in DACtlCompLock) |
Dictionary<string,bool> SettingInsertColumns / SettingUpdateColumns | Per-column write filter |
bool UpdateValidFlg | Allow update? |
DataTable DTable | Empty 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.
Three concrete lock kinds, all extending DACtlLock
(_t2_Technoa.Techs.CM.TCS000020100_S/Technoa.Techs.DA_S/DACtlLock.cs):
| Class | Master table | Backing table | Purpose |
|---|---|---|---|
DACtlApLock | CtmApLock | CtlApLock | "Whole AP" lock — only one user may run a given screen (e.g. period close) |
DACtlCompLock | CtmCompLock, CtmCompLockKey, CtmCompLockCondition, CtmCompLockQuery, CtmCompLockQueryKey | CtlCompLock | "Component" / "row-set" lock — locks one or more business keys (Seiban, ApCd) for an editing user |
DACtlSameStartLock | CtmSameStartLock | CtlSameStartLock | "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.
SysUpdRec / SysUpdKeyRec
audit (cleaned every login by clsAuthorize.DeleteUpdRec /
DeleteUpdKeyRec), enforcing last-write-wins detection at update
time.CtlApLock +
CtlCompLock + CtlSameStartLock, configured by master tables —
gives "while user A is editing Seiban 2025-001, user B sees
ES99120004 (排他) and is blocked".WrkLock / WrkLockCtrl TABLOCKX HOLDLOCK for journal-style ops.ApplicationInfo.ForceEndLockAll(apInfo, personCd) is called on every login (clsAuthorize.cs:575) so a
client that died last time clears its abandoned locks at next
login.Error code constant c_errExclusion = "ES99120004" appears in every
lock DA — this is the wire-level signal for "lock conflict" surfaced
to the UI.
Source: _t1_Technoa.Techs.ClientCommonLibrary/Technoa.Techs.Common/ApplicationStartingPLS.cs.
Seiryu\Bin{V|E|S}\Pls.exe (:160, :164, :166, :190, :195),
selected by plsKbn config:
plsKbn=0 → BinV\Pls.exe (standard / 製番大日程, Viewer)plsKbn=1 → BinE\Pls.exe (Express / Engineering)plsKbn=2 → BinS\Pls.exe (Setup / Simulator)ExecProcedure calls to two stored procedures:
SIPls_UpdSchedule — pushes the current TECHS schedule keys (with
@VchrUpUserCd, @ChrApCd) to a hand-off table (:127-131).PrcAddApStartRecord — inserts a launch record (:223-231) so
SysStartRec shows the Seiryu invocation.Process.Start(Pls.exe) is fired
(Path.Combine(text, "Seiryu") is the install root).The pair of help PDFs 0301011.txt (大日程 / 部品小日程連携) confirms
both directions of data flow: TECHS → Seiryu (schedule push) and
Seiryu → TECHS (read back computed dates).
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.
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.
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.
_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.
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.
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.
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).
SqlCombination / MakeSelect /MakeInsert / MakeUpdate / MakeDelete / ExecProcedure)
In _t2_Technoa.Techs.CM.TCS000005100_S/Technoa.Techs.DA_S/SqlCombination.cs
MakeSelect.cs (and the similar files for INSERT/UPDATE/DELETE in
TCS000006100_S). These take:DTableName / BTableNameQueryCtrlId (lookup into SymQueryCtrl / MstSql)UIHashParam dictSettingInsertColumns / SettingUpdateColumns…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.
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:
SysUpdRec row (header: UpdSeq, PersonCd, ApCd, UpdRecDt)SysUpdKeyRec rows (one per affected key tuple)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).
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.
_t1_Technoa.Techs.ServerCommonLibrary_S/Technoa.Techs.Common_S/
holds the cross-cutting helpers reused by all BE/CM:
SystemInfo — system-config getters (incl. GetProhibitChar)CompanyInfo / ApCtrlInfo / PersonInfo / GpFileInfoParameterSetting — UI-param refillMoneyCalculate, TaxCalculate — money/tax mathConvertUnit, ConvertRate, ConvertTimeOperateDate — date utilitiesRefillParameter — converts wire UIParam → typed UIHashParam
dict; this is the universal entry shape for every BE/SI call.Inferred from c_TableNm* / SQL strings across the dump.
| Table | Role | Loaded by |
|---|---|---|
SysStartRec | Per-user launch history (recent screens) | clsAuthorize.GetMenuData → GetMenuStartRecList; reaped at login (DeleteStartRec :731) |
SysUpdRec / SysUpdKeyRec | Update audit trail | Server-side every business write; reaped at login |
SysGpFile | Generic blob/file attachments | clsAttachFileBusiness.cs (Menu) |
SymSystemCtrl | System control / serial / license / version / inquiryNo | clsAuthorize.GetSystemInfo :258-321 |
MstSystemCtrl | Per-instance system master (referenced in feature catalog) | server SI |
SymPassword | Password hash store | clsAuthorize.GetPassword / RegistPassword |
MstPersonInfo (table MstPerson) | Personnel master | ApplicationInfo.GetPersonInfo |
UImItem | UI-item dictionary (column → label/abbr/format/help) | ApplicationInfo.GetUImItemInfo → MessageInfo.SetItemData |
SymMessage | Message catalog (incl. error codes ES99…) | ApplicationInfo.GetMessageInfo |
SymKbn | Enum / Kbn dictionary (drop-downs) | ApplicationInfo.GetKbnInfo |
MstApCtrl | Per-AP control (e.g. cf01-style flags, lock-master IDs) | per-screen via SI |
MstSql / SymQueryCtrl | Stored query templates picked by QueryCtrlId ("C001", …) | MakeSelect / MakeUpdate |
MstData | Generic master-of-masters | server SI |
MstUnit | Unit master | ConvertUnit |
MstColor | Color master (UI / sheet styling) | UI |
CtmApLock / CtmCompLock (+Key/Condition/Query/QueryKey) / CtmSameStartLock | Lock specifications | DACtlLock family |
CtlApLock / CtlCompLock / CtlSameStartLock | Live lock holdings | DACtlLock family |
WrkLock / WrkLockCtrl | Stop-the-world journaling lock | LockInfo.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.
Techs.ini version = 0605.0002.0001.0000 → product line
TECHS-S 6.05, build 0002.0001 (assembly), DB schema baseline 0000.
Three-way version check at every startup
(clsAuthorize.CheckVersion, :172-219):
clientVersion (assembly) must equal what the server reports
→ otherwise NeedDownloadError ("クライアント側のファイルの
バージョンが異なります"). This is the trigger for the
auto-download / sync mechanism (likely ClickOnce-style or a
custom updater not in the dump).dbVersion (server) must equal what SymSystemCtrl.Version
contains → otherwise fatal "TECHSデータベースのバージョンが異なります".SymSystemCtrl.ValidityTerm != "none" → expiry
checked against the SQL Server's GetDate().Locale enforcement (also CheckVersion):
CultureInfo.DateTimeFormat.NativeCalendarName must start with
西暦 (Japanese Gregorian).ShortDatePattern must be yyyy/MM/dd.LongTimePattern must be HH:mm:ss.TimeZone.StandardName must start with 東京 (i.e. JST).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).
_t1_*)| Assembly | Role |
|---|---|
Technoa.Techs.Menu | Menu.exe shell — login, splash, menu, mail, schedule, AP launcher |
Technoa.Techs.ClientCommonLibrary | Cross-screen helpers: ApplicationInfo, ApplicationStarting* (PLS / EUC), BuyLinkInfo, web-service URL re-base |
Technoa.Techs.BaseCommonLibrary, Technoa.TechsCommonClass, BaseCommonLibrary | Base UI / pessimistic-lock helpers (LockInfo.DBLockTreat) |
Technoa.Techs.UI.Template, Technoa.UI.UIBase, Technoa.Techs.MultiControls | Form base classes, custom controls |
Technoa.Techs.OrderCommonLibrary | Order / Seiban / Prod enums + helpers |
Technoa.Techs.SOrderCommonLibrary | Sales order |
Technoa.Techs.AcceptCommonLibrary | Inspection (検収) enums |
Technoa.Techs.AllocateCommonLibrary | Allocation (引当) enums |
Technoa.Techs.BomCommonLibrary | BOM / 部品表 |
Technoa.Techs.BtoBCommonLibrary | EDI |
Technoa.Techs.DeliCommonLibrary | Delivery + tax/fraction helpers |
Technoa.Techs.InOutCommonLibrary | 入出庫 (in/out/move/issue/complete/ship/inv/adj) |
Technoa.Techs.MasterCommonLibrary | Master CRUD UI |
Technoa.Techs.OpeDayReptCommonLibrary | 日報 (OpeMrDBInfo) |
Technoa.Techs.OpeFinishCommonLibrary | 完成 |
Technoa.Techs.OutsrcIndCommonLibrary | 外注加工 (Outsourcing instruction / delivery / inspection) |
Technoa.Techs.PayCommonLibrary | 支払 (AP) |
Technoa.Techs.PsCommonLibrary | Production Scheduling (Seiryu glue) |
Technoa.Techs.ReceiptCommonLibrary | 入金 (AR receipt) |
Technoa.Techs.ShipCommonLibrary | 出荷 / 完成 |
Technoa.Techs.ServerCommonLibrary_S | Server-side cross-cutting (also distributed to client for shared types) |
Technoa.Techs.ConfigSettings, Technoa.Techs.ClientSetting | Config + per-machine settings |
Technoa.Techs.Exception | TechsException class |
Technoa.Techs.StartUp, Technoa.Techs.UserHPStartUp | Bootstrap / launcher |
_t2_*)| Assembly | Module ID | Role (inferred from contents) |
|---|---|---|
Technoa.Techs.SI.TSS000001100_S | SI 0001100 | SICommon — generic shared-data SI |
Technoa.Techs.BE.TES000006100_S | BE 0006100 | BESharedGetData (matches the SI above) |
Technoa.Techs.DA.TDS000006100_S | DA 0006100 | (data access — DA fragments) |
Technoa.Techs.CM.TCS000004100_S | CM 0004100 | IDataAccessLogicComponents / IBusinessEntity interfaces |
Technoa.Techs.CM.TCS000005100_S | CM 0005100 | DABase, SqlCombination, MakeSelect, master-info DAs (MstHouseInfo, MstSupplierInfo, …) |
Technoa.Techs.CM.TCS000006100_S | CM 0006100 | DABusinessBase, MakeInsert/Update/Delete, WrkKeyInfo, UpdRecInfo, ExecProcedure |
Technoa.Techs.CM.TCS000007100_S | CM 0007100 | (BE base / interfaces) |
Technoa.Techs.CM.TCS000008100_S | CM 0008100 | BEBusinessBase, IBEBusinessBase*Info, ConvertUpdRec |
Technoa.Techs.CM.TCS000009100_S | CM 0009100 | (further BE base) |
Technoa.Techs.CM.TCS000010100_S | CM 0010100 | (further BE base) |
Technoa.Techs.CM.TCS000020100_S | CM 0020100 | Lock module — DACtlLock, DACtlApLock, DACtlCompLock, DACtlSameStartLock, plus VOCtl* value objects |
Technoa.Techs.CM.TCS000021100_S | CM 0021100 | (lock continuation / BE wrappers) |
Technoa.Techs.CM.TCS000030100_S | CM 0030100 | (probably MessageInfo / MessageRelated) |
Technoa.Techs.CM.TCS000040100_S | CM 0040100 | (likely UI-arrange / form-design persistence) |
Technoa.Techs.CM.TCS000041100_S | CM 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.
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.
WebConfiguration.cs
(_t1_Technoa.Techs.ServerCommonLibrary_S/Technoa.Techs.Common_S/WebConfiguration.cs)
is here but the actual ASMX web.config is not — we only see the
client's view of which URL templates exist
(TSS000002100.asmx for SIMenu; numbers run sequentially per
module). A live server install will list a TSS000xxxxxx.asmx per
business module under TechsService\bin.screen-id (0201001) ↔ TSSnnnnnnn.asmx is not
exhaustive in this dump. We can confirm:
TSS000002100.asmx ↔ SIMenu (login / menu / mail).TSS000001100.asmx ↔ SICommon (shared-data refresh).TSS000nnnn100 IDs follow the BE/CM/DA numbering
(TES…, TDS…, TCS… share the trailing module number).SIPls_UpdSchedule writes) is not directly enumerated here but
appears in help PDF 0301011 as the 製番大日程 / 部品小日程連携
bridge.NeedDownloadError branch in CheckVersion) is in the dump; this
is presumably a separate Technoa.Techs.UserHPStartUp job (the
assembly is in _t1_* but only contains version metadata in the
obfuscated view).For a fresh build, the takeaways are:
CtmCompLock* is genuine business config and
migrating it requires reading those master tables, not the
client code.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.