2009년 4월 17일 금요일
이익잉영금 변동
미처분이익잉여금(A) ________ 1,005,000
_전기이월미처분이익잉여금 ______ 180,000
_당기순이익 _________________ 725,000
임의적립금등이입액(B) ________ 100,000
_임의적립금 _________________ 100,000
이익잉여금처분액(C) _________ 320,000
_현금배당 ___________________ 200,000
_법정적립금 __________________ 20,000
_임의적립금 _________________ 100,000
처분후미처분이익잉여금(A+B-C) _ 785,000
※ 단순한 생각에 아마도 임의적립금등이입액은 '결손금 처리 계산서대'에 나오고 '이익잉여금 처분 계산서'에 나온다면 결손금 처리 후 남은 금액에 대하여 배당을 하거나 벅립금을 쌓게되면 그 떼나 나오지 않을듯 싶은데... 그런 기업이 모 있을까 하는 생각이 든다... 우선 당기순이익이 발생했는데 굳이 이입을 할 이유가 없을거 같고 또 결손금 처리하면서 배당을??? 쫌 그렇다...
--------------------------------------------------------------------------------------------
※ 결손금처리계산서.
미처리결손금(A) __________ (45,000)
_전기이월미처분이익잉여금 __ 180,000
_(또는 전기이월미처리결손금)
_당기순손실 _____________ (225,000)
결손금처분액(B) ___________ 45,000
_임의적립금 ______________ 45,000
처분후미처분이익잉여금(A+B)_____ 0
※ 이상 회계원리 수준에서는 머 대충 이런 구조가 되는거 같다... 중급회계 이후에 좀 더 자세하게 추가를 해야겠다...
반드시 알아야 하는 회계원리 기본 상식
※ 채무증권만이 만기보유증권으로 분류될 수 있다...
※ 재고자산감모손실은 재고자산의 장부가액에서 직접차감하여 표시하고, 정상적으로 발생한 감모손실은 매출원가에 가산하고 비정상적으로 발생한 감모손실은 영업외비용으로 처리한다.
※ 물가가 상승하고 재고층이 감소하지 않는 한, 후입선출법에서는 나중에 들어온 재고가 먼저 감소되므로 인하여 높은 판매가격이 현행 판매가격에 대응되므로 이익이 과소계상된다.
※ 유형자산 중 건물의 취득시 발생하는 부대비용 중에서 철거물 매각가치는 차감하지만 설계비용은 포함시키지 않는다.
※ 무형자산의 감가상각은 경제적 효익이 소비되는 형태를 말하는 것으로 관계법령이나 계약에 정해진 경우를 제외하고는 최대 내용연수를 20년으로 제한하며 잔존가액은 없는 것을 원칙으로 한다.
※ 금융자산을 양도한 경우 매각거래로 보는 요건...
- 양도인은 금융자산 양도 후 당해 금융자산에 대한 권리를 행사할 수 없어야 한다.
- 양수인은 양수한 금융자산을 처분할 자유로운 권리를 갖고 있어야 한다.
- 양도인은 금융자산 양도 후 효율적인 통제권을 행사할 수 없어야 한다.
- 금융자산을 양도하여 모든 권리와 의무가 실질적으로 이전되는 경우(매각거래)에는 양수인이 대손에 대한 위험을 부담하여야 한다.
※ 우발상황에 관련된 기업회계기준의 해석...
- 집단적, 반복적으로 나타나는 거래 또는 현상에 대하여 합리적으로 추정하여 계상하는 비용 또는 손실은 우발상황에 포함되지 않는다.
- 우발이득이 발생하는 우발상황은 재무제표에 반영해서는 안된다.
- 확정적 사건은 이미 발생했으나 금액이 확정되지 않아 회계적 추정을 필요로 하는 상황은 우발상황에 포함되지 않는다.
※ 전환증권에 대하여...
- 전환사채의 이자비용은 사채의 장부가액에 유효이자율을 적용하여 계산한다.
- 전환증권은 당해증권의 소유자가 보통주 청구에 대한 권리를 행사하면 보통주가 추가로 발행되는 금융상품 또는 기타 계약을 말한다.
- 전환사채는 유가증권의 소유자가 일정한 조건 하에 전환권을 행사할 수 있는 사채로서, 권리를 행사하면 보통주로 전환되는 사채를 말한다.
- 전환사채는 일반사채와 전환권의 두 가지 요소로 구성되는 복합적 성격을 지닌 증권이다.
※ 자본조정에는 감자차손, 배당건설이자, 주식매입선택권, 미교부주식배당금 등이 포함된다.
※ 감자차손과 자기주식처분손실은 이월결손금 처리순서에 따라 이익잉여금과 자본잉여금으로 전액 당기에 상각하되, 잉여금이 부족한 경우에는 처분가능 잉여금이 생길 때까지 자본조정으로 기록한다.
※ 배당건설이자는 개업 후 연 6% 이상의 이익을 배당하는 경우에 그 6%를 초과한 금액과 동액 이상을 상각하고, 동 상각액은 이익잉여금처분으로 한다.
※ 주식배당은 기존 주주에게 지분비율대로 주식을 배당하게 되므로 주식수는 증가하지만 주주의 자산가치는 그대로이다.
※ 지분증권에 대하여...
- 지분증권의 취득원가는 취득시 시장가격으로 계상하나 부대비용이 존재하는 경우에는 부대비용을 포함한 가격으로 한다.
- 무상증자와 주식배당에 의해 지분증권을 취득한 경우에는 지분율에 변화가 없으므로 지분증권의 취득으로 보지 않는다.
- 보유의도와 지분법피투자회사에 대한 영향력 행사여부에 따라 분류되며 분류의 적정성은 대차대조표일마다 재검토한다.
※ 국채, 공채, 사채, 전환사채, 신주인수권부사채 등은 채무증권에 해당한다.
※ 수정을 요하는 대차대조표일 후 발생한 사건...
- 대차대조표일 이전에 존재하였던 소송사건의 결과가 대차대조표일 후에 확정되어 이미 인식한 손실금액을 수정하여야 하는 경우.
- 대차대조표일 이전에 구입한 자산의 취득원가 또는 매각한 자산의 금액을 대차대조표일 후에 결정하는 경우.
- 전기 또는 그 이전기간에 발생한 회계적 오류를 대차대조표일 후에 발견하는 경우.
※ 유가증권의 시장가격이 대차대조표일과 재무제표가 사실상 확정된 날 사이에 하락한 것은 수정을 요하지 않는 대차대조표일 후 발생한 사건의 예로써 시장가격의 하락은 대차대조표일 현재의 상황관 관련된 것이 아니라 대차대조표일 이후에 발생한 상황을 반영한 것이다. 따라서 그 유가증권에 대해서는 재무제표에 인식한 금액을 수정하지 않는다.
※ 외화거래에 대하여...
- 외화거래가 발생한 경우에는 발생시점의 환율로 환산하여 회계처리한다.
- 기말현재 외화로 표시된 채권, 채무가 있는 경우에는 대차대조표일 현재 환율로 환산하고, 장부상 금액과의 차액은 외화환산손익으로 처리하여야 한다.
- 외환차손익이란 외화채권, 채무의 대금을 수취하거나 지급하였을 경우에 발생하는 손익을 말한다.
- 외화환산차손익과 외화차손익은 영업외수익 및 영업외비용으로 각각 분류된다.
※ 법인세 이연효과를 가져오는 일시적 차이란 유보로 처분되는 항목을 말하는 것으로 대손충당금 한도초과액이 있다.
유형자산처분손익
유형자산처분손익 계산의 예...
구 분 (주)갑 차량운반구 (주)을 기계장치
----------------------------------------------------
취득원가 ___________ 7,000,000 ________ 10,000,000
감가상각누계액 ______ 2,500,000 _________ 6,300,000
공정가액 ___________ 4,200,000 _________ 4,600,000
차액은 수표를 발행하여 지급...
위의 경우 (주)갑 입장에서 유형자산처분손익은?...
유형자산처분손익 = 제공자산의 공정가액 - (제공자산의 공정가액 + 지급액)
좀 더 자세히 풀어 말하자면...
유형자산처분손익 = 받을 유형자산의 공정가액 - 교체할 유형자산의 공정가액 + 지급액
즉... 아래와 같이 된다...
4,600,000 - (7,000,000 - 2,500,000 + 400,000) = (300,000)
즉, 손실 300,000 이다...
영업활동으로 인한 현금흐름
가. 매출 등 수입활동으로 부터의 유입액 _ 100,000
나. 매입 및 종업원에 대한 유출액 _____ (80, 000)
다. 이자수익 ______________________ 1,100
라. 이자비용 _____________________ (2,500)
영업활동으로 인한 현금흐름 __________ 13,600
2009년 4월 16일 목요일
Component 일괄 초기화 In DELPHI
For IDX := 0 To pnlSearch.ControlCount - 1 Do
Begin
If pnlSearch.Controls[IDX].ClassType = TEdit Then TEdit(pnlSearch.Controls[IDX]).Clear;
End;
이렇게 해주면 pnlSearch의 위에 있는 EditBox가 모두 Clear가 된다...
물론 Label, ComboBox 등 모든 Component가 가능하다...
아래는 Form에 있는 Component를 초기화 하는 것이다...
For i := 0 To ComponentCount - 1 Do
Begin
If Components[i].ClassType = TEdit Then
Begin
If TEdit(Components[i]).Tag = 0 Then TEdit(Components[i]).Text := ''
End
Else If (Components[i].ClassType = TComboBox) then
Begin If TComboBox(Components[i]).Tag = 0 Then TComboBox(Components[i]).ItemIndex := 0;
End;
End;
맘에 드는 것을 골라 쓰면 된다...
Oracle DECODE
AS400 DB2의 CASE...WHEN...ELSE...END와 같은 거였다...
기본형은 이렇게 된다...
형식) DECODE(조건(비교당할 변수), 비교값, 맞을때, 틀릴때)
무신 말인가 하면 예를 들어보면...
SELECT ... FROM ... WHERE CODE LIKE DECODE(:sType, 'CD', :sCode, '') '%' 이렇게 된다.
즉 sType의 값이 'CD'이면 SELECT ... FROM ... WHERE CODE LIKE :sCode '%'가 되는 것이고 'CD'가 아니면 SELECT ... FROM ... WHERE CODE LIKE '' '%'가 되는 것이다...
한가지 응용을 해보면...
자주 사용하는 형태가 이런게 가끔 나오더라...
ASTSTATE = DECODE(:sAststate, '01', '02', DECODE(:sAststate, '02', '03', '07'))
풀어보면 sAststate의 값이 '01'이면 ASTSTATE에 '02'를 넘기고 그렇지 않으면 다시 비교를 해서 '02'이면 '03'을 넘기고 그렇지 않으면 최종적으로 '07'의 값을 넘기게 된다...
쫌 쉽다...
TreeView에서 Level별 선택된 내역 확인하기 In DELPHI
0 :
Begin
1단계 := TreeView.Selected.Text;
End;
1 :
Begin
2단계 := TreeView.Selected.Text;
End;
2 :
Begin
3단계 := TreeView.Selected.Text;
End;
End; //Case문 종료...
이렇게 해주면 된다...
머 단계별로 필요가 없으면 걍
Temp := TreeView.Selected.Text; <- 이렇게 해주면 된다...
물론 레벨이 더 있으면 계속 밑으로 써 나가면 된다...
데이터 읽어서 TreeView 생성하기 In DELPHI
Var
ItmCd : String;
Node_1, Node_2, Node_3 : TTreeNode;
Begin
TreeView.Items.Clear;
.
. //데이터 읽어오기...
.
TreeView.Items.BeginUpdate;
For ii := 0 To RowNo - 1 Do
Begin
ItmCd := Trim(트리에 뿌려질 내역...);
If 읽어온 레벨 = '1' Then //Node의 레벨 체크...
begin Node_1 := TreeView.Items.Add(TreeView.TopItem,ItmCd));
End
Else If 읽어온 레벨 = '2' Then Begin Node_2 := TreeView.Items.AddChild(Node_1,ItmCd));
End
Else If 읽어온 레벨 = '3' Then Begin Node_3 := TreeView.Items.AddChild(Node_2,ItmCd));
End;
Node_Idx[ii] := ItmCd; //없어도 됨...
End;
TreeView.Items.EndUpdate;
TreeView.items[0].selected := True;
End;
이런 식으로 처리하면 TreeView에 데이터를 Tree로 보여줍니다...
TreeView에서 하위분류 존재여부 체크하기 In DELPHI
그럼 경우 아래와 같이 함 물어보고 있으면 빠져 나가야 한다...
머 굳이 있어도 지운다면 모두 다 지우고...
If TreeView.Selected.HasChildren = True Then
Begin
.
. //처리할 내용...
.
End;
어지럽게 나열된 TreeView를 정렬 In DELPHI
그런 경우를 대비해서 TreeView에 다시 데이터를 읽어서 뿌리지 않고 TreeView의 Node를 가장 첫번째 Level로 만들어 주는 간단한 방법이 있다...
TreeView.FullCollapse
이렇게 Coding을 해주면 된다...
어지럽게 나열된 Tree들이 가지런히 첫번째 Level로 정렬이 될 것이다...
Registry에 입력한 정보 읽어오기 In DELPHI
var
regInfo: TRegistry;
begin
regInfo := TRegistry.Create;
With regInfo Do
Begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey( REGISTRY_DIRECTORY, True ); Result := ReadString( sLino ); CloseKey; End;
regInfo.Free;
end;
이렇게 하면 Registry의 값을 읽어서 호출한 넘에게 값을 넘겨준다...
Registry에 정보 입력하기 In DELPHI
procedure SetRegistry( sLino, sValue : String );
var
regInfo: TRegistry;
begin
regInfo := TRegistry.Create;
With regInfo Do Begin RootKey := HKEY_LOCAL_MACHINE;
OpenKey( REGISTRY_DIRECTORY, True ); WriteString( sLino, sValue );
CloseKey;
End;
regInfo.Free;end;
이렇게 해주면 레지스트리에 정보를 입력할 수 있다...
물론 경로는 맘대로 바꿔도 되고...
입력된 정보는 Regedit로 확인하면 된다...
AdvStringGrid에 Column별 Edit 설정 In DELPHI
거기에 알맞게 Coding을 해주면 된다...
If (ACol = 0) And (ACol = 9) Then CanEdit := True
Else CanEdit := False;
0, 9번째 Column은 Edit를 할 수 있고... 나머지는 Edit를 할 수 없다...
AdvStringGrid에 조건에 따른 Check 설정 In DELPHI
그리드의 9번째 컬럼의 값이 0보다 크면 그 Row의 CheckBox에 Check를 해준다...
KeyDown Evnet에 Coding을 해주면 된다...
난 주로 Enter Key로 체크를 한다...
Three Tier 방식에서 100건씩 잘라서 넘기기 In DELPHI & Pro-C
IDX := 0;
For ii := 0 To AdvStringGrid.RowCount-2 Do Begin Inc(IDX);
If ((ii+1) MOD 100) = 0 Then Begin If Not SaveData(100, ii-99) Then Exit;
IDX := 0; End Else Begin If (AdvStringGrid.RowCount - 1) = (ii + 1) Then If Not SaveData(IDX, AdvStringGrid.RowCount - 1 - IDX) Then Exit; End;End;
Two Tier 방식에서는 필요가 없겠지만 Three Tier 방식에서는 반드시 필요한 거 같다...
수백, 수천 건의 데이터를 넘기게 되면 아무래도 로드가 심해져 문제가 발생 할 수 있기 때문에. 즉, 호출하고 물고있는 시간이 길어져 TimeOut으로 통신이 끊긴다던지... 아니면 사이즈가 커서 못 넘어 간다던지.
아래는 함수는 데이터를 호출한 서비스로 넘기는 함수다.
Function TGEA201F1.SaveData(sCnt, gCnt: Integer): Boolean;Var IDX, iCnt, RowNo : Integer; ChkStatus : Boolean;Begin Result := False;
Try geReqedt := HgeReqedt.Create;
With geReqedt Do Begin sLocate := VarArrayCreate([0, sCnt-1], varVariant); sReqno := VarArrayCreate([0, sCnt-1], varVariant);
iCnt := 0;
With AdvStringGrid Do Begin For IDX := gCnt To sCnt + gCnt - 1 Do Begin agProdList.GetCheckBoxState(0, IDX+1, ChkStatus);
If ChkStatus And (StrToInt(DelChar(Cells[9, IDX+1], ',')) > 0) Then Begin sLocate [iCnt] := G_LOCATE; sReqno [iCnt] := lsReqNo;
Inc(iCnt); End; End; End; End;
//서비스 호출...
Result := True;
Finally geReqedt.Free; Screen.Cursor := crDefault; End;end;
AdvStringGrid에서 Row의 Check여부 알아내기 In DELPHI
ChkStatus : Boolean
Begin
With AdvStringGrid Do Begin For ii := 0 To RowCount - 1 Do Begin GetCheckBoxState(0, ii+1, ChkStatus);
If ChkStatus Then Begin .
. 처리할 문장...
. End; End; End;
end;
이렇게 하면 됩니다...
GetCheckBoxState에서 ChkStatus의 값을 넘겨주는데 그 값으로 판단하여 처리하면 됩니다...
AdvStringGrid의 모든 CheckBox 선택하기 In DELPHI
이렇게 하면 첫번째에 있는 CheckBox에 모두 Check가 됩니다...
물론 True를 False로 바꾸면 Check가 모두 없어집니다...
AdvStringGrid의내용을 Excel로 저장 In DELPHI
FileName : String;
Begin
AdvStringGrid.SaveToXLS(FileName);
이렇게 하면 Excel파일이 만들어 집니다...
물론 FileName이라는 이름으로여...
무지하게 간단하져...
저장되는 장소는 내문서 즉 MyDocument로 들어갑니다...
그런데...
제가 아직 해결이 안된 부분이 있는데...
같은 이름이 있으면 저장할 때 물어보는데 아니오를 선택하면 메세지박스를 하나 띄우고 저장이 안되는데...
그 에러 잡는 방법을 모르겠네여...
AdvStringGrid에서 CheckBox 만들기 In DELPHI
Begin
Cells[0, IDX+1] := ''; AddCheckBox(0, IDX+1, False, False);
End;
이렇게 하면 첫번째 Column 에 CheckBox가 생깁니다...
만들어 보시면 알겠지만 델파이 CheckBox Component와 같은 모양일 겁니다...
Menu에 활성된 창 목록 보여주기 In DELPHI
메뉴를 하나 만들고 아래와 같이 선언부에 선언을 해주고 함수를 코딩하고 호출을 해주면 된다...
선언부...
Procedure MakeForWindow(TargetMenu:TMainMenu; iIndex:Integer;sMainFormName:String;event:TNotifyEvent);
Procedure ReViewForm(Sender:TObject);
호출...
MakeForWindow(GgMenu, 7, 'GGMAINF', ReViewForm);
- GgMenu : 메뉴이름.
- 7 : 메뉴 개수.
- GGMAINF : 메인폼 이름.
- ReViewForm : 화면명 선택시 보여줄 함수.
함수...
procedure MakeForWindow(TargetMenu:TMainMenu; iIndex:Integer;sMainFormName:String;event:TNotifyEvent);var ix: Integer; Item: TMenuItem;begin If (TargetMenu.items[iIndex].Count > 2) Then Begin For ix := TargetMenu.items[iIndex].Count - 1 DownTo 2 Do TargetMenu.items[iIndex].Items[ix].Free; // 현재 '창' 메뉴의 아이템을 모두 삭제 End;
For ix := 0 To Screen.FormCount - 1 Do Begin
// 활성화된 폼 중에서 메인화면을 제외하고 Menu Item에 추가 If (Screen.Forms[ix].name <> sMainFormName) And (pos('_P', Screen.Forms[ix].name) = 0) then //메인 프로그램과 '_P'가 포함된 프로그램은 제외...
Begin Item := TMenuItem.Create(nil); Item.Name := Screen.Forms[ix].name; Item.Caption := Screen.Forms[ix].Caption;
//blank click event에 matching (자기폼 activate) Item.OnClick := event;
TargetMenu.items[iIndex].Insert(TargetMenu.items[iIndex].Count , Item);
If (Screen.Forms[ix] = Screen.ActiveForm) Then Item.Checked := True; End; End;end;
//선택한 창을 맨 앞으로 보여준다...
procedure TGGMAINF.ReViewForm(Sender:TObject);begin ((Application.FindComponent((Sender as Tmenuitem).name)) as TForm).BringToFront ;end;
FindComponent In DELPHI
TMenuItem(FindComponent('mnu' + geMnmngt.sMenuid[ii])).Visible := True;
내가 메뉴를 잡아 돌릴 때 사용하는 문장인다...
'mnu'로 시작하는 메뉴 이름을 일괄적으로 Visible을 True로 바꿔준다...
즉 어떤 조건으로 Table을 읽어서 읽어오는 메뉴 이름만 보여주는 것이다...
그럼 어떤 조건 즉 사용자의 권한에 의해서 메뉴를 보여주고 안 보여주고 할 수 있다...
Quick Report에서 TQRChart 사용하기 In DELPHI
이거 찾느냐고 고생했다...
아는데 안 가르쳐 주는 것인지... 모르는 것인지...
우선 TQRChrt Component를 사용하기 위해서는 dcltqr70.bpl을 찾아야 한다...
C:\Program Files\Borland\Delphi7\Bin <- 여기에 가면 있다... 머 피씨마다 틀릴 수는 있지만...
암튼 찾았으면 Component에서 추가해 주면 된다...
없는 경우가 있는지는 모르겠지만... 없으면 머 복사해서 쓰면 되겠지... 다른 피씨에서...
역시 알고나면 별거 아니다...
Graph 만들기 In DELPHI
기본적으로 이렇게만 해주면 그래프를 그릴 수 있다...
물론 TChart나 TQRChart를 폼에 붙여놓은 다음의 얘기지만...
여기서 Series1 이라는 것은 TChart나 TQRChart의 속성에 들어가서 만든 하나의 Chart를 말한다...
Value는 그래프의 크기를 말하고 Label은 그래프 하나의 타이틀을 말한다...
속성에 들어가기 위해서는 폼에 붙여 놓은 Chart를 더블클릭 해주면 된다...
안에 들어가면 속성이 무지하게 많다...
첨에 이거 찾느냐고 고생 무지하게 했다...
알면서 말을 안해주는 것인지 아는 사람이 없더라... 쩝...
델파이 예제를 보면서 찾았다...
Enter 입력시 Tab효과 주기 In DELPHI
KeyDown 이벤트에서 이렇게 Coding을 해주면 Tab을 누른 것과 같은 효과가 난다...
AdvStringGrid Set Color In DELPHI
8번째 Column에 Color를 준다...
If ARow Mod 2 = 0 Then ABrush.Color := $00E4E4E4;
짝수 Row에 Color를 준다...
물론 AdvStringGrid의 Properties 중에서 GetCellColor 속성에 Coding을 해줘야 한다...
AdvStringGrid Column Sort In DELPHI
If ACol = 7 Then HAlign := TaRightJustify;
AdvStringGrid의 Properties중에서 GetAlignment에 이렇게 Coding을 해주면 된다...
그럼 0, 1, 2, 3번째 Column은 가운데 정렬이 되고 7번째 Column은 오른쪽 정렬이 된다...
물론 왼쪽 정렬은 기본이니 써 줄 필요가 없다...
나머지는 왼쪽으로 정렬이 될테니...
Input Only Number In DELPHI
KeyPress Event에 코딩을 해주면 된다...
입력된 Key값이 숫자가 아니면 아무 것도 입력이 안된 것으로 만들어 되돌려 보낸다...
String Cut In PRO-C
Ex) strncpy(sGyeyul, sProdcode + 0, 2);
이러면 sProdcode란 변수의 첫번째 부터 두자리를 sGyeyul이라는 변수에 넣어준다...
즉 sProdcode에 '123456789'라는 값이 있었다면... sGyeyul에 '12'가 들어간다...
MDI Screen Print In DELPHI
procedure TGEMAINF.mnuPrintClick(Sender: TObject);var DeskTopDC: HDc; DeskTopCanvas: TCanvas; BitmapRect: TRect; Bitmap: TBitmap;begin If MDIChildCount = 0 Then Exit;
Try Bitmap := TBitmap.Create; {BMP를 저장할 bitmap 생성}
BitMap.Width := ActiveMDIChild.Width; BitMap.Height := ActiveMDIChild.Height; BitmapRect := Rect(0, 0, ActiveMDIChild.Width, ActiveMDIChild.Height);
DeskTopDC := GetWindowDC(ActiveMDIChild.Handle); DeskTopCanvas := TCanvas.Create; DeskTopCanvas.Handle := DeskTopDC;
Bitmap.Canvas.CopyRect(BitmapRect, DeskTopCanvas, BitmapRect);
Bitmap.SaveToFile('C:\Dev\EXE\images\IMSI.BMP');
ShellExecute(handle, 'open', 'C:\Dev\EXE\images\IMSI.BMP', nil, nil, SW_MAXIMIZE);
Finally ReleaseDC(GetDeskTopWindow, DeskTopDC); DeskTopCanvas.Free; Bitmap.Free; end;end;
AdvStringGrid Column Header Click Sort
Object Inspector -> SortSettings -> Show -> True
그럼 AdvStringGrid에서 Column의 Header를 클릭하면 Grid가 정렬이 된다...
방통위 “구글 불법 찾아라” ‘실명제 거부’ 보복
구글이 운영하는 유튜브가 인터넷 실명제(제한적 본인확인제) 도입을 거부한 것과 관련해, 정부가 구글에 대한 법적 대응을 강구하고 나섰다. 모든 인터넷 사업자에 차별 없이 실명제라는 규제를 적용하려는 한국 정부와, ‘익명성에 기반한 표현의 자유’라는 원칙을 세계 어느 곳이든 유지하려는 세계 최대 인터넷기업 사이의 충돌이 벌어질 조짐을 보이고 있다.
16일 이름을 밝히기를 꺼린 방송통신위원회 관계자는 “(지난 9일 구글의 결정으로) 방통위가 발칵 뒤집혔다”며 “구글을 그대로 둘 수 없으니 징계할 거리를 찾으라는 (윗선의) 지시에 따라 관련팀이 불법성 여부를 연구중”이라고 말했다. 구글은 지난 9일 유튜브에서 ‘한국’ 국적으로 동영상 등을 올리는 기능을 차단하면서 실명제 적용을 사실상 거부한다는 방침을 밝힌 바 있다. 이에 대해 애초 방통위는 “행정조처할 사안이 아니다”라고 미온적인 태도를 보였다가 며칠 만에 확 돌아서게됐다. 구글의 방침은 사실상 규제 회피인데, 규제당국인 방통위가 손 놓고 있을 형편이 아니라고 판단한 것으로 보인다.
황철증 방통위 네트워크정책관도 “구글이 국내에서 하는 여러 서비스들에서 위법사항이 없는지 살펴볼 것”이라고 말했다. 구글코리아는 국내에서 유튜브 외에도 검색·키워드광고 등 여러 사업을 하고 있어, 음란물이나 불건전 광고, 저작권 분야 등에서 위법성이 드러날 수 있다.
앞서 최시중 방송통신위원장은 15일 국회 문화체육관광방송통신위원회에서 구글에 강한 불만을 표시했다. 최 위원장은 “(구글의 조처로) 한국이 인터넷 후진국이고 인터넷 검열을 강화하는 것처럼 말하는데 왜 수수방관하느냐”는 나경원 한나라당 의원의 질의에 “너무 상업적인 눈가리고 아웅 식의 구글 쪽 태도에 대해 심히 유감을 표명할 것”이라며 “구글코리아 대표자를 만나 진의가 무엇인지와 법률적 검토를 하고 있다”고 답변했다.
한편, 구글코리아 이원진 대표는 16일 <문화방송> ‘손석희의 시선집중’에 출연해 “(업로드 기능 차단의) 진의는 없고 보이는 게 전부다”라며 “본사와 협의 끝에 내린 어려운 결정으로, 한국 시장을 중시해 장기적으로 보고 내린 결정이었다”고 밝혔다. 구글 본사 차원에서 내린 결정인 만큼 한국 정부의 입김에 좌우될 성질이 아니라는 것이다. 이 대표는 “우리가 이 규제를 받아들이지 않고 표현의 자유를 열어줄 계기를 만들면 국내 인터넷 문화가 더 활성화될 수 있다”고 덧붙였다.
하지만 정부 정책에 정면으로 반기를 드는 업체를 놔두고 국내 업체들에만 규제를 강요할 경우 ‘역차별 문제’가 생겨난다. 한 포털업체 임원은 “구글의 결정을 보고 부러운 한편 참담했다”며 “국내 사업자들은 원치 않는 규제를 따르면서 이용자들로부터는 비난을 받아야 하는 형편”이라고 말했다. 한창민 인터넷기업협회 사무국장은 “국내에서 접속 가능한 외국 사이트에 대해 모두 본인확인제를 적용하거나, 아니면 국내 사업자들도 이를 따르지 않을 수 있도록 해야 공평하지 않으냐”고 업계의 불만을 전했다.
인터넷 규제를 둘러싼 정부와 구글의 충돌은, ‘네트워크의 네트워크’인 인터넷에서는 지리적 영역에서 규제를 적용해도 실효가 적다는 특성을 보여준다. 하지만 정부로서는 구글과 같은 경우를 방치하고는 인터넷정책 운용이 불가능하다는 어려움이 있다. 인터넷 컨설팅회사 ‘검색엔진마스터’의 전병국 대표는 “정부와 구글이 서로 합의점이 없는 상황에 직면했다”며 “구글이 한국 시장에 큰 매력을 느끼지 못하는 상태에서 정부가 채찍만을 써서 얻을 게 있는지 의문”이라고 말했다. 구본권 기자 starry9@hani.co.kr
부디 굴복하지 말기를...
Oracle 시간 더하기
SELECT SYSDATE + 1 FROM DUAL
2. 시간더하기
SELECT SYSDATE + 1/24 FROM DUAL
3. 분더하기
SELECT SYSDATE + 1/(24*60) FROM DUAL
4. 초더하기
SELECT SYSDATE + 1/(24*60*60) FROM DUAL
Oracle 테이블 검색에 관하여 유용한 것
select * from USER_TABLES where table_name = 'TAB_TRH34';
※ 테이블 인덱스, 뷰같은거 모두 검색됨
select * from user_catalog
※ 컬럼검색
select * from COLS where TABLE_NAME = 'TAB_TRH23'
※ 뷰검색
SELECT * FROM USER_VIEWS
※ 시너임(동의어)
SELECT * FROM USER_SYNONYMS
※ 시퀀스
SELECT * FROM USER_SEQUENCES
※ 테이블 : USER_TABLES (TABS) 테이블에 대한 정보
※ 열 : USER_TAB_COLUMNS (COLS) 컬럼에 대한 정보
※ 뷰 : USER_VIEWS 뷰에 대한 정보
※ 동의어 : USER_SYNONYMS (SYN)
※ 시퀀스 : USER_SEQUENCES (SEQ)
※ 제약조건 : USER_CONSTARINTS
※ 제약조건열 : USER_CONS_COLUMNS ( 제약 조건을 가진 열에 대한 정보)
※ 제약조건의 예외사항 : EXCEPTIONS 제약조건을 활성화시 에러사항에 대한 정보
※ 테이블 주석 : USER_TAB_COMMENTS 테이블/뷰에 대한 주석
※ 열 주석 : USER_COL_COMMENTS ( 열에 대한 주석)
※ 인덱스 : USER_INDEXES (IND) ( 인덱스에 관한 정보)
※ 인덱스 열 : USER_IND_COLUMNS 인덱스열에 대한 정보
※ 클러스터 : USER_CLUSTERS (CLU) 클러스터와 관련된 정보
※ 데이터베이스 링크 : USER_DB_LINKS 링크에 관련된 정보
※ 스냅샷 : USER_SNAPSHOTS
※ 스냅샷 로그 : USER_SNAPSHOT_LOGS
※ 트리거 : USER_TRIGGERS
※ 프로시저, 함수 및 패키지 : USER_SOURCE
※ 코드 오류 : USER_ERRORS
※ 테이블스페이스 : USER_TABLESPACES
※ 영역 할당량 : USER_TS_QUOTAS 테이블스레이스 단위로 사용자가 이용할 수 있는 영역의 최대크기와 할당된 영역의 크기 파악에 대한 정보
※ 세그먼트와 익스텐트 : USER_SEGMENTS 와 USER_EXTENTS
※ 여유 영역 : USER_FREE_SPACE 현재 여유로 표시된 영역이 얼마인지에 대한 정보
※ 사용자 : USER_USERS
※ 자원 제한량 : USER_RESOURCE_LIMITS
※ 테이블 권한 : USER_TAB_PRIVS
※ 열 권한 : USER_COL_PRIVS
※ 시스템 권한 : USER_SYS_PRIVS
Oracle Comments 확인하기
SELECT *FROM ALL_COL_COMMENTSWHERE TABLE_NAME = Table_Name;
-- 테이블의 커멘트 확인하기...
SELECT *FROM ALL_TAB_COMMENTSWHERE TABLE_TYPE = 'TABLE'AND TABLE_NAME = Table_Name;
Oracle LPAD
정말 쉬운건 없다...
너무 단순하게만 생각을 하면 안되는거 같다...
어제 입력받은 값에 따라서 정렬을 다르게 해줘야 하는 일이 생겼다...
그래서 무심코... 걍 늘~ 하던대로 DECODE 문장을 날렸다...
이렇게...
ORDER BY DECODE(:Indata, 'L30', TST_CD, TO_NUMBER(DIS_SEQ))
착각이다.
'TST_CD' 이 값이 문자이기 때문에 TO_NUMBER가 먹질 않는다는 것이다...
그래서 나온 방법이 바로 LPAD Function이다.
머 우선 기본적인 설명은 원하는 만큼 왼쪽으로 원하는 문자를 채워준다는 것이다.
즉...
LPAD(DIS_SEQ, 10, '0')
이 것은 왼쪽으로 문자 '0'을 10자리 맞춰서 채우라는 것이다.
만일 'DIS_SEQ'의 값이 '12345' 이라면 결과는 '0000012345' 이렇게 된다는 것이다.
Oracle ROLLUP
암튼. 사용 방법은 의외로 간단하다.
예를 들면.
품명 일자 수량
A 20060523 10
A 20060524 20
B 20060522 10
B 20060523 30
B 20060524 40
이런 데이터가 있을때 간혹... 아니 자주 중간 소계와 전체합계를 보고 싶다는 요청을 받을 것이다...
그때... ROLLUP을 사용하면 된다...
그럼 아주 이쁘게 소계와 전체합계가 나올 것이다...
Syntax is...
SELECT Column1, Column2, Column3, ...
FROM TableName
WHERE Condition
GROUP BY ROLLUP (Column1, Column2, Column3, ...)
SELECT 품명컬럼, 일자컬럼, SUM(수량컬럼)FROM 테이블명
WHERE 해당조회조건
GROUP BY ROLLUP(품명컬럼, 일자컬럼)
이렇게 하면 아래와 같은 결과가 나온다.
품명 일자 수량
A 20060523 10
A 20060524 20
A ________ 30
B 20060522 10
B 20060523 30
B 20060524 40
B ________ 80
_________ 110
단. 여기서도 맹점은 있다.
이 ROLLUP이라는 함수가 소계와 합계를 만들어 주기는 하지만 데이터를 다 보여주는 것이 아니다.
즉 위의 쿼리문의 GROUP BY ROLLUP(품명컬럼, 일자컬럼)을 GROUP BY ROLLUP(품명컬럼) 이렇게만 작성하면 우리가 원하는 데이터는 볼 수가 없고... 아래와 같이 소계와 합계만 보인다.
품명 수량
A ___ 30
B ___ 80
____ 110
그렇기에 좀 더 신중하게 데이터를 보고 작성을 해야만 한다.
Oracle CHAR와 VARCHAR2를 잘 사용하는 법
CHAR(5) 에 'A'를 입력할 경우 DB내부에서는 5 SPACE를 차지한다.(5자리모두설정)VARCHAR2(5) 에 'A'를 입력할 경우 DB내부에서는 1 SPACE를 차지한다.(최대5자저장가능)
많은 사람들이 유연성과 효율성때문에 VARCHAR2를 사용하고 있고,개발상 또는 관리상의편의를 위해 DATE형으로 입력할 DATA도 많이 VARCHAR2를 사용한다.하지만 저장공간의 효율성이 있는 만큼 단점도 있다.
CHAR는 모든 자리수를 꽉 채우는 것을 원칙으로 하기 때문에 DBMS에 추가적인 LOGIC의 발생이없다.하지만 VARCHAR2는 전체자리수중 실제 사용된 것만 채워주고 나머지는 다른 DATA에 양보하므로 내부적으로 추가적인 LOGIC이 발생한다.
VARCHAR2의 갯수가 많으면 많을 수록 계산의 양도 많아진다.특히 VARCHAR2를 사용한 칼럼이INDEX COLUMN이거나 KEY(PRIMARY OR FOREIGN KEY) COLUMN이라면 더욱 그렇다.
따라서,KEY값들은 CHAR로 잡고 변동이 많은 COLUMN은 VARCHAR2로 잡아주는 것이 바람직하다.
CHAR를 KEY값으로 사용할 때는 주의할 점이 있다.SQL문을 직접 사용하면 잘 나타나지 않지만 개발TOOL을 사용할 경우 KEY COLUMN을 꽉 채워주지 않으면 JOIN을 생성못하는 경우가 있다.A TABLE : A CHAR(3) PRIMARY KEYB TABLE : A CHAR(3) PRIMARY KEY
A.A에 '1'을 입력하고 B.A에 '1'을 입력하여 두 테이블에 RELATION을 걸면 조회되지 않는다.(디벨로퍼2000의 경우)남아있는 SPACE때문에 발생하는 일이므로 KEY COLUMN을 CHAR로 잡아줄때는 반드시 꽉 채워준다. 관리상으로도 훨씬 수월해진다.예)LPAD(A.A,3,'0')->'001'LPAD(B.A,3,'0')->'001'
Oracle Synonym
1. 개념- 동의어(Synonym)은 Table, View, SnapShot, Sequence, Procedure, Function, Package에 대한 별칭이다.- 공용 및 전용 동의어의 두가지 종류가 있다. 공용동의어는 Public이라는 특정사용자 그룹에서 소유하며 DB의 모든 사용자가 사용할수 있다. 전용동의어는 다른 사용자에 대해 전용동의어의 가용성을 제어할수 있는 특정 사용자의 스키마에 들어있다.- 만약 Synonym이 전용이라면 생성과 삭제시 Public이라는 Option을 안쓰면 된다.
2. 생성- 예를들어 scott의 Schema에 포함된 Emp Table에 대해 puiblic_emp라는 공용 Synonym생성 : Create public synonym public_emp for scott.emp;- 이상과 같이 공용으로 생성하면 Oracle의 다른 사용자는 public_emp라는 별칭을 사용하여 Query 할수 있다.- tiger라는 User는 public_emp라는 별칭을 사용하여 다음과 같이 Query 할수 있다. Ex> select * from public_emp;
3. 삭제- drop public synonym public_emp
Oracle Hint INDEX
SQL 문장을 만들어 놓고 실행계획을 보면 내가 의도하지 않는 경우가 나올 때가 있다. 분명히 IDX2를 타야 하는데 이 넘의 옵티마이저가 무신 생각인지 IDX1을 타는 것이다. 그럼 너무 곤란한 경우가 생긴다. 즉 모래시계가 너무나 오래 떠 있어서 개발자를 무안하게 하는 것이다.
그런 경우에 INDEX Hint를 사용하면 된다.
SELECT /*+ INDEX (A GEPROTMT_IDX2) */
...
...
...
FROM GEPROTMT A, GEPRODMT B
WHERE
...
...
...
이렇게 사용하면 GEPROTMT란 테이블은 항상 IDX2를 타게 되는 것이다.
물론 데이터가 더 많아지면 어떻게 바귈지 모르기 때문에 향후에는 지금 옵티마이저가 생각한 대로 IDX1을 타야할 지도 모른다.
자주 사용하는 ORACLE HINT
RULE : RULE BASE 옵티마이저를 사용.
FISRT_ROWS : 첫째 레코드의 추출시간을 최소화 할 목적으로 최적화.
ALL_ROWS : 모든 레코드를 처리하는 시간의 최소화를 목적으로 최적화.
FULL : 지정된 테이블에 대한 전체 스캔.
ROWID : 지정된 테이블에 대한 ROWID에 의한 테이블 스캔.
CLUSTER : 지정된 테이블에 애한 클러스터 스캔.
HASH : 지정된 테이블에 대한 해쉬 스캔.
INDEX_ASC : 내림차순(순차적)으로 INDEX를 스캔.
INDEX_DESC : 오름차순(역순)으로 INDEX 스캔.
AND_EQUALS : 여러개의 INDEX를 MERGE하여 사용(2~5개).
ORDERED : FROM절에 기술된 테이블 순으로 조인.
USE_NL : 먼저 특정 테이블의 ROW를 엑세스하고 그 값에 해당하는 다른 테이블의 ROW를 찾는 작업을 해당범위가지 실행하는 조인.
USER_MERGE : 먼저 각각의 테이블의 처리범위를 스캔하여 SORT한 후 서로 MERGE하면서 조인하는 방식.
PARALLEL : 병렬처리 프로세스의 개수를 지정.
CACHE : 테이블의 ROW들을 메모리내에 상주.
NOCACHE : 메모리내에 상주(Cache)시킨 옵션의 해제.
MERGE-AJ : 부정형의 조인(Anti-Join)을 소트머지 방식으로 수행.
HASH-AJ : 부정형의 조인을 해쉬조인(Hash-Join) 방식으로 수행.
사용예제.
SELECT /*+ ORDERED */ FROM ORDER1T A, ORDER2T B WHERE ...
이러면 옵티마이저가 스스로 판단하여 테이블 플랜을 만드는 것이 아니라 FROM절에 기술한 순서대로 플랜을 만든다.
이런 식으로 사용을 합니다.
Table Join시 간단하지만 조심하자
어의가 없는 것이었다. 이젠 그런 과오를 범하지 말아야지.
단순한 것이다. 어쩜 누구나 알고 있는...
세개의 테이블을 조인하는데 A와 B는 마스터와 상세내역이고 나머지는 머 출고라고 하자. 물론 A, B는 마스터 상세내역으로 키가 연결이 되어있다. 즉 문제가 없다. 다만 마지막 출고테이블을 조인할 경우에 조인하는 필드가 세개라고 한다면 그 세개를 모두 한 테이블에서 가져오는 것이 속도에서 엄청난 차이를 보인다는 것이다.
즉...
SELECT A.REQNO, B.PRODCODE, C.OUTQTY
FROM GEREQMT A, GEREQDT B, GEPROTMT C
WHERE B.REQNO = A.REQNO
AND C.REQNO = B.REQNO
AND C.PRODCODE = B.PRODCODE
이렇게 해야 한다는 것이다.
만일 아래와 같이 한다면...
SELECT A.REQNO, B.PRODCODE, C.OUTQTY
FROM GEREQMT A, GEREQDT B, GEPROTMT C
WHERE B.REQNO = A.REQNO
AND C.REQNO = A.REQNO
AND C.PRODCODE = B.PRODCODE
인내심을 길러야 할 거 같다.
Oracle IN과 EXISTS의 차이점
내가 봤을땐 같을 거 같은데...
근데 지금 생각을 해봐도 같은 거 같다...
먼저 IN()은 괄호안에 있는 모든 내용을 읽어서 있는 건수를 다 찾는다...
즉 처방을 받은 환자를 찾으라면 괄호안에 모든 데이터를 다 뒤져서 10건이 있으면 10건을 모두 찾는다...
반면 EXISTS()는 찾다가 하나를 찾으면 바로 TRUE를 리턴하고 더이상 찾는 것을 그만둔다...
물론 못 찾으면 FALSE를 넘겨준다...
맞나?...
나두 설명을 이렇게 밖에는 못 들어서...
Oracle TABLE과 COLUMN에 주석 붙여주기
COMMENT ON COLUMN GEABANMT.LOCATE IS '사업장' <- COLUMN 주석...
이렇게 해주면 된다...
Oracle EXISTS
SELECT A.REQNO
FROM GEREQEDT A
WHERE EXISTS ( SELECT REQNO FROM GEREQEMT B WHERE B.REQNO = A.REQNO )
위의 내용은 B 테이블과 A 테이블의 청구번호를 체크해서 있는 A 테이블의 청구번호가 B 테이블에 전재하는 청구번호만 보여주는 것이다...
Oracle NVL
사용법으로는...
NVL(INPRICE, 0)
INPRICE의 값이 정상이 아니면 '0'을 넘겨준다는 것입니다...
SELECT NVL(INPRICE, 0) FROM GEORDINT <- 이렇게 사용할 수 있습니다...
Oracle Table Column Modify
ALTER TABLE Table_Name ADD ( Column_Name Type(Size), ... )
Ex) ALTER TABLE GENOMATT ADD ( PRODCODE VARCHAR2(10), MODDATE DATE )
이렇게 하면 GENOMATT란 TABLE에 PRODCODE란 COLUMN이 10자리 문자형 그리고 MODDATE란 DATE형의 COLUMN이 추가된다.
2. Modify Column In Table
ALTER TABLE Table_Name MODIFY ( Column_Name Type(Size), ... )
Ex) ALTER TABLE GENOMATT MODIFY ( PRODCODE VARCHAR2(10) )
이렇게 하면 GENOMATT란 TABLE에 PRODCODE란 COLUMN이 10자리 문자형으로 사이즈가 바뀐다...
그런데 이 때 주의할 것은...
기존의 데이터 형보다 작으면 안된다는 것이다...
기존 데이터가 잘리면 안되니까...
3. Drop Column In Table
ALTER TABLE Table_Name DROP COLUMN Column_Name
Ex) ALTER TABLE GEABANMT DROP COLUMN REQDEPT
이렇게 하면 GEABANMT란 Table의 REQDEPT란 Column을 삭제해 준다...
Oracle LAST_DAY
SQL 문장에서 필드에 직접적으로 Column에 SUBSTR 함수 등 액션을 가하면 안된단다...
그럼 속도가 늦어 진단다...
위의 것은 지난 달의 마지막 날을 보여준다...
Oracle ADD_MONTHS
오라클을 첨 접하면서 배운 오라클 함수다...
지난 달의 날짜를 보여준다...
위의 것은 3개월 전의 오늘을 보여준다...
DUAL은 임시 테이블 이란다...
SK Broadband의 치밀함???
첨에 그러니까 1월 사용분 16,000원과 2월 사용분 6,500원의 영수증을 보고 정말 좋아 입 찢어졌다.
물론 너무 싸서 이상하다는 생각이 들긴 했지만 그래도 싸서 좋았다. 기존 KT할인 포기하고 오길 잘했다 생각했다.
그런데 실상은 이랬다.
1월 사용분은 실제 사용이 보름정도밖에 안돼서 싼거 였고. 2월 사용분은 3개월 면제 중 한달 이었다.
기업의 치밀함을 알았다. 첫달은 누구나 1일부터 사용을 안하기에 적게 나오기에 무료가 아니고 두번째 달은 안심시키기 위해 무료로 정한거 같다.
이번 달 제대로 나오니... 카드할인 받아야 KT에서 내던 것과 비슷하다. 쩝.
암튼 그리 손해는 아니나 위약금 물면서 이동할 것은 아닌거 같다.