Ir al contenido


Foto

decimales en Lazarus-sqlite?


  • Por favor identifícate para responder
36 respuestas en este tema

#21 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 abril 2016 - 12:58

Prueba 000,##

No me sirve. Si quiero introducir 12,31 con la mascara me queda 12_,31. Mi objetivo es introducir 12 y al pulsar "," pase a decimales (12, ). Si introduzco 124 y pulso "," pase a decimales (124, ) 


  • 0

#22 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 abril 2016 - 01:06

#,###.00 es el que uso.
  • 0

#23 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 abril 2016 - 01:14

#,###.00 es el que uso.

Esta máscara te permite un entero "." y 3 enteros más, es decir 1.234,00 por ejemplo, pero en mi caso quiero 12,55 ó 123,55 no me cuadra.

 

Si quiero 12,55 (##,00) pero si introduzco123,55  debería indicar la mascara (###,00)


  • 0

#24 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 abril 2016 - 02:43

Dooper, ten en cuenta que los formatos que le definas dependerá de la configuración que tengas en el símbolo decimal y el separador de miles.

En algunos lugares la coma es el separador decimal y en otros es el punto. Puedes definir que símbolo usar para el separador de cada uno en las variables "Separator" que te comentaba Agustín; incluso tienes disponible una variable hasta para establecer el símbolo de moneda y la cantidad de decimales.

Por tanto no es lo mismo decir ###.00 que ###,00 todo dependerá de la configuración regional, o bien, si has establecido por código para que al inicio del sistema utilice un formato en particular (es lo que se recomienda y estila). Yo tengo la manía de confundir el # con el 0 en el formato, así que puede que me equivoque de lugar y deba usarse el "opuesto".

 

Saludos,


  • 0

#25 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 abril 2016 - 03:10

Te entiendo Delphius, pero creo que mi problema no es del separador en sí, sino de los enteros como máximo que me permita insertar.

 

No se que máscara usar, para que el usuario, pueda introducir 1,25 como 12,55 como 125,55 por ejemplo y que la cantidad máx de enteros sean 3, si introduce más de 3 automaticamente, pasarían a ser decimales. Con las máscaras que estoy probando, me permite controlar un caso, los demás quedan fuera de el. Espero haberme explicado correctamente, porque es cierto que hay veces que la pregunta no está bien formulada.

 

un saludo


  • 0

#26 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 24 abril 2016 - 04:44

No hay un componente TMaskEdit en lazarus?
Sino vas a tener que implementarlo en el OnChange
  • 0

#27 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 abril 2016 - 05:13

No hay un componente TMaskEdit en lazarus?
Sino vas a tener que implementarlo en el OnChange

 

Si existe este componente. Pero el está empleando el DBGrid para ingresar aparentemente, y según tengo entendido.

Por eso es que yo sugerí unos posts antes que utilice el evento OnSetText del Field persistente para evaluar el rango permitido de valores.


  • 0

#28 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 24 abril 2016 - 06:04

Me perdí completamente.

Nunca use un dbgrid para ingreso de datos

Que yo sepa, si el campo es persistente hay que poner a true la propiedad currency

Aunque probablemente la opción para controlar más finito sea como indicas vos Marcelo
  • 0

#29 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 abril 2016 - 07:43

Me perdí completamente.

Nunca use un dbgrid para ingreso de datos

Que yo sepa, si el campo es persistente hay que poner a true la propiedad currency

Aunque probablemente la opción para controlar más finito sea como indicas vos Marcelo

 

Y yo no suelo usar data-ware.

Ya sea que use DBGrid o cualquier otro componente para ingresar datos, viendo ciertas dificultades para controlar/verificar el rango de valores es que se me ocurre que la mejor opción sea que emplee campos persistentes en el dataset (query o table que use) e implemente el evento OnSetText y allí haga la comprobación.

El que haga los campos persistentes nos permitirá quizá sacarnos una duda sobre que tipo de Field le genera Zeos para el campo "monetario" que el ha definido como DECIMAL(5,2). Si es uno como el TFloatField como supongo, podrá establecer la propiedad Currency en true (no estoy seguro si las otras clases Field tienen esta propiedad, si estoy seguro de que el FloatField la tiene).

Al menos en Delphi, algunos Field tienen como propiedad la capacidad de establecerle un valor mínimo y un máximo. Pero que yo recuerde estos eran para los Field tipos numéricos enteros. Si está disponible para el Field del campo que le interesa a dooper ya lo tiene solucionado ;)

 

