기타
바코드 프린트 사용방법
바코드 라이브러리 적용방법
1. 라라벨 패키지 정보
- name: milon/barcode
- version: v10.0.1
- php: ^7.3 ~ ^8.0
- 바코드 print 사용방법
controller : db에서 데이터 불러옴 ->
view : 불러온 데이터를 가져와서 DNS1D 클래스를 통해 바코드와 연동
padding, margin 등을 적용하여 바코드의 출력위치를 지정
크리스탈 레포트 사용방법
MacOS에서 크리스탈 레포트 사용 및 윈도우 서버 접근 방법
1. 크리스탈 레포트 개요
크리스탈 레포트(Crystal Reports)는 데이터를 자동으로 가져와 PDF, Excel, Word 등의 보고서를 생성 및 배포하는 역할을 합니다 일반적으로 기업용 ERP, 회계 시스템, CRM 등과 연동하여 사용되며, 이러한 이유로 윈도우 서버 환경에서 운영됩니다
2. MacOS에서 윈도우 서버 접근 방법
MacOS에서 윈도우 서버에서 실행 중인 크리스탈 레포트에 접근하려면 원격 데스크톱 연결을 사용해야 합니다
2.1 Microsoft 원격 데스크톱 앱 설치
MacOS에서는 RDP(Remote Desktop Protocol) 파일을 실행하여 원격 서버에 접속할 수 있으며, 이를 위해 Microsoft의 원격 데스크톱 앱이 필요합니다
-
앱 다운로드 경로:
Microsoft Remote Desktop (App Store)
2.2 원격 데스크톱 연결 방법
-
Microsoft Remote Desktop 앱을 실행합니다.
-
'Import from RDP File' 또는 **'새 연결 추가'**를 선택합니다.
-
제공받은 RDP 파일을 불러오거나 수동으로 서버 정보를 입력합니다.
-
Username(사용자명)과 Password(비밀번호)를 입력하여 로그인합니다.
-
원격 데스크톱을 통해 윈도우 서버에 접속하면 크리스탈 레포트를 사용할 수 있습니다.
3. 크리스탈 레포트 실행
다음은 윈도우 서버 접속 후 .rpt
파일을 열어 크리스탈 리포트에서 보고서를 편집할 때, 자주 사용하는 기능들 입니다
🔹 1. 텍스트 상자 (Text Box)
📌 역할:
- 고정된 텍스트(라벨)를 추가할 때 사용합니다
- 예:
"사업자등록번호"
,"전화번호"
,"고객명"
같은 문구
🔹 2. 라인(Line) 생성 도구
📌 역할:
- 보고서에서 표(테이블)와 같은 구조를 만들 때 가로, 세로 선(Line)을 추가하는 기능입니다
- 예: 표의 구분선을 추가하여 가독성을 높일 때 사용합니다
🔹 3. DB 필드 (Database Fields) - 동적 데이터 바인딩
📌 역할:
- DB에서 가져온 데이터를 자동으로 보고서에 반영하는 역할입니다
- 예:
{c1}
→"사업자등록번호"
,{c2}
→"전화번호"
등의 값을 동적으로 불러옴
4. 크리스탈 리포트에서 합계 자동 정렬 방법
📌 목표: ex) 연말정산에서 데이터 한줄 한줄 추가 될때 합계가 맨 아래에 위치하는 방법
- DB에서 불러온 데이터(Details)가 동적으로 추가될 때, 맨 아래의 "합계"가 자동으로 내려가도록 설정
- Header, Details, Footer에서 같은 변수 이름을 사용할 때,
position
값을 이용해 구분 Section Expert
의Suppress
기능을 활용하여 필요한 섹션만 표시되도록 설정
1. 동적 로우 추가 시 Footer(합계) 자동 위치 조정
📌 원리:
- Details(바디)에서 데이터가 많아질수록 Report Footer(합계) 섹션이 자동으로 아래로 내려감
- Report Footer를 사용
📌 설정 방법:
1️⃣ "Section Expert"에서 Report Footer 설정 조정
2️⃣ Suppress 조건 추가하여 Report Footer가 마지막에만 나오도록 설정
📌 예상 결과:
No | 방문일 | 현금 | 카드 | 외상금액 | 합계 |
---|---|---|---|---|---|
1 | 2024-11-10 | 10,000 | 50,000 | 0 | 60,000 |
2 | 2024-11-11 | 5,000 | 40,000 | 0 | 45,000 |
3 | 2024-11-12 | 8,000 | 35,000 | 0 | 43,000 |
합계 | 23,000 | 125,000 | 0 | 148,000 |
✔ 데이터가 많아질수록 합계가 자동으로 맨 아래로 정렬됨
5. 크리스탈 리포트에서 Database Fields를 연동하여 데이터 치환하는 방법
📌 목표:
➡ 오른쪽 Database Fields
에서 불러온 데이터를 원하는 위치에 배치하여 동적으로 치환하기
1. Database Fields
에서 필요한 데이터 가져오기
📌 설정 방법:
1️⃣ 오른쪽 Field Explorer
창에서 "Database Fields"
선택
2️⃣ 필요한 데이터 필드를 찾음 (예: {c1}
, {c2}
, {c3}
등)
3️⃣ 각 필드를 드래그하여 보고서(Report) 디자인의 적절한 위치에 배치
2. 데이터 필드를 Header, Details, Footer에 적절히 배치하기
📌 배치 방법:
✔ Header(헤더) 섹션:
{position} = "head-foot"
데이터를 사용하여 회사명, 고객정보 등 배치
✔ Details(바디) 섹션:{position} = "body"
데이터를 사용하여 반복되는 상세 데이터 배치
✔ Footer(합계) 섹션:{position} = "head-foot"
데이터를 사용하여 총합 표시
3. 예제: Database Fields 배치하기
📝 Report 디자인에서 데이터 배치 예시
위치 | Database Fields (예제) | 설명 |
---|---|---|
Header | {c1} (사업자번호) |
보고서 상단에 고정 |
Header | {c2} (전화번호) |
보고서 상단에 고정 |
Details | {c3} (방문일) |
데이터가 동적으로 반복됨 |
Details | {c4} (현금) |
데이터가 동적으로 반복됨 |
Details | {c5} (카드) |
데이터가 동적으로 반복됨 |
Details | {c6} (합계) |
데이터가 동적으로 반복됨 |
Footer | {c7} (총합계) |
마지막 행 아래에 위치 |
✔ 이제 데이터가 동적으로 추가될 때, 각 위치에 맞는 값이 자동으로 채워짐
✔ 합계도 마지막 행 아래에 자동으로 정렬됨
프론트에서 크리스탈레포트 연동방법
Crystal Report + Front 연동방법
1. 아래와 같이 이미 작업된 양식의 rpt파일이 존재한다면 해당 rpt파일에서 필요한 필드들을 확인합니다.
1-1 위와 같이 작성된 rpt 파일이 존재하지 않는다면 C:\ReCrystallizeServer\Reports\standard 경로로 이동후 필요한 양식과 가장 흡사한 양식을 찾아 복사해줍니다.
2. 확인한 필드를 토대로 쿼리를 작성합니다.
-- opticalpos::federated/crystal/adjustment/subqry/insert1.sql
SELECT
UNIX_TIMESTAMP() as created_on,
2 as list_token,
'head-foot' as position,
-- 발행매장
tax_no as c1, -- 사업자등록번호
tel_no as c2, -- 전화번호
branch_name as c3, -- 상호명
branch_manager as c4, -- 대표자
-- 고객정보
company_no as c5, -- 고객번호
company_name as c6, -- 고객명
0 as d1, -- dummy
0 as d2, -- dummy
0 as d3, -- dummy
0 as d4, -- dummy
0 as d5, -- dummy
0 as d6, -- dummy
0 as d7, -- dummy
0 as d8, -- dummy
0 as d9, -- dummy
0 as d10 -- dummy
from dbr_company as mx
inner join dbr_sorder on mx.id = dbr_sorder.buyer_id
inner join dbr_branch on dbr_sorder.branch_id = dbr_branch.id
-- @where
group by mx.id
-- @order
-- opticalpos::federated/crystal/adjustment/subqry/insert2.sql
SELECT
UNIX_TIMESTAMP() as created_on,
2 as list_token,
'body' as position,
sorder_date as c1, -- 주문일자
ccard_amt as c2, -- 카드 사용금액
cash_amt as c3, -- 현금 사용금액
coupon_amt as c4, -- 쿠폰 사용금액
reward_use_amt as c5, -- 적립금 사용금액
discount_amt as c6, -- 할인금 사용금액
sum(sorder_sum) - ccard_amt - cash_amt - coupon_amt - reward_use_amt as c7, -- 외상 금액
sum(ccard_amt) as c8, -- 해당일의 총 카드 사용금액
sum(cash_amt) as c9, -- 해당일의 총 현금 사용금액
sum(sorder_sum) as c10, -- 해당일의 총 사용금액
sum(sum(sorder_sum)) OVER () as c11, -- 해당고객의 토탈 사용금액
0 as d1, -- dummy
0 as d2, -- dummy
0 as d3, -- dummy
0 as d4, -- dummy
0 as d5, -- dummy
0 as d6, -- dummy
0 as d7, -- dummy
0 as d8, -- dummy
0 as d9, -- dummy
0 as d10 -- dummy
from
dbr_sorder
inner join
( select
buyer_id, dbr_company.id as id
from
dbr_company
inner join dbr_sorder on dbr_company.id = dbr_sorder.buyer_id
group by buyer_id
) as mx
on mx.buyer_id = dbr_sorder.buyer_id
inner join dbr_sorder_bd on dbr_sorder.id = dbr_sorder_bd.sorder_id
-- @where
group by sorder_no
-- HAVING SUM(sorder_sum) - ccard_amt - cash_amt - coupon_amt - reward_use_amt <> SUM(sorder_sum)
-- @order
"PrintVars": {
"QueryName": "opticalpos::federated/crystal/adjustment",
"ReportPath": "standard/adjustment/adjustment.rpt",
"ExportFmt": "PDF",
"ServerPrinter": "",
"CustomCode": "adjustment"
},
QueryName : 위에서 작성했던 query를 입력해줍니다.
ReportPath : winodw server에서 rpt 파일을 저장했던 위치입니다.
ExportFmt : 레포트 출력시 파일의 형식입니다.
ServerPrinter : ""
CustomCode : 해당 커스텀을 구분할 수 있는 code입니다.
4. env(설정파일)에 REPORT_SERVER_URL 변수를 확인합니다.