none
Comportamiento extraño. RRS feed

  • Pregunta

  • Hola amigos.

    He realizado un modulo de facturación por primera vez en esta plataforma. Pero, tengo el dolor de cabeza de que el cliente se me esta quejando que la a veces no rebaja la existencia del inventario. Lo he notado en raras ocasiones, y no puedo ver un patrón a seguir para interceptar el error.

    A veces, no rebaja la cantidad para cada articulo y otras, no registra el articulo en el historial de movimiento.

    He aquí el código que utilizo en el botón Guardar. Si alguien tiene tiempo de analizarlo, se lo agradezco.

    Private Sub BotonGuardar_Click(sender As Object, e As EventArgs) Handles BotonGuardar.Click
            Try
                If TextEfectivo.Text = 0 And ComboCondicion.Text = "Al Contado" Then
    
                    Dim msg = "Debe Cobrar la Factura antes de proceder."
                    Dim title = "Advertencia!!"
                    Dim style = MsgBoxStyle.Information
                    Dim response = MsgBox(msg, style, title)
                    GrupoPago.Visible = True
                Else
    
                    If Modifica1 = "Modificando" Then
                        Guardar()
                        Limpiar()
                        Contador()
                        Seteos()
                        DataGriDetalles.ReadOnly = False
                    Else
                        Contador() 'Va aqui para evitar numero de documento duplicado en la BD y se sobreescriba o modifique.
                        If ComboDocumento.Text = "Factura" Then
                            StockOut()
                            Guardar()
                            Limpiar()
                            Contador()
                            Seteos()
    
                        Else
                            Guardar()
                            Limpiar()
                            Contador()
                            Seteos()
                        End If
                       
                    End If
    
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    De aquí en adelante los demás módulos que componen el guardado de la  facturación.

    Este modulo rebaja la existencia del producto en la tabla Productos
      Private Sub StockOut()
            'Comprobacion final de existencias antes de imprimir o guardar
            Try
                DataGriDetalles.AllowUserToAddRows = False
                Dim na As New PDVDatosDataContext()
                For Each row As DataGridViewRow In DataGriDetalles.Rows
    
                    Dim prod As Productos = na.Productos.FirstOrDefault(Function(a) a.codigo = Convert.ToString(row.Cells(0).Value))
                If IsNothing(prod) Then
                Else
                    If prod.existencia < row.Cells(5).Value Then
                        row.DefaultCellStyle.BackColor = Color.Yellow
                        linea = linea + 1
                    Else
                        'If ComboDocumento.Text = "Factura" Then
                        'Dim prod1 As Productos = na.Productos.FirstOrDefault(Function(a) a.codigo = Convert.ToString(row.Cells(0).Value))
                        prod.existencia = prod.existencia - Convert.ToString(row.Cells(5).Value)
                    End If
    
                End If
    
                'End If
    
            Next
                'na.SubmitChanges()
    
                If linea > 0 Then
                    Dim msg = "Tiene" + " " + Convert.ToString(linea) + "items sin suficiente Existencia."
                    Dim title = "Advertencia!!"
                    Dim style = MsgBoxStyle.Information
                    Dim response = MsgBox(msg, style, title)
                End If
    
                'Else
                'Registrar movimiento en el Kardex
                For Each row As DataGridViewRow In DataGriDetalles.Rows
    
                        If row.Cells(0).Value IsNot Nothing And row.Cells(5).Value IsNot Nothing Then
                            Dim prod As Productos = na.Productos.FirstOrDefault(Function(a) a.codigo = Convert.ToString(row.Cells(0).Value))
                            Dim det As New Kardex()
                            det.codigo = Trim(row.Cells(0).Value)
                            det.fecha = Trim(TexFecha.Text)
                            det.tipo = "Factura"
                            det.numdoc = Trim(TexNumero.Text)
                            det.salida = Convert.ToString(row.Cells(5).Value)
                            det.costo = prod.costo
                            det.precio = Convert.ToString(row.Cells(3).Value)
    
                            na.Kardex.InsertOnSubmit(det)
    
                        End If
                    Next
                    na.SubmitChanges()
                'Guardar()
                'End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    Este Guarda los datos de la factura. Hay algunas lineas que quite para ahorrar espacio. Pero no son importantes, son otros campos.

    Private Sub Guardar()
            Try
    
                Dim na As New PDVDatosDataContext()
                If TexSubT.Text > 0 Then
                    If ComboCliente.SelectedValue = 0 And ComboCondicion.Text = "A Crédito" Then
                        Dim msg = "Debe Esoger un Cliente a Crédito de la lista."
                        Dim title = "Advertencia!!"
                        Dim style = MsgBoxStyle.Information
                        Dim response = MsgBox(msg, style, title)
                    Else
    
                        Dim factu As Pedidos = na.Pedidos.FirstOrDefault(Function(a) a.factura = Trim(TexNumero.Text))
                        If factu IsNot Nothing Then
    
                            Dim msg = "Está modificando esta factura/Cotización, esta seguro?"
                            Dim title = "Advertencia!!"
                            Dim style = MsgBoxStyle.YesNo
                            Dim response = MsgBox(msg, style, title)
                            ' Take some action based on the response.
                            If response = MsgBoxResult.Yes Then
                                factu.factura = Trim(TexNumero.Text)
                                factu.fecha = Convert.ToString(Today.ToShortDateString) + " " + Convert.ToString(Now.ToShortTimeString)
                                factu.codcli = Convert.ToInt32(ComboCliente.SelectedValue)
                                factu.condicion=ComboCondicion.Text
                                                           factu.refpago = Trim(TextRefPago.Text)
                                factu.observacion = Trim(MemoEditObser.Text)
                                factu.tipodocumento = ComboDocumento.Text
                                factu.usuario = Entorno.Usuari
    
                                If ComboCliente.SelectedValue = 0 Then
                                    factu.contado = ComboCliente.Text
                                End If
    
                                If LabelAnulada.Visible = True Then
                                    factu.estado = "Anulada"
                                Else
                                    factu.estado = "Abierta"
                                End If
    
                                If ComboCondicion.Text = "A Crédito" And Convert.ToString(TextPendiente.Text) = 0 Then
                                    factu.pendiente = Convert.ToString(TexNeto.Text)
                                End If
                                na.SubmitChanges()
                                GrabaItems()
                                ItemFactura.edita = 0
    
                                'Limpiar()
                                'Contador()
                                'Seteos()
                            End If
                        Else
                            Dim factu1 As New Pedidos()
                            Contador()
                            factu1.factura = Trim(TexNumero.Text)
                            factu1.fecha = Convert.ToString(Today.ToShortDateString) + " " + Convert.ToString(Now.ToShortTimeString)
                            factu1.codcli = Convert.ToInt32(ComboCliente.SelectedValue)
                            factu1.condicion = ComboCondicion.Text
                                                   factu1.pagado = Convert.ToString(TextEfectivo.Text)
                            factu1.cambio = Convert.ToString(TextDevuel.Text)
                            factu1.subtotal = Convert.ToString(TexSubT.Text)
                            factu1.tipopago = ComboTipoPa.Text
                            factu1.refpago = Trim(TextRefPago.Text)
                            factu1.observacion = Trim(MemoEditObser.Text)
                            factu1.tipodocumento = ComboDocumento.Text
                            factu1.estado = "Abierta"
                            factu1.usuario = Entorno.Usuari
    
                            If ComboCliente.SelectedValue = 0 Then
                                factu1.contado = ComboCliente.Text
                            End If
    
                            If ComboCondicion.Text = "A Crédito" And Convert.ToString(TextPendiente.Text) = 0 Then
                                factu1.pendiente = Convert.ToString(TexNeto.Text)
                            End If
                            na.Pedidos.InsertOnSubmit(factu1)
                            na.SubmitChanges()
                            GrabaItems()
    
                            ItemFactura.edita = 0
    
                            'Limpiar()
                            'Contador()
                            'Seteos()
                        End If
                    End If
    
                Else
                    Dim msg = "Debe tener al menos un producto calculado en el Detalle."
                    Dim title = "Advertencia!!"
                    Dim style = MsgBoxStyle.Information
                    Dim response = MsgBox(msg, style, title)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub
    

    Con este Limpio los controles.

      Private Sub Limpiar()
            Try
                TexNumero.Text = String.Empty
                TexFecha.Text = Today
                ComboCliente.SelectedValue = ComboCliente.SelectedIndex = 1
                ComboCondicion.SelectedValue = 0
                TexNeto.Text = 0
                DataGriDetalles.Rows.Clear()
                TextRefPago.Text = String.Empty
                DataGriDetalles.AllowUserToAddRows = True
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    Con este realizo el conteo del numero consecutivo de facturas.

    Private Sub Contador()
            Try
                Dim an As New PDVDatosDataContext()
                Dim maxCod As Integer = 0
    
                If an.Pedidos.Count() > 0 Then
                    'Si la tabla tiene registros
                    Dim query = (From q In an.Pedidos Select q.factura).Max()
                    TexNumero.Text = query + 1
                Else
                    'Si la tabla NO tiene registros
                    TexNumero.Text = 100
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    Con este ultimo, algunos otros seteos.

     Sub Seteos()
            Try
                DataGriDetalles.Columns("precio").DefaultCellStyle.Format = "n"
                DataGriDetalles.Columns("total").DefaultCellStyle.Format = "n"
                ItemFactura.EstadoFact = "Nueva"
                ActualiaComboCliente()
                Contador()
                ComboCondicion.Text = "Al Contado"
                TexDesc.Text = 0
                TextImpu.Text = 0
                TextDevuel.Text = 0
                TexSubT.Text = 0
                TexNeto.Text = 0
                TextEfectivo.Text = 0
                TextPendiente.Text = 0
                TexFecha.Text = Today.Date
                DataGriDetalles.Select()
                ComboTipoPa.Text = "Efectivo"
                ComboDocumento.Text = "Factura"
                BotonCotizar.Enabled = False
                Modifica1 = ""
                Botones()
                ItemMercancia.edita = 0
                LabelAnulada.Visible = False
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    sábado, 8 de julio de 2017 14:56

Respuestas

  • Para resolver este tipo de problemas, en los que ocurre un error solo de vez en cuando, cuando se ejecuta en las instalaciones del cliente (y no consigues reproducirlo sobre tu propia instalación) es importante que el programa esté bien instrumentado. Esto significa que tienes que "salpicarlo" de sentencias de Log que vayan registrando en un archivo todas las cosas que sucenden, tales como "se ha disparado tal comando", "han llegado tales datos como argumento", "llamamos a la rutina xxx pasándole yyy como parámetro", "grabamos en base de datos el sigueinte registro...", etc. Este Log puedes grabarlo usando alguna herramienta de logging tal como Log4Net, que puedes añadir a tu programa como paquete NuGet, o puede ser que tengas suficiente con System.Diagnostics.Trace. Lo importante es que cuando el cliente te dice que algo no ha funcionado como se esperaba, le pides que te envíe el fichero de Log, y examinando el Log puedes inferir qué es lo que estaba haciendo tu programa en ese momento y dónde se ha producido el comportamiento inesperado, centrándote así en cuál es la parte que tienes que revisar para resolverle al cliente su problema.
    domingo, 9 de julio de 2017 15:40

Todas las respuestas

  • Hola, a primera vista, yo empezaría con controlar Modifica1, ya que por lo que veo disparas los modulos correspondientes a partir se su string. Tal vez deberías hacer un relevamiento de cuando cambia esta propiedad ya que en determinado momento puede pasar a otro string según el código. Sigo analizando.

    Saludos

    sábado, 8 de julio de 2017 16:19
  • En la misma línea de análisis ComboDocument.Text = "Factura" ya que el seteo lo vuelve siempre a "Factura", entiendo que debe haber una intevención del usuario para el caso contrario.

    sábado, 8 de julio de 2017 16:40
  • Muy agredecido Marcelo PF por tu tiempo. Voy a observar estas anotaciones que me dices con detenimiento. Mirandolo asi por encima, pues me parece que algo por alli esta escondido.

    sábado, 8 de julio de 2017 17:59
  • Para resolver este tipo de problemas, en los que ocurre un error solo de vez en cuando, cuando se ejecuta en las instalaciones del cliente (y no consigues reproducirlo sobre tu propia instalación) es importante que el programa esté bien instrumentado. Esto significa que tienes que "salpicarlo" de sentencias de Log que vayan registrando en un archivo todas las cosas que sucenden, tales como "se ha disparado tal comando", "han llegado tales datos como argumento", "llamamos a la rutina xxx pasándole yyy como parámetro", "grabamos en base de datos el sigueinte registro...", etc. Este Log puedes grabarlo usando alguna herramienta de logging tal como Log4Net, que puedes añadir a tu programa como paquete NuGet, o puede ser que tengas suficiente con System.Diagnostics.Trace. Lo importante es que cuando el cliente te dice que algo no ha funcionado como se esperaba, le pides que te envíe el fichero de Log, y examinando el Log puedes inferir qué es lo que estaba haciendo tu programa en ese momento y dónde se ha producido el comportamiento inesperado, centrándote así en cuál es la parte que tienes que revisar para resolverle al cliente su problema.
    domingo, 9 de julio de 2017 15:40