Eliminar fila de un grid con Menu Item ID 1283

estimados,

mi consultas son , la primera es que quería saber cual es la diferencia entre el codigo 1293 y el 1283, se que el 1293 es eliminar row y el el otro sale como &Remove

MENU ID

h_tps://wiki.scn.sap.com/wiki/display/B1/SAP+Business+One+Objects+ID+and+Menu+ID+List

la segunda ,quiero agregarlo a mi grilla, ya lo hice con el evento menu event e item id pero quiero eliminar una o mas filas despues de eso que el boton cambie a actualizar y de allí recién elimine, ya que con el 1293 consigo que se elimine la linea directo, es decir que antes de presionar el botón actualizar este ya lo elimino.
cualquier tips o información sera agradecido.

muchos saludos!

Hola :grin:

La diferencia radica en el tipo de pantalla que estes utilizado:

  • Si usas un form con cabecera y detalle de tipo documento o maestro, el menu 1283 sirve para borra un registro, campleto, es decir los datos de la cabecera y todos sus detalles asociados, y si en esta pantalla se usa el menu 1293, es para borrar una sola linea.
  • En los form tipo Matrix ,que unicamente son un Grid que asociado a una tabla unica, como la pantallas de definiciones (‘Proyectos’,‘Indices’, ‘Monedas’,etc), por defecto SAP activa unicamente el menu 1283, para borrar una linea.

Respecto a los segundo, si el form se gestiona automaticamente, primero debe borrar la linea visualmente e inmediatamente y cambiar el mode a UPDATE, y solo si se actualiza debe actualizar la BD.
Si quieres eliminar varias filas a la vez, deberas activar el menu correspondiente, y en el MENU_EVENT con el BeforeAction = true hacer un BubbleEvent = False, para detener cualquier accion automatica de SAP sobre esa pantalla, luego puedes hacer la accion que desees, en tu caso algo asi.

  • Crear un DataTable donde guardarias los pVal.Row que vas a eliminar (o el campo Code como mejor te parezca), este se cargaria cada vez que se seleccione eliminar una fila.
  • Cuando se seleccione eliminar, puedes cambiar el color de toda la fila para que el usuario pueda var cuales va a borrar.
  • Deberas cambiar el estado del form a Update o el caption del boton correspondiente.
  • Al presionar el boton actualizar, deberas recorrer el DataTable creado en el primer punto para ver cuales registro vas a borrar y luego con la DIAPI proceder a eliminarlos de la BD, luego deberas borrar estos registros de DataTable del Grid (O del DataSource si es una Matrix) y refrescarla para que muestre solo los datos activos (O le haces una recarga desde la BD).

Saludos. :vulcan_salute:

3 Me gusta

