Usuário com melhor resposta
Imprimir pedido de Venda em Asp net com Crystal Reports

Pergunta
-
Olá pessoal..
Utilizo o VS 2008 com Asp Net, e tenho uma tela de pedido de venda e preciso imprimir esse pedido através de um botãzinho de imprimir na tela do pedido . Pesquisei sobre o assunto e pelo que vi a ferramenta mais interessante para isso seria o Crystal Reports. Alguém poderia me dar um auxílio de como começo isso, ou me indicar algum material que me ajude, pois os que eu encontrei não me ajudaram muito e a maioria utiliza uma conexão direta ao banco local, que não é o meu caso. No sistema tem uma arquivinho de conexão que é o que vai conectar bo BD.
Desde já agradeço.
Nessa- Movido AndreAlvesLimaModerator segunda-feira, 2 de agosto de 2010 19:58 (De:.NET Development - Geral)
Respostas
-
Ola
Bom... o crystal nunca foi muito bom nisso, mas vamos lá
1: configure a pagina para A5 paisagem (que é um A4 pela metade)
2: para multiplas colunas, olhe a ultima opçao do Section Expert (clique com o botao direito sobre o relatorio ou va no menu crystalreports>Report... olhe a ultima opcao (format with multiple columns) depois que vc marca essa opçao aparece uma aba layout. ali vc define a largura da coluna.
So uma questao, as quantidade sao fixas? digo, serao sempre 10 itens?
E o mesmos itens devem aparecer na segunda parte?
Se for isso eu vejo que a saida vai ser usar sub-report...
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com)- Marcado como Resposta Vanessa T. Eufrásio quinta-feira, 12 de agosto de 2010 13:43
-
Povo enfim cheguei a uma solução do meu problema do pedido de venda. Acabei não utilizando as duas colunas conforme eu queria, mas segue abaixo o código para o meu pedido de venda. Está imprimindo certinho. Serviu pra mim espero que sirva pra alguem.
Abraço a todos e obrigada pela ajuda William.
Imports Model_Layer Imports Business_Layer Imports System.Data Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared Imports Data_Layer Imports System.Data.SqlClient Partial Class PedidoVenda_Impressao Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'Dim bl As New EstoqueBL Dim crReportDocument As New ReportDocument Dim crSubReportDocument As New ReportDocument Dim sqlPar As SqlParameter, colPar As New Collection Dim strSQL As New StringBuilder, sqlReader As SqlDataReader Dim tb As New DataTable, row As System.Data.DataRow Dim idColumn As DataColumn = New DataColumn() Dim mlItens As Pedido_Venda_ItemRelML, clItens As Pedido_Venda_ItensRelML Dim bl_item As New Pedido_Venda_ItemBL Dim ml As Pedido_VendaRelML, bl As New Pedido_VendaBL Dim Func As New FuncoesCalculo Dim tbx As New DataTable <br/> Dim tbTemp As New DataTable Dim NumPed As String = Page.Request.QueryString("Num_Ped") Dim strPathreport As String = Server.MapPath("Relatorios\PedidoVenda.rpt") <br/> Dim Emp As String = Session("empresa") Dim PercDesconto As Double crReportDocument.Load(strPathreport) '--------Pega valor SubTotal dos Itens com o Desconto strSQL.Append("SELECT Per_Desconto from Pedido_Venda").AppendLine() strSQL.Append("WHERE Num_Pedido=" + NumPed.ToString).AppendLine() strSQL.Append(" and Empresa=" + Emp.ToString).AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) If sqlReader.Read Then PercDesconto = sqlReader("Per_Desconto") 'tbTemp.Load(sqlReader) sqlReader.Close() '-----------Cria Tabela para Itens do Pedido idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Int32") idColumn.ColumnName = "Num_Pedido" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "ID_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Qnt_Solicitada" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Preco_Venda" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Descr_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Int32") idColumn.ColumnName = "Sequencia" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "SubTotal_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Unid_Venda" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "COD_ITEM_FORNECEDOR" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "CodBarra" tb.Columns.Add(idColumn) '---------- Carrega os Itens do Pedido clItens = bl_item.CarregarItensPedido(Emp, NumPed) ml = bl.VerificarTotalPedido(Emp, NumPed) Dim ICMSST As Double = 0 Dim SubtotalDesconto As Double ' Dim SubTotDesc As Double For cont As Integer = 0 To clItens.Count - 1 mlItens = clItens(cont) row = tb.NewRow() row("Num_Pedido") = NumPed row("ID_Item") = mlItens.ID_Item row("Preco_Venda") = mlItens.Preco_Venda.ToString("#,###,##0.00") row("Qnt_Solicitada") = mlItens.Qnt_Solicitada row("Descr_Item") = mlItens.Descr_Item row("Unid_Venda") = mlItens.Unid_Venda row("COD_ITEM_FORNECEDOR") = mlItens.COD_ITEM_FORNECEDOR row("CodBarra") = mlItens.Cod_Barra SubtotalDesconto = mlItens.Qnt_Solicitada * mlItens.Preco_Venda row("SubTotal_Item") = SubtotalDesconto * (1 - (PercDesconto / 100)) ICMSST = ICMSST + Func.ICMS_ST(mlItens.Empresa, mlItens.ID_Item, row("SubTotal_Item"), ml.ID_Participante) tb.Rows.Add(row) Next 'Criar o Cabeçalho '3 passo: definir o DataSource do relatório 'Obtém dados do cabeçalho do pedido sqlPar = New SqlParameter sqlPar.DbType = DbType.Int32 sqlPar.Value = NumPed sqlPar.ParameterName = "@Num_Pedido" colPar.Add(sqlPar) sqlPar = New SqlParameter sqlPar.DbType = DbType.Int32 sqlPar.Value = Emp sqlPar.ParameterName = "@Empresa" colPar.Add(sqlPar) strSQL = New StringBuilder strSQL.Append("SELECT PV.Empresa, PV.Codigo, PV.Num_Pedido, PV.ID_Participante, Part.Nome as Nome_Participante, PV.Data_Emissao, Cnd_Pgto_Venda.Descricao AS Cnd_Pgto, ").AppendLine() strSQL.Append("PV.Per_Desconto, PV.VL_Desconto, PV.Texto, PV.Per_Desconto_Comissao, PV.VL_Desconto_Comissao, PV.Data_Registro, PV.Usuario_Registro, ").AppendLine() strSQL.Append("PV.Status, PV.ID_Nota_Fiscal, Vendedor.Nome AS Vendedor, Part.Fantasia, Part.Endereco, Part.Cep, Cidade_IBGE.Nome AS Cidade, Part.Num, ").AppendLine() strSQL.Append("Part.FoneFix, Cidade_IBGE.UF,Part.CNPJ, Part.IE, Part.CPF, ").AppendLine() strSQL.Append("CASE Part.CRT WHEN 1 THEN 'Simples Nacional' WHEN 2 then 'Simples Nacional – Excesso de Sublimite de Receita Bruta' WHEN 3 then 'Regime Normal' END as CRT").AppendLine() strSQL.Append("FROM Pedido_Venda AS PV ").AppendLine() strSQL.Append("left outer join empresa on PV.empresa=empresa.codigo").AppendLine() strSQL.Append("LEFT OUTER JOIN Participante AS Part ON PV.ID_Participante = Part.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cnd_Pgto_Venda ON PV.ID_Cnd_Pgto_Venda = Cnd_Pgto_Venda.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Vendedor ON PV.Vendedor = Vendedor.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cidade_IBGE ON Part.Cod_Mun = Cidade_IBGE.Codigo").AppendLine() strSQL.Append("WHERE PV.Num_Pedido=@Num_Pedido and PV.Empresa=@Empresa").AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) tbx.Load(sqlReader) sqlReader.Close() '--------------- Calcula Valor de ICMS ST idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Vl_ICMS_ST" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Vl_Desconto" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Vl_Total_Geral" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Mensagem" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Perc_Desconto" tbx.Columns.Add(idColumn) '------------- Cacula Total Pedido row = tbx.Rows(0) row("Vl_ICMS_ST") = ICMSST row("VL_Desconto") = ml.Vl_Desconto row("Vl_Total_Geral") = ml.Total.ToString("#,###,##0.00") + ICMSST row("Perc_Desconto") = PercDesconto '-------------- Carrega Mensagem Vidros Dim cl As New Pedido_Venda_ItensML cl = bl_item.VerificaPedidoItemVidro(Emp, NumPed) If cl.Count <> 0 Then row("Mensagem") = "OBS: NAO TROCAMOS A LINHA DE VIDROS, PORCELANA E PINTADOS. FAVOR CONFERIR" End If idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Descr_Negocio" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Dt_Cadastro" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "EmpresaNome" tbx.Columns.Add(idColumn) '-------------- Carrega Descrição do Negócio - Participantes strSQL = New StringBuilder strSQL.Append(" SELECT Pedido_Venda.Num_Pedido, Empresa.Fantasia, Participante.Descr_Negocio, Participante.Dt_Cadastro, ISNULL(Cnd_Pgto_Venda.Banco,0) as Banco ").AppendLine() 'ISNULL(Cnd_Pgto_Venda.Banco,0) strSQL.Append("FROM Pedido_Venda LEFT OUTER JOIN").AppendLine() strSQL.Append(" Empresa ON Pedido_Venda.Empresa = Empresa.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Participante ON Pedido_Venda.ID_Participante = Participante.Codigo").AppendLine() strSQL.Append("LEFT OUTER JOIN Cnd_Pgto_Venda ON Pedido_Venda.ID_Cnd_Pgto_Venda = Cnd_Pgto_Venda.Codigo").AppendLine() strSQL.Append("WHERE Pedido_Venda.Num_Pedido =@Num_Pedido and pedido_venda.empresa=@Empresa").AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) Dim banco As Boolean If sqlReader.Read Then banco = sqlReader("Banco") If ml.Total > 1000 Or banco = True Then row = tbx.Rows(0) row("Descr_Negocio") = sqlReader("Descr_Negocio") row("Dt_Cadastro") = "Data Cadastro: " + sqlReader("Dt_Cadastro") row("EmpresaNome") = sqlReader("Fantasia") End If sqlReader.Close() crReportDocument.Database.Tables(0).SetDataSource(tb) crReportDocument.Database.Tables(1).SetDataSource(tbx) '4 passo: visualizar o relatório Imprimir_Pedido.DisplayGroupTree = False Imprimir_Pedido.HasCrystalLogo = False Imprimir_Pedido.ReportSource = crReportDocument End Sub End Class
Nessa- Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 4 de outubro de 2010 12:00
Todas as Respostas
-
Oi Vanessa
Projetinho bobo que fiz e vai te ajudar
Mas basicamente vc tem que :
1- Criar um XSD que vai servir de mascara de dados para o Crystal
2- Crie um Dataset que seja do mesmo formato do XSD
3- Utilize o dataset como fonte de dados do crystal
Aqui esta um outro projeto
e mais um
http://www.beansoftware.com/asp.net-tutorials/using-crystal-reports.aspx
Mas eu daria uma olhada no ReportViewer (é o substituto do Crystal feito pela Microsoft)
http://www.codeproject.com/KB/webforms/ReportViewer.aspx
e
eu acho melhor que o crystal por nao precisar distribuir nenhuma DLL extra, o que no crystal sempre foi (e sempre será) uma dor de cabeça adicional... Lembre-se do VB6
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com)- Sugerido como Resposta AndreAlvesLimaModerator segunda-feira, 2 de agosto de 2010 20:02
-
Oi William, pois é eu estudei sobre o Report Viewer também, até fiz uns testes e tals, mas tive um pouco de dificuldades com ele em questão de formatação e tals.. Mas vou dar mais uma olhada, quem sabe agora eu me entenda com ele =D
Muito obrigado pelas dicas, vou dar uma lida e ver o que faço aqui.
Abraço.
Nessa -
Prezado(a),
Estou migrando seu post para o fórum de Geração de Relatórios.
Por favor, das próximas vezes que for postar alguma dúvida referente a esse assunto, poste por lá.
Obrigado.
André Alves de Lima
Visite o meu site: http://andrealveslima.spaces.live.com
Me siga no Twitter: @andrealveslima -
Olá William, eu fiz uns testes pra ver se dava certo.. Abaixo está a página em aspx que joga os resultados para o relatório. O cabeçalho já está imprimindo certinho.
Imports Model_Layer Imports Business_Layer Imports System.Data Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared Imports Data_Layer Imports System.Data.SqlClient Partial Class PedidoVenda_Impressao Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'Dim bl As New EstoqueBL Dim crReportDocument As New ReportDocument Dim sqlPar As New SqlParameter, colPar As New Collection Dim strSQL As New StringBuilder, sqlReader As SqlDataReader Dim tb = New DataTable Dim strPathreport As String = Server.MapPath("Relatorios\PedidoVenda.rpt") crReportDocument.Load(strPathreport) '3 passo: definir o DataSource do relatório sqlPar.DbType = DbType.Int32 sqlPar.Value = strNumPed sqlPar.ParameterName = "@Num_Pedido" colPar.Add(sqlPar) strSQL.Append("SELECT PV.Empresa, PV.Codigo, PV.Num_Pedido, PV.ID_Participante, Part.Nome as Nome_Participante, PV.Data_Emissao, Cnd_Pgto_Venda.Descricao AS Cnd_Pgto, ").AppendLine() strSQL.Append("PV.Per_Desconto, PV.VL_Desconto, PV.Texto, PV.Per_Desconto_Comissao, PV.VL_Desconto_Comissao, PV.Data_Registro, PV.Usuario_Registro, ").AppendLine() strSQL.Append("PV.Status, PV.ID_Nota_Fiscal, Vendedor.Nome AS Vendedor, Part.Fantasia, Part.Endereco, Part.Cep, Cidade_IBGE.Nome AS Cidade, Part.Num, ").AppendLine() strSQL.Append("Part.FoneFix, Cidade_IBGE.UF,Part.CNPJ, Part.IE, Part.CPF").AppendLine() strSQL.Append("FROM Pedido_Venda AS PV LEFT OUTER JOIN").AppendLine() strSQL.Append("Participante AS Part ON PV.ID_Participante = Part.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cnd_Pgto_Venda ON PV.ID_Cnd_Pgto_Venda = Cnd_Pgto_Venda.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Vendedor ON PV.Vendedor = Vendedor.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cidade_IBGE ON Part.Cod_Mun = Cidade_IBGE.Codigo").AppendLine() strSQL.Append("WHERE PV.Num_Pedido=@Num_Pedido").AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) tb.Load(sqlReader) crReportDocument.SetDataSource(tb) sqlReader.Close() '4 passo: visualizar o relatório Imprimir_Pedido.DisplayGroupTree = False Imprimir_Pedido.HasCrystalLogo = False Imprimir_Pedido.ReportSource = crReportDocument End Sub End Class
Bom ainda tenho umas dúvidas.
1º Esse sql que fiz traz apenas a parte do cabeçalho do pedido. Entretanto para a parte dos itens eu gostaria de fazer em outro sql separado já que possue umas particularidades. Por exemplo, neste pedido temos os itens normais e os item que consideramos como "kit". O kit tem um valor fixo ex(R$ 1,20) e na tabela do pedido tem um campo chamado kit que retorna true or false. Estes itens que são considerados kit's tem que estarem agrupados e separados dos demais. Pergunta: como posso fazer um outro sql para trazer os itens do kit ali nesta página aspx e jogar no mesmo relatório. E eu teria ainda como fazer um terceiro sql para trazer os itens normais?
2º Nesta página apsx ao invés de eu jogar o conteúdo inteiro do retorno do select sql no relatório eu tenho como escolher o que vai em cada campo do relatório como no Crystal para VB 6?
EX: Call SUBSTITUICAO_CARACTERES_NO_CONTROLE_TX(Me, Me.tx_IMPRESSAO, "<<NOME>>", str_NOME)
3º Tem a possibilidade de ao invés de eu fazer um select do banco eu trazer os dados direto da tela do pedido? Se tiver como posso passar o conteúdo por parametro?
Muito obrigada pela ajuda!Abraço.
Nessa -
Olá
Bom.. Seguinte, o crystal tem como base de dados um DataSet (que é uma coleçao de tabelas e relacionamentos). esse dataset pode ser criado e preenchido de varias formas. voce pode por exemplo criar uma tabela em tempo de execuçao (com o resultado de um calculo por exemplo) sem a necessidade de ter uma conexao com um banco de dados e no mesmo dataset outra tabela que vem de um banco. Tudo isso resulta em um dataset unico.
O que vc tem que fazer é criar um XSD (dataset schema) que sirva de mascara para o crystal (sem dados) e depois associar um dataset populado, que o crystal se encarrega de preencher as lacunas.
Mas atençao:
>>EX: Call SUBSTITUICAO_CARACTERES_NO_CONTROLE_TX(Me, Me.tx_IMPRESSAO, "<<NOME>>", str_NOME)
Nao era assim que funcionava no VB6, isso foi um metodo criado para substituiçao em documentos formatos richtext (eu sei, porque fui eu que criei isso em milnovecentos e bolinas hehe)
O crystal para VB6 possui um compotamento parecido com o crystal para .NEt, exceto que ele possuia um Dataset propietario.
>3º Tem a possibilidade de ao invés de eu fazer um select do banco eu trazer os dados direto da tela do pedido? Se tiver como posso passar o conteúdo por parametro?
como eu te disse: o coraçao da coisa é um dataset, e nao importa como ele é populado. Voce pode mesclar dados vindo de um banco, com dados vindos de um arquivo mais tela.. tudo resulta em um dataset.
Exemplo de um relatorio crystal que nao usa banco:
http://vb.net-informations.com/crystal-report/vb.net_crystal_report_without_database.htm
e um que usa
http://www.codeproject.com/KB/cs/CreatingCrystalReports.aspx
Note que o que diferencia é a forma que o dataset é criado, pois para o crystal o que importa é:
exemplo que usa BD:
myDataReport myDataReport = new myDataReport(); // set the data source of the report myDataReport.SetDataSource(dataReport); // set the report source of the created “crystalReportViewer” // component to the created report crystalReportViewer1.ReportSource = myDataReport;
ex. que nao usa banco de dados
Dim objRpt As New CrystalReport1 objRpt.SetDataSource(ds.Tables(1)) CrystalReportViewer1.ReportSource = objRpt
note que os dois usam o metodo SetDataSourceAtt
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com) -
William, o pedido tá saindo.. Meio maluco, mas tá saindo...
Naquela versão do Crystal que vem junto com o VS 2008 sabe como faço para que o details fique em 2 colunas? E também preciso que o pedido seja cortado na metade e comece novamente + ou - menos assim:****Início do pedido
NomedoCliente NumdoPedido Data
Endereco Cidade Estado
Vendedor
CodItem Item1 Qnt Valor Subtotal CodItem Item7 Qnt Valor Subtotal
CodItem Item2 Qnt Valor Subtotal CodItem Item8 Qnt Valor Subtotal
CodItem Item4 Qnt Valor Subtotal CodItem Item9 Qnt Valor Subtotal
CodItem Item5 Qnt Valor Subtotal CodItem Item10 Qnt Valor Subtotal
CodItem Item6 Qnt Valor Subtotal CodItem Item11 Qnt Valor Subtotal
****Quebra de páginaNomedoCliente NumdoPedido Data
Endereco Cidade Estado
Vendedor
CodItem Item1 Qnt Valor Subtotal CodItem Item7 Qnt Valor Subtotal
CodItem Item2 Qnt Valor Subtotal CodItem Item8 Qnt Valor Subtotal
CodItem Item4 Qnt Valor Subtotal CodItem Item9 Qnt Valor Subtotal
CodItem Item5 Qnt Valor Subtotal CodItem Item10 Qnt Valor Subtotal
CodItem Item6 Qnt Valor Subtotal CodItem Item11 Qnt Valor Subtotal
Sub Total = R$ xxxx,xx Total = R$ xxxx,xx
****Fim
Tipo o cliente irá imprimir o pedido e cortará a folha no meio entende..Assim que a impressão do pedido ficar bom eu posto aqui..
Valew
Nessa -
-
Ola
Bom... o crystal nunca foi muito bom nisso, mas vamos lá
1: configure a pagina para A5 paisagem (que é um A4 pela metade)
2: para multiplas colunas, olhe a ultima opçao do Section Expert (clique com o botao direito sobre o relatorio ou va no menu crystalreports>Report... olhe a ultima opcao (format with multiple columns) depois que vc marca essa opçao aparece uma aba layout. ali vc define a largura da coluna.
So uma questao, as quantidade sao fixas? digo, serao sempre 10 itens?
E o mesmos itens devem aparecer na segunda parte?
Se for isso eu vejo que a saida vai ser usar sub-report...
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com)- Marcado como Resposta Vanessa T. Eufrásio quinta-feira, 12 de agosto de 2010 13:43
-
Oi garoto..
A quantidade não é fixa, varia de acordo com o pedido. Mas tem mais um porém nesta impressão..
Fiz a impressão com 2 Detaisl (a e b).. entretanto somente o detaisl a é que utilizará as duas colunas, o B será com a página inteira..
Os itens do details a representam itens de kit - que possuem um valor fixo e o Details b são os itens normais entende..?
O que consegui fazer até agora está asism:
E ele deverá ficar +- assim:
Eles vão imprimir em folha A5 e cortam ela no meio.. por isso tem que ter a quebra d epágina..
Como vou ter que utilizar colunas em apenas um dos details será melhor eu utilizar subreports?
Obrigada pela ajuda.
Nessa -
"Qui salada!!!!"
Eu acho que só com sub-reports mesmo. De uma olhada em um antigo relatorio de caixa do sistema da igreja.. a saida é por lá.
Eu começo a achar que o Crystal nao é a ferramenta mais adequada nesse caso.
Comece a verificar com o Celso sobre a possibilidade de criar diretamente em PDF.
Veja esse projeto:
http://www.codeproject.com/KB/aspnet/Creating_PDF_documents_in.aspx
ele usa uma biblioteca gratuita chama ITextSharp. com ele vc cria um PDF direto
Vantagens: é mais flexivel do ponto de vista de controle sobre o que será impresso. Cria um pdf que pode ser visualizado antes de imprimir. Pode ter formataçao diferente de páginas(pois cada pagina é criada individualmente). É pdf, formato que pode ser guardado e enviado por email.
Desvantagens: a criaçao do documento é feita via código e nao visualmente (arrastando controles p.ex.). Caso seja necessário alterar o layout, tem que compilar um novo app.
Talvez para resolver isso essa abordagem seja a adequada. Eu sei que o pessoal isso para a geraçao de boletos. talvez seja a saida para esse caso.
O desenvolvimento é parecido com o de criar uma pagina HTML via código.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com) -
-
Olhe esse site (só nao fique cega olhando muito tempo pra ele)
http://www.balaraco.com/robyn/?p=8
Apesar do layout da pagina ser meio estranho o exemplo é muito bom
E existe essa posibilidade tambem
http://www.codeproject.com/KB/vb/CompleteFormFieldsOfPDFs.aspx
Envolve criar um PDF com o Adobe PDF Creator (e com os campos a preencher) e preenche-los via ITextSharp
com isso vc pode criar o PDF visualmente. pode ser uma opçao interessante.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com) -
E por ultimo acabei de ver isso
http://www.pdfsharp.net/wiki/Invoice-sample.ashx
ele usa um outro componente grauito chamado MigraDoc. Parece ser mais amigavel que Itextsharp
So vendo e exemplo mesmo. Mas note que é um pedido, menos complexo que o seu, mas pode ser facilmente alterado
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
SOGI INFORMATIQUE LTÉE (http://www.sogi.com) -
-
Oi William, estou tentando concluir o relatório e acho que só vou conseguir fazer o esquema dos itens de kit em colunas através do subreport.. Mas estou tendo dificuldades em carrega-lo.
Muito Obrigada!
Para carregar o subreport tenho que fazer uma nova páginas aspx para ela? Ou posso carrega-lo na mesma página que carrega o relatório principal?
O meu código hoje está assim, está funcioanndo certinho.
Criei ali uma nova Datatable para o kit(Dim tbKit As New DataTable), defini um novo caminho para o subreport (Dim strPathreport1 As String = Server.MapPath("Relatorios\PedidoVendaKit.rpt"). Depois carreguei os itens do kit em uma tabela respectiva (tbKit.Rows.Add(row)) e por fim eu dei o comando para carregar o subreport (crReportDocument.SetDataSource(tbKit)).
Estou muito longe de chegar a forma correta de carregar o subreport?
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'Dim bl As New EstoqueBL Dim crReportDocument As New ReportDocument Dim sqlPar As SqlParameter, colPar As New Collection Dim strSQL As New StringBuilder, sqlReader As SqlDataReader Dim tb As New DataTable, row As System.Data.DataRow Dim tbKit As New DataTable Dim idColumn As DataColumn = New DataColumn() Dim mlItens As Pedido_Venda_ItemRelML, clItens As Pedido_Venda_ItensRelML Dim bl_item As New Pedido_Venda_ItemBL Dim NumPed As String = Page.Request.QueryString("Num_Ped") Dim strPathreport As String = Server.MapPath("Relatorios\PedidoVenda.rpt") ' Dim strPathreport1 As String = Server.MapPath("Relatorios\PedidoVendaKit.rpt") Dim Emp As String = Session("empresa") crReportDocument.Load(strPathreport) crReportDocument.Load(strPathreport1) '3 passo: definir o DataSource do relatório 'Obtém dados do cabeçalho do pedido sqlPar = New SqlParameter sqlPar.DbType = DbType.Int32 sqlPar.Value = NumPed sqlPar.ParameterName = "@Num_Pedido" colPar.Add(sqlPar) sqlPar = New SqlParameter sqlPar.DbType = DbType.Int32 sqlPar.Value = Emp sqlPar.ParameterName = "@Empresa" colPar.Add(sqlPar) strSQL.Append("SELECT PV.Empresa, PV.Codigo, PV.Num_Pedido, PV.ID_Participante, Part.Nome as Nome_Participante, PV.Data_Emissao, Cnd_Pgto_Venda.Descricao AS Cnd_Pgto, ").AppendLine() strSQL.Append("PV.Per_Desconto, PV.VL_Desconto, PV.Texto, PV.Per_Desconto_Comissao, PV.VL_Desconto_Comissao, PV.Data_Registro, PV.Usuario_Registro, ").AppendLine() strSQL.Append("PV.Status, PV.ID_Nota_Fiscal, Vendedor.Nome AS Vendedor, Part.Fantasia, Part.Endereco, Part.Cep, Cidade_IBGE.Nome AS Cidade, Part.Num, ").AppendLine() strSQL.Append("Part.FoneFix, Cidade_IBGE.UF,Part.CNPJ, Part.IE, Part.CPF").AppendLine() strSQL.Append("FROM Pedido_Venda AS PV ").AppendLine() strSQL.Append("LEFT OUTER JOIN Participante AS Part ON PV.ID_Participante = Part.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cnd_Pgto_Venda ON PV.ID_Cnd_Pgto_Venda = Cnd_Pgto_Venda.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Vendedor ON PV.Vendedor = Vendedor.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cidade_IBGE ON Part.Cod_Mun = Cidade_IBGE.Codigo").AppendLine() strSQL.Append("WHERE PV.Num_Pedido=@Num_Pedido and PV.Empresa=@Empresa").AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) tb.Load(sqlReader) sqlReader.Close() '----- cria Tabela itens de Kit idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "ID_Item_Kit" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Qnt_Solicita_Kit" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Preco_Venda_Kit" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Descr_Item_Kit" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Int32") idColumn.ColumnName = "Sequencia_Kit" tb.Columns.Add(idColumn) '------------- Itens KIT clItens = bl_item.CarregarItensKit(Emp, NumPed) For cont As Integer = 0 To clItens.Count - 1 mlItens = clItens(cont) ' mlItens2 = clItens(cont + 1) row = tb.NewRow() row("Sequencia_Kit") = mlItens.Sequencia row("ID_Item_Kit") = mlItens.ID_Item row("Preco_Venda_Kit") = mlItens.Preco_Venda row("empresa") = 23 row("Qnt_Solicita_Kit") = mlItens.Qnt_Solicita row("Descr_Item_Kit") = mlItens.Descr_Item tbKit.Rows.Add(row) Next '-------- idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "ID_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Qnt_Solicita" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Preco_Venda" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Descr_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Int32") idColumn.ColumnName = "Sequencia" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "SubTotal_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Unid_Venda" tb.Columns.Add(idColumn) '---------- Item do Pedido clItens = bl_item.CarregarItensPedido(Emp, NumPed) For cont As Integer = 0 To clItens.Count - 1 mlItens = clItens(cont) row = tb.NewRow() row("ID_Item") = mlItens.ID_Item row("Preco_Venda") = mlItens.Preco_Venda row("empresa") = 23 row("Qnt_Solicita") = mlItens.Qnt_Solicita row("Descr_Item") = mlItens.Descr_Item row("Unid_Venda") = mlItens.Unid_Venda row("Sequencia") = mlItens.Sequencia row("SubTotal_Item") = mlItens.Qnt_Solicita * mlItens.Preco_Venda tb.Rows.Add(row) Next crReportDocument.SetDataSource(tb) crReportDocument.SetDataSource(tbKit) sqlReader.Close() '4 passo: visualizar o relatório Imprimir_Pedido.DisplayGroupTree = False Imprimir_Pedido.HasCrystalLogo = False Imprimir_Pedido.ReportSource = crReportDocument End Sub
Nessa -
Povo enfim cheguei a uma solução do meu problema do pedido de venda. Acabei não utilizando as duas colunas conforme eu queria, mas segue abaixo o código para o meu pedido de venda. Está imprimindo certinho. Serviu pra mim espero que sirva pra alguem.
Abraço a todos e obrigada pela ajuda William.
Imports Model_Layer Imports Business_Layer Imports System.Data Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared Imports Data_Layer Imports System.Data.SqlClient Partial Class PedidoVenda_Impressao Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'Dim bl As New EstoqueBL Dim crReportDocument As New ReportDocument Dim crSubReportDocument As New ReportDocument Dim sqlPar As SqlParameter, colPar As New Collection Dim strSQL As New StringBuilder, sqlReader As SqlDataReader Dim tb As New DataTable, row As System.Data.DataRow Dim idColumn As DataColumn = New DataColumn() Dim mlItens As Pedido_Venda_ItemRelML, clItens As Pedido_Venda_ItensRelML Dim bl_item As New Pedido_Venda_ItemBL Dim ml As Pedido_VendaRelML, bl As New Pedido_VendaBL Dim Func As New FuncoesCalculo Dim tbx As New DataTable <br/> Dim tbTemp As New DataTable Dim NumPed As String = Page.Request.QueryString("Num_Ped") Dim strPathreport As String = Server.MapPath("Relatorios\PedidoVenda.rpt") <br/> Dim Emp As String = Session("empresa") Dim PercDesconto As Double crReportDocument.Load(strPathreport) '--------Pega valor SubTotal dos Itens com o Desconto strSQL.Append("SELECT Per_Desconto from Pedido_Venda").AppendLine() strSQL.Append("WHERE Num_Pedido=" + NumPed.ToString).AppendLine() strSQL.Append(" and Empresa=" + Emp.ToString).AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) If sqlReader.Read Then PercDesconto = sqlReader("Per_Desconto") 'tbTemp.Load(sqlReader) sqlReader.Close() '-----------Cria Tabela para Itens do Pedido idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Int32") idColumn.ColumnName = "Num_Pedido" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "ID_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Qnt_Solicitada" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Preco_Venda" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Descr_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Int32") idColumn.ColumnName = "Sequencia" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "SubTotal_Item" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Unid_Venda" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "COD_ITEM_FORNECEDOR" tb.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "CodBarra" tb.Columns.Add(idColumn) '---------- Carrega os Itens do Pedido clItens = bl_item.CarregarItensPedido(Emp, NumPed) ml = bl.VerificarTotalPedido(Emp, NumPed) Dim ICMSST As Double = 0 Dim SubtotalDesconto As Double ' Dim SubTotDesc As Double For cont As Integer = 0 To clItens.Count - 1 mlItens = clItens(cont) row = tb.NewRow() row("Num_Pedido") = NumPed row("ID_Item") = mlItens.ID_Item row("Preco_Venda") = mlItens.Preco_Venda.ToString("#,###,##0.00") row("Qnt_Solicitada") = mlItens.Qnt_Solicitada row("Descr_Item") = mlItens.Descr_Item row("Unid_Venda") = mlItens.Unid_Venda row("COD_ITEM_FORNECEDOR") = mlItens.COD_ITEM_FORNECEDOR row("CodBarra") = mlItens.Cod_Barra SubtotalDesconto = mlItens.Qnt_Solicitada * mlItens.Preco_Venda row("SubTotal_Item") = SubtotalDesconto * (1 - (PercDesconto / 100)) ICMSST = ICMSST + Func.ICMS_ST(mlItens.Empresa, mlItens.ID_Item, row("SubTotal_Item"), ml.ID_Participante) tb.Rows.Add(row) Next 'Criar o Cabeçalho '3 passo: definir o DataSource do relatório 'Obtém dados do cabeçalho do pedido sqlPar = New SqlParameter sqlPar.DbType = DbType.Int32 sqlPar.Value = NumPed sqlPar.ParameterName = "@Num_Pedido" colPar.Add(sqlPar) sqlPar = New SqlParameter sqlPar.DbType = DbType.Int32 sqlPar.Value = Emp sqlPar.ParameterName = "@Empresa" colPar.Add(sqlPar) strSQL = New StringBuilder strSQL.Append("SELECT PV.Empresa, PV.Codigo, PV.Num_Pedido, PV.ID_Participante, Part.Nome as Nome_Participante, PV.Data_Emissao, Cnd_Pgto_Venda.Descricao AS Cnd_Pgto, ").AppendLine() strSQL.Append("PV.Per_Desconto, PV.VL_Desconto, PV.Texto, PV.Per_Desconto_Comissao, PV.VL_Desconto_Comissao, PV.Data_Registro, PV.Usuario_Registro, ").AppendLine() strSQL.Append("PV.Status, PV.ID_Nota_Fiscal, Vendedor.Nome AS Vendedor, Part.Fantasia, Part.Endereco, Part.Cep, Cidade_IBGE.Nome AS Cidade, Part.Num, ").AppendLine() strSQL.Append("Part.FoneFix, Cidade_IBGE.UF,Part.CNPJ, Part.IE, Part.CPF, ").AppendLine() strSQL.Append("CASE Part.CRT WHEN 1 THEN 'Simples Nacional' WHEN 2 then 'Simples Nacional – Excesso de Sublimite de Receita Bruta' WHEN 3 then 'Regime Normal' END as CRT").AppendLine() strSQL.Append("FROM Pedido_Venda AS PV ").AppendLine() strSQL.Append("left outer join empresa on PV.empresa=empresa.codigo").AppendLine() strSQL.Append("LEFT OUTER JOIN Participante AS Part ON PV.ID_Participante = Part.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cnd_Pgto_Venda ON PV.ID_Cnd_Pgto_Venda = Cnd_Pgto_Venda.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Vendedor ON PV.Vendedor = Vendedor.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Cidade_IBGE ON Part.Cod_Mun = Cidade_IBGE.Codigo").AppendLine() strSQL.Append("WHERE PV.Num_Pedido=@Num_Pedido and PV.Empresa=@Empresa").AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) tbx.Load(sqlReader) sqlReader.Close() '--------------- Calcula Valor de ICMS ST idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Vl_ICMS_ST" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Vl_Desconto" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Vl_Total_Geral" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Mensagem" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.Double") idColumn.ColumnName = "Perc_Desconto" tbx.Columns.Add(idColumn) '------------- Cacula Total Pedido row = tbx.Rows(0) row("Vl_ICMS_ST") = ICMSST row("VL_Desconto") = ml.Vl_Desconto row("Vl_Total_Geral") = ml.Total.ToString("#,###,##0.00") + ICMSST row("Perc_Desconto") = PercDesconto '-------------- Carrega Mensagem Vidros Dim cl As New Pedido_Venda_ItensML cl = bl_item.VerificaPedidoItemVidro(Emp, NumPed) If cl.Count <> 0 Then row("Mensagem") = "OBS: NAO TROCAMOS A LINHA DE VIDROS, PORCELANA E PINTADOS. FAVOR CONFERIR" End If idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Descr_Negocio" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "Dt_Cadastro" tbx.Columns.Add(idColumn) idColumn = New DataColumn() idColumn.DataType = System.Type.GetType("System.String") idColumn.ColumnName = "EmpresaNome" tbx.Columns.Add(idColumn) '-------------- Carrega Descrição do Negócio - Participantes strSQL = New StringBuilder strSQL.Append(" SELECT Pedido_Venda.Num_Pedido, Empresa.Fantasia, Participante.Descr_Negocio, Participante.Dt_Cadastro, ISNULL(Cnd_Pgto_Venda.Banco,0) as Banco ").AppendLine() 'ISNULL(Cnd_Pgto_Venda.Banco,0) strSQL.Append("FROM Pedido_Venda LEFT OUTER JOIN").AppendLine() strSQL.Append(" Empresa ON Pedido_Venda.Empresa = Empresa.Codigo LEFT OUTER JOIN").AppendLine() strSQL.Append("Participante ON Pedido_Venda.ID_Participante = Participante.Codigo").AppendLine() strSQL.Append("LEFT OUTER JOIN Cnd_Pgto_Venda ON Pedido_Venda.ID_Cnd_Pgto_Venda = Cnd_Pgto_Venda.Codigo").AppendLine() strSQL.Append("WHERE Pedido_Venda.Num_Pedido =@Num_Pedido and pedido_venda.empresa=@Empresa").AppendLine() sqlReader = Conexao.OpenReaderWithParam(strSQL.ToString(), colPar) Dim banco As Boolean If sqlReader.Read Then banco = sqlReader("Banco") If ml.Total > 1000 Or banco = True Then row = tbx.Rows(0) row("Descr_Negocio") = sqlReader("Descr_Negocio") row("Dt_Cadastro") = "Data Cadastro: " + sqlReader("Dt_Cadastro") row("EmpresaNome") = sqlReader("Fantasia") End If sqlReader.Close() crReportDocument.Database.Tables(0).SetDataSource(tb) crReportDocument.Database.Tables(1).SetDataSource(tbx) '4 passo: visualizar o relatório Imprimir_Pedido.DisplayGroupTree = False Imprimir_Pedido.HasCrystalLogo = False Imprimir_Pedido.ReportSource = crReportDocument End Sub End Class
Nessa- Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 4 de outubro de 2010 12:00