unit uConfigNILM; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, Grids, BaseGrid, AdvGrid, ExtCtrls, StdCtrls, AdvUtil, AdvObj, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client; type TfrmNILM = class(TForm) AdvStringGrid1: TAdvStringGrid; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Edit1: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; btnAdd: TButton; btnEdit: TButton; btnDelete: TButton; ComboBox1: TComboBox; Edit2: TEdit; Edit7: TEdit; FDQuery1: TFDQuery; procedure FormShow(Sender: TObject); procedure AdvStringGrid1ClickCell(Sender: TObject; ARow, ACol: Integer); procedure btnAddClick(Sender: TObject); procedure btnEditClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); private { Private declarations } select_nilm_idxNo : integer; procedure CreateTableNilmValueLog(nilm_idxno : integer); procedure DropTableNilmValueLog(nilm_idxno : integer); function CheckNILM(nilmID : integer) : Boolean; function Get_NILM_idxNo(nilmID : integer) : integer; public { Public declarations } procedure ShowNILM(); end; var frmNILM: TfrmNILM; implementation uses uMain, uDevConfig; {$R *.dfm} procedure TfrmNILM.DropTableNilmValueLog(nilm_idxno : integer); var sql : string; begin sql := ''; sql := 'DROP TABLE IF EXISTS nilm_'+format('%.5d',[nilm_idxno]); frmMain.insertSQL(sql); end; procedure TfrmNILM.CreateTableNilmValueLog(nilm_idxno : integer); var sql : string; begin sql := ''; { mariaDB Å×ÀÌºí »ý¼º sql := 'CREATE TABLE IF NOT EXISTS nilm_'+format('%.5d',[nilm_idxno])+' ('+ 'aNo int(11) NOT NULL AUTO_INCREMENT,'+ 'NilmID int(11) DEFAULT NULL,'+ 'pf_1 float DEFAULT NULL,'+ 'CorrectFactor_1 float DEFAULT NULL,'+ 'Vrms_1 float DEFAULT NULL,'+ 'Irms_1 float DEFAULT NULL,'+ 'Var_1 float DEFAULT NULL,'+ 'Va_1 float DEFAULT NULL,'+ 'Pwr_1 float DEFAULT NULL,'+ 'pf_2 float DEFAULT NULL,'+ 'CorrectFactor_2 float DEFAULT NULL,'+ 'Vrms_2 float DEFAULT NULL,'+ 'Irms_2 float DEFAULT NULL,'+ 'Var_2 float DEFAULT NULL,'+ 'Va_2 float DEFAULT NULL,'+ 'Pwr_2 float DEFAULT NULL,'+ 'pf_3 float DEFAULT NULL,'+ 'CorrectFactor_3 float DEFAULT NULL,'+ 'Vrms_3 float DEFAULT NULL,'+ 'Irms_3 float DEFAULT NULL,'+ 'Var_3 float DEFAULT NULL,'+ 'Va_3 float DEFAULT NULL,'+ 'Pwr_3 float DEFAULT NULL,'+ 'gX float DEFAULT NULL,'+ 'gY float DEFAULT NULL,'+ 'gZ float DEFAULT NULL,'+ 'aX float DEFAULT NULL,'+ 'aY float DEFAULT NULL,'+ 'aZ float DEFAULT NULL,'+ 'TempC float DEFAULT NULL,'+ 'lastUpdate datetime DEFAULT NULL,'+ 'UNIQUE KEY aNo (aNo)'+ ') ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci'; } // PostgreSQL Å×ÀÌºí »ý¼º sql := 'CREATE TABLE IF NOT EXISTS "nilm_'+format('%.5d',[nilm_idxno])+'" ('+ '"aNo" SERIAL NOT NULL,'+ '"NilmID" INTEGER ,'+ '"pf_1" REAL ,'+ '"CorrectFactor_1" REAL ,'+ '"Vrms_1" REAL ,'+ '"Irms_1" REAL ,'+ '"Var_1" REAL ,'+ '"Va_1" REAL ,'+ '"Pwr_1" REAL ,'+ '"pf_2" REAL ,'+ '"CorrectFactor_2" REAL ,'+ '"Vrms_2" REAL ,'+ '"Irms_2" REAL ,'+ '"Var_2" REAL ,'+ '"Va_2" REAL ,'+ '"Pwr_2" REAL ,'+ '"pf_3" REAL ,'+ '"CorrectFactor_3" REAL ,'+ '"Vrms_3" REAL ,'+ '"Irms_3" REAL ,'+ '"Var_3" REAL ,'+ '"Va_3" REAL ,'+ '"Pwr_3" REAL ,'+ '"gX" REAL ,'+ '"gY" REAL ,'+ '"gZ" REAL ,'+ '"aX" REAL ,'+ '"aY" REAL ,'+ '"aZ" REAL ,'+ '"TempC" REAL ,'+ '"lastUpdate" TIMESTAMP ,'+ 'CONSTRAINT nilm_'+format('%.5d',[nilm_idxno])+'_pkey PRIMARY KEY ("aNo"));'; frmMain.insertSQL(sql); end; procedure TfrmNILM.ShowNILM(); var i, idxNo, nilmID, nilmType : integer; nilmName, S : string; srcAddr, srcMac, dstAddr, topic : string; dstPort : integer; begin select_nilm_idxNo := 0; try frmMain.NILM_ID_List.Clear; frmMain.NILM_TOPIC_List.Clear; if not frmMain.FDConnection1.Connected then frmMain.FDConnection1.Connected := True; if frmMain.FDConnection1.Connected then begin FDQuery1.Close; FDQuery1.SQL.Clear; FDQuery1.SQL.Text := 'SELECT * FROM "nilm_info"'; FDQuery1.Open; if FDQuery1.RecordCount> 0 then begin FDQuery1.First; i := 0; frmDevConfig.cb_nilm.items.clear; AdvStringGrid1.RowCount := FDQuery1.RecordCount + 1; While not FDQuery1.Eof do begin Inc(i, 1); idxNo := FDQuery1.FieldByName('idxNo').asInteger; nilmID := FDQuery1.FieldByName('NilmID').asInteger; frmMain.NILM_ID_List.Add(nilmID); // frmMain.NILM_Map.Add(nilmID,i); nilmType := FDQuery1.FieldByName('nilmType').asInteger; dstPort := FDQuery1.FieldByName('dstPort').asInteger; srcAddr := FDQuery1.FieldByName('srcAddr').asString; // ½Ã¸®¾ó³Ñ¹ö·Î º¯°æ_20250905 srcMac := FDQuery1.FieldByName('srcMac').asString; dstAddr := FDQuery1.FieldByName('dstAddr').asString; topic := FDQuery1.FieldByName('Topic').asString; frmMain.NILM_TOPIC_List.Add(topic); nilmName := FDQuery1.FieldByName('nilmName').asString; AdvStringGrid1.Cells[0, i] := inttostr(idxNo); AdvStringGrid1.Cells[1, i] := inttostr(nilmID); AdvStringGrid1.Cells[2, i] := nilmName; AdvStringGrid1.Cells[3, i] := inttostr(nilmType); AdvStringGrid1.Cells[4, i] := srcAddr; // ½Ã¸®¾ó³Ñ¹ö·Î º¯°æ_20250905 AdvStringGrid1.Cells[5, i] := srcMac; AdvStringGrid1.Cells[6, i] := dstAddr; AdvStringGrid1.Cells[7, i] := inttostr(dstPort); AdvStringGrid1.Cells[8, i] := topic; frmMain.fNILM[nilmID]._TOPIC := topic; frmMain.fNILM[nilmID].idxNo := idxNo; frmMain.fNILM[nilmID]._NAME := nilmName; S := ''; S := format('%d:%s',[nilmID, nilmName]); frmDevConfig.cb_nilm.items.add(S); FDQuery1.Next; end; end; end; except on e : exception do begin frmMain.printlog('Database Connect Error :: '+e.Message, 'DB'); end; end; end; function TfrmNILM.CheckNILM(nilmID : integer) : Boolean; begin result := true; try if not frmMain.FDConnection1.Connected then frmMain.FDConnection1.Connected := True; if frmMain.FDConnection1.Connected then begin FDQuery1.Close; FDQuery1.SQL.Clear; FDQuery1.SQL.Text := 'SELECT * FROM "nilm_info" WHERE "NilmID"='+inttostr(nilmID); FDQuery1.Open; if FDQuery1.RecordCount> 0 then begin result := false; end; end; except on e : exception do begin frmMain.printlog('Database Connect Error :: '+e.Message, 'DB'); end; end; end; function TfrmNILM.Get_NILM_idxNo(nilmID : integer) : integer; begin result := 0; try if not frmMain.FDConnection1.Connected then frmMain.FDConnection1.Connected := True; if frmMain.FDConnection1.Connected then begin FDQuery1.Close; FDQuery1.SQL.Clear; FDQuery1.SQL.Text := 'SELECT * FROM "nilm_info" WHERE "NilmID"='+inttostr(nilmID); FDQuery1.Open; if FDQuery1.RecordCount> 0 then begin result := FDQuery1.FieldByName('idxNo').AsInteger; end; end; except on e : exception do begin frmMain.printlog('Database Connect Error :: '+e.Message, 'DB'); end; end; end; procedure TfrmNILM.FormShow(Sender: TObject); begin ShowNILM(); end; procedure TfrmNILM.AdvStringGrid1ClickCell(Sender: TObject; ARow, ACol: Integer); var nilmType : integer; begin if ARow > 0 then begin select_nilm_idxNo := StrToIntDef(AdvStringGrid1.Cells[0, ARow], 0); Edit2.Text := IntToStr(StrToIntDef(AdvStringGrid1.Cells[1, ARow], 0)); Edit1.Text := AdvStringGrid1.Cells[2, ARow]; nilmType := StrToIntDef(AdvStringGrid1.Cells[3, ARow], 0); ComboBox1.ItemIndex := nilmType; Edit3.Text := AdvStringGrid1.Cells[4, ARow]; Edit4.Text := AdvStringGrid1.Cells[5, ARow]; Edit5.Text := AdvStringGrid1.Cells[6, ARow]; Edit7.Text := IntToStr(StrToIntDef(AdvStringGrid1.Cells[7, ARow], 0)); Edit6.Text := AdvStringGrid1.Cells[8, ARow]; end; end; procedure TfrmNILM.btnAddClick(Sender: TObject); var sql : string; nilm_idxno : integer; begin if CheckNILM(StrToInt(Edit2.Text)) then begin sql := ''; sql := 'INSERT INTO nilm_info VALUES(DEFAULT, '+ ''+Edit2.Text+', '+ ''+inttostr(ComboBox1.ItemIndex)+', '+ ''''+Edit1.Text+''', '+ ''''+Edit3.Text+''', '+ ''''+Edit4.Text+''', '+ ''''+Edit5.Text+''', '+ ''+Edit7.Text+', '+ ''''+Edit6.Text+''' '+ ')'; frmMain.insertSQL(sql); sql := ''; sql := 'INSERT INTO "nilm_value" VALUES('+ ''+Edit2.Text+',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,now() '+ ')'; frmMain.insertSQL(sql); nilm_idxno := Get_NILM_idxNo(StrToInt(Edit2.Text)); if nilm_idxno > 0 then CreateTableNilmValueLog(nilm_idxno); ShowNILM(); select_nilm_idxNo := 0; end else begin ShowMessage('ÀÌ¹Ì Á¸ÀçÇÏ´Â NILM ID ÀÔ´Ï´Ù.'); end; end; procedure TfrmNILM.btnEditClick(Sender: TObject); var sql : string; begin if (not CheckNILM(StrToInt(Edit2.Text))) and (select_nilm_idxNo>0) then begin sql := ''; sql := 'UPDATE "nilm_info" SET '+ '"NilmID"='+Edit2.Text+', '+ '"nilmType"='+inttostr(ComboBox1.ItemIndex)+', '+ '"nilmName"='''+Edit1.Text+''', '+ '"srcAddr"='''+Edit3.Text+''', '+ // ½Ã¸®¾ó³Ñ¹ö·Î º¯°æ_20250905 '"srcMac"='''+Edit4.Text+''', '+ '"dstAddr"='''+Edit5.Text+''', '+ '"dstPort"='+Edit7.Text+', '+ '"Topic"='''+Edit6.Text+''' '+ ' WHERE "idxNo"='+inttostr(select_nilm_idxNo); frmMain.insertSQL(sql); ShowNILM(); select_nilm_idxNo := 0; end else begin ShowMessage('NILM ID¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.'); end; end; procedure TfrmNILM.btnDeleteClick(Sender: TObject); var sql : string; begin if (not CheckNILM(StrToInt(Edit2.Text))) and (select_nilm_idxNo>0) then begin sql := ''; sql := 'DELETE FROM "nilm_info" WHERE "idxNo"='+inttostr(select_nilm_idxNo); frmMain.insertSQL(sql); DropTableNilmValueLog(select_nilm_idxNo); ShowNILM(); select_nilm_idxNo := 0; end else begin ShowMessage('NILM ID¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.'); end; end; end.