Newsgroup: it.comp.lang.visual-basic
Titolo: Programma di gestione iter...problemi di rilevazioni nodi (lungo con codice)

Ciao a tutti il mio programma devi gestire l'iter di documenti (da
segreteria fino all'approvazione)..il problema mi si presenta qdo devo
cercare all'interno della lista se un nodo è gia presente o meno prima di
inserirlo nella lista stessa......
Il pezzo di pgm in questione ha un form con 2 combo (cbonodoin e cbonodoout)
un pulsante per l'inserimento in lista e uno per uscire (teoricamente ci
sarebber quello per salvare l'iter e per la pulizia dei campi) ed una lista
(di nome list.....che fantasia eh?)  ed un db access monotabella (nome
tabella:NODI-2 campi:ID e NODI) ecco qua il codice:
------FORM--------------------------------
Option Explicit
'variabili per i bottoni:---> cmd(cmd_Inserisci) invece di cmd(0)
Private Const cmd_Inserisci  As Integer = 0
Private Const cmd_Ok         As Integer = 1
Private Const cmd_Pulisci    As Integer = 2
Private Const cmd_Esci       As Integer = 3
'variabile per la classe
Public c_DB As ClsDB
Public lVItem As ListItem
----------------------------------------
Private Sub CboNodoOut_Click()
    s_ItemCbo = Trim(CboNodoOut.Text)
End Sub
----------------------------------------------------
Private Sub cmd_Click(Index As Integer)
    Select Case (Index)
        *Case cmd_Inserisci 'inserisco nella lista
            If CboNodoIn.Text = "" Or CboNodoOut.Text = "" Then Exit Sub
            If CboNodoIn.Text = CboNodoOut.Text Then Exit Sub
            Call CaricaLista
            If i_CheckCaricaCbo = 2 Then
                Call RiempiCboNodoIn2
                Call RiempiCboNodoOut2
            ElseIf i_CheckCaricaCbo = 3 Then
                Call RiempiCboNodoIn3
                Call RiempiCboNodoOut2
            End If
        *Case cmd_Ok
'            If list.ListItems.Count = 0 Then Exit Sub
'
'                For i = 1 To list.ListItems.Count
'
'                    'qsto mi serve per fargli leggere le righe della
lista(altrimenti leggerebbe
'                    'le colonne)
'                    With list.ListItems.Item(i)
'
'                        finchè non trovo End non salvo
'                        If .SubItems(1) = "2  -  End" Then
'
'                            faccio qualcosa (nel mio caso salvo i vari
passaggi dei nodi in un db)
'
'                        Else
'
'                            GoTo avanza
'
'                        End If
'
'                    End With
'avanza:
'
'                Next i
'
            Unload Me
        *Case cmd_Pulisci
            'pulisco la lista
            list.ListItems.Clear
            list.Refresh
            'pulisco e rinfresco le combo
            CboNodoIn.Clear
            CboNodoOut.Clear
            CboNodoIn.Refresh
            CboNodoOut.Refresh
            Call RiempiCboNodoIn
            Call RiempiCboNodoOut
        *Case cmd_Esci
            Unload Me
    End Select
End Sub
-------------------------------------------------------------------
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    'se premo esc vado nell'unload e decido se uscire o no
    If KeyCode = vbKeyEscape Then Unload Me
End Sub
----------------------------------------------------------
Private Sub Form_Load()
    'setto la nuova classe
    Set c_DB = New ClsDB
    'pulisco e rinfresco le combo
    CboNodoIn.Clear
    CboNodoOut.Clear
    CboNodoIn.Refresh
    CboNodoOut.Refresh
    Call RiempiCboNodoIn
    Call RiempiCboNodoOut
'    i_CheckCaricaCbo = 1
    i_CheckCaricaLista = 1
End Sub
-------------------------------------------------------
Private Sub Form_Unload(Cancel As Integer)
    If MsgBox("Sei sicuro di voler uscire ?", vbQuestion + vbYesNo) = vbYes
Then
        'setto la classe a nothing
        Set c_DB = Nothing
        End
    Else
        Exit Sub
    End If
End Sub
---------------------------------------------
Private Sub RiempiCboNodoIn()
'mi connetto
Call c_DB.Connetti
    With c_DB.Riempicombo("NODI", "NODI")
        Do Until .EOF
            'se trovo START lo aggiungo altrimenti vado avanti
            If LCase(.Fields("Nodi").Value) = LCase("start") Then
                'aggiungo il valore start alla combo
                CboNodoIn.AddItem .Fields("NODi").Value & vbNullString
            End If
        .MoveNext
        Loop
    End With
'mi sconnetto
Call c_DB.Sconnetti
End Sub
------------------------------------------------------------
Private Sub RiempiCboNodoOut()
Call c_DB.Connetti
    With c_DB.Riempicombo("NODI", "NODI")
        Do Until .EOF
            'se trovo START o END vado avanti
            If LCase(.Fields("Nodi").Value) = LCase("start") Then
                GoTo Avanti
            ElseIf LCase(.Fields("Nodi").Value) = LCase("end") Then
                GoTo Avanti
            Else 'se trovo altri valori li aggiungo
                CboNodoOut.AddItem .Fields("NODI").Value & vbNullString
            End If
Avanti:
        .MoveNext
        Loop
    End With
Call c_DB.Sconnetti
i_CheckCaricaCbo = 2
End Sub
---------------------------------------------------------
Private Sub CaricaLista()
    'inserisco i dati nelle combo all'interno della lista
    Set lVItem = list.ListItems.Add(, , CboNodoIn.Text)
        lVItem.SubItems(1) = CboNodoOut.Text
        i_CheckCaricaLista = 2
End Sub
----------------------------------------------
Private Sub RiempiCboNodoOut2()
CboNodoOut.Clear
CboNodoOut.Refresh
Call c_DB.Connetti
    With c_DB.Riempicombo("NODI", "NODI")
        Do Until .EOF
            'se trovo START vado avanti
            If LCase(.Fields("Nodi").Value) = LCase("start") Then
                GoTo Avanti
            Else 'altrimenti aggiugo valori alla combo
                CboNodoOut.AddItem .Fields("NODI").Value & vbNullString
            End If
Avanti:
        .MoveNext
        Loop
    End With
Call c_DB.Sconnetti
i_CheckCaricaCbo = 3
End Sub
--------------------------------------------------------------
Private Sub RiempiCboNodoIn2()
CboNodoIn.Clear
CboNodoIn.Refresh
'mi connetto
Call c_DB.Connetti
    With c_DB.Riempicombo("NODI", "NODI")
        Do Until .EOF
            'se trovo il valore che ho cliccato nella cboNodoOut lo aggiungo
altrimenti vado avanti
            If LCase(.Fields("Nodi").Value) = LCase(s_ItemCbo) Then
                    CboNodoIn.AddItem .Fields("NoDI").Value & vbNullString
                End If
        .MoveNext
        Loop
    End With
'mi sconnetto
Call c_DB.Sconnetti
End Sub
----------------------------------------------------------------
Private Function NodoEsiste(s_Nodo As String) As Boolean
'funzione che passatole l'id mi dice se esiste già nella combo
Dim i As Integer
    For i = 0 To CboNodoIn.ListCount
        If Trim(CboNodoIn.list(i)) = Trim(s_Nodo) Then
            NodoEsiste = True
            Exit For
        End If
        NodoEsiste = False
    Next i
End Function
----------------------------------------------------------
Private Sub RiempiCboNodoIn3()
CboNodoIn.Refresh
'mi connetto
Call c_DB.Connetti
    With c_DB.Riempicombo("NODI", "NODI")
        Do Until .EOF
            'se trovo il valore che ho cliccato nella cboNodoOut lo aggiungo
altrimenti vado avanti
            If LCase(.Fields("Nodi").Value) = LCase(s_ItemCbo) Then
                'se esiste gia un nodo col valore s_ItemCbo nella colonna
Nodo2 NON lo aggiunge ancora
                'alla combo CboNodoIn
                If Not NodoEsiste(.Fields("NODI").Value) Then
                    CboNodoIn.AddItem .Fields("NoDI").Value & vbNullString
                End If
            End If
        .MoveNext
        Loop
    End With
'mi sconnetto
Call c_DB.Sconnetti
End Sub
-----MODULO-------------------------------------------
Option Explicit
'variabile per il riempimento della lista
Public i_CheckCaricaLista   As Integer
'variabile per il riempimento delle combo
Public i_CheckCaricaCbo   As Integer
'variabile per per il caricamento di determinati item nelle combo
Public s_ItemCbo               As String
-------------------------------------------------------------------
il problema si pone quando dopo aver fatto il 1° inserimento (che avviene
senza contolli) passo al secondo e devo controllare che non venga inserito
un nodo gia presente in lista (sia il nodoin che il nodoout) e che alla fine
della creazione dell'iter prima di poter salvare sia presente il nodo
end(qsto l'ho risolto)
i nodi sono
START
SEGRETERIA
DIREZIONE
UFFICI
END
start ed end non sono modificabili o eliminabili per il resto tutti gli
latri possono essere modificati eliminati e qdi posso anche aggiungerne
altri
per risolvere il problema dei nodi pensavo di inserire una funzione di
verifica prima dell'inserimento in lista
------------Da inserire nell'evento di click del
cmd_Inserisci--------------------------------- 
      If i_CheckCaricaLista = 1 Then
                Call CaricaLista
                Call CreaRettangoli
            Else
'                With list.ListItems.Item(Index)
                    If NodoEsisteinLista = False Then
                        Call CaricaLista
                        Call CreaRettangoli
                    Else
                        Exit Sub
                    End If
'                End With
     End If
-------------------------------------------------------------------------
Private Function NodoEsisteinLista() As Boolean
'funzione che controlla se esistono nodi uguali o ripetuti all'interno della
lista
Dim i As Integer
On Error GoTo hell
    For i = 0 To cboNodoIn.ListCount
        With list.ListItems.Item(i)
                                                                *
            If cboNodoOut.Text = .SubItems(i) And cboNodoIn.Text =
list.ListItems(i).Text Then
                NodoEsisteinLista = True
                Exit For
            End If
        NodoEsisteinLista = False
        End With
    Next i
hell:
    MsgBox Err.Number & Err.Description
    Exit Function
End Function
-------------------------------------------------------------------------
dove c'è l'asterisco mi va sempre in errore
Grazie in anticipo a chi mi aiuterà!Cla

dove c'è l'asterisco mi va sempre in errore
Quale errore?
Nell'attesa di una tua precisazione, noto un paio di cose:
1. Nel dubbio metterei un paio di parentesi in piu', mi pare che l'
And abbia la precedenza sull'uguale, quindi:
	 If (cboNodoOut.Text = .SubItems(i)) And _
		(cboNodoIn.Text = list.ListItems(i).Text) _
		Then
2. Non affidamento sul fatto che fallito il test sul primo confronto
vb non esegua il secondo. A differenza di altri linguaggi, tipo C, C++
e java, vb esegue *sempre* tutti i test messi sulla stessa riga. Non
sara' questo il caso, ma a volte si ricevono degli errori che in altri
linguaggi non si riceverebbero. Diciamo che vb non "cortocircuita" i
test.
-- 
ciao, hal

l'errore me lo da in
   For i = 0 To cboNodoIn.ListCount
        With list.ListItems.Item(i)
                                                                *
            If cboNodoOut.Text = .SubItems(i) And cboNodoIn.Text
=list.ListItems(i).Text Then
                                                                  qui mi da
errore nel dare il valore al .Subitems(i)...la i non ha valore per lui....



Porco cane, e' tanto difficile ottenere numero e descrizione
dell'errore?
-- 
ciao, hal
fa gia' caldo cosi', non farci fare del lavoro extra ;-)

 wrote in message
news:uh1fiv07j2eufo51s...@4ax.com...


35600 index out of bounds
Guarda un po' se i Listitems partono da 0 o da 1...
-- 
ciao, hal

ho trovato era un'enorme cazzata.....bastava cambiare al .subitems(i) la i e
mettere 1....... :-( ....grazie cmq per l'aiuto....