Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-09-2005
Avatar de Damian666
Damian666 Damian666 is offline
Miembro
 
Registrado: sep 2005
Posts: 27
Poder: 0
Damian666 Va por buen camino
Comparar un registro de un edit con un registro de una tabla en una consulta

Hola a todos,
Tengo un problemita, la verdad es que nose como hacerlo.
Necesito hacer una comparación en mi consulta con un dato introducido en un edit y una tabla de mi base de datos.
Esto para filtrar solo registros que contengan cierta gestion

Cuando utilizamos SQL en un TQuery nos muestra GES en params y listo. Pero en este caso como lo hago? Hasta antes de aumentar todo lo que esta de azul funcionaba pero ahora no, por favor alguien lo puede compilar en su cabeza y avisarme cual es mi error.

Bueno gracias nuevamente

Código Delphi [-]
procedure TFENTREGACC.BitBtn1Click(Sender: TObject);
 var
   GES,BUSCAR1:STRING;
 begin
   GES:=GEST.TEXT;
   IF (CUENTA1.TEXT<>'') THEN
   begin
     BUSCAR1:='SELECT * FROM CCCLIENTES WHERE ((PERIODO=01)OR(PERIODO=02) '
       + 'OR(PERIODO=03)OR(PERIODO=04)OR(PERIODO=05)OR(PERIODO=06)OR(PERIODO=07) '
         + 'OR(PERIODO=08)OR(PERIODO=09)OR(PERIODO=10)OR(PERIODO=11)OR(PERIODO=12)) '
           + 'AND (GESTION=:GES) AND CUENTA LIKE ''';
     BUSCAR1:=BUSCAR1+'%';
     BUSCAR1:=BUSCAR1+CUENTA1.Text;
     BUSCAR1:=BUSCAR1+'%';
     BUSCAR1:=BUSCAR1+'''';
     FDM.QCC.SQL.Clear;
     FDM.QCC.SQL.Add(BUSCAR1);
     FDM.QCC.Active:=TRUE;
     NAME1.Text:=FDM.QCC.FIELDBYNAME('NOMBRE').AsString;
     FDM.QCC.Open;
   end
   else
     exit;
 {...}
__________________
El que da primero da dos veces.

Última edición por dec fecha: 30-09-2005 a las 09:55:41. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita
  #2  
Antiguo 29-09-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por Damian666
,
Necesito hacer una comparación en mi consulta con un dato introducido en un edit y una tabla de mi base de datos.
A mí se me ocurre algo así, puede que no esté acertado, pero puede darte un vislumbramiento de lo que necesitas..

Código Delphi [-]
   
   if miquery.fieldbyname('campoacomparar').value = Edit1.text then
   begin
     ....
     ....
   end;

saludos y espero que te sirva de algo...
__________________
No todo es como parece ser...
Responder Con Cita
  #3  
Antiguo 30-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Código Delphi [-]
with FDM.QCC do begin
 if active then close;
 SQL.Clear;
 SQL.Add('SELECT *');
 SQL.Add('FROM CCCLIENTES ');
 SQL.Add('WHERE ((PERIODO=01)OR(PERIODO=02)OR(PERIODO=03)OR ');
 SQL.Add('(PERIODO=04)OR(PERIODO=05)OR(PERIODO=06)OR (PERIODO=07)OR');
 SQL.Add('( PERIODO=08)OR(PERIODO=09)OR(PERIODO=10)OR(PERIODO=11)OR');
 SQL.Add('(PERIODO=12)) ');
 SQL.Add('AND (GESTION='+QuotedStr(Gest.Text)+')'); 
 SQL.Add('AND CUENTA LIKE ''%'+QuotedStr(CUENTA1.Text)+'%'' ');
 Open;
 NAME1.Text:=FIELDBYNAME('NOMBRE').AsString;
 .....//todo lo que tengas que hacer con tu dataset 
 //para cerrar el dataset -> Close;
end; //with FDM.QCC.

si lo haces de esta manera te ahorras el uso de la variable gest y de la variable Buscar1, ya que accesas directamente a tu edit.

¿Porque uso SQL.Add(toda la instrucción) en lugar de SQL.Add(una variable)?
Si existe un error en la sentencia SQL, cuando utilizas una variable te dira que tienes un error en la línea 1, ya que la instrucción se pasa en una sola línea. En cambio, si se pasa la instrucción (como en mi ejemplo), en caso de que exista un error, te dirá exactamente en que línea esta el error
__________________


Última edición por ContraVeneno fecha: 30-09-2005 a las 00:55:08.
Responder Con Cita
  #4  
Antiguo 30-09-2005
Avatar de Damian666
Damian666 Damian666 is offline
Miembro
 
Registrado: sep 2005
Posts: 27
Poder: 0
Damian666 Va por buen camino
Hola ContraVeneno te cuentro que utilize tu lógica y me sirvió de mucho y cambie algunos detalles:

If (CUENTA1.TEXT<>'')OR(CUENTA2.TEXT<>'')THEN
with FDM.QCC do
begin
If active then close;
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM CCCLIENTES ');
SQL.Add('WHERE ((PERIODO=01)OR(PERIODO=02)OR(PERIODO=03)OR(PERIODO=04)OR');
SQL.Add('(PERIODO=05)OR(PERIODO=06)OR(PERIODO=07)OR (PERIODO=08)OR');
SQL.Add('(PERIODO=09)OR(PERIODO=10)OR(PERIODO=11)OR(PERIODO=12))');
SQL.Add('AND (GESTION='+(GEST.Text)+')');
SQL.Add('AND (CUENTA='+(CUENTA1.Text)+')');
Open;
NAME1.Text:=FIELDBYNAME('NOMBRE').AsString;
CLOSE;
end;exit;


with FDM.QCC do
begin
If active then close;
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM CCCLIENTES ');
SQL.Add('WHERE ((PERIODO=01)OR(PERIODO=02)OR(PERIODO=03)OR(PERIODO=04)OR');
SQL.Add('(PERIODO=05)OR(PERIODO=06)OR(PERIODO=07)OR (PERIODO=08)OR');
SQL.Add('(PERIODO=09)OR(PERIODO=10)OR(PERIODO=11)OR(PERIODO=12))');
SQL.Add('AND (GESTION='+(GEST.Text)+')');
SQL.Add('AND (CUENTA='+(CUENTA2.Text)+')');
Open;
NAME2.Text:=FIELDBYNAME('NOMBRE').AsString;
CLOSE;
end;exit;

Ahora la duda que tengo es como utilizar este código si quiero hacer dos consultas en un mismo FORM, ya intente de todo pero como no domino SQL me sale error, aunque delphi compila bien
__________________
El que da primero da dos veces.
Responder Con Cita
  #5  
Antiguo 30-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Código Delphi [-]
//....
CLOSE;
end;
exit; 
{-- este exit hace que se salga de la función y no se ejecute 
lo demás, supongo que por eso tu otra consulta nunca se realiza, 
trata de revisarlo paso por paso, para ver si eso es lo que sucede --}
 
with FDM.QCC do
begin
//.......
mi duda es con el exit como menciono en el comentario. No deberías tener ningún problema haciendo dos consultas, de cualquier manera tambien podrías usar otro TQuery (FDM.QCC2 por ejemplo).

Otra cosita:
cuenta1.text<>'' funcionaría bien, pero ¿que tal si en tu edit escribiendo un espacio? entonces cuenta1.text sería igual a '_' con lo que sí entraría en la función. Prueba hacer:
Código Delphi [-]
If (Trim(CUENTA1.TEXT)<>'')OR(Trim(CUENTA2.TEXT)<>'')THEN
__________________


Última edición por ContraVeneno fecha: 30-09-2005 a las 20:58:47.
Responder Con Cita
  #6  
Antiguo 30-09-2005
Avatar de Damian666
Damian666 Damian666 is offline
Miembro
 
Registrado: sep 2005
Posts: 27
Poder: 0
Damian666 Va por buen camino
Hola nuevamente funciona perfectamente, quité los exit y agregué un if validando si 'cuenta2.text<> vacio' y recién funcionó

Agradezco mucho tu ayuda. a proposito creare un nuevo hilo para ver como guardar a partir de la búsqueda que me aconsejaste

Saludos.
__________________
El que da primero da dos veces.
Responder Con Cita
  #7  
Antiguo 30-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
igual que como haces un select
de la misma forma haces un update o insert
pero en lugar de ejecutar la instrucción SQL con Open, debes usar ExecSQL
Código Delphi [-]
...
SQL.Clear;
SQL.Add('INSERT INTO .....'); //o update
SQL.Add('....... ');//toda tu instrucción sql
ExecSQL;
...
__________________

Responder Con Cita
  #8  
Antiguo 30-09-2005
Avatar de Damian666
Damian666 Damian666 is offline
Miembro
 
Registrado: sep 2005
Posts: 27
Poder: 0
Damian666 Va por buen camino
Ahora que ya sé comparar mis registros con los de un edit se viene lo dificil para mi, tal vez un consejo no me vendría mal para comparar mis edit con mis registros para luego Guardar mis registros como me lo mostro ContraVeneno

Se supone que tiene que funcionar de la sgte manera
La gestion me ayuda para que la busqueda solo sea de un determinado año
En la CUENTA es donde introduzco los datos para la busqueda y me visualiza en NOMBRE.CTA
Todas las casillas de la derecha son edit.
Con el boton VALIDAR CUENTA muestro los nombres encontrados pero a la vez debo mostrar un caracter "P" si la situacion es vacia sino "E" y sino existe la cuenta el correlativo se mantiene como vacio como veran son 12 edit los cuales representan los 12 meses del año

Mi tabla esta formada por los siguientes campos donde los datos entre comilla ya estan cargados por defecto

cuenta "1000000001"
nombre "aaaaaaa"
gestion "2005"
periodo "01"
situacion
propietario
identificacion



mis datos estan de la siguiente manera donde '__'vacio



1000000001,,,aaaaaa,,,2005,,,01,,,'0000'
1000000002,,,bbbbbb,,,2005,,,01,,,'__',,,JUAN,,,123
1000000003,,,cccccc,,,2005,,,01,,,'__',,,
1000000004,,,dddddd,,,2005,,,01,,,'__',,,
1000000001,,,aaaaaa,,,2005,,,02,,,'__',,,
1000000002,,,bbbbbb,,,2005,,,02,,,'__',,,
1000000003,,,cccccc,,,2005,,,02,,,'__',,,
1000000004,,,dddddd,,,2005,,,02,,,'__',,,
1000000001,,,aaaaaa,,,2005,,,03,,,'__',,,
1000000002,,,bbbbbb,,,2005,,,03,,,'__',,,
1000000003,,,cccccc,,,2005,,,03,,,'__',,,
1000000004,,,dddddd,,,2005,,,03,,,'__',,,

ahora la busqueda debería funcionar así
si buscamos la cuenta 1000000001 con periodo 2005 el resultado debería ser:

(resultado en el FORM de izquierda a derecha sin contar la gestion)

1000000001,,,aaaaaa,,,E,,,'__',,,P y todos los demas "P" porque situacion es vacio.

Luego en el EDIT debajo de propietario colocamos el nombre el cual debe grabarse en el campo propietario pero en todos los registros de cada periodo asi como su identificacion y la fecha en la situacion.


[img]file:///d:/formulario.jpg[/img]

Quiero saber si esto es posible para no romperme la cabeza, llevo ya un mes y no logro hacerlo, en realidad ya lo hice hasta asignar las P y E pero sin grabar y sin SQL jejeje y como tengo 350.000 es muy lento y mi base de datos crecerá, despues de suscribirme a este foro lo hice todo de cero en dos dias gracias a su ayuda.
Cualquier sugerencia me viene como ayuda caída del cielo GRACIAS por su colaboración
__________________
El que da primero da dos veces.
Responder Con Cita
  #9  
Antiguo 30-09-2005
Avatar de Damian666
Damian666 Damian666 is offline
Miembro
 
Registrado: sep 2005
Posts: 27
Poder: 0
Damian666 Va por buen camino
Disculpas adjunto la imagen para que se entienda mi explicacion del hilo anterior espero lo comprendan
Saludos
Archivos Adjuntos
Tipo de Archivo: zip formulario.zip (23,1 KB, 40 visitas)
__________________
El que da primero da dos veces.
Responder Con Cita
  #10  
Antiguo 30-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Antes que nada, estoy seguro que ya leiste la guía de estilo del foro

Segundo, ahora si que no entedí nadita de lo que querías resolver. Pero si quieres manejar valores nulos con SQL yo lo hago de la siguiente forma:
Código SQL [-]
select
case when situacion /*tu campo*/ is null then 'P' /*el valor que queires*/
else situacion /*valor cuando no es vacio*/
end situacion --o cualquier nombre
from TuTabla
where ...--etc, etc

ahora, si puediras hacer una pregunta específica sobre lo que quieres resolver sería mejor para todos nosotros, recuerda que solo tu conoces el análisis y diseño de tu aplicación y solo tu sabes cuál es el mejor método para resolver las situaciones específicas de tu sistema. Y si la situación se esta complicando mucho, entonces es tiempo de replantear el análisis y buscar otro método de soución.

Un saludo cordial.
__________________

Responder Con Cita
  #11  
Antiguo 01-10-2005
Avatar de Damian666
Damian666 Damian666 is offline
Miembro
 
Registrado: sep 2005
Posts: 27
Poder: 0
Damian666 Va por buen camino
Tal ves hubo un malentendido del cual me quiero disculpar, y si leí el estilo del foro, lo que quería saber con su experiencia de todos ustedes es si se va a poder guardar los registros ya que son 4 búsquedas por cuenta cada una con 12 campos=edit en total 48 campos que dependen de la situación es decir si existen 48 “P”(pendientes) se tiene que guardar 48 veces el nombre, ya que existe una cuenta 12 veces pero con periodos distintos en este caso del 01 al 12, todo esto para cuando se haga una consulta general por cuenta me mostrará el nombre y su identificación de quien recogió la boleta, no quiero ser pesado con esto pero así me lo pidieron y si ven al archivos adjunto el entorno visual es muy importante ya que el operador del sistema no tiene mucha experiencia por lo cual tiene que ser lo mas automatizado que se pueda y visualmente fácil de entender.



He estado desarrollando con el código de ContraVeneno y ahora mi única solución es hacer lo mismo pero tomando todo el código solo para un periodo y ahí desarrollar el guardado eso seria 48 veces. ¿Está Bien?



Mi problema es como hacerlo mas fácil y saber si se puede o no.

Ingeniero viene de ingenio, así que me las tengo que ingeniar para resolver mi aplicación que es mas un problema de lógica y lo estoy logrando pero necesito mas de su ayuda.



Saludos.
__________________
El que da primero da dos veces.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:44:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi