AutoCAD P&ID 2012와 2013에서 확인하였으나 동일한 오류를 발생함

 

동영상을 보면 쉽게 이해가 가실 겁니다. 불특정 영역에서 발생되는 문제입니다.

 

------------------------------------------------------------------

2012년 12월 14일 해결 방법 추가

 

오류나는 라인 부분의 기존 라인을 보면 좌표 Z들이 들어가 있습니다. 일반적으로 P&ID는 2D 이기 때문에 보이기에는 정상적이나 실제론 Z  좌표가 0이 되야 정상인데, 유추 해보건데 취득한 도면이 기존에 다른 기준좌표를 가지고 있는 것들을 계속해서 Insert 하여 서로 좌표가 상이 한것 같습니다. 일단 잡설은 그만하고 해결 방법입니다.

 

해당 도면을 Open 한후

  • LTSCALE 조절 (1로 설정)
  • 기존 Line의 Z관련 값 0으로 조절

---------------

Open Error Drwaing File

---------------

  and

---------------

Command: LTSCALE
Command: Enter new linetype scale factor <3.0000>: 1

---------------

  and

---------------

Error Line Geometry > [Start Z] and [End Z] : 0

Use [Properties] Dialog (Line Object Selected [Ctrl+1])

---------------

 

여기서 제일 중요한것은 Z값 설정인것 같습니다.

 

 

