Actu. el form con datos nuevos después el update

csharp
Etiquetas: #<Tag:0x00007f542e24dae0>

#1

hola estimados,
tengo un formulario el cual esta con automanaged = true y bueno los datos se actualizand, eliminan y agregan casi automáticamente.
Tengo una grilla que es el de los métodos de pagos, el cual obtiene un valor y actualiza el campo pymcode del OCRD, cuando actualizo esto hago que el caption de mi button se ponga en update, pero apenas lo presiona actualiza y se cierra…

Cómo puedo actualizar el formulario con nuevos valores una vez actualizado. o hay un evento, que puedo manejar en código, que ocurre después de que se completa el evento de actualización?

muchas gracias!


#2

Hola :grin:

Cuando quieras cambiar el “Estado” del form, debes hacerlo cambiando la propiedad “Mode” del formulario, es decir es vez de cambiar el caption del button, debes modificar el Mode del Form, esto asignara el caption del boton “1” (“Crear”,“Actualizar”,“OK”) de acuerdo al modo seleccionado (fm_UPDATE_MODE, fm_ADD_MODE,fm_OK_MODE,fm_FIND_MODE, ect).

oForm.Mode = SAPbouiCOM.BoFormMode.fm_UPDATE_MODE; // Coloca en Modo Actualizar y Cambia el caption del boton de forma automatica

Saludos :vulcan_salute:


#3

Hola Gabriel, feliz año ejeje, si entiendo eso, como me habias dicho anteriomente utilizo el automanaged, entonces solo cambio los captiony ya he logrado entender ya mucho el funcionamiento de eventos y tambien de las grillas en sap, ahora logro hacer la busqueda, luego actualizar la grilla, pero al momento de colocar actualizar se cierra la ventana, si guarda pero quiero que se refresque y quede como ok, pero con los datos nuevos, ya que se cierra el form.
abro el form y veo como esta la grilla por defecto (el metodo de pago que ya posee)


le cambio el metodo de cambio por defecto, y el boton como ves se ponen en update

luego de presiono el boton , se cierra el form.

diciendo que si se actualizo, y en efecto lo hizo, pero no me deja mantener el form con el cambio de datos, entonces ese es mi dilema, pensaba que podria ser con un item event
(Application.SBO_Application.ActivateMenuItem(“1289”); //Previous data record
Application.SBO_Application.ActivateMenuItem(“1288”); //Following data record)o solo seria un cambio de form?
que piensas?
muchas gracias!


#4

Me parece que algo estas haciendo en el Evento ClickBefore o ClickAfter del button para que eso ocurra, pero deberas colocar el codigo para determinar las posibles causas porque no es el comportamiento normal de un Form.


#5

bueno tengo mi boton con clickafter, el cual tiene un case como tu me recomendaste con los caption, y para poder llenar la grilla en el case find: voy un método que hace esto:


        public void grBusVlr () {



            SAPbobsCOM.Recordset oRecordset1 = ((SAPbobsCOM.Recordset)(oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset)));

            oitem = oForm.Items.Item("grdpy");
            oGrid = ((SAPbouiCOM.Grid)(oitem.Specific));
            string vlGrilla = null;

            string Sql10 = "select t0.PayMethCod as 'grcode',t1.Cardcode as 'cod' from OPYM as t0  left join  ocrd as t1 on t0.PayMethCod= t1.pymcode  where t1.cardcode='" + EditText0.Value.ToString() + "'";
            oRecordset1.DoQuery(Sql10);
            string Extraerdequery10 = oRecordset1.Fields.Item("grcode").Value.ToString();
            vlGrilla = Extraerdequery10;
            oForm.DataSources.DataTables.Item("grPagdt");
            oForm.DataSources.DataTables.Item(0).ExecuteQuery("SELECT distinct t0.PayMethCod AS 'Código',t0.Descript as' Descripción',t0.Active as 'Activo'  from OPYM  as t0 left join  ocrd as t1  on t0.PayMethCod= t1.pymcode where t0.type='O' ");
            //oGrid.DataTable = oForm.DataSources.DataTables.Item("grPagdt2");
            oGrid.Columns.Item("Activo").Type = SAPbouiCOM.BoGridColumnType.gct_CheckBox;
            //para agregar el link buton a la grilla
            oGrid.Columns.Item("Código").Type = SAPbouiCOM.BoGridColumnType.gct_EditText;
            SAPbouiCOM.EditTextColumn oEdit = (SAPbouiCOM.EditTextColumn)oGrid.Columns.Item("Código");
            oEdit.LinkedObjectType = "147";

            //oCBC.ValidValues.Add(oRec.Fields.Item(0).Value.ToString(), oRec.Fields.Item(1).Value.ToString());
            //algo parecido a lo que hace el boto de fijar metodo, lo hago aca para que el viejaSel no sea -1 y pueda sacar la linea en negrita
            //string valor = (string)oGrid.DataTable.GetValue("Código", 2); esto es para saber lo que lleva una linea en especifico
            for (int iRows = 0; iRows <= oGrid.Rows.Count - 1; iRows++)
            {
                if ((string)oGrid.DataTable.GetValue("Código", iRows) == vlGrilla)
                {
                    if (viejaSel != -1)
                        oGrid.CommonSetting.SetRowFontStyle(viejaSel, SAPbouiCOM.BoFontStyle.fs_Plain);

                    oGrid.CommonSetting.SetRowFontStyle(iRows + 1, SAPbouiCOM.BoFontStyle.fs_Bold);
                    viejaSel = iRows + 1;

                }
                
               
            }


        }

mas que nada primero para que me re dibuje la grilla y ponga la linea ne negrita.

el boton que fija el metodo estandar despues de que hace la actualizacion, es decir hay un cambio le cambio el caption a ok.
image

 int viejaSel = -1;
        String sValorGrid;
        public void Button2_ClickBefore(object sboObject, SAPbouiCOM.SBOItemEventArg pVal, out bool BubbleEvent )
        {
            BubbleEvent = true;
            try
            {

                if (oGrid.Rows.SelectedRows.Count > 0)   //VERIFICA QUE EXISTA UN ROW SELECCIONADO
                {

                    if (viejaSel != -1)
                        oGrid.CommonSetting.SetRowFontStyle(viejaSel, SAPbouiCOM.BoFontStyle.fs_Plain);

                    int nSelecRow = (oGrid.Rows.SelectedRows.Item(0, SAPbouiCOM.BoOrderType.ot_RowOrder));
                    viejaSel = nSelecRow + 1;
                    //oApp.SetStatusBarMessage("El dato es " + oldSelection + nSelecRow);
                    //seleccion  el row y se destaca en negrita
                    oGrid.CommonSetting.SetRowFontStyle(nSelecRow + 1, SAPbouiCOM.BoFontStyle.fs_Bold);
                     sValorGrid = Convert.ToString(oGrid.DataTable.GetValue("Código", nSelecRow));

                    // Button0.Caption = "Update";
                    if (Button0.Caption=="OK"){

                        Button0.Caption ="Update";

                   
                    }

                 
                }

            }
            catch (Exception)
            {

                oApp.SetStatusBarMessage("Error  en el boton:  " + oCompany.GetLastErrorDescription(), SAPbouiCOM.BoMessageTime.bmt_Medium, true);



            }


        }

para que así se vaya al case ok, estoy redirigiendo lo mal?
igual intenteba con

goto caption ""

pero de la misma manera sale.


#6

Gabriel y cuanto tengo el case

case "OK":
                                
     

                    break;```

como puedo hacer que vuelva a cargar el mismo carcode que se acaba de actualizar?, es decir cuando haya una actualización, vuelva a cargar la información pero con la actualización, pienso que eso seria la mejor solución no?

#7

Deberia ver todo el codigo, con lo que colocas no es suficiente, si puedes pasar un fork o link de GitHub con el form, seria excelente.

Saludos.


#8

estimado aca va el link
form1
saludos,


#9

Hola ,
mas que nada te quería volver a consultar este tema, ya que he terminado varias cosas en el proyecto pero este aun me queda pendiente esto de los formularios, como te decía anteriormente cuando se guarda o actualiza tengo unos problema que por ejemplo ya que guarda le doy el modo oForm.Mode = SAPbouiCOM.BoFormMode.fm_ADD_MODE , pero me da un error como que se inserta dos veces, osea inserta el datos maestro de socio de negocios pero después inmediatamente dice que este código ya existe.

y con respecto a actualizar, es similar pero en vez de darme un error el formulario se sale, es decir se cierra el form, puede ser como uso el case se va al break y este se cierra.
ya puse el código en donde me dijiste pero acá va al menos los case que tengo en el botón.
si pudieran darme alguna idea seria genial muchas gracias.

   private void Button0_ClickBefore(object sboObject, SAPbouiCOM.SBOItemEventArg pVal, out bool BubbleEvent)
        {
            BubbleEvent = true;

            SAPbouiCOM.Form oForm = oApp.Forms.ActiveForm;
            SAPbobsCOM.BusinessPartners sboBP = (SAPbobsCOM.BusinessPartners)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners);

            switch (Button0.Caption)
            {
                case "Añadir":

                    // oForm = (SAPbouiCOM.Form)oApp.Forms.ActiveForm;
                    sboBP.CardCode = EditText0.Value.ToString();
                    sboBP.CardName = EditText1.Value.ToString();
                    sboBP.FederalTaxID = EditText2.Value.ToString();
                    sboBP.CardType = SAPbobsCOM.BoCardTypes.cSupplier;
                    sboBP.CardForeignName = EditText3.Value.ToString();
                    sboBP.Address = EditText4.Value.ToString();
                    sboBP.City = EditText5.Value.ToString();
                    sboBP.ZipCode = EditText6.Value.ToString();
                    sboBP.County = EditText8.Value.ToString();
                    sboBP.Phone1 = EditText9.Value.ToString();
                    sboBP.Phone2 = EditText10.Value.ToString();
                    sboBP.Fax = EditText11.Value.ToString();
                    sboBP.EmailAddress = EditText12.Value.ToString();
                    sboBP.Country = ComboBox2.Value.ToString();
                    //creo esta variable  y tomo el valor seleccionado, ya que al convetirlo a string da problemas con los espacios
                    string vlSelec = ComboBox0.Selected.Value;
                    sboBP.PayTermsGrpCode = Convert.ToInt16(vlSelec);
                    sboBP.HouseBankCountry = ComboBox4.Value.ToString();
                    sboBP.HouseBank = ComboBox1.Value.ToString();
                    sboBP.HouseBankAccount = ComboBox3.Value.ToString();
                    sboBP.HouseBankBranch = EditText18.Value.ToString();
                    //el evneto 0 tiene que ir con el metodo que trrae el default, y con eso deberia funcionar, debes fijarte que se deselcciones si (negrita)
                    //PeymentMethodCode y BPPaymentMethods , deben ir juntos ya que sap te pide un valor por defecto, que se guardan en la ocrd y crd2
                    if (EventoCambio == 0)
                    {
                        grBusVlr();
                        sboBP.PeymentMethodCode = vlGrilla;
                        sboBP.BPPaymentMethods.PaymentMethodCode = vlGrilla;

                    }
                    else
                    {
                        //grBusVlr();
                        sboBP.PeymentMethodCode = sValorGrid;
                        sboBP.BPPaymentMethods.PaymentMethodCode = sValorGrid;
                        EventoCambio = 0;
                    }
                    sboBP.FreeText = EditText19.Value.ToString();
                    //sboBP.Add();

                    int iRetVal = sboBP.Add();

                    // cuando viene un 1 significa que viene con error 
                    if (iRetVal != 0)
                    {
                        //eso muestra el ultimo error al usuario en la barra de abajo de sap
                        oApp.SetStatusBarMessage("Error creando al Colaborador: " + oCompany.GetLastErrorDescription(), SAPbouiCOM.BoMessageTime.bmt_Medium, true);
                    }
                    else
                    {

                        oApp.SetStatusBarMessage("Registro exitoso: " + sboBP.CardCode, SAPbouiCOM.BoMessageTime.bmt_Medium, false);
                        //Application.SBO_Application.ActivateMenuItem("1288");
                        oForm.Mode = SAPbouiCOM.BoFormMode.fm_ADD_MODE;
                    
                        //Button0.Caption = "Añadir";
                        BubbleEvent = false;
                    }
               
                    break;
                case "Actualizar":

                    if (sboBP.GetByKey(EditText0.Value.ToString()))
                    {
                        sboBP.CardName = EditText1.Value.ToString();
                        sboBP.FederalTaxID = EditText2.Value.ToString();
                        sboBP.CardType = SAPbobsCOM.BoCardTypes.cSupplier;
                        sboBP.CardForeignName = EditText3.Value.ToString();
                        sboBP.Address = EditText4.Value.ToString();
                        sboBP.City = EditText5.Value.ToString();
                        sboBP.ZipCode = EditText6.Value.ToString();
                        sboBP.County = EditText8.Value.ToString();
                        sboBP.Phone1 = EditText9.Value.ToString();
                        sboBP.Phone2 = EditText10.Value.ToString();
                        sboBP.Fax = EditText11.Value.ToString();
                        sboBP.EmailAddress = EditText12.Value.ToString();
                        sboBP.Country = ComboBox2.Value.ToString();
                        //creo esta variable  y tomo el valor seleccionado, ya que al convetirlo a string da problemas con los espacios
                        string vlSelec1 = ComboBox0.Selected.Value;
                        sboBP.PayTermsGrpCode = Convert.ToInt16(vlSelec1);
                        sboBP.HouseBankCountry = ComboBox4.Value.ToString();
                        sboBP.HouseBank = ComboBox1.Value.ToString();
                        sboBP.HouseBankAccount = ComboBox3.Value.ToString();
                        sboBP.HouseBankBranch = EditText18.Value.ToString();
                        if (EventoCambio == 0)
                        {
                            grBusVlr();
                            sboBP.PeymentMethodCode = vlGrilla;
                            sboBP.BPPaymentMethods.PaymentMethodCode = vlGrilla;

                        }
                        else
                        {
                            sboBP.PeymentMethodCode = sValorGrid;
                            sboBP.BPPaymentMethods.PaymentMethodCode = sValorGrid;
                            EventoCambio = 0;
                        }
                        sboBP.FreeText = EditText19.Value.ToString();
                        int x = sboBP.Update();



                        if (x != 0)
                        {
                            //eso muestra el ultimo error al usuario en la barra de abajo de sap
                            oApp.SetStatusBarMessage("Error actualizando al Colaborador: " + oCompany.GetLastErrorDescription(), SAPbouiCOM.BoMessageTime.bmt_Medium, true);
                        }
                        else
                        {

                            oApp.SetStatusBarMessage("Actualización exitosa de : " + EditText0.Value.ToString(), SAPbouiCOM.BoMessageTime.bmt_Medium, false);
                            //Application.SBO_Application.ActivateMenuItem("1288");
                            ////goto case "OK";
                            //Button2.Caption = "OK";
                            oForm.Mode = SAPbouiCOM.BoFormMode.fm_OK_MODE;

                        }

                    }

                    break;

gracias.


#10

El problema es que esta con automanage el formulario, entonces insertaba dos veces, mas que nada deje todos los campos con su datasources y alias correspondientes, y saque el onclick del botón y asi funciona perfectamente.
saludos,


#11