Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wagner Figueiredo

Impressão de relatório dinâmica.

Recommended Posts

Salve pessoal, seguinte tenho uma dúvida com relação a impressão de formulários. Vamos ver se eu consigo passar pra vocês o que eu quero: na realidade eu tenho uma lista de funcionários que efetuam entregas e retiradas de produtos, tenho também duas listagens, uma de entregas e outra de retiradas, cada uma delas possui seu respectivo funcionário designado para tal (ou entrega ou retirada) pois bem, no meu form eu tenho uma lista que eu seleciono para qual funcionário devo imprimir essas listagens, se fosse só isso, seria beleza, o problema é que para cada funcionário que eu selecionar, preciso que as entregas e retiradas dele sejam listadas em destaque (na parte de cima da página, mas também as dos outros funcionários também, sem destaque. Seria algo mais ou menos assim: teria um vetor com 5 posições {1,3,8,4,26} essas seriam as id´s dos funcionários, automaticamente, teria que imprimir 5 páginas, cada uma com todas as listagens de todos os funcionários, porém a 1º com as listagens do funcionário 1 em destaque em cima da página, a 2º com as listagens do funcionário 3 em destaque no inicio da página, e assim por diante. é meio tenebrosa a coisa. :skull: :skull: :skull: Fiz algo com printDocument, mas não sei se é a melhor pedida. Segue um pedaço do meu código.

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            DataTable tabEntregas = new DataTable();
            DataTable tabRetiradas = new DataTable();
            DataTable listagem = new DataTable();
            DataTable tabRetiradasMod = new DataTable();

            tabEntregas = sys_locacoesBLL.ListarBLL("'Ag.Entrega'", DateTime.Now, DateTime.Now);   //cria um dtb com todas as entregas
            tabRetiradas = sys_locacoesBLL.ListarBLL("'Ag.Retirada'", DateTime.Now, DateTime.Now);
//cria um dtb com todas as retiradas
            string funcionario = tabEntregas.Rows[0]["func_entrega"].ToString();
//pega o id do funcionario (tab entregas)
            listagem = tabEntregas.Clone();   //remove algumas colunas do dtb (para exibição)
            listagem.Columns.Remove("id");
            listagem.Columns.Remove("id_func_entrega");
            listagem.Columns.Remove("func_entrega");
            listagem.Columns.Remove("situacao");
            listagem.Columns.Remove("listagem_retirada");
            listagem.Columns.Remove("veic_entrega");
            listagem.Columns.Remove("registro");
            listagem.Columns.Remove("nome1");
            listagem.Columns.Remove("autorizacao");
            listagem.Columns.Remove("val_autorizacao");
            listagem.Columns.Remove("numero_autorizacao");


            int idFuncionario;

            List<int> listFunc = new List<int>(); //monto uma lista com as id´s dos funcionários listados no form

            for (int k = 0; k < tabelaFuncListagem.Rows.Count; k++)
            {
                if (tabelaFuncListagem.Rows[k]["Listagem"].ToString() == "True")
                {
                    idFuncionario = int.Parse(tabelaFuncListagem.Rows[k]["id"].ToString());
                    listFunc.Add(idFuncionario);
                }
            }
            for (int i = 0; i < listFunc.Count - 1; i++)
            {
                for (int k = 0; k < listFunc.Count - 1; k++)
                {
                    DataRow[] dtrEnt = tabEntregas.Select("id_func_entrega = " + listFunc[k]);
                    //DataRow[] dtrRet = tabRetiradas.Select("id_func_retirada = " + listFunc[k]);
                    foreach (DataRow row in dtrEnt)
                    {
                        listagem.ImportRow(row);
                    }
                    //foreach (DataRow row in dtrRet)
                    //{
                    //    listagem.ImportRow(row);
                    //}
                }
                listFunc = deslocaVetor(listFunc); //esta função faz um deslocamento das posições no vetor com as id´s dos funcionarios
            }
            PrintDocument document = (PrintDocument)sender;
            Graphics g = e.Graphics;

            Brush brush = new SolidBrush(Color.Black);
            Pen pen = new Pen(brush);
            Font font = new Font("Arial", 7);

            float x = 0, y = 0;
            float height = 20;
            List<float> widths = new List<float>();
            g.DrawString(funcionario, font, brush, x, y + 5);//nome do motorista
            y += 20;
            g.DrawString("Entregas", font, brush, x, y + 5);
            y += 20;
            #region cria o vetor com as larguras das colunas
            for (int j = 0; j < listagem.Columns.Count - 1; j++)//aqui percorro todas as colunas para saber qual a maior largura para otimizar o espaço
            {
                for (int i = 0; i < listagem.Rows.Count; i++)  
                {
                    string teste = "";
                    string teste1 = "";
                    teste = listagem.Rows[i][j].ToString();
                    if (j == listagem.Columns["endereco"].Ordinal)
                    {
                        int posIni = teste.IndexOf("Porto");
                        int posFin = teste.IndexOf("RS");
                        teste1 = teste.Substring(0, posIni);
                        teste = teste1 + teste.Substring(posFin + 4);
                    }

                    widths.Add(g.MeasureString(teste, font).Width);
                    if (i < listagem.Rows.Count - 1)
                    {
                        string valor = listagem.Rows[i + 1][j].ToString();
                        float width = widths[i];
                        float nextWidth = g.MeasureString(teste, font).Width;

                        if (widths[i] <= nextWidth)
                        {
                            widths[i] = nextWidth;
                        }
                    }
                }
            }
            #endregion

            for (int i = 0; i < listagem.Columns.Count - 1; i++)//imprimo o cabeçalho das colunas
            {
                g.DrawRectangle(pen, x, y, widths[i], height);
                g.DrawString(listagem.Columns[i].ToString(), font, brush, x, y + 5);
                x += widths[i];
            }
            x = 0;
            y += 20;

            for (int i = 0; i < listagem.Rows.Count; i++)
            {
                for (int j = 0; j < listagem.Columns.Count - 1; j++)
                {
                    string teste = "";
                    string teste1 = "";
                    teste = listagem.Rows[i][j].ToString();
                    if (j == listagem.Columns["endereco"].Ordinal) //trato a string endereço, pois a mesma é grande, tiro algumas infos desnecessárias
                    {
                        int posIni = teste.IndexOf("Porto");
                        int posFin = teste.IndexOf("RS");
                        teste1 = teste.Substring(0, posIni);
                        teste = teste1 + teste.Substring(posFin + 4);
                    }
                    g.DrawRectangle(pen, x, y, widths[j], height);//imprimo a bagaça
                    g.DrawString(teste, font, brush, x, y + 5);
                    x += widths[j];
                }
                x = 0;
                y += 20;
            }
        }

não se se é a melhor coisa a ser feita, se alguém puder me dar uma luz, agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.