Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2022
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Ayuda Locate

Buenas a todos. Estoy teniendo problema con un locate multiples campos. estoy buscando por dos condiciones que es el episodio y el codigo de items
la tabla es la siguiente:

Cita:
Table EpisItems
EpEpisodio bigint Unchecked
EpFecha char(10) Unchecked
Epiditems bigint Unchecked
EpPlantilla bigint Checked
EpValor text Checked
Código Delphi [-]
procedure TfrmPacientes.insomodvalor(codigo, paciente, medico: Integer;
  valor: string);
begin
  Dm.QryEpisodioItems.Close;
  DM.QryEpisodioItems.Open;
  if Dm.QryEpisodioItems.Locate('EpEpisodio;Epiditems',VarArrayOf([epinumero,codigo]),[]) then
      begin
        // Record found
        DM.QryEpisodioItems.Edit;
      end
  else
      begin
        // Record Not found
        DM.QryEpisodioItems.Insert;
        DM.QryEpisodioItemsEpEpisodio.Value := epinumero;
        DM.QryEpisodioItemsEpFecha.Value    := DateToStr(now);
        DM.QryEpisodioItemsEpPlantilla.Value:= DM.QryPlantillaDefaultidPlantilla.Value;
        DM.QryEpisodioItemsEpiditems.Value  := codigo;
      end;
  DM.QryEpisodioItemsEpValor.Value := valor;
  DM.QryEpisodioItems.Post;
  DM.QryEpisodioItems.Close;
end;

La cosa es que si el episodio y el ítem ya existe debería solo modificar el contenido del campo valor de lo contrario deberia insertar todos los campos. Pero de alguna forma siempre pasa por alto de que ya existe y lo intenta crear y de hay me da el error de primary key violation. Estuve buscando y no veo problema alguno en la sentencia: pero aun así no se que me estoy pasando por alto. Cualquier ayuda o comentario será bien acogido.

NOTA La tabla esta bajo SQL SERVER 2014 Delphi Xe7/10
Responder Con Cita
  #2  
Antiguo 28-11-2022
PepCat PepCat is offline
Miembro
 
Registrado: mar 2017
Posts: 96
Poder: 8
PepCat Va por buen camino
Hola steelha,

¿Qué instrucción SQL ejecutas con la orden “DM.QryEpisodioItems.Open”?
¿Has comprado que al ejecutar la instrucción “DM.QryEpisodioItems.Open” aparezcan los registros que intentas buscar?

Por otra parte, creo que sería mucho más eficiente buscar directamente con SQL:
Código SQL [-]
SELECT FROM “nombre tabla” WHERE EpEpisodio = :epinumero AND Epiditems = :codigo
Responder Con Cita
  #3  
Antiguo 28-11-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por steelha Ver Mensaje
...Pero de alguna forma siempre pasa por alto de que ya existe y lo intenta crear y de hay me da el error de primary key violation.
¿Estás seguro de que los valores que pasas al Locate son "exactamente" iguales a los de la tabla (incluyendo mayúsculas y minúsculas)?
¿Si ejecutas el SQL Profiler de SQLServer ves la consulta? ¿Cual es?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 28-11-2022
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
La sentencia es la siguiente
Código SQL [-]
SELECT *
FROM EpisItems
Where EpEpisodio = :epi

y los campos son valores enteros.

Coloque un showmessage para verificar que estuviese pasando valores y no ceros y en lo corrector me paso 5,84 el cual ya existe en la db pero aun asi paso a la parte de insertar como nuevo.

Última edición por steelha fecha: 28-11-2022 a las 16:38:16.
Responder Con Cita
  #5  
Antiguo 28-11-2022
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Cita:
Empezado por steelha Ver Mensaje
y los campos son valores enteros.
Cita:
Empezado por steelha Ver Mensaje
..me paso 5,84 el cual ya existe en la db
Al fin! Son enteros o flotantes?

Si son flotantes, te comento:

Con Delphi muchas veces, he tenido problemas al manejarlos. Trato de no usarlos como llave o identificador de nada a menos que sea estrictamente necesario. Y mas cuando se almacenan en una DB. Ya que el valor decimal que calcula Delphi no es el mismo que obtienes del motor. Aunque en apariencia se vean igual.

Cita:
Empezado por Embarcadero
"What you see is not what you get"
Floating-point numbers written in the source code with decimal digits and floating-point numbers displayed on screen probably differ from what resides in memory. Do not assume that what you see on the console represents exactly what is in memory. Decimal to binary conversion (and back) cannot be done perfectly in every case.

Use integral, BCD, or Currency variables to avoid the IEEE floating-point representation error.
Link: https://docwiki.embarcadero.com/RADS...int_Arithmetic
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #6  
Antiguo 28-11-2022
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
Al fin! Son enteros o flotantes?

Si son flotantes, te comento:

Con Delphi muchas veces, he tenido problemas al manejarlos. Trato de no usarlos como llave o identificador de nada a menos que sea estrictamente necesario. Y mas cuando se almacenan en una DB. Ya que el valor decimal que calcula Delphi no es el mismo que obtienes del motor. Aunque en apariencia se vean igual.


Link: https://docwiki.embarcadero.com/RADS...int_Arithmetic
No, no son flotantes si ves al inicio la definición de la tabla son enteros largos. Lo de 5, 84 debi decir 5 y 84 respectivamente para cada uno episodio y codigo. Estoy pensando hacer lo que PepCat me escribe. Pero no entiendo el porque no funciona el locate.
Responder Con Cita
  #7  
Antiguo 29-11-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por steelha Ver Mensaje
La sentencia es la siguiente
Código SQL [-]
SELECT * FROM EpisItems Where EpEpisodio = :epi
¿Seguro que la sentencia que hay en Dm.QryEpisodioItems en ese momento es esa?
No me cuadra. Porque si la sentencia fuera esa, el código que has puesto aquí (https://www.clubdelphi.com/foros/sho...26&postcount=1) fallaría en el Open, por la falta del parámetro :epi

Vuelvo a decirlo mismo.Si pones el profiler de SQLServer verás realmente las sentencias que se ejecutan.
El Locate es correcto y debería funcionar. Lo único que se me ocurre es que con la sentencia que estás utilizando al abrir Dm.QryEpisodioItems esos elementos ya no estén (por ejemplo porque está filtrada).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 29-11-2022
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Si en la consulta has cargado, por ejemplo:
Código Delphi [-]
Where EpEpisodio = 7
Nunca te encontrará nada con un locate por 'EpEpisodio=5 '. (El locate busca entre los resultados de la consulta, no en la BD.)
O primero cargas la consulta con EpEpisodio=5 y luego haces el locate, o bien modificas la consulta para ampliarla (quitando el where) o bien la modificas para centrarla y buscas directamente el elemento.

Yo en estos casos planto un breakpoint justo antes del locate, copio la consulta, los parámetros y los ejecuto directamente en la BD para ver exactamente lo que saca.
Responder Con Cita
  #9  
Antiguo 07-12-2022
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
¿Seguro que la sentencia que hay en Dm.QryEpisodioItems en ese momento es esa?
No me cuadra. Porque si la sentencia fuera esa, el código que has puesto aquí (https://www.clubdelphi.com/foros/sho...26&postcount=1) fallaría en el Open, por la falta del parámetro :epi

Vuelvo a decirlo mismo.Si pones el profiler de SQLServer verás realmente las sentencias que se ejecutan.
El Locate es correcto y debería funcionar. Lo único que se me ocurre es que con la sentencia que estás utilizando al abrir Dm.QryEpisodioItems esos elementos ya no estén (por ejemplo porque está filtrada).
Gracias neftali un error de novatos, T_T ese era el problema no le estaba pasando valor al parametro. La linea estaba en otro procedimiento que lo habia movido sin querer.. Perdon por no contestar inmediatamente, estaba enfermo con el covid otra vez.
Responder Con Cita
  #10  
Antiguo 09-12-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por steelha Ver Mensaje
T_T ese era el problema no le estaba pasando valor al parametro. La linea estaba en otro procedimiento que lo habia movido sin querer.. Perdon por no contestar inmediatamente, estaba enfermo con el covid otra vez.

Pasa a veces...

Cita:
Empezado por steelha Ver Mensaje
estaba enfermo con el covid otra vez.
A mejorarse.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda con Locate y Lookup cubanbaker Conexión con bases de datos 21 08-09-2011 16:01:25
ayuda con locate ercrizeporta Varios 2 21-08-2007 17:12:21
Ayuda Con .locate En Delphi 7 eudy.net Conexión con bases de datos 7 11-06-2007 13:50:48
ayuda con LOCATE vivamotos C++ Builder 4 27-08-2006 04:40:46
Locate hgiacobone Conexión con bases de datos 6 08-07-2003 15:33:49


La franja horaria es GMT +2. Ahora son las 23:14:31.


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