본 해결책을 알려 주신 투아이티씨 솔루션(http://www.cimage.co.kr)와 이하 관계자 여러분께 감사의 인사를 전합니다.

AutoCAD P&ID 작성시 어떤 이유 때문인지 정확하지 않으나…

(저희 같은 경우 AutoCAD P&ID 비정상 종료(뜅김)로 인한 오류로 판단됨)

기존에 Tag가 존재하지 않는데 아래 캡쳐 화면처럼 Dialog Message Box처럼 오류 발생시 해결 방법

 

"Another asset in the project has the same tag which has not been saved. Cannot merge with that tag. Please enter a unique tag."

 

 

일단 해당 프로젝트의 P&ID관련 Database 직접 수정

  • SQLite : ProcessPower.dcf
  • SQL Server : 지정한 Database (이건 대부분 Admin 또는 관리자(DBA)가 생성하므로 해당 업무 담당자에게 문의 / Project Propertty에서 확인 가능)

많은 테이블 중 “PnPTagRegistry”에서 해당 컬럼(필드) 중 “Tag” 에 입력할려고 하는 Tag를 찾아 해당 Record 삭제 후 저장(commit) 후 AutoCAD P&ID에서 해당 Tag입력…

 

상기 방법은 잘못된 사용으로 인한 치명적인 오류를 내포하고 있으므로 Database의 지식이 있는 분에게 요청하시는게 좋을 듯합니다.

본인은 모든 상기 방법에 따른 오류에 대한 책임이 없음을 거듭 언급 드립니다.

별출처 : MSDN(http://msdn.microsoft.com/ko-kr/library/bb397679.aspx)

 

 

<?XML:NAMESPACE PREFIX = [default] http://www.w3.org/1999/xhtml NS = "http://www.w3.org/1999/xhtml" />이러한 변환은 예를 들어 명령줄 인수에서 숫자 입력을 가져올 때 유용할 수 있습니다. 비슷한 메서드로 문자열을 float 또는 long 등의 다른 숫자 형식으로 변환할 수도 있습니다. 다음 표에서는 이러한 메서드를 보여 줍니다.

숫자 형식

방법

decimal

ToDecimal(String)

float

ToSingle(String)

double

ToDouble(String)

short

ToInt16(String)

int

ToInt32(String)

long

ToInt64(String)

ushort

ToUInt16(String)

uint

ToUInt32(String)

ulong

ToUInt64(String)

예제

 


이 예제에서는 ToInt32(String) 메서드를 호출하여 입력 stringint로 변환합니다. 프로그램이이 메서드에 의해 throw 될 수 있는 두 개의 가장 일반적인 예외를 catch 합니다. FormatExceptionOverflowException. 정수 저장소 위치를 오버플로하지 않고 숫자를 증가시킬 수 있는 경우 프로그램에서 결과에 1을 더하여 출력을 인쇄합니다.

C#

static void Main(string[] args)
{
    int numVal = -1;
    bool repeat = true;

    while (repeat == true)
    {
        Console.WriteLine("Enter a number between −2,147,483,648 and +2,147,483,647 (inclusive).");

        string input = Console.ReadLine();

        // ToInt32 can throw FormatException or OverflowException.
        try
        {
            numVal = Convert.ToInt32(input);
        }
        catch (FormatException e)
        {
            Console.WriteLine("Input string is not a sequence of digits.");
        }
        catch (OverflowException e)
        {
            Console.WriteLine("The number cannot fit in an Int32.");
        }
        finally
        {
            if (numVal < Int32.MaxValue)
            {
                Console.WriteLine("The new value is {0}", numVal + 1);
            }
            else
            {
                Console.WriteLine("numVal cannot be incremented beyond its current value");
            }
        }
        Console.WriteLine("Go again? Y/N");
        string go = Console.ReadLine();
        if (go == "Y" || go == "y")
        {
            repeat = true;
        }
        else
        {
            repeat = false;
        }
    }
    // Keep the console open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();    
}
// Sample Output:
// Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive).
// 473
// The new value is 474
// Go again? Y/N
// y
// Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive).
// 2147483647
// numVal cannot be incremented beyond its current value
// Go again? Y/N
// Y
// Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive).
// -1000
// The new value is -999
// Go again? Y/N
// n
// Press any key to exit.

string 을 int로 변환하는 또 다른 방법은 System.Int32 구조체의 Parse 또는 TryParse 메서드를 사용하는 것입니다. ToUInt32 메서드는 Parse를 내부적으로 사용합니다. 문자열이 올바른 형식이 아닌 경우 Parse는 예외를 throw하는 반면, TryParse는 예외를 throw하지 않고false를 반환합니다. 다음 예제에서는 ParseTryParse에 대한 호출이 성공하는 경우와 실패하는 경우를 모두 보여 줍니다.

C#

int numVal = Int32.Parse("-105");
Console.WriteLine(numVal);
// Output: -105

C#

// TryParse returns true if the conversion succeeded
// and stores the result in the specified variable.
int j;
bool result = Int32.TryParse("-105", out j);
if (true == result)
    Console.WriteLine(j);
else
    Console.WriteLine("String could not be parsed.");
// Output: -105

C#

try
{
    int m = Int32.Parse("abc");
}
catch (FormatException e)
{
    Console.WriteLine(e.Message);
}
// Output: Input string was not in a correct format.

C#

string inputString = "abc";
int numValue;
bool parsed = Int32.TryParse(inputString, out numValue);

if (!parsed)
    Console.WriteLine("Int32.TryParse could not parse '{0}' to an int.\n", inputString);

// Output: Int32.TryParse could not parse 'abc' to an int.

별Link : How to Integrate Excel in a Windows Form Application using the WebBrowser

 

 

Sample Image - Embedding_Excel.jpg

Introduction

With Automation, you are able to drive any Office application from your .NET application. This is really powerful. It may happen that one time, you would like to integrate such an application (Excel, for example) in your own application, and handle it like a control. A first approach has already been published on The Code Project (see the Background section in this article). The other method I will describe here uses the Microsoft WebBrowser control as a host for the document.

Background

You can study Anup Shinde's article. His method works fine. Instead of the WebBrowser control, it is based on Windows Win32 API.

If you are interested in the original publication of the WebBrowser method, you can see the Microsoft KB.

Starting from scratch

Create a new form MyForm, and add a new WebBrowser control, named webBrowser1. Add the m_ExcelFileNamefield :

Collapse | Copy Code

// Contains the path to the workbook file
private string m_ExcelFileName="test.xls"; // Replace here with an existing file

Then create a function OpenFile like this :

Collapse | Copy Code

public void OpenFile(string filename) 
{
    // Check the file exists
    if(!System.IO.File.Exists(filename)) throw new Exception();
        m_ExcelFileName=filename;
    // Load the workbook in the WebBrowser control
    this.webBrowser1.Navigate(filename,false);
}

You can try and run your application, giving the filename an existing excel file path. You'll see that it works perfectly. Really easy, don't you think?

In fact, you will quickly get into trouble if you try to run the application a second time with the same Excel file. An error message tells you that your file is already in use. This may be strange because you think that you closed your application, and you did. So where is the problem?

Let's see what happened in the background. While the WebBrowser was navigating, it opened an invisible Excel application, and loaded the workbook inside it. And when you closed your application, the WebBrowser didn't close either its Excel application or the workbook. So we must do it, and this is the most difficult part of our job.

Solving the problem step by step

Before further reading, you have to load the following Office COM library references for Office Automation :

  • Microsoft Excel 11.0 Object Library
  • Microsoft Office 11.0 Object Library

and use them in your file :

Collapse | Copy Code

using Microsoft.Office.Core;
using Microsoft.Office.Interop.Excel;

You'll need these assemblies too :

Collapse | Copy Code

using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.InteropServices.ComTypes;

Declare these two Excel fields :

Collapse | Copy Code

// Contains a reference to the hosting application
private Microsoft.Office.Interop.Excel.Application m_XlApplication=null;
// Contains a reference to the active workbook
private Workbook m_Workbook=null;

Before trying to close the workbook, we need a handle on it. For convenience, the best moment to do this is just after the document has been loaded in the WebBrowser. So we have to generate a webBrowser1_Navigated event handler and its matching function, like this :

Collapse | Copy Code

private void webBrowser1_Navigated(object sender,WebBrowserNavigatedEventArgs e) 
{
    // Creation of the workbook object
    if((m_Workbook=RetrieveWorkbook(m_ExcelFileName))==null)return;
    // Create the Excel.Application
    m_XlApplication=(Microsoft.Office.Interop.Excel.Application)m_Workbook.Application;
}

Then we define the RetrieveWorkbook function. It is based on two imported Win32 API functions, that retrieve all the programs that are running on our computer. Our job is to search among them the one that is working with the workbook that names xlfile. The code is like this :

Collapse | Copy Code

[DllImport("ole32.dll")] static extern int GetRunningObjectTable
                (uint reserved,out IRunningObjectTable pprot);
[DllImport("ole32.dll")] static extern int CreateBindCtx(uint reserved,out IBindCtx pctx);

public Workbook RetrieveWorkbook(string xlfile) 
{
        IRunningObjectTable prot=null;
        IEnumMoniker pmonkenum=null;
        try 
        {
            IntPtr pfetched=IntPtr.Zero;
            // Query the running object table (ROT)
            if(GetRunningObjectTable(0,out prot)!=0||prot==null) return null;
            prot.EnumRunning(out pmonkenum); pmonkenum.Reset();
            IMoniker[] monikers=new IMoniker[1];
            while(pmonkenum.Next(1,monikers,pfetched)==0) 
            {
                IBindCtx pctx; string filepathname;
                CreateBindCtx(0,out pctx);
                 // Get the name of the file
                 monikers[0].GetDisplayName(pctx,null,out filepathname);
                 // Clean up
                 Marshal.ReleaseComObject(pctx);
                 // Search for the workbook
                 if(filepathname.IndexOf(xlfile)!=-1) 
                 {
                     object roval;
                     // Get a handle on the workbook
                     prot.GetObject(monikers[0],out roval);
                     return roval as Workbook;
                 }
              }
         } 
         catch 
         {
             return null;
         } 
         finally 
         {
             // Clean up
             if(prot!=null) Marshal.ReleaseComObject(prot);
             if(pmonkenum!=null) Marshal.ReleaseComObject(pmonkenum);
         }
         return null;
}

Now we can write the code involved to close the background Excel application, while overriding the OnClose() event :

Collapse | Copy Code

protected override void OnClosed(object sender, EventArgs e) 
{
    try 
    {
        // Quit Excel and clean up.
        if(m_Workbook!=null) 
        {
            m_Workbook.Close(true,Missing.Value,Missing.Value);
            System.Runtime.InteropServices.Marshal.ReleaseComObject
                                    (m_Workbook);
            m_Workbook=null;
        }
        if(m_XlApplication!=null) 
        {
            m_XlApplication.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject
                                (m_XlApplication);
            m_XlApplication=null;
            System.GC.Collect();
        }
    } 
    catch 
    {
        MessageBox.Show("Failed to close the application");
    }
}

Using the code

You can use the code as written upper. Otherwise, it may be interesting to embed all the stuff in a .NET control. You'll be able to manage CommandBars, Menus, etc. inside the control. You will find some code in the downloadable package section.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Temporary Directory

string strTempPath = System.IO.Path.GetTempPath();

 

Temporary FileName

string strTempFileName = System.IO.Path.GetTempFileName();

jQuery EasyUI 사이트 : http://www.jeasyui.com/

 

Grid 때문에 고민하여 Devexpress Grid를 쓰기 위하여 ASP.NET을 활용 검토하였으나, 본 jQuery EasyUI를 보고서 ASP.NET을 활용 안해되 되겠다는 생각이 듭니다.

jQueryUI와 섞어서 쓰면 거의 최강이지 않을까 생각이 듭니다.

 

단, 아쉬운 점(?) 웹에서 Spread Sheet(Excel) 구현은 힘들겠지만…. 이것도 해결 되었으면 ㅎㅎ 욕심이겠죠….^^;;

 

라이블러리 기본은 jQuery와 데이터 연동부분은 JSON을 이용함으로써 훨씬 쉽고 PHP, JSP, ASP, ASP.NET 등 서버사이드 언어와 상관없이 쓸 수 있는 Javascript로만 만들어져서 더 멋진 것 같습니다.

 

라이센스는 jQuery 라이센스 정책을 그대로 승계 받아 GPL(GNU General Public License) 라이센스를 따릅니다.

엄청 강력한 라이센스죠 ^^;; 해당 라이블러리를 사용하였으면 GPL로 배포 하라고 하니…

(여기서 궁금한 점은 대부분 요즘 jQuery를 이용하는데… 그럼 모두 공개???)

GPL 라이센스에 대해 요약해보면,
- 자유 소프트웨어라고 할 때 자유(Free)의 의미는 무료 사용이 아닌 자유로운 사용이다.
- GPL로 프로그램을 배포할 경우 유료/무료 판매에 관계없이 자신이 해당 프로그램에 대해 가질 수 있었던 모든 권리를, 프로그램을 받게 될 사람에게 그대로 양도해야 한다.
- 무보증 : 자유 소프트웨어는 반복적인 재 배포 과정을 통해 소프트웨어 자체에 대해 수정과 변형이 일어날 수도 있으며, 이는 최초의 저작자가 만든 소프트웨어의 문제가 아닐 수도 있다.
- GPL을 따르는 소프트웨어 소스 코드의 일부를 사용해 만든 소프트웨어는 GPL을 따라야 한다.
- GPL을 따르는 소프트웨어 소스 코드를 개인적으로 사용할 수 없다. 반드시 소프트웨어를 개발한 원작자나 공동체에 환원 해야 한다.
소스코드 배포 시
- 저작권 표시
- No Warranty
- GPL로 배포
실행파일 배포 시
- 저작권 표시
- No Warranty
- GPL로 배포
- 소스코드 제공
수정코드 배포 시
- 저작권 표시
- No Warranty
- GPL로 배포
- 소스코드 제공
- 수정 사실 및 일자

출처 : thinksquare

아래는 해당 이미지는 해당 사이트에서 제공하는 라이블러리 스크린샷입니다.

 




첨부파일 : (여기에 첨부해도 되나 ^^;;)

jquery-easyui-1.3.1.zip


오류가 발생된 환경은 아래와 같으며, 아래 환경기준으로 설명하겠습니다.

  • OS : Microsoft Windows 7 Pro. 64bit
  • VisualStudio 2012
  • Team Foundation Server 2012

PC명을 변경하였을시 Team Foundation Server와 VisualStudio 팀프로젝트 이용시 오류가 발생 된다.

 

해당 솔루션을 오픈 시 PC명이 변경되었으니 “tf workspaces /updateComputerName:oldComputerName” 명령을 이용하여 변경하라고 한다.

(이 부분은 벌써 처리한 후라서 기억이 가물가물합니다.)

 

실행창을 열어 “cmd.exe”를 실행합니다.

저 명령대로 “tf workspaces”라고 실행하여 보면 경로를 찾을 수 없다고 나옵니다.

사용자별로 틀리겠지만 “Windows 7 64bit”환경에서는 “C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\” 경로에 tf.exe가 있습니다.

 

그래서 전체 경로를 포함한 명령을 실행하여 현재 Workspace들을 확인합니다.

C:\>"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\tf" workspaces

변경하기 위해서는

C:\>"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\tf" workspaces /updateComputerName:{이전 PC명}

이라고 하면 여기서도 오류를 발생합니다.

/updateComputerName 또는 /updateUserName을 지정할 때에는 /collection 옵션을 지정해야 합니다.

그럼 최종 명령은

"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\tf" workspaces /updateComputerName:JHPARK-NOTE /collection:http://tfs2012.hi-techeng.co.kr:8080/tfs/HITECHENG

C:\>"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\tf" workspaces /updateComputerName:{이전 PC명} /collection:http://{Team Foondation Server URL}:{Port(기본:8080)}/tfs/{팀 프로젝트 컬렉션}

그 이후 이전 PC명으로 된 Workspace를 절대 삭제하지 않는것을 권장합니다.

혹여 삭제를 하였을 경우 새로 솔루션을 소수제어에 추가하고 충돌해결을 해야 하는 번거러운 작업을 경험하게 되실 겁니다.(제가 그랬습니다.)

대략 적으로 설명을 하였는데 이해가 되었는지 모르겠습니다. 저만의 방식과 해결후 정리 개념으로 작성하다보니…

 

기타 참고 문헌 :

(한글) http://msdn.microsoft.com/ko-kr/library/54dkh0y3%28v=vs.100%29   

(영문) http://msdn.microsoft.com/en-us/library/54dkh0y3%28v=vs.100%29.aspx


2012/09/26 - [DBMS] - 순진한 트리(문서) - 재귀쿼리 방법론 에서 언급된 재귀적호출 중 MS-SQL을 이용한 MSDN자료 입니다.





원문 : http://msdn.microsoft.com/ko-kr/library/ms186243(v=sql.105).aspx







CTE(공통 테이블 식)를 사용하면 자기 자신을 참조하는 재귀적 CTE를 만들 수 있으므로 상당히 유용합니다. 재귀적 CTE는 최초 CTE가 반복적으로 실행되어 전체 결과 집합을 얻을 때까지 데이터의 하위 집합을 반환하는 CTE입니다.

재귀적 CTE를 참조하는 쿼리를 재귀 쿼리라고 합니다. 재귀 쿼리의 일반적인 용도는 계층적 데이터를 반환하는 것입니다. 예를 들어 직원을 조직도에 표시하는 경우 또는 부모 제품에 하나 이상의 구성 요소가 있고 이러한 구성 요소가 하위 구성 요소를 가지거나 다른 부모의 구성 요소일 수도 있는 제품 구성 정보(BOM) 시나리오에 데이터를 표시하는 경우가 있습니다.

재귀적 CTE는 SELECT, INSERT, UPDATE, DELETE 또는 CREATE VIEW 문 내에서 재귀 쿼리를 실행하는 데 필요한 코드를 상당히 단순화할 수 있습니다. 이전 버전의 SQL Server에서 재귀 쿼리를 실행하려면 일반적으로 임시 테이블, 커서 및 논리를 사용하여 재귀 단계의 흐름을 제어해야 합니다. 공통 테이블 식에 대한 자세한 내용은 공통 테이블 식 사용을 참조하십시오.

Transact-SQL의 재귀적 CTE 구조는 다른 프로그래밍 언어의 재귀 루틴과 비슷합니다. 다른 언어의 재귀 루틴은 스칼라 값을 반환하지만 재귀적 CTE는 여러 행을 반환할 수 있습니다.

재귀적 CTE는 다음 세 요소로 구성됩니다.

  1. 루틴의 호출

    재귀적 CTE의 첫 번째 호출은 UNION ALL, UNION, EXCEPT 또는 INTERSECT 연산자로 조인된 하나 이상의 CTE_query_definitions로 구성됩니다. 이러한 쿼리 정의는 CTE 구조의 기본 결과 집합을 형성하기 때문에 앵커 멤버라고 합니다.

    CTE_query_definitions는 CTE 자체를 참조하지 않는 경우 앵커 멤버로 간주됩니다. 모든 앵커 멤버 쿼리 정의를 첫 번째 재귀 멤버 정의 앞에 배치하고 UNION ALL 연산자를 사용하여 마지막 앵커 멤버를 첫 번째 재귀 멤버와 조인해야 합니다.

  2. 루틴의 재귀 호출

    재귀 호출에는 CTE 자체를 참조하는 UNION ALL 연산자로 조인된 하나 이상의 CTE_query_definitions가 포함됩니다. 이러한 쿼리 정의를 재귀 멤버라고 합니다.

  3. 종료 확인

    종료 확인은 암시적으로 수행됩니다. 이전 호출에서 반환되는 행이 없을 때 재귀가 중지됩니다.

참고 참고

잘못 구성된 재귀적 CTE로 인해 무한 루프가 발생할 수 있습니다. 예를 들어 재귀 멤버 쿼리 정의가 부모 열과 자식 열 모두에 대해 동일한 값을 반환하면 무한 루프가 생성된 것입니다. 재귀 쿼리의 결과를 테스트할 때 INSERT, UPDATE, DELETE 또는 SELECT 문의 OPTION 절에서 MAXRECURSION 힌트 및 0과 32,767 사이의 값을 사용하여 특정 문에 허용되는 재귀 수준의 수를 제한할 수 있습니다. 자세한 내용은 쿼리 힌트(Transact-SQL)WITH common_table_expression(Transact-SQL)을 참조하십시오.

의사 코드 및 의미 체계

재귀적 CTE 구조에는 앵커 멤버와 재귀 멤버가 적어도 하나씩 포함되어야 합니다. 다음 의사 코드에서는 단일 앵커 멤버와 단일 재귀 멤버가 포함된 간단한 재귀적 CTE의 구성 요소를 보여 줍니다.

WITH cte_name ( column_name [,...n] )

AS

(

CTE_query_definition –- Anchor member is defined.

UNION ALL

CTE_query_definition –- Recursive member is defined referencing cte_name.

)

-- Statement using the CTE

SELECT *

FROM cte_name

재귀 실행의 의미 체계는 다음과 같습니다.

  1. CTE 식을 앵커 멤버와 재귀 멤버로 분할합니다.

  2. 앵커 멤버를 실행하여 첫 번째 호출 또는 기본 결과 집합(T0)을 만듭니다.

  3. Ti는 입력으로 사용하고 Ti+1은 출력으로 사용하여 재귀 멤버를 실행합니다.

  4. 빈 집합이 반환될 때까지 3단계를 반복합니다.

  5. 결과 집합을 반환합니다. 이것은 T0에서 Tn까지의 UNION ALL입니다.

다음 예에서는 Adventure Works Cycles 회사에서 직급이 가장 높은 직원부터 시작되는 계층적 직원 목록을 반환하여 재귀적 CTE 구조의 의미 체계를 보여 줍니다. 이 예 다음에는 코드 실행 연습이 있습니다.

Transact-SQL
-- Create an Employee table.
CREATE TABLE dbo.MyEmployees
(
	EmployeeID smallint NOT NULL,
	FirstName nvarchar(30)  NOT NULL,
	LastName  nvarchar(40) NOT NULL,
	Title nvarchar(50) NOT NULL,
	DeptID smallint NOT NULL,
	ManagerID int NULL,
 CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC) 
);
-- Populate the table with values.
INSERT INTO dbo.MyEmployees VALUES 
 (1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL)
,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)
,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)
,(275, N'Michael', N'Blythe', N'Sales Representative',3,274)
,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274)
,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)
,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)
,(16,  N'David',N'Bradley', N'Marketing Manager', 4, 273)
,(23,  N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);


Transact-SQL
USE AdventureWorks2008R2;
GO
WITH DirectReports (ManagerID, EmployeeID, Title, DeptID, Level)
AS
(
-- Anchor member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID, 
        0 AS Level
    FROM dbo.MyEmployees AS e
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL
    WHERE ManagerID IS NULL
    UNION ALL
-- Recursive member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID,
        Level + 1
    FROM dbo.MyEmployees AS e
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL
    INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID
)
-- Statement that executes the CTE
SELECT ManagerID, EmployeeID, Title, DeptID, Level
FROM DirectReports
INNER JOIN HumanResources.Department AS dp
    ON DirectReports.DeptID = dp.DepartmentID
WHERE dp.GroupName = N'Sales and Marketing' OR Level = 0;
GO


코드 연습 예

  1. 재귀적 CTE인 DirectReports는 앵커 멤버와 재귀 멤버를 하나씩 정의합니다.

  2. 앵커 멤버가 기본 결과 집합 T0을 반환합니다. 이 직원은 회사에서 직급이 가장 높습니다. 즉, 상급 관리자가 없습니다.

    다음은 앵커 멤버에서 반환하는 결과 집합입니다.

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    NULL      1          Chief Executive Officer        0
    
  3. 재귀 멤버는 앵커 멤버 결과 집합에 있는 직원의 직속 하급자를 반환합니다. 이것은 Employee 테이블과 DirectReports CTE 간의 조인 작업을 통해 수행됩니다. 재귀 호출을 설정하는 것은 바로 CTE 자신에 대한 이 참조입니다. 입력(Ti)으로 사용된 CTE DirectReports 의 직원을 기준으로 조인(MyEmployees.ManagerID = DirectReports.EmployeeID)은 (Ti)를 관리자로 둔 직원을 출력(Ti+1)으로 반환합니다. 따라서 재귀 멤버의 첫 번째 반복은 다음 결과 집합을 반환합니다.

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    1         273        Vice President of Sales       1
    
  4. 재귀 멤버가 반복적으로 활성화됩니다. 재귀 멤버의 두 번째 반복에서 3단계의 단일 행 결과 집합(EmployeeID273 포함)이 입력 값으로 사용되어 다음 결과 집합을 반환합니다.

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    273       16         Marketing Manager             2
    273       274        North American Sales Manager  2
    273       285        Pacific Sales Manager         2
    

    재귀 멤버의 세 번째 반복에서 위의 결과 집합이 입력 값으로 사용되어 다음 결과 집합을 반환합니다.

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    16        23         Marketing Specialist          3
    274       275        Sales Representative          3
    274       276        Sales Representative          3
    285       286        Sales Representative          3
    
  5. 실행 중인 쿼리가 반환하는 최종 결과 집합은 앵커 멤버와 재귀 멤버가 생성한 모든 결과 집합의 합집합입니다.

    다음은 이 예에서 반환되는 전체 결과 집합입니다.

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    NULL      1          Chief Executive Officer       0
    1         273        Vice President of Sales       1
    273       16         Marketing Manager             2
    273       274        North American Sales Manager  2
    273       285        Pacific Sales Manager         2
    16        23         Marketing Specialist          3
    274       275        Sales Representative          3
    274       276        Sales Representative          3
    285       286        Sales Representative          3
    


순진한트리(계층쿼리).pdf



참고하기 좋은듯....


MSDN 참고 자료 : 공통 테이블 식을 사용하는 재귀 쿼리 (http://msdn.microsoft.com/ko-kr/library/ms186243(v=sql.90).aspx)



  • Work
    • 요즘 개발일에 몰두 중이다.
      • 개발툴 : Microsoft Visual Studio 2012
      • DBMS : Oracle, Microsoft SQL, SQLite
    • S/W 지원
      • Autodesk AutoCAD P&ID
    • 시스템 도입 / 검토
      • Autodesk AutoCAD P&ID 10ea 추가 구매(총 23ea)
      • Storage/Bacup 검토
      • Mail(MS Exchange) System 이중화 검토
      • 네트워크 환경 1Gpbs 이상 환경 구축 검토
      • 가상화 시스템 검토
    • 회사
      • 요즘 일이 부쩍 줄어든걸 느낀다... 위기는 곧 기회... 현재 일이 좀 적을때 빨리 개발해서 나중에 일 많을 때 써먹야 한다는 나만의 압박 ^^;;
      • 별관 신축중이다. 그런데 거기에 사장님실, 경영지원팀, 영업팀이 이사간다...사장님실과 경영지원팀이 거기로가면 거기가 본관이고...기존 건물이 별관 또는 작업관??? 아닌가 ㅋㅋ
      • 우리도 신축중인 별관으로 이사가고 싶다...여기 우리 사무실만  너무 안좋다... 다른데는 좋은데...하여간 이사시켜주세용~~~
      • 떡값은 얼마나 나올까?
      • 추석연휴에 정기휴가 2일 붙여야 하나??

  • Home
    • 추석 준비 중이다...선물 뭐 사야하지...갯수는?
    • 우리 큰 딸 희원이가 분위기와 목소리좀 낮추었으면 좋겠다.
    • 우리 아들 경환(건우)이가 한글을 깨우쳤으면 좋겠다...곧 초등학생인데...더불어 말 좀 잘들었으면...
    • 우리 막내 지원이 빨리 컸으면 좋겠다 더불어 고집쟁이(막내라서 너무 이뻐했나...^^)
    • 울 마눌... 울 마눌도 늙어가나... 좀 튼튼했으면 한다... 애인은 약하면 좋고... 마눌은 튼튼 ㅋㅋ 마눌 건강이 곧 가족의 평화...
    • 난, ??? 모르겠다...

  • 현재 상태
    • 맨날 야근이다. 새벽 2시에 몇번 들어갔다...
    • 분석이 필요한데 분석할 시간이 없이 바로 개발이 들어가야 한다.
    • 분석이 부족함을 느낀다... 다시 분석하고 재 세팅한다... 설계가 무너지고 있다.
    • 이젠 코딩도 손이 느려져서 점점 늦어지고 머리는 굳고... 체계화된 나만의 Module이 필요하며, 몸빵(야근)만이 살길이다.
    • 나이 들어가는걸 느낀다... 체력적으로...정신적으로...
    • 빨리 운동하나를 시작해야 겠다는걸 느낀다. 그런데 야근하다보니 시간이 없다.
    • 건강이냐...일처리냐...고민에 빠졌다.
    • 울 가족에게 소홀해지는거 같다. 일 바쁘다는 핑계로...울 애들하고 놀아줘야 하는데...여기서도 체력이 문제네...
    • 결론은....체력향상만이 살길...그러면 일은?? 딜레마다.... 그래서 현재 상태는....패닉과 심심허약...


  • Project Manager (Database / Setting) 관련
    • Local Database(SQLite) 사용시 Database에서 직접 정보 변경 시 반영되지 않는 문제
      (AutoCAD P&ID 종료후 PnPLocalCachePurer.exe를 통한 해결 가능하나 너무 불편)
      - 문의중(2012.09.26)
    • SQL Server 사용시 SQL 자체 계정으로는 로그인 되나 도메인 사용자 계정으로 로그인 안 되는 문제
      - 해결 방법은 SQL Server 등록시 "Windows Authentication"으로 등록 후 Database 권한 부여(프로젝트 몇개 생성해서 알아냄 ^^;; 이런건 메뉴얼에도 없어...)
    • Local Database -> SQL Server로는 되나 반대로 변경이 안 되는 문제
      (경우에 따라 현장에서 수정 시 SQL Server가 열리지 않은 상태에서는 실질적으로 불가능)
    • 백업 및 복구 기능 부재
      Local Database를 이용 시 파일 복사를 통한 용이한 Backup이 가능하나, SQL Server 이용 시 Backup 난관...
    • 특정 컬럼 생성 후 정렬(위아래) 위치 변경 불가능
    • Annotation관리에서 해당 블럭의 "Attribute Definition"에서 Tag에는 공백이 들어가면 안됨...넣을수 있는 방법 필요(2012.07.27 추가)

 

  • 도면(Drawing / Model) 관련
    • 속성 정보 변경 시 도면에 반영이 잘 안 되는 문제
      Data Manager에서 "Synchronize PID Symbols and Annotations"로 대체 되나 개선 필요
    • Nozzle 번호 부여시 Tag정보의 갱신 상의 문제점(전체적으로 좀 이상함) - 문의중(2012.09.26)

 

  • 기타
    • SQL Server 사용시 항상 Login 창 표출
      (SQL 도메인 로그인 기능 개선을 통하여 해결 가능 할 듯)
    • 미터와 인치 이외의 단위 인식 불가능(중요)
    • 프로젝트별 툴팔렛트 배포 불가능 (일괄 배포 기능 필요)
      (사용자별 툴팔렛트를 이용하여 개인별 관리 또는 공유폴더를 지정하여 가능하나 실질적으론 불가능)

 

  • 질의 사항(Q&A)
    • 프로젝트 생성시 [3 Page]"Specify P&ID settings"에서 Standard 정책 목록 추가 가능 여부?
      • 문의 중(2012.09.26)

※ 기타 여러분의 개선관련 의견이나 해결 방법을 아시는 분은 아래 댓글을 통하여 입력부탁드립니다. - 감사합니다.

Autodesk AutoCAD P&ID 또는 Plant 3D 등 Plant용 CAD에 몇가지 프로그램(설치 경로에 위치)이 있으나 AutoCAD 내에서는 실행되지 않고 같이 배포되는 파일들이 있어 소개하고져 합니다.

 

  • "PnPLocalDataCachPurger.exe"
    프로그램명을 보시면 아시겠지만 네트워크(공유)를 통한 프로젝트를 실행시 AutoCAD는 항상 캐쉬를 가지고 있습니다. 이걸 Purge한다는 말이겠죠....

    PnPLocalDataCachPurger 내부 캐쉬는 모두 Purge하고 최신의 데이터로 갱신하는 기능입니다.
    간혹 변경사항이 반영이 안되면 사용하시면 되겠습니다.
    단, AutoCAD는 종료된 상태에서만 가능합니다.

    여기서는 설명을 안하겠지만, Local Database(SQLite) 또는 Microsoft SQL Server를 이용하실때 매우 유용한 툴인데...
    문제는 AutoCAD를 종료해야지만 된다는게 가장 단점이 되겠습니다. 차라리 캐쉬끄는 기능을 만들어 주던지 ^^;;


  • "PnPProjectMaintenace.exe"
    본 프로그램은 Microsoft SQL Server or Express를 지원하기 위한 툴이라고 보시면 되겠습니다.
    • Convert a Project to SQL Express
      기존의 Local Database(SQLite)를 Microsoft SQL로 변경하는 기능입니다.
      아주 약간의 진짜로 약간의 DB관련 전산적 기술이 필요합니다.
      그리고 한번 Convert되면 AutoCAD에서는 Local Database를 더이상 사용하실수 없습니다.
    • Move a Project Database
      기존 Project의 Database가 Microsoft SQL일 경우 다른 SQL Server로 이전 시키는 기능입니다.
    • Copy a Project Database
      기존 Project의 Database가 Microsoft SQL일 경우 다른 SQL Server로 Copy 또는 Backup 시키는 기능입니다.(Backup을 SQL Server를 하나 더 두고 하는건데...이게 비용이 ^^;;)


          
  • "PnPReportCreator.exe"
    본 프로그램은 설치시 바탕하면에 바로가기가 생성됩니다.
    Project내에서 사용할 Report들을 관리 및 추가/수정 기능을 제공하여 줍니다.
    본 프로그램을 잘 활용하기 위해서는 Programing(개발)과 SQL(Database)에 어느정도 통괄되어야 하며, 특수한 모양의 Report를 만들기 위해서는 시간과 노력(완전 노가다 성이 강함)과 상기 프로그램 개발과 데이타베이스에대한 통괄적인 개념을 다 가지고 있어야 합니다. 또한, 해당 업무 분석은 필수겠죠..

    참고로, AutoCAD 에서 채용하는 Report 프로그램은 유명한 Component제작사인 Devexpress에서 개발한 프로그램으로 .NET(CLR) 과 Delphi/C++빌더(VCL)을 지원합니다.
    그리고 요즘 대부분의 응용프로그램도 모두 Devexpress의 Grid와 Component, Report를 많이 채용하고 있습니다. 제가 언뜻봐서는 AVEVA의 Instrument도 Devexpress를 채용한걸로 유추합니다.(이건 확신은 아님)

상기 세 프로그램을 간단히 언급하였으나 나중에 기회가 되면 보다 자세히 설명하겠습니다.

원래는 "PnPLocalDataCachPurger"만 애기 할려고 하였으나, 다른 프로그램도 언급하게 되었습니다.

 

-이상-




참고 :


2013/04/08 - [S/W/Autodesk AutoCAD(s)] - [AutoCAD P&ID]AutoCAD P&ID Loading을 빠르게...


 

 

 CAD강좌

 

 

 

 

CAD 명령

    MA(MATCHPROP) : Text Style 복사

    1. Source Object 선택
    2. Target Object 선택
  • BR(BREAK) : PLINE 절단점 지정

 

DWG 파일 헤더 정보에 표기되는 버전별 정보

  • MC0.0 - DWG from Rel. 1.1
  • AC1.2 - DWG from Rel. 1.2
  • AC1.4 - DWG from Rel. 1.4
  • AC1.50 - DWG from Rel. 2.0
  • AC2.10 - DWG from Rel. 2.10
  • AC1002 - DWG from Rel. 2.5
  • AC1003 - DWG from Rel. 2.6
  • AC1004 - DWG from Rel.9
  • AC1006 - DWG from Rel.10
  • AC1009 - DWG from Rel.11/12 (or LT R1/R2)
  • AC1012 - DWG from Rel.13 (or LT95)
  • AC1014 - DWG from Rel.14, 14.01 (or LT97/LT98)
  • AC1015 - DWG from AutoCAD 2000/2000i/2002 (or LT, Map or relative Desktop version)
  • AC1018 - DWG from AutoCAD 2004/2005/2006 (or other product in the "2004", "2005" or "2006" family)
  • AC1021 - DWG from AutoCAD 2007/2008/2009 (or other product of the "2007", "2008" and "2009" families)
  • AC1024 - DWG from AutoCAD 2010/2011/2012 (or other product of the "2010", "2011" and "2012" families)
  • AC1027 - DWG from AutoCAD 2013 (or other product of the "2013" family)

출처 : http://www.cadforum.cz/cadforum_en/qaID.asp?tip=868

=========================================================================================

레지스트리로 설치여부 확인

HKEY_LOCAL_MACHINE>SOFTWARE>Autodesk>AutoCAD>R19.0

R17.0 : 2007 / .1 : 2008 / .2 : 2009

R18.0 : 2010 .1 / : 2011 / .2 : 2012

R19.0 : 2013

>ACAD-B001:409

X000 : Civil3D

X001 : AutoCAD

X016 : AutoCAD P&ID

409 : English

412 : Korean

 

해당 실행 파일에 본 첨부파일을 풀어 주면 클라이언트 없이도 배포 가능합니다.

별도로  TNS_ADMIN 경로를 환경설정에서 해줘도 되나, 10g Client 버전부터는 TNS를 이용안하고 설정 가능합니다.

실행파일과 같은 경로에 배포하시면 쉽게 사용 가능합니다.

DataGridView를 이용하였습니다.

OracleConnection oraConn = new OracleConnection();
oraConn.ConnectionString = string.Format("USER ID={0};PASSWORD={1};DATA SOURCE={2};PERSIST SECURITY INFO=false", "{오라클UserID}", "{오라클UserPassword}", "{Oracle Host Name(Domain) or Oracle Host IP}:{Oracle Service Port}/{Oracle Service Name(SID)");
//기본포트 1521를 쓸경우 ":{Oracle Service Port}" 생략 가능
oraConn.Open();
string SQL = "SELECT * FROM TAB";
OracleCommand oraCmd = new OracleCommand(SQL, oraConn);
OracleDataAdapter oraAdapter = new OracleDataAdapter(oraCmd);
DataTable dt = new DataTable();
oraAdapter.Fill(dt);
dataGridView1.DataSource = dt;

ODP.NET 버전은 11.2.0.3.0 32bit 버전을 이용하였습니다.

Oracle.DataAccess.dll 파일 버전은 2.112.3.0 입니다.

 .NET 2.0 기준 DLL파일입니다.

.NET 4.0으로 프로젝트 세팅을 하셔도 참조시 Oracle.DataAccess.dll버전을 2.x대를 추가하면 .NET 4.0에서도 사용 가능합니다.

(최대 파일당 10M라서 분할하여 올립니다.)

================================================================================================================

ODP.NET(v2).zip

 

ODP.NET(v2).z01

 

ODP.NET(v2).z02

 

ODP.NET(v2).z03

 

ODP.NET(v2).z04

 

 

추가로 Oracle.DataAccess.dll 4.112.3.0 버전도 올립니다.

 

Oracle.DataAccess(v4).zip

+ Recent posts