none
MISTERIOS DO CRYSTAL... RRS feed

  • 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
    domingo, 12 de dezembro de 2010 12:15

Todas as Respostas