Aspnetcore: Asp.Net Core๋ณด๊ณ  (SSRS)

์— ๋งŒ๋“  2016๋…„ 06์›” 02์ผ  ยท  269์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/aspnetcore

ASP.NET Core ์•ฑ์—์„œ ์ž‘์—… ์ค‘์ด๋ฉฐ SSRS ๋ณด๊ณ ์„œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "Microsoft.Reporting.WebForm"์ด ์—†์œผ๋ฉด ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ASP.NET Core์—์„œ ์›น์— SSRS ๋ณด๊ณ ์„œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

External

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ฑฐ์˜ 2 ๋…„. Core 2.0์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SSRS ํŒ€, ์ผ์–ด๋‚˜.

๋ชจ๋“  269 ๋Œ“๊ธ€

Core๊ฐ€ ์—ฌ์ „ํžˆ RC (์›”๋ง๊นŒ์ง€ RTM)์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SSRS ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํ–ฅํ›„ 6 ๊ฐœ์›” ๋‚ด์— ๊ณ„ํš๋˜์ง€๋Š” ์•Š์ง€๋งŒ ํŒ€์˜ ์ผ์›์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ•ด๋‹น ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๋ณด๊ณ ์„œ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ข€ ๋” "ํ†ตํ•ฉ ๋œ"๊ฒƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒจํ‚ค์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/ilich/MvcReportViewer

https://github.com/ilich/MvcReportViewer/issues/121 ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํ†ตํ•ฉ์— ๊ด€์‹ฌ์ด ์žˆ์ง€๋งŒ ์•„์ง๊นŒ์ง€๋Š” ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

dotnet ๋ฐ ASP.net ํ•ต์‹ฌ ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ๊ฐ€ ์ด์ „์˜ ๋ชจ๋“  ๋ฐœํ‘œ์—์„œ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์นจ๋ฌตํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ฐ™๋‹ค
[๋ณด๊ณ ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ฉฐ html ๋ฐ print css ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.]
ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ssrs rdlc ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์€ erp๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ CSS ์ ‘๊ทผ ๋ฐฉ์‹์€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ €๋ณด๊ณ ์—์„œ ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, ์ง€๋‚œ์ฃผ ๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ๋Š” ์ˆœ์ˆ˜ํ•œ html5 ๋ทฐ์–ด๊ฐ€ ํฌํ•จ ๋œ ssrs 2016์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๋ทฐ์–ด๋Š” ActiveX ์„ค์น˜์˜ ํ•„์š”์„ฑ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. [๋น„ IE ๋ธŒ๋ผ์šฐ์ €์—์„œ ssrs๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๋‹จ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค]
ssrs 2016 ๋ทฐ์–ด๋Š” asp.net ์ฝ”์–ด ์—์ฝ” ์‹œ์Šคํ…œ์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ asp.net ํ•ต์‹ฌ ์ง€์›์— ๋Œ€ํ•œ ๊ณต์‹ ์„ฑ๋ช…์€ ์„ ์–ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

System.Drawing์— ์˜ํ•ด ๋ชจ๋‘ ์ฐจ๋‹จ๋ฉ๋‹ˆ๊นŒ ?? itextsharp์กฐ์ฐจ๋„ ์ง€๊ธˆ๊นŒ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
System.Drawing์ด๋ผ๋ฉด System.Drawing์— ๋Œ€ํ•œ ์™„์ „ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ตฌํ˜„์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํ˜„์žฌ Windows ๊ฐœ๋ฐœ์ž์˜ ์ฑ„ํƒ์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด [linux ๋ฐ OSX] ์ด์ „์— ์ ์–ด๋„ Windows ๊ตฌํ˜„์„ ์™„๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ์„ ํ†ตํ•ด ํŒ€์ด asp.net ์ฝ”์–ด ๋‚ด์—์„œ ssrs๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์žฌ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ ํ•œ MvcReportViewer์™€ ๊ด€๋ จํ•˜์—ฌ (์›นํผ ๋ทฐ์–ด๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค) ๊ณผ๊ฑฐ์— ๋งŽ์€ mvc ๊ฐœ๋ฐœ์ž๊ฐ€ mvc1์—์„œ mvc5๊นŒ์ง€์˜ mvc ๋ณด๊ณ ์„œ ๋ทฐ์–ด ๋ถ€์กฑ์„ ๊ทน๋ณตํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. [๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ilich] ssrs๋Š” ์ผ๋ฅ˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹ˆ์—ˆ๊ณ  ์‚ฌ๋žŒ๋“ค์€ pre-core mvc์—์„œ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ์œ ์ง€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํ•œ ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„,
์ด์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์ด ๋ฌธ์ œ๋ฅผ ๋™๋ฃŒ์—๊ฒŒ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค.
์ด๊ฒƒ์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ํŒ€์ด ๋ฌด์–ธ๊ฐ€๋ฅผํ•˜๋„๋ก ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ ddddddddeee22211 V1์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” SSRS ์ง€์›์ด ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SSRS์— ๋Œ€ํ•œ ์ง€์›์€ .NET ํŒ€์ด ์•„๋‹Œ SSRS ํŒ€์—์„œ ์ œ๊ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ง RC๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— V1์—์„œ๋Š” ์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์›น ์–‘์‹ ๋ฒ„์ „ ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋„ค. ์˜ค๋ž˜ ๋˜์—ˆ๊ตฐ์š”. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ ์ž‘๋™ํ•˜๊ณ  ์ง€์›๋ฉ๋‹ˆ๋‹ค.

X-Plat ๋ณด๊ณ ์„œ๊ฐ€ ํ•„์š”ํ•˜๋ฉด Chartist ๊ฐ™์€ ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ์ฐจํŠธ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์‡„ ๋ชฉ์  ๋ฐ ๋ถ์„ ์œ„ํ•ด CSS ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ธ์‡„ ํ•  ์ˆ˜์žˆ๋Š” ๋ณด๊ณ ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๊ด€์ ์—์„œ ๊ทธ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋Š” ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๊ฐœ๋ฐœ ์ž‘์—…์ด ๋ณด๋ฅ˜๋˜๊ณ ๋ณด๊ณ  ์ž‘์—…์ด ์ผ์ƒ์ ์ธ ์ž‘์—…์ด๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์— ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ๋Š” ssrs ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ asp.net ์ฝ”์–ด์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€์—†๋Š” BI (๋น„์ฆˆ๋‹ˆ์Šค ์ธํ…”๋ฆฌ์ „์Šค) ํŒ€์— ๋ณด๊ณ ์„œ ์ž‘์„ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชฉ์ ์€ asp.net ์ฝ”์–ด ์—์ฝ” ์‹œ์Šคํ…œ ๋‚ด์—์„œ ssrs ์œ„์น˜๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” mvc1์—์„œ mvc5๊นŒ์ง€ ๋ฌด์‹œ๋˜๋Š” ๊ฒฝ์šฐ. ssrs ํŒ€์€ microsoft ๋‚ด์— ์žˆ์œผ๋ฉฐ asp.net ํ•ต์‹ฌ ํŒ€์€ ๊ทธ๋“ค๊ณผ ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋ฅผ ๋ฏธ์น˜๊ฒŒ ๋งŒ๋“  ๊ฒƒ์€ ์ง€๋‚œ์ฃผ์— asp.net ์ฝ”์–ด์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ณ  ssrs 2016 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ๋ณด์•˜์„ ๋•Œ์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— asp.net core ๋‚ด์—์„œ azure์— ๋Œ€ํ•œ ์ง€์†์ ์ธ ์ง€์›์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ssrs์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด์ „ mvc 5์—์„œ์™€ ๊ฐ™์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์›น ์–‘์‹ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์กฐ์–ธ์€ ํ•ต์‹ฌ ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ์˜ ์ฑ„ํƒ ์†๋„๋ฅผ ๋Šฆ์ถ”๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ง€์› ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ง„์ˆ ์ด ์žˆ์œผ๋ฉด ์ด์— ๋Œ€ํ•œ ์ „๋žต์  ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chatist ํŒ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ๋‹น์‹ ์ด ๋‚˜์˜ ๊ด€์ ์„ ์ดํ•ดํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@ ddddddddeee22211 ์•„ ... ๊ทธ๋Ÿผ ๋Œ€๋‹ต ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ SSRS ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ASP.NET์—์„œ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ WebForms์ž…๋‹ˆ๋‹ค.

์ „๋žต์  ์œ„์น˜๋ฅผ ์›ํ•˜๊ฑฐ๋‚˜ ์ง€์›ํ•  ๊ฒฝ์šฐ MS ์ง์›์˜ ๋‹ต๋ณ€์„ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

/ cc @coolcsh ํ•  ์ˆ˜

SSRS ํŒ€์—์„œ๋Š” ASP.NET WebForms์˜ ์ œํ•œ ์‚ฌํ•ญ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋ณด๊ณ ์„œ ๋ทฐ์–ด ์ปจํŠธ๋กค์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์˜ต์…˜์„ ์ ๊ทน์ ์œผ๋กœ ์กฐ์‚ฌํ•˜๊ณ  ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ

๋ฟก ๋นต๋€จ

๋‹ต์žฅ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์šฐ๋ฆฌ๋Š” MVC ์ดํ›„ ๋Œ€์•ˆ์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. : stuck_out_tongue_winking_eye :

๊ทธ๊ฒŒ ๋‚ด ํ•˜๋ฃจ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. [~ ํ•ดํ”ผ ์—”๋”ฉ ~]
๋ชจ๋“  ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค @jtarquino , @MaximRouiller .

๋ฟก ๋นต๋€จ
๊ทธ๊ฑฐ ์ข‹์„ ๊ฑฐ ๊ฐ™์•„ :-)

Report Viewer Control์— ๋Œ€ํ•œ "์ƒˆ ์˜ต์…˜"์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ์ถœ์‹œ ํ• ์‹œ๊ธฐ์— ๋Œ€ํ•ด ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
(์ด์— ๋Œ€ํ•œ ๋กœ๋“œ๋งต / ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?)

Br.
๋ณด

์•ˆํƒ€๊น๊ฒŒ๋„ ํ˜„์žฌ ๊ณต์œ  ํ•  ์ผ์ •์ด ์—†์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž ์ฝ˜์†”์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋ช…๋ น ์ฐฝ์— ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

PM> ํŒจํ‚ค์ง€ ์„ค์น˜ ReportViewerForMvc
๋‚˜๋Š” ์›น ์–‘์‹์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฝค ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

untitled

์•ˆ๋…•ํ•˜์„ธ์š”.
๋‹ค์‹œ ๋ฐœ์ƒ ์˜ค๋ฅ˜ " ์ข…์†์„ฑ ReportViewerForMvc๊ฐ€ ํ”„๋ ˆ์ž„ ์›Œํฌ .NetCoreapp๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "
๋ฉ”๋ชจ:
ASP.NET Core ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…

@jtarquino ํ•‘์— ๋Œ€ํ•ด. ๋” ๋งŽ์€ ๊ด€์‹ฌ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค : https://github.com/aspnet/Mvc/issues/5332

@jtarquino BTW ์ œ ํŒ€๊ณผ ํ† ๋ก ์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ €์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด ์ฃผ์‹œ๋ฉด ์ฑ„ํŒ… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค, ์ข‹์•„! ๊ณต์ด ๊ตด๋Ÿฌ ์š”! ๐Ÿ˜€

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” SSRS์— ๋‚ด์žฅ ๋œ ReportExecutionService.asmx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๊ณ ์„œ ๋ทฐ์–ด ์ปจํŠธ๋กค์˜ ์‚ฌ์šฉ์ž ์ง€์ • ํฌํŠธ ์ž‘์„ฑ์„ ๋งˆ์ณค์œผ๋ฉฐ ASP.NET MVC๋ฅผ ๋Œ€์ƒ์œผ๋กœํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ .NetCore & MVC๋กœ ์ด์‹ํ•˜๋„๋ก ์ œ์•ˆ ํ–ˆ์œผ๋ฏ€๋กœ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด๋ณด๊ณ  ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ์•Œ๋ ค์ฃผ์„ธ์š” : https://github.com/alanjuden/MvcReportViewer

์•จ๋Ÿฐ

ASP Netcore MVC์˜ ReportViewer๊ฐ€ ์—ฌ๊ธฐ์„œ ๋…ผ์˜ ๋œ ์ง€ ์•ฝ 3 ๊ฐœ์›”์ด ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” WinForms์—์„œ netcore๋กœ ์˜ฎ๊ธฐ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ Alan Juden์ด ์ œ๊ณต ํ•œ ๋ฒ„์ „์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Microsoft๊ฐ€ 1 ๊ธ‰ SSRS ReportViewer ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•ํ™”ํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋ช‡ ๋…„ ์ „์— Visual FoxPro๋ฅผ ๋„ฃ์€ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฒฝ์žฅ์— SSRS๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๊นŒ?

์ง„ํ–‰ MS? ํ˜„์žฌ ๊ฐ€์žฅ ์ข‹์€ ์˜ต์…˜์€ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์— Telerik Reports์™€ ๋ณด๊ณ ์„œ ๊ตฌ๋…์— SSRS ๋ฐฑ์—”๋“œ์™€ ๊ฐ™์€ ํƒ€์‚ฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ddddddddeee22211์ด ์“ด ๊ฒƒ์ฒ˜๋Ÿผ SSRS 2016์€ ์ด๋ฏธ HTML5 ๋ Œ๋”๋ง ์—”์ง„์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ฌธ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @Eilon.

9 ์›” ์ดํ›„ ์†Œ์‹์€? ํŠนํžˆ ์—ฌ๋Ÿฌ๋ถ„์ด 1.0์„ ์ถœ์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— (์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!) ์••๋ ฅ์ด ์•ฝ๊ฐ„ ๋‚ฎ์•„ ์กŒ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณต์œ  ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

/ cc @jtarquino

์•„์ง ๊ณต์œ  ํ•  ์ˆ˜์žˆ๋Š” ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. .NET ์ฝ”์–ด์— ๋Œ€ํ•œ ๋‰ด์Šค๊ฐ€ ๋‚˜์˜ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์ด ๊ฐ€์žฅ ๋จผ์ € ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ASP.NET Webforms ๋ฐ Winforms ์ปจํŠธ๋กค์— ๋Œ€ํ•œ ์ตœ์‹  ๋„ˆ๊ฒŸ์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€์—๋„ ๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. AlanJuden์˜ ์†”๋ฃจ์…˜์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ "๊ณต์‹์ ์ธ"์†”๋ฃจ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”์–ด 1์ด ๋ช‡ ๋‹ฌ ๋™์•ˆ ๋‚˜์™”์Œ์„ ๊ฐ์•ˆํ•  ๋•Œ์ด ์ƒํƒœ์— ๋Œ€ํ•ด ๋ช‡ ๋งˆ๋””ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋  ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ํƒ€์ž„ ๋ผ์ธ์— ๋Œ€ํ•œ ๋ง์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด. ์ด ๋ฌธ์ œ๋Š” mvc ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํฝ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ. ์‚ฌ์šฉ์ž๊ฐ€ ssrs ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•ด์•ผํ•˜๋Š” ํ•„์š”์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์ •๋ง ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด ํ”„๋กœ์ ํŠธ๊ฐ€ ํ˜„์žฌ reportviewer๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค (reportviewer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด mvc ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ssrs ์„œ๋ฒ„์— ๋Œ€ํ•œ ํ‘œ์ค€ ๋กœ๊ทธ์ธ์„ ์ œ๊ณตํ•จ).

SQL Server 2017์€ ์ด์ œ ์ปค๋ฎค๋‹ˆํ‹ฐ Preview2์ž…๋‹ˆ๋‹ค.
๊ณผ
.net ํ‘œ์ค€ 2.0 ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ตœ์‹  ๋ฐœํ‘œ์™€ ํ•จ๊ป˜ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
๋„ค์ดํ‹ฐ๋ธŒ asp.net ํ•ต์‹ฌ๋ณด๊ณ  ์„œ๋น„์Šค ๋ทฐ์–ด์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ ์•„๋ฌด ๋ง๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์— ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋ฅผ ์ดˆ๋Œ€ํ•˜์—ฌ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฟˆ๊พธ๋Š” ๊ฑธ์ž‘ ํ”„๋ ˆ์ž„ ์›Œํฌ์— ๋Œ€ํ•œ ๊ทธ๋Ÿฌํ•œ ๋…ธ๋ ฅ์˜ ํ•„์š”์„ฑ์„ ํŒ€์— ์•Œ๋ฆฌ์‹ญ์‹œ์˜ค.

@jtarquino : SSRS์— ๋Œ€ํ•œ ํฌ๋Ÿผ์ด๋‚˜ uservoice๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
์‚ฌ์šฉ์ž๋Š” SSRS ํŒ€์— ์–ด๋–ป๊ฒŒ ์—ฐ๋ฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ํฌ๋Ÿผ์€
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/home?forum=sqlreportingservices
๋˜ํ•œ ์šฐ๋ฆฌ ๋ธ”๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
https://blogs.msdn.microsoft.com/sqlrsteamblog/

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์•ฑ์ด SSRS์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์›น ์–‘์‹ ์ปจํŠธ๋กค์—์„œ aspx ํŽ˜์ด์ง€๋ฅผ ์ฐข์–ด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์›น ์–‘์‹ ์ปจํŠธ๋กค๊ณผ "์ž‘๋™"ํ•˜๊ณ  "๋ชจ์–‘"ํ•˜๋Š” ๊ฐ๋„ 2๋ณด๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

์ผ๋ถ€ ์›น ์‚ฌ์ดํŠธ ๋“ฑ์„ asp.net core๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๊ณ ํ•˜์ง€๋งŒ ์ผ๋ถ€์—๋Š” SSRS ๋ณด๊ณ ์„œ ๋ทฐ์–ด ์ปจํŠธ๋กค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. .net Core์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ ๋ทฐ์–ด ์ปจํŠธ๋กค์— ์ง„ํ–‰ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ
ํŒ€

.NET Core๊ฐ€ ์•„๋‹Œ ์ „์ฒด .NET 4.x๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” ๊ฒฝ์šฐ ASP.NET Core๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์—์ด # 2022๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
ASP.NET Core 2๋Š” ์ „์ฒด .NET 4.x๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ikourfaln. ์˜คํžˆ๋ ค์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ค‘๋‹จ ํ•  asp.net ์ฝ”์–ด์— reportviewer๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .net ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” ํ˜ธํ™˜์„ฑ shim์ด์žˆ๋Š” .net ํ‘œ์ค€ 2๋ฟ๋งŒ ์•„๋‹ˆ๋ผ asp.net ์ฝ”์–ด 2์˜ 3 ๋ถ„๊ธฐ์— ์˜ˆ์ •๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด Microsoft๊ฐ€ ํ˜„์žฌ asp.net ์ฝ”์–ด์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ ๋ทฐ์–ด๋ฅผ ์ž‘์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 1.1.

ํ˜„์žฌ SSRS์— ๋Œ€ํ•œ ์ธ์ฆ ํ™•์žฅ์— ๋“ค์–ด ๊ฐ€๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋ฉฐ ์‹œ๋„ํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์—‰๋ง์ธ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์ธ์ฆ / ๋กœ๊ทธ์ธ์„ ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์›น ์•ฑ์ด SSRS๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋„๋ก CORS๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €๋Š” OPTIONS ํ”„๋ฆฌ ํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ „์ฒด ์•„์ด๋””์–ด๊ฐ€ ๋๋‚ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ €๋Š” OpenId Connect ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ์›น ์–‘์‹ ์›น ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ˜์ง์ด๋Š” ์ƒˆ ๊ฐ๋„ ์•ฑ๊ณผ ๋ณด๊ณ ์„œ๊ฐ„์— SSO๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ iframes hackery ๋˜๋Š” ๋‹ค๋ฅธ ์ˆ˜๋‹จ๊ณผ ํ•จ๊ป˜ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Microsoft๊ฐ€ ์ƒˆ๋กœ์šด ์›น ๊ธฐ์ˆ ๋กœ ๋” ์ž˜ ์ž‘๋™ํ•˜๋„๋ก ssrs๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ƒ๊ฐ : SSRS KPI ๋ฐ ๋ชจ๋ฐ”์ผ ๋ณด๊ณ ์„œ : ์›น ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@alanjuden rdlc ๋ณด๊ณ ์„œ ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋„๋ก ํŒจํ‚ค์ง€๋ฅผ ๊ตฌ์„ฑ ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณด๊ณ  ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ฐ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ํž˜๋“  ์ผ์ž…๋‹ˆ๋‹ค.

@IonRobu , ๋‚˜๋Š”

๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ์ง„์งœ ์ด์œ ๋Š” ๋ณด๊ณ ์„œ ๋ทฐ์–ด์˜ ํ”„๋ŸฐํŠธ ์—”๋“œ ๋ทฐ์–ด ๋งŒ ๋งŒ๋“ค์—ˆ ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  SSRS API๋ฅผ ํ†ตํ•ด ๋ณด๊ณ ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๋ฐ ์ „์ ์œผ๋กœ SSRS์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ๋ฐฑ์—”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฃ„์†กํ•˜์ง€๋งŒ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ฐ€ํ•˜๊ณ ์žํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” MvcReportViewer๋ฅผ ASP.NET WebForms ๋ฒ„์ „์˜ ์ปจํŠธ๋กค์„ ๊ฐ€์ ธ ์˜ค๋Š” ์–ด๋ ค์›€์„ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ์‰ฌ์šด ์†”๋ฃจ์…˜์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

"ํด๋ผ์ด์–ธํŠธ ๋ณด๊ณ ์„œ"๋ผ๊ณ ํ•˜๋Š” ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ๋˜๋Š” RDLC
๋ณด๊ณ ์„œ ์„œ๋ฒ„๋Š” ์„ค์ • ๋ฐ ๊ด€๋ฆฌ์— ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด๊ณ ์„œ๋Š” ํ”„๋ŸฐํŠธ ์—”๋“œ ์›น ์„œ๋ฒ„์—์„œ ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฑ ์—”๋“œ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
๋ณด๊ณ ์„œ์˜ ๊ฒฐ๊ณผ๋Š” ํ˜„๊ธˆํ™” ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”„๋กœ๋•์…˜ SQL ์„œ๋ฒ„์—์„œ ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณต์žกํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ผ์ •์— ๋”ฐ๋ผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑฐ์˜์—†๋Š” ์‹œ๊ฐ„์— ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ๋œ ์Šค๋ƒ… ์ƒท์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ SSRS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์ด ๋ณด๊ณ ์„œ ์„œ๋ฒ„์— ์œ ์ง€๋˜๋ฉฐ ์›น ์„œ๋ฒ„ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ SSRS ์„œ๋ฒ„๋Š” ๋ณด๊ณ ์„œ ์ž‘์„ฑ์ž๊ฐ€ ๊ฒŒ์‹œ ํ•  ์ˆ˜์žˆ๋Š” ์ค‘์•™ ์ง€์ ์ด๋˜๊ณ  ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ณด๊ณ ์„œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
SSRS๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๊ณ ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ๋งํฌ๋ฅผ ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ด๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” pdf, word ๋˜๋Š” excel ํŒŒ์ผ์„ ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ™•์žฅํ•˜๋ฉด ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋” ๋งŽ์€ ๋ณด๊ณ ์„œ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ์ „์— ๋” ๋งŽ์€ ์›น ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งŽ์€ ์ˆ˜์˜ rdlc ํŒŒ์ผ์„ ๋ชจ๋“  ์›น ์„œ๋ฒ„์— ๋ณต์‚ฌ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์˜ˆ, ๋ณด๊ณ ์„œ๊ฐ€ ๋ช‡ ๊ฐœ ๋ฐ–์—์—†๊ณ  rdlc์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ํ˜œํƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งŽ์€ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ๋” ํฐ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ SSRS ์„œ๋ฒ„๋Š” ์ •๋ง ์ข‹์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ SSRS API๋Š” ์ž‘์—…ํ•˜๊ธฐ์— ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก ์›น ์–‘์‹์ด๋‚˜ mvc ๋ทฐ์–ด ์ปจํŠธ๋กค์ด ์—†์–ด๋„ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ณด๊ณ ์„œ pdf๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
API๋Š” ๋ณด๊ณ ์„œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๊ณ , ๊ถŒํ•œ์„ ์„ค์ •ํ•˜๊ณ , ๋ณด๊ณ ์„œ๋ฅผ ๋‚˜์—ด ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง์žฅ์—์„œ ์ €๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์•ฑ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ๋ณด๊ณ ์„œ๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ๋ณด๊ณ ์„œ์— ํ•„์š”ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ด€๋ฆฌ์ž ์˜ค๋ฒ„ ํ—ค๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์ ์„ ์ž˜ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

๋ฟก ๋นต๋€จ
๊ณ ๊ฐ ๋ณด๊ณ ์„œ๋Š” ๊ท€ํ•˜๊ฐ€ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๋งฅ๋ฝ์—์„œ ํƒ์›”ํ•ฉ๋‹ˆ๋‹ค.
๋งŽ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๊ณ ์„œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฌธ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์œ ์ง€ํ•  ์ž๊ฒฉ์ด์žˆ๋Š” ์ง์›์ด ์—†์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๋ณด๊ณ ์„œ (60+)๊ฐ€ ํฌํ•จ ๋œ ์ œํ’ˆ์„ ๋ฐฐ์†ก ํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ + ๋ณด๊ณ ์„œ ๋ฐฐํฌ์˜ ์˜ค๋ฒ„ ํ—ค๋“œ์— ์ง๋ฉดํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
๋งŽ์€ ์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ ๋œ ๋ณด๊ณ ์„œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—†์ด ์‘๋‹ต์— ๋”ฐ๋ผ ๋ Œ๋”๋ง ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ์ˆ ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ๋ณด๊ณ ์„œ ๋ทฐ์–ด์— ์‰ฝ๊ฒŒ ์ ์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ ๋ณด๊ณ ์„œ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์œผ๋ฉฐ ์ด์ œ ์‹ค์ œ ์‚ฌ์šฉ์— ์“ธ๋ชจ ์—†๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Microsoft ํŒ€์ด ์šฐ๋ฆฌ์˜ ๊ณ ํ†ต์„ ์ดํ•ดํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์–ป์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ˆ ํด๋ผ์ด์–ธํŠธ ๋ณด๊ณ ์„œ๋Š” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์™œ ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋งˆ์ผ๋ฆฌ์ง€๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ net standard 2๋Š” system.drawing์— ๋Œ€ํ•œ ๋” ๋งŽ์€ API ํ‘œ๋ฉด๊ณผ ํ•จ๊ป˜ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
asp.net ์ฝ”์–ด ์šฉ ssrs ๋ทฐ์–ด์— ๋Œ€ํ•œ srss ํŒ€์˜ ํ•œ๋งˆ๋”” ๊ธฐํšŒ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์šฐ๋ฆฌ ํšŒ์‚ฌ๋Š” PDF ํ˜•์‹์˜ RDLC ๋ณด๊ณ ์„œ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฌธ์„œ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. .net ์ฝ”์–ด์—์„œ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ .net ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋„์ปค์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋˜๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋ฐฉํ•ด๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๋ชจ๋“  ์ฝ”๋”๊ฐ€ ๋™๋ฃŒ๋“ค์ด์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์—์„œ ์˜๊ฒฌ์„ ๋งํ•˜๋„๋ก ๊ฒฉ๋ คํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด :
Java๊ฐ€ ์„ค์น˜๋œ ๊ฒฝ์šฐ Eclipse BIRT ๋˜๋Š” JasperReports๋ฅผ ํฌํ•จ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‘ ๊ฐ€์ง€ ์ค‘์—์„œ JasperReports๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ SSRS ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค (์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜์ง€๋งŒ ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์™„๋ฒฝํ•œ ํ”ฝ์…€).
๋ชจ๋“  JDBC ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ Cassandra ๋˜๋Š” Apache Spark (SparkSQL)์™€ ๊ฐ™์€ BigData์— ์•ก์„ธ์Šค ํ•  ์ˆ˜์žˆ๋Š” ๋…๋ฆฝ ์‹คํ–‰ ํ˜• ๋‚ด์žฅํ˜•๋ณด๊ณ  ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น ๋˜๋Š” ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‚ด์žฅ ๋  ์ˆ˜์žˆ๋Š”๋ณด๊ณ  ๋ฐ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์ œ๊ณต ํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์ •๋ณด๋ฅผ ๋ธŒ๋ผ์šฐ์ €, ๋ชจ๋ฐ”์ผ ์žฅ์น˜ ๋˜๋Š” ์ด๋ฉ”์ผ๋ฐ›์€ ํŽธ์ง€ํ•จ์— ์‹ค์‹œ๊ฐ„ ๋˜๋Š” ์˜ˆ์•ฝ ๊ธฐ๋ฐ˜์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๊ธฐ์—…์˜ ์ค‘์•™ ์ •๋ณด ํ—ˆ๋ธŒ๋กœ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํŒŒ์ผ ํ˜•์‹์œผ๋กœ.

Launch4j๋ฅผ ํ†ตํ•ด BIRT / Jasper๋ฅผ ์ œ๊ณตํ•˜์—ฌ Java ๋Ÿฐํƒ€์ž„์˜ ์ž์ฒด ํฌํ•จ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jtarquino .Net Core์— ๋Œ€ํ•œ ์ข‹์€ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๊ฐ€ ์ œ๊ธฐ ๋œ ์ง€ ์•ฝ 15 ๊ฐœ์›”์ด ์ง€๋‚œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ผ๊ณ  ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ •๋ง ์‹ค๋งํ–ˆ๋‹ค.

SSRS, ReportName ๋ฐ Params์˜ ๊ฐ„๋‹จํ•œ ์ง€์ ์กฐ์ฐจ๋„ DIV ๋˜๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ ์—ด๋ฆฌ๋ ค๋ฉด ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. SQL์— ๋Œ€ํ•œ SSRS ๋ณด๊ณ ์„œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ์œผ๋ฉฐ์ด๋ฅผ ๊ฐ„๋‹จํ•œ Core2.0 MVC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ‘œ์‹œ ํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@cgountanis , ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/aspnet/Home/issues/1528#issuecomment -259169426

ํ—‰ํ—‰
๋ณด๊ณ ์„œ์˜ PDF ๋˜๋Š” ์›น ํฌํ„ธ ์‡ผ์™€ ๊ฐ™์€ ์™„์ „ํ•œ ๋Œ€ํ™” ํ˜• ๋ณด๊ณ ์„œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์•ต๊ทค๋Ÿฌ ์•ฑ์—์„œ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‹œ์ž‘์ ์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํŽ˜์ด์ง€ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์กฐ์ •ํ•˜๋ฉด ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<strong i="7">@model</strong> string

@{
    ViewData["Title"] = "View Report";
}

<style>
    body {
        overflow-x: hidden;
    }
</style>

@{
    var src = "http://192.168.0.1/ReportServer/Pages/ReportViewer.aspx?/";
    src += ViewData["argument"];
}

<iframe style="overflow:hidden; overflow-x:hidden; overflow-y:hidden; border:none; width:100%; height: 1250px;" src=@src></iframe>

ํ•œ ๊ฐ€์ง€๋Š” ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ์›น ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ณด๊ณ ์„œ ๋ฐ ํด๋” ๋ฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋“ฑ์˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด ํฌํ„ธ / ๋ณด๊ณ ์„œ ๋ฉ”๋‰ด๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ๋ณด๊ณ ์„œ๋ฅผ ๊ด€๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์•ฑ.
๋ณด๊ณ ์„œ ์„œ๋ฒ„์— ์ผ๋ จ์˜ Windows ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค์–ด์„œ๋ฐ›๋Š” ๋ณด๊ณ ์„œ๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์ž ์—ญํ• ์„ ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ์‚ฌ์šฉ์ž์— ๋งคํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž๋กœ ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ์‚ฌ์šฉ์ž๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์— ๊ธฐ๋กํ•˜์ง€ ์•Š์œผ๋ฉด "์‹ค์ œ ์‚ฌ์šฉ์ž"๋ฅผ ์žƒ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Windows ์‚ฌ์šฉ์ž ๊ณ„์ •์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ ์„œ๋ฒ„์˜ ์ข…์†์„ฑ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. jwt ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ํ† ํฐ์—์„œ ์—ญํ• ์„ ๊ฐ€์ ธ ์˜ค๋„๋ก ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ƒํ™ฉ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” iframe์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์–‘์‹ ์ปจํŠธ๋กค์„ ๊ฐ๋„ ์•ฑ๋ณด๊ธฐ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ตœ๊ณ ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๋Š” ์šฐ๋ฆฌ๊ฐ€ํ•˜๋Š” ํ•ดํ‚น์„ ์‹ค์ œ๋กœ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ ctrl-brk Core 2.0์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ๋†“์นœ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/alanjuden/MvcReportViewer/issues/43

@steelwil ๊ฐ์‚ฌํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ •์˜ NetworkCredential์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@figuerres ๋ฐฉํ™”๋ฒฝ์ด์žˆ๋Š” SSRS์˜ ๋ณด๊ณ ์„œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. WebForm ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ Windows ์‚ฌ์šฉ์ž๋ฟ ์•„๋‹ˆ๋ผ SSRS.ReportViewer๋กœ ๋ชจ๋“  ๋…ธ๋ ฅ์„ ๋‹คํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์˜ ํ•œ JWT๋Š” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. WebForms / NUGET๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ๋˜ ReportViewer ๊ธฐ๋Šฅ์„ ์ผ์น˜์‹œํ‚ค๋ ค๋Š” ์˜ˆ์ œ๋Š” ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ฒฐ๊ตญ ๊ทธ๋“ค์€์ด ๊ถŒ๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ณต์‹ NUGET์„ ์ถœ์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

@cgountanis "they"๋Š” ASP.NET Core ํŒ€์ด ์•„๋‹ˆ๋ผ SQL Server ํŒ€์ž…๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒ€์ž…๋‹ˆ๋‹ค.

@giddev ์—ฌ๊ธฐ์„œ ์ง„์งœ ์งˆ๋ฌธ์€ ์—ฌ๋Ÿฌ๋ถ„์ด ์–ธ๊ธ‰ ํ•œ ๋‹ค๋ฅธ ํŒ€์ด ์‹ค์ œ๋กœ Microsoft์— ์กด์žฌํ•˜๊ณ  ์—ฌ์ „ํžˆ ํŒ€์—์„œ ์ผํ•˜๋Š” ์ ๊ทน์ ์ธ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  SSRS ์ž„๋ฒ ๋”ฉ์„์œ„ํ•œ ์ผ๋ฅ˜ ์†”๋ฃจ์…˜์„ ์ƒ์‚ฐํ•˜๊ณ  ๊ฒŒ์‹œ ํ•  ์ˆ˜์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ž๋ถ€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ASP.Net Core 1 ๋˜๋Š” 2 ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œ ๋œ ๋กœ๋“œ๋งต์ด ์žˆ์Šต๋‹ˆ๊นŒ? ASP.Net Core๊ฐ€ ๊ณ„ํš์˜ ์ผ๋ถ€์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด SSRS๊ฐ€ ํฌ๊ธฐ๋˜๊ณ  POWER BI๋กœ ๋Œ€์ฒด ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? SSRS๊ฐ€ Microsoft Visual FoxPro๊ฐ€ ๋น ์ง„ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ฅ๊ตฌ๋ฉ์œผ๋กœ ํ–ฅํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

@wqwalter ๋ญ”๊ฐ€ .......
๋‚˜๋Š” ๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ๊ฐ€ ๊ฐ์ž ์ž์‹ ์˜์ง€๋„๋ฅผ ๋”ฐ๋ฅด๋Š” ๋งŽ์€ ํŒ€๋“ค์—๊ฒŒ ๊ธธ์„ ๊ฐ€์กŒ๊ณ  ๊ทธ๋“ค ์‚ฌ์ด์— ๊ณตํ†ต๋œ ๊ฒฐ๊ณผ๋ฌผ๊ณผ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ง€ ์•Š๋‹ค๋Š” ์ธ์ƒ์„๋ฐ›์Šต๋‹ˆ๋‹ค.
๋งˆ์น˜ ๊ณ ์–‘์ด๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋ชจ๋‘ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฅ™ํ•ฉ๋‹ˆ๋‹ค ...

๊ทธ๊ฒƒ์ด ํ‹€๋ ธ๋‹ค๋ฉด-๊ธ€์Ž„์š”.

Crystal Reports๊ฐ€ ์ธ๊ธฐ๊ฐ€ ์—†์–ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— SSRS๋ฅผ ํฌ๊ธฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰
๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ์˜ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ, 20 ๋…„ ๋™์•ˆ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ œํ’ˆ์„ ์ค‘๋‹จํ•˜๊ณ  ๋‚ด ์ดํ•ด์— ๋ฐ˜ํ•˜๋Š” ์ผ์„ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋กœ Microsoft๊ฐ€ ์ธ์ˆ˜ ํ•œ Virtual PC๊ฐ€ Microsoft์—์„œ ํ•œ๋™์•ˆ ํŒ๋งค ํ•œ ๋‹ค์Œ ๋ฌด๋ฃŒ๋กœ ๋งŒ๋“  ๋‹ค์Œ ์ฃฝ์˜€์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋งŽ์€ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค ....

Power BI์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์™€ ์ œ๋•Œ ์ƒˆ๋กœ์šด SSRS๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์†Œ๋ฌธ์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒŒ ํ™•์‹คํ•œ์ง€ ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๊ฐ€์‹ญ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Azure ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋ฅผ ํ‘ธ์‹œํ•˜๋Š” ๋ชจ๋ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

SSRS๊ฐ€ ์›น ๊ธฐ๋ฐ˜ ์ธ์ฆ (OpenID Connect ์„ ํ˜ธ)์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€-SSRS๊ฐ€ ASP.NET Core์˜ ๋„ˆ๊ฒŸ์ด๋ผ๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ ์˜ˆ์•ฝ ๋ฐ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ์ž-์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ SSRS API์— ๋Œ€ํ•œ ์„ค๋ช…์„œ๊ฐ€ ์ œ๊ณต๋˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฅด ๊ทธ๋งˆ
๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค!
OIDC๋Š” ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ณด๊ณ ์„œ ์„œ๋ฒ„ ์—ญํ• ์— ๋Œ€ํ•œ ๋งคํ•‘์„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์—ญํ• ์— ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์›น ์–‘์‹ ๋ณด๊ณ ์„œ ํŽ˜์ด์ง€๋ฅผ iFrame์—๋กœ๋“œํ•ด์•ผํ•˜๊ณ  Windows ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒํ•œ์„ ์ œ์–ดํ•ด์•ผํ•˜๋Š” Angular 4/5 ํ”„๋ŸฐํŠธ ์—”๋“œ์™€ ํ•จ๊ป˜ OIDC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฟผ๋ฆฌํ•˜๋ฉด ์‹ค์ œ๋กœ ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ด์ƒ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ๋„ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ด๋ฉฐ Microsoft๋กœ๋ถ€ํ„ฐ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์•„์ง ์•„๋ฌด๊ฒƒ๋„ ๋“ฃ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ Microsoft๊ฐ€ ์•„๋‹Œ ์˜ต์…˜์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ผ์ •์ด ์žˆ๋‹ค๋ฉด ์ •๋ณด์— ์ž…๊ฐ ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ๋‚ด๋ณด๋‚ด๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ReportServer / ReportExecution2005.asmx๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ”์Šต๋‹ˆ๋‹ค. IIS์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋ฉด ์ด์ƒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Basic'. The authentication header received from the server was ''

์ด ์˜ค๋ฅ˜๋Š” ์ธ์ฆ์„์œ„ํ•œ ํ—ค๋”๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ http ์š”์ฒญ์— ํ—ค๋”๋ฅผ ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ „ํ™”๊ฐ€ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

IIS์—์„œ ํ˜ธ์ŠคํŒ… ๋  ๋•Œ๊นŒ์ง€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ๋ฐœ ์ปดํ“จํ„ฐ์กฐ์ฐจ๋„ ๋™์ผํ•œ ๋ณด๊ณ ์„œ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ณ  ์ž‘๋™ํ•˜์ง€๋งŒ II๋กœ ๊ฒŒ์‹œ๋˜๊ณ  ํ˜ธ์ŠคํŒ…๋˜๋ฉด ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋งํ•˜๋Š” ๊ฒƒ์€ ์„œ๋ฒ„๊ฐ€ ์ผ์ข…์˜ ์˜ค๋ฅ˜๋กœ ์‘๋‹ตํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ๋ณด๋‚ด๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.

IIS Express๋Š” ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ด์ค‘ ํ™‰์€ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ์–ด๋‚  ์ˆ˜์žˆ๋Š” ์ผ์€ IIS ์„œ๋ฒ„์— Kerberos๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๊ณ  ์œ„์ž„์„ ์„ค์ • ํ•œ ๊ฒฝ์šฐ์—๋„ ๋ณด๊ณ ์„œ๊ฐ€ ์ต๋ช…์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๊ณ ์„œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๋Œ€๋‹ต : Kerberos๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์œ„์ž„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ IIS ์•ฑ ํ’€์ด ์‹คํ–‰๋˜๋Š” ๊ณ„์ •์— ๋Œ€ํ•œ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

https://blogs.msdn.microsoft.com/chiranth/2014/04/17/setting-up-kerberos-authentication-for-a-website-in-iis/

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. IIS์—์„œ Core๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋ฉด IIS ์„ค์ •์„ ๋ฌด์—‡์œผ๋กœ ์„ค์ •ํ–ˆ๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. S & G๋ฅผ ์œ„ํ•ด์„œ๋งŒ appPool ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ์ž๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ ์ด๋™ ... ์ด๊ฒƒ์€ ์ต๋ช… ์ด์™ธ์˜ IIS ์ธ์ฆ ์„ค์ •์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ์ด๊ฒƒ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๊นŒ? ํŠน๋ณ„ํ•œ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ Core์˜ WCF ์šฉ lib์— ์•ก์„ธ์Šคํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋ฌด์—‡์„ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ? ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ... ๋ณด์•ˆ์ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

@cgountanis ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@jtarquino .net ์ฝ”์–ด ๊ธฐ๋ฐ˜ ๋ณด๊ณ ์„œ ๋ทฐ์–ด์˜ ์ถœ์‹œ ์ผ์ •์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ ์–ด๋„ ํƒ€์ž„ ๋ผ์ธ์„ ์•Œ๊ณ  ์‹ถ์–ด์š”. ์šฐ๋ฆฌ๋Š” 6 ๊ฐœ์›”์„ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? 12 ๊ฐœ์›”? ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ์˜ ๋ชจ๋“  SSRS ๋ณด๊ณ ์„œ๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์ง๋ฉด ํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์ด์—†๊ณ  ๊ฐ€์šฉ์„ฑ์— ๋Œ€ํ•œ ํƒ€์ž„ ๋ผ์ธ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@ExcaliburVT ๋ฐฑ ๋กœ๊ทธ์— ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ํƒ€์ž„ ๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

@jtarquino ์˜คํ”ˆ ์†Œ์Šค๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋™์‹œ์— Microsoft๋Š” ๊ณ ๊ฐ์— ๋Œ€ํ•ด ์ฑ…์ž„์„ ์ ธ์•ผํ•˜๊ณ , ๊ณ ๊ฐ์€ ์ œํ’ˆ์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ณ , ๊ณ ๊ฐ์€ ์ œํ’ˆ ๋ฐฐ์†ก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Microsoft์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๊ทธ๋‹ค์ง€ ํฌ์ง€ ์•Š์€ ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๊ฐ์œผ๋กœ์„œ ์˜ฌ๋ฐ”๋ฅธ ๋‹ต์„ ์–ป์ง€ ๋ชปํ•˜๋ฉด ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๊ณ„์† ๋Œ์•„ ์˜ฌ๊นŒ์š”?

์ด ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ œํ’ˆ์ด์ด ์ œํ’ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์ œํ’ˆ์—์„œ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ์šด์˜์— ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ๋ฐ›์„ ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ๊ด€๋ฆฌ์ž์—๊ฒŒ SQL Server ๋ฐ SSRS์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ๋ผ์ด์„ ์Šค๋ฅผ ์š”์ฒญํ•ด์•ผํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@jtarquino ์ €๋Š” ๋ง ๊ทธ๋Œ€๋กœ 3 ๊ฐœ์›” ๊ฐ„์˜ ์ „ํˆฌ๋ฅผ ๋งˆ์น˜๊ณ  Oracle์„ ํ†ตํ•ด SQL์„ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ ์Šน์ธ์„ ๋ฐ›๊ณ  ๋‚ด ์ฃผ์š” ํŒ๋งค ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์•Œ์•„ ๋‚ด๊ธฐ ์œ„ํ•ด ์‹ธ์›  ๊ธฐ ๋•Œ๋ฌธ์—

์ƒˆ๋กœ์šด VS2017 WCF ์ปค๋„ฅํ„ฐ ์„œ๋น„์Šค (Core 2)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์ด ๋ทฐ์–ด NUGET ํŒจํ‚ค์ง€๊ฐ€ ์ถœ์‹œ๋˜๊ธฐ ์ „์— ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€์žˆ๋Š” ๋ณด๊ณ ์„œ๋ฅผ PDF, Word, Excel, CSV๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, SSRS์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ReportExecution2005.asmx๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜์ง€๋งŒ ๊ทธ๋“ค์ด ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ทฐ์–ด ์ธก๋ฉด์„ ๋ฒ„๋ฆฌ๊ณ  ๋ฐ”๋กœ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์•ž์„œ ์–ธ๊ธ‰ ํ•œ AppPool ๊ถŒํ•œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ๋‚˜๋Š” ์›น API์—์„œ pdf๋กœ ๋ณด๊ณ ์„œ๋ฅผ ์–ป๊ณ  wcf ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
soap / asmx ํ˜ธ์ถœ ๋ฐ http ํ˜ธ์ถœ.
๊ทธ๊ฒƒ๋“ค์„ ํ•  ๋•Œ ๋‚˜๋Š” ์–ด๋–ค ๋ฌธ์ œ์—†์ด credentails๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฝ”๋“œ๋Š” asp.net 4.6 / ์›น API 2์ž…๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ฌด์—‡์„ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ ์ฃผ์— github์— ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ ค์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
๋ณด๊ณ ์„œ ์„œ๋ฒ„ 2016์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ ์ด์ „ ssrs ๋ฆด๋ฆฌ์Šค์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

SSRS (RDLC Designer)๊ฐ€ ํฌํ•จ ๋œ Core 2์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@figuerres github ์š”์ฒญ์— ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ ํ•œ ๊ฒฝ์šฐ ๋งํฌ๋ฅผ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค.

์•„ ํฐ๋‘
๋‹ค์Œ ์ฃผ์— ๊ฒŒ์‹œ๋˜๋ฉฐ ๊ทธ๋•Œ๊นŒ์ง€๋Š” ์‚ฌ๋ฌด์‹ค์— ์—†์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์•„๋ฌด๋„ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ธํŠธ๋ผ๋„ท ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ Angular5 / .NetCore2 MVC5 (MS์˜ ํ˜„์žฌ RC ์Šคํƒ)์—์„œ ์ž‘์—… ์ค‘์ด๋ฉฐ SSRS 2012๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋กœ๊ทธ์ธ ํ•œ Windows ๊ณ„์ •์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ณด๊ณ ์„œ ๊ตฌ๋…์„ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@figuerres ์•„๋งˆ๋„ ๋‹น์‹ ์€ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด์žฅ ๋œ SSRS ๋ฐ๋ณด๊ณ  ์‹คํ–‰ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋ฃจ ์ข…์ผ PDF๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@cgountanis ๋น ๋ฅธ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ, ์ œ๊ฐ€ํ•ด์•ผ ํ•  ์ผ์„ ์„ค๋ช… ํ•  ๋•Œ ์ œ๊ฐ€ ์„ค๋ช…์ ์ด๊ณ  ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๋„๋ก ๋„์™€ ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. "์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ณด๊ณ ์„œ ๊ตฌ๋… ๋งŒ๋“ค๊ธฐ"๋ผ๊ณ  ์›๋ž˜ ๋Œ“๊ธ€์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋… ์ผ์ • ํ–‰์„ ๋ณด๊ณ ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์‚ฝ์ž…ํ•˜์—ฌ ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ…Œ์ด๋ธ”๊ณผ ๊ธฐ์กด ํ–‰์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ๋… ์„œ๋น„์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ถ”์ธก).

@ExcaliburVT ์ง€๊ธˆ๊นŒ์ง€ SOAP API์™€ ๋Œ€ํ˜• SP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB์™€ ์ƒํ˜ธ ์ž‘์šฉํ–ˆ์œผ๋ฉฐ DB๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒด ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ๊ธฐ๋ฐ˜์ด๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์ฃผ์–ด์ง„ ์‹œ๊ฐ„์— ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•  ๋•Œ ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@figuerres ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜, ์ฆ‰ ๋งค์ฃผ ์ˆ˜์š”์ผ ์˜ค์ „ 8์‹œ์— ๋ฐ˜๋ณต๋˜๋Š” ์ผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ตœ์†Œํ•œ SQL 2012๋กœ ๋Œ์•„๊ฐ€์„œ ์ˆ˜๋™์œผ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ ๋Š”์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๊ธฐ์–ต์ด ๋‚˜๋ฉด ์Šคํ‚ค๋งˆ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ตฌ๋… ํ…Œ์ด๋ธ”์— ํ–‰์„ ์‚ฝ์ž…ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ฉ”์ผ ๊ทธ๋ฃน์— ๋ณด๊ณ ์„œ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ณด๊ณ ์„œ ์„œ๋ฒ„ ํฌํ„ธ์€ ๊ณ„ํš๋œ ์ผ์ •์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์‹œ๊ฐ„์ด๋˜๋ฉด ์ด๋ฉ”์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹คํ–‰ํ•  ๋•Œ ๋กœ๊ทธ์ธ ํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฌํ„ธ์—์„œ ๊ตฌ๋…์„ ์ƒ์„ฑํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋˜ํ•œ ๋น„๋ˆ„ API์—์„œ ๊ทธ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ •ํ™•ํ•œ API ํ˜ธ์ถœ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

soapAPI์—์„œ ๋ณธ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ์ „์— ๋” ๋งŽ์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSRS soapAPI ๋ฐ "ssrsReportWebAdmin"๊ณผ ๊ฐ™์€ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฐœ๋ฐœ์ค‘์ธ "ssrsReportWebAdmin"์—๋Š” ๋ชจ๋“  ๋ณด์•ˆ ์—ญํ• ์ด ์žˆ์ง€๋งŒ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด Content Manager ์—ญํ• ์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” webapp์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„์œ„ํ•œ ๊ตฌ๋…์„ ๋งŒ๋“ค๊ณ  soapAPI๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์š”์ฒญ์„ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.

CreateSubscriptionAsync ํ˜ธ์ถœ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ชจ๋“  ์—ญํ• ์„ ๊ฐ€์ง„ "ssrsReportWebAdmin"์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ cred ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กœ์šด ....

๋‚ด๊ฐ€ ์ฝ์€ SSRS๋Š” ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ‘œ์ค€ (๋ฐ˜๋ณต, ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜) ๊ตฌ๋…์„ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์‚ฌ๋žŒ์€ ์‚ฌ์šฉ์ž ์ž์‹ ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ตฌ๋…์€ Content Manager ์—ญํ• ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ContentManagerTasks-๋ชจ๋“  ๊ตฌ๋… ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://technet.microsoft.com/en-us/library/ms159693 (v = sql.105) .aspx

๋จธ๋ฆฌ๊ธ€ ์•„๋ž˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์žฅ์€ "Reporting Services๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ..."๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services#bkmk_standard_and_datadriven

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ
Content Manager SSRS ์—ญํ• ์ด์žˆ๋Š” AD ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ ๋ฐ ํŒŒ์ผ ๊ณต์œ ์— ๋Œ€ํ•œ ํ‘œ์ค€ ๊ตฌ๋…์„ ๋งŒ๋“ค ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธˆ์š”์ผ์— ๋ฐœ์ƒํ•œ ๊ถŒํ•œ ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ MatchData ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๋ถ€์ž‘์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ์˜ 2 ๋…„. Core 2.0์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SSRS ํŒ€, ์ผ์–ด๋‚˜.

@ codehippie1 ๋„ˆ๋ฌด ๋ฌด๋ก€ํ•˜์ง€

