+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Metodo migliore per software controllo merce

  1. #1
    logan88 non è in linea Novello
    Post
    22

    Metodo migliore per software controllo merce

    salve,

    ho sviluppato un piccolo software per la mia azienda che tra le altre cose permette di conteggiare la merce per la successiva stampa del ddt

    in sostanza quando la merce viene collocata in magazzino essa viene dotata di codici a barre ed i quantitativi vengono salvati sul db, successivamente quando la merce deve essere caricata effettuiamo un controllo della merce in uscita per essere sicuri che i quantitativi siano corretti

    per fare ciò utilizzo un form che prende i codici inseriti tramite lettore barcode e li visualizza su datagrid, dopodichè utilizzo 3 datatable non tipizzati, uno lo riempio con le letture effettuate, uno lo riempio con i quantitativi presenti in magazzino, e il terzo è riempito facendo la differenza tra i primi due. infine mostro le differenze riscontrate tra i due datatable tramite il medesimo datagradview in modo da correggere eventuali errori

    per intenderci il metodo che ho usato funziona, solo che vorrei fare la stessa cosa in modo più semplice, ma manco di pratica con vb.net

    chiedo quindi quale sarebbe un metodo migliore o lo strumento migliore per poter fare quanto esposto sopra

    thankssss

  2. #2
    patel45 non è in linea Scolaretto
    Post
    176
    a me sembra più semplice fare il tutto con un foglio excel, ma non saprei aiutarti riguardo al lettore dei codici

  3. #3
    logan88 non è in linea Novello
    Post
    22
    Quote Originariamente inviato da patel45 Visualizza il messaggio
    a me sembra più semplice fare il tutto con un foglio excel, ma non saprei aiutarti riguardo al lettore dei codici
    sottinteso che si rimane in ambiente vb.net

    appena posso posto il codice che uso al momento

    edit: ecco il codice

    codice:
    Private Sub data_view()
            Dim numrighe As Integer = TextBox1.Lines.Count - 2
            Panel6.Visible = True
            ProgressBar1.Maximum = numrighe
            ProgressBar1.Step = 1
            Dim list As DataTable = New DataTable
    
            list.Columns.Add("Articolo")
            list.Columns.Add("Quantità")
            list.Columns.Add("ID Cliente")
    
            For t = 0 To numrighe
                Dim i As Integer = TextBox1.Lines.Count - 1
                Dim str As String = Replace(TextBox1.Lines(t), "'", " ")
                Dim div() As String = Split(str)
                Dim art As String
    
                If Not div.Length = 3 Then
                    MessageBox.Show("Il codice inserito nella riga " & i + 1 & " non è valido!" & vbCrLf & " Il codice deve essere del tipo: xx-xx-xx!")
                Else
                    Using dbCon As New SqlConnection(cnstring)
                        dbCon.Open()
                        Dim query As New SqlCommand("SELECT [Articolo] FROM Articoli WHERE [ID Articolo]=" + div(1), dbCon)
                        art = query.ExecuteScalar
                        Dim slc As New SqlCommand("SELECT count(*) FROM Visualizza WHERE Articolo= '" & art & "' AND [Id_Cliente]='" & div(0) & "'", dbCon)
                        Dim num As Integer = CType(slc.ExecuteScalar, Integer)
    
                        If num <> 0 Then
                            Dim cmd As New SqlCommand("UPDATE Visualizza SET Quantità = Quantità + " & div(2) & " WHERE Articolo = '" & art & "' AND id_cliente='" & div(0) & "'", dbCon)
                            cmd.ExecuteNonQuery()
                            dbCon.Close()
                        Else
                            Dim cmd As New SqlCommand("INSERT INTO Visualizza (Articolo, Quantità, Id_Cliente) VALUES ('" & art & "','" & div(2) & "','" & div(0) & "')", dbCon)
                            cmd.ExecuteNonQuery()
                        End If
                        dbCon.Close()
                    End Using
                End If
                ProgressBar1.PerformStep()
            Next
    
            Using dbCon As New SqlConnection(cnstring)
                dbCon.Open()
                Dim sel As New SqlCommand("SELECT Articolo, Quantità, Id_Cliente FROM Visualizza", dbCon)
                Dim rd As SqlDataReader = sel.ExecuteReader
                While rd.Read
                    list.Rows.Add({rd.GetString(0), rd.GetInt32(1).ToString, rd.GetString(2)})
                End While
                dbCon.Close()
            End Using
    
            ProgressBar1.Maximum = list.Rows.Count - 1
            list.Columns.Add("Cliente")
    
            For i = 0 To list.Rows.Count - 1
                Using dbCon As New SqlConnection(cnstring)
                    dbCon.Open()
                    Dim query As New SqlCommand("SELECT Nome FROM Clienti WHERE [ID Cliente]=" + list.Rows(i)(2).ToString, dbCon)
                    Dim nome As String = query.ExecuteScalar.ToString
                    list.Rows(i)(3) = nome
                End Using
                ProgressBar1.PerformStep()
            Next
    
            list.Columns.Remove("ID Cliente")
            list.Columns(2).SetOrdinal(0)
    
            Dim view As DataView = list.DefaultView
            view.Sort = ("Cliente ASC, Articolo ASC")
            DataGridView1.DataSource = view
            Panel6.Visible = False
            DataGridView1.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            TextBox1.Clear()
        End Sub
    con questo estraggo i dati inseriti tramite il lettore, li converto e li passo al db perchè avevo esigenza di salvarli nel caso in cui si volesse eseguire il controllo in un secondo momento, ora però sto pensando che, volendo fare il controllo dei dati in maniera differente, potrei anche non salvarli sul db ma effettuare tutte le operazioni sul datatable se possibile, in modo da alleggerire

    al momento uso questo per effettuare il controllo

    codice:
    Private Sub controllo()
            Dim riep As DataTable = New DataTable
            Dim arr As List(Of String) = New List(Of String)
    
            riep.Columns.Add("Articolo")
            riep.Columns.Add("Quantità")
            riep.Columns.Add("ID Cliente")
    
            Dim ctrl As DataTable = New DataTable
    
            ctrl.Columns.Add("Articolo")
            ctrl.Columns.Add("Quantità")
            ctrl.Columns.Add("ID Cliente")
    
            Dim diff As DataTable = New DataTable
    
            diff.Columns.Add("Articolo")
            diff.Columns.Add("Quantità")
            diff.Columns.Add("ID Cliente")
    
            Dim surp As DataTable = New DataTable
    
            surp.Columns.Add("Articolo")
            surp.Columns.Add("Quantità")
            surp.Columns.Add("ID Cliente")
    
            Using dbCon As New SqlConnection(cnstring)
                dbCon.Open()
                Dim query2 As New SqlCommand("SELECT DISTINCT [ID_Cliente] FROM Visualizza", dbCon)
                Using sf As SqlDataReader = query2.ExecuteReader
                    While sf.Read
                        Dim adv As String = sf.GetString(0)
                        arr.Add(adv)
                    End While
                End Using
                dbCon.Close()
            End Using
    
            For i = 0 To arr.Count - 1
                Using dbCon As New SqlConnection(cnstring)
                    dbCon.Open()
                    Dim sel As New SqlCommand("SELECT [Articolo], [Quantità], [ID_Cliente] FROM Riepiloghi WHERE [ID_Cliente]='" & arr(i) & "' ORDER BY Articolo", dbCon)
                    Using rd As SqlDataReader = sel.ExecuteReader
                        While rd.Read
                            riep.Rows.Add({rd.GetString(0), rd.GetInt32(1).ToString, rd.GetInt32(2).ToString})
                        End While
                    End Using
    
                    Dim sel2 As New SqlCommand("Select [Articolo], [Quantità], [ID_Cliente] FROM Visualizza WHERE [ID_Cliente]='" & arr(i) & "' ORDER BY Articolo", dbCon)
                    Using rd2 As SqlDataReader = sel2.ExecuteReader
                        While rd2.Read
                            ctrl.Rows.Add({rd2.GetString(0), rd2.GetInt32(1).ToString, rd2.GetString(2)})
                        End While
                    End Using
                    dbCon.Close()
                End Using
            Next
    
            If ctrl.Rows.Count = 0 Then
                Dim msg As String
                Dim title As String
                Dim style As MsgBoxStyle
    
                msg = "Nessun dato immesso!"
                style = MsgBoxStyle.Critical
                title = "Attenzione"
                MsgBox(msg, style, title)
    
            Else
    
                For i = 0 To ctrl.Rows.Count - 1
                    Try
                        Dim comparer As IEqualityComparer(Of DataRow) = DataRowComparer.Default
                        Dim bEqual = comparer.Equals(riep.Rows(i), ctrl.Rows(i))
    
                        If Not (bEqual = True) Then
                            diff.ImportRow(ctrl.Rows(i))
                        End If
    
                    Catch exp As Exception
                        riep.ImportRow(ctrl.Rows(i))
                        riep.Rows(i)(1) = "0"
    
                        Dim bEqual = Comparer.Equals(riep.Rows(i), ctrl.Rows(i))
    
                        If Not (bEqual = True) Then
                            diff.ImportRow(ctrl.Rows(i))
                        End If
                    End Try
                Next
    
                If riep.Rows.Count > ctrl.Rows.Count Then
                    Dim surplus = riep.AsEnumerable().Except(ctrl.AsEnumerable(), DataRowComparer.Default)
    
                    For i = 0 To surplus.Count - 1
                        surp.ImportRow(surplus(i))
    
                        Dim str As String = surp.Rows(i)(0).ToString
                        Dim str2 As String = surp.Rows(i)(2).ToString
                        Dim foundRow() As Data.DataRow
    
                        foundRow = diff.Select("Articolo='" & str & "' AND [ID Cliente]='" & str2 & "'")
    
                        If foundRow.Length = 0 Then
                            surp.Rows(i)(1) = 0
                            diff.ImportRow(surp(i))
                        End If
                    Next
                End If
    
                Dim ast As Integer = diff.Rows.Count
                If ast = 0 Then
                    Dim msg As String
                    Dim title As String
                    Dim style As MsgBoxStyle
                    Dim resp As MsgBoxResult
                    msg = "Tutti i dati corrispondono, precedere alla stampa?"
                    style = MsgBoxStyle.YesNo
                    title = "Nessun errore riscontrato"
                    resp = MsgBox(msg, style, title)
                    If resp = MsgBoxResult.Yes Then
                        stamp()
                    End If
                Else
                    diff.Columns.Add("Cliente")
                    diff.Columns.Add("Riepilogo")
    
                    For i = 0 To diff.Rows.Count - 1
                        Dim str As String = diff.Rows(i)(2)
                        Using dbCon As New SqlConnection(cnstring)
                            dbCon.Open()
                            Dim query As New SqlCommand("SELECT Nome FROM Clienti WHERE [ID Cliente]=" & str & " ORDER BY Nome", dbCon)
                            Using rd As SqlDataReader = query.ExecuteReader
                                While rd.Read
                                    diff.Rows(i)(3) = rd.GetString(0)
                                End While
                            End Using
    
                            Dim query2 As New SqlCommand("SELECT [Quantità] FROM Riepiloghi WHERE [ID_Cliente]='" & str & "' AND [Articolo]='" & diff.Rows(i)(0) & "'", dbCon)
                            Using rd2 As SqlDataReader = query2.ExecuteReader
                                While rd2.Read
                                    diff.Rows(i)(4) = rd2.GetInt32(0)
                                End While
                                If diff.Rows(i)(4).ToString = "" Then
                                    diff.Rows(i)(4) = "0"
                                End If
                            End Using
                            dbCon.Close()
                        End Using
                    Next
    
                    diff.Columns(1).ColumnName = "Lettura"
                    diff.Columns.Remove("ID Cliente")
                    diff.Columns(2).SetOrdinal(0)
    
                    Dim view As DataView = diff.DefaultView
                    view.Sort = ("Cliente ASC, Articolo ASC")
                    DataGridView1.DataSource = view
                    DataGridView1.Visible = True
                    DataGridView1.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                    DataGridView1.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                    
                    Button5.Visible = True
    
    
                End If
            End If
        End Sub
    adesso sto pensando di farlo senza accedere al db ma solo sfruttando i datatable (magari usandone qualcuno in meno xD ) ed effettuare il controllo in tempo reale, aggiornando il datagrid ogni volta che si batte un nuovo codice e colorando in rosso le righe in cui i quantitativi non corrispondono
    Ultima modifica di logan88; 13-10-2017 08:35 

  4. #4
    L'avatar di gibra
    gibra ora è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,840
    Quote Originariamente inviato da patel45 Visualizza il messaggio
    a me sembra più semplice fare il tutto con un foglio excel, ma non saprei aiutarti riguardo al lettore dei codici
    Cos'è, una battuta?

  5. #5
    L'avatar di gibra
    gibra ora è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,840
    Quote Originariamente inviato da logan88 Visualizza il messaggio
    salve,

    ho sviluppato un piccolo software per la mia azienda che tra le altre cose permette di conteggiare la merce per la successiva stampa del ddt
    Scusa ma non capisco tutto il 'giro' che fai.

    La logica è semplice:

    1) Durante la compilazione del DDT il gestionale deve verificare la disponibilità della merce.
    N.B. L'inserimento delle righe nel DDT 'scarica' automaticamente le quantità dalla giacenza di magazzino.

    2) Una volta emesso il DDT, il magazziniere preleva la merce 'fisicamente' dal magazzino e predispone la spedizione (packing list).

    Questo è ciò che deve avvenire, mi pare che tu stia complicare inutilmente.

  6. #6
    logan88 non è in linea Novello
    Post
    22
    Quote Originariamente inviato da gibra Visualizza il messaggio
    Scusa ma non capisco tutto il 'giro' che fai.

    La logica è semplice:

    1) Durante la compilazione del DDT il gestionale deve verificare la disponibilità della merce.
    N.B. L'inserimento delle righe nel DDT 'scarica' automaticamente le quantità dalla giacenza di magazzino.

    2) Una volta emesso il DDT, il magazziniere preleva la merce 'fisicamente' dal magazzino e predispone la spedizione (packing list).

    Questo è ciò che deve avvenire, mi pare che tu stia complicare inutilmente.
    il discorso è un pò più articolato, non mi sono dilungato nella spiegazione

    il mio software ne affianca uno pre-esistente dedito alla fatturazione ed emissione dei ddt, che vengono compilati manualmente (purtroppo)
    per questo ne ho ideato un altro per la stampa di etichette che vengono applicate sui prodotto per il riconoscimento univoco mezzo codice a barre

    l'obiettivo è effettuare un ulteriore controllo prima del carico della merce e della successiva emissione del ddt

    il sistema che ho adottato si applica bene alla situazione ed è di facile impiego per i dipendenti

    solo che, anche se funziona, credo sia troppo articolato e si possa fare in modo più semplice, magari utilizzando strumenti che non conosco, diversi dal datatable

  7. #7
    logan88 non è in linea Novello
    Post
    22
    risolto

    si può chiudere

    thx

  8. #8
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,039
    Blogs
    5
    Non si chiudono i thread per questo.

    Magari potresti dire come hai risolto, può servire ad altri ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  9. #9
    logan88 non è in linea Novello
    Post
    22
    semplicemente anzichè usare più datatable e confrontarli tra loro ne ho usato uno solo e ho confrontato solo i campi del datagridview evidenziando quelli non uguali in rosso, senza salvare i dati sul db. adesso è molto più veloce (visto che uso solo memoria virtuale e non accedo al db ad ogni battuta del lettore)

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi