Relazione tra due datatables

di Jan il
13 risposte

Ho questo codice, che mette in relazione uno(uffici) a molti (legali) due tabelle in cui non tutti i padri hanno dei figli.
Il risultato è questo : System.ArgumentException: 'Impossibile attivare questo vincolo. Non tutti i valori hanno valori padre corrispondenti.
Ho effettuato delle prove : ho costruito due tabelle in cui ad ogni padre corrispondono uno o più figli. Funziona.
Ho messo -tramite wizard- in relazione due tabelle Access in cui non tutti i padri hanno dei figli. Funziona.
Che cosa c'è di errato nelle mie righe?
Grazie per l'aiuto.

Imports System.Data.OleDb
Public Class Relazioni_dt
    Dim cnn As New OleDbConnection(My.Settings.GestioneUfficiConnectionString)
    Dim da_uffici As New OleDbDataAdapter("Select cu,comune,via ,cap,pr from uffici where sg='UP' order by comune", cnn)
    Dim da_legali As New OleDbDataAdapter("Select cu,ragsoc1,indirizzo,comune,prov,cap from legali order by ragsoc1", cnn)
    Dim dt_uffici As New DataTable("uffici")
    Dim dt_legali As New DataTable("legali")
    Dim ds As New DataSet("MyDataset")
    Dim bs_uffici As New BindingSource
    Dim bs_legali As New BindingSource
    
    Private Sub Relazioni_dt_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        da_uffici.Fill(ds, "uffici")
        da_legali.Fill(ds, "legali")
        dt_uffici = ds.Tables(0)
        dt_legali = ds.Tables(1)
        dgv_Uffici.DataSource = dt_uffici
        dgv_legali.DataSource = dt_legali
        dt_uffici.PrimaryKey = New DataColumn() {dt_uffici.Columns("CU")}


        Dim padre As DataColumn = ds.Tables("uffici").Columns("CU")
        Dim figlio As DataColumn = ds.Tables("legali").Columns("CU")
        Dim relazioneUffici_legali As DataRelation
        relazioneUffici_legali = New DataRelation("Relazione", padre, figlio)

        ds.Relations.Add(relazioneUffici_legali)
        GetData()
    End Sub

    Private Sub GetData()
        Try
            bs_uffici.DataSource = ds
            bs_uffici.DataMember = "Uffici"

            bs_legali.DataSource = bs_uffici
            bs_legali.DataMember = "Relazione"
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class

