Recent

Author Topic: Consulta sql a partir de un Tedit  (Read 2715 times)

soymoe

  • New member
  • *
  • Posts: 17
Consulta sql a partir de un Tedit
« on: January 19, 2019, 09:32:04 pm »
Hola, quiero hacer una consulta de un campo CUIL/CUIT a partir del texto de un Tedit, el campo CUIL/CUIT es entero, trate con esto pero me da error
Code: Pascal  [Select]
  1.           ZQueryBusqueda.Close;
  2.           ZQueryBusqueda.sql.Clear;
  3.           ZQueryBusqueda.sql.Add('SELECT * FROM personas WHERE CUIL/CUIT LIKE '+'%'+EditBusqueda.Text);
  4.           ZQueryBusqueda.Open;
  5.           ZQueryBusqueda.Open;        

GAN

  • Full Member
  • ***
  • Posts: 220
Re: Consulta sql a partir de un Tedit
« Reply #1 on: January 19, 2019, 11:19:11 pm »
Hola, seguro que como nombre de campo podes usar la bara / ? Creo que no, yo cambiaría a CUIT o CUITOCUIL, de todas formas el nro. es el mismo y tengo entendido que el CUIL ya no se usará más, directamente el CUIT.

En cuanto a la consulta se puede simplificar quitando sql.Clear y usando sql.Text en lugar de sql.Add.

En cuanto al operador LIKE es solo para strings o sea que deberías primero tratar al entero como cadena, con CAST.

Code: Pascal  [Select]
  1. 'SELECT * FROM personas WHERE CAST(CUIT AS TEXT) LIKE '+'%'+EditBusqueda.Text'

O

Code: Pascal  [Select]
  1. 'SELECT * FROM personas WHERE CAST(CUIT AS VARCHAR(11)) LIKE '+'%'+EditBusqueda.Text'

Otra opción es guardar el nro. CUIT como texto, te recomiendo siempre usar VARCHAR con la cantidad de caracteres en lugar de TEXT, te evitará luego problemas con por ejemplo DBGrid.

Saludos.
Lazarus 1.8.4 FPC 3.0.4 Linux Mint Mate 17.2 x86_64 GTK-2
Zeos 7.1.3 - Sqlite 3.8.2

Foro Lazarus en español http://forum.lazarus.freepascal.org/index.php/board,73.0.html

daragor

  • New member
  • *
  • Posts: 17
    • Blog Webscom
Re: Consulta sql a partir de un Tedit
« Reply #2 on: March 08, 2019, 03:55:39 pm »
Solo para brindar más opciones a la codificación hago mi aporte, ya que lo dicho por GAN es correcto.

Primero, pienso que el CUIT es un número unico, osea que pertenece a una sola entidad o persona, y se podria alamacenar como un numero entero y buscarlo como tal, como si se tratara del DNI... por eso no es necesario usar LIKE en la consulta, ya que es propio de los strings y menos con los comodines % que son para buscar dentro un string... dicho esto, una forma que yo uso siempre en consultas son los Parametros, entonces podría ser:

Code: Pascal  [Select]
  1.  
  2.  query.Active:= false;
  3.  query.SQL.Text:= 'SELECT * FROM personas WHERE CUIT=:C';
  4.  query.ParamByName('C').AsInteger:= strtoint(trim(nro_cuit.text));
  5.  query.Open;
  6.  

C es el parametro que puede ser del tipo que queramos, en este caso integer
nro_cuit el input TEdit donde se ingresa el nro del cuit

Ahora si quieres almacenarlo con los guiones - entonces si, usa todo en formato texto.

esa sería mi manera de hacer la consulta.
saludos!!


« Last Edit: March 08, 2019, 04:11:16 pm by daragor »
Inculcando el software libre.
https://www.webscom.net

lucamar

  • Hero Member
  • *****
  • Posts: 1945
Re: Consulta sql a partir de un Tedit
« Reply #3 on: March 08, 2019, 04:58:17 pm »
Usar parametros es una buena idea ... y probablemente la única forma sensata de hacerlo partiendo de un TEdit :)

Pero esto:

Primero, pienso que el CUIT es un número unico, osea que pertenece a una sola entidad o persona, y se podria alamacenar como un numero entero y buscarlo como tal, como si se tratara del DNI...

No. Mala idea. Ese CUIT, el número de DNI, el NIF, etc. no son números: son códigos más o menos opacos. Lo mejor es almacenarlos (y usarlos) exactamente como son, en una cadena.

Un ejemplo: En España un DNI* puede tener el mismo "número" que un DIE y sólo se diferencian en que el último lleva una "X" delante. Incluso el código de control (la letra final) es el mismo. Cierto que no suele pasar que existan ambos a la vez pero es posible --- si no han cambiado nada desde la última vez que tuve que hacer algo con ellos :)

* Abreviaturas (para los que no se las saben):
DNI : Documento Nacional de Identidad
DIE : Documento de Identificación de Extranjeros (oficialmente tiene otro nombre pero nadie lo usa :))
« Last Edit: March 08, 2019, 05:01:18 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

GAN

  • Full Member
  • ***
  • Posts: 220
Re: Consulta sql a partir de un Tedit
« Reply #4 on: March 08, 2019, 09:26:53 pm »
@lucamar los CUIT/CUIL/DNI/DNU/LC/LE son enteros, no hay letras, es así hace décadas.
Lazarus 1.8.4 FPC 3.0.4 Linux Mint Mate 17.2 x86_64 GTK-2
Zeos 7.1.3 - Sqlite 3.8.2

Foro Lazarus en español http://forum.lazarus.freepascal.org/index.php/board,73.0.html

lucamar

  • Hero Member
  • *****
  • Posts: 1945
Re: Consulta sql a partir de un Tedit
« Reply #5 on: March 08, 2019, 10:21:36 pm »
@lucamar los CUIT/CUIL/DNI/DNU/LC/LE son enteros, no hay letras, es así hace décadas.

Igual estamos hablando de cosas distintas. Por DNI, yo me refiero al Documento Nacional de Identidad de España. Y sí tiene una letra, al final, que sirve como "dígito" de verificación: Es el mismo código que empezó a usarse hace años en el NIF para personas físicas hasta que ambos se fundieron hace ... 15? 20 años? No recuerdo.

De todas formas, un codigo de identificación es un código de identificación no importa si usa sólo dígitos o una mezcla de dígitos y letras o lo que sea: es un código más o menos opaco que no debería convertirse, aunque sólo sea por precaución.
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

daragor

  • New member
  • *
  • Posts: 17
    • Blog Webscom
Re: Consulta sql a partir de un Tedit
« Reply #6 on: July 05, 2019, 04:25:08 pm »
@lucamar, estamos claros que son codigos, pero no entiendo porque dices que algo es una premisa definitiva...
un numero de DNI es un numero... y en el caso de Argentina son unicos e irrepetibles, no tienen letras, cosa que para un sistema es suficiente almacenarlos como numeros... ya que será una clave optimizada en todo sentido y se la puede usar sin problemas.

Lo que esta mal, es cuestionar y decir que algo NO está bien, cuando en realidad no sabes como son los casos particulares, en el post donde hablo del CUIT digo claramente que podria almacenarse como numero y sino quiere el programador puede usarlo como string... por ejemplo el CUIT se podria guadar asi: 20123456780 (numero) o asi 20-12345678-9 (cadena string) a los fines de localizacion o clave unica, podria funcionar igual al menos en mi país.

Quote
No. Mala idea. Ese CUIT, el número de DNI, el NIF, etc. no son números: son códigos más o menos opacos. Lo mejor es almacenarlos (y usarlos) exactamente como son, en una cadena.


What ??  %)
YO usaria numero y luego hago el formateo que necesite solo para "Mostrar" el valor en un formato establecido o decidido por el Cliente... puede ser asi ##@@20---12345678///0<---- si quisiera y con el numero unico en la base de datos, seria suficiente para trabajar. Alguna vez has manejado numero de un expediente ?

Supongamos un formato asi: numero/codigo-letra-año en nro: 1234/567-ABC-2019 en serio lo almacenarías como un string? sabiendo que no se puede repetir nunca y que cada año inicia en 0001?


Quote
Un ejemplo: En España un DNI* puede tener el mismo "número" que un DIE y sólo se diferencian en que el último lleva una "X" delante. Incluso el código de control (la letra final) es el mismo. Cierto que no suele pasar que existan ambos a la vez pero es posible

What?!!  :o
En serio, no confundamos a la gente... como puedes comparar un DNI con un DIE (y por más q no lo conozco) entiendo que son 2 cosas Distintas! es como decir que puedes tener el mismo numero de libros que el de tu edad, no por eso vas a compararlos y no podrías almacenarlos como tal... un locura. SI se puede muchachos los valores en las tablas muchas veces se repiten para eso se los separa en columnas y se les coloca un NOMBRE.

lamento haber tenido que ser vehemente y detallado, pero me parecio necesario
saludos!

« Last Edit: July 05, 2019, 04:36:16 pm by daragor »
Inculcando el software libre.
https://www.webscom.net

esvignolo

  • Full Member
  • ***
  • Posts: 147
  • Using FPC in Windows, Linux, Macos
Re: Consulta sql a partir de un Tedit
« Reply #7 on: July 05, 2019, 04:57:19 pm »
Cosas que pasan a nivel pais supongo, en Argentina el nro de DNI se puede repetir, la combinacion unica es Sexo+DNI, asi que a no confiarse con el nro de dni solamente, de hecho nos podemos dar cuenta en la consulta a los padrones electorales, no alcanza solo con el DNI, se tiene que proporcionar el sexo.

Finalmente si bien este tipo de consultas funcionaria:

'SELECT * FROM personas WHERE CAST(CUIT AS VARCHAR(11)) LIKE '+'%'+EditBusqueda.Text'

lo haria:

'SELECT * FROM personas WHERE CAST(CUIT AS VARCHAR(11)) LIKE '+QuotedStr('%'+EditBusqueda.Text');

Por un tema de posibilidad de inyeccion sql en el primer ej.

Todo lo digo con la intencion de sumar... saludos

daragor

  • New member
  • *
  • Posts: 17
    • Blog Webscom
Re: Consulta sql a partir de un Tedit
« Reply #8 on: July 05, 2019, 05:09:16 pm »
Hola esvignolo!
creo... q si en Argentina (el lugar donde todo puede pasar) hay numeros de DNI repetidos, es un Error con todas las letras.. el DNI es unico y personal, si hay denuncias de duplicidad no significa que sea parte de una normalidad en el concepto.

De hecho si me pongo a pensar en que el codigo unico es sexo+dni ... tampoco me queda claro! no solucionamos nada. Si hay repetidos no creo q se solucione con decir si eres mujer o varon o etc.  pueden haber 2 varones con le mismo numero, o dos mujeres... no es determinante, en los padrones TODO puede pasar.... eso lo sabemos.

En todo caso puede usar el DNI + la fecha de nacimiento y si te quedan dudas puedes sumarle un numero de telefono movil, etc. y armar claves unicas más complejas. Si estoy equivocado pido disculpas, solo estoy tratando de sumar y desde mi punto de vista dar una solucion.. pero claro puedo fallar.
« Last Edit: July 05, 2019, 05:21:04 pm by daragor »
Inculcando el software libre.
https://www.webscom.net

lucamar

  • Hero Member
  • *****
  • Posts: 1945
Re: Consulta sql a partir de un Tedit
« Reply #9 on: July 05, 2019, 10:48:49 pm »
Quote
Un ejemplo: En España un DNI* puede tener el mismo "número" que un DIE y sólo se diferencian en que el último lleva una "X" delante. Incluso el código de control (la letra final) es el mismo. Cierto que no suele pasar que existan ambos a la vez pero es posible

What?!!  :o
En serio, no confundamos a la gente... como puedes comparar un DNI con un DIE (y por más q no lo conozco) entiendo que son 2 cosas Distintas! es como decir que puedes tener el mismo numero de libros que el de tu edad, no por eso vas a compararlos y no podrías almacenarlos como tal [...]

Vale que en lo demás tengas razón--ya dije que no sé exactamente qué son los CUIT, etc.--pero ¿en esto? No. Es obvio que no lo conoces.

En España, los ciudadanos tienen Documento Nacional de Identidad (DNI) pero los extranjeros (residentes) obviamente no. En vez de DNI, tienen un Documento de Identificación de Extranjeros (o como se llame ahora) que es exactamente lo mismo, sirve para lo mismo (como documento de identificación), sigue la misma numeración, etc. La única diferencia es que el código lleva una X delante. Cuando te piden un DNI, para cualquier cosa, un extranjero saca su DIE y santas pascuas. Son exactamente el mismo instrumento legal e incluso, físicamente, las diferencias son mínimas. Y la policia los almacena en la misma base de datos, aunque esto es anecdótico.

Así que no, no es como comparar el número de libros con la edad: es comparar un código de identificación con otro código de identificación en la misma serie.

Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

daragor

  • New member
  • *
  • Posts: 17
    • Blog Webscom
Re: Consulta sql a partir de un Tedit
« Reply #10 on: July 05, 2019, 11:55:11 pm »
Si claro! lucamar  no quiero polemizar y ademas respeto a todos aqui, lo que pasa es q entiendo que hay un error de concepto y quizas, al no concer los detalles, estamos hasta mezclando un poco las cosas.

Yo pienso sinceramente que lo que me explicas no tiene mucho sentido, ser lo mismo ... no deberia!
primero que son 2 cosas distintas ya por tener una x al inicio, segundo podrias hacer 2 tablas una de españoles otra de extranjeros y consultar de acuerdo corresponda, y tercero y ultimo estamos hablando de programación, de optimización en el almacenamiento de datos.. si uds tienen a 2 personas con el mismo numero de identificación  (llevandome de tu explicación) creo.. "mi humilde opinión" es que estan cayendo en un error... porque complicarse asi? no lo estoy entendiendo... una persona en españa tiene o puede tener el mismo numero de DNI que otra? sirve el DNI para almacenar y buscar en una base de datos? fisicamente las diferecnias son minimas! y bueno para eso se hacen los sistemas, para reconocer diferencias... almacenar en la misma B.D. no significa que esten repetidos ni juntos.. bueno en fin, sirve y mucho este debate justamente aclarar un poco los temas de ser programador o analista.

saludos!
Inculcando el software libre.
https://www.webscom.net

lucamar

  • Hero Member
  • *****
  • Posts: 1945
Re: Consulta sql a partir de un Tedit
« Reply #11 on: July 06, 2019, 12:51:00 am »
Vale, veamos. Supón que tienes una tabla de clientes. Por razones fiscales, tienes que almacenar el código legal de identificación.

Para empresas, éste sería el CIF/NIF (Código o Número de Identificación Fiscal).

Antes las personas físicas también tenian un NIF, que era el número de DNI más una letra de control (calculable), pero no mucho después este código quedó incorporado en el DNI, de modo que el DNI hace también de "NIF".

Al mismo tiempo, más o menos, se creó una categoría de "DNIs" para extranjeros residentes con las mismas caraterísticas del DNI normal sólo que el código incorpora una X delante, para diferenciarlos fácilmente. Esto es la TIE (ése es el nombre real) - Tarjeta de Identificación  de Extranjeros y el código de llama Número de Identificación de Extranjero (NIE).

Así que tienes una base de datos de clientes que incorpora el código legal, el nombre, dirección, etc. Sólo que el "código" puede ser un CIF para empresas, un DNI para españoles o un NIE para extranjeros.

Date cuenta que cada uno es único, aunque sólo se diferencien por una letra de ""tipo de documento". Los CIF, por ejemplo, llevan incorporadas una o dos letras que especifican qué tipo de empresa es: sociedad anónima, liimitada, cooperativa, etc.

La cuestión es que el código, sea del tipo que sea, es simplemente eso: un código único de identificación; así que son básicamente lo mismo. O más bien, son básicamente equivalentes.

No sé cómo explicarlo mejor.

Aquí hay una explicación muy básica de lo que es la TIE: https://cursosinemweb.es/tie/. Especialmente:
Quote
La TIE puede asimilarse a lo que es el DNI para los españoles, el documento que los identifica y que deben conservar siempre en vigor.
« Last Edit: July 06, 2019, 01:04:37 am by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

bylaardt

  • Sr. Member
  • ****
  • Posts: 303
Re: Consulta sql a partir de un Tedit
« Reply #12 on: July 06, 2019, 02:58:45 am »
Me parece que en el mensaje original el problema solo se encuentra en el nombre del campo con la barra diagonal.
Resuélvelo así:
Code: Pascal  [Select]
  1. ZQueryBusqueda.sql.Add('SELECT * FROM `personas` WHERE `CUIL/CUIT` LIKE '+'%'+EditBusqueda.Text);
Los nombres de campo permiten caracteres especiales como barra diagonal

dtoffe

  • New member
  • *
  • Posts: 18
Re: Consulta sql a partir de un Tedit
« Reply #13 on: July 06, 2019, 06:14:33 am »
Primero, pienso que el CUIT es un número unico, o sea que pertenece a una sola entidad o persona, y se podria almacenar como un numero entero y buscarlo como tal, como si se tratara del DNI...

No. Mala idea. Ese CUIT, el número de DNI, el NIF, etc. no son números: son códigos más o menos opacos. Lo mejor es almacenarlos (y usarlos) exactamente como son, en una cadena.


@lucamar los CUIT/CUIL/DNI/DNU/LC/LE son enteros, no hay letras, es así hace décadas.

    Cuando se modela una base de datos, se considera buena práctica modelar como números a valores que representen cantidades, o donde tengan sentido las operaciones matemáticas. Por ejemplo, cantidades en inventario, niveles mínimos y máximos de referencia, etc.
    Los códigos, aunque estén formados sólo por dígitos, se deberían consideran cadenas siempre. Tomemos por caso un DNI, sumar dos al DNI de una persona no tiene sentido, lo mismo vale para el CUIT, Seguridad Social en los EEUU, números de teléfonos, etc.
    Con respecto a la búsqueda, al tomarlos como cadena es directo hacer una búsqueda parcial por subcadena, con un LIKE. Si estuvieran almacenados como enteros, para hacer una búsqueda parcial deberías primero convertirlo en cadena.
    No tengo la referencia concreta a mano, pero estoy seguro que está explicado en alguno de los libros clásicos de bases de datos como el de C. J. Date.

Daniel

GAN

  • Full Member
  • ***
  • Posts: 220
Re: Consulta sql a partir de un Tedit
« Reply #14 on: July 06, 2019, 09:39:59 pm »
@dtoffe los dos primeros números y el último del CUIT/CUIL se calculan en base a operaciones matemáticas.

Por otro lado, nunca vi una búsqueda parcial de un DNI o DU, carece de sentido.

Antes, cuando usaba DBase almacenaba estos valores como cadenas, eran otros tiempos, ocupaban menos espacio y la búsqueda era más rápida. En muy grandes bases de datos es probable que valga la pena usar cadenas.

De paso aporto un poco al tema de único, actualmente es DU Documento Único, algo semejante a una clave primaria. Con los CUIT (Clave Única de Identificación Tributaria) y los CUIL (Clave Única de Identificación Laboral) sucede exactamente lo mismo, no hay dos iguales.

Saludos.
Lazarus 1.8.4 FPC 3.0.4 Linux Mint Mate 17.2 x86_64 GTK-2
Zeos 7.1.3 - Sqlite 3.8.2

Foro Lazarus en español http://forum.lazarus.freepascal.org/index.php/board,73.0.html