OpenERP: onchange, lanzar funciones al cambiar el valor de un campo

Bien es muy sencillo hacer que al cambiar el valor de cualquier campo este ejecute una función para ello se implementa el evento on_change en el campo que desees un ejemplo clásico es el de la factura y el producto cuando se cambia de producto se jecuta un método y devuelve valores que hacen que se llenen los campos unidad y precio de la línea de la factura y se define como esto:

field name=”product_id”
on_change=”product_id_change(product_id, uos_id, quantity, name, parent.type, parent.partner_id, parent.fiscal_position, price_unit, parent.currency_id, context, parent.company_id)”

y el método que ejecuta se define de esta manera:

def product_id_change(self, cr, uid, ids, product, uom_id, qty=0, name=”, type=’out_invoice’, partner_id=False, fposition_id=False, price_unit=False, currency_id=False, context=None, company_id=None)

En la definición van como siempre los cuatro ptimeros parámetros (self, cr, uid, ids) y luego los campos que vaz a procesar de la vista xml en este caso le envía varios pero aquí existe una cosa que es muy util y que me costó algo aprender y es que cuando se llama la función desde el xml y como se ve en este ejemplo se puede acceder a los campos de la tabla padre y a sus valores lo pueden ver que en la definición del xml pone parent.partner_id, pues si le puede pasar desde el xml el valor seleccionado en el objeto padre de la relación uno a muchos, esto es muy importante ya que si estas creando un objeto de este tipo hacer un recorrido por el parámetro “ids” es inutil ya esto elementos no existen hasta que se cree el objeto pero como no se ha creado aún en la base de datos este parámetro es una lista vacía.

Esta función debe devolver u diccionario de esta forma:

dicionario={
‘value’:{‘nombrecampo’:valor,’nombrecampo2′:valor2}
}

 

Acerca de

Antes que nada voy a dejar en claro algo, en este blog escribo como se me place, asi que no busquen errores de ortografia o de redaccion que los van a encontrar a montones y tampoco me critiquen o me digan nada sobre ellos pues no tengo intencion alguna de cambiarlos, lo que escribo lo dejo asi y no lo corrijo,claro esta a menos que sean lineas de codigo. Jorge Prado Anci, profesional en desarrollo de aplicaciones, en especial las dirigidas a bases de datos. He trabajado con VFP en casi todas sus versiones, se algo de Java (que no me gusta, es eso solo no me gusta, es bueno pero no me gusta), lo suficiente de PHP como para tener mi propio CMS(es que sigue sin gustarme por la capacidad de desorden que te permite este “lenguaje”), VB lo conoci y lo deteste tanto que lo olvide al punto de no querer adoptar ni por obligacion a su reemplazante VB .NET (por lo mismo de Java) y si C# este si me encanta y aun que conozco bastante bien el lenguaje, la verdad es que me falta mucho del Framework (del 100% estare en un 65%). Soy un apasionado por el orden (en los proyectos de desarrollo), de la programacion en capas (de MVC conozco pero no he aplicado mucho), los estandares y las condenadas pruebas unitaria. Venga creo que ya con esto fue suficiente.

Tagged with: ,
Publicado en OpenERP
2 comments on “OpenERP: onchange, lanzar funciones al cambiar el valor de un campo
  1. Aguzman dice:

    Gracias por compartir el conocimiento.
    Quiero hacer una funcion on_change, pero no me sale, tengo una tabla alumos y una tabla eventos, en eventos registro a los alumnos que asistiran mediante el numero de control, es una relacion many2one, lo que quiero hacer es que al momento de seleccionar uno, me ponga el nombre en otro campo.

    • Joel Gutierrez dice:

      La función “onchange_department_id” de la clase “hr_employee” del modulo “hr”, sirve para pasar el nombre del director del departamento, con el siguiente código:

      def onchange_department_id(self, cr, uid, ids, department_id, context=None):
      value = {‘parent_id’: False}
      if department_id:
      department = self.pool.get(‘hr.department’).browse(cr, uid, department_id)
      value[‘parent_id’] = department.manager_id.id
      return {‘value’: value}

      He creado nuevos campos en la clase “hr_employee” y “hr_department” y necesito pasar los valores del departamento del gerente, supervisor técnico y supervisor administrativo.
      pero no logro heredar el valor del director y pasar el valor de mis campos, ya que creo que estoy heredando mal la función. y solo pasa uno de mis campos.
      necesito pasar los cuatro.

      {parent_id = parent_id, gerente_id = coach_id, super_tecnico_id =super_tec_id, super_administrativo_id = super_admin_id}.

      he generado el sig. código:

      def onchange_department_id(self, cr, uid, ids, department_id, context=None):
      res = super(hr_employee, self).onchange_department_id(self, cr, uid, ids, department_id)
      value = res[‘value’]
      value1 = {‘coach_id’: False}
      value2 = {‘super_tec_id’: False}
      value3 = {‘super_admin_id’: False}
      if department_id:
      department = self.pool.get(‘hr.department’).browse(cr, uid, department_id)
      value1[‘coach_id’] = department.gerente_id.id
      value2[‘super_tec_id’] = department.super_tecnico_id.id
      value3[‘super_admin_id’] = department.super_administrativo_id.id
      return {‘value’: (value,value1,value2,value3)}

      Tal como está me devuelve un error de tulpa.

      si modifico el comando “return”:

      return {‘value’: value} no me devuelve nada

      return {‘value’: value1} si anexo el numero del value me devuelve la informacion que necesito en cada campo

      Pregunta Concreta ¿Cómo paso todos los campos que necesito?

      Gracias por su ayuda

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 441 seguidores

Blog Stats
  • 304,391 hits
A %d blogueros les gusta esto: