Ayuda JavaScript


([N1] osuna) #1

Hola a todos, saludos desde Venezuela.

Necesito ayuda con esta función, le he dado las mil y un vueltas pero no se como optimizarla ni como conseguir que funcione de forma correcta.

tengo un proceso JavaScript el cual recibe como parámetro una variable “ID_TAB” la cual uso para identificar la tabla que trabajaré.

  • el primer paso que hago es listar todas las tablas del proyecto actual y los heredados para poder localizar la tabla recibida como parámetro.

  • Luego de identificarla, paso al enviar ese objeto a la función “crear_registros” definida a lo ultimo.

  • En dicha función lo que hago es listar los campos de la tabla y dar altas con la informacion de esos campos en otra Tabla llamada CMP. (“1v3fqw32.vcd/CMP”)

  • Hasta allí no tengo problema.

  • Lo que realmente me interesa es capturar los campos que son enlaces, sea cual sea el tipo de enlace: Estatica, maestro, puntero entre otros.

  • Si ven, en el código establezco como máximo 3 niveles para luego en un treeview mostrar esos registros(Con lo del treeview no tengo rollo), es decir, si en la tabla localizada consigo 6 campos pero 3 de ellos son enlaces a otras tablas, esos 3 campos de tipo enlace los guardo en mis primeros array: campPadreN1 y miTablaInfoN1 para luego dar las altas de los campos que contiene esa tabla enlazada para asi el treeview me quede como el editor de formulas de velneo. ¿Como Asi? bueno que se vea en el treeview los 6 campos que contiene la tabla con sus tres enlaces y esos enlaces sean una rama mas que contiene los campos de la tabla enlazada.

  • En el nivel 0 se hacen las altas de los campos de la tabla parametrizada, a partir del nivel 1 se hacen las altas de los campos de las tablas enlazadas, el proceso realiza todo bien hasta el nivel 1 pero ya para el nivel 2 se pierde el hilo, menciono que coloco como maximo 3 niveles porque no quiero que se cree un bucle infinito.

  • Comparto el código para que me digan cuales son los pasos que tengo mal establecidos. Si existe una manera de hacerlo de forma recursiva Les agradezco su ayuda.

var proyecto = theApp.mainProjectInfo();
var reg = new VRegister( theRoot );
reg.setTable( “1v3fqw32.vcd/CMP”);
//ID de la tabla a buscar, recibida como parametro
var id_tabla=theRoot.varToString(“ID_TAB”);

//Variables y arreglos
var cnt_camp = 0;
var cnt = 0;
var campPadreN1 = new Array();
var miTablaInfoN1 = new Array();
var campPadreN2 = new Array();
var miTablaInfoN2 = new Array();
var campPadreN3 = new Array();
var miTablaInfoN3 = new Array();

//NIVEL 0
//Buscamos la tabla seleccionada
for( var nIndex=0; nIndex < proyecto.allTableCount(); nIndex++ )
{
var tableInfo = proyecto.allTableInfo( nIndex );
if (tableInfo.idRef() == id_tabla )
{
crear_registros( “”, tableInfo, cnt );
}
}
//NIVEL 1
cnt = cnt + 1;
for( var nIndex=0; nIndex < miTablaInfoN1.length; nIndex++ )
{
crear_registros( campPadreN1[nIndex], miTablaInfoN1[nIndex], cnt );
}
//NIVEL 2
cnt = cnt + 1;
for( var nIndex=0; nIndex < miTablaInfoN2.length; nIndex++ )
{
crear_registros( campPadreN2[nIndex], miTablaInfoN2[nIndex], cnt );
}
//NIVEL 3
cnt = cnt + 1;
for( var nIndex=0; nIndex < miTablaInfoN3.length; nIndex++ )
{
crear_registros( campPadreN3[nIndex], miTablaInfoN3[nIndex], cnt );
}
//***************************************************************************************
function crear_registros( id_cam_padre, tableInfo, cnt )
{
var nivel = cnt;
var n = 0;
cnt_camp = tableInfo.fieldCount();
for( var i=0; i < cnt_camp; i++ )
{
var id_camp = tableInfo.fieldId(i);
var nom_camp = tableInfo.fieldName(i);
var tip_camp = tableInfo.fieldType(i);
var tip_enl = tableInfo.fieldBindType(i);

            //  con esta instrucción se obtiene el objeto vTableInfo de la tabla enlazada
	var tab_inf = tableInfo.fieldBoundedTableInfo(i);

	reg.setField( "ID_CAMP", id_camp );
	reg.setField( "NOM_CAMP", nom_camp );
	if (id_cam_padre == "")
	{
		reg.setField( "CODIGO", id_camp );
	}else{
		reg.setField( "CODIGO", id_cam_padre+"."+id_camp );
		}
	reg.setField( "PADRE", id_cam_padre );
	reg.setField( "TIP_CMP", tip_camp );
	reg.setField( "TIP_ENLC", tip_enl );
	// Se crea el registro
	reg.addRegister();
	
	if (tip_enl != 0) 
	{
					
		switch(nivel) 
		{
			case 0:
				campPadreN1[n] = id_camp;
				miTablaInfoN1[n] = tab_inf;
				n = n + 1;
				break;
			case 1:
				id_camp = id_cam_padre+"."+id_camp;
				campPadreN2[n] = id_camp;					
				miTablaInfoN2[n] = tab_inf;
				n = n + 1;
				break;
			case 2:
				id_camp = id_cam_padre+"."+id_camp;
				campPadreN3[n] = id_camp;
				miTablaInfoN3[n] = tab_inf;
				n = n + 1;
				break;
		}	
	}	
}	

}
//***************************************************************************************