๊ฐœ๋ฐœ์ž ๋™๊ตด์˜ ๋†๋‹ด ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์œ„๋ฐ˜๋„ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋†€๋ž๊ฒŒ๋„ ReportViewerForMVC๋Š” 2014 ๋…„ ์ดˆ (https://www.nuget.org/packages/ReportViewerForMvc)๋ถ€ํ„ฐ 72,799 ํšŒ ๋‹ค์šด๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. SSRS ํŒ€์€ ์ˆ˜๋…„ ๋™์•ˆ ASP.NET MVC๋ฅผ ๋ฌด์‹œํ–ˆ์œผ๋ฉฐ ์ด์ œ 2 ๋…„ ๋™์•ˆ ASP.NET Core๋ฅผ ๋ฌด์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๋ก€ํ•˜๋‹ค๊ณ  ๋งํ•˜๋ฉด 72,799 ํšŒ๋Š” ๋งŽ๋‹ค.

๋‚˜๋Š” ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š” PDF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์˜ ๋ฉ‹์ง„ ๋‚ด๋ณด๋‚ด๊ธฐ์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ฆ˜์—๋Š” ๋ทฐ์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜์‘ ํ˜• ์š”๊ตฌ ์‚ฌํ•ญ์ด์žˆ๋Š” ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค.

@cgountanis : HTML ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (์˜ฌ๋ฐ”๋ฅธ ์šฉ์ง€ ํฌ๊ธฐ-html ์ „์šฉ, base64 ์ด๋ฏธ์ง€, ์ธ๋ผ์ธ ์Šคํƒ€์ผ). ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ์ฑ„์šฐ๊ณ  HTML ์ธ์ฝ”๋”ฉ์„ utf8๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. wkhtmltopdf์˜ StandardInput์œผ๋กœ ํ…์ŠคํŠธ ๋ณด๋‚ด๊ธฐ-wkhtmltopdf์˜ StandardOutput์—์„œ ์ถœ๋ ฅ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  SSRS๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@cgountanis ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ ๋…ผ๋ฆฌ์  ์œ„์น˜์— ํŽ˜์ด์ง€ ๋จธ๋ฆฌ๊ธ€ / ๋ฐ”๋‹ฅ ๊ธ€ ๋ฐ ์ค„ ๋ฐ”๊ฟˆ์ด์žˆ๋Š” ํ”ฝ์…€ ์™„๋ฒฝํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

aspnet ์ฝ”์–ด์— MS RDLC ๋กœ์ปฌ ๋ณด๊ณ ์„œ ๋ทฐ์–ด๊ฐ€์—†๋Š” ๋‚ด ๊ณ ํ†ต์„ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด; mozilla์˜ pdfJ ๋ฐ ViewerJ์˜ ๋„์›€์œผ๋กœ ๋Œ€์ฒด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. MS RDLC ๋ณด๊ณ ์„œ ๋ทฐ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ pdfJs ๋ฐ๋ชจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ”์ดํŠธ๋กœ ๋ฑ‰์–ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ๋Š” RDLC ํŒŒ์ผ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ ,์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ์ธก์—์„œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ํŒŒ์ด์–ด ํญ์Šค๊ฐ€ ๋ฌธ์„œ ๋ทฐ์–ด์— ๋‚ด์žฅ๋˜์–ด ์ถœ๋ ฅ์„ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋‘ ์„ธ๊ณ„์˜ ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค. PdfJs๋Š” ์—ฌ์ „ํžˆ ๋ณด๊ณ ์„œ ๋ทฐ์–ด๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ํŽ˜์ด์ง€ ํƒ์ƒ‰, ์ธ์‡„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ๊ฒ€์ƒ‰ ๋ฐ ๊ธฐํƒ€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด์žˆ๋Š” ์ œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋‹ค์ง€ ์ ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด aspnet ํ•ต์‹ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ (๊ฐ 2 ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ ์ธก, rxJs ๋ฐ Typescript ํฌํ•จ) ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์š”์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ๋‘ ์„ธ๊ณ„์˜ ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค.

Angular 2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— pdf.js ๋ฐ viewer.html์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• (MS Local RDLC ๋ณด๊ณ ์„œ ๋ทฐ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒ์  aspnet core / webapi / mvc ๋ฐฑ์—”๋“œ ๋ณด๊ณ ์„œ ์ƒ์„ฑ ์‚ฌ์šฉ)

๋ฐ˜์‘์ด๋‚˜ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ฐ๋„ 2๋ฅผ ์•„์ฃผ ์ž˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์›์น™์€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

SSRS์—์„œ ์ง์ ‘ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@cgountanis ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์€ RDLC๋กœ ๋ณด๊ณ ์„œ ์„œ๋ฒ„๊ฐ€์—†๊ณ  ์›น ์„œ๋ฒ„๊ฐ€ ๋ณด๊ณ ์„œ๋ฅผ ๋ Œ๋”๋ง ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Microsoft์˜ ํฅ๋ฏธ๋กœ์šด ์—…๋ฐ์ดํŠธ ...

https://blogs.msdn.microsoft.com/sqlrsteamblog/2018/04/02/microsoft-acquires-report-rendering-technology-from-forerunner-software/

๋ณด๊ณ  ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํˆฌ์ž๋ฅผ ๊ฐ€์†ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Forerunner Software https://forerunnersw.com/ ์—์„œ ๊ธฐ์ˆ ์„ ์ธ์ˆ˜ํ–ˆ์Œ์„ ๋ฐœํ‘œํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์—๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ Reporting Services (*. rdl) ๋ณด๊ณ ์„œ์˜ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง, ๋ณด๊ณ ์„œ๋ฅผ๋ณด๊ธฐ์œ„ํ•œ ๋ฐ˜์‘ ํ˜• UI ์œ„์ ฏ, ๋ณด๊ณ ์„œ๋ฅผ ๋‹ค๋ฅธ ์•ฑ์— ํ†ตํ•ฉํ•˜๊ธฐ์œ„ํ•œ JavaScript SDK๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ.

์ด ๊ธฐ์ˆ ์„ ๊ท€ํ•˜๋กœ๋ถ€ํ„ฐ๋“ค์€ ์—ฌ๋Ÿฌ ํ”ผ๋“œ๋ฐฑ ํฌ์ธํŠธ์— ์ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ๊ท€ํ•˜์—๊ฒŒ ์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค.

  • SSRS ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ํด๋ผ์šฐ๋“œ SaaS (Software-as-a-Service) ๋˜๋Š” PaaS (Platform-as-a-Service)๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Spring '18 Release Notes https://aka.ms/businessappsreleasenotes ์—์„œ ๋ณด์…จ ๋“ฏ์ด, ์šฐ๋ฆฌ๋Š” SSRS ๋ณด๊ณ ์„œ๋ฅผ Power BI ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ์ž‘์—…์„ ์ ๊ทน์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.
  • Power BI ์•ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํœด๋Œ€ํฐ์—์„œ SSRS ๋ณด๊ณ ์„œ๋ฅผ ๋ณด๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š”์ด ๊ธฐ์ˆ ์ด ๋ณด๊ณ ์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ณ , ๋ณด๊ณ ์„œ ๋‚ด์—์„œ ํƒ์ƒ‰ํ•˜๊ณ , ๋ณด๊ณ ์„œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜์žˆ๋Š” ๋” ๋‚˜์€ ๋ฐ˜์‘ ํ˜• UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.
  • Report Viewer ์ปจํŠธ๋กค์ด ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ASP.NET Web Forms ์ปจํŠธ๋กค์ž…๋‹ˆ๋‹ค. ASP.NET Core / MVC ์•ฑ ๋˜๋Š” ๋น„ ASP.NET ์•ฑ์— ํ†ตํ•ฉ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์„ ํ†ตํ•ด ๋ชจ๋“  ์ตœ์‹  ์•ฑ์— ํ†ตํ•ฉ ํ•  ์ˆ˜์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก / JavaScript ๊ธฐ๋ฐ˜ ๋ณด๊ณ ์„œ ๋ทฐ์–ด๋ฅผ ์ œ๊ณตํ•˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋Œ€๊ทœ๋ชจ ์ž‘์—…์ด๋ฉฐ ์•„์ง ๊ณต์œ  ํ•  ์ผ์ •์ด ์—†์ง€๋งŒ ์•ž์œผ๋กœ ๋ช‡ ๊ฐœ์›” ๋™์•ˆ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜๊ณ  ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ์ž์ฃผ ํ”ผ๋“œ๋ฐฑ์„ ๋“ฃ๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์•ž์œผ๋กœ ๋ช‡ ๋‹ฌ ๋™์•ˆ ๊ณ„์† ์ง€์ผœ๋ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฌธ์•ˆ ์ธ์‚ฌ

ํด


๋ณด๋‚ธ ์‚ฌ๋žŒ : Denny Figuerres [[email protected]]
์ „์†ก : 2018 ๋…„ 3 ์›” 23 ์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 2:19
๋ฐ›๋Š” ์‚ฌ๋žŒ : aspnet / Home
์ฐธ์กฐ : Paul Sheldon; ๋…ผํ‰
์ œ๋ชฉ : Re : [aspnet / Home] Asp.Net Core Reporting (SSRS) (# 1528)

@cgountanis https://github.com/cgountanis ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์€ RDLC๋กœ ๋ณด๊ณ ์„œ ์„œ๋ฒ„๊ฐ€ ์—†์œผ๋ฉฐ ์›น ์„œ๋ฒ„๊ฐ€ ๋ณด๊ณ ์„œ๋ฅผ ๋ Œ๋”๋ง ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/aspnet/Home/issues/1528#issuecomment-375408680 ์—์„œ ๋ณด๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/AEHciZa6- ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค,์ด jQuery ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋‹ค์‹œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
๋ธ”๋กœ ํŠธ์›จ์–ด.
๊ทธ๋ฆฌ๊ณ  bloatware๋ฟ๋งŒ ์•„๋‹ˆ๋ผ slowwwwwww ...

๋ธ”๋กœ ํŠธ์›จ์–ด์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์™„๋ฒฝ์„ ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ jQuery UI ๋งŒ ๋ถ€์กฑํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ์ผ์„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚ ์งœ ์„ ํƒ๊ธฐ์— ์ถ”๊ฐ€ ํ•  ์‹œ๊ฐ„์„ ์ฐพ์„ ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„ ์ž ๊น, ๋ฐฉ๊ธˆ ๋ดค์–ด

jquery-ui-1.10.3.forerunner.js

๋‚ด ๋‚˜์œ, ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ.
ํ™•์‹คํžˆ ์™„๋ฒฝํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” jQuery-UI๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž์ฒด ์ˆ˜์ • ๋œ ๋ฒ„์ „๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„ธ์ƒ์—, ์ด๊ฑด ์“ฐ๋ ˆ๊ธฐ ๊ฐ™์•„. ๋ฐ์Šคํฌํ†ฑ์˜ CrApple iPad ๋ฐ ํ„ฐ์น˜ ์Šคํฌ๋ฆฐ ์งํ›„ ์ „ํ™”๋กœ๋ณด๊ณ -์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ ...
๊ทธ๋ฆฌ๊ณ  ํ”„๋ก์‹œ ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” SSRS ๋˜๋Š” ์ธ์ฆ ์ฟ ํ‚ค ๊ณต์œ  (๋‹ค์ค‘ ํ…Œ๋„ŒํŠธ ๊ฐ€์ƒ ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ํ˜ธ์ŠคํŒ…-๋‹จ์ผ ๋„๋ฉ”์ธ ๋‹ค์ค‘ ๊ฐ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ iframe ํฌํ•จ)๋ฅผ ์ธ์ฆ ์ฟ ํ‚ค๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๊ฐ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜). ๋˜๋Š” (SSRS 2016+์—์„œ) IE์™€ Chrome ๋ฐ Firefox์—์„œ ๋™์ผํ•˜๊ฒŒ ํ‘œ ํ…Œ๋‘๋ฆฌ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒฝ์šฐ.
๋˜๋Š” ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ๋ฌธํ™”๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ œ๋ชฉ์„ ๋ฒˆ์—ญํ•˜๊ณ  ๋‚ ์งœ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .MS๊ฐ€ ์–ด์จŒ๋“  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ธ”๋กœ ํŠธ์›จ์–ด์˜ ์ •์˜์ž…๋‹ˆ๋‹ค.

<link href = "~/Forerunner/Common/css/Forerunner-all.css" rel="stylesheet" />
<link href = "~/Forerunner/Lib/jQuery/css/jquery-ui-1.10.3.forerunner.css" rel="stylesheet" />
<link href = "~/Custom/Mobilizer.css" rel="stylesheet" />

<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-1.11.0.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.hammer.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/json2.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/scroll-startstop.events.jquery.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.lazyload.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jsTree/jstree.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/misc/js/jquery.FRmaphilight.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/moment.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-tools.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-widgets.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.form.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.watermark.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.validate1.11.1.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-ui-1.10.3.forerunner.js"></script>
<link href = "~/Forerunner/Common/css/Forerunner-all.css" rel="stylesheet" />
<link href = "~/Forerunner/Lib/jQuery/css/jquery-ui-1.10.3.forerunner.css" rel="stylesheet" />
<link href = "~/Custom/Mobilizer.css" rel="stylesheet" />

<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-1.11.0.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.hammer.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/json2.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/scroll-startstop.events.jquery.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/jquery.lazyload.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jsTree/jstree.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/misc/js/jquery.FRmaphilight.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/Misc/js/moment.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-tools.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Bundles/forerunner-widgets.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.form.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.watermark.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery.validate1.11.1.min.js"></script>
<script type = "text/javascript" src="~/Forerunner/Lib/jQuery/js/jquery-ui-1.10.3.forerunner.js"></script>

์–ด๋•Œ :

<link href = "~/css/CustomerX/3kb_styles.sass" rel="stylesheet" />
<script charset="utf-8" type = "text/javascript" src="~/Scripts/4kb_scripts_with_async.ts.js" async="async"></script>

๋˜๋Š” ๋” ๋‚˜์€

<script async="async"  charset="utf-8" src="js/loader.js?v=1"
data-js="[ 'js/HtmlToolsAsync', 'js/mainAsync' ]"
data-js-ie-edge="['js/polyfills/es6-promise-2.0.0.min', 'js/polyfills/classList']" 
data-css="['css/{@customer}/styles']" data-css-ie-edge="['css/fixes_for_crappy_browsers_only']"></script>

๊ฐ ์Šคํฌ๋ฆฝํŠธ์™€ ์Šคํƒ€์ผ ์‹œํŠธ์— ์œ ๋‹‰์Šค ํƒ€์ž„ ์Šคํƒฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ๊ฐ€ ์ฃผ์–ด ์ง€๋ฏ€๋กœ ๋ณ€๊ฒฝ / ์ˆ˜์ •์ด ์‹ค์ œ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฌธํ™” ๋ณ„ ๋ฌธ์ž์—ด ๋Œ€์‹  unix-timestamp๋กœ datetime ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  2030 ๋˜๋Š” 9999 ์ด์ƒ์˜ ๋‚ ์งœ์— ๋Œ€ํ•ด ์‹คํŒจํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ™•์žฅ ๋œ ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ. ๋˜๋Š” UTF8 ๋ฌธ์ž. ์ด์ œ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์“ฐ๋Š” ์–ธ์–ด ์ง€์›์— ๊ด€ํ•ด์„œ๋Š” Microsoft์— ๋Œ€ํ•œ ์ œํ•œ์„ ๋„ˆ๋ฌด ๋งŽ์ด ๋Š˜๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๋ณด๋‹ค ์˜ค๋ž˜ ์ „์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ์ด์ƒ์˜ ์œ ๋Ÿฝ ์–ธ์–ด (์˜ˆ : ์˜์–ด, ๋…์ผ์–ด, ํ”„๋ž‘์Šค์–ด ๋ฐ ์ดํƒˆ๋ฆฌ์•„์–ด)์—์„œ ๋™์‹œ์— ์ž‘๋™ํ•œ๋‹ค๋ฉด ์ด๋ฏธ ๋‚ด ๊ธฐ๋Œ€์น˜๋ฅผ ์ดˆ๊ณผํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Microsoft์—๊ฒŒ, ๋ณด๊ณ ์„œ์— ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๋ฒˆ์—ญ๋˜์–ด ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.์ด๋ฅผ ์œ„ํ•ด ๋งค๋ฒˆ ๋ธŒ๋ผ์šฐ์ €์˜ ์–ธ์–ด ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ํ•„์š”์—†์ด ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (๋˜๋Š” ๊ณ ๊ฐ์—๊ฒŒ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€์˜ ๊ถ๊ทน์  ์ธ ์„ฑ๊ณผ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ Windows 8๋กœ ์ „ํ™˜ ํ•œ ํ›„ ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์žŠ์„ ์ˆ˜์—†๋Š” [๋งค์šฐ ๋ถ€์ •์ ์ธ] ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค.
๊ณต๊ฐํ•  ์ˆ˜์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ-์˜์–ด๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์„ค์ •๋œ ์ปดํ“จํ„ฐ์—์„œ ์ž‘์—…ํ•˜๋Š” ์˜์–ด ์‚ฌ์šฉ์ž๋„์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ ์–ธ์–ด ์„ค์ •์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ‘œ์‹œ ์–ธ์–ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ด๋ฒˆ์—๋Š” ์ด๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ ๋‹น์‹ ์ดํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , SSRS์˜ ํ˜„์žฌ ํ™”์‹ ์—์„œ ๋ฌธํ™”๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

& in_language = IETF-language-tag๋กœ ๋ณด๊ณ ์„œ ํ˜ธ์ถœ

\ ์ปดํ“จํ„ฐ ์ด๋ฆ„ \ Reporting Services \ ReportServerPages \ ReportViewer.aspx

<script type="text/C#" runat="server">

protected override void InitializeCulture()
{
    string language = System.Web.HttpContext.Current.Request.QueryString["in_language"];

    if (string.IsNullOrEmpty(language))
        language = "";

    switch (language.ToLowerInvariant())
    {
        case "de":
            language = "de-CH";
            break;
        case "fr":
            language = "fr-CH";
            break;
        case "it":
            language = "it-CH";
            break;
        case "en":
            language = "en-US";
            break;
        default:
            language = "";
            break;
    }

    // System.Web.HttpContext.Current.Response.Write(language);
    if (!String.IsNullOrEmpty(language))
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(language);
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
    }

    base.InitializeCulture();
}
</script>

๊ทธ๋Ÿฐ ๋‹ค์Œ http ์š”์ฒญ์—์„œ ์–ธ์–ด๋ฅผ ๋ฎ์–ด ์จ์•ผํ•ฉ๋‹ˆ๋‹ค (SSRS์˜ ์‚ฌ์šฉ์ž ์ง€์ • HTTP ๋ชจ๋“ˆ).
(๊ทธ๋ฆฌ๊ณ  P3P ์ •์ฑ…์€ form-login-post๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ iframe์—์žˆ์„ ๋•Œ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค).

(DISPLAY) ์–ธ์–ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์„ ๊นจ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
rs:ParameterLanguage ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ๋ณด๊ณ ์„œ ํ‘œ์‹œ๊ฐ€ ์•„๋‹Œ URL์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜์—๋งŒ ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ฒ˜์Œ์— ์กด์žฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ง€ datetime์„ unix-timestamp (UTC)๋กœ ์ „๋‹ฌํ–ˆ๋‹ค๋ฉด. ๋ฌผ๋ก  ํ•ญ์ƒ ๋™์ผํ•œ ์ถœ์ฒ˜ ํ—ค๋” ๋˜๋Š” ํ—ˆ์šฉ ์ถœ์ฒ˜ ํ—ค๋” ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค (iframe์€ ReportServer์™€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ์žˆ์Œ). ๊ทธ๋Ÿฐ๋ฐ HTTP ๋ชจ๋“ˆ์—์„œ ์š”์ฒญ ์–ธ์–ด๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ SSRS 2016์„ ์‚ฌ์šฉํ•˜๋Š” datepicker๋ฅผ ํ•„์ˆ˜ ์–ธ์–ด๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด en-US datepicker๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ JavaScript๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•˜์ง€ ์•Š๋‚˜์š”?

& rs : language = IETF / IANA ์–ธ์–ด ํƒœ๊ทธ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


        void System.Web.IHttpModule.Dispose()
        {
            // throw new NotImplementedException();
        }


        void System.Web.IHttpModule.Init(System.Web.HttpApplication context)
        {
            // https://stackoverflow.com/questions/441421/httpmodule-event-execution-order
            context.BeginRequest += new System.EventHandler(context_BeginRequest);
            context.EndRequest += new System.EventHandler(context_EndRequest);
        }


        void context_BeginRequest(object sender, System.EventArgs e)
        {
            System.Web.HttpApplication application = sender as System.Web.HttpApplication;
            System.Web.HttpContext context = application.Context;

            if (context.Request != null)
            {
                // string language = context.Request.Headers["Accept-Language"];
                string language = null;
                // string url = context.Request.RawUrl;
                // string referrer = null;


                if (context.Request.UrlReferrer != null)
                {
                    // referrer = context.Request.UrlReferrer.OriginalString;

                    string queryString = context.Request.UrlReferrer.Query;
                    System.Collections.Specialized.NameValueCollection queryStrings = System.Web.HttpUtility.ParseQueryString(queryString);
                    language = queryStrings["in_language"];
                }

                if (context.Request.QueryString["in_language"] != null)
                    language = context.Request.QueryString["in_language"];

                if (!string.IsNullOrEmpty(language))
                {
                    language = language.ToLowerInvariant();

                    switch (language)
                    {
                        case "de":
                            language = "de-CH";
                            break;
                        case "fr":
                            language = "fr-CH";
                            break;
                        case "it":
                            language = "it-CH";
                            break;
                        case "en":
                            language = "en-US";
                            break;
                        default:
                            language = "";
                            break;
                    }

                } // End if (!string.IsNullOrEmpty(language)) 

                // SQL.Log(url, referrer, language);


                // Simulate Browser-Language = language 
                if (!string.IsNullOrEmpty(language))
                {
                    // context.Request.Headers["Accept-Language"] = language;

                    System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(language);
                    System.Threading.Thread.CurrentThread.CurrentCulture = culture;
                    System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

                    for (int i = 0; i < context.Request.UserLanguages.Length; ++i)
                    {
                        // context.Request.UserLanguages[i] = "en-US";
                        context.Request.UserLanguages[i] = language;
                    }

                } // End if (!string.IsNullOrEmpty(language)) 

            } // End if (context.Request != null) 


        } // End Sub context_BeginRequest 



        // https://stackoverflow.com/questions/31870789/check-whether-browser-is-chrome-or-edge
        public class BrowserInfo
        {

            public System.Web.HttpBrowserCapabilities Browser { get; set; }
            public string Name { get; set; }
            public string Version { get; set; }
            public string Platform { get; set; }
            public bool IsMobileDevice { get; set; }
            public string MobileBrand { get; set; }
            public string MobileModel { get; set; }


            public BrowserInfo(System.Web.HttpRequest request)
        {
            if (request.Browser != null)
            {
                if (request.UserAgent.Contains("Edge")
                    && request.Browser.Browser != "Edge")
                {
                    this.Name = "Edge";
                }
                else
                {
                    this.Name = request.Browser.Browser;
                    this.Version = request.Browser.MajorVersion.ToString();
                }
                this.Browser = request.Browser;
                this.Platform = request.Browser.Platform;
                this.IsMobileDevice = request.Browser.IsMobileDevice;
                if (IsMobileDevice)
                {
                    this.Name = request.Browser.Browser;
                }
            }
        }


    }


    void context_EndRequest(object sender, System.EventArgs e)
    {
        if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)
        {
            System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;

            try
            {
                // response.Headers["P3P"] = "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"":
                // response.Headers.Set("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
                // response.AddHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
                response.AppendHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");

                // response.AppendHeader("X-Frame-Options", "DENY");
                // response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
                // response.AppendHeader("X-Frame-Options", "AllowAll");

                if (System.Web.HttpContext.Current.Request.UrlReferrer != null)
                {
                    // "X-Frame-Options": "ALLOW-FROM " Not recognized in Chrome 
                    string host = System.Web.HttpContext.Current.Request.UrlReferrer.Scheme + System.Uri.SchemeDelimiter
                        + System.Web.HttpContext.Current.Request.UrlReferrer.Authority
                        ;

                    string selfAuth = System.Web.HttpContext.Current.Request.Url.Authority;
                    string refAuth = System.Web.HttpContext.Current.Request.UrlReferrer.Authority;

                    // SQL.Log(System.Web.HttpContext.Current.Request.RawUrl, System.Web.HttpContext.Current.Request.UrlReferrer.OriginalString, refAuth);

                    if (IsHostAllowed(refAuth))
                    {
                        BrowserInfo bi = new BrowserInfo(System.Web.HttpContext.Current.Request);

                        // bi.Name = Firefox
                        // bi.Name = InternetExplorer
                        // bi.Name = Chrome

                        // Chrome wants entire path... 
                        if (!System.StringComparer.OrdinalIgnoreCase.Equals(bi.Name, "Chrome"))
                            response.AppendHeader("X-Frame-Options", "ALLOW-FROM " + host);

                        // unsafe-eval: invalid JSON https://github.com/keen/keen-js/issues/394
                        // unsafe-inline: styles
                        // data: url(data:image/png:...)

                        // https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet
                        // https://www.ietf.org/rfc/rfc7034.txt
                        // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
                        // https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

                        // https://stackoverflow.com/questions/10205192/x-frame-options-allow-from-multiple-domains
                        // https://content-security-policy.com/
                        // http://rehansaeed.com/content-security-policy-for-asp-net-mvc/

                        // This is for Chrome:
                        // response.AppendHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: *.msecnd.net vortex.data.microsoft.com " + selfAuth + " " + refAuth);


                        System.Collections.Generic.List < string > ls = new System.Collections.Generic.List<string>();
                        ls.Add("default-src");
                        ls.Add("'self'");
                        ls.Add("'unsafe-inline'");
                        ls.Add("'unsafe-eval'");
                        ls.Add("data:");

                        // http://az416426.vo.msecnd.net/scripts/a/ai.0.js

                        // ls.Add("*.msecnd.net");
                        // ls.Add("vortex.data.microsoft.com");

                        ls.Add(selfAuth);
                        ls.Add(refAuth);

                        string contentSecurityPolicy = string.Join(" ", ls.ToArray());
                        response.AppendHeader("Content-Security-Policy", contentSecurityPolicy);
                    }
                    else
                    {
                        response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
                    }

                }
                else
                    response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
            }
            catch (System.Exception ex)
            {
                // WTF ? 
                System.Console.WriteLine(ex.Message); // Suppress warning
            }

        } // End if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)

    } // End Using context_EndRequest


        private static string[] s_allowedHosts = new string[]
    {
        "localhost:49533"
            , "localhost:52257"
            , "www.companyX.com"
            , "companyX.com"
            , "vmcompany1"
            , "vmcompany2"
            , "vmbank1"
            , "vmbank2"
    };


        public static bool IsHostAllowed(string host)
    {
        return Contains(s_allowedHosts, host);
    } // End Function IsHostAllowed 


        public static bool Contains(string[] allowed, string current)
    {
        for (int i = 0; i < allowed.Length; ++i)
        {
            if (System.StringComparer.OrdinalIgnoreCase.Equals(allowed[i], current))
                return true;
        } // Next i 

        return false;
    } // End Function Contains 


} // End Class RequestLanguageChanger 


} // End Namespcae libRequestLanguageChanger 

Microsoft๋Š” ํ•ด๋‹น ํ”„๋ก ํŠธ ๋Ÿฌ๋„ˆ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค!
์ตœ์‹  ํด๋ผ์ด์–ธํŠธ ์ธก ์›น ์•ฑ์€ j ์ฟผ๋ฆฌ์—์„œ es ๋ชจ๋“ˆ ๋“ฑ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ๋งŽ์€ j ์ฟผ๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด j ์ฟผ๋ฆฌ ๋”๋ฏธ๋ณด๋‹ค๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ pdf ๋˜๋Š” ํ˜„์žฌ asp.net ์ปจํŠธ๋กค์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Angular 2-6 ๋ฐ ๋…ธ๋“œ ๋ฐ ๊ธฐํƒ€ ์›น ํด๋ผ์ด์–ธํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ์™€ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” npm ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.
๋˜ํ•œ SSRS ๋ Œ๋”๋ง์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ๋œ ์›น ์„œ๋น„์Šค API ์„ธํŠธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„, ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ด๋ฏธ ๊ฐ€์ง€๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ REST / JSON ๋ฒ„์ „์˜
http : //localhost/ReportServer/ReportExecution2005.asmx
(์šฐ๋ฆฌ / ๋ˆ„๊ตฌ๋‚˜ URL์„ ์‚ฌ์šฉ์ž ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์•„ํ”„์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)
๋„ˆ๊ฒŸ ํŒจํ‚ค์ง€๋กœ-Linux / Mac์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ํŒจํ‚ค์ง€.
์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์œ ์ผํ•œ ์ž‘์—…์€ .NET ์ฝ”๋“œ๋ฅผ .NET Core / NetStandard๋กœ ์ด์‹ํ•˜๊ณ  Windows dll์— ๋Œ€ํ•œ ๋ชจ๋“  pinvoke๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›น ์„œ๋น„์Šค (ํ˜„์žฌ๋Š” asp.net-render-control์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์กฑํ•จ)๋ฅผ ํ†ตํ•ด PAGED html์„ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ํŒŒ์ผ ์ด๋ฆ„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ ์„ ํƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. XmlDocument๋กœ RDL์„ ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
(์˜ต์…˜ ๋ช…์‹œ ์  ํ•ด์ œ, ์˜ต์…˜ ์—„๊ฒฉ ํ•ด์ œ, VB ์ฝ”๋“œ๋กœ ์˜ต์…˜ ์œ ์ถ”์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ)
ASP.NET-WebForms ํ•ญ๋ชฉ์ด์—†๋Š” ํ˜„์žฌ ASP.NET ์ปจํŠธ๋กค๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ํ•œ ์ค„์˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์กฐ์ฐจ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค, ํšŒ์‚ฌ๋งˆ๋‹ค, ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ผ๋ถ€๋Š” jQuery์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Angular์™€ ๊ฐ™์€ ์ผ๋ถ€. ์ผ๋ถ€๋Š” Vue์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” React์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” NPM์„ ์‚ฌ์šฉํ•˜๋Š” NodeJS, ์ผ๋ถ€๋Š” bower, ์ผ๋ถ€๋Š” TypeScript, ์ผ๋ถ€๋Š” Babel, ์ผ๋ถ€ ํ๋ฆ„, ์ผ๋ถ€๋Š” datepicker์— jQuery-UI๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ €๋Š” ์ดˆํŒŒ๋ฆฌ์˜ ์ˆ˜๋ช…, ๋ฒ„์ „ ๊ฐ„ ๋น„ ํ˜ธํ™˜์„ฑ, ๋ถ€ํ’€์Œ, ๋น„ ๋ชจ๋“ˆํ™” ๋ฐ ํ•™์Šต ๊ณก์„ ์„ ๊ฐ€์ง„ ๋ชจ๋“  ํ”„๋ ˆ์ž„ ์›Œํฌ (ํŠนํžˆ jquery-ui)๋ฅผ ํฌ๊ฒŒ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์ฐธ๊ณ  : ์ด๋กœ์จ ์ €๋Š” ์ œ๊ฐ€ํ•˜๋Š” ์ผ์„ ํ•ญ์ƒ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). npm / bower์™€ ๊ฐ™์€ ๊ณ ์žฅ๋‚œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ฆ๊ฑฐ์›€์„ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ถˆ์พŒํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” VanillaJS๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (ECMA ๋ชจ๋“ˆ๊ณผ ๋น„๋™๊ธฐ-๋ฐ”๋ฒจ ๋˜๋Š” ํƒ€์ดํ”„ ์Šคํฌ๋ฆฝํŠธ๋กœ ํŠธ๋žœ์Šค ํŒŒ์ผ ๋จ-๊ทธ๋ฆฌ๊ณ  ํŠธ๋žœ์Šค ํŒŒ์ผ๋Ÿฌ์— ๊ด€์‹ฌ์ด์žˆ๋Š” ์‚ฌ๋žŒ).

๋ฌผ๋ก  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์˜ ํ•  ์ด์œ ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. jquery-ui์™€ ํ•จ๊ป˜ coffeescript์™€ emacs๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹น์‹ ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์›ํ•œ๋‹ค๋ฉด vue๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค-๊ทธ ๊ธธ์„ ๊ฐ•์š”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” jquery / angular / vue / react / bower / npm ๋˜๋Š” ๊ทธ ๋ถ€ํ’€์Œ๊ณผ ์‹ ๋ขฐ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰, ReportServer (RDLC์™€ ๋ฐ˜๋Œ€) ์—์„œ์ฒ˜๋Ÿผ ๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์ดํŠธ์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ˜„์žฌ์˜ reportviewer-control๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ „์ ์œผ๋กœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. . ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒฝ์šฐ ๋ณด๊ณ ์„œ "์ œ์–ด"์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ECMA ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•˜์—ฌ node / npm์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€์—†๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€ / JSON ๋ฒ„์ „์€ JSON์œผ๋กœ, ๋‹จ์ง€ ๋ Œ๋”๋ง ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค์—์„œ ํ•„ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ sidenode์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ์‹ฌ์ง€์–ด RDL ํŒŒ์ผ์„ ์ฝ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค, ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ์œ ์—” JS ๋ณต์žก ํ•  ๊ฒƒ์ด๋‹ค ๋„์„œ๊ด€. ํ˜„์žฌ ๋งค๊ฐœ ๋ณ€์ˆ˜์—์„œ ํ—ˆ์šฉ๋˜๋Š” VB ์ฝ”๋“œ๋Š” ์–ด์จŒ๋“  ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ์ด ์ž‘์—…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๋” ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์„œ๋น„์Šค๊ฐ€ ๋ณด๊ณ ์„œ์˜ ๊ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ JSON์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’๋„ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณด๊ณ ์„œ์— ์‚ฌ์šฉ ๋œ SQL ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•์„ฑ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!
(ํ˜„์žฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ณด๊ณ ์„œ๋Š” ๋‹ค์†Œ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค)

ํ˜•์‹ํ™”์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ์ถ”๊ฐ€ ์Šคํƒ€์ผ ์‹œํŠธ๊ฐ€ ํŠธ๋ฆญ์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค (SASS ๋ฐ”๋ž๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ / ๋Œ€์ฒด ๋ Œ๋”๋Ÿฌ๋ฅผ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์ด์ด๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•ฉ๋‹ˆ๋‹ค. ยจ

ํ•˜์ง€๋งŒ ํ•ต์‹ฌ์€ ๋‹ค์ค‘ ํ”Œ๋žซํผ ๋ณด๊ณ ์„œ ๋ Œ๋”๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ ์žˆ์œผ๋ฉด๋ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ์ด๋ฏธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ์กด ์ปจํŠธ๋กค์˜ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•„์š”ํ•œ ์ž‘์—…์˜ ์ „๋ถ€ ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์„ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์™„์ „ํžˆ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Microsoft๋Š” ํ•œ ํ‘ผ๋„ ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

alanjuden MvcReportViewer๊ฐ€ SSRS 2017 ๋ฐ ์ฝ”์–ด 2์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? SSRS 2017 ๋ฐ ์ฝ”์–ด 2์—์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ, ๋งŽ์€ ๋‘ํ†ต ์—†์ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…์€ ์ง์ ‘ reportexecution2005 ์ธ imho๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PDF๋ฅผ ์ง์ ‘ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ํœด๋Œ€ ์ „ํ™”์™€ ํƒœ๋ธ”๋ฆฟ์— ๋Œ€ํ•ด ๋ฐ˜์‘ ํ˜• ํ˜•์‹์œผ๋กœ ๊ธฐ์กด ์‹œ์ฒญ์ž๋ฅผ ํ™•๋ณดํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@Mahenbisht , ์ฝ”์–ด 2์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํŒจํ‚ค์ง€๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์†Œ์Šค์—์„œ ๋นŒ๋“œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„์ง 2017 ๋…„์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

SSRS 2017 ๋ฐ ์ฝ”์–ด 2์™€ ํ•จ๊ป˜ SQL Server 2017์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
alanjuden.MvcReportViewer.NetCore๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@Mahenbisht , ๋‚˜๋Š” ํ•œ๋™์•ˆ ๋‚ด ํ™œ๋™์ด๋ณ„๋กœ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋น„์Šทํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉ์ค‘์ธ (SSRS์— ๋‚ด์žฅ ๋œ)๋ณด๊ณ  ์„œ๋น„์Šค API์— ํ•ญ์ƒ ์—ฐ๊ฒฐํ•˜์—ฌ ์ž์ฒด ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Mahenbisht : ์—ฌ๊ธฐ์— .NET Core nuget ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://www.nuget.org/packages/AspNetCore.ReportViewer/
๋ถˆํ–‰ํžˆ๋„ ์†Œ์Šค๊ฐ€ ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—์„œ ๋”” ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค (์ปดํŒŒ์ผ).

.NET Core ์šฉ ReportExecution2005 & ReportService2010-WSDL์—์„œ ์ƒ์„ฑ ๋œ ํด๋ž˜์Šค ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ SSRS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์ค‘์ธ SQL ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด์žˆ๋Š” ๊ฒฝ์šฐ ์ž์ฒด ๋ทฐ์–ด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์˜ณ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ ํŽ˜์ด์ง€ ๋œ html ์ถœ๋ ฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด deviceinfo๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ (์ด๋ก ์ ์œผ๋กœ) ํ˜„์žฌ ์ž‘์—…ํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@alanjuden : ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์€ ReportingServices๊ฐ€ ์„ค์น˜๋œ SQL-Server ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ iframe์„ / ReportServer์— ์ถ”๊ฐ€ํ•˜๊ณ ๋ณด๊ณ  ์„œ๋น„์Šค์— ์•ฝ๊ฐ„์˜ ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฆ + W3C ํ—ค๋” ๋ฐ ์–ธ์–ด ๋กœ์ปฌ ๋ผ์ด์ € DLL์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž‘์—…์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ๋ฌธ์ œ๋Š”
A) N ๊ณ ๊ฐ์ด ํ•ญ์ƒ ๋™์ผํ•œ ๋ฒ„์ „์˜ SSRS๋ฅผ ์„ค์น˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค (๋ชจ๋“  ๋ˆ„์  ์—…๋ฐ์ดํŠธ / ์„œ๋น„์Šค ํŒฉ ํฌํ•จ-์ œ ๊ฒฝ์šฐ์—๋Š” ํ˜„์žฌ SSRS-2008R1์—์„œ 2016๊นŒ์ง€).
B) SSRS-Express ์„ค์น˜๋Š” ๋กœ์ปฌ ์ปดํ“จํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋งŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์งœ์ฆ๋‚˜๋Š” ๊ฒƒ์€ Windows๊ฐ€ ์•„๋‹Œ PC (Linux, Mac)์—์„œ ์ž‘๋™ํ•˜๋Š” ReportViewer ์ปจํŠธ๋กค์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ .NET์„ Birt ๋˜๋Š” Jasper ์šฉ Java์™€ ๊ฒฐํ•ฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” xcopy-deployment๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2-3 ๋ณด๊ณ ์„œ ํ˜•์‹๊ณผ ์ „์ฒด Java JVM ๋ฐ tomcat ๋ฐ / ๋˜๋Š” ๊ธฐํƒ€ ๊ทธ๋Ÿฌํ•œ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ํฌํ•จํ•œ birt / jasper ๋ธ”๋กœ ํŠธ์›จ์–ด์˜ ์˜ค๋ฒ„ ํ—ค๋“œ.
C) ReportingService๊ฐ€ ํ†ตํ•ฉ Windows ์ธ์ฆ์„ ์‚ฌ์šฉํ•จ. ๋”ฐ๋ผ์„œ Windows๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ธํŠธ๋ผ๋„ท ์™ธ๋ถ€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฆ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ReportingServices์— ๋Œ€ํ•œ ์ˆ˜์ • ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์–ด์•ผํ•˜๋ฉฐ ์ˆ˜์ • ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์†์ƒ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ •์ƒ์ ์ธ ๊ณ ๊ฐ์€ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. SSRS / SQL-Server (๋น„์šฉ์ด ๋“ ๋‹ค).
๋˜ํ•œ D) ReportViewer.aspx๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋Š” ReportingService ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์—ญํ™” ํ•  ์ˆ˜ ์—†์Œ, C ์ฐธ์กฐ)
๋˜ํ•œ E) SSRS <2016์˜ ๋ชจ๋“  ๋ฒ„์ „์€ quirks-html์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  2016+๊ฐ€ ๋” ๋‚ซ์ง€ ๋งŒ ๊ทธ ์ ์—์„œ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. btw)
๊ทธ๋Ÿฌ๋‚˜ 2008 ๋…„์˜ ์ด์ „ ๋ฒ„์ „์ด 2018 ๋…„์— ๋‚จ์•„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 2016 ๋…„ ๋ฏธ๋งŒ์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์‚ฌ๋ผ์ง€๋Š” ๋ฐ 5 ~ 10 ๋…„์ด ๋” ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ SSRS 2016์€ ์–ด์จŒ๋“  ์ ˆ๋ง์ ์œผ๋กœ ๊ตฌ์‹์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ Microsoft๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ Docker๋ฅผ ๊ตฌ์ถœํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์“ฐ๋ ˆ๊ธฐ์ž…๋‹ˆ๋‹ค.

๋ณด๊ณ  ์„œ๋น„์Šค์— ์•ฝ๊ฐ„์˜ ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฆ + W3C ํ—ค๋” ๋ฐ ์–ธ์–ด ์ง€์—ญํ™” DLL์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@ststeiger ๋ฉ”์ธ ์‚ฌ์ดํŠธ ๋ฐ W3C ํ—ค๋”์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฆ์„ ์ „๋‹ฌํ•˜๋Š” iframe whit์— SSRS ๋ทฐ์–ด๋ฅผ

@adopilot : ๋Œ€๋žต์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SSRS์— ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฆ ์ถ”๊ฐ€

https://github.com/Microsoft/Reporting-Services/tree/master/CustomSecuritySample

(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹น ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
SSRS ์‚ฌ์šฉ์ž ๋ฐ ๊ถŒํ•œ์„ ์–‘์‹ ์‚ฌ์šฉ์ž์™€ ๋™๊ธฐํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํด๋”์— ๋Œ€ํ•œ์ด ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋งŒ ๋ถ€์—ฌํ•˜์‹ญ์‹œ์˜ค.
)

p3p ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๋Š” http ๋ชจ๋“ˆ์„ SSRS์— ์ถ”๊ฐ€ํ•˜๊ณ  context.Request.UserLanguages โ€‹โ€‹[i]๋ฅผ ์„ ํƒํ•œ ์–ธ์–ด๋กœ ๋ฎ์–ด ์”๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด datepicker๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ).

ReportServer์˜ ๋กœ๊ทธ์˜จ ํŽ˜์ด์ง€๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ฒŒ์‹œํ•˜๋„๋ก ๋ฐ˜์‘ํ•˜๊ณ  login_cookie๋ฅผ ์„ค์ • ํ•œ ๋‹ค์Œ ๊ฒŒ์‹œ ๋œ ๋ณด๊ณ ์„œ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ FormsAuthentication_RS2012์˜ ํด๋ž˜์Šค FormsAuthentication_RS2012.LogOn์—์žˆ๋Š” Page_Load์˜ ์ฝ”๋“œ

์–‘์‹์˜ ๊ณต๊ฐœ ํ‚ค๋กœ ์•”ํ˜ธํ™” ๋œ ์œ ๋‹‰์Šค ํƒ€์ž„ ์Šคํƒฌํ”„ (์žฌ์ƒํ•  ์ˆ˜ ์—†์Œ)๋กœ PGP / RSA ์•”ํ˜ธํ™” ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  page_load์˜ FormsAuthentication_RS2012์—์„œ ์‚ฌํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋…ํ•ฉ๋‹ˆ๋‹ค.

(ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ๊ฐœ์ธ ํ‚ค์™€ ๊ด€๋ฆฌ์ž ์•”ํ˜ธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ FormsAuthentication_RS2012 ์ฝ”๋“œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

<%@ Page Language="C#" AutoEventWireup="true" Inherits="FormsAuthentication_RS2012.LogOn, FormsAuthentication_RS2012" %>

<!DOCTYPE html PUBliC "-//W3C//DTD Xhtml 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" /> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>SSRS Login</title>

    <style type="text/css" media="all">

        html, body
        {
            width: 100%;
            height: 100%;
            margin: 0px;
            padding: 0px;
            overflow: auto;
        }


        .divLayout 
        {
            float: left;
            height: 100%;
            background-color: #d4d4d4;
        }


        .spnTitle 
        {
            color: #0060a6;
            font-size: 45px;
            margin: 0;
            font-weight: normal;
            padding-top: 10%;
        }


        .spnLogin 
        {
            font-family: '?Segoe', 'Segoe UI', Segoe, Arial, sans-serif;
            font-size: 26px;
            vertical-align: middle;
            padding-left: 10px;
        }


        .btnLogin 
        {
            border: none;
            width: 204px;
            height: 64px;
            background-color: #d4d4d4;
            vertical-align: middle;
            text-align: center;
            color: #525252;
        }


        .btnLogin:hover
        {
            color: #FFFFFF;   
        }


        .btnLogin:hover .spnLoginSymbol 
        {
            /* http://stackoverflow.com/questions/7217244/style-child-element-when-hover-on-parent */
            background-image: url('<%=FormsAuthentication_RS2012.LogonHelper.GetPageName() %>?image=whiteForward_37x36.png');
        }


        .spnLoginSymbol
        {
            display: inline-block;
            width: 37px;
            height: 36px;
            background-image: url('<%=FormsAuthentication_RS2012.LogonHelper.GetPageName() %>?image=82Forward_37x36.png');
            background-repeat: no-repeat;
            background-size: 100% auto;
            vertical-align: middle;

            color: #525252;
        }


        .spnLoginSymbol:hover
        {
            background-image: url('whiteForward_37x36.png');
        }


        .lblCaption 
        {
            font-family: 'โ˜บSegoe', "Segoe UI", Segoe, Arial, sans-serif;
            font-size: .9em;
            display: block;
        }


        input[type=text]
        {
            border: 2px solid rgb(187, 187, 187);
            <asp:Literal Id="litUserNameStyle" runat="server" />
        }


        input[type=password] 
        {
            border: 2px solid rgb(187, 187, 187);
            <asp:Literal Id="litPWStyle" runat="server" />
        }


        input[type=text]:hover, input[type=password]:hover 
        {
            border: 2px solid rgb(237, 206, 0);
        }


        .CorLink
        {
            color: #BF0A1E; 
        }


        .CorLink:hover
        {
            color: rgb(103, 12, 12);
        }

    </style>

</head>
<body>

    <div style="position: absolute; top: 0px; width: 100%; height: 1.5cm; line-height: 1.5cm; vertical-align: middle; text-transform: uppercase; font-weight: bold; background-color: #000000; color: #FFFFFF; text-align: center; font-size: 13px; font-family: 'โ˜บSegoe', 'Segoe UI', Segoe, Arial, sans-serif; ">
        <asp:Literal Id="litAuthentication" Text="Forms-Authentication" runat="server" />
    </div>


    <div class="divLayout" style="background-color: #0060A6; width: 30%; text-align: center;">
        <img src="<%=FormsAuthentication_RS2012.LogonHelper.GetPageName() %>?image=mydb3.png" style="margin-top: 40%; margin-left: -50px;" alt="logo" />

        <!-- 

        <img src="accountsicon.png" style="margin-top: 30%;" alt="logo" />
        <img src="mydb3.png" style="margin-top: 30%;" alt="logo" />
        <img src="reportsicon.png" style="margin-top: 30%; width: 20%;" alt="logo" />

        <img src="hap-logo-128.png" style="margin-top: 30%;" alt="logo" />
        -->
    </div>

    <div class="divLayout" style="background-color: #F3F3F3; width: 70%;">





        <div class="greenBorder" style="display: table; width: 100%; height: 100%; #position: relative; overflow: hidden;">

            <div style=" #position: absolute; #top: 50%;display: table-cell; vertical-align: middle;">
                <div style=" #position: relative; #top: -50%">


                    <div style="display: table; margin-right: auto; margin-left: auto;padding-left: 1cm; padding-right: 1cm;">
                        <!--
                        <b>TEST environment</b>
                        -->

                        <span class="spnTitle">
                            SQL Server Reporting Services 2012
                        </span>

                        <div style="display: block; height: 30px;"></div>

                          <form id="form1" target="_self" method="post" runat="server">

                            <div>
                                <label for="txtUserName" class="lblCaption"><asp:Literal Id="litlblUserName" runat="server" />:</label>
                                <input id="txtUserName" name="txtUserName" type="text" style="width: 300px;" />
                            </div>


                            <div>
                                <label for="txtPassword" class="lblCaption"><asp:Literal Id="litlblPassword" runat="server" />: </label>
                                <input id="txtPassword" name="txtPassword" type="password" style="width:300px;" />
                            </div>

                            <div style="display: block; height: 30px; clear: both;"></div>


                            <button type="submit" class="btnLogin" style="">
                                <!--
                                <img src="82Forward_37x36.png" alt="arrow" style="vertical-align: middle; margin-top: 0px;" />
                                -->
                                <span class="spnLoginSymbol"></span>
                                <span class="spnLogin">Login</span>
                            </button>

                        </form>

                    </div>

                </div>
            </div>
        </div>



    </div>
    <!-- End divLayout -->


    <div style="position: absolute; bottom: 0px; width: 100%; height: 1.5cm; line-height: 1.5cm; vertical-align: middle; background-color: #000000; color: #FFFFFF; text-align: center; font-family: 'โ˜บSegoe', "Segoe UI", Segoe, Arial, sans-serif; font-size: 13px;">
        Copyright &copy; 2013 

        <a href="http://www.cor-management.ch" target="_blank" class="CorLink" onclick="$('html, body').animate({ scrollTop: 0 }); return false;">
            COR Managementsysteme GmbH
        </a>

    </div>

</body>
</html>

</body>
</html>

ReportViewer.aspx์— ์ถ”๊ฐ€

<script type="text/C#" runat="server">

    protected override void InitializeCulture()
    {
        string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"];

        if(string.IsNullOrEmpty(sprache))
            sprache = "";

        switch(sprache.ToLowerInvariant())
        {
            case "de":
                sprache = "de-CH";
                break;
            case "fr":
                sprache = "fr-CH";
                break;
            case "it":
                sprache = "it-CH";
                break;
            case "en":
                sprache = "en-US";
                break;
            default:
                sprache = "";
                break;
        }

        // System.Web.HttpContext.Current.Response.Write(sprache);
        if(!String.IsNullOrEmpty(sprache))
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache);
        }

        base.InitializeCulture();
    }

</script>

reportviewer.aspx์— ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
(
๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋…์ผ์–ด / ํ”„๋ž‘์Šค์–ด / ์ดํƒˆ๋ฆฌ์•„์–ด / ์˜์–ด๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
)
/๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋…์ผ์–ด๋กœ ๊ธฐ๋ณธ ์„ค์ • (์˜์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ)
๋ณด๊ณ ์„œ URL์— in_language (in_sprache) ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์•„์ด๋””์–ด๋ฅผ ์ดํ•ด ํ•œ ๊ฒฝ์šฐ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

function initLanguage()
{
    var language = null;
    var StyleSheetSet = null;
    var BrowserLanguage = <%= System.Web.HttpContext.Current.Request.UserLanguages != null ? "\"" + System.Convert.ToString(System.Web.HttpContext.Current.Request.UserLanguages[0]) + "\"" : "null" %>;

    if(BrowserLanguage == null)
        BrowserLanguage = window.navigator.userLanguage || window.navigator.language;

    if(BrowserLanguage != null)
        BrowserLanguage = BrowserLanguage.substr(0,2).toLowerCase();



    var dictParameters = getUrlVars(this.location.href);

    if (dictParameters != null && dictParameters.contains("rc:Stylesheet"))
        StyleSheetSet = true;

    if (dictParameters != null && dictParameters.contains("in_sprache"))
        language = dictParameters["in_sprache"];

    if(language == null)
        language = BrowserLanguage;

    if(language == null)
        language = "de";

    language = language.toLowerCase();

    return language;
} // End function initLanguage


function TranslateParameterPrompts(iLanguageIndex)
{
    var eles = document.getElementsByTagName("table");
    var strParamTableId = "ParametersGridReportViewerControl";
    var tblParameters = null;
    var ParamLabels = null;


    for(var j = 0; j < eles.length; ++j)
    {
        // console.log(eles[j]);

        if(eles[j] != null && eles[j].id != null)
        {
            if(eles[j].id.slice(0, strParamTableId.length) == strParamTableId) // if startswith str
            {
                // console.log(eles[j].id);
                tblParameters = eles[j];
                break;
            }
            // else console.log(eles[j].id);
        } // End if(eles[j] != null && eles[j].id != null)

    } // Next j


    if(tblParameters != null)
        ParamLabels = tblParameters.getElementsByTagName("span");

    // var ParamLabels = document.querySelectorAll("table[id^='ParametersGridReportViewerControl'] span");
    if(ParamLabels != null)
    {
        for(var i = 0; i < ParamLabels.length; ++i)
        {
            var strText = ParamLabels[i].innerHTML;

            if (strText != null && strText.indexOf('/') != -1 && strText.indexOf('<input') == -1 ) 
            {
                strText = strText.split('/');
                if (iLanguageIndex < strText.length)
                    strText = strText[iLanguageIndex];
                else 
                { 
                    if(strText.length > 0)
                        strText = strText[0];
                }

                ParamLabels[i].innerHTML = strText;
            } // End if (strText != null && strText.indexOf('/') != -1) 

        } // Next i

    } // End if(ParamLabels != null)

}


function fixReportingServices(container)
{
    var language = initLanguage();

    switch (language)
    {
        case "fr":
            iLanguageIndex = 1;
            break;
        case "it":
            iLanguageIndex = 2;
            break;
        case "en":
            iLanguageIndex = 3;
            break;
        default: // "DE" 
            iLanguageIndex = 0;
    } // End Switch

    TranslateParameterPrompts(iLanguageIndex);
}


// needed when AsyncEnabled=true. 
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function () { fixReportingServices('rpt-container'); });

  </script>

์ด์ œ ์ผ๋ถ€ ์›น ํŽ˜์ด์ง€์—์„œ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ifrmSSRS_Login์ด๋ผ๋Š” iframe์„ ๋งŒ๋“ค๊ณ  (๋˜๋Š” ์›ํ•˜๋Š”๋Œ€๋กœ ์กฐ์ •) ๋งํฌ ํด๋ฆญ์‹œ ์–‘์‹ ๊ฒŒ์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

var data = 
{
    "issued" : datetime 
   ,"databaseName" : "foo" // name of SSRS-user 
   ,parameters : [{ "name":"forms_userid", value: 123},{ "name": "parameter1", "value": "uid1,uid2,uid3" }]
}


var valueToPost = rsa(data, public_key)

post this value with JavaScript to the cross-domain SSRS-url 



    _postSSRS: function(o){
        this._Trace('_postSSRS');

        try{
            if(!!o.SSRS_Link){
                var tF = document.body.appendChild(document.createElement('form'));
                tF.setAttribute('id', 'frm_' + Date.now());
                tF.setAttribute('method', 'post');
                tF.setAttribute('action', o.SSRS_Link + 'logon.aspx');
                tF.setAttribute('style', 'display: none;');
                tF.setAttribute('target', 'ifrmSSRS_Login');

                var HttpPostVariables = {
                     'data': o.SSRS_Data 
                    ,'SSO': 'FMS'
                };

                for(var k in HttpPostVariables){
                    var tH = tF.appendChild(document.createElement('input'));
                    tH.setAttribute('name', k);
                    tH.setAttribute('value', HttpPostVariables[k])
                };

                tF.submit()
            }
        }
        catch(err){this._Log(err, '_postSSRS')}
    },

์ด๋ ‡๊ฒŒํ•˜๋ฉด SSRS์™€ ์ธ์ฆ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ๊ณ ๊ฐ (database-name)์˜ ์‚ฌ์šฉ์ž๋Š” ๋ณด๊ณ ์„œ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„ ๋ณ„ ssrs์— ๋Œ€ํ•œ ๊ถŒํ•œ) ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

uid๋Š” ์†Œ๋ฌธ์ž๋กœ ์ „๋‹ฌ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด SSRS๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—‰๋šฑํ•œ ์†Œํ”„ํŠธ์›จ์–ด์ฒ˜๋Ÿผ ํญ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋…ธํŠธ :
์ด ์ฝ”๋“œ๋Š” SSRS์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์— ๋Œ€ํ•ด ๋” ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ถ•์ ๋˜์—ˆ์œผ๋ฉฐ http-module์ด user-agent ์–ธ์–ด๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋” ์ด์ƒ page-initialize-culture๋ฅผ ์žฌ์ •์˜ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค (์ด๋Š” ์žฌ์ •์˜ ํŽ˜์ด์ง€๋ฅผ ์ธ์‹ ํ•œ ํ›„ -initialize-culture๋Š” SSRS datepicker์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
๋˜ํ•œ ๋ฒˆ์—ญ์„์œ„ํ•œ ๊ตฌ๋ถ„์ž๋กœ ์Šฌ๋ž˜์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์œ ๊ฐ์Šค๋Ÿฌ์šด ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ยฃ ๋˜๋Š” ยฆ์™€ ๊ฐ™์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

P3P ํ—ค๋”๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ Windows 10์ด ์•„๋‹Œ ์ปดํ“จํ„ฐ์˜ IE 11์€ ์ธ์ฆ ์ฟ ํ‚ค๋ฅผ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ssrs๋Š” ๊ต์ฐจ ๋„๋ฉ”์ธ iframe์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— IE์—์„œ ํƒ€์‚ฌ ์ฟ ํ‚ค๋กœ ์ฒ˜๋ฆฌ๋จ).

๋˜ํ•œ SSRS 2016+๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ…Œ๋‘๋ฆฌ ๋„ˆ๋น„, ๋†’์ด, ์—ฌ๋ฐฑ, ์ธ์‡„ ๊ธฐ๋Šฅ ์ˆจ๊ธฐ๊ธฐ ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ "ํฅ๋ฏธ๋กœ์šด IE8 ๊ด€๋ จ ํ•ญ๋ชฉ"๋“ฑ๊ณผ ๊ฐ™์€ ํŠน์ˆ˜ ๋ชจ๋“œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด์ด ์ž‘์—…์€ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„ (SSRS 2012)์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ ๋ชจ๋‘ ์ถ”์•…ํ•œ SSRS 2005 ํ•ดํ‚น์—์„œ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํƒ์ƒ‰ ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ์— ๋งํฌ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : T_Navigation์˜ ํ•„๋“œ NA_Link).
'{@report} Budget_SNB & in_user = {@ user} & in_sprache = {@ language} & rc : Stylesheet = COR_RS2012_v7'
baseLink, ์‚ฌ์šฉ์ž ๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค (๊ฒ€์€ ์ƒ‰ ๋ฐฐ๊ฒฝ์ด์žˆ๋Š” ๊ฒฝ์šฐ ssrs์—๊ฒŒ ์Šคํƒ€์ผ ์‹œํŠธ ์ˆ˜์ •์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•ด์•ผ ํ•จ)

    REPLACE(
    REPLACE( 
    REPLACE(NA_Link, '{@report}', @reportServerBaseUrl) 
    , '{@user}', @user_id)
    , '{@language}', @user_language)
FROM T_Navigation 

.NET-Framework๋Š” ๋‚ด๋ถ€์— ์ฝœ๋ก ์ด์žˆ๋Š” ๋งํฌ๋ฅผ ๋ฆฌ๋””๋ ‰์…˜ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋…ธ ํ”„๋กœ์ ํŠธ์—์„œ URL ๋ฆฌ๋””๋ ‰์…˜์„์œ„ํ•œ ์ž‘์—… ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์‚ฌ์šฉ์ž ID๋ฅผ ๋ฌธ์ž์—ด / ์ˆซ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” (๊ฐœ์ธ / ๊ณต๊ฐœ)ํ•ด์•ผ ์•„๋ฌด๋„ ์‚ฌ์šฉ์ž ID๋ฅผ ์ถ”์ธก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋จผ์ € ์‚ฌ์šฉ์ž ID์˜ md5 ํ•ด์‹œ๊ฐ€ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ
AspNetCore.ReportViewer๋Š” ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค AspNetCore.Reporting
์—ฌ๊ธฐ์—๋Š” LocalReport ๋ฐ ServerReport

@ amh1979 : ์ž˜ ํ–ˆ์–ด์š”-์ œ๊ฐ€ ํ•œ ๋ฒˆ ๋ณผ๊ฒŒ์š”.
WindowsBase ๋ฐ pinvoke advapi32.dll / kernel32.dll / ReportingServicesService.exe๋ฅผ ํ•„์š”๋กœํ•˜๋Š” AspNetCore.ReportingServices.dll์˜ ์ข…์†์„ฑ์—์„œ Framwork 4๊ฐ€ ์„ค์น˜๋œ .NET์ด์žˆ๋Š” Windows์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์‹  : ์˜ฌ๋ฐ”๋ฅธ ์˜์–ด๋Š” "AspNetCore.ReportViewer๊ฐ€"๋Œ€์ฒด "๊ฐ€ ์•„๋‹Œ"AspNetCore.Reporting "์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋˜๋Š” ์ฐพ๊ณ ์žˆ๋Š” ๋‹จ์–ด / ๊ตฌ๋ฌธ์ด ๋  ์ˆ˜์žˆ๋Š” "๊ฐ๋…์ž"๋ผ๊ณ  ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

@ amh1979 : ์ž˜ ํ”„๋ ˆ์ž„ ์›Œํฌ 4.7.1์ด ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.
์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. MainStream์€ result / html์ด๊ณ  SecondaryStream์€ CSS์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
HTML์ด ํŽ˜์ด์ง•๋œ๋‹ค๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.
์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ : ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ HTML ํŒŒ์ผ์„ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ALL : ์ด๊ฒƒ์€ ์ „์ฒด .net์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ Windows์˜ .NET Core์—์„œ ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
System.Drawing.Color ToKnownColor, IsSystemColor์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ KnownColor๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ์ด์ œ ์„œ๋ช…์ด์žˆ๋Š” System.Drawing.Graphics ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ถˆ๋งŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Windows์˜ .NET Core ํ”„๋กœ์ ํŠธ์—์„œ ์ „์ฒด .net ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๊นŒ?

@ststeiger ๋‹ค์Œ ๋ฒ„์ „์—์„œ์ด ์งˆ๋ฌธ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@ amh1979 :

์ด ์ž‘์—…์„ํ•˜๋Š” ๋™์•ˆ System.Array.Empty<T> ํ•˜์—ฌ ArrayExtension.Empty<T> ๋กœ ๋ฐ”๊พธ๋ฉด .NET 4.0์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ 90 %๊ฐ€๋ฉ๋‹ˆ๋‹ค.

    internal static class ArrayExtension
    {

        public static T[] Empty<T>()
        {
            return new T[0];
        }

    }

@ amh1979 :

๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

System.Drawing.Color c; 
c.IsKnownColor
c.IsSystemColor 
c.ToKnownColor()
System.Drawing.KnownColor enum

NET Core์˜ System.Drawing.Common์ด ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ System.Drawing.KnownColor.cs ๋Œ€์ฒด์ž…๋‹ˆ๋‹ค.
(๋ชจํ˜ธํ•จ์œผ๋กœ ์ธํ•ด ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ System.Drawing.Color์˜ ๋‚ด๋ถ€ ๊ฐ’์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋„ท ํ”„๋ ˆ์ž„ ์›Œํฌ ... )

namespace AspNetCore.Reporting.Helpers
{

    // System.Drawing.KnownColor.cs replacement 
    internal class ReportColor
    {


        private static System.Collections.Generic.Dictionary<System.Drawing.Color
                    , AspNetCore.Reporting.Helpers.AllKnownColors> SetupKnownColorDictionary()
        {
            System.Collections.Generic.Dictionary<System.Drawing.Color
                , AspNetCore.Reporting.Helpers.AllKnownColors>
                dict = new System.Collections.Generic.Dictionary
                <System.Drawing.Color, AspNetCore.Reporting.Helpers.AllKnownColors>();

            dict.Add(System.Drawing.Color.FromArgb(255, 180, 180, 180), AllKnownColors.ActiveBorder);
            dict.Add(System.Drawing.Color.FromArgb(255, 153, 180, 209), AllKnownColors.ActiveCaption);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 0), AllKnownColors.ActiveCaptionText);
            dict.Add(System.Drawing.Color.FromArgb(255, 171, 171, 171), AllKnownColors.AppWorkspace);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 240, 240), AllKnownColors.Control);
            dict.Add(System.Drawing.Color.FromArgb(255, 160, 160, 160), AllKnownColors.ControlDark);
            dict.Add(System.Drawing.Color.FromArgb(255, 105, 105, 105), AllKnownColors.ControlDarkDark);
            dict.Add(System.Drawing.Color.FromArgb(255, 227, 227, 227), AllKnownColors.ControlLight);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 255), AllKnownColors.ControlLightLight);
            dict.Add(System.Drawing.Color.FromArgb(255, 109, 109, 109), AllKnownColors.GrayText);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 120, 215), AllKnownColors.Highlight);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 102, 204), AllKnownColors.HotTrack);
            dict.Add(System.Drawing.Color.FromArgb(255, 244, 247, 252), AllKnownColors.InactiveBorder);
            dict.Add(System.Drawing.Color.FromArgb(255, 191, 205, 219), AllKnownColors.InactiveCaption);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 225), AllKnownColors.Info);
            dict.Add(System.Drawing.Color.FromArgb(255, 200, 200, 200), AllKnownColors.ScrollBar);
            dict.Add(System.Drawing.Color.FromArgb(255, 100, 100, 100), AllKnownColors.WindowFrame);
            dict.Add(System.Drawing.Color.FromArgb(0, 255, 255, 255), AllKnownColors.Transparent);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 248, 255), AllKnownColors.AliceBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 235, 215), AllKnownColors.AntiqueWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 255, 255), AllKnownColors.Aqua);
            dict.Add(System.Drawing.Color.FromArgb(255, 127, 255, 212), AllKnownColors.Aquamarine);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 255, 255), AllKnownColors.Azure);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 245, 220), AllKnownColors.Beige);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 228, 196), AllKnownColors.Bisque);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 235, 205), AllKnownColors.BlanchedAlmond);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 255), AllKnownColors.Blue);
            dict.Add(System.Drawing.Color.FromArgb(255, 138, 43, 226), AllKnownColors.BlueViolet);
            dict.Add(System.Drawing.Color.FromArgb(255, 165, 42, 42), AllKnownColors.Brown);
            dict.Add(System.Drawing.Color.FromArgb(255, 222, 184, 135), AllKnownColors.BurlyWood);
            dict.Add(System.Drawing.Color.FromArgb(255, 95, 158, 160), AllKnownColors.CadetBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 127, 255, 0), AllKnownColors.Chartreuse);
            dict.Add(System.Drawing.Color.FromArgb(255, 210, 105, 30), AllKnownColors.Chocolate);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 127, 80), AllKnownColors.Coral);
            dict.Add(System.Drawing.Color.FromArgb(255, 100, 149, 237), AllKnownColors.CornflowerBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 248, 220), AllKnownColors.Cornsilk);
            dict.Add(System.Drawing.Color.FromArgb(255, 220, 20, 60), AllKnownColors.Crimson);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 139), AllKnownColors.DarkBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 139, 139), AllKnownColors.DarkCyan);
            dict.Add(System.Drawing.Color.FromArgb(255, 184, 134, 11), AllKnownColors.DarkGoldenrod);
            dict.Add(System.Drawing.Color.FromArgb(255, 169, 169, 169), AllKnownColors.DarkGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 100, 0), AllKnownColors.DarkGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 189, 183, 107), AllKnownColors.DarkKhaki);
            dict.Add(System.Drawing.Color.FromArgb(255, 139, 0, 139), AllKnownColors.DarkMagenta);
            dict.Add(System.Drawing.Color.FromArgb(255, 85, 107, 47), AllKnownColors.DarkOliveGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 140, 0), AllKnownColors.DarkOrange);
            dict.Add(System.Drawing.Color.FromArgb(255, 153, 50, 204), AllKnownColors.DarkOrchid);
            dict.Add(System.Drawing.Color.FromArgb(255, 139, 0, 0), AllKnownColors.DarkRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 233, 150, 122), AllKnownColors.DarkSalmon);
            dict.Add(System.Drawing.Color.FromArgb(255, 143, 188, 139), AllKnownColors.DarkSeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 72, 61, 139), AllKnownColors.DarkSlateBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 47, 79, 79), AllKnownColors.DarkSlateGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 206, 209), AllKnownColors.DarkTurquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 148, 0, 211), AllKnownColors.DarkViolet);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 20, 147), AllKnownColors.DeepPink);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 191, 255), AllKnownColors.DeepSkyBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 30, 144, 255), AllKnownColors.DodgerBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 178, 34, 34), AllKnownColors.Firebrick);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 250, 240), AllKnownColors.FloralWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 34, 139, 34), AllKnownColors.ForestGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 0, 255), AllKnownColors.Fuchsia);
            dict.Add(System.Drawing.Color.FromArgb(255, 220, 220, 220), AllKnownColors.Gainsboro);
            dict.Add(System.Drawing.Color.FromArgb(255, 248, 248, 255), AllKnownColors.GhostWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 215, 0), AllKnownColors.Gold);
            dict.Add(System.Drawing.Color.FromArgb(255, 218, 165, 32), AllKnownColors.Goldenrod);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 128, 128), AllKnownColors.Gray);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 128, 0), AllKnownColors.Green);
            dict.Add(System.Drawing.Color.FromArgb(255, 173, 255, 47), AllKnownColors.GreenYellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 255, 240), AllKnownColors.Honeydew);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 105, 180), AllKnownColors.HotPink);
            dict.Add(System.Drawing.Color.FromArgb(255, 205, 92, 92), AllKnownColors.IndianRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 75, 0, 130), AllKnownColors.Indigo);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 240), AllKnownColors.Ivory);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 230, 140), AllKnownColors.Khaki);
            dict.Add(System.Drawing.Color.FromArgb(255, 230, 230, 250), AllKnownColors.Lavender);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 240, 245), AllKnownColors.LavenderBlush);
            dict.Add(System.Drawing.Color.FromArgb(255, 124, 252, 0), AllKnownColors.LawnGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 250, 205), AllKnownColors.LemonChiffon);
            dict.Add(System.Drawing.Color.FromArgb(255, 173, 216, 230), AllKnownColors.LightBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 240, 128, 128), AllKnownColors.LightCoral);
            dict.Add(System.Drawing.Color.FromArgb(255, 224, 255, 255), AllKnownColors.LightCyan);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 250, 210), AllKnownColors.LightGoldenrodYellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 211, 211, 211), AllKnownColors.LightGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 144, 238, 144), AllKnownColors.LightGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 182, 193), AllKnownColors.LightPink);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 160, 122), AllKnownColors.LightSalmon);
            dict.Add(System.Drawing.Color.FromArgb(255, 32, 178, 170), AllKnownColors.LightSeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 135, 206, 250), AllKnownColors.LightSkyBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 119, 136, 153), AllKnownColors.LightSlateGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 176, 196, 222), AllKnownColors.LightSteelBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 224), AllKnownColors.LightYellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 255, 0), AllKnownColors.Lime);
            dict.Add(System.Drawing.Color.FromArgb(255, 50, 205, 50), AllKnownColors.LimeGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 240, 230), AllKnownColors.Linen);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 0, 0), AllKnownColors.Maroon);
            dict.Add(System.Drawing.Color.FromArgb(255, 102, 205, 170), AllKnownColors.MediumAquamarine);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 205), AllKnownColors.MediumBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 186, 85, 211), AllKnownColors.MediumOrchid);
            dict.Add(System.Drawing.Color.FromArgb(255, 147, 112, 219), AllKnownColors.MediumPurple);
            dict.Add(System.Drawing.Color.FromArgb(255, 60, 179, 113), AllKnownColors.MediumSeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 123, 104, 238), AllKnownColors.MediumSlateBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 250, 154), AllKnownColors.MediumSpringGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 72, 209, 204), AllKnownColors.MediumTurquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 199, 21, 133), AllKnownColors.MediumVioletRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 25, 25, 112), AllKnownColors.MidnightBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 255, 250), AllKnownColors.MintCream);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 228, 225), AllKnownColors.MistyRose);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 228, 181), AllKnownColors.Moccasin);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 222, 173), AllKnownColors.NavajoWhite);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 0, 128), AllKnownColors.Navy);
            dict.Add(System.Drawing.Color.FromArgb(255, 253, 245, 230), AllKnownColors.OldLace);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 128, 0), AllKnownColors.Olive);
            dict.Add(System.Drawing.Color.FromArgb(255, 107, 142, 35), AllKnownColors.OliveDrab);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 165, 0), AllKnownColors.Orange);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 69, 0), AllKnownColors.OrangeRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 218, 112, 214), AllKnownColors.Orchid);
            dict.Add(System.Drawing.Color.FromArgb(255, 238, 232, 170), AllKnownColors.PaleGoldenrod);
            dict.Add(System.Drawing.Color.FromArgb(255, 152, 251, 152), AllKnownColors.PaleGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 175, 238, 238), AllKnownColors.PaleTurquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 219, 112, 147), AllKnownColors.PaleVioletRed);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 239, 213), AllKnownColors.PapayaWhip);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 218, 185), AllKnownColors.PeachPuff);
            dict.Add(System.Drawing.Color.FromArgb(255, 205, 133, 63), AllKnownColors.Peru);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 192, 203), AllKnownColors.Pink);
            dict.Add(System.Drawing.Color.FromArgb(255, 221, 160, 221), AllKnownColors.Plum);
            dict.Add(System.Drawing.Color.FromArgb(255, 176, 224, 230), AllKnownColors.PowderBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 128, 0, 128), AllKnownColors.Purple);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 0, 0), AllKnownColors.Red);
            dict.Add(System.Drawing.Color.FromArgb(255, 188, 143, 143), AllKnownColors.RosyBrown);
            dict.Add(System.Drawing.Color.FromArgb(255, 65, 105, 225), AllKnownColors.RoyalBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 139, 69, 19), AllKnownColors.SaddleBrown);
            dict.Add(System.Drawing.Color.FromArgb(255, 250, 128, 114), AllKnownColors.Salmon);
            dict.Add(System.Drawing.Color.FromArgb(255, 244, 164, 96), AllKnownColors.SandyBrown);
            dict.Add(System.Drawing.Color.FromArgb(255, 46, 139, 87), AllKnownColors.SeaGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 245, 238), AllKnownColors.SeaShell);
            dict.Add(System.Drawing.Color.FromArgb(255, 160, 82, 45), AllKnownColors.Sienna);
            dict.Add(System.Drawing.Color.FromArgb(255, 192, 192, 192), AllKnownColors.Silver);
            dict.Add(System.Drawing.Color.FromArgb(255, 135, 206, 235), AllKnownColors.SkyBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 106, 90, 205), AllKnownColors.SlateBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 112, 128, 144), AllKnownColors.SlateGray);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 250, 250), AllKnownColors.Snow);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 255, 127), AllKnownColors.SpringGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 70, 130, 180), AllKnownColors.SteelBlue);
            dict.Add(System.Drawing.Color.FromArgb(255, 210, 180, 140), AllKnownColors.Tan);
            dict.Add(System.Drawing.Color.FromArgb(255, 0, 128, 128), AllKnownColors.Teal);
            dict.Add(System.Drawing.Color.FromArgb(255, 216, 191, 216), AllKnownColors.Thistle);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 99, 71), AllKnownColors.Tomato);
            dict.Add(System.Drawing.Color.FromArgb(255, 64, 224, 208), AllKnownColors.Turquoise);
            dict.Add(System.Drawing.Color.FromArgb(255, 238, 130, 238), AllKnownColors.Violet);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 222, 179), AllKnownColors.Wheat);
            dict.Add(System.Drawing.Color.FromArgb(255, 245, 245, 245), AllKnownColors.WhiteSmoke);
            dict.Add(System.Drawing.Color.FromArgb(255, 255, 255, 0), AllKnownColors.Yellow);
            dict.Add(System.Drawing.Color.FromArgb(255, 154, 205, 50), AllKnownColors.YellowGreen);
            dict.Add(System.Drawing.Color.FromArgb(255, 185, 209, 234), AllKnownColors.GradientActiveCaption);
            dict.Add(System.Drawing.Color.FromArgb(255, 215, 228, 242), AllKnownColors.GradientInactiveCaption);

            return dict;
        } // End Function SetupKnownColorDictionary 


        private static System.Collections.Generic.HashSet<System.Drawing.Color> SetupSystemColorHashMap()
        {
            System.Collections.Generic.HashSet<System.Drawing.Color> hash =
                new System.Collections.Generic.HashSet<System.Drawing.Color>(
                    new System.Drawing.Color[] {
                        System.Drawing.Color.FromArgb(255, 180, 180, 180),
                        System.Drawing.Color.FromArgb(255, 153, 180, 209),
                        System.Drawing.Color.FromArgb(255, 0, 0, 0),
                        System.Drawing.Color.FromArgb(255, 171, 171, 171),
                        System.Drawing.Color.FromArgb(255, 240, 240, 240),
                        System.Drawing.Color.FromArgb(255, 160, 160, 160),
                        System.Drawing.Color.FromArgb(255, 105, 105, 105),
                        System.Drawing.Color.FromArgb(255, 227, 227, 227),
                        System.Drawing.Color.FromArgb(255, 255, 255, 255),
                        System.Drawing.Color.FromArgb(255, 109, 109, 109),
                        System.Drawing.Color.FromArgb(255, 0, 120, 215),
                        System.Drawing.Color.FromArgb(255, 0, 102, 204),
                        System.Drawing.Color.FromArgb(255, 244, 247, 252),
                        System.Drawing.Color.FromArgb(255, 191, 205, 219),
                        System.Drawing.Color.FromArgb(255, 255, 255, 225),
                        System.Drawing.Color.FromArgb(255, 200, 200, 200),
                        System.Drawing.Color.FromArgb(255, 100, 100, 100),
                        System.Drawing.Color.FromArgb(255, 185, 209, 234),
                        System.Drawing.Color.FromArgb(255, 215, 228, 242)
                    }
            );

            return hash;
        } // End Function SetupSystemColorHashMap 


        private static System.Collections.Generic.HashSet<string> SetupKnownColorHashMap()
        {
            System.Collections.Generic.HashSet<string> map =
                new System.Collections.Generic.HashSet<string>(new string[] {
 "ActiveBorder"
,"ActiveCaption"
,"ActiveCaptionText"
,"AppWorkspace"
,"Control"
,"ControlDark"
,"ControlDarkDark"
,"ControlLight"
,"ControlLightLight"
,"ControlText"
,"Desktop"
,"GrayText"
,"Highlight"
,"HighlightText"
,"HotTrack"
,"InactiveBorder"
,"InactiveCaption"
,"InactiveCaptionText"
,"Info"
,"InfoText"
,"Menu"
,"MenuText"
,"ScrollBar"
,"Window"
,"WindowFrame"
,"WindowText"
,"Transparent"
,"AliceBlue"
,"AntiqueWhite"
,"Aqua"
,"Aquamarine"
,"Azure"
,"Beige"
,"Bisque"
,"Black"
,"BlanchedAlmond"
,"Blue"
,"BlueViolet"
,"Brown"
,"BurlyWood"
,"CadetBlue"
,"Chartreuse"
,"Chocolate"
,"Coral"
,"CornflowerBlue"
,"Cornsilk"
,"Crimson"
,"Cyan"
,"DarkBlue"
,"DarkCyan"
,"DarkGoldenrod"
,"DarkGray"
,"DarkGreen"
,"DarkKhaki"
,"DarkMagenta"
,"DarkOliveGreen"
,"DarkOrange"
,"DarkOrchid"
,"DarkRed"
,"DarkSalmon"
,"DarkSeaGreen"
,"DarkSlateBlue"
,"DarkSlateGray"
,"DarkTurquoise"
,"DarkViolet"
,"DeepPink"
,"DeepSkyBlue"
,"DimGray"
,"DodgerBlue"
,"Firebrick"
,"FloralWhite"
,"ForestGreen"
,"Fuchsia"
,"Gainsboro"
,"GhostWhite"
,"Gold"
,"Goldenrod"
,"Gray"
,"Green"
,"GreenYellow"
,"Honeydew"
,"HotPink"
,"IndianRed"
,"Indigo"
,"Ivory"
,"Khaki"
,"Lavender"
,"LavenderBlush"
,"LawnGreen"
,"LemonChiffon"
,"LightBlue"
,"LightCoral"
,"LightCyan"
,"LightGoldenrodYellow"
,"LightGray"
,"LightGrey"
,"LightGreen"
,"LightPink"
,"LightSalmon"
,"LightSeaGreen"
,"LightSkyBlue"
,"LightSlateGray"
,"LightSteelBlue"
,"LightYellow"
,"Lime"
,"LimeGreen"
,"Linen"
,"Magenta"
,"Maroon"
,"MediumAquamarine"
,"MediumBlue"
,"MediumOrchid"
,"MediumPurple"
,"MediumSeaGreen"
,"MediumSlateBlue"
,"MediumSpringGreen"
,"MediumTurquoise"
,"MediumVioletRed"
,"MidnightBlue"
,"MintCream"
,"MistyRose"
,"Moccasin"
,"NavajoWhite"
,"Navy"
,"OldLace"
,"Olive"
,"OliveDrab"
,"Orange"
,"OrangeRed"
,"Orchid"
,"PaleGoldenrod"
,"PaleGreen"
,"PaleTurquoise"
,"PaleVioletRed"
,"PapayaWhip"
,"PeachPuff"
,"Peru"
,"Pink"
,"Plum"
,"PowderBlue"
,"Purple"
,"Red"
,"RosyBrown"
,"RoyalBlue"
,"SaddleBrown"
,"Salmon"
,"SandyBrown"
,"SeaGreen"
,"SeaShell"
,"Sienna"
,"Silver"
,"SkyBlue"
,"SlateBlue"
,"SlateGray"
,"Snow"
,"SpringGreen"
,"SteelBlue"
,"Tan"
,"Teal"
,"Thistle"
,"Tomato"
,"Turquoise"
,"Violet"
,"Wheat"
,"White"
,"WhiteSmoke"
,"Yellow"
,"YellowGreen"
,"ButtonFace"
,"ButtonHighlight"
,"ButtonShadow"
,"GradientActiveCaption"
,"GradientInactiveCaption"
,"MenuBar"
,"MenuHighlight"

}, System.StringComparer.OrdinalIgnoreCase);

            return map;
        } // End Function SetupKnownColorHashMap 


        private static System.Collections.Generic.HashSet<string> m_knownColors = SetupKnownColorHashMap();
        private static System.Collections.Generic.HashSet<System.Drawing.Color> m_systemColors = SetupSystemColorHashMap();

        private static System.Collections.Generic.Dictionary<System.Drawing.Color
                , AspNetCore.Reporting.Helpers.AllKnownColors> m_knownColorDictionary = SetupKnownColorDictionary();


        // System.Drawing.Color c; c.IsKnownColor
        public static bool IsKnownColor(string color)
        {
            return m_knownColors.Contains(color);
        } // End Function IsKnownColor


        // System.Drawing.Color c; c.ToKnownColor()
        // AspNetCore.Reporting.Helpers.ReportColor.ToKnownColor(c);
        public static AspNetCore.Reporting.Helpers.AllKnownColors ToKnownColor(System.Drawing.Color c)
        {
            //System.Drawing.KnownColor knownColor = c.ToKnownColor();
            if (m_knownColorDictionary.ContainsKey(c))
                return m_knownColorDictionary[c];

            return AspNetCore.Reporting.Helpers.AllKnownColors.Unknown;
        } // End Function ToKnownColor 


        // System.Drawing.Color c; c.IsSystemColor 

        /// <include file='doc\Color.uex' path='docs/doc[@for="Color.IsSystemColor"]/*' />
        /// <devdoc>
        ///     Determines if this color is a system color.
        /// </devdoc>
        public static bool IsSystemColor(System.Drawing.Color color)
        {
            if (m_systemColors.Contains(color))
                return true;

            // return color.IsKnownColor;
            // return IsKnownColor && ((((KnownColor)knownColor) <= KnownColor.WindowText) || (((KnownColor)knownColor) > KnownColor.YellowGreen));
            return false;
        } // End Function IsSystemColor 


    } // End Class ReportColor 



    // https://raw.githubusercontent.com/mono/sysdrawing-coregraphics/master/System.Drawing/KnownColor.cs
    public enum AllKnownColors
    {
        Unknown = 0,

        ActiveBorder = 1,
        ActiveCaption = 2,
        ActiveCaptionText = 3,
        AppWorkspace = 4,
        Control = 5,
        ControlDark = 6,
        ControlDarkDark = 7,
        ControlLight = 8,
        ControlLightLight = 9,
        ControlText = 10,
        Desktop = 11,
        GrayText = 12,
        Highlight = 13,
        HighlightText = 14,
        HotTrack = 15,
        InactiveBorder = 16,
        InactiveCaption = 17,
        InactiveCaptionText = 18,
        Info = 19,
        InfoText = 20,
        Menu = 21,
        MenuText = 22,
        ScrollBar = 23,
        Window = 24,
        WindowFrame = 25,
        WindowText = 26,
        Transparent = 27,
        AliceBlue = 28,
        AntiqueWhite = 29,
        Aqua = 30,
        Aquamarine = 31,
        Azure = 32,
        Beige = 33,
        Bisque = 34,
        Black = 35,
        BlanchedAlmond = 36,
        Blue = 37,
        BlueViolet = 38,
        Brown = 39,
        BurlyWood = 40,
        CadetBlue = 41,
        Chartreuse = 42,
        Chocolate = 43,
        Coral = 44,
        CornflowerBlue = 45,
        Cornsilk = 46,
        Crimson = 47,
        Cyan = 48,
        DarkBlue = 49,
        DarkCyan = 50,
        DarkGoldenrod = 51,
        DarkGray = 52,
        DarkGreen = 53,
        DarkKhaki = 54,
        DarkMagenta = 55,
        DarkOliveGreen = 56,
        DarkOrange = 57,
        DarkOrchid = 58,
        DarkRed = 59,
        DarkSalmon = 60,
        DarkSeaGreen = 61,
        DarkSlateBlue = 62,
        DarkSlateGray = 63,
        DarkTurquoise = 64,
        DarkViolet = 65,
        DeepPink = 66,
        DeepSkyBlue = 67,
        DimGray = 68,
        DodgerBlue = 69,
        Firebrick = 70,
        FloralWhite = 71,
        ForestGreen = 72,
        Fuchsia = 73,
        Gainsboro = 74,
        GhostWhite = 75,
        Gold = 76,
        Goldenrod = 77,
        Gray = 78,
        Green = 79,
        GreenYellow = 80,
        Honeydew = 81,
        HotPink = 82,
        IndianRed = 83,
        Indigo = 84,
        Ivory = 85,
        Khaki = 86,
        Lavender = 87,
        LavenderBlush = 88,
        LawnGreen = 89,
        LemonChiffon = 90,
        LightBlue = 91,
        LightCoral = 92,
        LightCyan = 93,
        LightGoldenrodYellow = 94,
        LightGray = 95,
        LightGreen = 96,
        LightPink = 97,
        LightSalmon = 98,
        LightSeaGreen = 99,
        LightSkyBlue = 100,
        LightSlateGray = 101,
        LightSteelBlue = 102,
        LightYellow = 103,
        Lime = 104,
        LimeGreen = 105,
        Linen = 106,
        Magenta = 107,
        Maroon = 108,
        MediumAquamarine = 109,
        MediumBlue = 110,
        MediumOrchid = 111,
        MediumPurple = 112,
        MediumSeaGreen = 113,
        MediumSlateBlue = 114,
        MediumSpringGreen = 115,
        MediumTurquoise = 116,
        MediumVioletRed = 117,
        MidnightBlue = 118,
        MintCream = 119,
        MistyRose = 120,
        Moccasin = 121,
        NavajoWhite = 122,
        Navy = 123,
        OldLace = 124,
        Olive = 125,
        OliveDrab = 126,
        Orange = 127,
        OrangeRed = 128,
        Orchid = 129,
        PaleGoldenrod = 130,
        PaleGreen = 131,
        PaleTurquoise = 132,
        PaleVioletRed = 133,
        PapayaWhip = 134,
        PeachPuff = 135,
        Peru = 136,
        Pink = 137,
        Plum = 138,
        PowderBlue = 139,
        Purple = 140,
        Red = 141,
        RosyBrown = 142,
        RoyalBlue = 143,
        SaddleBrown = 144,
        Salmon = 145,
        SandyBrown = 146,
        SeaGreen = 147,
        SeaShell = 148,
        Sienna = 149,
        Silver = 150,
        SkyBlue = 151,
        SlateBlue = 152,
        SlateGray = 153,
        Snow = 154,
        SpringGreen = 155,
        SteelBlue = 156,
        Tan = 157,
        Teal = 158,
        Thistle = 159,
        Tomato = 160,
        Turquoise = 161,
        Violet = 162,
        Wheat = 163,
        White = 164,
        WhiteSmoke = 165,
        Yellow = 166,
        YellowGreen = 167,
        ButtonFace = 168,
        ButtonHighlight = 169,
        ButtonShadow = 170,
        GradientActiveCaption = 171,
        GradientInactiveCaption = 172,
        MenuBar = 173,
        MenuHighlight = 174
    } // End enum AllKnownColors 


}

