Como Agregar/modif/eliminadar datos a un DataTable

hola estimados,
bueno quisiera preguntarles como tengo una matrix que se llena con un datable de esta manera:

public void Start()
        {
            string dataTableId = "my_data";
            
          
            // add a data table to the form
            var dataTable = oForm.DataSources.DataTables.Add(dataTableId);

            // add a matrix to the form
            Matrix1 = (SAPbouiCOM.Matrix)oForm.Items.Add(dataTableId, SAPbouiCOM.BoFormItemTypes.it_MATRIX).Specific;
            Matrix1.Item.Width = 700;
            Matrix1.Item.Height = 300;


            // get some data
            //string sql = @"SELECT ""CardCode"", ""CardName"" FROM ""OCRD"" ";
            string sql = @"SELECT ""U_CodigoEDC"", ""U_NombreEDC"",""U_ProyectoEDC"" FROM ""@EDICIONESCOL""  ";
          //  oApp.SetStatusBarMessage("codigo: " + sql);
            dataTable.ExecuteQuery(sql);

            var columns = Matrix1.Columns;

            // create columns
            columns.Add("#", SAPbouiCOM.BoFormItemTypes.it_EDIT);
            columns.Add("Codigo", SAPbouiCOM.BoFormItemTypes.it_EDIT);
            columns.Add("Nombre", SAPbouiCOM.BoFormItemTypes.it_EDIT);
            columns.Add("Proyecto", SAPbouiCOM.BoFormItemTypes.it_EDIT);

            // setup columns
            columns.Item("#").TitleObject.Caption = "#";
            columns.Item("Codigo").TitleObject.Caption = "Código";
            columns.Item("Nombre").TitleObject.Caption = "Nombre";
            columns.Item("Proyecto").TitleObject.Caption = "Proyecto";

            //bind columns to data
            columns.Item("Codigo").DataBind.Bind(dataTableId, "U_CodigoEDC");
            columns.Item("Nombre").DataBind.Bind(dataTableId, "U_NombreEDC");
            columns.Item("Proyecto").DataBind.Bind(dataTableId, "U_ProyectoEDC");

            // load the data into the rows
            Matrix1.LoadFromDataSource();
            Matrix1.AutoResizeColumns();

            // show form on screen
            oForm.Visible = true;
        }

estos tienes la opción con evento de agregar o eliminar lineas, pero los hace sin eliminar o agregar a la base de datos, esta esta en program.cs en el evento donde agregar o elimina daros queria saber si esa linea esta bien cuando se llena con un datatable?
AddLineMatrixDBDataSource(((SAPbouiCOM.Matrix)oForm.Items.Item("my_data").Specific), oForm.DataSources.DBDataSources.Item("@EDICIONESCOL"), "U_CodigoEDC");

lo otro para poder por ejemplo modificar celda por celda como se haria?
tomo el ejemplo la matrix que se usa en paises que es asi:


entonces al seleccionar una cambia el botón a actualizar y ademas se puede actualizar en la BD.

y la ultima consulta es posible o es mejor hacer con una grilla en vez de una matrix?

muchas gracias expertos.
saludos

1 me gusta

Hola! :upside_down_face:

Puedes usar un Grid, que es mas rapido y dinamico (No debes crear las columnas una por una, solo con asignarle un DataTable), el Grid refleja los datos del DT tal cual. Solo deberas agregarle el formato a cada columna despues de llanarlo (Alineacion, Edicion, Color, Tipo de Celda , Etc.). En un Grid, al modificar el DT asociado, automaticamente se reflejaran los cambios.

En una Matrix, primero debes construir toda la estructura y luego asignar a cada columna cada campo de su respectivo DataSorce (Sea un DBDS, DT o RS). En una Matrix, al modificar el DataSource asociado, deberas hacer un Flush y un Load para poder ver los cambios.

En resumen, cada control tiene sus metodos y formas de trabajar.

Respecto al DataTable, para agregar una nueva linea debe hacer lo siguiente:

     SAPbouiCOM.DataTable DT_GRID = oForm.DataSources.DataTables.Item("DT_GRID");
     DT_GRID.Rows.Add(); // Agregar una nueva linea
     int lastRowIndex = DT_GRID.Rows.Count - 1;
     DT_GRID.SetValue("Column Name1", lastRowIndex, value); //Asignamos valor a una celda de un nuevo registro
     DT_GRID.SetValue("Column Name2", lastRowIndex, value); //Asignamos valor a una celda de un nuevo registro
     DT_GRID.SetValue("Column Name3", lastRowIndex, value); //Asignamos valor a una celda de un nuevo registro

Para Eliminar un registro de un DataTable:

     SAPbouiCOM.DataTable DT_GRID = oForm.DataSources.DataTables.Item("DT_GRID");
     DT_GRID.Rows.Remove(NumeroRow); // Borrar un Registro

