Como llenar un combobox con recorsert en c#

hola soy nuevo en esto, pero de a poco avanzando, quisiera saber como llevar un combobox con recorset en c#, quisiera poder desplegar la misma lista de pagos que tiene el dato maestro de socio de negocios.(OCTG)

Tengo este condigo:

   SAPbobsCOM.Recordset orec = null;

            orec = ((SAPbobsCOM.Recordset)(oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset)));
            orec.DoQuery("select GroupNum,PymntGroup from OCTG");

            while (!orec.EoF)
            {

                ComboBox1.ValidValues.Add(orec.Fields.Item("GroupNum").Value.ToString(), orec.Fields.Item("PymntGroup").Value.ToString());

                orec.MoveNext();

lo malo que no funciona, me pueden ayudar por favor!

saludos

1 me gusta

Lo primero que debes hacer cada vez que quiereas cargar datos en un objeto Combo Box es inicializarlo (limpiarlo), caso contrario te puede dar error si tratas de agregar un elemento duplicado (El combo box se llena siempre con la dupla Key - Value)

Lo mejor que puedes hacer es crear una clase, o mejor aun, metodos de extension para cada proceso, asi solo tendras que llamar dicho metodo cada vez que lo utilices pasando los parametros respectivos.

Para Limpiar un ComboBox usa:

public static void CleanComboBox(dynamic oComboBox)
        {
            int i = 0;

            while (oComboBox.ValidValues.Count > 0)
            {
                try
                {
                    oComboBox.ValidValues.Remove(i, SAPbouiCOM.BoSearchKey.psk_Index);
                }
                catch (Exception) { }
            }
        }

Para Cargar un ComboBox con un Recordset
Los parametros son:

  • La cadena que contiene la consulta SELECT ejemp: “SELECT ItemCode, ItemName FROM OITM”
  • El Objeto ComboBox ejemp: ComboBox1
  • El campo KeyValue para el Combo, que debe existir en la consulta. Ejem: “ItemCode”
  • El campo Descripcion para el Combo, que debe existir en la consulta. Ejem: “ItemName”
  • El Objeto oCompany
public static void LoadComboQueryRecordset(string _query, dynamic oComboBox, string fieldValue, string fieldDesc, SAPbobsCOM.Company oCompany)
       {
           SAPbobsCOM.Recordset businessObject = (SAPbobsCOM.Recordset)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);
           businessObject.DoQuery(_query);
           SAPbouiCOM.ValidValues validValues = oComboBox.ValidValues;

           CleanComboBox(oComboBox);

           if (!string.Equals(fieldDesc, string.Empty))
           {
               while (!businessObject.EoF)
               {
                   validValues.Add((dynamic)businessObject.Fields.Item(fieldValue).Value, (dynamic)businessObject.Fields.Item(fieldDesc).Value);
                   businessObject.MoveNext();
               }
           }
           else
           {
               while (!businessObject.EoF)
               {
                   validValues.Add((dynamic)businessObject.Fields.Item(fieldValue).Value, "");
                   businessObject.MoveNext();
               }
           }
       }

En tu caso las llamadas quedaria asi (Usando lo anterior como un metodo estatico de la clase “FuncionesSDK”):

   FuncionesSDK.CleanComboBox(ComboBox1);

   string SqlCad = "select GroupNum,PymntGroup from OCTG";
   FuncionesSDK.LoadComboQueryRecordset(SqlCad, ComboBox1, "GroupNum", "PymntGroup", oCompany );

Espero que te sirva.
Saludos

2 Me gusta

muchas gracias por tu respuesta , estoy viendo el tema de las dos clases, comobo


lo malo que aun no se refleja en el combobox, es posible que este llamando mal ? ya que al hacerlo con visual studio y colocar el datasource por ejemplo OCTG Y GROUPNUM, solo me trae el primer valor, hay algo mas que deba hacer para que esto se muestre bien?
(perdona la ignorancia)
gracias

1 me gusta

En este caso, no debes usar la propiedad DataSource, dejala en Blanco, el combo debe tener todas sus propiedades por defecto (Excepto el nombre, que le puedes colocar el que quiereas).

Tambien puede probar depurando el proceso paso a paso para ver si todos los elementos se van cargando correctamente.

Tambien verifica que el objeto oCompany este bien instanciado.

      SAPbobsCOM.Company oCompany = new SAPbobsCOM.Company();
      oCompany = (SAPbobsCOM.Company)Application.SBO_Application.Company.GetDICompany();
2 Me gusta

osea si ya puedo agregar, y ademas se esta instanciando pero no puedo hacer que el combobox muestre los datos, es raro igual sigo paso a paso lo que mencionas y no muestra , lo estoy agregando en el mismo combobox o lo puede cargar cuando se cargue el form_loader?
saludos y gracias

1 me gusta

Ah ok! Si siempre mostraras los mismos datos, debes hacer el proceso de llenado en el Metodo OnCustomInitialize().
No debes hacerlo en el ComboBox, no tiene sentido practico.

2 Me gusta

hola nuevamente yo, lo hice en el form_loadafter y me sale esto


que piensas que puede ser?

1 me gusta

Hola, hazlo en el OnCustomInitialize(),

Lo que pasa alli es que en ese metodo todavia no se a creado el objeto ComboBox (Es null), es por eso da el error.

2 Me gusta

creo que me sigue dando null lo cree en el OnCustomInitialize() :confused:

1 me gusta

El metodo OnCustomInitialize() ¿Donde se esta llamando? ¿Despues de definir el Combo cmbfpo?

Este metodo (Que existe por defecto), se llama siempre AL FINAL del metodo public override void OnInitializeComponent() que es donde se instancian cada uno de los controles del form.

1 me gusta

Yo siempre lo uso asi:

private void OnCustomInitialize()
        {
            oForm = Application.SBO_Application.Forms.Item(this.UIAPIRawForm.UniqueID);
            oCompany = NConexion.Verifica_Conexion(Program.oCompany);
            
            //Cargar Combo Periodos
            string Sql = "select Code, U_Nombre from [" + Program.sBDComercial.Trim() + "].[dbo].[@Z_COMI_PER] where LTRIM(RTRIM(U_Visible)) = 'Y'";
            ComboBoxExtensions.LoadComboQueryDataTable( ComboBox0, DT_SQL, Sql, 0, 1, false);
            
            ComboBox0.Select(ComboBox0.ValidValues.Count - 1 , SAPbouiCOM.BoSearchKey.psk_Index);

            Folder0.Item.Click();

        }
2 Me gusta

si esta declarado mira…

1 me gusta

Intenta hacerlo sin el procedimiento, es decir coloca todo el codigo de la limpieza directamente en el OnCustomInitialize() y haciendo referencia directa sobre ese combo.

private void OnCustomInitialize()
        {
            int i = 0;

            while (cmbfpo.ValidValues.Count > 0)
            {
                try
                {
                    cmbfpo.ValidValues.Remove(i, SAPbouiCOM.BoSearchKey.psk_Index);
                }
                catch (Exception) { }
            }
}
1 me gusta

me sigue sin funcionara, veré si algo estoy haciendo mal, pero te agradezco por tus respuestas tan rápidas, de algún modo no me toma el combobox…

una consulta la colección del validvalues no se toca verdad?

muchas gracias, ya funciono, lo tenia en el button_clickbefore, ahora ya funciono todo bien, gracias!

hola,
Una consulta Gabriel, es que al tener esto

   FuncionesSDK.CleanComboBox(ComboBox1);

   string SqlCad = "select GroupNum,PymntGroup from OCTG";
   FuncionesSDK.LoadComboQueryRecordset(SqlCad, ComboBox1, "GroupNum", "PymntGroup", oCompany );

dentro del buton on click, debo presionarlo añadir en este caso esperar que me de error por no tener datos que agregar y después se ven los paises, lo malo que al colocar en el OnCustomInitialize() me da error de Null, que me recomiendas hacer para que carge cuando cargque el form en si? muchas gracias y perdona tantas preguntas

lo ejecuto desde e lOnCustomInitialize


y pasa el clean el string , pero cuando llega al load, va al metodo,
y me da el error aca en esta linea en amarillo
:frowning: me da nulo. he intentado varias maneras pero no hay modo, al colocar el llamado en otro lado me da null, debe ser en el boton y funciona perfecto, pero lo malo que debo hacer click .

:exclamation: @Esteban_P, lee Cómo usar el foro de Consultoria-SAP
Evitá sanciones, no respondas 5 veces al mismo usuario, 5 mensajes distintos uno detras de otro, usa el botón para editar mensajes si te olvidaste decir algo, y el mensaje tuyo es el último del debate.

Esto NO es un chat.

Tambien, los códigos deben ser pegados en modo TEXTO, no usar capturas para códigos!!!

2 Me gusta

ok ,perdona, lo hare

funciono, al final era lo que tu decías , no estaba conectado el ocompany :), saludos

2 Me gusta

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