Gracias Gabriel, entiendo muy bien, te quería consultar para borrar solo visualmente de la grid, ya que comenzare a hacer lo que me dijiste desde el menu event, mas que nada obtiene ya el valor del code, y con esto hare el dt para ir agregando los que se va a eliminar, luego obtener los valor en el boton update, y con eso poder eliminarlos de la bd en si.
entonces estaría bien trabajado asi? me era mas facil el 1293 lo tenia eliminando ya, pero no le gusto a mi jefe jeje, asi que eso tratare de emular lo mismo que sap, tal cual.
muchas gracias

 private void SBO_Application_MenuEvent(ref SAPbouiCOM.MenuEvent pVal, out bool BubbleEvent)
        {
            BubbleEvent = true;

            try
            {
                oForm = Application.SBO_Application.Forms.ActiveForm;
                switch (oForm.TypeEx)
                {
                    case "Colaboradores_3.suprasec":
                        switch (pVal.MenuUID)
                        {
                            case "1283":
                                if (pVal.BeforeAction == true)
                                {
                                    switch (ItemActiveMenu)//obtengo la grilla en el menu actual
                                    {
                                        case "GRSPSEC":
                                         int nRow = Grid0.Rows.SelectedRows.Item(0, SAPbouiCOM.BoOrderType.ot_RowOrder);
                                         CodElmin= Convert.ToString(Grid0.DataTable.GetValue("CODE", nRow));
                                        
                                        
                                            oForm.Mode = SAPbouiCOM.BoFormMode.fm_UPDATE_MODE;
                                         
                                            break;

                                    }
                                }
                                break;
                        }
                        break;
                }
            }
            catch { }

Para eliminar la fila visualmente del Grid lo que debes hacer DESPUES de Cargar la variable CodElmin es :

     Grid0.DataTable.Rows.Remove(Grid0.GetDataTableRowIndex(nRow))

Con eso se elimina visualmente el row del grid y luego con el dato guardado en CodElmin lo eliminas de la DB.

Saludos.

1 me gusta

Gracias Gabriel, habia estado haciendo otras modificaciones y volví a esto, para poder copiar a otra dt por el CODE tendria que usar un datarows?

      oForm.DataSources.DataTables.Add("ElimDtos");

            ((SAPbouiCOM.Grid)(oForm.Items.Item("GRIDELIM").Specific)).DataTable = oForm.DataSources.DataTables.Item("ElimDtos");

            LlenarDT = oForm.DataSources.DataTables.Item("ElimDtos");
            LlenarDT.Columns.Add("Elim", SAPbouiCOM.BoFieldsType.ft_AlphaNumeric, 50);

solo para probar cree otra grilla para ver que se agreguen los otros campos pero me da error al agregarlos, por esto cual seria el mejormodo de agregarlo, es muy facil obtener con esto:

 CodElmin= Convert.ToInt32(Grid0.DataTable.GetValue("CODE", nRow));

el código a eliminar, pero ir guardando esto seria hacer un for en la grid0 y guardarlos en una variable que se vaya llenado con el getvalue.

o que seria mejor para poder hacer en este caso de agregar en otra DT?.
ya lo de eliminar lo tengo listo, pero me faltaría ese paso, ojala pudieras ayudarme.
muchas gracias

Hola :grin:

Puedes copiar el contenido de un DataTable en otro con la siguiente funcion:

    SAPbouiCOM.DataTable DT_Copia ; //CREACION DE DT PARA COPIA
    DT_Copia.CopyFrom(DT_GRID); //SE CREA UNA COPIA DE DT_GRID EN DT_COPIA

Con esto puedes manipular la copia como quieras y luego adignarla al Grid.

Saludos :vulcan_salute:

2 Me gusta

Hola Gabriel, gracias por responder, osea si puedo copiar todo el contenido, pero solo para agregar los que voy a eliminar , tendria que copiar en el momento de que fuera a eliminar? y luego en el boton update eliminar en ambas dt?
gracias

Si, al final es mas rapido copiar y eliminar los registros correspondientes en ambos DataTables, no existe una forma directa de copiar un Row completo de un DT a otro. (Para insertar un registro en el DT, se hace un Row.Add() y luego se deben asignar por medio del SetValue() cada campo, lo cual no es muy optimo).

Saludos.

1 me gusta

Gabriel gracias por todo, me sirivo de mucho lo que me dijiste, al final cree una lista que me guarda todos los valores y después lo recorro y los voy eliminado, muchas gracias!

   private List<int> listElims = new List<int>();
       for (int i = 1; i <= this.Grid0.DataTable.Rows.Count; i += 1)
                                        {

                                            if (i == this.Grid0.DataTable.Rows.Count)
                                            {
                                                CodElmin = Convert.ToInt32(Grid0.DataTable.GetValue("CODE", nRow));

                                                listElims.Add(CodElmin);
                                            }

                                                   
                                         }

saludos!

1 me gusta

Perfecto, asi es mucho mejor!

Los objetos Inumerables de .net son mas adecuado para esto. :grin: yo amo LINQ, lastima que no se pueda aplicar directamente a los objetos de la UI API.

1 me gusta

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