En vez de usar “DT_GRID”, tambien puedes referenciar directamente el DataTable del grid asi:

     grid.DataTable.Rows.Add();
     int lastRowIndex = grid.DataTable.Rows.Count - 1;
     grid.DataTable.SetValue("Column Name", lastRowIndex, value);

Saludos.

4 Me gusta

Hola Gabriel:
esto que me dices va de la mano con los eventos no?
por ejemplo cuando tu me mandaste la vez pasada el agregar y eliminar
AddLineMatrixDBDataSource(((SAPbouiCOM.Matrix)oForm.Items.Item("my_data").Specific), oForm.DataSources.DBDataSources.Item("@EDICIONESCOL"), "U_CodigoEDC");

y lo otro para poder modificar cada celda y se actualice también deberia hacerse con evento no?
muchas infinitas gracias de nuevo xd

1 me gusta

Si, debes sustituir AddLineMatrixDBDataSource y el Eliminar que estaban anteriormente porque ese codigo es para usarlo con un DBDataSource, cuando usas un DataTable debes usar el codigo que acabo de postear.

Para actualizar cada celda, solo deberas escribir sobre ella y automaticamente se refleja en el DataTable y viceversa.

Para luego registrar o actulizar los datos del DataTable con la Base de Datos, alli si debes hacer un proceso que recorrar el DataTable y por medio de la DI API vaya asignando los valores a la Tabla respectiva.

1 me gusta

seria algo asi?

 case "Colaboradores_3.edicionesgr":
                        switch (pVal.MenuUID)//1292
                        {
                            case "1292"://Agregar Linea Matrix
                                if (pVal.BeforeAction == true)
                                {
                                    switch (ItemActiveMenu)
                                    {
                                          
                                        case "grilaedi":
                                            SAPbouiCOM.DataTable DT_GRID = oForm.DataSources.DataTables.Item("dted");
                                             DT_GRID.Rows.Add(); // Agregar una nueva linea
                                             int lastRowIndex = DT_GRID.Rows.Count - 1;
                                             DT_GRID.SetValue("Código", lastRowIndex, "código"); //Asignamos valor a una celda de un nuevo registro
                                             DT_GRID.SetValue("Nombre", lastRowIndex, "Nombre"); //Asignamos valor a una celda de un nuevo registro
                                             DT_GRID.SetValue("Proyecto", lastRowIndex, "Proyecto"); //Asignamos valor a una celda de un nuevo registro
                                             DT_GRID.SetValue("Nombre Proyecto", lastRowIndex, "[Nombre Proyecto]"); //Asignamos valor a una celda de un nuevo registro

                                            break;
                                    }í

en el datatable ocupdo as codigo por eso los llamo en el value estara bien? gracias

1 me gusta

La linea DataTable.SetValue("Column Name", lastRowIndex, value); asigna el valor value a la celda respectiva, es decir: (para asignar el valor 12345.65 a la celda “MI Campo Numerico”)

DT_GRID.SetValue("MI Campo Numerico", lastRowIndex, 12345.65);

Si quieres que toda la linea se agregue en blanco no uses el SetValue solo el DataTable.Add()

1 me gusta

muchas gracias, pero para que esto se guarde o se elimine de la base de datos? ya que me agrega o elimina y visualmente se ve, pero cuando refresco vuelven los mismos datos.
he intentado de mas maneras, pero no logro que me agregue , acuatice por celda o elimine en la tabla UDT :frowning:

Hola @Esteban_P! :crazy_face:

Como te comente anteriormente, este codigo es para actualizar un DataTable, este objeto no tiene relacion con las tablas de la BD, el Grid solo puede trabajar con una DataTable, no con un DBDataSource, si quieres hacer alguna operacion hacia una tabla, tienes 2 opciones:

  1. Recorrer el DataTable e ir insertando y/o modificando mediando la DI-API la tabla correspondiente de la DB, bien sea una Table System, UDT o UDO (Puedes validar que cuando exista un cambio en el grid, se active la opcion “Actualizar”).
  2. Usar una Matrix y asociarle a las columnas un DBDataSource y que el Form este en Modo AutoManaged, con esto, el sistema se encarga de gestionar el CRUD de la pantalla.

Saludos. :vulcan_salute:

1 me gusta

vale pienso que lo mas factible seria lo primero, hare la pregunta por el foro,pero otra para no desordenar, muchas gracias!!

1 me gusta

y con la matrix solo en el colleaction se le dice que venga de un datasource y el campo, y con eso podria actualizarce mediante el sistema?

1 me gusta

No, tambien deberas colocar el form como AutoManaged = true y asignar la propiedad DatBrowser y ObjectType respectivas.

1 me gusta

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.