No he usado campos persistentes en Lazarus (ni en Delphi solía usarlos) asi que estoy haciendo ciertas suposiciones. Y como en SQLite hay cosas que parecen romper ciertos moldes, o que al menos a mi me rompe el molde mejor dicho, al no tener idea de que tipo de campo le generará Zeos, me parece lo más apropiado jugar con OnSetText.

 

Tendría que probar.

 

Saludos,


  • 1

#30 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 25 abril 2016 - 11:04

No se si me explicada correctamente. Ingreso los datos a través de un formulario con varios Tedit, y uno de ellos es un TmaskEdit.

Con la máscara de momento y no encuentro otra configuración no me permite por ejemplo introducir 1,25 sino 001,25 para que rellene el máx de 

digitos que quiero, o por ejemplo 012,25 en vez de 12,25.

 

Otra opción será usar un TEdit y controlar que una vez el usuario pulse un "," ver que no haya más de 3 enteros, lo mismo con los decimales, y controlar igualmente que no se permitan letras sólo números.

 

Un saludo


  • 0

#31 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 abril 2016 - 12:38

Otra opción será usar un TEdit y controlar que una vez el usuario pulse un "," ver que no haya más de 3 enteros, lo mismo con los decimales, y controlar igualmente que no se permitan letras sólo números.

 

Yo hago eso con TEdit:


delphi
  1. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  2. var
  3. LEdit: TEdit;
  4. begin
  5. // esto solamente lo necesitas si usas el mismo evento para varios edit
  6. // de esta forma, podes asignarles a todos el mismo evento
  7. // usando Sender se puede obtener el Edit que recibio el evento
  8. LEdit := TEdit(Sender);
  9.  
  10. // Key := #0; equivale a "descartar" la tecla pulsada
  11.  
  12. // yo uso el punto (.) como caracter de separador de decimales
  13. // no uso separador de miles
  14. // osea que posibles numeros pueden ser: 123.45; 123; 123.4; 123.01; y lo mismo para negativos
  15.  
  16. // si la tecla presionada es un punto y en el texto ya hay un punto..
  17. if (Pos('.', LEdit.Text) > 0) and (Key = '.') then
  18. begin
  19. Key := #0;
  20. Exit;
  21. end;
  22.  
  23. // idem signo negativo
  24. if (Pos('-', LEdit.Text) > 0) and (Key = '-') then
  25. begin
  26. Key := #0;
  27. Exit;
  28. end;
  29.  
  30. // si la tecla pulsada no esta dentro del conjunto de los digitos del 0-9, el punto y el negativo, descartar
  31. // #8 equivale a la tecla backspace (para borrar)
  32. if not(CharInSet(Key, ['0' .. '9', #8, '.', '-'])) then
  33. Key := #0;
  34. end;


  • 0

#32 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 25 abril 2016 - 12:58

Perfecto Agustín, creo que será la mejor opción, tomo nota de tu solución y veré que hace...

 

Aunque ahora estoy liado con la grabación de "dichoso" registro.

 

Gracias como siempre!.


  • 0

#33 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 abril 2016 - 01:30

El asunto del TMaskEdit es que tiene un sistema de máscara que te rompe la cabeza y te hace confundir con el sistema de formato propio de conversión entre los tipos numéricos (enteros y/o reales) a texto.

 

Para el caso del TMaskEdit, para lograr ingresar un número en el rango que deseas debes poner como máscara esto: 999.99;1;_

La desventaja es que deberás llenar los digitos "ceros". Por ejemplo para ingresar 1,56 deberá escribir la secuencia "00156" o bien "001.56". Lo mismo sucede con números menores a la unidad, es decir 0,xx deberá llenarse con ceros los numeros enteros y recién colocar los decimales: 0,32 se escribe "00032". Y un número entero (o redondo como se le dice por acá) como 10 será escrito como "01000".

 

Fíjate que la máscara solita puede poner el punto automáticamente cuando pones el tercer dígito. De escribir algo como "12." la máscará asumirá que hay un espacio entre el texto "12" y el simbolo decimal, es decir asume como válido el texto "12 ". Debe completarse TODO como corresponde: Los enteros y los decimales.

 

Yo siempre odié el TMaskEdit porque es quisquilloso con su sistema de máscaras. Yo no me llevo bien con él.

 

La posible ventaja de contar con el sistema de campos persistentes (hay ocasiones en que son válidos y razonables sus usos) es que puedes controlar estos tipos de cosas. Justamente el evento OnSetText está pensado para interceptar el texto que se le está por pasar al campo desde un componente data-ware y hacer algo con él... Ese "algo" depende de cada caso. Para esta situación es válida realizar una comprobación de rango por ejemplo.

 

Saludos,

 

Saludos,


  • 0

#34 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 25 abril 2016 - 02:10

Eso es Delphius, pensé que como buenos consejos que daís, el TMaskEdit iba a dar con mi problema, pero veo que no, que es ciertamente lo que tu indicas, hay que "rellenar" con ceros y eso no era mi prueba. Haré un TEdit al caso y probaré.

 

Un saludo


  • 0

#35 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 abril 2016 - 02:13

Probé jugar con el TMaskEdit, como ver si me amigo con él. Y ni caso. Es mi enemigo declarado.

Intenté tanto con la máscara que comenté: 999.99;1;_ como con 999.99;0;_ e intenté hacer un StrToFloat() y no hubo forma de que haga la conversión apropiadamente. ¡Al símbolo decimal se lo pasa por los huevos! Si le pasas 12345 debería convertirlo como 123,45 pero no... ¡Es un 12345! :o Y dependiendo si debe o no guardar el caracter literal (es decir el ;1 o ;0 de la máscara) o se lo pasa por los huevos, o te dice que no es capaz de convertirte 123.45. ¡Se supone que internamente el componente debe interpretar el punto como el símbolo decimal independientemente de la configuración regional y hacer el trabajo!

 

O es que el componente TMaskEdit en Lazarus está en verde y tiene su bugs o es que ya no le recuerdo su uso :|

 

Saludos,


  • 0

#36 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 abril 2016 - 02:44

Eso es Delphius, pensé que como buenos consejos que daís, el TMaskEdit iba a dar con mi problema, pero veo que no, que es ciertamente lo que tu indicas, hay que "rellenar" con ceros y eso no era mi prueba. Haré un TEdit al caso y probaré.

 

Un saludo

 

Bueno, en realidad no es la única manera. En lugar de rellenar con ceros puedes utilizar la tecla direccional derecha para moverse a las decenas y/o unidades y decimales.

De ese modo para poner 0,46 puedes hacer -> -> ->45. De esa forma ahora en el MaskEdit veras esto: ___.45. Cuando tu defines las máscara 999.99 le estás diciendo con cada 9 que el usuario pueda ingresar un dígito o no. El punto indica justamente donde va el símbolo decimal.

 

Lo que sigue es convertir esto apropiadamente para que pueda ser almacenado en una variable double. Y por lo que acabo de probar, habrá que reacomodar las cosas con el símbolo decimal que utilicemos.

Ese ___.45 que tu ves internamente es un "   .45" (la magia de usar 9 como máscara. El 0 se usa para obligar su tecleado) y puede ser convertido a 0,45 sin problemas... siempre y cuando hagamos las cosas para que se den.

Si en tu país el símbolo de separación de decimales, o mejor dicho, si el equipo en el que corre[rá] tu aplicación emplea la coma (o cualquier otro símbolo) como separador decimal primero deberemos reemplazar ese punto textual por el que emplees (la coma) antes de invocar a StrToFloat.... Eso o bien, emplear la función sobrecargada para indicarle el sistema de formato deseado.

 

A mi entender en Delphi esto no era necesario. Y se interpretaba el punto siempre como símbolo decimal e internamente se hacia la conversión. O yo recuerdo mal.

 

Saludos,


  • 0

#37 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 25 abril 2016 - 03:14

Delphius te veo que te enojas con ese componente lo tuyo... :D imagínate cuando uno se enoja con todos!!!. Broma aparte, ya entiendo tu concepto con el tema del TmaskEdit,  creo que volveré a usar un Tedit e intentar controlarlo con dice nuestro amigo Agustín. De todos modos ya tengo copiado los conceptos que indicas para por si  acaso, que desde luego seguro volverán a reflotar.


  • 0




IP.Board spam blocked by CleanTalk.