Inquiridor
MISTERIOS DO CRYSTAL...

Pergunta
-
Private Sub btnImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click ' Vamos montar o arquivo para impressão do relatório... If rbAnalitico.Checked = True Then ' Se analitico... Dim clnArqRelat As New clnArqRelat Dim dsTudo As New DataSet If rbUmProd.Checked = True Then dsTudo = clnArqRelat.LerTudo(cmbFantasia.SelectedValue, cmbProduto.SelectedValue) Else dsTudo = clnArqRelat.LerTudo(cmbFantasia.SelectedValue, 0) End If Dim dr As DataRow Dim wCodPro As String = "" Dim salant As Integer = 0 'Vamos montar os saldos iniciais For Each dr In dsTudo.Tables(0).Rows If dr("CodPro") <> wCodPro Then salant = 0 wCodPro = dr("CodPro") End If dr("SLDANT") = salant salant = salant + dr("QTDENT") - dr("QTDSAI") dr("SLDATU") = salant Next 'Vamos agora eliminiar as linhas que não contemplam as datas... For Each dr In dsTudo.Tables(0).Rows If dr("DATEMI") < CDate(txtDataDe.Text) Or dr("DATEMI") > CDate(txtDataAte.Text) Then dr.Delete() End If Next Dim clnCliente As New clnCliente Dim drCli As OleDb.OleDbDataReader drCli = clnCliente.LeCliente(cmbFantasia.SelectedValue) If drCli.Read Then txtRazaoSoc.Text = drCli("FANTASIA") & " - " & drCli("RAZAOSOC") End If Dim relatorio As New crPosAnalitico relatorio.SetDataSource(dsTudo.Tables(0)) relatorio.SetParameterValue("DATADE", CDate(txtDataDe.Text)) relatorio.SetParameterValue("DATAATE", CDate(txtDataAte.Text)) relatorio.SetParameterValue("NOMECLI", txtRazaoSoc.Text) relatorio.SetParameterValue("EMPRESA", EmpresaAtual) Dim f As New frmRelatorio(relatorio) f.Show() Else ' Se sintetico... Dim clnArqRelat As New clnArqRelat Dim dsTudo As New DataSet If rbUmProd.Checked = True Then dsTudo = clnArqRelat.LerSintetico(cmbProduto.SelectedValue, cmbFantasia.SelectedValue) Else dsTudo = clnArqRelat.LerSintetico(0, cmbFantasia.SelectedValue) End If Dim dr As DataRow Dim salant As Integer = 0 'Vamos montar os saldos iniciais For Each dr In dsTudo.Tables(0).Rows If IsDBNull(dr("QTDENT")) Then dr("QTDENT") = 0 End If If IsDBNull(dr("QTDSAI")) Then dr("QTDSAI") = 0 End If If dr("QTDENT") - dr("QTDSAI") > 0 Then salant = dr("QTDENT") - dr("QTDSAI") dr("SALDO") = salant End If Next 'Vamos agora eliminiar as linhas que não contemplam as datas... For Each dr In dsTudo.Tables(0).Rows If dr("SALDO") = 0 Then dr.Delete() End If Next Dim clnCliente As New clnCliente Dim drCli As OleDb.OleDbDataReader drCli = clnCliente.LeCliente(cmbFantasia.SelectedValue) If drCli.Read Then txtRazaoSoc.Text = drCli("FANTASIA") & " - " & drCli("RAZAOSOC") End If Dim relatorio As New crPosSintetico relatorio.SetDataSource(dsTudo.Tables(0)) relatorio.SetParameterValue("NOMECLI", txtRazaoSoc.Text) relatorio.SetParameterValue("EMPRESA", EmpresaAtual) Dim f As New frmRelatorio(relatorio) f.Show() End If End Sub
Senhores, como podem ver acima, tenho uma rotina que imprime (ou deveria imprimir um relatorio analitico ou sintetico, à escolha do usuário.
Bem, alem, disso, ele pode escolher apenas um produto ou todos os produtos...
As duas rotinas que carrgam o dataset seguem abaixo:
Public Function LerTudo(ByVal codcli As Integer, ByVal codpro As Integer) As DataSet 'Cria o stringBuilder Dim strQuery As New StringBuilder strQuery.Append(" SELECT ESTOQUE.EST_CODPRO AS CODPRO, ESTOQUE.EST_DESCRICAO AS DESCRICAO, NFENTR.NFE_DATEMI AS DATEMI, NFENTR.NFE_NRONFE AS NRODOC, ") strQuery.Append(" NFEITM.ITE_QTDENT AS QTDENT, 0 AS QTDSAI, 0 AS SLDANT, 0 AS SLDATU ") strQuery.Append(" FROM (NFENTR INNER JOIN NFEITM ON NFENTR.ID_NFE = NFEITM.ITE_IDNFE) INNER JOIN ESTOQUE ON NFEITM.ITE_IDEST = ESTOQUE.ID_EST ") strQuery.Append(" WHERE (NFE_EMPRESA = '" & EmpresaAtual & "') And (NFE_IDCLI = " & codcli & ") ") If codpro > 0 Then strQuery.Append(" AND (NFEITM.ITE_IDEST = " & codpro & ") ") End If strQuery.Append(" UNION ") strQuery.Append(" SELECT ESTOQUE.EST_CODPRO AS CODPRO, ESTOQUE.EST_DESCRICAO AS DESCRICAO, NFSAID.NFS_DATEMI AS DATEMI, NFSAID.NFS_NRONFS AS NRODOC, ") strQuery.Append(" 0 AS QTDENT, NFSITM.ITS_QTDSAI AS QTDSAI, 0 AS SLDANT, 0 AS SLDATU ") strQuery.Append(" FROM (NFSAID INNER JOIN NFSITM ON NFSAID.ID_NFS = NFSITM.ITS_IDNFS) INNER JOIN ESTOQUE ON NFSITM.ITS_IDEST = ESTOQUE.ID_EST ") strQuery.Append(" WHERE (NFS_EMPRESA = '" & EmpresaAtual & "') And (NFS_IDCLI = " & codcli & ") ") If codpro > 0 Then strQuery.Append(" AND (NFSITM.ITS_IDEST = " & codpro & ") ") End If strQuery.Append(" ORDER BY CODPRO ") 'Executa o método executacomando da classe de banco de dados 'Executa o método RetornaDataSet da classe de banco de dados e retorna o DataSet Dim cldBancoDados As New cldBcoDados Return cldBancoDados.RetornaDataSet(strQuery.ToString) End Function
e...
Public Function LerSintetico(ByVal intCodigo As Integer, ByVal codcli As Integer) As DataSet 'Cria um StringBuilder para concatenar a Query Sql Dim strQuery As New StringBuilder strQuery.Append(" SELECT ID_EST, EST_DESCRICAO AS DESCRICAO, EST_CODPRO AS CODPRO,EST_PALLET AS PALLETS, 0 AS SALDO, ") If intCodigo > 0 Then strQuery.Append(" (SELECT SUM(ITE_QTDENT) FROM NFEITM WHERE ITE_IDEST = " & intCodigo & " AND ITE_EMPRESA = '" & EmpresaAtual & "' ) AS QTDENT, ") strQuery.Append(" (SELECT SUM(ITS_QTDSAI) FROM NFSITM WHERE ITS_IDEST = " & intCodigo & " AND ITS_EMPRESA = '" & EmpresaAtual & "' ) AS QTDSAI ") strQuery.Append(" FROM ESTOQUE ") strQuery.Append(" WHERE ID_EST = " & intCodigo & " ") Else strQuery.Append(" (SELECT SUM(ITE_QTDENT) FROM NFEITM WHERE ITE_IDEST = ID_EST AND ITE_EMPRESA = '" & EmpresaAtual & "' ) AS QTDENT, ") strQuery.Append(" (SELECT SUM(ITS_QTDSAI) FROM NFSITM WHERE ITS_IDEST = ID_EST AND ITS_EMPRESA = '" & EmpresaAtual & "' ) AS QTDSAI ") strQuery.Append(" FROM ESTOQUE WHERE EST_IDCLI = " & codcli & " ") End If 'Executa o método RetornaDataSet da classe de banco de dados e retorna o DataSet Dim cldBancoDados As New cldBcoDados Return cldBancoDados.RetornaDataSet(strQuery.ToString) End Function
Pois bem, a rotina analitico funciona perfeitamente... Ja a rotina sintetico...Se eu nao deletar nada o relatorio apresenta os itens sem probleam. Mas vejam, são centenas de itens de estoque e apenas 100 ou pouco menos deles têm de fato saldo. Se eu deletar as linhas com saldo
aparece um erro: Query Engine error: 'System.Data : InformAções sobre a linha excluída não podem ser acessadas através da lina.' Failed to open a rowset
Ocorre que na rotina de cima (que é a mesma em estrutura, eu deleto numa boa e o erro nao acontece...
Alguem tem alçguma luz sobre onde posso estar errando? Obrigado.
Luiz Melo
Luiz Melo- Movido AndreAlvesLimaModerator segunda-feira, 20 de dezembro de 2010 17:33 (De:VB.NET e Visual Basic)
Todas as Respostas
-
Prezado(a),
Estou migrando seu post para o fórum de Geração de Relatórios.
Por favor, das próximas vezes que tiver alguma dúvida relacionada a esse assunto, poste por lá.
Obrigado pelo apoio.
André Alves de Lima
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima