반응형

특정 텍스트(문자열, string)의 넓이(width)에 따라서 작업을 해야 될 때가 있는데


다음과 같이 얻을 수 있다.


function GetTextWidth(const Text: string; const Font: TFont): Integer;
var
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  try
	Canvas.Handle := GetDC(0);
	try
	  Canvas.Font.Assign(Font);
	  Result := Canvas.TextWidth(Text);
	finally
	  ReleaseDC(0, Canvas.Handle);
	end;
  finally
	Canvas.Free;
  end;
end;


반응형
반응형

Application.MainForm은 read only 속성이기 때문에 원칙적으로 런타임에 메인폼을 변경 할 수는 없다.


그러나 포인터를 이용하면 가능하다.


procedure SetAsMainForm(AForm: TForm);

var

  P:Pointer;

begin

  P := @Application.Mainform;

  Pointer(P^) := AForm;

end;

반응형
반응형

SQL 2005 이상에서는 CTE를 제공 해주기 때문에 재귀적으로 BOM을 풀어 낼 수가 있으나


SQL 2000 에서는 CTE 문법을 사용할 수 없으므로 사용자 정의함수로 동일하게 BOM 테이블을 조회 할 수 있다.


CREATE FUNCTION ufn_GetBOM (
    @Parent AS VARCHAR(20)
)
RETURNS @BOM table
(
    Child      VARCHAR(20),
    Parent    VARCHAR(20),
    Qty        FLOAT(8),
    LevelNo   INT,
    OrdNo   VARCHAR(2000) 
)
AS
     BEGIN
          DECLARE @LevelNo AS int
          SET @LevelNo = 0

          INSERT INTO @BOM
          SELECT Child, Parent, Qty, @LevelNo, 
          CAST(SUBSTRING(Child + '00000000000000000000', 1, 20) AS VARCHAR(2000)) as OrdNo
          FROM BOM
          WHERE Parent = @Parent
          
          WHILE @@ROWCOUNT > 0
          BEGIN
               SET @LevelNo = @LevelNo + 1

               INSERT INTO @BOM
               SELECT a.Child, a.Parent, a.Qty, @LevelNo, 
               CAST(b.OrdNo + SUBSTRING(a.Child + '00000000000000000000', 1, 20) AS VARCHAR(2000))
               FROM BOM a 
                     JOIN @BOM b
                         ON a.Parent = b.Child AND b.LevelNo = @LevelNo - 1
          END

          RETURN
     END
GO

위와 같이 사용자 정의함수를 정의한 후, 사용시에는 다음과 같이 최상위 품목번호를 넘겨 주면


하위 품목이 모두 조회 된다.


SELECT * FROM dbo.ufn_GetBOM('A2006010' ) 
ORDER BY ordno 



이를 클라이언트에서 트리 형태로 보여 주려면 다음과 같이 한다.


다음은 델파이에서 TreeView에 가져온 BOM 구조를 보여 주는 함수를 만들어 보았다.


procedure TFrom1.ShowBOM;
var
  CurrentNode: TTreeNode;
function makeNodeText(): String;
begin
  with DM.qryBOM do
    Result := FieldByName('Child').AsString + '(' + FieldByName('Name').AsString + '/' +
              FieldByName('Spec').AsString + '/' + FieldByName('Company').AsString + '/' +
              FieldByName('MatType').AsString + '),' + FieldByName('Qty').AsString;
end;

begin
  TreeView1.Items.Clear;
  CurrentNode := nil;

  with DM.qryBOM do begin
    while not EOF do begin
      if CurrentNode = nil then
        CurrentNode := TreeView1.Items.Add(ATreeView.Selected, makeNodeText())
      else begin
        if FieldByName('LevelNo').AsInteger > CurrentNode.Level then
          CurrentNode := TreeView1.Items.AddChild(CurrentNode, makeNodeText())
        else begin
          while FieldByName('LevelNo').AsInteger < CurrentNode.Level do begin
            if (CurrentNode.Parent <> nil) then
              CurrentNode := CurrentNode.Parent
            else
              break;
          end;

          CurrentNode := TreeView1.Items.Add(CurrentNode, makeNodeText())
        end;
      end;

      Next;
    end;
  end;

end;



반응형
반응형

SQL서버에서 기존의 PK를 다른 컬럼 구성으로 변경 하려면 다음과 같이 한다.

-- 기존 PK명 확인

sp_help 테이블명

--기존 PK 삭제

ALTER TABLE 테이블명

DROP CONSTRAINT 기존_PK명

--새로운 PK 정의

ALTER TABLE 테이블명

ADD CONSTRAINT 새_PK명 PRIMARY KEY [NONCLUSTERED](컬럼1, 컬럼2, ...)

 

좀 더 자세한 내용을 원하시면 다음 포스팅을 참고 하세요.

[SQL서버] PK(Primary Key) 변경 하기(상세)

 

반응형

+ Recent posts