Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   consulta con ado, delphi7 y access (https://www.clubdelphi.com/foros/showthread.php?t=94913)

serhasae 22-10-2020 05:00:02

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?.

marco3k 22-10-2020 05:16:06

Si pondrías el código que estas usando sería mejor para entender el problema y que alguien pueda ayudarte.

Neftali [Germán.Estévez] 22-10-2020 11:57:53

Cita:

Empezado por serhasae (Mensaje 538799)
...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... ;)

cloayza 22-10-2020 20:56:27

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 538804)
...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?
:D

Casimiro Notevi 22-10-2020 21:04:37

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 !!!

serhasae 22-10-2020 23:07:37

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.

serhasae 22-10-2020 23:11:23

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 538804)
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.

serhasae 23-10-2020 00:33:07

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.

Neftali [Germán.Estévez] 23-10-2020 09:18:45

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.

serhasae 23-10-2020 11:46:31

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.

Casimiro Notevi 23-10-2020 11:51:26

No sé si he leido mal, pero sería:
insert into tabla (select from otra tabla)

serhasae 23-10-2020 22:24:03

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;

Casimiro Notevi 23-10-2020 23:02:20

Cita:

Empezado por serhasae (Mensaje 538833)
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.

serhasae 23-10-2020 23:21:04

Si disculpa , pero como son instrucciones las puse en mayusculas. Ya lo cambio, no me deja cambiarlo, :). Solo me deja citar, no modificar.

Casimiro Notevi 23-10-2020 23:34:16

Cita:

Empezado por serhasae (Mensaje 538835)
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.

serhasae 29-10-2020 05:58:49

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.

Casimiro Notevi 29-10-2020 09:06:22

No sé qué es un "showmessage de control", de todas formas no puede tener nada que ver.

marco3k 29-10-2020 17:10:34

Cita:

Empezado por serhasae (Mensaje 538884)
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.

marco3k 29-10-2020 21:38:04

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.


La franja horaria es GMT +2. Ahora son las 20:49:14.

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