Como agregar una nueva linea (Row) a una Matrix

Buenas tardes, como comente en un Tema anterior (el cual ya lo dí como resuelto gracias a los especialistas del foro), necesito agregar una funcionalidad a mi Matrix que está asociada a un UDO.
Lo que necesito es agregar una linea (row) pero llenar las columnas con unos campos por defecto ya en el código al momento de agregar la línea.
Utilizo el siguiente código para agregar:

If _oMatrix.RowCount = 0 Then
_oMatrix.AddRow()
_oMatrix.AutoResizeColumns()
_oMatrix.Columns.Item(“Col0”).Cells.Item(1).Specific.Value = “T12”
_oMatrix.Columns.Item(“Col1”).Cells.Item(1).Specific.Value = “Vidrio Templado de 12mm”
_oMatrix.Columns.Item(“Col2”).Cells.Item(1).Specific.Value = “5”
_oMatrix.Columns.Item(“Col3”).Cells.Item(1).Specific.Value = “5”
End If

Pero al momento de compilar y tratar de asignar el dato "T12” a mi columna de la matrix que tiene como UniqueID=Col0 ya me salta el siguiente Error: “General Failure”.

Cuál podría ser la razón?

Saludos.
Arturo M.

1 me gusta

Para poder agregar una nueva linea a una Matrix asociada a un DataSource (UDT o UDO) usa el siguiente metodo:

public static void AddLineMatrixDBDataSource(SAPbouiCOM.Matrix oMatrix, SAPbouiCOM.DBDataSource source, string ColumnaFocus = "")
        {
            try
            {
                oMatrix.FlushToDataSource();
                source.InsertRecord(source.Size);
                source.Offset = source.Size - 1;
                oMatrix.LoadFromDataSource();
                oMatrix.SelectRow(source.Size, true, false);
                if (ColumnaFocus.Trim().Length != 0)
                {
                    oEdit = (SAPbouiCOM.EditText)oMatrix.Columns.Item(ColumnaFocus).Cells.Item(source.Size).Specific;
                    oEdit.Active = true;
                    oEdit.Item.Enabled = true;
                }
            }
            catch (Exception) { }
        }

Donde los parametros son:

  • El Objeto Matrix
  • El Objeto DataSource
  • Si quieres que el focus se posicione el determinada celda, el nombre de esta columna.

Esto generalmente se hace en el MenuEvent correspondiente (Click Derecho en la Matrix menu “Agregar Linea”).

Saludos.

4 Me gusta

Que tal @GabrielGS esto me ayuda bastante si quiero agregar esa funcionalidad del click derecho (Por lo que también me sirve y lo voy a utilizar), pero como le asigno ya un valor por defecto cada columna de esa linea?. Para que se entienda mejor, mi matrix de ejemplo posee 4 columnas (Artículo, Descripción, cantidad, cantidad confirmada). Y al agregar la linea me traiga ya estos datos cargados:

(Esos datos de la matrix lo cargue manualmente desde la pantalla del formulario).
Lo que quiero es que ya me traiga precargado, por lo que utilice este código:

Private Function AddRow() As Boolean
        _oMatrix = _Form.Items.Item("matDet").Specific
        If _oMatrix.RowCount = 0 Then
            _oMatrix.AddRow()
            _oMatrix.AutoResizeColumns()
            _oMatrix.Columns.Item("Col0").Cells.Item(1).Specific.Value = "T12"
            _oMatrix.Columns.Item("Col1").Cells.Item(1).Specific.Value = "Vidrio Templado de 12mm"
            _oMatrix.Columns.Item("Col2").Cells.Item(1).Specific.Value = "5"
            _oMatrix.Columns.Item("Col3").Cells.Item(1).Specific.Value = "5"
        End If
        Return True
    End Function

Pero me sale el error que comente de “General Failure”.
Hay otra forma de asignar el valor a cada columna ?

Saludos.

1 me gusta

No los cargues en las celdas de las Matrix, debes asignarlos al DBDataSource asociado a la matrix y luego hacer un oMatrix.LoadFromDataSource para que refleje los datos.

Algo asi:

                SAPbouiCOM.DBDataSource source = oForm.DataSources.DBDataSources.Item("@MI_UDO_MATRIX");

                oMatrix.FlushToDataSource();
                source.Clear();
                source.InsertRecord(source.Size);
                source.Offset = source.Size - 1;
              
                source.SetValue("Col0", 0, "T12");
                source.SetValue("Col1", 0,"Vidrio Templado de 12mm");
                source.SetValue("Col2", 0,"5");
                source.SetValue("Col3", 0, "5");

                oMatrix.LoadFromDataSource();
                
4 Me gusta

Genial @GabrielGS hice un par de modificaciones y me funciono perfecto este segmento de código que me pasaste.
Solucionado!

Muchas gracias por tu ayuda.
Saludos cordiales.

Atte.-
Arturo M.

2 Me gusta

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