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 22-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
consulta con ado, delphi7 y access

Hola realizo una consulta con ado y delphi 7 y al hacer un insert a la tabla y ejecutar execsql a veces me lo hace y otras veces no funciona el metodo, me estoy volviendo loco mañana colocare el codigo, alguna idea?.
Responder Con Cita
  #2  
Antiguo 22-10-2020
marco3k marco3k is offline
Miembro
 
Registrado: feb 2015
Posts: 60
Poder: 10
marco3k Va por buen camino
Si pondrías el código que estas usando sería mejor para entender el problema y que alguien pueda ayudarte.
Responder Con Cita
  #3  
Antiguo 22-10-2020
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.271
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 serhasae Ver Mensaje
...al hacer un insert a la tabla y ejecutar execsql a veces me lo hace y otras veces no funciona el metodo

Para que te hagas una idea, eso es como decir, "voy al coche, le doy a la llave y a veces arranca y a veces no". Pues puede ser que le falte gasolina, la bomba, la batería, el contacto, las escobillas si tiene carburador, las bujías, es starter,....


Lo normal sería tener un control de errores al realizar el INSERT de forma que si hay algun problema sepas qué error te estás dando.
Además del código como te han comentado, detalla el error y con eso tal vez tengamos una idea.
Puede ser que estén añadiendo claves duplicadas, valores incorrectos, problemas con índices únicos, bloqueos,...

NOTA (de buen rollo): Con 108 posts en estos foros, la pregunta tiene tela...
__________________
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 22-10-2020
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
...eso es como decir, "voy al coche, le doy a la llave y a veces arranca y a veces no". Pues puede ser que le falte gasolina, la bomba, la batería, el contacto, las escobillas si tiene carburador, las bujías, es starter,....
Otra opción, puede ser que no tiene coche?
Responder Con Cita
  #5  
Antiguo 22-10-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Otro ejemplo:

Es que no funciona la impresora.
¿Tiene el cable conectado al ordenador?

¿Tiene el cable conectado a la electricidad?

¿Pero está encendida?
¡¡¡ Ya funciona !!!
Responder Con Cita
  #6  
Antiguo 22-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
Código Delphi [-]
CAsmm.Active:=False;
CAsmm.SQL.Clear;

CAsmm.SQL.Text:='INSERT INTO ASM_MASIVO '+
           'SELECT DISTINCT C.*,C.TNETO AS T_NETO,C.PESO_FAC AS T_PESO_FAC,'+
           'T.PRECIO AS TARIFA FROM COUTIN AS C, TASM AS T '+
           'WHERE T.AGENCIA=:AG AND T.DESTINO=:AS AND '+
           '(C.PESO_FAC>=T.PMIN AND C.PESO_FAC<=T.PMAX) AND '+
           '(C.ESCALADO>=T.EMIN AND C.ESCALADO<=T.EMAX);';


CAsmm.Parameters.ParamByName('AG').Value:='ASMMAS';
CAsmm.Parameters.ParamByName('AS').Value:='NAP';

CAsmm.Prepared:=True;



   if (CAsmm.ExecSQL=0) then
       Begin
  MessageDlg ('Error al Intentar Crear Asm Masivo', mtError,
                  [mbOK], 0);
       sw:=false;
       end;

Se que la consulta esta bien, la tiro directamente desde access y me la devuelve correctamente. Se que el problema es el ExecSql, tambien he probado a cerrar las tablas antes de llamar a esta consulta, me tiene loco proque a veces lo hace correctamente y a veces no, no entiendo el porque.

Tambien he probado a crear la consulta en access que funciona y borrar la tabla y crearla con:

CAsmm.Close;
CAsmm.SQL.Clear;
CAsmm.SQL.Text:='DROP TABLE ASM_MASIVO';
CAsmm.ExecSQL;

CAsmm.Close;
CAsmm.SQL.Clear;
CAsmm.SQL.Text:='SELECT * INTO ASM_MASIVO FROM (SELECT * FROM CASM_MASIVO);';
CAsmm.ExecSQL;


No lo hace tampoco.

Gracias a todos.

Última edición por serhasae fecha: 22-10-2020 a las 23:31:19.
Responder Con Cita
  #7  
Antiguo 22-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Para que te hagas una idea, eso es como decir, "voy al coche, le doy a la llave y a veces arranca y a veces no". Pues puede ser que le falte gasolina, la bomba, la batería, el contacto, las escobillas si tiene carburador, las bujías, es starter,....


Lo normal sería tener un control de errores al realizar el INSERT de forma que si hay algun problema sepas qué error te estás dando.
Además del código como te han comentado, detalla el error y con eso tal vez tengamos una idea.
Puede ser que estén añadiendo claves duplicadas, valores incorrectos, problemas con índices únicos, bloqueos,...

NOTA (de buen rollo): Con 108 posts en estos foros, la pregunta tiene tela...
Hago un borrado de la tabla y luego hago un insert no hay claves duplicadas en la clave primaria, compruebo que la tabla este vacia antes de hacer un insert, he probado con delphi7 y delphi 2010 por si fuera cosa del ado, he colocado el codigo es que anoche no podia dormir y por eso tire la consulta sin el codigo. Gracias Catalan, Saludos desde Valencia.
Responder Con Cita
  #8  
Antiguo 23-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
Código Delphi [-]
CAsmm.Active:=False;
CAsmm.SQL.Clear;

CAsmm.SQL.Text:='DELETE * FROM ASM_MASIVO; ';

CAsmm.Prepared:=True;

 if CAsmm.ExecSQL=0 then
    Begin
     MessageDlg ('Error al Intentar Borrar Asm Masivo', mtError,
                 [mbOK], 0);
     sw:=false;
    end;


CAsmm.Active:=False;
CAsmm.SQL.Clear;

CAsmm.SQL.Text:='INSERT INTO ASM_MASIVO '+
           'SELECT DISTINCT C.*,C.TNETO AS T_NETO,C.PESO_FAC AS T_PESO_FAC,'+
           'T.PRECIO AS TARIFA FROM COUTIN AS C, TASM AS T '+
           'WHERE T.AGENCIA=:AG AND T.DESTINO=:AS AND '+
           '(C.PESO_FAC>=T.PMIN AND C.PESO_FAC<=T.PMAX) AND '+
           '(C.ESCALADO>=T.EMIN AND C.ESCALADO<=T.EMAX);';


CAsmm.Parameters.ParamByName('AG').Value:='ASMMAS';
CAsmm.Parameters.ParamByName('AS').Value:='NAP';

CAsmm.Prepared:=True;



   if (CAsmm.ExecSQL=0) then
       Begin
  MessageDlg ('Error al Intentar Crear Asm Masivo', mtError,
                  [mbOK], 0);
       sw:=false;
       end;

Se que la consulta esta bien, la tiro directamente desde access y me la devuelve correctamente. Se que el problema es el ExecSql, tambien he probado a cerrar las tablas antes de llamar a esta consulta, me tiene loco proque a veces lo hace correctamente y a veces no, no entiendo el porque.

Tambien he probado a crear la consulta en access que funciona y borrar la tabla y crearla con:

Código Delphi [-]
 CAsmm.Close;
  CAsmm.SQL.Clear;
  CAsmm.SQL.Text:='DROP TABLE ASM_MASIVO';
  CAsmm.ExecSQL;

  CAsmm.Close;
  CAsmm.SQL.Clear;
  CAsmm.SQL.Text:='SELECT * INTO ASM_MASIVO FROM (SELECT * FROM CASM_MASIVO);';
  CAsmm.ExecSQL;

No lo hace tampoco.

Gracias a todos.

Última edición por serhasae fecha: 23-10-2020 a las 00:38:17.
Responder Con Cita
  #9  
Antiguo 23-10-2020
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.271
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
En la primera consulta, es posible que el SELECT DISTINCT no devuelva nada y por eso no se inserte nada en la tabla.

Pero en la segunda:
Código SQL [-]
 CAsmm.SQL.Text:='SELECT * INTO ASM_MASIVO FROM (SELECT * FROM CASM_MASIVO);';
No tiene sentido que no inserte nada si hay registros en CASM_MASIVO.
En otros sistemas es necesario añadir un alias a la tabla (SELECT) para que funcione, aunque imagino que ya lo has probado:

Código SQL [-]
SELECT TABLA.* INTO ASM_MASIVO FROM (SELECT * FROM CASM_MASIVO) AS TABLA;
Otra opción que puedes probar es a almacenar esta consulta en access y llamarla desde Delphi. Si no recuerdo mal, puedes crae la consulta dentro del MDB y llamarla como si fuera un StoredProcedure (con sus parámetros). Aunque sólo sea por probar.

Otra cosa que yo haría es añadir try..except a las llamadas. No se si fuera de este código tienes control de excepciones. Si es así es posible que esté sucediendo algún error y lo estés enmascarando. Encierra cada ExecSQL entre try..except, y visualiza el error si se produce.

Por último, ten en cuenta, que no todas las consultas que funcionan en Access, funcionan igual desde Delphi+ADO. Access como entorno hare determinadas cosas que no se admiten desde Jet4, que es elmotor realmente.
__________________
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
  #10  
Antiguo 23-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
Si lo del alias ya me di cuenta que access cuando creas la consulta añade el alias al final, si lo probe y no tuve suerte.

Probé también a crear una consulta de access ya creada es CASM_MASIVO que funciona perfectamente en access.

No tengo puestos try except porque realmente no da errores, simplemente no hace nada, ExecSql no actua sobre ninguna fila devuelve 0.

He quitado el distinct y nada, hace lo mismo.

Última edición por serhasae fecha: 23-10-2020 a las 11:50:27.
Responder Con Cita
  #11  
Antiguo 23-10-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No sé si he leido mal, pero sería:
insert into tabla (select from otra tabla)
Responder Con Cita
  #12  
Antiguo 23-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
CASIMIRO:

El Insert Es Para Agregar Nuevos Registros A Una Tabla Existente:

INSERT INTO ASM_MASIVO (SELECT * FROM ORIGEN);

Si Queremos Crear Una Nueva Tabla Usamos El Into Y La Sintaxis Es (siendo el alias opcional), la nueva tabla no debe existir, por eso la borro con el drop antes.

DROP TABLE ASM_MASIVO

SELECT * INTO ASM_MASIVO FROM (SELECT * FROM CASM_MASIVO) AS ALIAS;

Última edición por serhasae fecha: 23-10-2020 a las 22:31:00.
Responder Con Cita
  #13  
Antiguo 23-10-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por serhasae Ver Mensaje
El Insert Es Para Agregar Nuevos Registros A Una Tabla Existente:
Eso suponía que querías conseguir.

Por cierto, norma básica en cualquier foro, chat, conversación, etc. de internet, la número 6 en nuestra guía de estilo.
Cita:
6. No escribir nunca los mensajes en mayúsculas, esto denota falta de respeto a los foristas.
Responder Con Cita
  #14  
Antiguo 23-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
Si disculpa , pero como son instrucciones las puse en mayusculas. Ya lo cambio, no me deja cambiarlo, . Solo me deja citar, no modificar.
Responder Con Cita
  #15  
Antiguo 23-10-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por serhasae Ver Mensaje
Si disculpa , pero como son instrucciones las puse en mayusculas. Ya lo cambio, no me deja cambiarlo, . Solo me deja citar, no modificar.
Solamente recuérdalo para otras ocasiones
Saludos.
Responder Con Cita
  #16  
Antiguo 29-10-2020
serhasae serhasae is offline
Miembro
 
Registrado: jun 2004
Ubicación: España
Posts: 117
Poder: 20
serhasae Va por buen camino
He estado haciendo pruebas y me he dado cuenta de lo siguiente, si antes de ejecutar la sentencia sql, hago un showmessage de control, la consulta se ejecuta correctamente sino no se ejecuta, alguna idea de porque pasa esto y si se puede hacer un refresh o algo.

Gracias.
Responder Con Cita
  #17  
Antiguo 29-10-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No sé qué es un "showmessage de control", de todas formas no puede tener nada que ver.
Responder Con Cita
  #18  
Antiguo 29-10-2020
marco3k marco3k is offline
Miembro
 
Registrado: feb 2015
Posts: 60
Poder: 10
marco3k Va por buen camino
Cita:
Empezado por serhasae Ver Mensaje
He estado haciendo pruebas y me he dado cuenta de lo siguiente, si antes de ejecutar la sentencia sql, hago un showmessage de control, la consulta se ejecuta correctamente sino no se ejecuta, alguna idea de porque pasa esto y si se puede hacer un refresh o algo.

Gracias.
Como te dijeron eso no tiene nada que ver, que aparezca un showmessage antes de la sentencia sql, pero prueba por si acaso con:
Código Delphi [-]
Application.ProcessMessages;
En vez del showmessage.

Saludos.

Última edición por marco3k fecha: 29-10-2020 a las 17:12:42. Razón: Actualizado
Responder Con Cita
  #19  
Antiguo 29-10-2020
marco3k marco3k is offline
Miembro
 
Registrado: feb 2015
Posts: 60
Poder: 10
marco3k Va por buen camino
Como estas haciendo un insert masivo, tal vez te falta usar transacciones, prueba con usar:
BeginTrans: Al iniciar tu insercion masiva.
Commit: Al terminar la inserción masiva.
Rollback: Si algo falla cancela todo.

Aplicalo a tu código y cuéntanos como te fue.

Saludos.
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
InsertRecord con campo autonumerico de access y delphi7 saldanaluis Conexión con bases de datos 3 06-12-2010 04:35:39
Windows Vista + Delphi7 +ms Access ilisoft21 Conexión con bases de datos 2 09-01-2008 17:26:31
TSelectOnRunTime ACCESS VIOLATION DELPHI7 tuxtlagacse API de Windows 1 30-01-2007 11:08:45
Problemas de conexion con Delphi7 y access en Windows Me Chogo Tablas planas 3 26-04-2006 01:24:33
Access ´03 con delphi7. Donde pongo las sentencias. casimaxi Conexión con bases de datos 4 27-07-2005 03:22:30


La franja horaria es GMT +2. Ahora son las 18:23:40.


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