Relazione tra due datatables

di il
13 risposte

Relazione tra due datatables

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

  • Re: Relazione tra due datatables

    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

  • Re: Relazione tra due datatables

    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?

  • Re: Relazione tra due datatables

    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!

  • Re: Relazione tra due datatables

    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.

  • Re: Relazione tra due datatables

    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.

  • Re: Relazione tra due datatables

    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" 

  • Re: Relazione tra due datatables

    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.

  • Re: Relazione tra due datatables

    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.

  • Re: Relazione tra due datatables

    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.

  • Re: Relazione tra due datatables

    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.

  • Re: Relazione tra due datatables

    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.

  • Re: Relazione tra due datatables

    Grazie anche a ByFranco65 e  sihsandrea per il contributo apportato.

  • Re: Relazione tra due datatables

    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