Org Chart Constraints error

6 posts, 0 answers
  1. Giacomo
    Giacomo avatar
    3 posts
    Member since:
    Jul 2018

    Posted 30 Dec 2018 Link to this post

    Hi,

    we're trying to build an org chart, but we're getting the "Unable to activate this constraint. Not all values have corresponding parent values." error.

    This is the code:

    • aspx:
    • <%@ Page Title="" Language="C#" AutoEventWireup="true" CodeBehind="Prova.aspx.cs" Inherits="TelerikOrgChart.Prova" %>
      <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
       
      <html>
          <head>
              <meta name="viewport" content="width=device-width" />
              <title>Prova</title>
          </head>
          <body>
              <form id="form1" runat="server">
                  <telerik:RadScriptManager runat="server" ID="RadScriptManager1"></telerik:RadScriptManager>
                  <telerik:RadOrgChart ID="RadOrgChart1" runat="server" Skin="Windows7" GroupColumnCount="1"></telerik:RadOrgChart>
                   
              </form>
          </body>
      </html>
    • aspx.cs:
    • using System;
      using System.Collections.Generic;
      using System.Data;
      using System.Data.Entity;
      using System.Linq;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      using OrgChartSice.Data;
       
      namespace TelerikOrgChart
      {
          public partial class Prova : System.Web.UI.Page
          {
              private DataTable teams;
              private DataTable employees;
              protected void Page_Load(object sender, EventArgs e)
              {
                  OrgChartSiceDbContext orgChartSiceDbContext = new OrgChartSiceDbContext();
       
                  var data = orgChartSiceDbContext.dbvw_HRZU_Organigramma_Azienda_Teste.ToList();
                  var teamList = data
                      .Select(c => new { c.IDBOX, c.IDBOXFATHER, c.DSBOX })
                      .Distinct().ToList();
       
                  var employeeList = data
                      .Select(c => new { c.IDSUBJECT, c.IDBOX, c.NOMINATIVO })
                      .Distinct().ToList();
       
                  CreateTeams(teamList);
       
                  CreateEmployees(employeeList);
       
                  RadOrgChart1.GroupEnabledBinding.NodeBindingSettings.DataFieldID = "TeamID";
                  RadOrgChart1.GroupEnabledBinding.NodeBindingSettings.DataFieldParentID = "ReportsTo";
                  RadOrgChart1.RenderedFields.NodeFields.Add(new Telerik.Web.UI.OrgChartRenderedField() { DataField = "Team" });
                  RadOrgChart1.GroupEnabledBinding.NodeBindingSettings.DataSource = teams;
       
                  RadOrgChart1.GroupEnabledBinding.GroupItemBindingSettings.DataFieldID = "EmployeeID";
                  RadOrgChart1.GroupEnabledBinding.GroupItemBindingSettings.DataFieldNodeID = "TeamID";
                  RadOrgChart1.GroupEnabledBinding.GroupItemBindingSettings.DataTextField = "Name";
       
                  RadOrgChart1.GroupEnabledBinding.GroupItemBindingSettings.DataSource = employees;
                   
                  RadOrgChart1.DataBind();
                   
              }
       
              private void CreateEmployees(IEnumerable<dynamic> data)
              {
                  employees = new DataTable();
                  employees.Columns.Add("EmployeeID");
                  employees.Columns.Add("TeamID");
                  employees.Columns.Add("Name");
                  //employees.Columns.Add("ImageUrl");
                  foreach (var item in data)
                      employees.Rows.Add(new string[] { item.IDSUBJECT, item.IDBOX, item.NOMINATIVO });
              }
       
              private void CreateTeams(IEnumerable<dynamic> data)
              {
                  teams = new DataTable();
                  teams.Columns.Add("TeamID");
                  teams.Columns.Add("ReportsTo");
                  teams.Columns["ReportsTo"].AllowDBNull = true;
                  teams.Columns.Add("Team");
                  foreach (var item in data)
                      teams.Rows.Add(new string[] { item.IDBOX, item.IDBOXFATHER == item.IDBOX ? null : item.IDBOXFATHER, item.DSBOX });
              }
          }
      }
    • teams table:
    • Team ID Reports To Team
      0000000520 NULL Consiglio di Amministrazione
      0000000521 0000000520 Amministrazione
      0000000522 0000000521 Contabilità
      0000000523 0000000521 Risorse Umane
      0000000524 0000000521 Legale
      0000000525 0000000522 Ciclo Attivo
      0000000526 0000000522 Ciclo Passivo
      0000000527 0000000522 Tesoreria
      0000000530 0000000521 Ufficio IT
      0000000541 0000000522 Fiscale
      0000000542 0000000523 Rilevazione Presenze
      0000000543 0000000523 Gestione Appalti
      0000000544 0000000521 Controllo Gestione
      0000000546 0000000520 Commerciale
      0000000547 0000000546 Gestione Acquisti
      0000000554 0000000544 Controllo Produzione e Commesse
      0000000558 0000000544 Programmazione Commesse
      0000000561 0000000523 Paghe e Contributi
      0000000562 0000000547 Viaggi
      0000000563 0000000546 Preventivi
      0000000564 0000000547 Acquisti Commerciali
      0000000566 0000000547 Acquisti Magazzino e Accettazione Merci e Attrezzature
      0000000571 0000000580 Magazzino Merci
      0000000572 0000000571 Ricezione Merci
      0000000573 0000000580 Magazzino Attrezzature
      0000000574 0000000571 Imballaggio
      0000000575 0000000571 Magazzino Costruzioni
      0000000576 0000000571 Magazzino Ferramenta
      0000000577 0000000546 Logistica
      0000000578 0000000577 Trasporti
      0000000579 0000000578 Trasporti Esterni
      0000000580 0000000577 Magazzino
      0000000581 0000000578 Trasporti Interni
      0000000582 0000000578 Trasporti e Magazzino Francia
      0000000583 0000000563 Preventivi Arredi
      0000000584 0000000563 Preventivi Costruzioni
      0000000585 0000000520 Tecnica
      0000000586 0000000585 Gestione Commesse
      0000000587 0000000586 PM Commesse Arredi
      0000000588 0000000586 PM Commesse Costruzioni
      0000000589 0000000586 Manutenzioni Commesse
      0000000590 0000000585 Cantieri
      0000000591 0000000590 Cantieri Costruzioni
      0000000592 0000000591 Gestione Cantieri Costruzioni
      0000000593 0000000592 Coordinamento Cantiere
      0000000594 0000000592 Contabilità
      0000000595 0000000591 Produzione Cantiere Costruzioni
      0000000596 0000000595 Carpenteria Edile
      0000000597 0000000595 Cartongessi
      0000000598 0000000595 Gessi
      0000000599 0000000595 Imbiancatura
      0000000600 0000000595 Muratura
      0000000601 0000000585 Produzione
      0000000605 0000000601 Produzione Arredi
      0000000606 0000000605 Produzione Carpenteria Leggera
      0000000607 0000000605 Produzione Acciai
      0000000608 0000000605 Produzione Falegnameria
      0000000609 0000000605 Produzione Finiture
      0000000610 0000000609 Decorazioni
      0000000611 0000000609 Verniciatura
      0000000612 0000000605 Produzione Marmi e Vetro
      0000000613 0000000605 Progettazione Prd Arredi
      0000000614 0000000613 Gestione Commesse di Produzione
      0000000615 0000000613 Progettazione di Produzione ACL
      0000000616 0000000613 Progettazione di Produzione LG
      0000000617 0000000601 Produzione Costruzioni
      0000000618 0000000617 Produzione Carpenteria Pesante
      0000000619 0000000585 Progettazione
      0000000620 0000000619 Progettazione Arredi
      0000000621 0000000620 Progettazione Carpenteria Leggera
      0000000622 0000000620 Progettazione Legno Acciaio
      0000000623 0000000619 Progettazione Costruzioni
      0000000624 0000000623 Progettazione Carpenteria Pesante
      0000000625 0000000623 Progettazione Edile
      0000000626 0000000520 Servizi Generali
      0000000627 0000000626 Servizi
      0000000628 0000000627 Centralino
      0000000629 0000000627 Manutenzione Immobili Impianti e Attrezzature
      0000000630 0000000629 Pulizie
      0000000631 0000000627 Ristorante Dopolavoro
      0000000632 0000000626 Sicurezza
      0000000633 0000000632 Sicurezza Cantieri e Stabilimento
      0000000635 0000000632 Formazione
      0000000636 0000000632 Ambiente
      0000000637 0000000595 Montaggi Carpenteria
      0000000638 0000000629 Gestione Impianti e Attrezzature
      0000000640 0000000588 Gestione Personale Cantieri Costruzione
      0000000641 0000000581 Trasporti Costruzioni
      0000000642 0000000581 Trasporti Arredi
      0000000644 0000000590 Cantieri Arredi
      0000000646 0000000645 Coordinamento Montaggio Arredi
      0000000647 0000000645 Montaggi Arredi
      0000000648 0000000627 Immagine e Comunicazione

    This is the stack error:

    System.Data.ConstraintCollection.AddForeignKeyConstraint(ForeignKeyConstraint constraint) +2097678
       System.Data.ConstraintCollection.Add(Constraint constraint, Boolean addUniqueWhenAddingForeign) +371
       System.Data.DataSetRelationCollection.AddCore(DataRelation relation) +929
       System.Data.DataRelationCollection.Add(DataRelation relation) +159
       System.Data.DataRelationCollection.Add(DataColumn parentColumn, DataColumn childColumn) +45
       Telerik.Web.UI.ControlDataBinder.BindToDataTable(DataTable table, String dataFieldID, String dataFieldParentID) +104
       Telerik.Web.UI.OrgChartNodeBinder.PerformDataBinding(IEnumerable data) +242
       System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +128
       System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +34
       System.Web.UI.WebControls.DataBoundControl.PerformSelect() +143
       System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74
       Telerik.Web.UI.OrgChartNodeBinder.SimpleBindingProcedure() +13
       Telerik.Web.UI.OrgChartNodeBinder.GroupEnabledBindingProcedure() +168
       Telerik.Web.UI.OrgChartNodeBinder.DataBind() +64
       Telerik.Web.UI.RadOrgChart.DataBind() +95
       TelerikOrgChart.Prova.Page_Load(Object sender, EventArgs e) in C:\MEGA\Projects\OrgChartSice\TelerikOrgChart\Prova.aspx.cs:55
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
       System.Web.UI.Control.OnLoad(EventArgs e) +95
       System.Web.UI.Control.LoadRecursive() +59
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +678
  2. Marin Bratanov
    Admin
    Marin Bratanov avatar
    4712 posts

    Posted 02 Jan Link to this post

    Hi Giacomo,

    This error, coming from the .NET binding, indicates that there is an issue with the parent relationships. For example, the actual data object that is given the org chart does not have any nodes with a null parent ID (even though you have NULL in the database, it is possible that the .NET object has something like "NULL"). Another common issue is that there is a row whose ParentID does not exist in any row's ID field.

    I am attaching here an example I made based on the provided code which seems to work fine for me. I advise that you compare to it and see what is the difference causing the issue. You could, for example trim the actual data to only a few rows and if the issue is gone, start expanding the used subset until the issue manifests, so you can see which row causes the problem and what it is.


    Regards,
    Marin Bratanov
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
  3. Giacomo
    Giacomo avatar
    3 posts
    Member since:
    Jul 2018

    Posted 02 Jan in reply to Marin Bratanov Link to this post

    Hi Marin,

    thanks for the reply and happy new year.

    I found the problem, we have some child nodes ID that are less than their parent.

    This is an example:

    IDBOX     IDBOXFATHER    DSBOX

    0000000564 0000000547 Acquisti Commerciali
    0000000566 0000000547 Acquisti Magazzino e Accettazione Merci e Attrezzature
    0000000571 0000000580 Magazzino Merci
    0000000572 0000000571 Ricezione Merci
    0000000573 0000000580 Magazzino Attrezzature
    0000000574 0000000571 Imballaggio
    0000000575 0000000571 Magazzino Costruzioni
    0000000576 0000000571 Magazzino Ferramenta
    0000000577 0000000546 Logistica
    0000000578 0000000577 Trasporti
    0000000579 0000000578 Trasporti Esterni
    0000000580 0000000577 Magazzino

    Is there a way to avoid this ordering problem without modify the database?

    I have the same problem also ordering by ParentID (IDBOXFATHER)

  4. Marin Bratanov
    Admin
    Marin Bratanov avatar
    4712 posts

    Posted 02 Jan Link to this post

    Hello Giacomo,

    It is good to hear we know the reason for the issue. I am sorry to say, however, that I am not aware of ways to avoid such an issue since it comes down to the .NET data binding logic and we can't influence that unless an entirely custom implementation is made, which does not seem likely considering that it already exists in the framework.


    Regards,
    Marin Bratanov
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
  5. Giacomo
    Giacomo avatar
    3 posts
    Member since:
    Jul 2018

    Posted 08 Jan in reply to Marin Bratanov Link to this post

    Hello,

    The field IDBOX in the view is a table used in many org charts, so we can't change them from the source.

    I should order the view in a different way, or change the IDs in the view, but if someone change the org chart in the future is a problem.

    Any ideas on how to solve this?

     

    Thanks

     

  6. Marin Bratanov
    Admin
    Marin Bratanov avatar
    4712 posts

    Posted 08 Jan Link to this post

    Hi Giacomo,

    The error comes from the .NET data binding logic and I simply cannot say what are the exact requirements or issues that one may face depending on the values. Usually the error means that data in the child data cannot find its parent. I do hope you will be able to find the data issue that is causing this and remove it.


    Regards,
    Marin Bratanov
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Back to Top