13 Risposte

  • Prova a dare select *

    17/10/2023 - Jan ha scritto:


    OleDbDataAdapter("Select cu,comune,via ,cap,pr from uffici where sg='UP' order by comune", cnn) 

    Dim da_legali As New OleDbDataAdapter("Select cu,ragsoc1

  • 17/10/2023 - Jan ha scritto:


    Che cosa c'è di errato nelle mie righe?

    Piuttosto, quali sono le differenze rispetto al codice generato tramite il wizard.
    Hai controllato?

  • 17/10/2023 - sihsandrea ha scritto:


    Prova a dare select *

    17/10/2023 - Jan ha scritto:


    OleDbDataAdapter("Select cu,comune,via ,cap,pr from uffici where sg='UP' order by comune", cnn) 

    Dim da_legali As New OleDbDataAdapter("Select cu,ragsoc1

    Grazie,sihsandrea.Purtroppo l'errore è lo stesso!

  • 17/10/2023 - Alka ha scritto:


    Piuttosto, quali sono le differenze rispetto al codice generato tramite il wizard.
    Hai controllato?

    Alka, ottimo suggerimento. Il problema è che non so come fare!!

    Però, non mi arrendo.Ci provo.

    Grazie, Alka. Sempre molto gentile.

  • 18/10/2023 - Jan ha scritto:


    Alka, ottimo suggerimento. Il problema è che non so come fare!!

    Una volta che hai utilizzato il wizard, potrai visualizzare quello che è stato generato a livello di codice, giusto? :)

    Voglio dire, che cosa produce quel wizard: componenti? codice e basta? entrambi?

    Il mio sospetto è che il wizard scriva un codice diverso da quello atteso rilevando le problematiche tra record padre e figlio nelle tabelle coinvolte.

  • 17/10/2023 - Jan ha scritto:


    Dim padre As DataColumn = ds.Tables("uffici").Columns("CU") 

    Dim figlio As DataColumn = ds.Tables("legali").Columns("CU")

    Ciao,

    domanda: le due colonne "CU" delle rispettive tabelle, sono entrambe Primary Key  ? 

    In tal caso l'errore sarebbe corretto… "non sarebbe possibile avere vaori null" 

  • Rileggendo la tua formulazione, mi è sorto un dubbio su questa parte:

    17/10/2023 - Jan ha scritto:


    Il risultato è questo : System.ArgumentException: 'Impossibile attivare questo vincolo. Non tutti i valori hanno valori padre corrispondenti.
    Ho effettuato delle prove : ho costruito due tabelle in cui ad ogni padre corrispondono uno o più figli. Funziona.
    Ho messo -tramite wizard- in relazione due tabelle Access in cui non tutti i padri hanno dei figli. Funziona.

    Tu dici di aver messo in relazione tabelle tramite wizard in cui “non tutti i padri hanno dei figli”, ma l'errore dice che vi sono “valori figli senza valori padre”, che è una condizione diversa mi pare.

    Più che il codice, io ricontrollerei lo stato dei dati per ogni casistica, in quanto se è diverso, è normale che anche il comportamento dell'applicazione e il codice sottostante produca risultati differenti.

    Rivedi la questione perché sicuramente c'è qualcosa che non va.

  • 18/10/2023 - By65Franco ha scritto:


    17/10/2023 - Jan ha scritto:


    Dim padre As DataColumn = ds.Tables("uffici").Columns("CU") 

    Dim figlio As DataColumn = ds.Tables("legali").Columns("CU")

    Ciao,

    domanda: le due colonne "CU" delle rispettive tabelle, sono entrambe Primary Key  ? 

    In tal caso l'errore sarebbe corretto… "non sarebbe possibile avere vaori null" 

    Ciao By65Franco. Piacere rincontrarti.

    Nessuno delle delle tabelle Access hanno CU come PrimaryKey. 

    La CU è definita chiave primaria nella datatable per la relazione.

  • 18/10/2023 - Jan ha scritto:


    Nessuno delle delle tabelle Access hanno CU come PrimaryKey. 

    La CU è definita chiave primaria nella datatable per la relazione.

    Ciao,

    puoi far vedere lo uno schema delle due tabelle con le chiavi primarie PK e chiavi esterne FK ? 

    Posto che generalmente, al fine di stabilire una relazione, occorre una chiave esterna, sarebbe interessante capire come sono strutturate le due tabelle.

  • La tabella padre ha indice cu

    La tabella figlio ha indice cu

    La fk che aggancia l'indice cu del padre?

    Tu stai creando con wiz una relazione 1 a 1 con cu padre e cu figlio

    Finché hai un padre senza figlio va bene

    Appena hai un figlio senza padre ricevi l'errore

    Per questo ti chiedevo di usare * magari qualche campo che non importi.

  • 18/10/2023 - Alka ha scritto:


    Tu dici di aver messo in relazione tabelle tramite wizard in cui “non tutti i padri hanno dei figli”, ma l'errore dice che vi sono “valori figli senza valori padre”, che è una condizione diversa mi pare.

    Più che il codice, io ricontrollerei lo stato dei dati per ogni casistica, in quanto se è diverso, è normale che anche il comportamento dell'applicazione e il codice sottostante produca risultati differenti.

    Rivedi la questione perché sicuramente c'è qualcosa che non va.

    [RISOLTO] Alka, la tua intuizione è stata fondamentale! Ho fatto una query ed ho scoperto che due figli non avevano il corrispondente padre! Per qualche strano motivo devo aver cancellato il padre, perchè è impossibile caricare figli senza indicare il padre.

    Grazie e … complimenti.

    PS:il wizart non restituisce alcun errore pur se i figli non hanno padre.

  • Grazie anche a ByFranco65 e  sihsandrea per il contributo apportato.

  • Lo comunico perchè potrebbe essere “indispensabile” per chi abbia necessità di creare relazione tra due datatables : correggere le seguenti righe del codice come segue :

            corregere :
            dgv_Uffici.DataSource = dt_uffici
            dgv_legali.DataSource = dt_legali
            
            in :
            dgv_Uffici.DataSource = bs_uffici
            dgv_legali.DataSource = bs_legali
Devi accedere o registrarti per scrivere nel forum
13 risposte