Computer >> 컴퓨터 >  >> 소프트웨어 >> Office

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

Microsoft Access는 연결된 테이블 전반에 걸친 복잡한 계산을 자동화할 수 있는 강력한 기능을 제공합니다. 이를 활용하면 수작업 입력을 줄이고 오류를 최소화하며, 데이터베이스를 실시간으로 일관된 상태로 유지할 수 있습니다. 계산 필드(Calculated Field)를 사용하면 사용자가 합계, 할인액, 지급 기한, 이익 등을 일일이 입력할 필요 없이, Access가 기존 필드 값을 기반으로 자동으로 계산해 줍니다.

이번 튜토리얼에서는 Access 테이블에 계산 필드를 추가하여 테이블 간 연산을 자동으로 처리하는 방법을 단계별로 살펴보겠습니다. 관련 테이블의 값을 자동으로 불러와 계산하는 계산 필드를 직접 만들어 보세요.

다만 고급 데이터베이스에서는 계산 필드를 무분별하게 사용해서는 안 됩니다. 가장 중요한 원칙은 다음과 같습니다.

  • 같은 레코드 내 다른 필드에 의존하는 값에는 계산 필드를 사용합니다.
  • 연결된 테이블이나 여러 레코드에 걸친 계산에는 쿼리를 사용합니다.

1단계: 샘플 관련 테이블 및 관계 설정

테이블을 넘나드는 계산 필드는 견고한 관계(Relationship) 설정 위에서만 안정적으로 동작합니다. 식(Expression)을 작성하기 전에 반드시 먼저 관계를 구성하세요.

관계 만들기:

  • 데이터베이스 도구(Database Tools) 탭으로 이동 >> 관계(Relationships) 선택
  • 테이블을 추가합니다.
    • Customers 테이블의 CustomerID를 Orders 테이블의 CustomerID로 끌어다 놓습니다.
    • Products 테이블의 ProductID를 OrderDetails 테이블의 ProductID로 끌어다 놓습니다.
    • Orders 테이블의 OrderID를 OrderDetails 테이블의 OrderID로 끌어다 놓습니다.
  • 참조 무결성 적용(Enforce Referential Integrity) 옵션을 활성화합니다.
  • 확인(OK)을 클릭합니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

이렇게 설정하면 주문 소계(주문 상세 합계)처럼 테이블 간 연결 계산이 가능해집니다. 이러한 연결이 있어야 테이블 간 조회가 신뢰할 수 있게 됩니다. 관계가 없으면 참조 대상 레코드가 삭제되거나 불일치할 때 계산 필드가 아무 경고 없이 Null을 반환할 수 있습니다.

2단계: 테이블에 간단한 계산 필드 추가

  • 디자인 보기(Design View)에서 OrderDetails 테이블을 엽니다.
  • 첫 번째 빈 행에 다음과 같이 입력합니다.
    • 필드 이름(Field Name): LineTotal
    • 데이터 형식(Data Type): 계산됨(Calculated)
  • Access가 식 작성기(Expression Builder)를 엽니다.
  • 수식을 입력합니다.
  • 또는 시각적으로 작성할 수도 있습니다. OrderDetails 테이블을 확장 >> QuantityUnitPrice를 더블클릭한 후 *(곱하기) 연산자를 추가합니다.
  • 식이 반환하는 값에 맞게 결과 형식(Result Type)(통화, 숫자, 텍스트 등)을 설정합니다.
    • 필드 속성(Field Properties) 확장 >> 통화(Currency) 선택
  • 테이블을 저장(Save)합니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

할인 포함 합계:

[Quantity] * [UnitPrice] * (1 - [DiscountRate])

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

이제 Access는 모든 레코드에 대해 LineTotal을 자동으로 계산합니다. VBA 코드도, 수동 업데이트도 필요하지 않습니다. 데이터시트 보기에서 Quantity나 UnitPrice를 추가하거나 수정할 때마다 LineTotal이 즉시 갱신됩니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

3단계: 테이블 간 연산 처리 — 쿼리에서 도메인 집계 함수 활용

테이블의 계산 필드에서는 다른 테이블을 직접 참조할 수 없습니다. 이 경우 쿼리 또는 VBA를 사용해야 합니다. 도메인 집계 함수(Domain Aggregate Function)는 다른 테이블이나 쿼리에서 계산된 값을 식으로 불러오는 Access의 기본 메커니즘입니다. 특히 유용한 함수들은 다음과 같습니다.

함수용도
DLookup()다른 테이블에서 단일 값을 반환합니다.
DSum()조건에 맞는 다른 테이블의 값들을 합산합니다.
DCount()다른 테이블에서 조건에 맞는 레코드 수를 셉니다.
DAvg()다른 테이블 값들의 평균을 구합니다.
DMax() / DMin()다른 테이블에서 최댓값 또는 최솟값을 반환합니다.

쿼리 만들기:

  • 만들기(Create) 탭으로 이동 >> SQL 쿼리(SQL Query) 선택
  • 테이블 추가(Add Tables) 창에서 Orders와 Customers 테이블을 추가합니다.
  • 필드를 추가합니다: CustomerName, OrderID
  • 빈 필드 열에 Total이라는 이름의 계산 필드를 만듭니다.
  • 다음 식을 삽입합니다:
Total: DSum("[LineTotal]","OrderDetails","[OrderID]=" & [OrderID])
  • DSum()은 해당 OrderID와 일치하는 LineTotal의 합계를 구합니다(테이블 간에 동작하는 도메인 집계 함수).
  • qryOrderSummary라는 이름으로 저장합니다.
  • 실행(Run)을 클릭합니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

쿼리는 실행할 때마다 다시 계산됩니다. 이 쿼리를 폼이나 보고서의 레코드 원본(Record Source)으로 사용하거나, 추가 계산의 기반으로 활용하세요.

통화 형식으로 서식 지정:

Total: CCur(DSum("[LineTotal]","OrderDetails","[OrderID]=" & [Orders].[OrderID]))

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

4단계: 여러 테이블을 결합한 계산 쿼리를 계산 원본으로 구축

더 복잡한 시나리오, 예컨대 한 테이블의 고객 등급과 다른 테이블의 제품 단가를 조합해 할인 적용 합계를 계산해야 하는 경우에는, 관련된 모든 테이블을 조인하는 기본 쿼리를 만든 뒤 그 쿼리를 계산 필드나 폼에서 참조하는 것이 좋습니다.

단계:

  • 만들기(Create) 탭으로 이동 >> SQL 쿼리(SQL Query) 선택
  • Orders, Products, OrderDetails 테이블을 쿼리에 추가합니다.
  • 필드를 추가합니다: OrderID, ProductName
  • 빈 필드 셀에 계산 열을 추가합니다:
Profit: [DiscountedTotal] - [CostPrice]
  • 쿼리를 qryOrderProfit이라는 이름으로 저장합니다.
  • 실행(Run)을 클릭합니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

이제 모든 주문에 대한 제품명과 이익 보고서가 완성되었습니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

이제 어떤 폼, 보고서, 하위 계산 필드든 DLookup() 또는 qryOrderProfit을 대상으로 하는 하위 쿼리를 사용해 완전히 계산된 값을 얻을 수 있습니다. 모두 테이블 간에 연결되어 자동으로 동작합니다.

5단계: 데이터 매크로로 업데이트 자동화

계산 결과를 단순히 화면에 표시하는 것이 아니라 저장해야 하는 경우, 예를 들어 OrderDetails 레코드가 변경될 때마다 계산된 합계를 Orders 테이블에 기록해야 한다면, 자식 테이블에 데이터 매크로(Data Macro)를 연결하세요.

Orders 테이블에 Total 필드 추가:

  • 먼저 디자인 보기(Design View)에서 Orders 테이블을 엽니다.
    • 필드 이름: Total
    • 데이터 형식: 통화(Currency)

이 필드는 반드시 계산 필드가 아닌 일반 통화 필드여야 합니다.

설정:

  • 디자인 보기(Design View)에서 OrderDetails를 엽니다.
  • 테이블 도구(Table Tools) 탭으로 이동 >> 테이블(Table) 탭 선택 >> 삽입 후(After Insert) / 업데이트 후(After Update) 선택

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

  • 매크로 편집기에서 SetFieldLookupRecord 작업을 사용합니다.
  • LookupRecord를 선택합니다.
레코드 조회 위치(Look Up A Record In): Orders
조건(Where Condition): [Orders].[OrderID] = [OrderDetails].[OrderID]
  • EditRecord 선택 >> SetField 선택
이름(Name): [Orders].[Total]
값(Value): DSum("[LineTotal]","OrderDetails","[OrderID]=" & [OrderID])
  • 저장(Save)을 클릭합니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

이 매크로는 OrderDetails에 레코드가 삽입되거나 수정될 때마다 자동으로 실행되며, 다시 계산된 합계를 부모 테이블인 Orders에 반영합니다. 완전히 자동화되어 있으며 VBA가 전혀 필요하지 않습니다.

업데이트 후(After Update)에도 동일하게 반복:

삽입 후(After Insert) 매크로는 새 상세 행이 추가될 때만 합계를 갱신합니다. 사용자가 Quantity, UnitPrice 또는 DiscountRate를 변경하면 합계 역시 갱신되어야 합니다.

동일한 매크로를 추가합니다:

레코드 조회 위치: Orders
조건: [Orders].[OrderID]=[OrderDetails].[OrderID]
EditRecord
SetField
이름: [Orders].[Total]
값: DSum("[LineTotal]","OrderDetails","[OrderID]=" & [OrderDetails].[OrderID])
  • 저장(Save)합니다.

이제 OrderDetails에 레코드가 삽입되거나 수정될 때마다 Access가 자동으로 주문 합계를 다시 계산하여 Orders 테이블의 해당 레코드에 저장합니다.

Access 데이터베이스 자동화: 테이블 간 정확한 자동 계산을 위한 계산 필드 추가 방법

6단계: 계산 결과 표시 및 활용

  • 데이터시트 보기에서: 계산 필드가 실시간으로 표시되고 갱신됩니다.
  • 폼/보고서에서: 폼이나 보고서를 쿼리(qryOrderSummary)를 기반으로 만들면 완전한 테이블 간 결과를 얻을 수 있습니다. 비연결(unbound) 텍스트 상자에 식을 넣어 활용할 수도 있습니다.
  • 필터링/정렬: 쿼리 조건이나 정렬에 계산 필드를 사용할 수 있습니다.

팁: 나중에 테이블의 계산 필드를 편집하려면:

  • 데이터시트 보기: 해당 열(Column) 선택 >> 필드(Fields) 탭 선택 >> 식(Expression) 수정
  • 또는 디자인 보기(Design View)로 돌아가서 >> 속성(Properties) 선택 >> 식(Expression) 선택

모범 사례와 성능 고려 사항

  • 테이블 계산 필드보다 쿼리 우선: 여러 테이블이 관련되거나 집계가 필요하거나 향후 변경 가능성이 있는 경우에는 쿼리를 사용하세요. 쿼리는 이식성(예: SQL Server로의 전환)과 유연성이 더 뛰어납니다.
  • 계산 결과 저장은 피하기: 성능상 꼭 필요한 경우(예: 실시간 합계 계산이 느린 초대형 데이터셋)가 아니라면 계산 결과를 저장하지 말고, 쿼리에서 동적으로 재계산하세요.
  • 정규화(Normalization): 원본 입력 데이터만 저장하고, 출력값은 동적으로 계산합니다.
  • 테스트: 변경 후에는 샘플 데이터로 반드시 검증하세요. 특히 관계를 추가한 후에는 더욱 그렇습니다.
  • 성능: 계산 필드가 너무 많거나 큰 테이블에서 복잡한 DSum() 호출이 많으면 속도가 느려질 수 있습니다. 외래 키(Foreign Key)에 인덱스를 생성하세요.
  • 제약 사항 요약:
    • 테이블 계산 필드의 식에는 다른 테이블의 필드를 직접 사용할 수 없습니다.
    • 테이블 계산 필드에서 사용할 수 있는 함수가 제한적입니다(VBA 수준의 기능이 필요하면 쿼리를 사용하세요).
    • 결과는 읽기 전용입니다.
  • 확장 팁: 매우 고급적인 요건이 있다면 로직을 SQL 뷰 또는 SQL Server 같은 백엔드로 옮기는 것을 고려하세요. 컴퓨티드 열(Computed Column)이 더 강력한 기능을 제공합니다.

흔한 문제점과 문제 해결

  • #Error 또는 #Name? 오류: 필드 이름이 대괄호 []로 묶여 있는지, 데이터 형식이 일치하는지, 관계가 활성화되어 있는지 확인하세요.
  • 순환 참조(Circular Reference): 계산 필드가 자기 자신을 참조하거나 순환 고리를 만들지 않도록 주의하세요.
  • 데이터 형식 불일치: 결과 형식(Result Type)을 명시적으로 설정하세요(예: 금액 필드에는 통화).
  • 테이블 간 참조 실패: 해당 로직을 조인이 포함된 쿼리로 옮기거나 DSum()을 사용하세요.
  • 연결 테이블(예: SharePoint 또는 다른 데이터베이스)을 사용하는 경우 계산 필드에 행 제한이나 새로 고침 문제가 발생할 수 있습니다.

결론

위 단계를 따르면 Access 테이블에 계산 필드를 추가하여 테이블 간 연산을 자동으로 처리할 수 있습니다. 계산 필드는 Microsoft Access에서 행 단위 계산을 자동화하는 데 유용하며, 라인별 합계, 할인액, 지급 기한, 주문 라인당 이익 같은 값을 처리하는 데 적합합니다. 한편 고급 테이블 간 연산에는 쿼리가 올바른 도구입니다. 쿼리는 테이블 간 관계를 따라가며 주문 합계, 고객별 매출 합계, 재고 잔량, 이익 요약 등을 계산할 수 있습니다. Access에서 계산 필드와 테이블 간 연산을 완전히 익히면 정적인 데이터 저장소를 스스로 유지·관리하는 살아있는 시스템으로 탈바꿈시킬 수 있습니다.


무료 고급 Excel 연습 문제와 해답을 받아보세요!