NetStandard 2.0์—์„œ ์ปดํŒŒ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ:
System.CoreFX.Forms ๋ฅผ ๊ฐ€์ ธ์™€ NetStandard 2.0์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ System.Drawing.Common ๋ฐ System.Reflection.Emit์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

AspNetCore.ReportingServices๋ฅผ ๊ฐ€์ ธ ์™€์„œ ์ถ”๊ฐ€

Microsoft.Win32.Registry
System.CodeDom
System.ComponentModel
System.ComponentModel.TypeConverter
System.Configuration.ConfigurationManager
System.Data.Common
System.Data.SqlClient
System.Drawing.Common 
System.IO.Packaging
System.Runtime.Serialization.Primitives
System.Security.Permissions

System.CoreFX.Forms (NetStandard)์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ถ”๊ฐ€

mono / corefx์—์„œ ๋‹ค์Œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

AssemblyRef.cs (corefx System.Drawing)
ColorConverter.cs (corefx System.Drawing)
ColorConverterCommon.cs (corefx System.Drawing)
ColorTable.cs (corefx System.Drawing)
FontConverter.cs (mono System.Drawing.FontConverter.cs)
ImageFormatConverter.cs (mono System.Drawing.ImageFormatConverter.cs)
PaintValueEventArgs.cs (corefx System.Drawing.Design)
PointConverter.cs (corefx System.Drawing.Design)
SizeConverter.cs (corefx System.Drawing.Design)
UITypeEditor.cs  (corefx System.Drawing.Design "Primitives")
UITypeEditorEditStyle.cs  (corefx System.Drawing.Design "Primitives")

System.Web์— ๋Œ€ํ•œ ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

namespace System.Web
{

    public class HttpRequest
    {
        public System.Collections.Specialized.NameValueCollection Headers { get; set; }
    }

    public class HttpResponse
    {
        public string ContentType { get; set; }
        public int StatusCode { get; set; }
    }

    public class HttpContext
    {
        // public HttpRequest Request;
        // public HttpRequest Response;

        public HttpRequest Request { get; set; }
        public HttpResponse Response { get; set; }


        public static HttpContext Current;
    }
}

๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด netstandard 2.0 ํ”„๋กœ์ ํŠธ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ AssemblyInfo.cs๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AspNetCore.Reporting, PublicKey=00240000048000009400000006020000002400005253413100040000010001003736e45ce2a56cd06bc9ab2e7eeeeffd2533eaafbc1abc68561da0f512412bf1c7d2bd0c4422565a4f35818a205b4d54af1d0fef14fb8d7249bc37913e53a3313c2f26ca838849c5ef766082ed02db74e6459e77840dfe5eb01574aa0722876b2a9f714c5d03fbcea6e88345ccf55a87d57d9653a5913a826008b1d3ac557aab", AllInternalsVisible = true)]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AspNetCore.Reporting", AllInternalsVisible = true)]

์ด์ œ NetStandard 2.0์—์„œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @All ๋†€๋ผ์šด ์†Œ์‹ :

Windows์—์„œ .NET Core์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
100 % NetStandard, 0 % NetFramework

Html, Pdf, Excel, Excel2007 +, Word, Word2007 + ๋ฐ tiff๋Š” ๋ชจ๋‘ varchars, ints, tinyint2, ๋น„ํŠธ ๋ฐ ๊ณ„์‚ฐ ๋œ ์—ด์ด์žˆ๋Š” 57 ํŽ˜์ด์ง€์˜ ํ‘œ ํ˜•์‹ ๋ณด๊ณ ์„œ์—์„œ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
RDL์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ์ถœ๋ ฅ ํ˜•์‹์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. RDL์€ ์žฌ๋ฏธ ์žˆ์ง€๋งŒ ๋ˆ„๊ฐ€ ์‹ ๊ฒฝ์„ ์“ฐ๋‚˜์š”?
์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);
lr.AddDataSource("DataSet1", dt);

var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");

// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
// var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");

System.Console.WriteLine(rr.TotalPages);

// System.IO.File.WriteAllBytes(@"d:\foo.htm", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.css", rr.SecondaryStream);
// System.IO.File.WriteAllBytes(@"d:\foo.pdf", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.xls", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.xlsx", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.doc", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.docx", rr.MainStream);
// System.IO.File.WriteAllBytes(@"d:\foo.tiff", rr.MainStream);

// System.IO.File.WriteAllBytes(@"d:\foo.rpl", rr.MainStream); // BOOM 

๊ทธ๋ฆฌ๊ณ  ๋” ์ข‹์€ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
WindowsBase (์ผ๋ช… WPF)๋Š” .NET Core์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” System.IO.Packaging์—๋งŒ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ pinvoke๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด Linux / Mac์—์„œ๋„ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋ฐ ํฐ ์žฅ์• ๋ฌผ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค!

์ด์ œ ๋ˆ„๊ตฐ๊ฐ€ ์›น ๊ธฐ๋ฐ˜ RDL ํŽธ์ง‘๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค!
๊ทธ๋Ÿฐ ๋‹ค์Œ "๋™์ "(์‚ฌ์šฉ์ž ์ƒ์„ฑ) ๋ณด๊ณ ์„œ๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Linux ์šฉ PostgreSQL-ReportingServices๊ฐ€ ์ถœ์‹œ๋ฉ๋‹ˆ๋‹ค.)
(์ข‹์•„, ๊ทธ๋Ÿฐ ์ผ์— ๋Œ€ํ•œ ๋‹ค๋ชจ ํด๋ ˆ์Šค์˜ ๋ฒ•์  ๊ฒ€์ด ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ "๋” ํŽธ์•ˆํ•œ"์ง€์  ์žฌ์‚ฐ๊ถŒ์„ ๊ฐ€์ง„ ์ค‘๊ตญ์—์„œ ์ถœํŒ ํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ...) :)

์ข‹์•„์š”, ๋„ˆ๋ฌด ์‚ฌ์•…ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋Œ€์‹  Oracle / SAP ์šฉ Microsoft ReportingServices๋ฅผ ์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค!
๋˜๋Š” Cassandra / Spark๋ฅผ์œ„ํ•œ ReportingServices : grin :

@ amh1979 :
๊ฑฐ๊ธฐ์— PowerPoint- ๋ Œ๋”๋Ÿฌ๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?
์ตœ์‹  ๋ฒ„์ „์˜ reportviewer์—์„œ ๋นŒ๋“œ ํ–ˆ์Šต๋‹ˆ๊นŒ? (SSRS 2017)
Nuget์— ๋Œ€ํ•ด ์•Œ๊ณ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „ :
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
(140.1000.523, 10 ๊ฐœ์›” ์ „)
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WinForms
(140.1000.523)
https://www.nuget.org/packages/Microsoft.SqlServer.Types
(14.0.314.76)

NetStandard์— ๋Œ€ํ•œ CoreFX WinForms ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/ststeiger/System.CoreFX.Forms

์ถ”๊ฐ€ NetCore ํ”„๋กœ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  System.CoreFX.Forms๋ฅผ System.NetStandard.Forms๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌํ•จ ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ๋กœ๋“œํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AssemblyRef.cs
ColorConverter.cs
ColorConverterCommon.cs
ColorTable.cs
FontConverter.cs
ImageFormatConverter.cs
PaintValueEventArgs.cs
PointConverter.cs
SizeConverter.cs
UITypeEditor.cs
UITypeEditorEditStyle.cs

@ amh1979 :
์•„, ๊ทธ๊ฑด Microsoft.ReportViewer.Common.dll์— ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ReportServer ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.
Microsoft.ReportingServices.PowerPointRendering.dll
CSV / XML / Atom์˜ ๊ฒฝ์šฐ :
Microsoft.ReportingServices.DataRendering.dll

C : \ Program Files \ Microsoft SQL Server๋ณด๊ณ  ์„œ๋น„์Šค \ SSRS \ ReportServer \ bin

@ALL : ์ˆ™๋…€ ์—ฌ๋Ÿฌ๋ถ„, HTML- ๋ Œ๋”๋Ÿฌ๋Š” .NET Core / NetStandard 2.0์˜ Linux์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!
๊ทธ๋ฆฌ๊ณ  WordOpenXML๊ณผ ExcelOpenXML ๋ Œ๋”๋Ÿฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค!
(์‚ฌ์ง„ / ๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์Œ-ํ…์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ๋งŒ ํ•ด๋‹น)

PDF ๋ Œ๋”๋ง ํ”„๋กœ๊ทธ๋žจ์—๋Š” ๊ธ€๊ผด ํฌํ•จ ํ•€ ๋ณดํฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
(Word / Excel-2003 ๋ Œ๋”๋Ÿฌ๋Š” pinvoke๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
Aspose Cells / Words eval ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ xlsx๋ฅผ xls๋กœ, docx๋ฅผ doc๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›Œ๋“œ ํŒŒ์ผ์—์„œ PDF๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
soffice --headless --convert-to pdf filename.docx
(๋˜๋Š” aspose eval ์‚ฌ์šฉ)
์ƒ๊ฐํ•ด ๋ณด๋ฉด PPTX ๋ Œ๋”๋Ÿฌ๋„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด TIFF ํŒŒ์ผ์—์„œ ์‚ฌ์ง„์„ ์ฐ๊ณ  ๊ฐ tiff ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€๋ฅผ pptx ์Šฌ๋ผ์ด๋“œ์— jpg / png๋กœ ๋„ฃ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€ ๋ Œ๋”๋Ÿฌ๊ฐ€ ๊ฐ€์žฅ ์–ด๋ ค์šด ์ž‘์—… ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋˜๋Š” wkhtmltoX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ HTML ํŽ˜์ด์ง€๋ฅผ ์ด๋ฏธ์ง€ / pdf๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๋Š๋ฆฐ ํŽธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋†€๋ž์Šต๋‹ˆ๋‹ค!

HTML for report

@ALL : Atom / CSV / XML ์ž‘๋™. NULL- ๋ Œ๋”๋Ÿฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
Linux์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

PowerPoint ๋ Œ๋”๋ง์€ Windows์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค : ๊ฑฐ๊ธฐ์— JSON- ๋ Œ๋”๋Ÿฌ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์ด์œ ๋กœ ๋“  ๊ทธ ์“ฐ๋ ˆ๊ธฐ๋Š” useSharedDataSetTableHandler ์ผ€์ด์Šค์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ParseDeviceInfo(deviceInfo);

if (!useSharedDataSetTableHandler)
{
    throw new ReportRenderingException(StringResources.rrJsonRenderOutputNotSupported);
}

์œ„ํ—˜์— ์˜ํ•ด ๋ˆ„๊ตฌ๋‚˜ JSON- ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@ amh1979 ์„œ๋ฒ„ ๋ณด๊ณ ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ๋ณด๊ณ ์„œ์— ์ถ”๊ฐ€ ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ LoadReport์˜ ์„œ๋ฒ„์— ์œ ์ง€๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋นŒ๋“œ์—์„œ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @ststeiger ๋ฐ @ amh1979 , ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์Šต์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ๋‹ค์ค‘ ๊ฐ’ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋“œ๋ฆด ๋‹ค์šด์ด ์ง€์›๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋„ˆ๊ฒŸ ํŒจํ‚ค์ง€ ์„ค๋ช… (http://www.amhx.org/)์— ๋งํฌ ๋œ ์‚ฌ์ดํŠธ์— ๊ณ„์† ์ ‘์†ํ•˜์—ฌ ๋ณด๋ ค๊ณ ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ณ„์† ์ดˆ๊ณผ๋ฉ๋‹ˆ๋‹ค.

@DavidHayesCoding :
์—ฌ๊ธฐ AspNetCore.Reporting.LocalReport์— ๋Œ€ํ•œ ๋‚ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋…ธํŠธ :
๋ Œ๋”๋ง ์œ ํ˜• Rpl, RGDI, Atom, Xml, Json, Csv, null, pptx
amh1979์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฏ€ ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .
(SSRS์˜ ์ผ๋ถ€์ด์ง€๋งŒ ReportViewer ์žฌ๋ฐฐํฌ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์—๋Š” ์—†์Œ)

๋˜ํ•œ ๊ณต์œ  ๋ฐ์ดํ„ฐ ์†Œ์Šค (* .rds)๋Š” * .rdl๊ณผ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด LocalReport.Execute์—์„œ ๋„ ์ฐธ์กฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์งˆ๋ฌธ :
https://github.com/icsharpcode/ILSpy/releases/tag/v4.0-beta2
(์ฐธ๊ณ  : ์ ์ ˆํ•œ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ์„ ๋งˆ์นœ ํ›„ ํ๊ธฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace NetCoreReporting
{


    public class Program
    {


        public static void Main(string[] args)
        {
            System.Data.SqlClient.SqlConnectionStringBuilder csb = new System.Data.SqlClient.SqlConnectionStringBuilder();
            csb.InitialCatalog = "TestDB";

            if ("COMPANY_NAME".Equals(System.Environment.UserDomainName, System.StringComparison.InvariantCultureIgnoreCase))
                csb.DataSource = System.Environment.MachineName + @"\SQLEXPRESS";
            else
                csb.DataSource = System.Environment.MachineName;

            if(System.Environment.OSVersion.Platform == System.PlatformID.Unix)
                csb.IntegratedSecurity = false;
            else
                csb.IntegratedSecurity = true;

            if (!csb.IntegratedSecurity)
            {
                csb.UserID = TestPlotly.SecretManager.GetSecret<string>("DefaultDbUser");
                csb.Password = TestPlotly.SecretManager.GetSecret<string>("DefaultDbPassword");
            }



            string sql = "SELECT * FROM T_Sites";
            // sql = "SELECT * FROM T_Users";

            System.Data.DataTable dt = new System.Data.DataTable();

            using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
            {
                da.Fill(dt);
            }

            string fn = "wwwroot/Report1.rdl";
            fn = "wwwroot/Report2.rdl";

            AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


            System.Collections.Generic.Dictionary<string, string> parameters = 
                new System.Collections.Generic.Dictionary<string, string>();

            // parameters.Add("in_logo", "base64");

            lr.AddDataSource("DataSet1", dt); // DataSet1 is the name of the DataSet in the report




            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
            // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

            var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pptx, 1, parameters, "");

            System.Console.WriteLine(rr.TotalPages);


            string dir = @"d:\";
            if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
                dir = "/opt/";

            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
            // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
            System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

            BuildWebHost(args).Run();
        }


        public static IWebHost BuildWebHost(string[] args)
        { 
            return WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
        }


    }


}

@ALL : ๋ˆ„๊ตฌ๋“ ์ง€ ๋•๊ณ  ์‹ถ์–ด?
์ด ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•˜์„ธ์š”:
https://stackoverflow.com/questions/52093440/how-to-call-wine-dll-functions-from-c

๋Œ€๋Ÿ‰์˜ ์ฝ”๋“œ์™€ ๊ธธ์ด ์ฃผ์„์„ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ด์ด ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ์ •๋ง ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์ฝ๊ธฐ ์–ด๋ ค์šด ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ œ์•ˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋งŽ์€ ํ™œ๋™๊ณผ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ๊ทผ (๊ฒ‰๋ณด๊ธฐ์— ํ›Œ๋ฅญํ•ด ๋ณด์ด๋Š”) ๊ฐœ๋ฐœ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด์„œ๋Š” ํ˜„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊น”๋”ํ•˜๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์ฝ”๋“œ ๊ณต์œ ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ์ €์žฅ์†Œ / ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์š”? ์—ฌ๊ธฐ์—์„œ ๊ณต์œ  ํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@kierenj ์ฒ˜๋Ÿผ ๊ฒŒ์‹œ๋ฌผ๋กœ ์ฝ”๋“œ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๋ฉด ๋”ฐ๋ผ ๊ฐ€๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. github๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋งํฌ๋ฅผ ๊ณต์œ ํ•˜์„ธ์š”. ์ด ์ €์žฅ์†Œ์˜ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ถ„๊ธฐ ๋“ฑ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์€์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@kierenj @figuerres : ๊ดœ์ฐฎ๊ฒ ์ง€ ๋งŒ, ๋จผ์ € ํ—ˆ๊ฐ€๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋” ๋งŽ์€ ์–‘์˜ ๋”” ์ปดํŒŒ์ผ ๋œ Microsoft ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•œ๋‹ค๋ฉด, ์•„๋งˆ๋„ ๊ทธ๋“ค์ด ๋ญ”๊ฐ€๋ฅผํ•˜๊ณ  ์‹ถ์€ ๊ณณ์œผ๋กœ ๋„˜์–ด๊ฐˆ ์œ„ํ—˜์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

iii. ๋ฐฐํฌ ์ œํ•œ. ๋‹น์‹ ์€
โ€ข ๋ฐฐํฌ ๊ฐ€๋Šฅ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜์—ฌ Windows ํ”Œ๋žซํผ ์ด์™ธ์˜ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข ์ฝ”๋“œ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ๊ณต๊ฐœ๋˜๊ฑฐ๋‚˜ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š”
โ€ข ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•  ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ
๋ฐ”๋กœ ์—ฌ๊ธฐ ์ €์žฅ์†Œ๋กœ ์ž‘์—…ํ•˜์—ฌ ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ถ„๊ธฐ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@figuerres : ๊ฐœ์ธ ์ €์žฅ์†Œ๊ฐ€ ๋ฌด๋ฃŒ ์ธ gitlab์— ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

@MaximRouiller :
๋Œ€๋žต ASP.NET Core์—์„œ ์ž‘๋™ํ•˜๋Š” ReportViewer (๋กœ์ปฌ ๋ณด๊ณ ์„œ) ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์•ฝ 75 %๋Š” Microsoft๊ฐ€ SQL-Server๋ฅผ ๊ฒŒ์‹œ ํ•œ Linux์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
Linux์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์€ MacOS์—์„œ๋„ ์ž‘๋™ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜์ด ๋ฒ„์ „์˜ ReportViewer๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.
https://www.nuget.org/packages/AspNetCore.Reporting
์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.WebForms
์ด ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ
http://go.microsoft.com/fwlink/?LinkId=826162

์ด ๋ผ์ด์„ ์Šค๋Š” ๋‹ค์Œ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โ€ข ๋ฐฐํฌ ๊ฐ€๋Šฅ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜์—ฌ Windows ํ”Œ๋žซํผ ์ด์™ธ์˜ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข ์ฝ”๋“œ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ๊ณต๊ฐœ๋˜๊ฑฐ๋‚˜ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š”
โ€ข ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•  ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ธฐ์ˆ ์  ์ œํ•œ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
โ€ข> ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ <

ReportViewer๋ฅผ .NET Core๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ๋‚จ์•„์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ์œ„์น˜์˜ github์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€์ด ์ฝ”๋“œ๋ฅผ (๊ณต๊ฐœ์ ์œผ๋กœ) ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ReportViewerControl.WebForms์˜ ํ˜„์žฌ ๋ผ์ด์„ ์Šค๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ผ๋ฐฉ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ผ์ด์„ผ์Šค๊ฐ€ ์ฒ˜์Œ ์ž‘์„ฑ / ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋œ ์ดํ›„๋กœ ๋งŽ์€ ๊ฒƒ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฐ๊ณผ๊ฐ€ Windows ํ”Œ๋žซํผ์—์„œ๋งŒ ์ž‘๋™ ํ•  ๋•Œ .NET Core ์šฉ ReportViewer๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Microsoft๊ฐ€ Linux ์šฉ SQL-Server๋ฅผ ์ถœ์‹œํ–ˆ์Œ์„ ๊ณ ๋ คํ•˜๋ฉด SSRS๋Š” ์–ด์จŒ๋“  ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

๊ทธ๋ฆฌ๊ณ  ASP.NET-Core๊ฐ€ WebForms๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ReportViewer-WebForms์—์„œ ReportViewer-NetCore ๋กœ์˜ ๋ณ€๊ฒฝ์€ ์–ด์จŒ๋“  ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒํ™ฉ์„ ๊ณ ๋ คํ•  ๋•Œ ๊ทธ๋Ÿฌํ•œ ๋…ธ๋ ฅ์— ์ฒญ์‹ ํ˜ธ๋ฅผ์ฃผ๊ณ  (์šฐ์—ฐํžˆ ๊ทธ๋“ค์—๊ฒŒ ์‹œ๊ฐ„๊ณผ ์ธ๋ ฅ์„ ์ ˆ์•ฝ ํ•  ์ˆ˜์žˆ๋Š”) ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  .NET-Core์˜ ์˜คํ”ˆ ์†Œ์Šค ํŠน์„ฑ๊ณผ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ๊ถŒํ•œ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? NetStandard 2.0.

.NET-Core๊ฐ€ ์ถœ์‹œ ๋œ ์ง€ 2 ๋…„์ด ๋„˜์—ˆ์œผ๋ฉฐ ์•„์ง๊นŒ์ง€ ๊ด‘๋ฒ”์œ„ํ•œ ๋ณด๊ณ ์„œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์žก์„ ๋•Œ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ํ•˜๋ฉด ์šฐ๋ฆฌ ๋ชจ๋‘ ๋” ๋น ๋ฅด๊ณ  ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

http://go.microsoft.com/fwlink/?LinkId=826162
๋‚ด๊ฐ€ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ.
๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ NuGet์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๋‚˜์—ด ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.

@ALL : ์ข‹์€ ์†Œ์‹ : XLS / DOC์— ๋Œ€ํ•œ COM-InterOP ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๊ณ  OpenMcdf๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ XLS / DOC-Renderer๋Š” ์ด์ œ Linux์™€ Windows์—์„œ ๋ชจ๋‘ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ 85 %๊ฐ€ Linux์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

PDFWriter์˜ ๊ฒฝ์šฐ 3 ๊ฐœ์˜ WinAPI ํ˜ธ์ถœ, ImageRenderer / Graphics์˜ ๊ฒฝ์šฐ 13 ๊ฐœ์˜ WinAPI ํ˜ธ์ถœ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
PdfWriter ์ž์ฒด๊ฐ€ ์ƒ๋‹นํžˆ ์‰ฌ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @ststeiger GDI + ๊ธฐ๋Šฅ์„ ์ฐจ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋น„ ๊ณ„ํš์ด์žˆ๋Š” Azure ํ•จ์ˆ˜์—์„œ AspNetCore.Reporting์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ.

์•„์ง์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊ธ€๊ผด ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด GDI + ๋ฐ usp10.dll์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ GDI + ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ mono libgdi +๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์„ ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•œ ๋Œ€์ฒด ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

Wine์˜ C ์†Œ์Šค๋ฅผ ์ฝ์–ด์„œ GetFontData ํ•จ์ˆ˜๋ฅผ C #์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, TrueType ๊ธ€๊ผด ์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด freetype์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (wine๋„ FreeType์„ ์‚ฌ์šฉํ•จ).
SixLabors.Fonts ๋ฐ LayoutFarm์€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค (๋„“์€ ์—ฌ๋ฐฑ).
์—ฌ๊ธฐ:
https://gist.github.com/ststeiger/273341aebd29009f2b272b822b69563f

๋˜ํ•œ ํ…์ŠคํŠธ ์ธก์ • ๊ฐ’์„ freetype์œผ๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ชจ๋“  GDI ์žฅ์น˜ ํ•ธ๋“ค์„ ์‚ฌ์šฉ์ž ์ง€์ • ํด๋ž˜์Šค๋กœ ๊ต์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ด ํด๋ž˜์Šค์—๋Š” ๊ธ€๊ผด / ๊ทธ๋ž˜ํ”ฝ / ์ž์œ  ์œ ํ˜• / ํ•ธ๋“ค ์ •๋ณด ๋“ฑ์ด ํฌํ•จ๋˜์–ด์•ผํ•˜๋ฏ€๋กœ ๋ Œ๋”๋Ÿฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ข…์ด์—์„œ ์„ธ๊ณ„๋กœ, ์„ธ๊ณ„์—์„œ ์ข…์ด๋กœ์˜ ๋ณ€ํ™˜์„ ์œ„ํ•ด ์™€์ธ์„ ๋‹ค์‹œ ์‚ดํŽด ๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
Paper-to-world ๋ฐ world-to-paper ๋ณ€ํ™˜์ด ์ด๋ฏธ System.Drawing.Graphics์—์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋“œ์˜ ์ผ๋ถ€๊ฐ€ .NET Framwork 1.0์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ .NET ๊ธ€๊ผด๊ณผ ํ”„๋ฆฌ ํƒ€์ž… ๊ธ€๊ผด๊ฐ„์— ์–ด๋–ป๊ฒŒ ๋“  ๋งคํ•‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ—ค์ด ์‚ฌ๋žŒ์˜ @ALL ๋ฐ @ststeiger
๊ด€๋ จ :

@ALL : ์ข‹์€ ์†Œ์‹ : XLS / DOC์— ๋Œ€ํ•œ COM-InterOP ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๊ณ  OpenMcdf๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ XLS / DOC-Renderer๋Š” ์ด์ œ Linux์™€ Windows์—์„œ ๋ชจ๋‘ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ 85 %๊ฐ€ Linux์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

Office Open XML

์†”์งํžˆ ์ €๋Š” ์ตœ์‹  XML ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด OLE ํ˜•์‹์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ์ •๋ง ์˜ค๋ž˜๋œ Office ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Office Open XML์€ 2002 ๋…„๋ถ€ํ„ฐ 2006 ๋…„๊นŒ์ง€ ์‚ฌ์šฉ๋˜์–ด ์™”์œผ๋ฏ€๋กœ ์ง€๋‚œ 10 ๋…„ ๋™์•ˆ word ๋˜๋Š” excel์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ docx ๋ฐ xlsx ํŒŒ์ผ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์ƒ๊ฐ์€ ...

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๋ฅผ ์˜คํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฌผ๋ก  OpenXml Excel ๋ Œ๋”๋Ÿฌ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ XLS / DOC๋„ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด์ œ XLS / DOC์˜ ๋…ธ์ถœ ์—ฌ๋ถ€ ๋˜๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. XLSX์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ž˜๋œ ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ์ „ํžˆ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด UBS๋Š” ์—ฌ์ „ํžˆ COBOL ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋งŒ์ผ์˜ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ XLS ๊ธฐ๋Šฅ์„ ์กฐ๊ธˆ ๋” ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@RaymondHuy :
Azure์—์„œ GDI + ๊ธฐ๋Šฅ์„ ์ฐจ๋‹จ ํ•œ ๊ฒฝ์šฐ System.Drawing.Common์ด ์ „ํ˜€ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์€ ํ”„๋ ˆ์ž„ ์›Œํฌ ์™ธ๋ถ€ DllImport ํ˜ธ์ถœ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๊นŒ?

ํ , ๊ทธ๋ƒฅ ๋ดค์–ด์š”.
System.Drawing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Azure Cloud Service (๊ธฐ๋ณธ์ ์œผ๋กœ VM)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Azure Web App (๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์œ  ํ˜ธ์ŠคํŒ…?)์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๊ฒƒ์ด Linux์—์„œ ์‹คํ–‰๋˜๋ฉด ๋‚˜์ค‘์— System.Drawing์„ SixLabors.ImageSharp๋กœ ๋Œ€์ฒดํ•˜์—ฌ Azure Web App์—์„œ ์‹คํ–‰๋˜๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์š”ํ•ฉ๋‹ˆ๋‹ค.
@RaymondHuy :
FreeType (SharpFont ๋ž˜ํผ)์ด Azure์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
https://github.com/Robmaister/SharpFont

๋…ธํŠธ :
x64-Windows์—์„œ๋Š” FT_Long ๋ฐ FT_ULong์— ๋Œ€ํ•œ using ์ ˆ์„ ๋‹ค์Œ์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

#if WINDOWS
    using FT_Long = System.Int32;
    using FT_ULong = System.UInt32;    
#else // Linux, MacOS
    using FT_Long = System.IntPtr;
    using FT_ULong = System.UIntPtr;
#endif

ํŒจ์น˜ ๋œ freetype dll์€ x64-Windows์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://gist.github.com/ststeiger/9e2eb98e29a3c987aca739045af1d2ce

(์ฐธ๊ณ  : ๋นŒ๋“œ ์˜ต์…˜์—์„œ WINDOWS ์ •์˜)

์ผ๋ถ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ :

SharpFont.Native.Init();

SharpFont.Library lib = new SharpFont.Library();

string font = @"C:\Windows\Fonts\tahoma.ttf";
if(System.Environment.OSVersion.Platform == System.PlatformID.Unix)
    font = "/usr/share/wine/fonts/tahoma.ttf";

SharpFont.Face fontFace = new SharpFont.Face(lib, font);


float size = 12;
if (fontFace!= null)
    // fontFace.SetCharSize(0, size, 0, 96);
    fontFace.SetCharSize(size, size, 96, 96);

System.Console.WriteLine(fontFace.Size.Metrics.Ascender.ToDouble());

fontFace.Size.Metrics.Ascender๋Š” WINDOWS ์ˆ˜์ •์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

.rdlc ํŒŒ์ผ๋กœ ์‹œ๋„ ํ•  ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable '์€'Friend '์ด๊ธฐ ๋•Œ๋ฌธ์—์ด ์ปจํ…์ŠคํŠธ์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.' localreport.Execute ()์—์„œ
์ €๋ฅผ ๋„์™€์ฃผ์„ธ์š”

        string sql = "SELECT * FROM employee";
        // sql = "SELECT * FROM T_Users";

        System.Data.DataTable dt = new System.Data.DataTable();

        using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
        {
            da.Fill(dt);
        }

        string fn = "wwwroot/Report1.rdl";
        fn = "wwwroot/InOutTab31.rdlc";

        AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


        System.Collections.Generic.Dictionary<string, string> parameters =
            new System.Collections.Generic.Dictionary<string, string>();
        parameters["TEN_ID"]="45";
        parameters["START_DATE"]="2018";
        parameters["END_DATE"]= "2018";

        // parameters.Add("in_logo", "base64");

        lr.AddDataSource("DsDayStatusTab31", dt); // DataSet1 is the name of the DataSet in the report




        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

        var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, parameters, "");

        System.Console.WriteLine(rr.TotalPages);


        string dir = @"d:\";
        if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
            dir = "/opt/";

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

        BuildWebHost(args).Run();

์ž„๋ฒ ๋””๋“œ VB ํ‘œํ˜„์‹์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Microsoft.VisualBasic1 \ VBCodeGenerator.cs์—์„œ
UseShellExecute๋ฅผ false๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(cmd)
{
    WorkingDirectory = currentDir,
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    UseShellExecute = false  // <== or else it can't redirect output
};

๊ทธ๋ฆฌ๊ณ  netstandard ์šฉ์œผ๋กœ ์ปดํŒŒ์ผ ๋œ ๊ฒฝ์šฐ FromFileBatch๋ฅผ roslyn์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (CodeDom ๊ณต๊ธ‰์ž๋Š” netstandard ์šฉ์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งค๊ฐœ ๋ณ€์ˆ˜์—์„œ VB ํ‘œํ˜„์‹์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์™ธ)

        protected override System.CodeDom.Compiler.CompilerResults FromFileBatch(System.CodeDom.Compiler.CompilerParameters options, string[] fileNames)
        {

#if NETSTANDARD2_0
            return NetStandardFromFileBatch(options, fileNames);
#else
            return OldFromFileBatch(options, fileNames);
#endif
        }




#if NETSTANDARD2_0         



        protected System.CodeDom.Compiler.CompilerResults NetStandardFromFileBatch(System.CodeDom.Compiler.CompilerParameters options, string[] fileNames)
        {
            //// C:\Program Files\dotnet\sdk\2.0.0\Roslyn

            //string sysver = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion();
            //System.Console.WriteLine(sysver);


            //string pf64 = System.Environment.ExpandEnvironmentVariables("%ProgramW6432%");
            //string pf32 = System.Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");
            //string pf = pf32;

            //if (System.IntPtr.Size * 8 == 64)
            //    pf = pf64;

            //// compilerDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles);
            ////compilerDirectory = System.IO.Path.Combine(compilerDirectory, "dotnet", "sdk", "2.0.0", "Roslyn");
            //compilerDirectory = System.IO.Path.Combine(pf32, "MSBuild", "14.0", "Bin");
            //if (System.IntPtr.Size * 8 == 64)
            //    compilerDirectory = System.IO.Path.Combine(compilerDirectory, "amd64");

            string assemblyName = System.IO.Path.GetFileNameWithoutExtension(options.OutputAssembly);

            Microsoft.CodeAnalysis.SyntaxTree[] syntaxTrees = new Microsoft.CodeAnalysis.SyntaxTree[fileNames.Length];

            for (int i = 0; i < fileNames.Length; ++i)
            {
                string fileContent = System.IO.File.ReadAllText(fileNames[i], System.Text.Encoding.UTF8);

                Microsoft.CodeAnalysis.VisualBasic.VisualBasicParseOptions op = null;

                // ERR_EncodinglessSyntaxTree = 37236 - Encoding must be specified... 
                syntaxTrees[i] = Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxTree.ParseText(
                    fileContent, op, fileNames[i], System.Text.Encoding.UTF8
                );

            }

            Microsoft.CodeAnalysis.MetadataReference[] references =
                new Microsoft.CodeAnalysis.MetadataReference[options.ReferencedAssemblies.Count];

            for (int i = 0; i < references.Length; ++i)
            {
                references[i] = Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(
                    options.ReferencedAssemblies[i]
                );
            }



            Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions co =
                new Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions
            (
                Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary
            );

            co.WithOptionStrict(Microsoft.CodeAnalysis.VisualBasic.OptionStrict.Off);
            co.WithOptionExplicit(false);
            co.WithOptionInfer(true);

            Microsoft.CodeAnalysis.Compilation compilation = Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.Create(
                assemblyName,
                syntaxTrees,
                references,
                co
            );


            System.CodeDom.Compiler.CompilerResults compilerResults = new System.CodeDom.Compiler.CompilerResults(options.TempFiles);

            compilerResults.NativeCompilerReturnValue = -1;

            // using (var dllStream = new System.IO.MemoryStream())
            using (System.IO.FileStream dllStream = System.IO.File.Create(options.OutputAssembly))
            {
                using (System.IO.MemoryStream pdbStream = new System.IO.MemoryStream())
                {
                    Microsoft.CodeAnalysis.Emit.EmitResult emitResult = compilation.Emit(dllStream, pdbStream);
                    if (!emitResult.Success)
                    {

                        foreach (Microsoft.CodeAnalysis.Diagnostic diagnostic in emitResult.Diagnostics)
                        {
                            // options.TreatWarningsAsErrors
                            if (diagnostic.IsWarningAsError || diagnostic.Severity == Microsoft.CodeAnalysis.DiagnosticSeverity.Error)
                            {
                                string errorNumber = diagnostic.Id;
                                string errorMessage = diagnostic.GetMessage();

                                string message = $"{errorNumber}: {errorMessage};";
                                string fileName = diagnostic.Location.SourceTree.FilePath;

                                Microsoft.CodeAnalysis.FileLinePositionSpan lineSpan = diagnostic.Location.GetLineSpan();
                                string codeInQuestion = lineSpan.Path;
                                int line = lineSpan.StartLinePosition.Line;
                                int col = lineSpan.StartLinePosition.Character;

                                compilerResults.Errors.Add(
                                    new System.CodeDom.Compiler.CompilerError(fileName, line, col, errorNumber, errorMessage)
                                );
                            } // End if 

                        } // Next diagnostic 

                        // emitResult.Diagnostics
                        // CheckCompilationResult(emitResult);
                    }
                    else
                    {
                        compilerResults.PathToAssembly = options.OutputAssembly;
                        compilerResults.NativeCompilerReturnValue = 0;
                    }
                }
            }

            // compilerResults.CompiledAssembly = System.Reflection.Assembly.Load(array3, null);

            return compilerResults;
        }
#endif

https://github.com/aspnet/RoslynCodeDomProvider ์— RoslynCodeDomProviders๊ฐ€ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ๋’ค์—์„œ Roslyn์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ๋Œ€์ ์œผ๋กœ ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ "C : \ WINDOWS \ Microsoft.NET \ Framework\vbc.exe "๋Š” ์–ด์จŒ๋“  ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

์ด์ œ ์™„์ „ํ•œ HTML4, HTML5 ๋ฐ MHTML- ๋ Œ๋”๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
ํŽ˜์ด์ง€๊ฐ€ ๋งค๊ฒจ์ง„ ๊ฒƒ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋Š” [https://www.nuget.org/packages/AspNetCore.Reporting]์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋กœ์ปฌ IIS์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Windows ์„œ๋ฒ„ 2012 R2์— ๋ฐฐํฌํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋กœ๊ทธ.

์‹คํŒจ : Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [1]
์š”์ฒญ์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
AspNetCore.Reporting.LocalProcessingException : ๋กœ์ปฌ ๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.; ๋ณด๊ณ ์„œ 'D : Apps \ BillingApproval \ ReportFilesReleaseProcess.rdl'์˜ ์ •์˜๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์‹์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ˜ํ™˜ ๊ฐ’ : -1073741819'. ---> AspNetCore.Reporting.DefinitionInvalidException: The definition of the report 'D:\Apps\BillingApproval\ReportFiles\ReleaseProcess.rdl' is invalid. An unexpected error occurred while compiling expressions. Native compiler return value: -1073741819 '. ---> AspNetCore.ReportingServices.ReportProcessing.ReportPublishingException : ์‹์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ˜ํ™˜ ๊ฐ’ : -1073741819'. at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat(Stream definitionStream, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat(Byte[] definition, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport(PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String& reportDescription, String& reportLanguage, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash) at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat(PublishingContext reportPublishingContext) at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) --- End of inner exception stack trace --- at AspNetCore.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.GetCompiledReport(PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot& snapshot) at AspNetCore.Reporting.LocalService.CompileReport() at AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport() at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() --- End of inner exception stack trace --- at AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession() at AspNetCore.Reporting.InternalLocalReport.SetParameters(IEnumerable 1 ๊ฐœ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜)
AspNetCore.Reporting.Report.SetParameters (ReportParameter parameter)
At AspNetCore.Reporting.LocalReport.Execute (RenderType renderType, Int32 pageIndex, Dictionary 2 parameters, String findString) at BA.UI.WebV2.Extension.AspNetCoreReportingExtension.ExecuteToMemoryStreamResult(LocalReport localreport, RenderType rendertype, Int32 index, Dictionary 2 parameters, String searchString) in D : \ ProjectsApproval \ Main \ BA.UI.WebV2 \ Extension \ AspNetCoreReportingExtension.cs : line 27
D : \ ProjectsApproval \ Main \ BA.UI.WebV2 \ Controllers \ ReportsController.cs : line 65์˜ BA.UI.WebV2.Controllers.ReportsController.ReleaseProcessToPDF (DateTime from, DateTime to)์—์„œ
lambda_method (Closure, Object, Object [])์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute (IActionResultTypeMapper ๋งคํผ, ObjectMethodExecutor ์‹คํ–‰๊ธฐ, ๊ฐœ์ฒด ์ปจํŠธ๋กค๋Ÿฌ, Object [] ์ธ์ˆ˜)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (ActionExecutedContext context)์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (ResourceExecutedContext context)์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()์—์„œ
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()์—์„œ
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)์—์„œ
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (HttpContext ์ปจํ…์ŠคํŠธ)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (HttpContext context)
Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke (HttpContext ์ปจํ…์ŠคํŠธ)

@jfmjason : CodeDom ์ฝ”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ (.NET 4.0)๊ฐ€ ExprHostCompiler์˜ ์ž„์‹œ ๊ฒฝ๋กœ์—์žˆ๋Š” ๋ช‡ ๊ฐœ์˜ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. .NET 4.0 ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NetStandard / NetCore ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ ํ•˜๋ฉด csc.exe๊ฐ€ ๋ฐ˜ํ™˜ ๊ฐ’ -1073741819์™€ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
.NET 4.0 ์ปดํŒŒ์ผ๋Ÿฌ๋กœ .NET Core ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— System.CodeDom์—์—†๋Š” RoslynCompilers๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ NetStandardFromFileBatch๋Š” ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค (NetFramework 4 ์šฉ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒฝ์šฐ CodeDom ์‚ฌ์šฉ).

๊ทธ๋Ÿฌ๋‚˜ .NET Core์˜ VB ๋Ÿฐํƒ€์ž„์€ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ .NET Core๋Š” ์‹ค์ œ๋กœ VB.NET์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Microsoft.VisualBasic.Strings์—์„œ Replace, Trim, AscW, ChrW, LCase, Len, Mid์™€ ๊ฐ™์€ 50 ๊ฐœ ์ •๋„์˜ VB ๋ฌธ์ž์—ด ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ VB ํ•ญ๋ชฉ์„ ์‚ดํŽด๋ณด๋ฉด .NET Core 2.0์€ ์ •ํ™•ํžˆ 2 ๊ฐœ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. AscW ๋ฐ ChrW ...

github์—์„œ ํ˜„์žฌ ์†Œ์Šค๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋ฐ”๋กœ ์ง€๊ธˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ชจ๋‘ null์„ ๋˜์ง€๋Š” ์Šคํ…์ž…๋‹ˆ๋‹ค.
https://github.com/dotnet/corefx/blob/master/src/Microsoft.VisualBasic/ref/Microsoft.VisualBasic.cs

๋”ฐ๋ผ์„œ .NET Core์™€ NetFramework๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด๊ณ ์„œ์—์„œ VB ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ํŽธ์ง‘ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ @ALL : ์—ฌ๊ธฐ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ˆ˜์ •์—†์ด .NET Core์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ๋ณด๊ณ ์„œ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ Microsoft.VisualBasic.cs์—์„œ ๋ฌธ์ž์—ด ํ•จ์ˆ˜ ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š” VB ๋Ÿฐํƒ€์ž„ ๊ด€๋ จ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ณ  C #์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ๋ฐ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ (์˜ˆ : Len ๋Œ€์‹  string.Length, InStr ๋Œ€์‹  IndexOf, Mid ๋Œ€์‹  Subtring, LCase ๋Œ€์‹  "BLA".ToLower ())๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ( "BLA") ๋“ฑ.

๋˜ํ•œ .NET Core๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์œผ๋กœ VB-Code๋Š” nullable ๊ตฌ๋ฌธ?์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์„ ์–ธํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ Double? ๋Œ€์‹  System.Nullable (Of Double)์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

NuGet :
Microsoft.CodeAnalysis.Common, Microsoft.CodeAnalysis.CSharp, Microsoft.CodeAnalysis.VisualBasic

๋˜ํ•œ ExprHostCompiler.cs์—์„œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฐธ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
(AspNetCore.ReportingServices.RdlExpressions \ ExprHostCompiler.cs)

   private static System.Reflection.Assembly GetNetStdAssembly()
        {
            System.Reflection.Assembly nsAssembly = null;

            System.Reflection.AssemblyName[] asms = typeof(Microsoft.VisualBasic.Constants).Assembly.GetReferencedAssemblies();


            foreach (System.Reflection.AssemblyName asm in asms)
            {
                if (asm.FullName.StartsWith("netstandard,", System.StringComparison.OrdinalIgnoreCase))
                {
                    nsAssembly = System.Reflection.Assembly.Load(asm.FullName);
                    break;
                }
            }

            return nsAssembly;


            //System.Reflection.Assembly[] asms = System.AppDomain.CurrentDomain.GetAssemblies();
            //
            //foreach (System.Reflection.Assembly asm in asms)
            //{
            //    if (asm.FullName.StartsWith("netstandard,", System.StringComparison.OrdinalIgnoreCase))
            //    {
            //        nsAssembly = asm;
            //        break;
            //    }
            //}

            // return nsAssembly;
        }



        private byte[] InternalCompile(System.AppDomain compilationTempAppDomain, bool refusePermissions)
        {
            if (m_builder.HasExpressions)
            {
                System.CodeDom.Compiler.CompilerParameters compilerParameters = new System.CodeDom.Compiler.CompilerParameters();
                compilerParameters.OutputAssembly = System.IO.Path.Combine(System.IO.Path.GetTempPath(), m_expressionHostAssemblyHolder.ExprHostAssemblyName, "ExpressionHost.dll");
                compilerParameters.TempFiles = new System.CodeDom.Compiler.TempFileCollection(System.IO.Path.GetDirectoryName(compilerParameters.OutputAssembly));
                compilerParameters.GenerateExecutable = false;
                compilerParameters.GenerateInMemory = false;
                compilerParameters.IncludeDebugInformation = false;

                compilerParameters.ReferencedAssemblies.Add(typeof(AspNetCore.Reporting.InternalLocalReport).Assembly.Location);

                // Real reportServer
                // compilerParameters.ReferencedAssemblies.Add("System.dll");
                // compilerParameters.ReferencedAssemblies.Add(typeof(AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.ReportObjectModelProxy).Assembly.Location);
                // compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.SqlServer.Types.SqlGeography).Assembly.Location);

#if NETSTANDARD2_0

                // Assemblies: mscorlib.dll, netstandard.dll, System.Threading.Thread.dll
                // System.Threading.Thread.dll, not netstandard.dll ...
                //// compilerParameters.ReferencedAssemblies.Add(typeof(System.LocalDataStoreSlot).Assembly.Location);

                // compilerParameters.ReferencedAssemblies.Add(System.Linq.Enumerable.FirstOrDefault(System.Linq.Enumerable.Where(System.AppDomain.CurrentDomain.GetAssemblies(), (System.Reflection.Assembly t) => t.FullName.Contains("netstandard,"))).Location);

                // netstandard.dll
                compilerParameters.ReferencedAssemblies.Add(GetNetStdAssembly().Location);

                // System.Private.CoreLib.dll
                compilerParameters.ReferencedAssemblies.Add(typeof(System.MarshalByRefObject).Assembly.Location);

                // System.Runtime.dll
                compilerParameters.ReferencedAssemblies.Add(typeof(System.IO.FileAttributes).Assembly.Location);

                // Microsoft.VisualBasic.dll
                compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.VisualBasic.Constants).Assembly.Location);

                //compilerParameters.ReferencedAssemblies.Add(typeof(string).Assembly.Location);
                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Uri).Assembly.Location);

                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Drawing.RectangleF).Assembly.Location);
                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Drawing.Graphics).Assembly.Location);

                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Data.Common.DbCommand).Assembly.Location);
                //compilerParameters.ReferencedAssemblies.Add(typeof(System.Data.SqlClient.SqlCommand).Assembly.Location);

                //// compilerParameters.ReferencedAssemblies.Add(typeof(System.LocalDataStoreSlot).Assembly.Location);
#else

                // mscorlib
                compilerParameters.ReferencedAssemblies.Add(typeof(string).Assembly.Location); 

                // System.Core
                // Already contains reference to System.Core
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.IO.Pipes.PipeSecurity).Assembly.Location);

                // Microsoft.CSharp
                // compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.Location); 

                // Microsoft.VisualBasic.Constants
                compilerParameters.ReferencedAssemblies.Add(typeof(Microsoft.VisualBasic.Constants).Assembly.Location); 

                // System
                // Already contains reference to System
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.Uri).Assembly.Location); 
                // Already contains reference to System.Drawing
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.Drawing.Graphics).Assembly.Location);
                // Already contains reference to System.Data 
                // compilerParameters.ReferencedAssemblies.Add(typeof(System.Data.DataTable).Assembly.Location);
#endif

                compilerParameters.CompilerOptions += m_langParser.GetCompilerArguments();

@ amh1979 : ์•„์ง ๋ณด์ง€ ์•Š์•˜์ง€๋งŒ ๋ทฐ์–ด์˜ ํŽ˜์ด์ง€ ๋ฒ„์ „์—์„œ ๋ณด๊ณ ์„œ์˜ ์ด๋ฏธ์ง€๊ฐ€ ํŽ˜์ด์ง€ ๋œ HTML ๋ Œ๋”๋ง์— ํ‘œ์‹œ๋ฉ๋‹ˆ๊นŒ?
ReportServer์—์„œ html4 & 5 ์™„์ „ํ•œ ๋ Œ๋”๋Ÿฌ๋ฅผ ๊ฐ€์ ธ ์™”์„ ๋•Œ ์ด๋ฏธ์ง€๊ฐ€ ReportingServices์˜ axd ๋˜๋Š” ashx ํ•ธ๋“ค๋Ÿฌ์— ์œ„์ž„ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ MHT ๋ฒ„์ „์— ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ url ( "data : image / png; base64, SOME_BASE64_IMAGE"); ๋Œ€์‹  HTML์—์„œ ์ธ๋ผ์ธ๋˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ์™ธ๋ถ€ ๋งํฌ๊ฐ€ ์•„๋‹Œ ๋งํฌ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์ด ์‹œ์ฒญ์ž์—๊ฒŒ๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ

์‘๋‹ต ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ (.net core 2.1)์˜ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์„ ๋กœ์ปฌ IIS์— ๊ฒŒ์‹œ ํ•  ๋•Œ ์™œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

.NET Framework๊ฐ€ ๋กœ์ปฌ๋กœ ์„ค์น˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ๋กœ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜๋Š” ๋กœ์ปฌ ์›น ์„œ๋ฒ„๊ฐ€ ํ†ตํ•ฉ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋…ผ๋ฆฌ ๊ฒฝ๋กœ, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ’€ ์„ค์ •, ๋ณด์•ˆ ์„ค์ •, ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฆฌ๋””๋ ‰์…˜ ๋“ฑ์— ๋„๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ServicePacks, CumulativeUpdates ๋ฐ ๊ธฐํƒ€ ํฅ๋ฏธ๋กœ์šด "๊ธฐ๋Šฅ".

์ž‘์€ ํ…Œ์ŠคํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
Win10์—์„œ System.Drawing.Common์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
Ubuntu 16.04์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
AspNetCore.Reporting.LocalProcessingException : ๋กœ์ปฌ ๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.; ๋ณด๊ณ ์„œ '/opt/testReportViewer/bin/Debug/netcoreapp2.1/Reports/Report1.rdlc'์˜ ์ •์˜๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 'kernel32.dll'๋˜๋Š” ํ•ด๋‹น ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋„๋ก LD_DEBUG ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. libkernel32.dll : ๊ณต์œ  ๊ฐœ์ฒด ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Œ : ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์—†์Œ ---> AspNetCore.Reporting.DefinitionInvalidException : ๋ณด๊ณ ์„œ ์ •์˜ '/ opt / testReportViewer /bin/Debug/netcoreapp2.1/Reports/Report1.rdlc '๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 'kernel32.dll'๋˜๋Š” ํ•ด๋‹น ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋„๋ก LD_DEBUG ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. libkernel32.dll : ๊ณต์œ  ๊ฐœ์ฒด ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Œ : ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์—†์Œ ---> AspNetCore.ReportingServices.ReportProcessing.ReportProcessingException : ๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 'kernel32.dll'๋˜๋Š” ํ•ด๋‹น ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋„๋ก LD_DEBUG ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. libkernel32.dll : ๊ณต์œ  ๊ฐœ์ฒด ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Œ : ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์—†์Œ ---> System.DllNotFoundException : ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 'kernel32.dll'๋˜๋Š” ํ•˜๋‚˜๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Œ ์˜์กด์„ฑ. ๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋„๋ก LD_DEBUG ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. libkernel32.dll : ๊ณต์œ  ๊ฐœ์ฒด ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Œ : ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์—†์Œ
AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat (Stream definitionStream, String & description, String & language, ParameterInfoCollection & parameters, DataSourceInfoCollection & dataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, Boolean & hasExternalImages, Boolean & hasExternalImages, Boolean & hasExternalImages, Boolean & hasExternalImages, Boolean)์—์„œ
AspNetCore.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat (Byte [] ์ •์˜, String & ์„ค๋ช…, String & ์–ธ์–ด, ParameterInfoCollection & ๋งค๊ฐœ ๋ณ€์ˆ˜, DataSourceInfoCollection & dataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userReferenceLocation, ArrayList & dataSetsName, Boolean & hasHyperlinks, Byte [] & dataSetsHash & hasExternalImages, Boolean &)
at AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport (PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String & reportDescription, String & reportLanguage, ParameterInfoCollection & parameters, DataSourceInfoCollection & dataSources, DataSetInfoCollection & sharedDataSetReferences, UserLocationFlags & userHimagesLocation, Boolean & hasExternal & userReference, Boolean & hasExternal & userReference, Boolean)
AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)์—์„œ
--- ๋‚ด๋ถ€ ์˜ˆ์™ธ ์Šคํƒ ์ถ”์  ๋ ---
AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat (PublishingContext reportPublishingContext)์—์„œ
AspNetCore.Reporting.ReportCompiler.CompileReport (ICatalogItemContext context, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
--- ๋‚ด๋ถ€ ์˜ˆ์™ธ ์Šคํƒ ์ถ”์  ๋ ---
AspNetCore.Reporting.ReportCompiler.CompileReport (ICatalogItemContext context, Byte [] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot & snapshot)
AspNetCore.Reporting.LocalService.GetCompiledReport (PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot & snapshot)์—์„œ
AspNetCore.Reporting.LocalService.CompileReport ()์—์„œ
AspNetCore.Reporting.LocalService.AspNetCore.Reporting.ILocalProcessingHost.CompileReport ()์—์„œ
AspNetCore.Reporting.InternalLocalReport.EnsureExecutionSession ()์—์„œ
--- ๋‚ด๋ถ€ ์˜ˆ์™ธ ์Šคํƒ ์ถ”์  ๋ ---

@ststeiger AspNetCore.Reporting ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋‰ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ๋ฉฐ์น  ๋™์•ˆ .NET Core์˜ RDL ํŒŒ์ผ์—์„œ PDF๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ์—ˆ์œผ๋ฉฐ ์ œ๊ฐ€ ์ฐพ์€ ์œ ์ผํ•œ ์†”๋ฃจ์…˜์€ AspNetCore.Reporting์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— Windows์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์ž‘์„ฑํ•˜๊ณ ๋ณด๊ณ  ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋งค์šฐ ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. , ๋˜ํ•œ ํ•˜์œ„ ๋ณด๊ณ ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์†Œ์Šค ์—†์ด๋Š” AspNetCore.Reporting์„ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— :) ... ๋ˆ„๋ฝ ๋œ ๋น„ํŠธ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์นจ๋‚ด ๋””๋ฒ„๊น… ํ•  ์ˆ˜์žˆ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค ...)

@OkunevPY : ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์›์ธ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Linux์—์„œ๋Š” ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ํ•ด์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ReportViewer ์ฝ”๋“œ์—์„œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๋“ฑ๊ธ‰ ์ฝ”๋“œ๋Š” ์•”ํ˜ธํ™” / ๋ณตํ˜ธํ™” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋จผ์ € ์ž‘๋™ํ•˜๋„๋กํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@zillemarco;
PDF ์ž‘์„ฑ์€ ์•„์ง ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ Windows์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋œ dll๋กœ ๋ฐฐํฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ๊ธฐ์ˆ ์ ์œผ๋กœ ๋ถˆ๋ฒ•์  ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Linux์—์„œ ์ƒ์„ฑ ๋œ PDF๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ wkHtmlToPdf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ .NET-Core ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค.
https://github.com/ststeiger/libWkHtml2X
์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ณ€ํ˜• ๋งŒ ์‚ฌ์šฉ (์ž… / ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•œ wkhtmltopdf.exe, wkhtmltoimage.exe)
libWkHtmlToX.ProcessManager(opts)
wkhtmltox.dll์€ ๋‹ค์ค‘ ์Šค๋ ˆ๋”ฉ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋‚ด C # ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„์ง ์™„์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์˜ˆ (converter.telerik.com์—์„œ C #์œผ๋กœ ๋ณ€ํ™˜) :

  • SVG์—์„œ PDF๋กœ :
Dim pngBytes As Byte() = Nothing
Dim paper_maxWidth As Double = 1024 ' pixel
Dim paper_maxHeight As Double = 768 ' pixel
Dim svgInfo As cSvgInfo = Portal_Convert.wkHtmlHelper.SvgToPaperSize(svg, paper_maxWidth, paper_maxHeight, False)

Dim opts As New libWkHtmlToX.WkHtmlToImageCommandLineOptions()
opts.ExecutableDirectory = Portal_Convert.wkHtmlHelper.GetWkHtmlToXPath()

opts.DisableSmartWidth = True
opts.ScreenWidth = System.Math.Ceiling(svgInfo.NewWidth)
opts.ScreenHeight = System.Math.Ceiling(svgInfo.NewHeight)

' svgInfo.HTML = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.MapPath("~/External/1506414857353.svg"), System.Text.Encoding.UTF8)

Using p As New libWkHtmlToX.ProcessManager(opts)
    p.Start()
    p.WriteStandardInput(svgInfo.HTML)
    pngBytes = p.ReadOutputStream()

    Dim b As Boolean = p.WaitForExit(5000)
End Using ' p 
  • HTML์—์„œ PDF๋กœ :
        Dim opts As New libWkHtmlToX.WkHtmlToPdfCommandLineOptions()
        opts.ExecutableDirectory = Portal_Convert.wkHtmlHelper.GetWkHtmlToXPath()

        ' Dim measure As String = value.Replace(Number.ToString(), "")

        'Dim dblWidth As Double = Double.Parse(System.Text.RegularExpressions.Regex.Match(width, "[\d.]+").Value)
        'Dim dblHeight As Double = Double.Parse(System.Text.RegularExpressions.Regex.Match(height, "[\d.]+").Value)

        'If dblHeight > dblWidth Then
        '    opts.Orientation = libWkHtmlToX.Orientation_t.Portrait
        'Else
        '    opts.Orientation = libWkHtmlToX.Orientation_t.Landscape
        '    Dim x As String = width
        '    width = height
        '    height = x
        'End If

        opts.Width = width
        opts.Height = height
        opts.DisableSmartShrinking = True

        ' dpi is not working in wkhtmltopdf version 0.12.4
        ' opts.DPI = 300
        ' zoom setting with value 96/300 = 0.32
        ' opts.ZoomFactor = 96.0 / opts.DPI
        ' opts.ZoomFactor = 1.0 - 96.0 / opts.DPI
        ' opts.ZoomFactor = (1.0 / opts.DPI) / (1.0 / 96.0)
        opts.DPI = 96

        Dim pdfBytes As Byte() = Nothing

        Using p As New libWkHtmlToX.ProcessManager(opts)
            p.Start()
            p.WriteStandardInput(html)
            pdfBytes = p.ReadOutputStream()

            Dim b As Boolean = p.WaitForExit(5000)
        End Using ' p 

        Return pdfBytes

๋˜๋Š” .NET-Core ์šฉ PdfSharp๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/ststeiger/PdfSharpCore

๋˜ํ•œ ์ „์ฒด PDF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ NetStandard๋กœ ์ด์‹ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/ststeiger/PdfSharpNetStandard
(Azure ํ˜ธ์ŠคํŒ…์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ PdfSharpNetStandard๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.)

Linux์˜ ReportViewer-PDF์— ๊ด€ํ•œ ํ•œ :
๋จผ์ € ๋งŽ์€ pinvoke ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (Linux๋Š” Windows-API๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  dll ํ˜ธ์ถœ์„ wine์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค).

์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ (๊ธ€๊ผด ํฌํ•จ)์ด๋ฏ€๋กœ ์•„์ง GetFontData ๋งŒ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ—ˆ๋ธŒ๊ฐ€ ์•„๋‹Œ gitlab ๊ณ„์ • ์ด๋ฆ„์„ ์•Œ๋ ค ์ฃผ์‹œ๋ฉด ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ststeiger ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๋ฒ•

@zillemarco : ๋‹น์‹ ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„๋งˆ๋„ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ํฌํ•จ ๋œ ์ด๋ฉ”์ผ์„ gitlab์—์„œ ๋ฐ›์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Resharper ๋Œ€์‹  ILSpy 4.0 ๋ฒ ํƒ€ 2๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.
https://github.com/icsharpcode/ILSpy/releases

.NET Framework ๋‚ด๋ถ€์—์„œ ๋””๋ฒ„๊ทธํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ Rider๋กœ ๋ผ์ด๋ธŒ ๋”” ์ปดํŒŒ์ผ ๋ฐ ๋””๋ฒ„๊ทธ๋ฅผ ์‹œ๋„ํ•ด๋ณด์„ธ์š”. EAP๋Š” ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค.
https://www.jetbrains.com/rider/eap/

@ststeiger ๋Š” ์ด๋ฉ”์ผ ๊ฐ์‚ฌ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค :) ํŒ๋„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@ststeiger okunevpy์— ๋Œ€ํ•œ AspNetCore.Reporting ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@OkunevPY : ๋‹น์‹ ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ผ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@ststeiger ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

        string sql = "SELECT * FROM employee";
        // sql = "SELECT * FROM T_Users";

        System.Data.DataTable dt = new System.Data.DataTable();

        using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
        {
            da.Fill(dt);
        }

        string fn = "wwwroot/Report1.rdl";
        fn = "wwwroot/InOutTab31.rdlc";

        AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


        System.Collections.Generic.Dictionary<string, string> parameters =
            new System.Collections.Generic.Dictionary<string, string>();
        parameters["TEN_ID"]="45";
        parameters["START_DATE"]="2018";
        parameters["END_DATE"]= "2018";

        // parameters.Add("in_logo", "base64");

        lr.AddDataSource("DsDayStatusTab31", dt); // DataSet1 is the name of the DataSet in the report




        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

        var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, parameters, "");

        System.Console.WriteLine(rr.TotalPages);


        string dir = @"d:\";
        if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
            dir = "/opt/";

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

        BuildWebHost(args).Run();

AspNetCore.Reporting.LocalProcessingException : '๋กœ์ปฌ ๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 1252 ์ธ์ฝ”๋”ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฝ”๋”ฉ ์ •์˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Encoding.RegisterProvider ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.'

@Jhonnybmx : google.com์ด๋ผ๋Š” ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ํ•ด๊ฒฐ์ฑ…์€ ์ฒซ ๋ฒˆ์งธ ๋งํฌ์ž…๋‹ˆ๋‹ค.

https://stackoverflow.com/questions/49215791/vs-code-c-sharp-system-notsupportedexception-no-data-is-available-for-encodin

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

์•ˆ๋…•ํ•˜์„ธ์š”, rdlc ๋ณด๊ณ ์„œ๋ฅผ PDF๋กœ ๋‚ด๋ณด๋‚ด๋Š” .NET Core์˜ LocalReport์— ๋Œ€ํ•ด ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค.
๋‚˜๋ฅผ ์œ„ํ•ด Windows ์ „์šฉ ๋ฒ„์ „์€ ํ˜„์žฌ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” @ amh1979์˜ NuGet ํŒจํ‚ค์ง€ AspNetCore.ReportingServices๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š”์ด ํŒจํ‚ค์ง€์˜ InternalLocalReport ํด๋ž˜์Šค๊ฐ€ ๋‚ด๋ถ€์ด๋ฉฐ eq์— ๋Œ€ํ•œ ์ „์ฒด API (์›๋ž˜ MS LocalReport ๊ตฌํ˜„์—์„œ์™€ ๊ฐ™์ด)์— ์•ก์„ธ์Šคํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. SubreportProcessing ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด LoadSubreportDefinition () ๋˜๋Š” GetParameters () ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” AspNetCore.Reporting.LocalReport ํด๋ž˜์Šค (AspNetCore.Reporting NuGet)์—์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

AspNetCore.ReportingServices.dll ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” AspNetCore.Reporting.dll ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•ด InternalsVisibleTo๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/amh1979/Reporting/tree/master/AspNetCore.Reporting with Reporting.pfx ์ธ์ฆ์„œ (์•”ํ˜ธ๊ฐ€ ์—†์Œ)์—์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์–ด๋–ป๊ฒŒ ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ € ์ข€ ๋„์™€ ์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”? ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@ststeiger GitLab ์ €์žฅ์†Œ AspNetCore.Reporting์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ๋„ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด GitLab ์‚ฌ์šฉ์ž ์ด๋ฆ„์€ holajan์ž…๋‹ˆ๋‹ค.
๊ฐ์‚ฌ

์ด ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ฅธ AspNetCore.ReportingServices
http://go.microsoft.com/fwlink/?LinkId=826162
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ซ์•˜๋‹ค

๋ˆ„๊ตฐ๊ฐ€์ด ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉ / ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ / ๋‹จ์„œ ๋˜๋Š” ํžŒํŠธ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ststeiger AspNetCore.Reporting ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? PDF๋กœ Linux์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@holajan , @skivsoft :
์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ํœด์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค-์‹ฑ๊ฐ€ํฌ๋ฅด์™€ ํƒœ๊ตญ์œผ๋กœ์˜ ๋ฉ‹์ง„ ์—ฌํ–‰์ด์—ˆ์Šต๋‹ˆ๋‹ค.
์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜๋ฉด gitlab์— ์ œ๊ณต๋œ ์ฃผ์†Œ๋กœ ์ด๋ฉ”์ผ์„ ๋ฐ›์•˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@azharuddinsayed :

.rdlc ํŒŒ์ผ๋กœ ์‹œ๋„ ํ•  ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.DataRegionExprHost (Of TMemberType, TCellType) .m_memberTreeHostsRemotable '์€'Friend '์ด๊ธฐ ๋•Œ๋ฌธ์—์ด ์ปจํ…์ŠคํŠธ์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.' localreport.Execute ()์—์„œ
์ €๋ฅผ ๋„์™€์ฃผ์„ธ์š”

๋‚˜๋Š” ๊ทธ ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ReportingServices/AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel/CustomCodeProxyBase.cs

internal AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode Report => m_reportObjectModel;
==>
internal protected AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode Report => m_reportObjectModel;



internal CustomCodeProxyBase(AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode reportObjectModel)
==> 
internal protected CustomCodeProxyBase(AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel.IReportObjectModelProxyForCustomCode reportObjectModel)

๊ณผ

ReportingServices/AspNetCore.ReportingServices.RdlExpressions.ExpressionHostObjectModel/IReportObjectModelProxyForCustomCode.cs
internal interface IReportObjectModelProxyForCustomCode
==> 
public interface IReportObjectModelProxyForCustomCode

๊ทธ ์™ธ์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์ •์ด
AnyWebReporting \ ReportingServices \ Microsoft.VisualBasic1 \ VBCodeGenerator.cs

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + cmd)
==>
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c \"" + cmd + "\"")

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ ์–ด๋„ ๋‚ด ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์Šคํ„ฐ์—์„œ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ststeiger ์•ก์„ธ์Šค

@skivsoft : ์•„์ง ์—†์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  pinvoke๋ฅผ freetype์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

Linux์—์„œ PDF๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ PdfSharpCore ๋˜๋Š” PdfSharpNetStandard๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/ststeiger/PdfSharpCore
https://github.com/ststeiger/PdfSharpNetStandard
๋‚˜๋Š” ๋‘˜ ๋‹ค Linux์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
PdfSharpNetStandard๋Š” ๋” ์™„๋ฒฝํ•˜์ง€๋งŒ GDI + / libGDIplus๋„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด PdfSharpCore๋Š” System.Drawing์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ststeiger repo์— ์•ก์„ธ์Šค ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

.NET Core 2.2 Windows ์•ฑ์—์„œ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘๋™ (PDF๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ) ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
LocalReports๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  InternalLocalReport๋ฅผ LocalReport๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํด๋ž˜์Šค๋ฅผ ๊ณต๊ฐœ (์›๋ž˜ LocalReport API์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•จ)ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ReportViewer_NetStandard ํ”„๋กœ์ ํŠธ์˜ ๋ณต์‚ฌ๋ณธ์— ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณด๊ณ ์„œ์—์„œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ Visual Basic ํ‘œํ˜„์‹ :
IIf -_ExprHostBuilder_์˜ Microsoft.VisualBasic.Interaction ์— ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  netcoreapp2.2๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ _Microsoft.VisualBasic.dll_์˜ Microsoft.VisualBasic.Interaction ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ด๊ณ  Microsoft.VisualBasic.Interaction ํด๋ž˜์Šค๋ฅผ Microsoft.VisualBasic1์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹ -_ExprHostBuilder_์˜ Microsoft.VisualBasic.StringsEx ์— ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Microsoft.VisualBasic1 ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค (์›๋ž˜ ํด๋ž˜์Šค Microsoft.VisualBasic.Strings๊ฐ€ ๊ณต์šฉ์ด์ง€๋งŒ Format ํ•จ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ).

System.Environment.NewLine -_ExprHostCompiler_์˜ System.Runtime.Extensions.dll ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

In AspNetCore.ReportingServices.RdlExpressions\ExprHostBuilder.cs:
AspNetCore.ReportingServices.RdlExpressions.ExprHostBuilder.GetExprHost(AspNetCore.ReportingServices.ReportIntermediateFormat.ProcessingIntermediateFormatVersion version, bool refusePermissions)
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.StringsEx"));
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.Interaction"));

In AspNetCore.ReportingServices.ReportProcessing\ExprHostBuilder.cs:
AspNetCore.ReportingServices.ReportProcessing.ExprHostBuilder.GetExprHost(AspNetCore.ReportingServices.ReportProcessing.IntermediateFormatVersion version, bool refusePermissions)
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.StringsEx"));
+                codeNamespace.Imports.Add(new System.CodeDom.CodeNamespaceImport("Microsoft.VisualBasic.Interaction"));

In AspNetCore.ReportingServices.RdlExpressions\ExprHostCompiler.cs:
AspNetCore.ReportingServices.RdlExpressions.ExprHostCompiler.InternalCompile(System.AppDomain compilationTempAppDomain, bool refusePermissions)
+                // System.Runtime.Extensions.dll
+                compilerParameters.ReferencedAssemblies.Add(typeof(System.Environment).Assembly.Location);

Added file Microsoft.VisualBasic1\Interaction.cs:
using Microsoft.VisualBasic.CompilerServices;

namespace Microsoft.VisualBasic
{
    /// <summary>The <see langword="Interaction" /> module contains procedures used to interact with objects, applications, and systems. </summary>
    [StandardModule]
    public sealed class Interaction
    {
        public static T IIf<T>(bool condition, T truePart, T falsePart)
        {
            return !condition ? falsePart : truePart;
        }
    }
}






Added file Microsoft.VisualBasic1\StringsEx.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\UtilsEx.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\Information.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\Symbols.cs in (StringsEx.zip)
Added file Microsoft.VisualBasic1\ExceptionUtils.cs in (StringsEx.zip)

StringsEx.zip

์‹์œผ๋กœ ํ•˜์œ„ ๋ณด๊ณ ์„œ ์ˆ˜์ • :
ํ•˜์œ„ ๋ณด๊ณ ์„œ ์š”์†Œ๊ฐ€ ํŠน์ • ํ•˜์œ„ ๋ณด๊ณ ์„œ์— ๋Œ€ํ•ด ReportExprHost๊ฐ€ ์•„๋‹Œ ์ฃผ ๋ณด๊ณ ์„œ์˜ ReportExprHost๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•˜์œ„ ๋ณด๊ณ ์„œ์˜์‹์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ExpressionHost.dll ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์ด๋ฆ„๋ณ„๋กœ ์บ์‹œ ๋œ ReportRuntime.LoadExprHostAssembly ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋ชจ๋“  ๋ณด๊ณ ์„œ ๋ฐ ํ•˜์œ„ ๋ณด๊ณ ์„œ์˜ ์ด๋ฆ„์€ ํ•ญ์ƒ ๋™์ผํ•œ "_ExpressionHost_"์ž…๋‹ˆ๋‹ค. ์ด ์บ์‹ฑ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋“œ ๋ณ€๊ฒฝ :

In AspNetCore.ReportingServices.RdlExpressions\ReportRuntime.cs:
-                private static readonly System.Collections.Hashtable ExpressionHosts = new System.Collections.Hashtable();

AspNetCore.ReportingServices.RdlExpressions.ReportRuntime.LoadExprHostIntoCurrentAppDomain(byte[] exprHostBytes, string exprHostAssemblyName, System.Security.Policy.Evidence evidence, bool includeParameters, bool parametersOnly, AspNetCore.ReportingServices.ReportProcessing.OnDemandReportObjectModel.OnDemandObjectModel objectModel, System.Collections.Generic.List<string> codeModules)
-                System.Reflection.Assembly assembly = LoadExprHostAssembly(exprHostBytes, exprHostAssemblyName, evidence);
+                System.Reflection.Assembly assembly = LoadExprHostAssembly(exprHostBytes);

            private static System.Reflection.Assembly LoadExprHostAssembly(byte[] exprHostBytes)
            {
                try
                {
                    new System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityPermissionFlag.ControlEvidence).Assert();
                    return System.Reflection.Assembly.Load(exprHostBytes);
                }
                finally
                {
                    System.Security.CodeAccessPermission.RevertAssert();
                }
            }

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒ€ํ† ํ•˜๊ณ  ์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด repo์—์„œ๋„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@holajan : System.String์„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.
Ambigous call to Replace - cannot resolve call
Microsoft.VisualBasic.Interaction ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.
ambigous call to Microsoft.VisualBasic.Interaction
NetCore ๋˜๋Š” .NET Framework 4์—์„œ ์‹คํ–‰ํ•  ๋•Œ.
.NET Core 2.2์—์„œ๋งŒ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บ์‹ฑ์ด ์ž˜๋ชป๋˜๋ฉด ์บ์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๊ทธ ๋ณ€ํ™”์— ๋™์˜ํ•˜์‹ญ์‹œ์˜ค.
๊ทธ๋ž˜๋„ ์ด์ „ ์ฝ”๋“œ๋ฅผ #ifdef false (์ œ๊ฑฐํ•˜๋Š” ๋Œ€์‹ )์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

@ststeiger System.String ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์˜๊ฒฌ์„ ํŽธ์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Format ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ ๋Œ€์‹  Microsoft.VisualBasic.StringsEx ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ Microsoft.VisualBasic.Interaction ์€ .NET Core 2.2์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Microsoft.VisualBasic.Interaction ํด๋ž˜์Šค๋Š” Microsoft.VisualBasic.dll for .NETCoreApp v2.2 internal ์— ์žˆ๊ณ  Microsoft.VisualBasic.dll for .NETCoreApp v2.09๋Š” public์ด์ง€๋งŒ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ IIf .
์ด ๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ .NET core 3.0์—์„œ๋Š” ์–ด์จŒ๋“  ๋ณ€๊ฒฝ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@holajan : ๊ทธ๋Ÿผ, 3.0๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ ์ž
InternalLocalReport๋ฅผ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ ๊ทธ๊ฒƒ์˜ ๋Œ€์ค‘์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด์ƒํ•œ ์ด๋ฆ„;)

@holajan : Microsoft.VisualBasic.StringsEx ์ถ”๊ฐ€, ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
.NET 4์— ๋Œ€ํ•œ IReadOnlyDictionary๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ–ˆ์ง€๋งŒ ์‚ฌ์†Œํ•œ ์–ธ๊ธ‰๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์ด ๋‹น์‹ ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@ststeiger ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
IIf ์‹์ด ์ž‘๋™ํ•˜๋ ค๋ฉด Microsoft.VisualBasic1._Interaction.cs์—์„œ #if false ๋ฅผ #if true ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๊ณ ๋ง™์Šต๋‹ˆ๋‹ค

@holajan : ์ข‹์•„, ๊ทธ๋ž˜์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์†”๋ฃจ์…˜์˜ ์ •์˜๊ฐ€ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋˜๋„๋ก ํˆฌํ‘œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- ํ•ต์‹ฌ

2019/03 ํ˜„์žฌ ๊ฐ€์žฅ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ 7 ์œ„ : https://feedback.azure.com/forums/908035-sql-server?category_id=325159

ํŽธ์ง‘ : 2019/05 ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„์—์„œ 5 ๋ฒˆ์งธ

ํŽธ์ง‘ : 2019/07 ๊ธฐ์ค€์œผ๋กœ 4 ์œ„

        string sql = "SELECT * FROM employee";
        // sql = "SELECT * FROM T_Users";

        System.Data.DataTable dt = new System.Data.DataTable();

        using (System.Data.Common.DbDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, csb.ConnectionString))
        {
            da.Fill(dt);
        }

        string fn = "wwwroot/Report1.rdl";
        fn = "wwwroot/InOutTab31.rdlc";

        AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);


        System.Collections.Generic.Dictionary<string, string> parameters =
            new System.Collections.Generic.Dictionary<string, string>();
        parameters["TEN_ID"]="45";
        parameters["START_DATE"]="2018";
        parameters["END_DATE"]= "2018";

        // parameters.Add("in_logo", "base64");

        lr.AddDataSource("DsDayStatusTab31", dt); // DataSet1 is the name of the DataSet in the report




        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 1, null, "");

        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Rpl, 1, null, ""); // Kaboom 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Html, 2, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.ExcelOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Word, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.WordOpenXml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Atom, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Xml, 1, null, "");
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Json, 1, null, "");// KABOOM 
        // var rr = lr.Execute(AspNetCore.Reporting.RenderType.Csv, 1, null, "");

        var rr = lr.Execute(AspNetCore.Reporting.RenderType.Excel, 1, parameters, "");

        System.Console.WriteLine(rr.TotalPages);


        string dir = @"d:\";
        if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
            dir = "/opt/";

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.css"), rr.SecondaryStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pdf"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xls"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xlsx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.doc"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.docx"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.tiff"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.atom.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.xml"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.json"), rr.MainStream);
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.csv"), rr.MainStream);

        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.rpl"), rr.MainStream); // BOOM 
        // System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.htm"), rr.MainStream);
        System.IO.File.WriteAllBytes(System.IO.Path.Combine(dir, "foo.pptx"), rr.MainStream);

        BuildWebHost(args).Run();

AspNetCore.Reporting.LocalProcessingException : '๋กœ์ปฌ ๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 1252 ์ธ์ฝ”๋”ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฝ”๋”ฉ ์ •์˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Encoding.RegisterProvider ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.'

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด

์•ˆ๋…•ํ•˜์„ธ์š”,

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Html๋กœ ๋ณด๊ณ ์„œ๋ฅผ ๋‚ด๋ณด๋‚ด๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

.rdl ํŒŒ์ผ์— ์ฐจํŠธ ํฌํ•จ

Html ์Šคํฌ๋ฆฐ ์ƒท์„ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ

PlatForm : ASP.NET Core

public string _reportPath = @ ".. \ RenderReportAPI \ employeeChart.rdl";

๋ฌธ์ž์—ด mimtype = "";
int ํ™•์žฅ = 1;

       LocalReport localReport = new LocalReport(_reportPath);

    _dataSourceName = "DataSet1";
    _dataSourceList = Employee.GetEmployees();                                   
    localReport.AddDataSource(_dataSourceName, _dataSourceList);



    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    var result = localReport.Execute(RenderType.Html, extension, null, findString: mimtype);

Chart_html

@chinturathod : "๋ณด๊ณ ์„œ ์ฐจํŠธ"์š”์†Œ์˜ URL์€ ๋ฌด์—‡์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ?
html-renderer์—๋Š” CSS์— ๋Œ€ํ•œ ๋ณด์กฐ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
base64๋กœ ์ธ์ฝ”๋”ฉ ๋œ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด๋ฏธ์ง€ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ๋งํฌ์ž…๋‹ˆ๊นŒ?

๋ฟก ๋นต๋€จ
์•ˆ๋…•ํ•˜์„ธ์š” ์•„๋ž˜์—์„œ HTML ๋ฐ CSS๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.
HTML :

\"Report
19-03-2019 12:08:25







CSS :

"#rsoReportDiv .A97993c8d452f40d4910a317776d607f616xBc {
border : 1pt ์—†์Œ ๊ฒ€์ •์ƒ‰;
๋ฐฐ๊ฒฝ์ƒ‰ : ํˆฌ๋ช…;
}

rsoReportDiv .A97993c8d452f40d4910a317776d607f616xB {

border:1pt none Black;
background-color:Transparent;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f69 {

word-wrap:break-word;
word-break:break-word;
white-space:pre-wrap;
min-width:139.70mm;
overflow:hidden;
width:139.70mm;
border:1pt none Black;
background-color:Transparent;
font-style:normal;
font-family:'Segoe UI Light';
font-size:28pt;
font-weight:400;
text-decoration:none;
unicode-bidi:normal;
color:Black;
vertical-align:top;
text-align:left;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f614 {

border:1pt none #d3d3d3;
background-color:White;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f65c {

border:1pt none Black;
background-color:Transparent;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f65 {

min-width:152.40mm;
min-height:65.14mm;
width:152.40mm;
border:1pt none Black;
background-color:Transparent;

}

rsoReportDiv .A97993c8d452f40d4910a317776d607f63 {

word-wrap:break-word;
word-break:break-word;
white-space:pre-wrap;
padding-left:2pt;
padding-top:2pt;
padding-right:2pt;
padding-bottom:2pt;
border:1pt none Black;
background-color:Transparent;
font-style:normal;
font-family:'Segoe UI';
font-size:10pt;
font-weight:400;
text-decoration:none;
unicode-bidi:normal;
color:Black;
vertical-align:top;
text-align:right;

}

rsoReportDiv .rsr1 {

height:100%;
width:100%

}

rsoReportDiv .rsr2 {

height:100%;
width:100%;
overflow:hidden

}

rsoReportDiv .rsr3 {

height:100%

}

rsoReportDiv .rsr4 {

border-style:none

}

rsoReportDiv .rsr5 {

border-left-style:none

}

rsoReportDiv .rsr6 {

border-right-style:none

}

rsoReportDiv .rsr7 {

border-top-style:none

}

rsoReportDiv .rsr8 {

border-bottom-style:none

}

rsoReportDiv .rsr10 {

border-collapse:collapse

}

rsoReportDiv .rsr9 {

border-collapse:collapse;
table-layout:fixed

}

rsoReportDiv .rsr11 {

width:100%;
overflow-x:hidden

}

rsoReportDiv .rsr12 {

position:absolute;
display:none;
background-color:white;
border:1px solid black;

}

rsoReportDiv .rsr13 {

text-decoration:none;
color:black;
cursor:pointer;

}

rsoReportDiv .rsr14 {

font-size:0pt

}

rsoReportDiv .rsr15 {

direction:RTL;
unicode-bidi:embed

}

rsoReportDiv .rsr16 {

margin-top:0pt;
margin-bottom:0pt

}

rsoReportDiv .rsr17 {

height:100%;
width:100%;
display:inline-table

}

rsoReportDiv .rsr18 {

height:100%;
display:inline-table

}

rsoReportDiv * {

 box-sizing: border-box;

}

๋ณด๊ณ ์„œ ์ฐจํŠธ ์š”์†Œ
Report chart
์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฌธ์ œ์˜ ์›์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ..

๋ฟก ๋นต๋€จ

์•ˆ๋…•ํ•˜์„ธ์š” ์—…๋ฐ์ดํŠธ?

@chinturathod :
์ €๋Š” ํ˜„์žฌ CEF-pdf ๋ฅผ wkhtml2X ๋Œ€์ฒดํ’ˆ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ SwissRe Reports์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ผ ๋‚ด์— 2 ์ฃผ๊ฐ€ ๋„˜๊ฒŒ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ดํŽด๋ณผ ์‹œ๊ฐ„์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌ ํ•  ์ˆ˜์žˆ๋Š” AspNetCore.ReportingServices ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ (๊ฐœ์ธ ๋˜๋Š” ๊ธฐํƒ€)๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@clintb : git LAB ๊ณ„์ • ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ repo ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ํฌํ•จ ๋œ git lab ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ์ด๋ฉ”์ผ์„ ๋ฐ›๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…• ์Šคํ…ŒํŒ, ๋‚ด gitLab์€ c_l_i_n_t์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

2019 ๋…„ 4 ์›” 26 ์ผ ๊ธˆ์š”์ผ ์˜คํ›„ 12:18 Stefan Steiger [email protected]
์ผ๋‹ค :

@clintb https://github.com/clintb : git LAB ๊ณ„์ • ์ด๋ฆ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด git lab ์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ์ด๋ฉ”์ผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
repo ์•ก์„ธ์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ณ„์ •.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/aspnet/AspNetCore/issues/1528#issuecomment-487133308 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABURO5ILQUEGMZARNW2HNALPSM2M5ANCNFSM4CFRN7MQ
.

@clintb : ๋‹น์‹ ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @ststeiger , ์›ํ•œ๋‹ค๋ฉด

@lotsatrees : ๋‹น์‹ ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค Stefan, ์–ธ์ œ๋“ ์ง€ ์ข‹์€ ๋งฅ์ฃผ๋ฅผ ์‚ฌ์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @ststeiger , ์ œ gitlab์€ edgardoreyes์ž…๋‹ˆ๋‹ค. ์ •๋ง ๊ณ ๋งˆ์›Œ.

๋ฟก ๋นต๋€จ
๋‚ด gitlab์€ ikourfaln์ž…๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@ikourfaln , @edgardoreyes : ๋‘ ์‚ฌ๋žŒ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. gitlab์— ๋“ฑ๋กํ•œ ๋ฉ”์ผ ๊ณ„์ •์œผ๋กœ ์ด๋ฉ”์ผ์„ ๋ฐ›์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ststeiger , ๋‚˜ ์ž์‹ ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ (gitlab์˜ Mhirji)?

๊ฐ์‚ฌ!!

@Mhirji : ์™„๋ฃŒ.

๊ฐ์‚ฌ!!!

๋ณด๊ณ ์„œ ์„œ๋ฒ„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์–ด๋–ค ํ”„๋กœ์ ํŠธ ์œ ํ˜•์— ๋Œ€ํ•œ ์„œ๋น„์Šค๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
ASP.NET Core ํ”„๋กœ์ ํŠธ๋Š” ๋ณด๊ณ ์„œ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ณด๊ณ ์„œ ์„œ๋น„์Šค์˜ URL ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@ststeiger๋„ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (gitlab์˜ ConstantDisaster) ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@ConstantDisaster : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
@mshwf : ์•„๋‹ˆ์š”, ์‹ค์ œ๋กœ ๊ทธ๊ฒŒ ์ •ํ™•ํžˆ ์ œ๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์ผ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณด๊ณ ์„œ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํ•ญ์ƒ Windows ์ธ์ฆ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ-์–ด๋–ค ์ด์œ ๋กœ IT ๋ถ€์„œ๊ฐ€ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ๊ทธ๋ฃน์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†์Œ). -๋˜ํ•œ ํ•ญ์ƒ ์ œ๊ฑฐ ๋œ ์„œ๋น„์Šค ํŒฉ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด ๋ฒ„์ „์„ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ์‹ถ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  SQL ์„œ๋ฒ„ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ, ReportViewer์™€ ReportServer ๊ฐ„์˜ ๋ถˆ์ผ์น˜ ๋ Œ๋”๋ง, ์šฐ๋ฆฌ์˜ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ ค์„œ ์•„๋ฌด๊ฒƒ๋„ ์„ค์น˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.). ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์—ฌ๊ธฐ ๋ถ์„œ ์œ ๋Ÿฝ์—์„œ ์—ฌ๋ฆ„์˜ ์ฒซ ํ™”์ฐฝํ•œ ๋‚  ์ด๋‹ˆ ๋†“์น˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ststeiger ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋งค์šฐ ๊น๋‹ˆ๋‹ค!)
GitLab repo (mshwf)์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ๋„ ๋ถ€์—ฌํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ

์ด ์š”์ฒญ์„ ์ง€์›ํ•ด์ฃผ์‹ญ์‹œ์˜ค. Microsoft๊ฐ€ ์šฐ๋ฆฌ์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š” @ststeiger ์ €๋„ ์ถ”๊ฐ€ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋‚ด gitlab ์‚ฌ์šฉ์ž ์ด๋ฆ„์€ k3flo์ž…๋‹ˆ๋‹ค.
์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค
Vielen Dank ๐Ÿ˜Š

@ststeiger ์ถ”๊ฐ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ASP ๋„ท ์ฝ”์–ด ํ”„๋กœ์ ํŠธ์—์„œ? ์ฝ์–ด๋ณด๊ธฐ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@ConstantDisaster : AnyWebReporting\Any_TestCode\TestReport.cs ์— "์˜ˆ์ œ"๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€์žˆ๋Š” ๋ณด๊ณ ์„œ๋ฅผ PDF๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ :
1) ๋ณด๊ณ ์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์‚ฌ์ „์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

System.Collections.Generic.Dictionary<string, string> parameters =
                new System.Collections.Generic.Dictionary<string, string>();

2) ๋ณด๊ณ ์„œ์—์žˆ๋Š” ๋ชจ๋“  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์ „์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

parameters.Add("in_language", "DE");
parameters.Add("in_something_uid", "9A892D4B-B4E3-4804-AAB6-97EAB37B7849");

3) ์ƒˆ๋กœ์šด LocalReport ๊ธฐ๋ฐ˜ ์ƒ์„ฑ ๋ฐ ๋ณด๊ณ ์„œ๋กœ๋“œ

string fn = "/full/path/to/SomeReport.rdl";
AspNetCore.Reporting.LocalReport lr = new AspNetCore.Reporting.LocalReport(fn);

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งค๊ฐœ ๋ณ€์ˆ˜์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•ด NULL์ด ์•„๋‹Œ ๋นˆ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
lr.AddDataSource("SEL_Standort", new System.Data.DataTable());

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ์ฑ„์šฐ๊ณ  ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

lr.AddDataSource("DATA_Schluesselbestandeskontrolle", dt);

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณด๊ณ ์„œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋“œ๋ผ์ด๋ธŒ d์™€ ๊ฐ™์€ ์–ด๋”˜๊ฐ€์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var rr = lr.Execute(AspNetCore.Reporting.RenderType.Pdf, 1, parameters, "");
System.IO.File.WriteAllBytes(System.IO.Path.Combine(@"d:\", "Bestandeskontrolle.pdf"), rr.MainStream);

์ดˆ์•ˆ ๋ฒ„์ „์—์žˆ๋Š” ReportViewer 2014 & 2017 ๋ณด๊ณ ์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””์ž์ธ์„ ๋ชจ๋ฐฉ ํ•œ HTML ํŽ˜์ด์ง€ ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. git์—์„œ ๋‹ค์‹œ ๊ฐ€์ ธ ์˜ค๋ฉด ๋‹ค์Œ ์œ„์น˜์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AnyWebReporting\AnyWebReporting\wwwroot
AnyWebReporting/AnyWebReporting/wwwroot/index.htm
AnyWebReporting/AnyWebReporting/wwwroot/index2014.htm
AnyWebReporting/AnyWebReporting/wwwroot/logon.htm

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ.
์›น์— ๋ณด๊ณ ์„œ๋ฅผ ํ‘œ์‹œํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ lr.Execute (RenderType.HTML5_0 ๋˜๋Š” HTML4_0 ๋˜๋Š” Mhtml)์—์„œ ๊ฐ Enum์„ ์ „๋‹ฌํ•˜์—ฌ html๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ (HTML)๋Š” MainStream์— ์žˆ๊ณ  CSS๋Š” SecondaryStream์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ReportViewer์˜ index.htm์„ JavaScript๋กœ lr.Execute์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๋‹น๋ถ„๊ฐ„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์•˜์–ด์š”. ์ง€๊ธˆ์€ ์ด๋ฉ”์ผ์— ์ถ”๊ฐ€ ํ•  PDF๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@ k3flo @mshwf : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@mshwf :

@ststeiger ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋งค์šฐ ๊น๋‹ˆ๋‹ค!)

๋‚ด ์ง€์‹์ด ์•„๋‹ˆ๋ผ๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
.NET Core 3.1 ๋ฆด๋ฆฌ์Šค (LTS) ์ดํ›„ ์— ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .NET Core๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” Windows ์ „์šฉ ReportViewer๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ์ผ์€์ด ํ”„๋กœ์ ํŠธ๋งŒํผ์ด๋‚˜ ๋Œ€๋‹จํ•œ ์ผ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๋ชจ๋“  System.Drawing (๋ฐ GDI +์— ๋Œ€ํ•œ WinAPI ํ˜ธ์ถœ) ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋กœ์Šค ํ”Œ๋žซํผ. ์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๋†€๋ผ๋Š” ๊ฒƒ์ด ๋ถˆํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ธฐ์นจ).

๋ฌธ์ œ๋Š” ๋ณด๊ณ ์„œ์— VB ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ .NET Core (<3)์˜ VB ์ง€์›์€ ํ˜„์žฌ๋กœ์„œ๋Š” ์˜์‹ฌ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ .NET Core 3์— ์˜ํ•ด (= ์ด๋ก ์ ์œผ๋กœ ์ˆ˜์ •๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค) ์ˆ˜์ • ๋  ๊ฒƒ์ด๋ฉฐ, ReportViewer๋ฅผ ๋งŒ๋“ค๋ฉด ์ ์–ด๋„ LTS ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mshwf :
์ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์„ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์ดํ•ด์•ผ ํ•  ์ผ์€ ํ”„๋กœ์ ํŠธ๋ฅผ git-cloneํ•˜๊ณ  ์˜ˆ์ œ ๋ณด๊ณ ์„œ๋ฅผ ๋ณด๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ์‹คํ–‰ํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์—†์Šต๋‹ˆ๋‹ค).

gitlab์— ์ €๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
dcga

@dcga : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, gitlab์— ์ €๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋ณด๊ณ ์„œ๋ฅผ ASP.net Core ํ”„๋กœ์ ํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ ericyu67 : gitlab ๊ณ„์ • ์ด๋ฆ„์ด ericyu๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ์ด ๊ฒฝ์šฐ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ststeiger ์ œ๋ฐœ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
Rodrigorrl

@rodrigorrl : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ststeiger ์ œ๋ฐœ ๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@myersBR : ์™„๋ฃŒ.

@ststeiger ์ œ๋ฐœ ๋‚˜๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@acofalc : @ aco.mit ์ถ”๊ฐ€

์•ˆ๋…•ํ•˜์„ธ์š”, @ststeiger ์ €๋ฅผ ์ถ”๊ฐ€ ํ•ด์ฃผ์„ธ์š” : oblin228, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ASP.NET Core๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์›น ์–‘์‹์œผ๋กœ ๋Œ์•„ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๊ณ  ๋ณด๊ณ ์„œ ์„œ๋ฒ„์—์„œ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ URL์„ ๊ณต๊ธ‰ํ•˜์—ฌ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ง€์†์ ์œผ๋กœ Windows ์ธ์ฆ์„ ์š”๊ตฌํ•˜๋ฉฐ ์ด๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ...

@oblin : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@jfcaldeira : Windows์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ํ•œ gitlab์˜ reportviewer๊ฐ€ ์–ด๋Š ์ •๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (์ง€๊ธˆ๊นŒ์ง€ HTML ์ถœ๋ ฅ์˜ ์ด๋ฏธ์ง€์— ์—ด๋ฆฐ ๋ฌธ์ œ). Linux์—์„œ ์‹คํ–‰ํ•˜๋ฉด PDF, TIFF ๋˜๋Š” PowerPoint๋ฅผ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ (๋‹จ์–ด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•จ) ์ž‘๋™ํ•˜์ง€๋งŒ Excel, html, xml ๋ฐ json๋„ Linux์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด 1-๋ณด๊ณ  ํ…Œ์ŠคํŠธ-์ „์ฒด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํญ๋ฐœํ•˜์ง€ ์•Š๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ SSRS์˜ Windows ์ธ์ฆ ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณด์•ˆ (SSRS ํผ ์ธ์ฆ์ด๋ผ๊ณ ๋„ ํ•จ)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://www.codeproject.com/Articles/675943/SSRS-2012-Forms-Authentication
https://github.com/ststeiger/SSRS-Localizer
https://github.com/ststeiger/CustomHttpHeaders
https://github.com/microsoft/Reporting-Services/tree/master/CustomSecuritySample

์‚ฌ์šฉ์ž๋ฅผ JavaScript์˜ Form-Post๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜๊ณ  SSRS-auth-cookie๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ„ IE์—์„œ ์œ ์ง€๋˜๋„๋กํ•˜๋ ค๋ฉด http ๋ชจ๋“ˆ์„ ํ†ตํ•ด SSRS์—์„œ P3P ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ... (์ฐธ๊ณ  : ๊ฐ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•˜๋‚˜์˜ SSRS์— 2 ๊ฐœ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด์žˆ๋Š” ๊ฒฝ์šฐ application1 [SSRS ๋„๋ฉ”์ธ์—์žˆ๋Š”]์˜ ์ธ์ฆ ์ฟ ํ‚ค๊ฐ€ SSRS ๋„๋ฉ”์ธ์—๋„์žˆ๋Š” application2์˜ ์ธ์ฆ ์ฟ ํ‚ค๋ฅผ ๋ฎ์–ด ์”๋‹ˆ๋‹ค.

@oblin : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@jfcaldeira : Windows์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ํ•œ gitlab์˜ reportviewer๊ฐ€ ์–ด๋Š ์ •๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (์ง€๊ธˆ๊นŒ์ง€ HTML ์ถœ๋ ฅ์˜ ์ด๋ฏธ์ง€์— ์—ด๋ฆฐ ๋ฌธ์ œ). Linux์—์„œ ์‹คํ–‰ํ•˜๋ฉด PDF, TIFF ๋˜๋Š” PowerPoint๋ฅผ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ (๋‹จ์–ด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•จ) ์ž‘๋™ํ•˜์ง€๋งŒ Excel, html, xml ๋ฐ json๋„ Linux์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด 1-๋ณด๊ณ  ํ…Œ์ŠคํŠธ-์ „์ฒด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํญ๋ฐœํ•˜์ง€ ์•Š๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ SSRS์˜ Windows ์ธ์ฆ ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณด์•ˆ (SSRS ํผ ์ธ์ฆ์ด๋ผ๊ณ ๋„ ํ•จ)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://www.codeproject.com/Articles/675943/SSRS-2012-Forms-Authentication
https://github.com/ststeiger/SSRS-Localizer
https://github.com/ststeiger/CustomHttpHeaders
https://github.com/microsoft/Reporting-Services/tree/master/CustomSecuritySample

์‚ฌ์šฉ์ž๋ฅผ JavaScript์˜ Form-Post๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜๊ณ  SSRS-auth-cookie๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ„ IE์—์„œ ์œ ์ง€๋˜๋„๋กํ•˜๋ ค๋ฉด http ๋ชจ๋“ˆ์„ ํ†ตํ•ด SSRS์—์„œ P3P ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ... (์ฐธ๊ณ  : ๊ฐ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•˜๋‚˜์˜ SSRS์— 2 ๊ฐœ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด์žˆ๋Š” ๊ฒฝ์šฐ application1 [SSRS ๋„๋ฉ”์ธ์—์žˆ๋Š”]์˜ ์ธ์ฆ ์ฟ ํ‚ค๊ฐ€ SSRS ๋„๋ฉ”์ธ์—๋„์žˆ๋Š” application2์˜ ์ธ์ฆ ์ฟ ํ‚ค๋ฅผ ๋ฎ์–ด ์”๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‹ต์žฅ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. gitlab์—์„œ์ด reportviewer์— ๋Œ€ํ•ด ๋“ค์–ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์•ต์ปค๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‚˜์š”?

๊ทธ๋ฆฌ๊ณ  Windows ์ธ์ฆ์— ๋Œ€ํ•ด ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ASP.NET Core์˜ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฟ ํ‚ค ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„ ๋ฐ›์•˜์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ ์„œ์— ์•ก์„ธ์Šคํ•˜๋„๋กํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€์žˆ๋Š” ์ง์ ‘ URL์„ ์•ต์ปค์˜ href์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PDF๋ฅผ ํ˜•์‹์œผ๋กœ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ๋‘ ๋ฒˆ ์ธ์ฆํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ๊ท€์ฐฎ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธ์ฆ์„ ์š”์ฒญํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด ํŠน์ • ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, @ststeiger- ์ œ gitlab์€ arunputhran์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฒŒ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋งŽ์€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

"give me access to gitlab"์š”์ฒญ์— ๋ฌป ํ˜”๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ ‘ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ ํ•  .NET Core SSRS์— ํˆฌํ‘œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for -asp-net-core

๊ฐ€์žฅ ๋งŽ์ด ์š”์ฒญ ๋œ SQL Server ๊ธฐ๋Šฅ (https://feedback.azure.com/forums/908035-sql-server?category_id=325159)์—์„œ ์œ„์—์„œ 7 ๋ฒˆ์งธ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ตœ์ƒ์œ„์—์„œ 4 ๋ฒˆ์งธ๋กœ ์ƒ์Šนํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ :์ด ๊ฒŒ์‹œ๋ฌผ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ 3 ์œ„

๊ทธ๋ž˜๋„ ๋„์›€์ด๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...

@arunputhrankyc : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ k290 :
๋ถ„๋ช…ํžˆ ๊ทธ๋“ค์€ SQL-ops-studio / AzureDataStudio์— ๋Œ€ํ•ด ์•„์ง ๋“ค์–ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ •์‹ ์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋†๋‹ด์ฒ˜๋Ÿผ ๊ทธ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ํ‰ํ‰ํ•œ ๋””์ž์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•ˆํƒ€๊น๊ฒŒ๋„ ์•„์ง 4 ์›” 1 ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ๋‚˜๋Š” ์›น API์—์„œ pdf๋กœ ๋ณด๊ณ ์„œ๋ฅผ ์–ป๊ณ  wcf ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
soap / asmx ํ˜ธ์ถœ ๋ฐ http ํ˜ธ์ถœ.
๊ทธ๊ฒƒ๋“ค์„ ํ•  ๋•Œ ๋‚˜๋Š” ์–ด๋–ค ๋ฌธ์ œ์—†์ด credentails๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฝ”๋“œ๋Š” asp.net 4.6 / ์›น API 2์ž…๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ฌด์—‡์„ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ ์ฃผ์— github์— ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ ค์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
๋ณด๊ณ ์„œ ์„œ๋ฒ„ 2016์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ ์ด์ „ ssrs ๋ฆด๋ฆฌ์Šค์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, SSRS๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ์ด ์˜๊ฒฌ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ํ˜•์‹ ํ™•์žฅ์ด ํฌํ•จ ๋œ ๋ณด๊ณ ์„œ์— ์ง์ ‘ URL์ด์žˆ๋Š” ASP.NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ต์ปค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” Windows ์ธ์ฆ์„ ์š”๊ตฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์ฟ ํ‚ค ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์•ฑ์— ๋กœ๊ทธ์ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ์งˆ๋ฌธ์„ ์ค‘์ง€ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณด๊ณ ์„œ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ์—๋Š” ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ์ธ์ฆ์„ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@arunputhrankyc : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ k290 : ์•„๋‡จ,
๋ถ„๋ช…ํžˆ ๊ทธ๋“ค์€ SQL-ops-studio / AzureDataStudio์— ๋Œ€ํ•ด ์•„์ง ๋“ค์–ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ •์‹ ์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋†๋‹ด์ฒ˜๋Ÿผ ๊ทธ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ํ‰ํ‰ํ•œ ๋””์ž์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•ˆํƒ€๊น๊ฒŒ๋„ ์•„์ง 4 ์›” 1 ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค ๐Ÿ˜‰

์Œ ๋‚˜๋Š” SSMS์— ๋Œ€ํ•œ ์–ด๋‘์šด ํ…Œ๋งˆ๋ฅผ ์œ„ํ•ด ์ฃฝ์ผ ๊ฒƒ์ด์ง€๋งŒ SSRS๋ฅผ ์œ„ํ•ด ๋งจ์†์œผ๋กœ ๋จน์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. SQL์—์„œ ์ง์ ‘ ๊ทธ๋ฃนํ™” ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ์ ˆ์•ฝ๋˜๋Š” ์ž‘์—…๋Ÿ‰์€ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. gitlab : @kholossok , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ gitlab์— ์ถ”๊ฐ€ ํ•ด์ฃผ์„ธ์š” : @EMaderbacher

@kholossok , @EMaderbacher : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋„ ์ถ”๊ฐ€ ํ•ด์ฃผ์„ธ์š” @jfcaldeira

@jfcaldeira : git lab ๊ณ„์ •์„ ์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ git ํ—ˆ๋ธŒ ๊ณ„์ •์ž…๋‹ˆ๋‹ค.
๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค. https://gitlab.com
๋‹น์‹œ github์—์„œ๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ๊ฐ€ ๋ฌด๋ฃŒ๊ฐ€ ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ
๊ฐœ์ธ ์ €์žฅ์†Œ๋Š” ์ด์ œ GitHub์—์„œ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋˜๋ฉฐ ๊ณต๋™ ์ž‘์—…์ž ์ˆ˜์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@jfcaldeira : git lab ๊ณ„์ •์„ ์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ git ํ—ˆ๋ธŒ ๊ณ„์ •์ž…๋‹ˆ๋‹ค.
๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค. https://gitlab.com
๋‹น์‹œ github์—์„œ๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ๊ฐ€ ๋ฌด๋ฃŒ๊ฐ€ ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ ๊ณ„์ •์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

@jfcaldeira : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ์ •๋ณด๊ฐ€ ํฌํ•จ ๋œ ์ด๋ฉ”์ผ์„ ๋ฐ›์•˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
@ikourfaln : ์•Œ์•„์š”. ๊ทธ๋ž˜๋„ github private repos์— 3 ๋ช…์˜ ํ˜‘๋ ฅ์ž ์ œํ•œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์•Œ์•„์„œ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌ ํ•ฉ๋‹ˆ๋‹ค.

Gitlab ์ œํ•œ :

์˜ค๋Š˜์˜ ์ข‹์€ ์†Œ์‹์„ ๊ธฐ๋…ํ•˜๊ธฐ ์œ„ํ•ด GitLab.com์˜ ์ €์žฅ์†Œ ๋‹น ์ €์žฅ์†Œ ํ•œ๋„๋ฅผ 5GB์—์„œ 10GB๋กœ ์˜๊ตฌ์ ์œผ๋กœ ๋Š˜ ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ GitLab.com์˜ ๊ณต๊ฐœ ๋ฐ ๋น„๊ณต๊ฐœ ์ €์žฅ์†Œ๋Š” ๋ฌด์ œํ•œ์ด๋ฉฐ ์ „์†ก ์ œํ•œ์ด ์—†์œผ๋ฉฐ ๋ฌด์ œํ•œ ๊ณต๋™ ์ž‘์—…์ž๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋„ ์ถ”๊ฐ€ํ•ด๋„ ๋ ๊นŒ์š”? ๋‚ด GitLab ๊ณ„์ •์€ barryjsilver์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

์ถ”๊ฐ€ํ•ด ์ฃผ ์‹œ๊ฒ ์–ด์š”? @jyanosu ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@BarryJSilver : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@jyanosu : github๊ฐ€ ์•„๋‹Œ git lab .com ๊ณ„์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@ststeiger Whoops, ๊ทธ๋ƒฅ ์„ค์ • ํ•ด์ฃผ์„ธ์š” . ๋™์ผํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„

@jyanosu : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ststeiger ๋‚ด gitlab ๊ณ„์ • @ kanichi123์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@ kanichi123 : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ststeiger ์ œ ๊ณ„์ •๋„ ์ œ๋ฐœ sheryever

@sheryever : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ststeiger ์ œ gitlab ๊ณ„์ • @PentaTech๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@ststeiger ๋„ ์ €๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฟก ๋นต๋€จ
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@PentaTech , @ g-rad : ์ถ”๊ฐ€๋จ.

@ststeiger ์ข‹์€ ๋…ธ๋ ฅ, gitlab ๊ณ„์ • brad0000์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@ brad0000 : ์™„๋ฃŒ.

@ststeiger ๋‹˜ ,

@wyepez : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@ststeiger ์ €๋„ ์ถ”๊ฐ€ํ•ด ์ฃผ ์‹œ๊ฒ ์–ด์š”?

Gitlab ์‚ฌ์šฉ์ž ์ด๋ฆ„ : choudeshell

@choudeshell : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ!

์†”๋ฃจ์…˜์ด .rdlc (๋ฐ ์„œ๋ฒ„ ์ธก .rld)์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ์‚ฌ

์†”๋ฃจ์…˜์ด .rdlc (๋ฐ ์„œ๋ฒ„ ์ธก .rld)์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ์‚ฌ

@mpirritano : ์˜ˆ, ์‚ฌ์‹ค RDL๊ณผ RDLC ์‚ฌ์ด์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์›น ์ „์šฉ์ž…๋‹ˆ๋‹ค. Windows-Forms๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€ํ•˜๋ ค๋ฉด github๊ฐ€ ์•„๋‹Œ git lab ๊ณ„์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@ststeiger ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค-์ง€๊ธˆ GitLab ๊ณ„์ •์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค : @mdpirrit

ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. .NET Core๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” ASP .NET Core์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

@mpirritano : ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. gitlab์„ ๋“ฑ๋ก ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์ด๋ฉ”์ผ ๊ณ„์ •์œผ๋กœ ์ด๋ฉ”์ผ์„ ๋ฐ›์•˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์•Œ์•˜๋‹ค; ๊ฐ์‚ฌ!

@ststeiger ์ฐจํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. -์˜ค๋ฅ˜๊ฐ€์žˆ๋Š” ์ฐจํŠธ ์˜์—ญ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. " ํŒŒ์ผ ๋˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."System.Windows.Forms, ๋ฒ„์ „ = 4.0.0.0 "

์ด๊ฒƒ์€ ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ญ”๊ฐ€ ๋น ์กŒ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ

@ststeiger ๋˜ํ•œ ํ•˜์œ„ ๋ณด๊ณ ์„œ๊ฐ€ ์ง€์›๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜์œ„ ๋ณด๊ณ ์„œ ์ธ์Šคํ„ด์Šค์— ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ•˜์œ„ ๋ณด๊ณ ์„œ ์ฒ˜๋ฆฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ

์ €๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ! ์•ˆ๋…•ํ•˜์„ธ์š”.

์†”๋ฃจ์…˜์ด .rdlc (๋ฐ ์„œ๋ฒ„ ์ธก .rld)์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@mpirritano : ์˜ˆ, RDL๊ณผ RDLC ์‚ฌ์ด์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋„คํŠธ์›Œํฌ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. Windows Forms๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€ํ•˜๋ ค๋ฉด GitHub๊ฐ€ ์•„๋‹Œ Git Lab ๊ณ„์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ €๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์•ˆ๋…•ํ•˜์„ธ์š”.

@azikaa : ์™„๋ฃŒ. ะ”ะพะฑะฐะฒะปะตะฝะพ;)

@mpirritano :

์ด๊ฒƒ์€ ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ญ”๊ฐ€ ๋น ์กŒ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๊ทธ๊ฒƒ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋˜ ํ•œ ๊ฐ€์ง€ ํ•œ๊ณ„์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ HTML์˜ ์ด๋ฏธ์ง€ ์ถœ๋ ฅ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜คํ”ˆ ํฌ์ธํŠธ.
์•„์ง ํ•˜์œ„ ๋ณด๊ณ ์„œ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์Šฌํ”„๊ฒŒ๋„ ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค ์ค‘ ๋ช‡ ๊ฐœ๋„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ๋„ ๋‚ด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋งํ•˜์ž๋ฉด, ์ „์ฒด ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ์ผ๋ฐ˜ ReportViewer์—์„œ ํ•˜์œ„ ๋ณด๊ณ ์„œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹, ํŠนํžˆ ์žฌ๊ท€์ ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€์กฐ์ฐจ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

.NET Core์˜ ํ•ด๋‹น ๋ฒ„์ „์—๋Š” "System.Windows.Forms, Version = 4.0.0.0"์ด ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ReportViewer ๋Œ€์‹  System.NetStandard.Forms๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋”˜๊ฐ€์— ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .NET Core. System.Windows.Forms, Version = 4.0.0.0์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

System.Windows.Forms์˜ ๋ฌธ์ œ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ด๋ฆ„๊ณผ ๋ฒ„์ „ (์†Œ์Šค ์ฝ”๋“œ์— ์ˆจ๊ฒจ์ ธ์žˆ๋Š” ์œ„์น˜์— ๊ด€๊ณ„์—†์ด)์„ ifdef (๋‚ด๊ฐ€ ์ถ”์ธกํ•˜์ง€ ์•Š๋Š” ํ•˜์œ„ ๋ณด๊ณ ์„œ)์— ๋„ฃ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฃผ์—๋„ ๋ณด๊ณ ์„œ ์ „์†ก ์„œ๋น„์Šค๋ฅผ ์™„๋ฃŒํ•ด์•ผํ•˜๋ฏ€๋กœ ๋‹ค์Œ ์ฃผ์— System.Windows.Forms ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์œ„ ๋ณด๊ณ ์„œ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํ•œ : ์–ด์จŒ๋“  ๋‚˜์œ ์ƒ๊ฐ์ด๋ฉฐ PDF ๋ฐ Excel์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฉฐ ๋ณด๊ณ ์„œ๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ธ ๊ฒฝ์šฐ ํ•˜์œ„ ๋ณด๊ณ ์„œ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. , ํ•˜๋‚˜์˜ ๋ณด๊ณ ์„œ์— ํฌํ•จ ๋œ ๋ชจ๋“  ๊ฒƒ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ะ”ะพะฑะฐะฒะปะตะฝะพ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค COR_Basic_SwissLife_UAT๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•?

: rofl : ํ•˜ํ•˜, ์ž˜ ํ–ˆ์–ด. ๊ทธ DB๋Š” ๊ธฐ๋ฐ€์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹  ๋งŒ์˜ ์˜ˆ์ œ ๋ณด๊ณ ์„œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@ststeiger ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ AsNetCore.Reporting.InternalLocalReport์— ์ •์˜ ๋œ SubreportProcessing ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํ•˜์œ„ ๋ณด๊ณ ์„œ ์ธํ…์Šค์— ๋ฐ์ดํ„ฐ ์›๋ณธ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฃผ๊นŒ์ง€ ์ด๊ฒƒ๋„ ๋ชป๋ฐ›์„์ง€๋„ ...

ํ•˜์œ„ ๋ณด๊ณ ์„œ๋„ ํ”ผํ•˜๋ ค๊ณ ํ•˜์ง€๋งŒ ๋ฐ˜๋ณต ์„น์…˜ ๋‚ด์— ๋ฐ˜๋ณต ์„น์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. Excel๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ฐ ํ•˜์œ„ ๋ณด๊ณ ์„œ ์ธ์Šคํ„ด์Šค๋ฅผ rdlc / rdl์„ ์‚ฌ์šฉํ•˜์—ฌ Excel์—์„œ ์›Œํฌ ์‹œํŠธ๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ ๊ทœ ์ด๋ฏผ์ž๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋‹ค์‹œ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋˜๋„๋ก ํˆฌํ‘œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- ํ•ต์‹ฌ

์˜ฌํ•ด 3 ์›”์—๋Š” ์ •์ƒ์—์„œ 7 ์œ„์˜€์Šต๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” SQL Server ์ œ์•ˆ์˜ ์ตœ์ƒ์œ„์—์„œ 2 ์œ„๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค : https://feedback.azure.com/forums/908035-sql-server?category_id=325159

๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์ด๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@ststeiger ์‹ค์ œ๋กœ ์˜ค๋Š˜ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์„

๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ๋กœ "LocalReport"ํด๋ž˜์Šค์˜ "localReport"์†์„ฑ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ˆ˜์ •์ž๋ฅผ "internal"์—์„œ "public"์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ญ์ƒ ํ•˜๋“ฏ์ด "SubreportProcessing"์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ’์„ ํฌํ•จ ๋œ ๋ณด๊ณ ์„œ ์ธ์Šคํ„ด์Šค๋กœ ์ฝ๊ณ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌํ•จ ๋œ ๋ณด๊ณ ์„œ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ ์›๋ณธ์œผ๋กœ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

.NET Core์—์„œ ์ฐจํŠธ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋†€๋ผ์šด ํ•ด๊ฒฐ์ฑ…์— ๋„๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์™ธ์—๋Š” ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๊ฐœ์ธ์ ์œผ๋กœ ๋ณด๊ณ ์„œ๋ฅผ HTML ํ˜•์‹์œผ๋กœ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

๊ฐ์‚ฌ

export- word, excel not woking?
FormatException : ํ—ค๋”์˜ ์ธ๋ฑ์Šค 0์— ์ž˜๋ชป๋œ ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค : ''

์„œ๋น„์Šค๊ฐ€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋„์™€์ฃผ์„ธ์š”....

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” SSRS์— ๋‚ด์žฅ ๋œ ReportExecutionService.asmx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๊ณ ์„œ ๋ทฐ์–ด ์ปจํŠธ๋กค์˜ ์‚ฌ์šฉ์ž ์ง€์ • ํฌํŠธ ์ž‘์„ฑ์„ ๋งˆ์ณค์œผ๋ฉฐ ASP.NET MVC๋ฅผ ๋Œ€์ƒ์œผ๋กœํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ .NetCore & MVC๋กœ ์ด์‹ํ•˜๋„๋ก ์ œ์•ˆ ํ–ˆ์œผ๋ฏ€๋กœ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด๋ณด๊ณ  ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ์•Œ๋ ค์ฃผ์„ธ์š” : https://github.com/alanjuden/MvcReportViewer

์•จ๋Ÿฐ

export- word, excel not woking?
FormatException : ํ—ค๋”์˜ ์ธ๋ฑ์Šค 0์— ์ž˜๋ชป๋œ ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค : ''

์„œ๋น„์Šค๊ฐ€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋„์™€์ฃผ์„ธ์š”....

@azikaa : MvcReportViewer ๋˜๋Š” AspNetCore.ReportViewer๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š”์ด ์ €์žฅ์†Œ์™€ ์ง์ ‘ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ์—ฌ๊ธฐ์—์žˆ๋Š” ์˜๊ฒฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ SSRS ํŒ€์ด์ด ํ”ผ๋“œ๋ฐฑ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋Œ“๊ธ€์˜ ์–‘์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด์ œ๋Š” ๊ด€๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์—†์Šต๋‹ˆ๋‹ค.

@ k290์˜ ๋ฐ˜์‘์€ ๊ทธ๋ ‡๊ฒŒ ์ž์‹ ์˜ ์ œ์•ˆ์„ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค, ์—ฌ๊ธฐ์— ๊ฐ€์žฅ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ•˜๋‚˜ ์—ฌ๊ธฐ :

์‹ ๊ทœ ์ด๋ฏผ์ž๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋‹ค์‹œ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋˜๋„๋ก ํˆฌํ‘œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. https://feedback.azure.com/forums/908035-sql-server/suggestions/33241936-develop-a-ssrs-reportviewer-for-asp-net- ํ•ต์‹ฌ

์˜ฌํ•ด 3 ์›”์—๋Š” ์ •์ƒ์—์„œ 7 ์œ„์˜€์Šต๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” SQL Server ์ œ์•ˆ์˜ ์ตœ์ƒ์œ„์—์„œ 2 ์œ„๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค : https://feedback.azure.com/forums/908035-sql-server?category_id=325159

๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์ด๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