From: Guillermo M. J. <gmo...@us...> - 2005-04-18 10:09:03
|
Perfecto, así desde luego aprenderé rápido, para no tenerte que leerte a ti mismo te pregunto directamente sobre el tema del formateo de las subcuentas y algún otro (muchas preguntas al principio no es por vagueza, simplemente me aclaran ideas para no dar tanta lata posteriormente): 1.- Si se usa una variable global (la que guarda la posición del "."), y si acceden varios usuarios a este formulario a la vez, ¿se puede hacer el programa un lío con la variable de posición global si varios de los usuarios utilizan el "." al añadir cada uno una subcuenta diferente pero al mismo tiempo? (jeje, nunca he programado para situaciones de varios usuarios a la vez) 2.- En caso de haber otros formularios con referencia a una subcuenta, por una parte, ¿habría que comprobar que la subcuenta introducida está dada de alta? por otra parte ¿habría que aplicar el formateo de subcuenta aquí? y en caso afirmativo ¿Se puede poner la función formateo en un lugar donde la puedan llamar otros formularios con campos de tipo Subcuenta? (es para no tener que repetir código, claro que igual en ese caso el código es menos legible-seguible). Inciso: actualmente al dar de alta una forma de pago en facturación, en editar cuentas bancarias el campo subcuenta no mira si el código de subcuenta existe en la contabilidad. Lo miraré cuando pueda y comprobaré si se da ese error en otros lugares. 3.- Finalmente, el código cambiado en co_subcuentas.qs, teniendo la versión original como punto de partida, sería ahora el siguiente, primero unos ejemplos: Para 6 dígitos de subcuenta: 572. ---> 572000 5720003 --> 572003 // inserta un 3, ha eliminado el 0 correspondiente 5720034 --> 572034 // inserta un 4, vuelta a eliminar otro 0 5720345 --> 572345 // inserta un 5, vaya, ya no quedan 0 para eliminar, ¿qué hará en el siguiente? 5723456 --> 572345 // inserta un 6, pues no acepta nuevas inserciones 572.345 --> 572345 // y si pongo un "." en medio, pues tampoco lo acepta 57234 --> 57234 // ahora borro algún dígito 5723.4 --> 572304 // y si inserto otro punto, pues me vuelve a rellenar con "0", que bonito. a) En init() creo la variable global (sin var delante) e inicializada a -1 -------------------- dondePunto = -1; // Variable global para controlar la posición de inserción del "." en el campo codsubcuenta -------------------- b) En bufferChanged(fN) llamo a la función para formatear el campo subcuenta (eliminar el case "codsubcuenta" existente anteriormente) -------------------- case "codsubcuenta": formateoSubcuenta(); break; -------------------- c) Ahora la función de formateo (he intentado que el comportamiento sea lo más parecido a lo que el usuario esperaría, por ello es algo más larga de lo que cabría esperar): -------------------- function formateoSubcuenta() { /** En esta función vamos a reformatear el valor de codSubcuenta reemplazando el carácter ".", si es que existe, por los ceros "0" necesarios hasta completar el número de dígitos de subcuenta del ejercicio actual, a su vez eliminará los caracteres sobrantes cuando se supere el límite de dígitos. */ var cambiado = 0; var valCodSubcta:String = form.child("fdbCodSubcuenta").value().toString(); var lenValCodSubcta:Number = valCodSubcta.length; var nuevoPunto = valCodSubcta.find("."); if (nuevoPunto < 0 && lenValCodSubcta > longSubcuenta) { // En caso de superar el nº de dígitos, se eliminarán los ceros insertados por el "." if (dondePunto >= 0) { if (valCodSubcta.mid(dondePunto,1) == "0") // Sólo en caso de que sigan existiendo "0" insertados valCodSubcta = valCodSubcta.left(dondePunto) + valCodSubcta.right(longSubcuenta-dondePunto); } if (valCodSubcta.length > longSubcuenta) { // Pero si ya se eliminaron los "0" insertados, se elimina el último dígito tecleado. valCodSubcta = valCodSubcta.left(longSubcuenta); } cambiado = 1; } if (nuevoPunto > -1 && dondePunto > -1) // El punto pulsado por segunda vez debe sustituir al anterior dondePunto = -1; if (dondePunto == -1) dondePunto = nuevoPunto; if (nuevoPunto > -1) { var numCeros = longSubcuenta - (valCodSubcta.length-1); var strCeros = ""; for (var i = 0; i < numCeros; i++) strCeros += "0"; valCodSubcta = valCodSubctareplace(".", strCeros); cambiado = 1; } if (cambiado) { bloqueoSubcuenta = true; form.child("fdbCodSubcuenta").setValue(valCodSubcta); bloqueoSubcuenta = false; } } -------------------- 4.- Respecto a mis problemas con las respuestas creo que ya está arreglado, tenía la opción de la Lista de que me llegaran todos los e-mails en uno solo al final del día, pero ahora ya me llega cada uno de los que se escriban de forma individual, y por tanto puedo responderlos individualmente. 5.- ¿Existe algún sistema para ejecutar paso a paso el script y poder ver en cualquier momento el valor de las variables y/u objetos? (es que estoy acostumbrado a la buena vida con el Builder C++ de Borland) Y muchísimas gracias por vuestra paciencia con los nuevos. Federico Albujer Zornoza escribió: >Hola Guillermo bienvenido, > >vamos por partes, voy a intentar contestar en este mensaje a todos los >anteriores, es mucho si me dejo algo me lo recuerdas. > >Lo de las subcuentas con "relleno automático"; ahora mismo la clase FLFieldDB >tiene una señal "lostFocus", pero no está exportada a la interfaz de scripts, >lo he estado mirando y en principio no es bueno sacar eventos a scripts >"porque se repiten mas que el ajo" y si se conectan muchas funciones a los >eventos pueden colgar el interprete, pero veo que es necesario y si no se >abusa no tiene porque dar problemas y simplifica la programación, seguramente >para las próxima versión ya esté disponible este evento y otros para scripts. > >Aun así aunque exista ahora o exista en un futuro este evento y puedas >conectarlo a una función que se dispare al perder el foco, yo lo haría de >otra manera, en la función bufferChanged; > >function bufferChanged( fN ) { > ...... > ...... > case codsubcuenta: > formatearCodSubcta( longSubcuenta ); > break; > ....... > ....... >} > >function formatearCodSubcta( digitosSubcta:Number ) { > var valCodSubcta:String = form.child("fdbCodSubcuenta").value().toString(); > var lenValCodSubcta:Number = valCodSubcta.length; > >/* Sigo indicando de forma hablada más o menos como debe comportarse >mas o menos esta función que hoy no tengo ganas de programar ni estoy >inspirado; > >Si hay un "." en valCodSubcta y currentPosCharDotSubcta < 0 (esta variable la >explico abajo) lo expande insertando en esa posición un número >de ceros igual a digitosSubcta - valCodSubcta.length ,si esta diferencia es >positiva se insertan los ceros correspondientes y se guarda en una variable >global la posición del carácter "." dentro de la cadena, llamemosle >currentPosCharDotSubcta (esta variable tendra un valor negativo para indicar >que no hay posicion almacenada del punto). > >Luego si valCodSubcta.length > digitosSubcta (como mucho la longitud actual >del campo sólo podrá ser mayor en una unidad a los digitos de las subcuentas, >es decir el último carácter introducido sobrepasa esa longitud tope), se mira >currentPosCharDotSubcta y si es positivo y el caracter de esa posición es >cero se elimina ese cero (contrae la cadena, y quedará exactamente con >longitud digitosSubcta), si no es cero currentPosCharDotSubcta se pone a >negativo y se elimina el último carácter de la cadena (seguimos asegurando de >que no pasamos el tope de digitosSubcta) >*/ >} > >Un ejemplo de como debería funcionar, conforme introduce el usuario la >subcuenta, suponiendo digitosSubcta = 7; > >572. --> 5720000 ; currentPosCharDotSubcta = 4 > >57200002 -> 5720002; (ha eliminado el cero de la pos 4) > >57200023-> 5720023; idem > >Esto habría que hacerlo para campo de cada formulario de forma individual, >porque queremos "que se vea el formateo" de cara al usuario, si el usuario >admitiera que puede poner 572.23 y no ve la transformación pero sabe que al >aceptar el formulario se formateará debidamente, se puede poner en el >before/afterCommit de la tabla y siempre se ejecutará ese formateo al >modificar campos de esa tabla independientemente de en que formulario se >haga. > >Lo de los connect ya te ha contestado perfectamente Cristian, gracias >compañero, simplemente es una cuestión de sintaxis. > >Sobre la lista de correo depende del cliente que utilices yo uso habitualmente >KMail te permite gestionar listas de correo y funciona a las mil maravillas, >pero se supone que dándole a Responder debe meter en la cabecera a quien >responde ¿? > >Menudo rollo he soltado, como siga así voy a asustar a los preguntadores y >aspirantes, lo reconozco a veces me pongo "mu cansino". > >Bueno nos leemos. > > -- ******************************************** Guillermo Molleda Jimena ******************************************** |