Mi gran dilema está en lo siguiente:
Tengo la siguiente clase:
He creado una clase y de ella he heredado otra. Desde un mxml he llamado a un metodo de la subclase:
Código ActionScript :
package clases
{
import flash.data.SQLResult;
import flash.data.SQLStatement;
import flash.errors.SQLError;
import mx.collections.ArrayCollection;
import mx.containers.Canvas;
import mx.controls.Alert;
import mx.controls.ComboBox;
import mx.controls.Label;
import mx.controls.TextArea;
import mx.controls.TextInput;
import mx.core.ScrollPolicy;
import mx.events.CloseEvent;
public class Actividad
{
private var id:int;
protected var nombre:String;
protected var descripcion:String;
protected var componente:int;
protected var tipo:int;
private var array_actividades:ArrayCollection;
protected var con:conexionBD;
protected var statement:SQLStatement;
private var lbl_nombre:Label;
private var lbl_descr:Label;
private var txt_nombre:TextInput;
private var txt_descr:TextArea;
private var lbl_componente:Label;
private var cb_componentes:ComboBox;
private var lbl_tipo_actividad:Label;
private var cb_tipo_actividad:ComboBox;
private var Com:Componente;
private var tipo_actividad:ArrayCollection;
public function Actividad()
{
nombre="";
descripcion="";
componente=0;
tipo = 0;
array_actividades = new ArrayCollection;
//Almacena los tipos de actividad disponibles en la aplicacion
// A la actividad de "Si / No" le corresponde el id = 1
// A la actividad de "Genera resultado" le corresponde el id = 2
tipo_actividad= new ArrayCollection([{label:"---------------",data:0},{label:"Si / No",data:1}, {label:"Genera resultado", data:2}]);
Com = new Componente();
//Crea los controles
txt_nombre = new TextInput();
txt_descr = new TextArea();
lbl_nombre = new Label();
lbl_descr = new Label();
lbl_componente = new Label();
cb_componentes = new ComboBox();
cb_componentes.dataProvider = Com.getComponentes();
lbl_tipo_actividad = new Label();
cb_tipo_actividad = new ComboBox();
cb_tipo_actividad.dataProvider = tipo_actividad;
}
public function activarControles(estado:Boolean, cnvView:Canvas):void{
cnvView.visible = estado;
//Inicializa los controles
lbl_nombre.x = 85; lbl_nombre.y = 10; lbl_nombre.text = "Nombre:";
lbl_descr.x = 66; lbl_descr.y = 36; lbl_descr.text = "Descripción:";
txt_nombre.x = 155; txt_nombre.y = 8; txt_nombre.width = 462;
txt_descr.x = 155; txt_descr.y = 36; txt_descr.height = 50; txt_descr.width = 462; txt_descr.verticalScrollPolicy = ScrollPolicy.AUTO;
lbl_componente.x = 3; lbl_componente.y = 94; lbl_componente.text = "Componente asociado:";
cb_componentes.x = 155; cb_componentes.y = 92; cb_componentes.width = 160; cb_componentes.dataProvider= Com.getComponentes();
lbl_tipo_actividad.x = 352; lbl_tipo_actividad.y = 94; lbl_tipo_actividad.text = "Tipo Actividad";
cb_tipo_actividad.x= 457; cb_tipo_actividad.y = 92; cb_tipo_actividad.width = 160; cb_tipo_actividad.dataProvider = tipo_actividad;
// Añade los controles al canvas
cnvView.addChild(lbl_nombre);
cnvView.addChild(lbl_descr);
cnvView.addChild(txt_nombre);
cnvView.addChild(txt_descr);
cnvView.addChild(lbl_componente);
cnvView.addChild(cb_componentes);
cnvView.addChild(lbl_tipo_actividad);
cnvView.addChild(cb_tipo_actividad);
}
public function addActividad():void{
con = new conexionBD;
statement= con.getStatement();
nombre=txt_nombre.text;
descripcion = txt_descr.text;
componente= cb_componentes.selectedItem.data;
tipo = cb_tipo_actividad.selectedItem.data;
var sql:String = "INSERT INTO actividad (nombre, descripcion, componente, tipo)";
sql += " VALUES (:nombre, :descripcion, :componente, :tipo) ";
statement.clearParameters();
statement.parameters[":nombre"] = nombre;
statement.parameters[":descripcion"] = descripcion;
statement.parameters[":componente"] = componente;
statement.parameters[":tipo"] = tipo;
statement.text = sql;
try {
statement.execute();
restablecerForm();
Alert.show("La actividad ha sido guardada.");
con.refrescar();
}
catch(error:SQLError){
trace("Error: " + error.toString());
}
}
public function devActividad(cod:int):ArrayCollection{
con = new conexionBD;
statement = con.getStatement();
array_actividades = new ArrayCollection;
statement.clearParameters();
statement.text = "SELECT * FROM actividad WHERE id = :id_actividad";
statement.parameters[":id_actividad"] = cod;
try {
statement.execute();
var result:SQLResult = statement.getResult();
if(result.data != null) {
var numResults:int = result.data.length;
for (var i:int = 0; i < numResults; i++)
{
var row:Object = result.data[i];
array_actividades.addItem({nombre:row.nombre, id:row.id, desc:row.descripcion, comp:row.componente, tipo:row.tipo });
}
}
}
catch(error:SQLError) {
trace("Error: " + error.toString());
}
return array_actividades;
}
public function cargarDatos(a:ArrayCollection):void{
txt_nombre.text = a.getItemAt(0).nombre;
txt_descr.text = a.getItemAt(0).desc;
var j:int;
//Obtengo el componente al que pertenece la actividad
//Recorro el arraycollection
for (j = 0; j < Com.getComponentes().length; j++) {
//Comparo los objetos de mi AC con el nombre del item que buscaba
if (Com.getComponentes()[j] == a.getItemAt(0).comp) {
//Si encuentra el item le asigno su index a mi combo
cb_componentes.selectedIndex = j;
break;
}
}
//Obtengo el tipo al que pertenece la actividad
//Recorro el arraycollection
for (j = 0; j < tipo_actividad.length; j++) {
//Comparo los objetos de mi AC con el nombre del item que buscaba
if (tipo_actividad[j] == a.getItemAt(0).tipo) {
//Si encuentra el item le asigno su index a mi combo
cb_tipo_actividad.selectedIndex = j;
break;
}
}
}
public function validar():Boolean{
nombre=txt_nombre.text;
descripcion = txt_descr.text;
componente= cb_componentes.selectedItem.data;
tipo = cb_tipo_actividad.selectedItem.data;
Alert.show(txt_nombre.text);
var seguir:Boolean = false;
if(nombre == "") {
Alert.show("El campo del nombre está vacío. Es necesiario introducir un nombre.");
}
else if(tipo <0) {
Alert.show(" Debes seleccionar el tipo de actividad.");
}
else{
seguir=true;
}
return seguir;
}
public function getUltimo():int{
var ultimo:int = 0;
con = new conexionBD;
statement = con.getStatement();
array_actividades = new ArrayCollection;
statement.clearParameters();
statement.text = "SELECT max(id)id FROM actividad";
try {
statement.execute();
var result:SQLResult = statement.getResult();
if(result.data != null) {
var row:Object = result.data[0];
ultimo=row.id;
}
}
catch(error:SQLError) {
trace("Error: " + error.toString());
}
return ultimo;
}
}
}Tengo la siguiente subclase:
Código ActionScript :
package clases
{
import flash.data.SQLResult;
import flash.errors.SQLError;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filesystem.File;
import flash.net.FileFilter;
import mx.collections.ArrayCollection;
import mx.containers.Canvas;
import mx.controls.Alert;
import mx.controls.Button;
import mx.controls.Label;
import mx.controls.RadioButton;
import mx.controls.RadioButtonGroup;
import mx.controls.TextArea;
import mx.controls.TextInput;
import mx.core.ScrollPolicy;
public class Act_Si_No extends Actividad
{
//Variables tabla
private var actividad:String;
private var pregunta:String;
private var error:String;
private var modo:String;
private var resultado:int;
//Variables controles
private var lbl_pregunta:Label;
private var txt_pregunta:TextArea;
private var lbl_resp1:Label;
private var lbl_resp2:Label;
private var lbl_error1:Label;
private var lbl_error2:Label;
private var txt_error1:TextArea;
private var txt_error2:TextArea;
private var rbgCorrecta:RadioButtonGroup;
private var rb_correcta1:RadioButton;
private var rb_correcta2:RadioButton;
private var lbl_actividad:Label;
private var txt_actividad: TextArea;
private var txt_dir_video:TextInput;
private var rbgTipo:RadioButtonGroup;
private var rb_video:RadioButton;
private var rb_texto:RadioButton;
private var btn_Insertar_video:Button;
private var dir:File = File.applicationStorageDirectory;
private var fileToOpen:File = File.documentsDirectory;
public function Act_Si_No(){
super();
actividad="";
pregunta="";
error="";
modo="";
resultado=0;
//Crea los controles y le asigna la posicion
lbl_pregunta = new Label();
txt_pregunta = new TextArea();
lbl_resp1 = new Label();
lbl_resp2 = new Label();
lbl_error1 = new Label();
lbl_error2 = new Label();
txt_error1 = new TextArea();
txt_error2 = new TextArea();
rbgCorrecta = new RadioButtonGroup();
rb_correcta1 = new RadioButton();
rb_correcta2 = new RadioButton();
lbl_actividad = new Label();
txt_actividad = new TextArea();
txt_dir_video = new TextInput();
rbgTipo = new RadioButtonGroup();
rb_video = new RadioButton();
rb_texto = new RadioButton();
btn_Insertar_video = new Button();
}
override public function activarControles(estado:Boolean, cnvView:Canvas):void{
cnvView.visible = estado;
lbl_pregunta.x = 49.5; lbl_pregunta.y = 50; lbl_pregunta.text = "Pregunta:";
txt_pregunta.x = 125.5; txt_pregunta.y = 57; txt_pregunta.width = 462; txt_pregunta.height = 50; txt_pregunta.verticalScrollPolicy = ScrollPolicy.AUTO;
lbl_resp1.x = 29.5; lbl_resp1.y = 115; lbl_resp1.text="Respuesta 1: Sí";
lbl_resp2.x = 29.5; lbl_resp2.y = 170; lbl_resp2.text="Respuesta 2: No";
lbl_error1.x = 333.5; lbl_error1.y = 114; lbl_error1.text= "Error 1:";
lbl_error2.x = 333.5; lbl_error2.y = 169; lbl_error2.text= "Error 2:";
txt_error1.x = 387.5; txt_error1.y = 113; txt_error1.width = 200; txt_error1.height = 50;
txt_error2.x = 387.5; txt_error2.y = 168; txt_error2.width = 200; txt_error2.height = 50;
rb_correcta1.x = 600; rb_correcta1.y = 127; rb_correcta1.label = "Correcta"; rb_correcta1.groupName="rbgCorrecta", rb_correcta1.selected=true;
rb_correcta2.x = 600; rb_correcta2.y = 187; rb_correcta2.label = "Correcta"; rb_correcta2.groupName="rbgCorrecta";
lbl_actividad.x = 49.5; lbl_actividad.y = 3; lbl_actividad.text = "Actividad:";
txt_actividad.x = 207.5; txt_actividad.y = 0; txt_actividad.width = 380; txt_actividad.height = 50; txt_actividad.verticalScrollPolicy = ScrollPolicy.AUTO;
txt_dir_video.x = 207.5; txt_dir_video.y = 27; txt_dir_video.width = 250; txt_dir_video.visible= false;
rbgTipo.addEventListener(Event.CHANGE,rbgTipoChange);
rb_video.x = 125.5; rb_video.y = 27; rb_video.label = "Vídeo"; rb_video.groupName = "rbgTipo";
rb_texto.x = 125.5; rb_texto.y = 1; rb_texto.label = "Texto"; rb_texto.groupName = "rbgTipo", rb_texto.selected=true;
btn_Insertar_video.x = 479.5; btn_Insertar_video.y = 27; btn_Insertar_video.label = "Insertar vídeo"; btn_Insertar_video.visible = false;
btn_Insertar_video.addEventListener(MouseEvent.CLICK,insertarVideo);
// Añade los controles al canvas
cnvView.addChild(lbl_pregunta);
cnvView.addChild(txt_pregunta);
cnvView.addChild(lbl_resp1);
cnvView.addChild(lbl_resp2);
cnvView.addChild(lbl_error1);
cnvView.addChild(lbl_error2);
cnvView.addChild(txt_error1);
cnvView.addChild(txt_error2);
// cnvView.addChild(rbgCorrecta);
cnvView.addChild(rb_correcta1);
cnvView.addChild(rb_correcta2);
cnvView.addChild(lbl_actividad);
cnvView.addChild(txt_actividad);
cnvView.addChild(txt_dir_video);
// cnvView.addChild(rbgTipo);
cnvView.addChild(rb_video);
cnvView.addChild(rb_texto);
cnvView.addChild(btn_Insertar_video);
}
override public function addActividad():void{
//Asigno valores a las variables
actividad= evalActividad(rb_video.selected,txt_dir_video.text,txt_actividad.text);
pregunta= txt_pregunta.text;
error = evalError(evalCorrecta(rb_correcta1.selected),txt_error1.text,txt_error2.text);
resultado = evalCorrecta(rb_correcta1.selected);
modo = evalTipo(rb_video.selected);
//Valido campos
if(super.validar() && validarForm()){
super.addActividad();
//Obtengo el id ultimo de la actividad introducida
var ultimo:int = super.getUltimo();
con = new conexionBD;
statement= con.getStatement();
var sql2:String = "INSERT INTO act_si_no (id, actividad, pregunta, error, result, tipo)";
sql2 += " VALUES (:id, :actividad, :pregunta, :error, :resultado, :tipo) ";
statement.clearParameters();
statement.parameters[":id"] = ultimo;
statement.parameters[":actividad"] = actividad;
statement.parameters[":pregunta"] = pregunta;
statement.parameters[":error"] = error;
statement.parameters[":resultado"] = resultado;
statement.parameters[":tipo"] = modo;
statement.text = sql2;
try {
statement.execute();
//trata el video
if(modo=="video"){
evalVideo(fileToOpen);
}
restablecerForm();
Alert.show("La actividad si/no ha sido guardada.");
con.refrescar();
}
catch(error:SQLError){
trace("Error: " + error.toString());
}
}
}
public function validarForm():Boolean{
var seguir:Boolean = false;
if(actividad =="error_video"){
Alert.show(" Debe introducir película en la actividad.");
}
else if(pregunta == ""){
Alert.show(" Debe introducir una pregunta para la actividad.");
}
else{
seguir=true;
}
return seguir;
}
override public function devActividad(cod:int):ArrayCollection{
var array:ArrayCollection = new ArrayCollection;
con = new conexionBD;
statement= con.getStatement();
statement.clearParameters();
statement.text = "SELECT * FROM act_si_no WHERE id = :id_actividad";
statement.parameters[":id_actividad"] = cod;
try {
statement.execute();
var result:SQLResult = statement.getResult();
if(result.data != null) {
var numResults:int = result.data.length;
for (var i:int = 0; i < numResults; i++)
{
var row:Object = result.data[i];
array.addItem({actividad:row.actividad, pregunta:row.pregunta, error:row.error, result:row.result, modo:row.tipo});
}
}
}
catch(error:SQLError) {
trace("Error: " + error.toString());
}
return array;
}
override public function cargarDatos(a:ArrayCollection):void{
txt_pregunta.text = a.getItemAt(0).pregunta;
if(a.getItemAt(0).result == 1){
rb_correcta1.selected = true;
rb_correcta1.validateNow();
txt_error1.text = a.getItemAt(0).result;
txt_error2.text = "";
}
else{
rb_correcta2.selected = true;
rb_correcta2.validateNow();
txt_error1.text = "";
txt_error2.text = a.getItemAt(0).result;
}
if(a.getItemAt(0).modo == "texto"){
rb_texto.selected = true;
rb_texto.validateNow();
txt_actividad.text = a.getItemAt(0).actividad;
txt_dir_video.text = "";
}
else{
rb_video.selected = true;
rb_video.validateNow();
txt_actividad.text = "";
txt_dir_video.text = a.getItemAt(0).actividad;
}
}
public function cargar(cod:int):void{
cargarDatos(devActividad(cod));
super.cargarDatos(super.devActividad(cod));
}
}
}Y en el siguiente mxml hago esto:
Código Flex :
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas show="init();" xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%">
<mx:Script>
<![CDATA[
import clases.conexionBD;
import clases.Actividad;
import clases.Componente;
import clases.Act_Si_No;
import mx.events.ListEvent;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
private var bd:conexionBD;
private var A:Actividad;
private var A_si_no:Act_Si_No;
[Bindable]
private var Com:Componente;
[Bindable]
private var array_actividades:ArrayCollection;
[Bindable]
private var tipo_actividad:ArrayCollection;
private function init():void{
//bd = new conexionBD();
A = new Actividad();
A_si_no = new Act_Si_No();
Com = new Componente();
//Cargo los controles de la actividad
A.activarControles(true,Modulo_actividad);
A.getCbTipoAct().addEventListener(ListEvent.CHANGE, cbElegirTipoChangeHandler);
rbg_anadir_mod.addEventListener(Event.CHANGE,rbgadd_mod_Change);
cb_actividades.addEventListener(ListEvent.CHANGE,cbActividadesChangeHandeler);
array_actividades = new ArrayCollection;
array_actividades = A.devActividades();
}
private function cbElegirTipoChangeHandler(event:ListEvent):void {
//Borra todos los elementos del canvas
Modulo_controles.removeAllChildren();
//Muestra los controles acordes a cada actividad
if(event.target.selectedItem.data == 1){
A_si_no.activarControles(true,Modulo_controles);
}
}
private function rbgadd_mod_Change(event:Event):void {
if(rb_anadir.selected){
lbl_sel_actividad.visible = false;
cb_actividades.visible = false;
btn_guardar_actividad.visible=true;
btn_mod_actividad.visible = false;
}
else{
lbl_sel_actividad.visible = true;
cb_actividades.visible = true;
btn_guardar_actividad.visible=false;
btn_mod_actividad.visible = true;
}
}
private function cbActividadesChangeHandeler(event:ListEvent):void {
// Modulo_controles.removeAllChildren();
switch(event.target.selectedItem.tipo){
case 1:
A_si_no.activarControles(true,Modulo_controles);
A_si_no.cargar(event.target.selectedItem.data);
break;
case 2:
break;
}
}
private function guardar(id:int):void{
if(id==1){
A_si_no.addActividad();
}
}
]]>
</mx:Script>
<mx:TabNavigator width="800" height="500" horizontalCenter="0" creationPolicy="all" verticalCenter="77">
<mx:Canvas y="139" label="Añadir / Modificar Actividades" width="100%" height="100%" id="cnv_gestion_actividades">
<mx:Canvas id="Modulo_actividad" visible="true" y="60" x="1">
</mx:Canvas>
<mx:Canvas id="Modulo_controles" x="30.5" y="184">
</mx:Canvas>
<mx:Button x="719" y="417" label="Guardar" id="btn_guardar_actividad" click="guardar(A.getTipoSel());" />
<mx:Button x="716" y="443" label="Modificar" id="btn_mod_actividad" click="A.modActividad(cb_actividades.selectedItem.data);"/>
<mx:Label x="267" y="35" text="Selecciona Actividad:" id="lbl_sel_actividad" visible="false"/>
<mx:ComboBox x="406" y="31" id="cb_actividades" dataProvider="{array_actividades}" width="160" visible="false"></mx:ComboBox>
<mx:RadioButtonGroup id="rbg_anadir_mod"/>
<mx:RadioButton x="155" y="7" label="Añadir" groupName="rbg_anadir_mod" id="rb_anadir"/>
<mx:RadioButton x="155" y="33" label="Modificar" groupName="rbg_anadir_mod" id="rb_mod"/>
<mx:Label x="30.5" y="9" text="Selecciona acción:"/>
<mx:HRule x="0" y="57" width="100%" height="5"/>
<mx:Canvas id="Modulo_resultado" visible="true" x="-76" y="253" width="212.5">
</mx:Canvas>
</mx:Canvas>Mis problemas son principalemente 2:
- Primero: Cuando voy a guardar la actividad, llamo a la accion de la subclase y ésta se encarga de validar los campos suyos y los de su superclase. El problema está en que cuando valida los datos de la superclase dice que el campo está vacío y no lo está. He hecho pruebas y lo que pasa es que si llamo desde el mxml a la superclase si funciona pero desde la subclase no.
- Segundo: Creo que el problema es similar. Cuando hago una consulta y quiero mostrar los datos en los cuadros de texto, los datos recopilados en la sublclase si me los muetra pero los de la superclase no.
Ya siento todo este rollo pero estoy muy perdida, llevo dias con esto y no veo la solución.
Ójala aguien pueda ayudarme, se lo agradecería enormemente.
Un saludo
