Bagaimana kami membuat laporan dinamis di SSRS 2014


Kami sudah berbicara tentang bagaimana kami membantu satu perusahaan manufaktur mengubah proses pelatihan perusahaan dan pengembangan personel. Karyawan pelanggan, yang tenggelam dalam dokumen kertas dan lembar kerja Excel, menerima aplikasi iPad yang nyaman dan portal web. Salah satu fungsi terpenting dari produk ini adalah pembuatan laporan dinamis yang digunakan manajer untuk menilai pekerjaan karyawan β€œdi lapangan”. Ini adalah dokumen besar dengan puluhan bidang dan ukuran rata-rata 3000 * 1600 piksel.

Pada artikel ini, kita akan berbicara tentang bagaimana menggunakan kecantikan ini berdasarkan Layanan Pelaporan Microsoft SQL Server, mengapa backend seperti itu bisa menjadi teman yang buruk dengan portal web dan trik apa yang akan membantu untuk membangun hubungan mereka. Seluruh bagian bisnis dari solusi telah dijelaskan dalam artikel sebelumnya, jadi di sini kami fokus pada masalah teknis. Ayo mulai!


Perumusan masalah


Kami memiliki portal tempat beberapa ratus pengguna bekerja. Mereka diatur dalam hierarki bertahap, di mana setiap pengguna memiliki pengawas peringkat yang lebih tinggi. Diferensiasi hak ini diperlukan agar pengguna dapat membuat acara dengan karyawan bawahan apa pun. Anda dapat melompati langkah, mis. pengguna dapat memulai aktivitas dengan karyawan dari peringkat apa pun yang lebih rendah dari dirinya.

Peristiwa apa yang dimaksudkan di sini? Ini dapat berupa pelatihan, dukungan, atau sertifikasi karyawan perusahaan dagang, yang dilakukan penyelia di suatu titik penjualan. Hasil dari acara tersebut adalah kuesioner yang diisi di iPad dengan peringkat karyawan untuk kualitas dan keterampilan profesional.

Menurut data kuesioner, Anda dapat menyiapkan statistik, misalnya:

  • Berapa banyak acara dengan bawahannya seperti ini yang dilakukan Vasya Ivanov dalam sebulan? Berapa banyak dari mereka yang selesai?
  • Berapa persentase peringkat yang memuaskan? Pertanyaan apa yang paling buruk dijawab oleh pedagang? Manajer mana yang lebih buruk dalam mengambil tes?

Statistik tersebut terdapat dalam Laporan yang dapat dibuat melalui antarmuka web, dalam format XLS, PDF, DOCX, dan dicetak. Semua fungsi ini dirancang untuk para manajer di berbagai tingkatan.

Konten dan desain laporan didefinisikan dalam template , memungkinkan Anda untuk mengatur parameter yang diperlukan. Jika di masa depan pengguna akan membutuhkan jenis laporan baru, sistem memiliki kemampuan untuk membuat template, menentukan parameter yang dapat dimodifikasi dan menambahkan templat ke portal. Semua ini - tanpa mengganggu kode sumber dan proses kerja produk.

Spesifikasi dan Keterbatasan


Portal berjalan pada arsitektur microservice, bagian depan ditulis dalam Angular 5. Sumber daya menggunakan otorisasi JWT, mendukung Google Chrome, Firefox, Microsoft Edge, dan browser IE 11 .

Semua data disimpan di MS SQL Server 2014. SQL Server Reporting Services (SSRS) diinstal di server, pelanggan menggunakannya dan tidak akan menolak. Oleh karena itu batasan paling penting: akses ke SSRS ditutup dari luar, sehingga Anda dapat mengakses antarmuka web dan SOAP hanya dari jaringan lokal melalui otorisasi NTLM.

Beberapa kata tentang SSR
SSRS – , , . docs.microsoft.com, SSRS (API) ( Report Server, - HTTP).

Perhatian, pertanyaannya: bagaimana menyelesaikan tugas tanpa metode manual, dengan sumber daya minimal dan manfaat maksimum bagi pelanggan?

Karena pelanggan memiliki SSR pada server khusus, biarkan SSR melakukan semua pekerjaan kotor menghasilkan dan mengekspor laporan. Maka kita tidak perlu menulis layanan pelaporan sendiri, mengekspor modul ke XLS, PDF, DOCX, HTML, dan API yang sesuai.

Dengan demikian, tugasnya adalah untuk berteman dengan SSRS dengan portal dan memastikan pengoperasian fungsi yang ditentukan dalam tugas. Jadi mari kita melihat daftar skenario ini - seluk-beluk menarik ditemukan di hampir setiap titik.

Struktur solusi


Karena kami sudah memiliki SSR, ada semua alat untuk mengelola template laporan:

  • Server Laporan - bertanggung jawab atas seluruh logika bekerja dengan laporan, penyimpanan, pembuatan, manajemen, dan banyak lagi lainnya.
  • Manajer Laporan - layanan dengan antarmuka web untuk mengelola laporan. Di sini Anda dapat mengunggah templat yang dibuat dalam Alat Data SQL Server ke server, mengonfigurasi hak akses, sumber data dan parameter (termasuk yang dapat diubah saat melaporkan permintaan). Dia dapat menghasilkan laporan tentang template yang diunduh dan mengunggahnya ke berbagai format, termasuk XLS, PDF, DOCX dan HTML.

Total: kami membuat templat dalam Alat Data SQL Server, dengan bantuan Manajer Laporan, kami mengisinya di Server Laporan, kami mengonfigurasi - dan sudah siap. Kami dapat menghasilkan laporan, mengubah parameternya.

Pertanyaan selanjutnya: bagaimana cara meminta pembuatan laporan tentang templat tertentu melalui portal dan mendapatkan hasilnya ke depan untuk output ke UI atau mengunduh dalam format yang diinginkan?

Pelaporan dari SSRS ke portal


Seperti yang kami katakan di atas, SSRS memiliki API sendiri untuk mengakses laporan. Tetapi kami tidak ingin memberikan fungsinya untuk alasan keamanan dan kebersihan digital - kami hanya perlu meminta data dari SSR dalam bentuk yang tepat dan mengirimkan hasilnya kepada pengguna. Manajemen laporan akan ditangani oleh staf pelanggan yang terlatih khusus.

Karena akses ke SSR hanya dari jaringan lokal, pertukaran data antara server dan portal adalah melalui layanan proxy.


Pertukaran data antara portal dan server.

Mari kita lihat cara kerjanya dan mengapa ReportProxy ada di sini.

Jadi, di sisi portal, kami memiliki ReportService, yang diakses portal untuk laporan. Layanan ini memeriksa otorisasi pengguna, tingkat hak-haknya, mengubah data dari SSR ke bentuk yang diinginkan berdasarkan kontrak.

API ReportService hanya berisi 2 metode, yang cukup bagi kami:

  1. GetReports - memberikan pengidentifikasi dan nama semua templat yang dapat diterima pengguna saat ini;
  2. GetReportData (format, params) - memberikan data laporan yang siap pakai dan diekspor dalam format yang ditentukan, dengan serangkaian parameter tertentu.

Sekarang Anda memerlukan 2 metode ini untuk dapat berkomunikasi dengan SSRS dan mengambil data yang diperlukan dari itu dalam bentuk yang tepat. Dari dokumentasi diketahui bahwa kita dapat mengakses server laporan melalui HTTP menggunakan SOAP API. Sepertinya teka-teki itu berkembang ... Tetapi pada kenyataannya, kejutan menunggu kita di sini.

Karena SSRS tertutup bagi dunia luar dan Anda hanya dapat mencapainya melalui otentikasi NTLM, itu tidak tersedia langsung dari portal SOAP. Ada juga keinginan kita sendiri:

  • Berikan akses hanya ke set fungsi yang diperlukan, dan bahkan melarang perubahan;
  • Jika Anda harus beralih ke sistem pelaporan lain, pengeditan di ReportService harus minimal, dan lebih baik tidak diperlukan sama sekali.

Di sinilah ReportProxy membantu kami, yang terletak di mesin yang sama dengan SSRS dan bertanggung jawab atas permintaan proxy dari ReportService ke SSRS. Pemrosesan permintaan adalah sebagai berikut:

  1. layanan menerima permintaan dari ReportService, memeriksa otorisasi JWT;
  2. sesuai dengan metode API, proxy melewati protokol SOAP di SSRS untuk data yang diperlukan, masuk melalui NTLM sepanjang jalan;
  3. Data yang diterima dari SSRS dikirim kembali ke ReportService sebagai tanggapan atas permintaan.

Bahkan, ReportProxy adalah adaptor antara SSRS dan ReportService.
Kontroler adalah sebagai berikut:
[BasicAuthentication]
public class ReportProxyController : ApiController
{
    [HttpGet()]
    public List<ReportItem> Get(string rootPath)
    {
        //  ...
    }

    public HttpResponseMessage Post([FromBody]ReportRequest request)
    {
        //  ...
    }
}

BasicAuthentication :

public class BasicAuthenticationAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var authHeader = actionContext.Request.Headers.Authorization;

        if (authHeader != null)
        {
            var authenticationToken = actionContext.Request.Headers.Authorization.Parameter;
            var tokenFromBase64 = Convert.FromBase64String(authenticationToken);
            var decodedAuthenticationToken = Encoding.UTF8.GetString(tokenFromBase64);
            var usernamePasswordArray = decodedAuthenticationToken.Split(':');
            var userName = usernamePasswordArray[0];
            var password = usernamePasswordArray[1];

            var isValid = userName == BasiAuthConf.Login && password == BasiAuthConf.Password;

            if (isValid)
            {
                var principal = new GenericPrincipal(new GenericIdentity(userName), null);
                Thread.CurrentPrincipal = principal;

                return;
            }
        }

        HandleUnathorized(actionContext);
    }

    private static void HandleUnathorized(HttpActionContext actionContext)
    {
        actionContext.Response = actionContext.Request.CreateResponse(
            HttpStatusCode.Unauthorized
        );

        actionContext.Response.Headers.Add(
            "WWW-Authenticate", "Basic Scheme='Data' location = 'http://localhost:"
        );
    }
}


Akibatnya, prosesnya terlihat seperti ini:

  1. Front mengirimkan permintaan http ke ReportService;
  2. ReportService mengirimkan permintaan http ke ReportProxy;
  3. ReportProxy melalui antarmuka SOAP menerima data dari SSRS dan mengirimkan hasilnya ke ReportService;
  4. ReportService membawa hasilnya sesuai dengan kontrak dan memberikannya kepada klien.

Kami memiliki sistem kerja yang meminta daftar templat yang tersedia, pergi ke SSRS untuk laporan, dan memberikannya ke depan dalam format apa pun yang didukung. Sekarang Anda perlu menampilkan laporan yang dihasilkan di bagian depan sesuai dengan parameter yang ditentukan, beri kesempatan untuk mengunggahnya ke XLS, PDF, file DOCX dan cetak. Mari kita mulai dengan tampilan.

Bekerja dengan Laporan SSR di Portal


Pada pandangan pertama, ini adalah masalah sehari-hari - laporannya hadir dalam format HTML, sehingga kami dapat melakukan apa pun yang kami inginkan dengannya! Kami akan menanamkannya di halaman, mewarnai dengan gaya desain, dan masalahnya ada di topi. Bahkan, ternyata ada cukup jebakan.

Menurut konsep desain, bagian laporan di portal harus terdiri dari dua halaman:

1) daftar templat tempat kami dapat:

  • Lihat statistik kegiatan untuk seluruh portal;
  • lihat semua templat yang tersedia untuk kami;
  • klik pada templat yang diinginkan dan pergi ke pembuat laporan yang sesuai.



2) generator laporan yang memungkinkan kita untuk:

  • mengatur parameter templat dan membuat laporannya;
  • lihat apa yang terjadi sebagai akibatnya;
  • pilih format file output, unduh;
  • cetak laporan dalam bentuk yang mudah dan visual.



Tidak ada masalah khusus dengan halaman pertama, jadi kami tidak akan mempertimbangkannya lebih lanjut. Dan pembuat laporan memaksa kami untuk menyalakan insinyur, sehingga akan lebih mudah bagi orang sungguhan untuk menggunakan semua fungsi pada TK.

Masalah nomor 1. Meja raksasa


Menurut konsep desain, halaman ini harus memiliki area tampilan sehingga pengguna dapat melihat laporannya sebelum mengekspor. Jika laporan tidak sesuai dengan jendela, Anda dapat menggulir secara horizontal dan vertikal. Pada saat yang sama, laporan tipikal dapat mencapai ukuran beberapa layar, yang berarti kita perlu menempelkan blok dengan nama baris dan kolom. Tanpa ini, pengguna harus terus-menerus kembali ke atas tabel untuk mengingat apa artinya sel tertentu. Atau secara umum akan lebih mudah untuk mencetak laporan dan secara konstan menyimpan dedaunan yang diperlukan di depan mata Anda, tetapi kemudian tabel di layar kehilangan artinya.

Secara umum, blok penempel tidak dapat dihindari. Dan SSR 2014 tidak tahu cara memperbaiki baris dan kolom dalam dokumen MHTML - hanya di antarmuka webnya sendiri.

Di sini kita ingat bahwa browser modern mendukung properti lengket CSS , yang hanya menyediakan fungsi yang kita butuhkan. Kami menempatkan posisi: lengket pada blok yang ditandai, tentukan indentasi di sebelah kiri atau di atas (kiri, properti teratas), dan blok akan tetap di tempatnya selama pengguliran horizontal dan vertikal.

Anda perlu menemukan parameter yang dapat menangkap CSS. Nilai sel khusus yang memungkinkan SSRS 2014 untuk menangkapnya di antarmuka web hilang saat mengekspor ke HTML. OK, kami akan menandai mereka sendiri - kami hanya akan mengerti caranya.

Setelah beberapa jam membaca dokumentasi dan diskusi dengan rekan kerja, tampaknya tidak ada pilihan. Dan di sini, berdasarkan semua hukum plot, bidang ToolTip muncul untuk kita, yang memungkinkan kita untuk menentukan tip alat untuk sel. Ternyata itu dilemparkan ke dalam kode HTML yang diekspor dalam atribut tooltip - tepat pada tag yang dimiliki sel kustom di Alat Data Server SQL. Tidak ada pilihan - kami tidak menemukan cara lain untuk menandai sel untuk fiksasi.

Jadi, Anda perlu membuat aturan penandaan dan meneruskan penanda dalam HTML melalui ToolTip. Kemudian, menggunakan JS, kita mengubah atribut tooltip ke kelas CSS di penanda yang ditentukan.

Hanya ada dua cara untuk memperbaiki sel: vertikal (kolom tetap) dan horizontal (baris tetap). Masuk akal untuk menempatkan penanda lain pada sel-sel sudut, yang tetap di tempatnya saat menggulirkan kedua arah - memperbaiki-keduanya.

Langkah selanjutnya adalah melakukan UI. Saat Anda menerima dokumen HTML, Anda perlu menemukan semua elemen HTML dengan spidol di dalamnya, mengenali nilai-nilai, mengatur kelas CSS yang sesuai dan menghapus atribut tooltip sehingga tidak keluar ketika Anda mengarahkan kursor ke sana. Perlu dicatat bahwa markup yang dihasilkan terdiri dari tabel bersarang (tag tabel).

Lihat kode
type FixationType = 'row' | 'column' | 'both';

init(reportHTML: HTMLElement) {
    //    

    // -  
    const rowsFixed: NodeList = reportHTML.querySelectorAll('[title^="RowFixed"]');
    // -  
    const columnFixed: NodeList = reportHTML.querySelectorAll('[title^="ColumnFixed"]');
    // -    
    const bothFixed: NodeList = reportHTML.querySelectorAll('[title^="BothFixed"]');

    this.prepare(rowsFixed, 'row');
    this.prepare(columnFixed, 'column');
    this.prepare(bothFixed, 'both');
}

//    
prepare(nodeList: NodeList, fixingType: FixationType) {
    for (let i = 0; i < nodeList.length; i++) {
        const element: HTMLElement = nodeList[i];
        //   -
        element.classList.add(fixingType + '-fixed');

        element.removeAttribute('title');
        element.removeAttribute('alt'); //   SSRS

        element.parentElement.classList.add(fixingType  + '-fixed-parent');

        //     ,     
        element.style.width = element.getBoundingClientRect().width  + 'px';
        //     ,     
        element.style.height = element.getBoundingClientRect().height  + 'px';

        //  
        this.calculateCellCascadeParams(element, fixingType);
    }
}


Dan ini adalah masalah baru: dengan perilaku berjenjang, ketika beberapa blok bergerak dalam satu arah diperbaiki sekaligus dalam tabel, sel-sel yang berjalan satu demi satu akan berlapis. Pada saat yang sama, tidak jelas berapa banyak setiap blok berikutnya harus mundur - indentasi harus dihitung melalui JavaScript berdasarkan ketinggian blok di depannya. Semua ini berlaku untuk jangkar vertikal dan horizontal.

Skrip koreksi menyelesaikan masalah.
//      
calculateCellCascadeParams(cell: HTMLElement, fixationType: FixationType) {
    const currentTD: HTMLTableCellElement = cell.parentElement;
    const currentCellIndex = currentTD.cellIndex;

    //   
    currentTD.style.left = '';
    currentTD.style.top = '';

    const currentTDStyles = getComputedStyle(currentTD);

    //  
    if (fixationType === 'row' || fixationType === 'both') {
        const parentRow: HTMLTableRowElement = currentTD.parentElement;

        //        
        //    .
        //   ,    .
        let previousRow: HTMLTableRowElement = parentRow;
        let topOffset = 0;

        while (previousRow = previousRow.previousElementSibling) {
            let previousCellIndex = 0;
            let cellIndexBulk = 0;

            for (let i = 0; i < previousRow.cells.length; i++) {
                if (previousRow.cells[i].colSpan > 1) {
                    cellIndexBulk += previousRow.cells[i].colSpan;
                } else {
                    cellIndexBulk += 1;
                }

                if ((cellIndexBulk - 1) >= currentCellIndex) {
                    previousCellIndex = i;
                    break;
                }
            }

            const previousCell = previousRow.cells[previousCellIndex];

            if (previousCell.classList.contains(fixationType + '_fixed_parent')) {
                topOffset += previousCell.getBoundingClientRect().height;
            }
        }

        if (topOffset > 0) {
            if (currentTDStyles.top) {
                topOffset += <any>currentTDStyles.top.replace('px', '') - 0;
            }

            currentTD.style.top = topOffset + 'px';
        }
    }

    //  
    if (fixationType === 'column' || fixationType === 'both') {
        //       
        //     .
        //   ,    .
        let previousCell: HTMLTableCellElement = currentTD;
        let leftOffset = 0;

        while (previousCell = previousCell.previousElementSibling) {
            if (previousCell.classList.contains(fixationType + '_fixed_parent')) {
                leftOffset += previousCell.getBoundingClientRect().width;
            }
        }

        if (leftOffset > 0) {
            if (currentTDStyles.left) {
                leftOffset += <any>currentTDStyles.left.replace('px', '') - 0;
            }

            currentTD.style.left = leftOffset + 'px';
        }
    }
}


Kode memeriksa tag elemen yang ditandai dan menambahkan parameter sel tetap ke nilai indentasi. Dalam kasus baris patuh, tinggi mereka ditambahkan, untuk kolom, lebar mereka.


Contoh laporan dengan garis atas yang lengket.

Akibatnya, prosesnya terlihat seperti ini:

  1. Kami mendapatkan markup dari SSRS dan menempelkannya di tempat yang tepat di DOM;
  2. Kenali spidol;
  3. Sesuaikan parameter untuk perilaku cascading.

Karena perilaku menempel sepenuhnya diimplementasikan melalui CSS, dan JS hanya terlibat dalam persiapan dokumen yang masuk, solusinya bekerja cukup cepat dan tanpa lag.

Sayangnya, untuk IE, sticking block harus dinonaktifkan karena itu tidak mendukung posisi: properti lengket. Sisanya - Safari, Mozilla Firefox dan Chrome - melakukan pekerjaan yang sangat baik.

Berpindah.

Masalah nomor 2. Laporkan Ekspor


Untuk menarik laporan dari sistem, Anda harus (1) mengakses SSR melalui ReportService untuk objek Blob, (2) mendapatkan tautan ke objek melalui antarmuka menggunakan metode window.URL.createObjectURL, (3) meletakkan tautan di tag dan mensimulasikan klik untuk unggah file.

Ini berfungsi di Firefox, Safari, dan di semua versi Chrome kecuali Apple. Agar IE, Edge dan Chrome untuk iOS juga mendukung fungsi ini, saya harus membuang otak saya kembali.

Di IE dan Edge, acara tersebut tidak akan memicu permintaan browser untuk mengunduh file. Browser ini memiliki fitur sedemikian rupa sehingga untuk mensimulasikan klik, konfirmasi pengguna untuk mengunduh diperlukan, serta indikasi yang jelas tentang tindakan lebih lanjut. Solusinya ditemukan di metode window.navigator.msSaveOrOpenBlob (), yang tersedia di IE dan Edge. Dia hanya tahu bagaimana cara meminta izin pengguna untuk operasi dan menjelaskan apa yang harus dilakukan selanjutnya. Jadi, kami menentukan apakah metode window.navigator.msSaveOrOpenBlob ada, dan bertindak sesuai situasinya.

Chrome di iOS tidak memiliki peretasan seperti itu, dan alih-alih laporan, kami hanya memiliki halaman kosong. Berkeliaran di Web, kami menemukan cerita yang sama, menilai di mana di iOS 13 bug ini seharusnya diperbaiki. Sayangnya, kami menulis kembali aplikasi pada masa iOS 12, jadi pada akhirnya kami memutuskan untuk tidak membuang waktu lagi dan hanya mematikan tombol di Chrome untuk iOS.
Sekarang tentang bagaimana proses ekspor akhir ke UI. Ada tombol di komponen laporan sudut yang meluncurkan rantai langkah-langkah:

  • melalui parameter acara, pawang menerima pengidentifikasi format ekspor (misalnya, "PDF");
  • Mengirim permintaan ke ReportService untuk menerima objek-Blob untuk format yang ditentukan;
  • memeriksa apakah browser itu IE atau Edge;
  • ketika jawabannya berasal dari ReportService:
    • jika itu IE atau Edge, ia memanggil window.navigator.msSaveOrOpenBlob (fileStream, fileName);
    • jika tidak, ia memanggil metode this.exportDownload (fileStream, fileName), di mana fileStream adalah Blob yang diperoleh dari permintaan ke ReportService, dan fileName adalah nama file yang akan disimpan. Metode ini membuat tag tersembunyi dengan tautan ke window.URL.createObjectURL (fileStream), mensimulasikan klik dan menghapus tag.

Dengan ini beres, petualangan terakhir tetap ada.

Masalah nomor 3. Cetakan


Sekarang kita dapat melihat laporan di portal dan mengekspornya ke format XLS, PDF, DOCX. Tetap menerapkan pencetakan dokumen untuk mendapatkan laporan multi-halaman yang akurat. Jika tabel ternyata dibagi menjadi beberapa halaman, masing-masing harus berisi judul - blok lengket yang sama yang kita bicarakan di bagian sebelumnya.

Opsi termudah adalah mengambil halaman saat ini dengan laporan yang ditampilkan, menyembunyikan segala sesuatu yang berlebihan menggunakan CSS dan mengirimkannya untuk dicetak menggunakan metode window.print (). Metode ini tidak langsung berfungsi karena beberapa alasan:

  1. Area tampilan non-standar - laporan itu sendiri terdapat di area yang dapat digulir secara terpisah sehingga halaman tidak melebar ke dimensi horizontal yang luar biasa. Menggunakan window.print () memotong konten yang tidak sesuai dengan layar;
  2. , ;
  3. , .

Semua ini dapat diperbaiki menggunakan JS dan CSS, tetapi kami memutuskan untuk menghemat waktu pengembang dan mencari alternatif untuk window.print ().

SSRS dapat segera memberi kami PDF siap pakai dengan pagination yang layak. Ini menyelamatkan kita dari semua kesulitan dari versi sebelumnya, satu-satunya pertanyaan adalah, bisakah kita mencetak PDF melalui browser?

Karena PDF adalah standar pihak ketiga, browser mendukungnya melalui berbagai plugin viewer. Tidak ada plug-in - tidak ada kartun, jadi sekali lagi kita membutuhkan opsi alternatif.

Dan jika Anda meletakkan PDF pada halaman sebagai gambar, dan mengirim halaman ini untuk dicetak? Sudah ada perpustakaan dan komponen untuk Angular yang menyediakan rendering seperti itu. Dicari, dicoba, diimplementasikan.

Agar tidak berurusan dengan data yang tidak ingin kami cetak, diputuskan untuk mentransfer konten yang dirender ke halaman baru, dan sudah ada jalankan window.print (). Akibatnya, seluruh proses adalah sebagai berikut:

  1. Minta ReportService untuk mengekspor laporan dalam format PDF;
  2. Kami mendapatkan objek-Blob, mengonversinya menjadi URL (URL.createObjectURL (fileStream)), memberikan URL ke penampil PDF untuk rendering;
  3. Kami mengambil gambar dari penampil PDF;
  4. Buka halaman baru dan tambahkan sedikit markup di sana (judul, sedikit indentasi);
  5. Tambahkan gambar dari penampil PDF ke markup, panggil window.print ().

Setelah beberapa pemeriksaan, kode JS juga muncul di halaman, yang, sebelum dicetak, memeriksa apakah semua gambar telah dimuat.

Dengan demikian, seluruh tampilan dokumen ditentukan oleh parameter template SSRS, dan UI tidak mengganggu proses ini. Ini mengurangi jumlah kemungkinan bug. Karena gambar sedang ditransfer untuk dicetak, kami diasuransikan terhadap kerusakan atau deformasi tata letak.

Ada juga kelemahannya:

  • laporan besar akan banyak menimbang, yang akan berdampak buruk pada platform seluler;
  • desain tidak diperbarui secara otomatis - warna, font dan elemen desain lainnya harus diinstal pada tingkat templat.

Dalam kasus kami, penambahan templat baru yang sering tidak diharapkan, sehingga solusinya dapat diterima. Performa seluler telah diterima begitu saja.

Kata terakhir


Ini adalah bagaimana proyek reguler sekali lagi membuat kami mencari solusi sederhana untuk tugas-tugas non-sepele. Produk akhir sepenuhnya memenuhi persyaratan desain dan terlihat cantik. Dan yang paling penting, meskipun kami tidak harus mencari metode implementasi yang paling jelas, tugas itu diselesaikan lebih cepat daripada jika kami mengambil modul laporan asli dengan semua konsekuensinya. Dan pada akhirnya, kami dapat fokus pada tujuan bisnis proyek.

Source: https://habr.com/ru/post/undefined/


All Articles