"매핑"은 새로운 LPgenerator 도구입니다! 포트 매핑이란 무엇입니까?


3부: 테이블의 데이터 표시(LIST 작업)

이전 부분에서는 관계 유형(일대일, 일대다, 다대다)과 하나의 Book 클래스 및 해당 매핑 클래스 BookMap을 살펴보았습니다. 두 번째 부분에서는 부제목 1.3.1 관계 위에 있는 데이터베이스 다이어그램의 이전 장에 설명된 대로 Book 클래스를 업데이트하고 나머지 클래스와 이들 간의 연결을 생성합니다.

클래스 및 매핑 코드(주석 포함)

교과서

Public class Book ( //고유 식별자 public virtual int Id ( get; set; ) // 제목 public virtual string Name ( get; set; ) // 설명 public virtual string Description ( get; set; ) // 세계 평가 of Fiction public virtual int MfRaiting ( get; set; ) //페이지 번호 public virtual int PageNumber ( get; set; ) //사진 링크 public virtual string Image (get; set; ) //책 도착 날짜 (필터 새 항목별로!) public virtual DateTime IncomeDate ( get; set; ) //장르(다대다) //왜 ISet이고 IList가 아닌가? JOIN 가져오기를 사용하면 하나의 컬렉션(IList)만 선택할 수 있습니다. JOIN 가져오기에 컬렉션이 필요한 경우 이를 ISet 공용 가상 ISet 컬렉션으로 변환하는 것이 좋습니다. 장르( get; set; ) //시리즈(다대일) public virtual 시리즈 시리즈( get; set; ) //의견 및 기타(일대일) private Mind _mind; public virtual Mind Mind ( get ( return _mind ?? (_mind = new Mind())); ) set ( _mind = value; ) ) //저자(다대다) public virtual ISet 작성자( get; set; ) //null 예외가 발생하지 않도록 미리 초기화합니다. public Book() ( //순서가 지정되지 않은 세트(한 테이블은 정확히 동일한 두 개의 행을 포함할 수 없습니다. 그렇지 않으면 하나를 선택하고 다른 행을 무시합니다) Genres = new HashSet (); 작성자 = 새로운 HashSet (); ) ) // 매핑 클래스 Book public class BookMap: ClassMap ( 공개 BookMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.Description); Map(x => x.MfRaiting); Map(x = > x.PageNumber); Map(x => x.Image); Map(x => x.IncomeDate); //다대다 관계 HasManyToMany(x => x.Genres) //계단식 규칙 All - When 개체가 저장, 업데이트 또는 삭제되고 모든 종속 개체가 확인되고 //생성/업데이트/추가됩니다.Cascade.SaveUpdate() //중간 테이블의 이름은 Genre 클래스와 동일해야 합니다. Table("Book_Genre" ); > x.Authors) .Cascade.SaveUpdate() .Table("Book_Author"); //다대일 관계 References(x => x.Series) //일대일 관계 HasOne(x) . => x.Mind).Cascade.All().Constrained();

Public class Author ( public virtual int Id ( get; set; ) //이름-성 public virtual string Name ( get; set; ) //전기 public virtual string Biography ( get; set; ) //책 public virtual ISet Books ( get; set; ) //작성자 초기화 public Author() ( Books=new HashSet (); ) ) // 작성자 매핑 공개 클래스 AuthorMap: ClassMap ( public AuthorMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.Biography); //다대다 관계 HasManyToMany(x => x .Books) //캐스케이드 규칙 All - 객체가 저장, 업데이트 또는 삭제되면 모든 종속 객체를 확인하고 생성/업데이트/추가합니다.Cascade.All() //컬렉션의 소유자는 관계의 반대편입니다. (Book) 먼저 저장됩니다. .Inverse() //중간 테이블의 이름은 Book 클래스와 동일해야 합니다!

수업 장르

Public class Genre ( public virtual int Id ( get; set; ) //장르명 public virtual string Name (get; set; ) //장르 영문명 public virtual string EngName (get; set; ) //Books 공개 가상 ISet Books ( get; set; ) //책 초기화 public Genre() ( Books=new HashSet (); ) ) //장르 매핑 공개 클래스 GenreMap: ClassMap ( public GenreMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.EngName); //다대다 관계 HasManyToMany(x => x .Books) //캐스케이드 규칙 All - 객체가 저장, 업데이트 또는 삭제되면 모든 종속 객체를 확인하고 생성/업데이트/추가합니다.Cascade.All() //컬렉션의 소유자는 관계의 반대편입니다. (Book) 먼저 저장됩니다. .Inverse() //중간 테이블의 이름은 Book 클래스와 동일해야 합니다!

학급 의견:

Public class Mind ( public virtual int Id ( get; set; ) //내 의견 public virtual string MyMind ( get; set; ) //Fantlab의 의견 public virtual string MindFantLab ( get; set; ) //Book public virtual Book Book ( get; ) ) //공용 클래스 MindMap:ClassMap 매핑 ( public MindMap() ( Id(x => x.Id); Map(x => x.MyMind); Map(x => x.MindFantLab); //일대일 관계 HasOne(x => x .책 ); ) )

수업주기(시리즈):

Public class Series ( public virtual int Id ( get; set; ) public virtual string Name ( get; set; ) //Book 외에 Series는 다른 것과 연결되어 있지 않기 때문에 ISet이 아닌 IList를 만들었습니다. 할 수 있고 ISet public virtual IList Books ( get; set; ) //책 초기화 중. public Series() (도서 = 새 목록 (); ) ) 공개 클래스 SeriesMap: ClassMap ( public SeriesMap() ( Id(x => x.Id); Map(x => x.Name); //일대다 관계 HasMany(x => x.Books) ////소유자 collection .관계(Book)의 다른 쪽 끝이 먼저 저장됩니다.

약간의 설명
공개 가상 ISet 장르(get;set;)
공개 가상 ISet 작성자( get; set; )

왜 ISet인가? , 예를 들어 많은 사람들에게 친숙한 IList는 아닙니다. ? ISet 대신 IList를 사용하여 프로젝트를 실행해 보면 큰 차이를 느끼지 못할 것입니다(테이블과 클래스가 생성됩니다). 그러나 동시에 Book LeftJoin 클래스에 Genre 및 Authors 테이블을 추가하고 Book 테이블(Distinct Book.Id)의 반복되지 않는 레코드를 뷰(View)에 표시하려고 하면 Nhibernate는 예외와 오류.
여러 개의 가방을 동시에 가져올 수 없습니다.
이러한 경우에는 특히 세트가 이를 위한 것이므로(중복 레코드를 무시함) ISet을 사용합니다.

다대다 관계.

NHibernate는 "메인" 테이블의 개념을 가지고 있습니다. Book과 Author 테이블 사이의 다대다 관계는 동일하지만(저자는 많은 책을 가질 수 있고, 책은 많은 저자를 가질 수 있음) Nhibernate는 프로그래머가 두 번째로 저장되는 테이블을 지정하도록 요구합니다(메서드가 있음). ()), 즉, 먼저 Book 테이블에서 레코드가 생성/업데이트/삭제된 다음 Author 테이블에서만 생성됩니다.
Cascade.All은 저장-업데이트 및 삭제 시 계단식 작업을 수행하는 것을 의미합니다. 즉, 객체가 저장, 업데이트, 삭제되면 모든 종속 객체를 확인하여 생성/업데이트/추가합니다. (Ps. Cascade.All -> .Cascade.SaveUpdate().Cascade.Delete() 대신 쓸 수 있음)
Method.Table("책_저자"); 데이터베이스에 "중간" 테이블 "Book_Author"를 생성합니다.

다대일, 일대다 관계.

The.Constrained() 메소드는 Book 테이블의 레코드가 Mind 테이블의 레코드와 일치해야 함을 NHibernate에 알려줍니다(Mind 테이블의 ID는 Book 테이블의 ID와 같아야 함).

이제 프로젝트를 실행하고 Bibilioteca 데이터베이스를 보면 이미 연결이 형성된 새 테이블이 나타납니다.

다음으로 생성된 테이블을 데이터로 채우세요.
이를 위해 데이터베이스에 데이터를 저장하고, 업데이트 및 삭제하고, HomeController를 다음과 같이 변경하는 테스트 애플리케이션을 생성합니다(코드의 불필요한 섹션에 대해 설명합니다).
public ActionResult Index() ( using (ISession session = NHibernateHelper.OpenSession()) ( using (ITransaction transaction = session.BeginTransaction()) ( //만들기, 추가 var createBook = new Book(); createBook.Name = "Metro2033" ; createBook.Description = "포스트 아포칼립스 신비주의"; createBook.Authors.Add(new Author ( Name = "Glukhovsky" )); createBook.Genres.Add(new Genre ( Name = "포스트 아포칼립스 신비주의" )); ( Name = "Metro" ); createBook.Mind = new Mind ( MyMind = "포스트 아포칼립스 신비주의" ); session.SaveOrUpdate(createBook) //업데이트(ID별) //var 시리즈 = session.Get (1); //var updateBook = 세션.Get (1); //updateBook.Name = "Metro2034"; //updateBook.Description = "디스토피아"; //updateBook.Authors.ElementAt(0).Name = "Glukhovsky"; //updateBook.Genres.ElementAt(0).Name = "디스토피아"; //updateBook.Series = 시리즈; //updateBook.Mind.MyMind = "11111"; //session.SaveOrUpdate(updateBook); //삭제(ID별) //var deleteBook = session.Get (1); //session.Delete(deleteBook); 트랜잭션.커밋(); ) 장르 GenreAl = null; 작성자 작성자Al = null; 시리즈 seriesAl = null; 마음 mindAl = null; var 책 = session.QueryOver () //왼쪽 조인 테이블 Genres .JoinAlias(p => p.Genres, () => .JoinAlias(p => p.Authors, () =>authorAl, JoinType.LeftOuterJoin) .JoinAlias(p => p .Series, () => seriesAl, JoinType.LeftOuterJoin) .JoinAlias(p => p.Mind, () => mindAl, JoinType.LeftOuterJoin) //중복된 테이블 ID 번호 제거 Book.TransformUsing(Transformers.DistinctRootEntity). (); 보기(도서);

약간의 설명

  1. var 책 = session.QueryOver () * 책에서 선택;
  2. .JoinAlias(p => p.Genres, () => GenreAl, JoinType.LeftOuterJoin)- SQL 스크립트 실행과 유사합니다.
    *책에서 선택
    내부 JOIN Book_Genre ON book.id = Book_Genre.Book_id
    LEFT JOIN 장르 ON Book_Genre.Genre_id = Genre.id
  3. .TransformUsing(Transformers.DistinctRootEntity)- SQL 스크립트 실행과 유사합니다. 고유한 도서 ID 선택..., (동일한 ID를 가진 중복 레코드 제거)

협회 유형
.JoinAlias(p => p.Genres, () => GenreAl, JoinType.LeftOuterJoin)

  1. LeftOuterJoin - 왼쪽 테이블에서 모든 레코드를 선택합니다( ), 올바른 테이블 레코드를 여기에 추가합니다( 장르). 오른쪽 테이블에 해당 항목이 없으면 Null로 표시합니다.
  2. RightOuterJoin은 LEFT JOIN과 반대입니다. 오른쪽 테이블의 모든 레코드를 선택합니다( 장르), 왼쪽 테이블 레코드를 여기에 추가합니다( )
  3. InnerJoin - 왼쪽 테이블에서 해당 레코드만 선택합니다( ) 오른쪽 테이블의 해당 항목이 있습니다( 장르), 그런 다음 오른쪽 테이블의 레코드와 조인합니다.

표현을 다음과 같이 변경해 보겠습니다.

인덱스 보기

@model IEnumerable @( 레이아웃 = null; ) 색인

@Html.ActionLink("새로 만들기", "만들기")

@foreach(모델의 var 항목) ( @(string strSeries = item.Series != null ? item.Series.Name: null;) }
@Html.DisplayNameFor(모델 => 모델.이름) @Html.DisplayNameFor(모델 => 모델.Mind) @Html.DisplayNameFor(모델 => 모델.시리즈) @Html.DisplayNameFor(모델 => 모델.저자) @Html.DisplayNameFor(모델 => 모델.장르) 운영
@Html.DisplayFor(modelItem => item.Name) @Html.DisplayFor(modelItem => item.Mind.MyMind)@Html.DisplayFor(modelItem => strSeries) @foreach (item.Authors의 var 작성자) ( string strAuthor = 작성자 != null ? 작성자.이름: null; @Html.DisplayFor(modelItem => strAuthor)
}
@foreach (item.Genres의 var 장르) ( string strGenre = Genre!= null ? Genre.Name: null; @Html.DisplayFor(modelItem => strGenre)
}
@Html.ActionLink("편집", "편집", new ( id = item.Id )) | @Html.ActionLink("세부 정보", "세부 정보", new ( id = item.Id )) | @Html.ActionLink("삭제", "삭제", new ( id = item.Id ))




모든 작업을 하나씩 확인한 결과 다음 사항을 알 수 있습니다.
  • Create 및 Update 작업 중에 Book 테이블과 관련된 모든 데이터가 업데이트됩니다(Cascade="save-update" 또는 cascade="all"을 제거하면 관련 데이터가 저장되지 않음).
  • 삭제 시 Book, Mind, Book_Author 테이블의 데이터는 삭제되지만 Cascade="save-update"가 되어 있어 나머지 데이터는 삭제되지 않습니다.

상속이 있는 클래스에 대한 매핑입니다.
상속이 있는 클래스를 매핑하는 방법은 무엇입니까? 다음 예가 있다고 가정해 보겠습니다.
//2차원 도형의 클래스 public class TwoDShape ( //Width public virtual int Width ( get; set; ) // Height public virtual int Height ( get; set; ) ) // 클래스 Triangle public class Triangle: TwoDShape ( / /식별번호 public virtual int Id ( get; set; ) //삼각형의 종류 public virtual string Style ( get; set; ) )

원칙적으로 이 매핑에는 복잡한 것이 없습니다. 파생 클래스에 대한 하나의 매핑, 즉 Triangle 테이블을 생성하기만 하면 됩니다.
//삼각형 매핑 공개 클래스 TriangleMap: ClassMap ( 공개 TriangleMap() ( Id(x => x.Id); Map(x => x.Style); Map(x => x.Height); Map(x => x.Width); ) )
애플리케이션을 실행하면 Biblioteca 데이터베이스에 다음과 같은 (빈) 테이블이 나타납니다.

태그: 태그 추가


이전 부분에서는 관계 유형(일대일, 일대다, 다대다)과 하나의 Book 클래스 및 해당 매핑 클래스 BookMap을 살펴보았습니다. 두 번째 부분에서는 부제목 1.3.1 관계 위에 있는 데이터베이스 다이어그램의 이전 장에 설명된 대로 Book 클래스를 업데이트하고 나머지 클래스와 이들 간의 연결을 생성합니다.

클래스 및 매핑 코드(주석 포함)

교과서

Public class Book ( //고유 식별자 public virtual int Id ( get; set; ) // 제목 public virtual string Name ( get; set; ) // 설명 public virtual string Description ( get; set; ) // 세계 평가 of Fiction public virtual int MfRaiting ( get; set; ) //페이지 번호 public virtual int PageNumber ( get; set; ) //사진 링크 public virtual string Image (get; set; ) //책 도착 날짜 (필터 새 항목별로!) public virtual DateTime IncomeDate ( get; set; ) //장르(다대다) //왜 ISet이고 IList가 아닌가? JOIN 가져오기를 사용하면 하나의 컬렉션(IList)만 선택할 수 있습니다. JOIN 가져오기에 컬렉션이 필요한 경우 이를 ISet 공용 가상 ISet 컬렉션으로 변환하는 것이 좋습니다. 장르( get; set; ) //시리즈(다대일) public virtual 시리즈 시리즈( get; set; ) //의견 및 기타(일대일) private Mind _mind; public virtual Mind Mind ( get ( return _mind ?? (_mind = new Mind())); ) set ( _mind = value; ) ) //저자(다대다) public virtual ISet 작성자( get; set; ) //null 예외가 발생하지 않도록 미리 초기화합니다. public Book() ( //순서가 지정되지 않은 세트(한 테이블은 정확히 동일한 두 개의 행을 포함할 수 없습니다. 그렇지 않으면 하나를 선택하고 다른 행을 무시합니다) Genres = new HashSet (); 작성자 = 새로운 HashSet (); ) ) // 매핑 클래스 Book public class BookMap: ClassMap ( 공개 BookMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.Description); Map(x => x.MfRaiting); Map(x = > x.PageNumber); Map(x => x.Image); Map(x => x.IncomeDate); //다대다 관계 HasManyToMany(x => x.Genres) //계단식 규칙 All - When 개체가 저장, 업데이트 또는 삭제되고 모든 종속 개체가 확인되고 //생성/업데이트/추가됩니다.Cascade.SaveUpdate() //중간 테이블의 이름은 Genre 클래스와 동일해야 합니다. Table("Book_Genre" ); > x.Authors) .Cascade.SaveUpdate() .Table("Book_Author"); //다대일 관계 References(x => x.Series) //일대일 관계 HasOne(x) . => x.Mind).Cascade.All().Constrained();

Public class Author ( public virtual int Id ( get; set; ) //이름-성 public virtual string Name ( get; set; ) //전기 public virtual string Biography ( get; set; ) //책 public virtual ISet Books ( get; set; ) //작성자 초기화 public Author() ( Books=new HashSet (); ) ) // 작성자 매핑 공개 클래스 AuthorMap: ClassMap ( public AuthorMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.Biography); //다대다 관계 HasManyToMany(x => x .Books) //캐스케이드 규칙 All - 객체가 저장, 업데이트 또는 삭제되면 모든 종속 객체를 확인하고 생성/업데이트/추가합니다.Cascade.All() //컬렉션의 소유자는 관계의 반대편입니다. (Book) 먼저 저장됩니다. .Inverse() //중간 테이블의 이름은 Book 클래스와 동일해야 합니다!

수업 장르

Public class Genre ( public virtual int Id ( get; set; ) //장르명 public virtual string Name (get; set; ) //장르 영문명 public virtual string EngName (get; set; ) //Books 공개 가상 ISet Books ( get; set; ) //책 초기화 public Genre() ( Books=new HashSet (); ) ) //장르 매핑 공개 클래스 GenreMap: ClassMap ( public GenreMap() ( Id(x => x.Id); Map(x => x.Name); Map(x => x.EngName); //다대다 관계 HasManyToMany(x => x .Books) //캐스케이드 규칙 All - 객체가 저장, 업데이트 또는 삭제되면 모든 종속 객체를 확인하고 생성/업데이트/추가합니다.Cascade.All() //컬렉션의 소유자는 관계의 반대편입니다. (Book) 먼저 저장됩니다. .Inverse() //중간 테이블의 이름은 Book 클래스와 동일해야 합니다!

학급 의견:

Public class Mind ( public virtual int Id ( get; set; ) //내 의견 public virtual string MyMind ( get; set; ) //Fantlab의 의견 public virtual string MindFantLab ( get; set; ) //Book public virtual Book Book ( get; ) ) //공용 클래스 MindMap:ClassMap 매핑 ( public MindMap() ( Id(x => x.Id); Map(x => x.MyMind); Map(x => x.MindFantLab); //일대일 관계 HasOne(x => x .책 ); ) )

수업주기(시리즈):

Public class Series ( public virtual int Id ( get; set; ) public virtual string Name ( get; set; ) //Book 외에 Series는 다른 것과 연결되어 있지 않기 때문에 ISet이 아닌 IList를 만들었습니다. 할 수 있고 ISet public virtual IList Books ( get; set; ) //책 초기화 중. public Series() (도서 = 새 목록 (); ) ) 공개 클래스 SeriesMap: ClassMap ( public SeriesMap() ( Id(x => x.Id); Map(x => x.Name); //일대다 관계 HasMany(x => x.Books) ////소유자 collection .관계(Book)의 다른 쪽 끝이 먼저 저장됩니다.

약간의 설명
공개 가상 ISet 장르(get;set;)
공개 가상 ISet 작성자( get; set; )

왜 ISet인가? , 예를 들어 많은 사람들에게 친숙한 IList는 아닙니다. ? ISet 대신 IList를 사용하여 프로젝트를 실행해 보면 큰 차이를 느끼지 못할 것입니다(테이블과 클래스가 생성됩니다). 그러나 동시에 Book LeftJoin 클래스에 Genre 및 Authors 테이블을 추가하고 Book 테이블(Distinct Book.Id)의 반복되지 않는 레코드를 뷰(View)에 표시하려고 하면 Nhibernate는 예외와 오류.
여러 개의 가방을 동시에 가져올 수 없습니다.
이러한 경우에는 특히 세트가 이를 위한 것이므로(중복 레코드를 무시함) ISet을 사용합니다.

다대다 관계.

NHibernate는 "메인" 테이블의 개념을 가지고 있습니다. Book과 Author 테이블 사이의 다대다 관계는 동일하지만(저자는 많은 책을 가질 수 있고, 책은 많은 저자를 가질 수 있음) Nhibernate는 프로그래머가 두 번째로 저장되는 테이블을 지정하도록 요구합니다(메서드가 있음). ()), 즉, 먼저 Book 테이블에서 레코드가 생성/업데이트/삭제된 다음 Author 테이블에서만 생성됩니다.
Cascade.All은 저장-업데이트 및 삭제 시 계단식 작업을 수행하는 것을 의미합니다. 즉, 객체가 저장, 업데이트, 삭제되면 모든 종속 객체를 확인하여 생성/업데이트/추가합니다. (Ps. Cascade.All -> .Cascade.SaveUpdate().Cascade.Delete() 대신 쓸 수 있음)
Method.Table("책_저자"); 데이터베이스에 "중간" 테이블 "Book_Author"를 생성합니다.

다대일, 일대다 관계.

The.Constrained() 메소드는 Book 테이블의 레코드가 Mind 테이블의 레코드와 일치해야 함을 NHibernate에 알려줍니다(Mind 테이블의 ID는 Book 테이블의 ID와 같아야 함).

이제 프로젝트를 실행하고 Bibilioteca 데이터베이스를 보면 이미 연결이 형성된 새 테이블이 나타납니다.

다음으로 생성된 테이블을 데이터로 채우세요.
이를 위해 데이터베이스에 데이터를 저장하고, 업데이트 및 삭제하고, HomeController를 다음과 같이 변경하는 테스트 애플리케이션을 생성합니다(코드의 불필요한 섹션에 대해 설명합니다).
public ActionResult Index() ( using (ISession session = NHibernateHelper.OpenSession()) ( using (ITransaction transaction = session.BeginTransaction()) ( //만들기, 추가 var createBook = new Book(); createBook.Name = "Metro2033" ; createBook.Description = "포스트 아포칼립스 신비주의"; createBook.Authors.Add(new Author ( Name = "Glukhovsky" )); createBook.Genres.Add(new Genre ( Name = "포스트 아포칼립스 신비주의" )); ( Name = "Metro" ); createBook.Mind = new Mind ( MyMind = "포스트 아포칼립스 신비주의" ); session.SaveOrUpdate(createBook) //업데이트(ID별) //var 시리즈 = session.Get (1); //var updateBook = 세션.Get (1); //updateBook.Name = "Metro2034"; //updateBook.Description = "디스토피아"; //updateBook.Authors.ElementAt(0).Name = "Glukhovsky"; //updateBook.Genres.ElementAt(0).Name = "디스토피아"; //updateBook.Series = 시리즈; //updateBook.Mind.MyMind = "11111"; //session.SaveOrUpdate(updateBook); //삭제(ID별) //var deleteBook = session.Get (1); //session.Delete(deleteBook); 트랜잭션.커밋(); ) 장르 GenreAl = null; 작성자 작성자Al = null; 시리즈 seriesAl = null; 마음 mindAl = null; var 책 = session.QueryOver () //왼쪽 조인 테이블 Genres .JoinAlias(p => p.Genres, () => .JoinAlias(p => p.Authors, () =>authorAl, JoinType.LeftOuterJoin) .JoinAlias(p => p .Series, () => seriesAl, JoinType.LeftOuterJoin) .JoinAlias(p => p.Mind, () => mindAl, JoinType.LeftOuterJoin) //중복된 테이블 ID 번호 제거 Book.TransformUsing(Transformers.DistinctRootEntity). (); 보기(도서);

약간의 설명

  1. var 책 = session.QueryOver () * 책에서 선택;
  2. .JoinAlias(p => p.Genres, () => GenreAl, JoinType.LeftOuterJoin)- SQL 스크립트 실행과 유사합니다.
    *책에서 선택
    내부 JOIN Book_Genre ON book.id = Book_Genre.Book_id
    LEFT JOIN 장르 ON Book_Genre.Genre_id = Genre.id
  3. .TransformUsing(Transformers.DistinctRootEntity)- SQL 스크립트 실행과 유사합니다. 고유한 도서 ID 선택..., (동일한 ID를 가진 중복 레코드 제거)

협회 유형
.JoinAlias(p => p.Genres, () => GenreAl, JoinType.LeftOuterJoin)

  1. LeftOuterJoin - 왼쪽 테이블에서 모든 레코드를 선택합니다( ), 올바른 테이블 레코드를 여기에 추가합니다( 장르). 오른쪽 테이블에 해당 항목이 없으면 Null로 표시합니다.
  2. RightOuterJoin은 LEFT JOIN과 반대입니다. 오른쪽 테이블의 모든 레코드를 선택합니다( 장르), 왼쪽 테이블 레코드를 여기에 추가합니다( )
  3. InnerJoin - 왼쪽 테이블에서 해당 레코드만 선택합니다( ) 오른쪽 테이블의 해당 항목이 있습니다( 장르), 그런 다음 오른쪽 테이블의 레코드와 조인합니다.

표현을 다음과 같이 변경해 보겠습니다.

인덱스 보기

@model IEnumerable @( 레이아웃 = null; ) 색인

@Html.ActionLink("새로 만들기", "만들기")

@foreach(모델의 var 항목) ( @(string strSeries = item.Series != null ? item.Series.Name: null;) }
@Html.DisplayNameFor(모델 => 모델.이름) @Html.DisplayNameFor(모델 => 모델.Mind) @Html.DisplayNameFor(모델 => 모델.시리즈) @Html.DisplayNameFor(모델 => 모델.저자) @Html.DisplayNameFor(모델 => 모델.장르) 운영
@Html.DisplayFor(modelItem => item.Name) @Html.DisplayFor(modelItem => item.Mind.MyMind)@Html.DisplayFor(modelItem => strSeries) @foreach (item.Authors의 var 작성자) ( string strAuthor = 작성자 != null ? 작성자.이름: null; @Html.DisplayFor(modelItem => strAuthor)
}
@foreach (item.Genres의 var 장르) ( string strGenre = Genre!= null ? Genre.Name: null; @Html.DisplayFor(modelItem => strGenre)
}
@Html.ActionLink("편집", "편집", new ( id = item.Id )) | @Html.ActionLink("세부 정보", "세부 정보", new ( id = item.Id )) | @Html.ActionLink("삭제", "삭제", new ( id = item.Id ))




모든 작업을 하나씩 확인한 결과 다음 사항을 알 수 있습니다.
  • Create 및 Update 작업 중에 Book 테이블과 관련된 모든 데이터가 업데이트됩니다(Cascade="save-update" 또는 cascade="all"을 제거하면 관련 데이터가 저장되지 않음).
  • 삭제 시 Book, Mind, Book_Author 테이블의 데이터는 삭제되지만 Cascade="save-update"가 되어 있어 나머지 데이터는 삭제되지 않습니다.

상속이 있는 클래스에 대한 매핑입니다.
상속이 있는 클래스를 매핑하는 방법은 무엇입니까? 다음 예가 있다고 가정해 보겠습니다.
//2차원 도형의 클래스 public class TwoDShape ( //Width public virtual int Width ( get; set; ) // Height public virtual int Height ( get; set; ) ) // 클래스 Triangle public class Triangle: TwoDShape ( / /식별번호 public virtual int Id ( get; set; ) //삼각형의 종류 public virtual string Style ( get; set; ) )

원칙적으로 이 매핑에는 복잡한 것이 없습니다. 파생 클래스에 대한 하나의 매핑, 즉 Triangle 테이블을 생성하기만 하면 됩니다.
//삼각형 매핑 공개 클래스 TriangleMap: ClassMap ( 공개 TriangleMap() ( Id(x => x.Id); Map(x => x.Style); Map(x => x.Height); Map(x => x.Width); ) )
애플리케이션을 실행하면 Biblioteca 데이터베이스에 다음과 같은 (빈) 테이블이 나타납니다.

태그:

  • asp.net mvc 4
  • 동면하다
  • SQL 서버
태그 추가

금융 기관용 데이터 웨어하우스

은행 업계의 데이터 웨어하우스는 서로 다른 시스템의 서로 다른 데이터를 통합하고 통합된 데이터에서 정보를 추출하도록 설계되었습니다. 웨어하우스가 데이터 통합 ​​문제를 해결할 수는 있지만 모든 정보 문제를 마술처럼 해결할 수는 없습니다. 은행 데이터 웨어하우스 프로젝트를 구성하고 관리하려면 모든 이해관계자의 의식적인 노력이 필요합니다.

이와 관련하여, 은행에서 데이터 웨어하우스를 성공적으로 구현하기 위한 이상적인 환경을 조성하기 위한 단계(데이터 모델 구현 이전에도 수행할 수 있는 단계)를 살펴보는 것이 좋습니다.

1. 은행업무(소매금융, 기업업무, 신용카드 등)에 따른 이해관계자 식별.

이해관계자는 관련 지식을 갖고 있어야 합니다. 데이터 웨어하우스와 각 개별 비즈니스 기능에 대한 요구 사항을 더 잘 이해하려면 프로젝트 팀의 비즈니스 및 비즈니스 기술 측면의 구성원을 포함해야 합니다. 그룹 내 정보 유출을 방지하기 위해 이해관계자는 프로젝트 초기부터 참여해야 합니다.

2. 은행의 데이터 저장 필요성을 이해하기 위한 교육 세션입니다.

프로젝트 이해관계자는 데이터 웨어하우스가 관련 데이터 요소만을 위한 저장소이지 소스 시스템의 정확한 복사본이 아니라는 점을 이해해야 합니다. 이는 팀이 저장할 가치가 있는 데이터를 결정하는 데 도움이 됩니다.

3. 데이터 모델링의 개념을 이해합니다.

메타데이터 테이블과 기록 테이블의 사용을 이해하면 프로젝트 팀은 요구 사항이 데이터 모델에 구현될 것이라는 확신을 갖게 됩니다.

4. 소스 시스템 환경을 종합적으로 검색합니다.

조직의 각 시스템이 데이터 웨어하우스에 포함되도록 적절한 고려와 고려가 제공되었는지 확인하십시오.

5. 데이터 모델 확장에 대한 전반적인 접근 방식을 이해하기 위해 핵심 모델을 중심으로 프로젝트를 구축합니다.

기본 모델은 주요 비즈니스 차원을 포괄하고 저장해야 할 실제 데이터에 대한 통찰력을 제공해야 합니다.

6. 데이터 매핑.

a) 소스(조직의 소스 시스템)의 데이터를 대상 구조(창고 데이터 모델)에 매핑합니다.

데이터 모델의 각 차원에 대해 소스 시스템과 시스템 간의 관계를 정의해야 합니다.

b) 비즈니스 및 IT 팀 구성원과 각 기능에 대한 데이터 매핑:

이 매핑은 두 가지 수준에서 필요할 수 있습니다.

소스 시스템에서 직접 매핑: 대부분의 데이터 요소는 데이터 모델에 직접 매핑됩니다. 여기서 소스 및 필드 이름을 정의해야 합니다.

소스 시스템에서 파생된 매핑: 모델의 일부 데이터 요소에는 정확한 정보를 얻기 위해 소스 시스템 데이터에 비즈니스 규칙을 적용해야 할 수도 있습니다. 명확하게 문서화해야 합니다.

두 개 이상의 소스에서 매핑하는 경우 이러한 소스 시스템 간의 관계를 결정해야 합니다.

7. 집계의 정의.

데이터 웨어하우스를 만드는 목적 중 하나는 기록 데이터에서 분석 정보를 얻는 것입니다. 또한 데이터로부터 예측 추세를 구축하는 것도 포함됩니다. 집계는 데이터가 분석되는 계층 또는 차원을 정의합니다. 데이터 모델에서 얻어야 하는 정보(보고서 및 대시보드)를 기반으로 집계를 정의하는 것이 가장 좋습니다.

8. 데이터 요소를 생략하고 이름을 지정합니다.

프로젝트 팀은 소스가 항상 표준 모델 내의 모든 데이터를 제공하지 않을 수도 있다는 점을 인정해야 합니다. 팀 구성원은 이러한 요소를 모델에서 제외할지 아니면 그대로 두고 사용하지 않을지 결정해야 합니다. 선호되는 방법은 관련 없는 필드를 생략하는 것입니다. 미래에 유용할 것으로 예상되는 경우에만 사용되지 않은 상태로 유지되어야 합니다.

9. 추가 프로세스 개선 선언.

데이터 웨어하우스 자체는 프로세스 개선 프로젝트는 아니지만 웨어하우스 자체 이상의 개선을 가져올 수 있습니다. 프로세스나 소스 시스템에서 관찰된 약점은 동시에 기록되고 해결되어야 합니다. 그러나 프로세스에 의한 변경은 나중에 이루어질 수 있으며 데이터 웨어하우스 프로젝트에 영향을 주지 않습니다.

10. 버전 정렬.

매핑과 데이터 모델은 버전으로 수용되어야 하며 프로젝트가 진행됨에 따라 변경될 수 있습니다. 이러한 변화에 적응하기 위한 프로세스를 만드는 것이 중요합니다.

저장하고 분석할 데이터가 너무 많으면 모든 조직에 문제가 될 수 있으며, 특히 지표의 불일치로 이어질 경우 더욱 그렇습니다. 데이터가 너무 많으면 보고서에서 충돌하는 데이터를 처리하고, 충돌하는 지표 중에서 선택하고, 중복 기록을 삭제해야 합니다. 이는 특히 동일한 비즈니스 프로세스나 이벤트에 대해 서로 다른 정보를 제공하는 너무 많은 데이터 웨어하우스나 데이터 마트를 구현한 대기업의 경우 너무 많은 시간과 리소스가 소요됩니다.

실물 경제 부문의 은행 기관과 기업 모두 이 문제를 해결해야 합니다. 그들의 경험을 바탕으로 몇 가지 보편적인 권장 사항을 얻을 수 있습니다.

여러 데이터 저장소를 단일 인스턴스로 축소

Boeing은 12개의 데이터 웨어하우스와 50개의 비용 관리 시스템으로 시작하여 이 프로세스를 거쳤으며 그 중 일부에는 수만 개의 비즈니스 규칙이 있었습니다. Boeing의 재무 담당 임원인 Bill Curley는 "문제는 우리 IT 부서가 사용자에게 필요한 것을 제공했지만 서로 소통하지 않았다는 것입니다."라고 말합니다. 이러한 통합 부족은 보고 불일치의 원인이었습니다.

보잉이 모든 재무제표를 하나의 전체로 통합하는 데 수년이 걸렸습니다. 이 작업을 수행하는 프로젝트 팀 구성원은 하향식 접근 방식을 취했습니다. 그들은 "데이터 소유자"에게 작업을 수행하는 데 필요한 정보가 무엇인지 물었고 최소한의 필수 요소가 포함된 표준 데이터 사전을 구현했습니다. 또한 보고에 필요한 운영 및 실제 회계 데이터를 분리했습니다. Bill Curley는 “더 이상 회계 시스템을 통해 운영 정보를 실행할 필요가 없었습니다.”라고 말합니다.

데이터 품질 개선을 위해 통합 데이터 아키텍처로 전환

나이키는 지난 몇 년 동안 이 작업을 수행해 왔습니다. 이를 위해 회사의 데이터 설계자 James Lee는 중복 데이터를 제거하고, 테이블에서 누락된 필드를 채우고, 생성하는 데 시간이 너무 오래 걸리는 일련의 보고서를 처리했습니다. “단일 버전의 정보를 얻는 과정에서 우리는 IT 부서의 참여 없이 사업부에서 보고서를 생성할 수 있도록 상당한 유연성을 확보하고 싶었습니다. 목표 중 하나는 사용자가 데이터 작업 측면에서 자급자족할 수 있도록 하는 것이었습니다.”라고 그는 회상합니다. Nike에서 가장 일반적으로 사용되는 테이블 중 하나에는 100개가 넘는 열이 포함되어 있습니다. 이는 I/O 및 처리 전력 사용량 측면에서 매우 비효율적이었습니다. Nike는 이 초광폭 테이블을 단순화하고 데이터 모델을 더 적은 요소로 줄였습니다. 또한 이 프로세스는 사용자가 누락되었지만 필요한 데이터 요소에 대해 책임을 지고 이를 추적하는 데 보다 적극적이 되도록 함으로써 데이터 품질을 향상시켰습니다.

출판물

  1. 아르티 냐디쉬. "이상적인 뱅킹 데이터 웨어하우징 프로젝트: 올바른 속도 설정을 위한 10단계", 2013년 1월 15일.
  2. 데이비드 스트롬. "너무 많은 데이터에 대처하기: Boeing, Nike 및 기타 기업이 이를 수행한 방법", 2012년 10월 23일.

포트 매핑- 이는 한 컴퓨터의 일부 포트에서 수신된 데이터가 자동으로 다른 컴퓨터의 다른 포트로 리디렉션되는 방식으로 수신된 데이터를 리디렉션하는 것입니다.

사실 원리 자체를 설명하는 것보다 기술적으로 구현하는 것이 훨씬 쉽습니다. 이는 햇빛과 비교할 수 있습니다. 빛의 광선을 거울에 비추면 "자동으로" 반사되어 물체를 비춥니다. 더욱이, 사람을 조명했는데 그 사람은 광선이 거울에서 반사된 것을 알지 못한다면, 그 사람은 빛이 거울이 있는 곳에서 나온다고 생각할 것입니다. 여기에서도 마찬가지입니다. 전송하는 모든 데이터는 왜곡 없이 어디에나 있을 수 있는 다른 컴퓨터로 전송됩니다.

이 기술은 프록시 서버와 다소 유사하지만 훨씬 단순하고 유연성이 떨어집니다.

구성표는 프록시를 사용할 때와 거의 동일합니다(포트 매핑이 프록시와 유사하다고 말할 수 있지만 이는 "할아버지는 손자와 같습니다"라고 말하는 것과 같습니다. 실제로 프록시는 포트 매핑과 유사합니다). ):

귀하의 컴퓨터 >>> 포트 매핑이 있는 컴퓨터 >>> 원격 서버.

포트 매핑이 필요한 이유는 무엇입니까?

  1. 조직에서 회사 프록시를 사용하는 경우 외부 메일 서버(mail.ru)에 대한 포트 매핑을 구성하여 다음을 사용할 수 있습니다. 어느회사 네트워크 내에서 메일 프로그램을 사용할 수 있으며 추가 프로그램을 설치/구성할 필요가 없습니다!
  2. 이메일 프로그램과 똑같은 방식으로 거의 모든 다른 프로그램을 구성할 수 있습니다! TCP/IP만 지원한다면 말이죠.

물론 이는 포트 매핑을 사용하는 주요 방법일 뿐입니다. 매우 유용할 다른 유형의 활동도 많이 있습니다.

포트 매핑의 이점

  1. 이 시스템은 매우 간단하며 이 기능을 구현할 수 있는 프로그램이 인터넷에 많이 있습니다.
  2. 데이터는 왜곡 없이 100% 전송되므로 100% 익명성이 보장됩니다.
  3. 이 시스템을 사용하는 경우 "soxifiers"가 필요하지 않습니다. 추가 연결 초기화가 필요하지 않으므로 포트 매퍼에 연결하는 것은 원격 컴퓨터에 연결하는 것과 같습니다.

포트 매핑의 단점

  1. 이 시스템은 유연하지 않습니다. 하나의 프록시를 통해 여러 사이트에 연결할 수 있는 프록시와 달리 하나의 포트 매핑을 통해 연결할 수 있습니다. 단 한 사람에게섬기는 사람.
  2. 각각의 새로운 포트 매핑에 대해 이 기능이 구현된 서버의 설정을 변경해야 합니다. 이는 클라이언트 컴퓨터에서는 사용할 수 없습니다.
  3. 인터넷에는 아니요무료 포트 매퍼(극단적인 제한으로 인해 하나의 포트 매핑은 하나의 서버에만 액세스할 수 있음), 따라서 컴퓨터에서 진정한 익명성을 유지하려면 포트 매핑 프로그램이 설치될 어딘가에 서버가 있어야 합니다. 이제 이 서버의 주소가 웹사이트 로그에 "빛나게" 됩니다.

포트 매핑 작업 방법

포트 매핑 작업 방식은 프록시 작업과 거의 동일하며 훨씬 더 간단합니다. 포트 매핑은 해당 포트가 구성된 컴퓨터의 별칭(추가 이름)입니다.

포트 매핑이 완료되었다고 가정해 보겠습니다.

192.168.1.255:1234 => www.mail.ru:80 (포트 80은 웹서버 포트)

그런 다음 mail.ru 웹사이트를 열려면 두 가지 방법을 사용할 수 있습니다. 브라우저 창에서 웹사이트를 여는 것입니다.

  1. http://www.mail.ru
  2. http://192.168.1.255:1234/
    (이 경우 반드시 적어주세요. http://)

참고하고 싶은 점: 만약 당신이 필요하다포트 매핑을 사용하면 두 번째 주소만 사용해야 합니다.. 즉, mail.ru에 연결할 수 없는 경우에는 내부 주소(http://192.168.1.255:1234/)만 사용해야 합니다.

로컬 컴퓨터의 포트 매핑

자신의 컴퓨터에서 포트 매핑을 수행하는 경우 일반적으로 다음을 나타냅니다.

  1. 로컬 포트 ​​- 포트 매핑을 사용하기 위해 연결해야 하는 컴퓨터의 로컬 포트입니다. 이 숫자는 1부터 65535까지 가능하며 1000보다 큰 것이 좋습니다.
  2. 원격 호스트 - 해당 컴퓨터(호스트), 어느포트 매핑을 지정합니다. 예를 들어 메일 서버 pop.mail.ru일 수 있습니다.
  3. 원격 포트 - 컴퓨터 포트, 어느쪽으로연결은 포트 매핑을 통해 이루어집니다. 메일 수신(POP3)의 경우 일반적으로 포트 110, 메일 전송(SMTP)의 경우 포트 25, 웹 서버(www...)의 경우 일반적으로 포트 80입니다.

따라서 이 경우 (포트 매핑을 설정하여) 연결해야 합니다. 아니다 mail.ru 등으로 이동하고 자신의 컴퓨터를 서버로 지정하십시오.

127.0.0.1:로컬포트

여기서 localport는 포트 매핑을 구성할 때 지정된 포트 번호입니다. 예를 들어 포트 1234일 수 있습니다.

즉, 웹사이트에서 포트 매핑을 수행한 경우 다음을 작성해야 합니다. http://127.0.0.1:1234/

메일을 설정하는 경우 메일 서버로 지정하세요. 127.0.0.1 - 메일을 받고 보내는 데 모두 사용됩니다. 그리고 이메일 클라이언트에서 포트 번호 설정(POP3 및 SMTP)을 찾아 포트 매핑 설정에 따라 변경하는 것을 잊지 마세요!

기업 경영진의 신속하고 수준 높은 의사결정은 기업 내 잘 구축된 관리회계 시스템에 달려 있습니다. 관리회계여기에서 일반적으로 인정되는 관행에 따라 이 용어의 사용은 기업의 다음 영역에서 문제를 해결하기 위해 회계 및 재무 관리 원칙을 사용하는 것을 의미합니다.

  • 비즈니스 전략 개발 및 구현;
  • 계획 및 통제 구현;
  • 자원의 효율적인 사용;
  • 운영 효율성 향상;
  • 유형 및 무형 자산의 보존;
  • 기업 및 사내 업무 프로세스 관리

어쨌든 회계 정보에 대한 액세스는 다양한 유형의 보고서를 사용하여 수행됩니다.

기업의 경제 활동에 대한 데이터를 수집하고 저장하는 것은 노동 집약적이고 비용이 많이 드는 프로세스이므로 이 정보의 효과적인 사용은 중요한 작업이자 경쟁 우위가 됩니다. 수집된 정보의 양은 정보 공개에 대한 국가 및 규제 당국의 요구 사항과 기업의 비즈니스 활동 과정에서 발생하는 최대 정보 양(재무, 기술, 통계) 사이의 절충안으로 회사 경영진에 의해 결정됩니다. .

활동 과정에서 생성된 정보를 사용하는 가장 효과적인 방법은 데이터 웨어하우스(날짜 웨어하우스)를 만드는 것입니다. 이를 기반으로 OLAP 기술을 사용하면 모든 기업 관리자가 필요한 분석적 맥락에서 데이터를 분석하기 위한 보고서를 생성할 수 있습니다. 그리고 의사결정을 위한 정보를 스스로 제공합니다.

그러나 현재 가장 일반적인 옵션은 데이터가 축적되는 정보 시스템을 생성하는 것이며, 원칙적으로 시스템 개발자가 제공하는 표준 보고서를 보완하는 맞춤형 보고서 생성기가 있습니다.

일반적으로 소프트웨어 개발자는 사용자에게 정기적으로 업데이트되는 외부(규제 기관용) 보고(회계 및 세금) 양식을 제공하고 기업에서 요구하는 모든 유형의 관리 보고서를 작성할 수 있는 가능성을 광고합니다. 그러나 생성된 보고서의 형식이 반드시 올바른 것은 아닙니다.
기업은 보고서를 올바르게 생성(작성)하는 문제에 홀로 남겨졌습니다.

기업이 국제 표준에 따라 보고를 생성해야 하는 필요성은 상황을 악화시킬 뿐입니다.

모든 경우에 있어서 보고의 핵심은 정보 시스템의 자격 증명과 보고 양식의 해당 필드를 연결해야 한다는 것입니다.

관계를 구성하기 위해 다음과 같은 옵션이 가능합니다.

  • 보고서 필드와 시스템 데이터 간의 관계 또는 대응을 설명하는 테이블 형식입니다(자동 보고서 생성을 위한 알고리즘 작성이 이어집니다).
  • 필요한 정보를 수동으로 선택합니다(보고서 자동화 기능이 전혀 없음).
  • 보고서 생성 시 상호 관계 테이블과 수동 디코딩 및 조정이 필요한 혼합 옵션입니다.

정보 회계 시스템과 보고 양식의 관계를 구성하는 첫 번째 옵션(관계를 설명하는 표를 통해)은 " 매핑".

넓은 의미에서 매핑은 데이터를 한 형식에서 다른 형식으로 변환하는 것입니다. 회계의 경우 매핑은 러시아 계정과목표 및 GAAP(IFRS) 계정과목표(또는 관리회계의 계정과목표)와 같은 다양한 계정과목표의 회계 계정 대응 테이블을 편집하는 것입니다.

예 1. 통신 조직의 혼합 버전.

대부분의 회사는 변환을 통해 IFRS와 같은 보고서를 준비합니다. 이 방법은 러시아 표준에 따라 생성된 정보를 분석하고 조정하여 IFRS를 준수하는 접근 방식을 기반으로 합니다.

보고는 매핑 테이블과 수동 조정을 사용하여 최소 4단계로 변환됩니다.

1 단계.대차대조표와 손익계산서의 구조적 변화. 그 결과 후속 조정 항목을 위한 데이터베이스를 준비하기 위해 재무제표의 개별 항목이 재그룹화되고 집계됩니다. 동시에 매핑 테이블에는 RAS에 따른 재무 보고 지표와 IFRS에 따른 중간 보고에 대한 반영이 포함됩니다.

2단계.러시아 보고와 IFRS에 따른 보고 간의 질적 차이를 제거하기 위한 조정 항목을 수행합니다. 변환 전문가가 수동으로 수행합니다.

3단계.변환된 대차대조표, 손익계산서 및 기타 형식을 기반으로 IFRS에 따른 보고 준비. 매핑 테이블에는 IFRS에 따른 중간 보고 수치와 변환 전문가가 조정한 내용에 대한 설명이 포함되어 있습니다.

4단계.보고서의 설명 부분 준비.

표 1. 러시아 계정과목표와 GAAP 계정과목표 간의 관계 예시(발췌)

투자부서(과세 대상)

투자. 출발(공제액)

평가부서

가치평가부 (공제액)

연구부서(과세)

연구부서 (공제액)

판매 VAT에 대한 VAT

부가가치세 - 서비스

단점 서비스 VAT

총 수익

총매출/수익

매출원가

투자. 출발(공제액)

기타 발생한 세금(TsP)

기타 세금 징수

거래마진(할인,케이프)

거래 마진(할인, 가산)

운송 비용 상환을 위한 공급업체 할인

운송비 구제에 대한 공급자의 할인

고정자산의 매각 및 처분

고정자산의 처분

기타자산 매각

기타자산의 처분

1차 생산

기본적인 생산

보조 생산

보충 제작물

일반제작비

일반제작비

마케팅 부서(과세 대상)

시장 출발(공제액)

마케팅 부서(비과세)

시장 출발(공제 불가)

판매 - 주요 활동

매출/수익 - 주요 활동

매출원가

총 이익

순 매출액

일반비, 판매비, 관리비

일반관리비 판매

매핑 테이블은 기업 경영 보고 생성(일반적으로 지주 회사 및 지점이 있는 회사)에도 사용됩니다.

매핑 설정의 기본은 회계 데이터를 특정 방식(회사 표준에 따라)으로 그룹화하는 것입니다.

간단히 말해서 기업 보고 라인을 생성할 때 이 라인을 생성하기 위해 자동 회계 시스템이 사용해야 하는 매출액(또는 계정 잔액(하위 계정))과 순서를 정확하게 나타냅니다.

매핑은 귀하가 설정한 규칙이며, 이에 따라 필요한 보고서가 생성됩니다. 매핑 라인을 생성하는 기술 원칙은 모든 보고 양식에서 동일하며 유일한 차이점은 내용입니다.

이와 관련하여 매핑은 자격을 갖춘 전문가에 의해 구성되어야 하며, 중요한 것은 통일된 방법론적 방식으로 구성되어야 한다는 점에 유의해야 합니다. 매핑 절차에는 꽤 많은 시간이 필요합니다.

관리 회계(회계 포함)의 기본은 계정과목표, 예산 항목 및 다양한 분석 참고서입니다.

다만, 관리계정과목표(이하 MCA)의 일부 계정은 보다 상세한 분석이 가능하므로, 관리계정과목표는 회계별 회계처리에 사용되는 표준 계정과목표와는 상당한 차이가 있으며, 다른 부분에는 보다 포괄적인 분석이 있을 수 있습니다(모두 특정 기업에 따라 다름). 분석 참고서의 구조도 다릅니다. 경영 보고서는 회계 보고서와 완전히 다른 맥락에서 회계 정보를 표시해야하기 때문입니다.

물론 실제로는 연결지표( 매핑) 경영, 세무, 회계(재무)회계는 많은 문제를 야기합니다.
그 중 일부를 살펴보겠습니다.

1. 회사의 작업 계정과목표(이하 WCA)에 대한 분석이 부족합니다.

하루 동안 만들어진 기업이 항상 장기적인 전략을 가지고 있지 않았고 주주의 이익이 항상 존중되지 않았기 때문에 이는 이해할 수 있습니다. 오늘날에는 비즈니스 문화 자체가 바뀌었습니다. 국가를 포함한 주주들은 모든 수준의 관리자가 기업을 얼마나 유능하고 능숙하게 관리하는지에 대해 점점 더 많은 관심을 보이고 있습니다.
이 문제에 대한 해결책은 회사의 기존 금전 등록기 시스템을 확장 및 보완하고 새로 도입된 계정(서브 계정)에 대한 정보를 점진적으로 축적하는 것입니다.

계정과목표를 구성하는 주요 접근 방식과 회사 통합 회계 시스템의 세 가지 구성 요소(재무, 세금, 관리)를 이해하면 재무 회계 시스템에 대한 체계적인 접근 방식에서 세 가지 기본 구성 요소를 강조할 필요성이 미리 결정됩니다. 상업 조직, 즉:

  1. 재무 회계);
  2. 세;
  3. 관리.

RPS에 대한 체계적인 접근 방식의 재무, 세금 및 관리 구성 요소에 대한 가능한 해석이 아래에 제시되어 있습니다.

재무(회계) 구성요소. RPS를 사용하면 보고일 현재 총계정원장 계정의 맥락에서 외부 재무 보고 및 설명 메모의 결과 회계 및 분석 지표를 모두(예외 없이) 생성할 수 있는 가능성이 보장되어야 합니다. 외부 회계 보고서 작성과 관련된 RPS의 회계 계정 블록은 금융 계정입니다. 차례로 금융 계정은 분석 계정과 합성 계정으로 구분됩니다. RPS의 재무 회계 하위 계정은 분석 계정과 합성 계정의 중간입니다. 또한 재무 분석 및 합성 계정과 하위 계정은 RPS 관리 구성 요소의 필수적인 부분을 나타낼 수 있습니다. 예를 들어, 금융 계정 90 "매출"의 개별 하위 계정에 반영된 데이터는 관리 결정을 내리는 데 중요합니다.

RPS의 금융 계정 그룹을 구성할 때 다음 요구 사항을 충족해야 합니다.

  1. 외부 회계 보고 항목과 금융 계정 잔액 간에 보고 항목 유형을 결정하기 위해 추가 논리 작업이 필요하지 않은 대응 관계가 설정되어야 합니다.
  2. RPS의 가능한 최소 재무 계정 세트는 외부 재무 보고 지표 구성을 기반으로 의도적으로 구성되어야 합니다.
  3. 각 외부 재무 보고 지표는 추가적인 해독이나 조정 없이 RPS를 사용하여 재무회계 데이터에서 얻어야 합니다.

세금 구성 요소.회계 시스템에서 RPS를 사용하면 Chapter의 요구 사항에 따라 세금 목적으로 과세 기준과 이익 금액을 계산하는 기능이 제공됩니다. 25 러시아 연방 세금 코드. RPS에 대한 체계적인 접근 방식의 세금 구성 요소 구현에는 다음이 포함됩니다.

  1. 재무 계정 (01 - 99) RPS를 자세히 설명하여 상업 조직의 소득세 계산을위한 과세 기준 금액에 미치는 영향을 확인하기 위해 비용 및 소득에 대한 분석 재무 및 세무 회계 조직;
  2. 세금 계정 목록 개발(예: 101-199) 이를 구현하면 재무 회계 및 재무 보고를 기반으로 세무 회계 및 세무 신고를 생성하기 위해 재무 및 세무 회계 개체의 회계 데이터 편차 기록을 유지할 수 있습니다.
  3. 보고(결과) 회계 및 분석 지표의 중복을 제거하기 위해 통합 통합 회계 보고에 대한 세금 구성 요소의 영향을 조정할 수 있는 규칙 개발.

관리 구성요소. RPS에서는 관리 내부 보고 및 관리 회계의 결과 회계 및 분석 지표를 얻기 위해 관리 계정 블록이 할당됩니다(예: 201-299). 이러한 관리 계정에서는 내부 관리 보고에 대한 사용자의 요구 사항에 따라 재무 계정 01-99에 대한 이중 입력 조정이 이루어집니다. 향후 관리 계정 201~299의 데이터는 특정 규칙을 사용할 때 금융 계정 01~99의 데이터를 보완(수정)합니다. 그러한 조치의 결과는 내부 경영 보고의 지표입니다.

RPS 형성에 대한 체계적인 접근 방식에서 관리 측면의 구현에는 다음의 개발이 포함됩니다.

  1. 회계 정책 조항(외부 및 내부), 회계 항목 인식 기준, 평가 기준을 명확히 하고 경영 보고 항목의 내용을 공개합니다.
  2. 재무 회계 데이터와 관리 회계 데이터의 편차를 기록하고 요약하는 데 필요한 단일 RPS의 관리 계정 하위 시스템
  3. 경영 보고 양식의 대체 재무 보고 구성.

또한 RPS에 대한 관리 계정 블록을 구성할 때 "대안 관리 보고 지표를 사용하여 재무 계정과 관리 계정 하위 시스템 간의 관계(매핑)" 테이블을 개발해야 합니다.

표 2. 기업 보고 양식 "잔액"(추출) 라인을 생성하기 위한 러시아 회계(재무) 회계 운영 매핑

차변 회전율

조직의 OS

OS 그룹:<все>

비유동자산에 투자
자산

바뀌지 않는다

부문:<все>

변경 없이

프로젝트 코드:<все>

펼치지 마세요

플러스로 그룹 제어에 참여

고정자산: 기타 고정자산

건설 프로젝트(p): 고정 자산 소득 유형(제3자로부터 수령)

차변 회전율

등록되지 않은 OS

OS 그룹:<все>

바뀌지 않는다

부문:<все>

변경 없이

프로젝트 코드:<все>

펼치지 마세요

플러스로 그룹 제어에 참여

고정자산: 기타 고정자산

건설 프로젝트(p): 고정 자산 소득 유형(제3자로부터 수령)

차변 회전율

조직의 MC

비유동자산에 투자

바뀌지 않는다

변경 없이

펼치지 마세요

플러스로 그룹 제어에 참여

고정 자산: 고정 수입 유형(제3자로부터 수령)

차변 회전율

MC, 앞. 임시 보유 중

계약자:<все>

비유동자산에 투자
자산

바뀌지 않는다

계약:<все>

변경 없이

프로젝트 코드:<все>

펼치지 마세요

플러스로 그룹 제어에 참여

고정자산: 기타 고정자산

건설 프로젝트(p): 영수증 유형OS(제3자로부터 받은 영수증)

차변 회전율

MC, 앞. 임시 사용을 위해

계약자:<все>

비유동자산에 투자
자산

바뀌지 않는다

계약:<все>

변경 없이

프로젝트 코드:<все>

펼치지 마세요

플러스로 그룹 제어에 참여

잔액 라인

회계 계정

하위 항목별 선택 1

정확합니다. 회계 계정

하위 항목별 선택 1

선정식

하위 콘토 2에 의한 선택

하위 콘토 2에 의한 선택

반전 기호

하위 항목별 선택 3

하위 항목별 선택 3

부가가치세 회계

하위 항목별 선택 4

하위 항목별 선택 4

확장 기준

하위 항목별 선택 5

하위 항목별 선택 5

그룹 계정 참여

BL00102 가동 (+)

가동 (+)

가동 (+)

가동 (+)

가동 (+)

가동 (+)

의심할 여지 없이, 상업 조직에서 통합 회계(재무, 세금 및 관리) 시스템을 만들고 표준 계정과목표를 기반으로 이러한 시스템에 대한 통합 작업 계정과목표를 개발하기로 한 결정은 분명합니다. 이론적으로 상업 조직의 작업 계정과목표를 구성하는 데 다음 접근 방식을 적용할 수 있습니다(세 가지 유형의 회계에 대해 계정과목표를 사용하는 경우).

  • 재무, 세무 및 관리 회계를 위한 단일 통합 계정과목표;
  • 재무 및 세무회계를 위한 통합 계정과목표, 관리회계를 위한 자율 계정과목표;
  • 재무 및 관리회계를 위한 통합 계정과목표; 세무 회계를 위한 자율 계정과목표;
  • 세금 및 관리회계를 위한 통합 계정과목표; 재무회계를 위한 자율 계정과목표;
  • 재무, 세금 및 관리 회계에 대한 자율 계정과목표입니다.

2. 참고 도서 및 분류자를 구성하는 데 따른 문제는 다음과 같습니다.

  • 디렉토리의 정보 복제;
  • 용어 디렉토리의 인코딩이 잘못되었습니다.

예를 들어, 코드와 이름을 할당하는 통일된 절차가 없는 경우가 종종 있습니다. 동일한 상대방이 디렉터리에 두 번(Romashka LLC 및 Romashka LLC, 기타 옵션 및 조합) 나열되거나 다른 이름으로(예: 전체 및 약어로 표시). 구조화되지 않은 디렉토리를 사용하는 정보시스템에서 필요한 데이터를 검색하는 것은 상당히 복잡하고 불편합니다. 또한, 참고 도서가 어수선하게 정리되어 있으면 보고에 오류가 발생합니다.

예를 들어, 보유 기업의 일부인 각 기업은 어느 정도 독립적으로 기본 기록을 유지하고 자체 디렉토리를 개발 및 업데이트합니다. 기업에서의 이러한 작업은 일반적으로 재무 부서, 마케팅 부서, 법무 부서 등 다양한 서비스에서 수행됩니다. 이를 통해 특정 기업 내에서 최적의 관리 결정을 내릴 수 있습니다. 그러나 정보의 구조화되지 않고 통일된 특성으로 인해 보유 현황을 전체적으로 이해하고 분석하는 능력은 매우 어렵습니다.

또 다른 일반적인 상황: 한 회사에서는 마케팅 부서에서 회계 부서에 판매 구조에 대한 정기적인 요청으로 인해 회계사가 필요한 정보 섹션에서 정보를 수동으로 수집해야 했습니다. 이는 영업 부서가 필수 보고서의 자동 생성에 필요한 데이터를 항상 디렉토리에 입력하지 않았기 때문입니다.

– 자동화된 회계 시스템의 일부가 호환되지 않습니다.
예를 들어 공급 부서는 Cache 프로그램에서 ITC의 등록부와 디렉토리를 유지 관리하고, SAP R3에서는 회계(재무) 및 관리 등록부와 디렉토리를 유지하고 회사 보고도 생성됩니다. 이들 프로그램의 데이터 표시 형식이 다르기 때문에 이들 사이에서 데이터를 변환하는 것이 어렵고 어떤 경우에는 직접적으로 불가능합니다.

참고서를 개발할 때 다음 원칙을 준수해야 합니다.

– 디렉토리의 세부사항 및 구조는 데이터를 신속하게 처리하고 필요한 보고서를 생성할 수 있어야 합니다.

참고서의 내용이 충분히 상세하지 않으면 필요한 정보를 얻기가 어렵습니다. 예를 들어, 연중에 마케팅 부서에서 주문한 광고 브로셔 제작 비용을 알아야 하고 그 전에 모든 마케팅 비용을 함께 고려한 경우 다음을 추가로 선택해야 합니다. 간접적인 증거(예: 인쇄소)를 기반으로 한 정보. (지주 회사 또는 회사 그룹의 경우, 디렉토리의 세부 사항은 개별 기업뿐만 아니라 전체 보유 회사의 정보를 구조화하기 위한 요구 사항에 따라 달라집니다.)

디렉토리가 매우 자세하면 정보를 채워 작업에 사용하기가 어렵습니다. 예를 들어, "현금 흐름" 디렉토리에는 수천 가지가 넘는 지불 목적이 포함될 수 있습니다. 총책임자를 위한 기본 지급에 대한 현금 흐름 보고서를 준비하는 데는 필요한 그룹화(지표 집계 또는 일련의 중복 정보에서 필요한 정보 선택)를 수행해야 하므로 많은 시간이 소요됩니다. 또한 정보를 입력할 때 사용자는 특정 결제를 어디에 포함해야 할지 알 수 없습니다. 이로 인해 필연적으로 디렉토리에서 항목이 잘못 선택되거나 결제가 "기타"로 분류되는 결과가 발생합니다. 디렉토리의 각 행에 어떤 회계 개체가 반영될 수 있는지 자세히 설명하는 것이 좋습니다.

– 디렉토리 요소의 코딩은 정보 중복을 제거하고 디렉토리 작업 속도를 높이는 데 도움이 되어야 합니다. 데이터를 인코딩하기 전에 참조 디렉토리를 저장할 기업 정보 시스템을 결정해야 합니다. 특정 코드를 사용할 수 있는 가능성은 시스템 성능에 따라 크게 달라집니다. 이러한 시스템은 동일한 디렉토리를 사용하는 다른 시스템으로 정보가 자동으로 전송되는 회계 프로그램일 수 있습니다.

– 다른 디렉터리에서 유사한 인코딩을 사용하지 않아야 합니다.
예를 들어, 마케팅 부서에서 판매를 분석할 때 구매자 그룹을 지역이 아닌 도시 및 지역별로 식별하는 경우 분석 대상 그룹이 연방 지역 코드와 일치해서는 안됩니다. 그렇지 않으면 정보를 입력할 때 오류가 발생합니다. 따라서 코드 "77"은 모스크바에 설정되고 벨고로드 지역은 기업의 이 코드 아래에 나열됩니다. 결과적으로 직원은 특정 유형의 판매를 지역이 아닌 모스크바에 귀속시킬 수 있으며 정보가 왜곡됩니다. 이 경우 다양한 길이의 코드를 생성하는 것이 좋습니다. 예를 들어 마케팅 그룹을 인코딩하려면 세 자리 숫자(벨고로드 지역 클라이언트의 경우 코드 "770")를 사용합니다.

이상적으로는디렉터리 코드는 8자를 초과할 수 없습니다. 그렇지 않으면 코드가 쉽게 구별되지 않아 데이터 입력이 어렵습니다.

– 상호 연결된 디렉터리를 생성할 때 중복을 제거해야 합니다. 디렉토리의 오류(입력의 비체계적이고 혼란스러운 특성으로 인해)를 방지하려면 디렉토리에 포함된 정보를 분석하여 개별 디렉토리에서 생성될 수 있는 데이터를 식별해야 합니다.

– 통합된 디렉터리 시스템을 개발한 후에는 무단 변경으로부터 보호할 수 있어야 합니다. 일반적으로 사용자 식별 방법을 사용하고 정보에 대한 사용자 액세스 권한을 제한함으로써 충분히 높은 보안을 달성할 수 있습니다. 대부분의 경우 디렉토리를 생성하고 유지하기 위해 회사는 디렉토리에 정보를 입력하고 수정하는 담당자를 결정하는 규정을 개발합니다.

결론적으로, 매핑을 설정하기 전에 위의 문제를 해결하는 것이 필요하다고 해야 할 것이다. 그렇지 않으면 경영 보고 생성을 거의 기대할 수 없습니다. 보고가 생성되더라도 그것이 정확할 가능성은 사실상 0입니다. 그 이유는 분명합니다:

  1. 앞에서 설명한 문제로 인해 나타나는 오류입니다.
  2. 회계 오류(방법론적 및 회계 모두). 사람들은 기록을 남깁니다. 그 점을 잊지 마세요.
  3. 다음으로, 다양한 유형의 오류에 대한 긴 목록을 제공해야 하며 그 원인은 단락 1과 2를 중첩한 결과입니다. 그러나 우리 의견으로는 이는 불필요합니다.


질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: